From 9d7ddbc326d43be59a2b6d747fa56fd23ad62960 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 24 Jan 2021 14:30:05 +0100 Subject: [PATCH 01/23] Entry point --- .../simibubi/create/events/ClientEvents.java | 18 ++- .../foundation/metadoc/MetaDocHandler.java | 114 ++++++++++++++++++ .../foundation/metadoc/MetaDocScreen.java | 56 +++++++++ 3 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index e3399d191..08d9264de 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -1,5 +1,8 @@ package com.simibubi.create.events; +import java.util.ArrayList; +import java.util.List; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllFluids; import com.simibubi.create.Create; @@ -22,6 +25,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.metadoc.MetaDocHandler; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; @@ -32,6 +36,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -46,6 +51,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderTooltipEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; @@ -56,9 +62,6 @@ import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.ArrayList; -import java.util.List; - @EventBusSubscriber(value = Dist.CLIENT) public class ClientEvents { @@ -84,6 +87,7 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); + MetaDocHandler.tick(); ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); @@ -142,6 +146,11 @@ public class ClientEvents { CreateClient.schematicHandler.renderOverlay(ms, buffer, light, overlay); } + @SubscribeEvent + public static void getItemTooltipColor(RenderTooltipEvent.Color event) { + MetaDocHandler.handleTooltipColor(event); + } + @SubscribeEvent public static void addToItemTooltip(ItemTooltipEvent event) { if (!AllConfigs.CLIENT.tooltips.get()) @@ -163,7 +172,8 @@ public class ClientEvents { .addInformation(toolTip); itemTooltip.addAll(0, toolTip); } - + + MetaDocHandler.addToTooltip(event.getToolTip(), stack); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java new file mode 100644 index 000000000..e5e33b156 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java @@ -0,0 +1,114 @@ +package com.simibubi.create.foundation.metadoc; + +import java.util.List; + +import com.google.common.base.Strings; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.util.InputMappings; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.client.event.RenderTooltipEvent; + +public class MetaDocHandler { + + static LerpedFloat holdWProgress = LerpedFloat.linear() + .startWithValue(0); + static ItemStack lastHoveredStack = null; + + public static void tick() { + Minecraft instance = Minecraft.getInstance(); + Screen currentScreen = instance.currentScreen; + if (!(currentScreen instanceof ContainerScreen)) + return; + ContainerScreen cs = (ContainerScreen) currentScreen; + + ItemStack prevStack = lastHoveredStack; + lastHoveredStack = null; + Slot slotUnderMouse = cs.getSlotUnderMouse(); + if (slotUnderMouse == null || !slotUnderMouse.getHasStack()) + return; + + ItemStack stack = slotUnderMouse.getStack(); + if (prevStack != stack) + holdWProgress.startWithValue(0); + + float value = holdWProgress.getValue(); + if (InputMappings.isKeyDown(instance.getWindow() + .getHandle(), + instance.gameSettings.keyBindForward.getKey() + .getKeyCode())) { +// if (AllKeys.altDown()) { + if (value >= 1) + ScreenOpener.open(new MetaDocScreen()); + holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); + } else { + holdWProgress.setValue(Math.max(0, value - .05f)); + } + + lastHoveredStack = stack; + } + + public static void addToTooltip(List toolTip, ItemStack stack) { + if (lastHoveredStack != stack) + return; + float renderPartialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); + toolTip.add(makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); + } + + public static void handleTooltipColor(RenderTooltipEvent.Color event) { + if (lastHoveredStack != event.getStack()) + return; + if (holdWProgress.getValue() == 0) + return; + float renderPartialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); + int start = event.getOriginalBorderStart(); + int end = event.getOriginalBorderEnd(); + float progress = Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f); + + start = getSmoothColorForProgress(progress); + end = getSmoothColorForProgress((progress)); + + event.setBorderStart(start | 0xa0000000); + event.setBorderEnd(end | 0xa0000000); + } + + private static int getSmoothColorForProgress(float progress) { + if (progress < .5f) + return ColorHelper.mixColors(0x5000FF, 5592575, progress * 2); +// if (progress < .75f) +// return ColorHelper.mixColors(16733695, 5636095, (progress - .5f) * 4); + return ColorHelper.mixColors(5592575, 5636095, (progress - .5f) * 2); + } + + private static ITextComponent makeProgressBar(float progress) { + String bar = ""; + int filledLength = (int) (12 * progress); + bar += Strings.repeat("\u2588", filledLength); + if (progress < 1) + bar += Strings.repeat("\u2592", 12 - filledLength); + + TextFormatting color = TextFormatting.GRAY; + if (progress > 0) + color = TextFormatting.BLUE; + if (progress == 1f) + color = TextFormatting.AQUA; + + ITextComponent leftBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); + ITextComponent rightBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); + ITextComponent barComponent = new StringTextComponent(bar).applyTextStyle(color); + return leftBr.appendSibling(barComponent) + .appendSibling(rightBr); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java new file mode 100644 index 000000000..45553b045 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.metadoc; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.minecraft.block.Blocks; +import net.minecraftforge.fml.client.gui.GuiUtils; + +public class MetaDocScreen extends AbstractSimiScreen { + + @Override + protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + + int tooltipX = 50; + int tooltipY = 50; + int tooltipTextWidth = width - 100; + int backgroundColor = GuiUtils.DEFAULT_BACKGROUND_COLOR; + int borderColorStart = GuiUtils.DEFAULT_BORDER_COLOR_START; + int borderColorEnd = GuiUtils.DEFAULT_BORDER_COLOR_END; + int zLevel = 100; + int tooltipHeight = height - 100; + + drawString(font, "MetaDoc Experimental 0", tooltipX, tooltipY - 16, 0xffffff); + + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, + backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, + tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, + tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, + backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, + tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, + tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, + tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, + borderColorStart, borderColorStart); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, + tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + + RenderSystem.pushMatrix(); + RenderSystem.translated(width/2, height/2, 200); + GuiGameElement.of(Blocks.DIAMOND_BLOCK.getDefaultState()) + .rotate(22.5, AnimationTickHolder.getRenderTick() % 360f, 0) + .scale(50) + .render(); + RenderSystem.popMatrix(); + + } + +} From 6836bd97f47ccdc0e28986a29c37754da9583a21 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 9 Feb 2021 22:34:14 +0100 Subject: [PATCH 02/23] First Steps --- .../com/simibubi/create/CreateClient.java | 4 + .../simibubi/create/events/ClientEvents.java | 8 +- .../metadoc/AnimatedSceneElement.java | 43 +++++ .../metadoc/MetaDocInstruction.java | 13 ++ .../foundation/metadoc/MetaDocScene.java | 117 ++++++++++++++ .../metadoc/MetaDocSceneElement.java | 13 ++ .../foundation/metadoc/MetaDocScreen.java | 90 ++++++++--- .../foundation/metadoc/MetaDocStoryBoard.java | 13 ++ ...andler.java => MetaDocTooltipHandler.java} | 32 ++-- .../foundation/metadoc/MetaDocWorld.java | 14 ++ .../create/foundation/metadoc/MetaDocs.java | 73 +++++++++ .../metadoc/WorldSectionElement.java | 152 ++++++++++++++++++ .../instructions/DelayInstruction.java | 9 ++ .../DisplayWorldSectionInstruction.java | 37 +++++ .../ShowCompleteSchematicInstruction.java | 22 +++ .../instructions/TickingInstruction.java | 37 +++++ .../metadoc/stories/CogwheelStory.java | 24 +++ src/main/resources/doc/cogwheel/test.nbt | Bin 0 -> 540 bytes 18 files changed, 663 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java rename src/main/java/com/simibubi/create/foundation/metadoc/{MetaDocHandler.java => MetaDocTooltipHandler.java} (85%) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java create mode 100644 src/main/resources/doc/cogwheel/test.nbt diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 51f5007e5..07668a3b6 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,6 +16,8 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; +import com.simibubi.create.foundation.metadoc.MetaDocs; +import com.simibubi.create.foundation.metadoc.WorldSectionElement; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -66,6 +68,7 @@ public class CreateClient { bufferCache = new SuperByteBufferCache(); bufferCache.registerCompartment(KineticTileEntityRenderer.KINETIC_TILE); bufferCache.registerCompartment(ContraptionRenderer.CONTRAPTION, 20); + bufferCache.registerCompartment(WorldSectionElement.DOC_WORLD_SECTION, 20); AllKeys.register(); AllContainerTypes.registerScreenFactories(); @@ -73,6 +76,7 @@ public class CreateClient { AllEntityTypes.registerRenderers(); getColorHandler().init(); AllFluids.assignRenderLayers(); + MetaDocs.register(); IResourceManager resourceManager = Minecraft.getInstance() .getResourceManager(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index f502d8be4..a434233c7 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -26,7 +26,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.metadoc.MetaDocHandler; +import com.simibubi.create.foundation.metadoc.MetaDocTooltipHandler; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; @@ -88,7 +88,7 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); - MetaDocHandler.tick(); + MetaDocTooltipHandler.tick(); ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); @@ -150,7 +150,7 @@ public class ClientEvents { @SubscribeEvent public static void getItemTooltipColor(RenderTooltipEvent.Color event) { - MetaDocHandler.handleTooltipColor(event); + MetaDocTooltipHandler.handleTooltipColor(event); } @SubscribeEvent @@ -175,7 +175,7 @@ public class ClientEvents { itemTooltip.addAll(0, toolTip); } - MetaDocHandler.addToTooltip(event.getToolTip(), stack); + MetaDocTooltipHandler.addToTooltip(event.getToolTip(), stack); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java new file mode 100644 index 000000000..fc13b7bff --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.metadoc; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.util.math.Vec3d; + +public abstract class AnimatedSceneElement extends MetaDocSceneElement { + + protected Vec3d fadeVec; + protected LerpedFloat fade; + + public AnimatedSceneElement() { + fade = LerpedFloat.linear() + .startWithValue(0); + } + + public void setFade(float fade) { + this.fade.setValue(fade); + } + + public void setFadeVec(Vec3d fadeVec) { + this.fadeVec = fadeVec; + } + + @Override + public final void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { + ms.push(); + float currentFade = fade.getValue(Minecraft.getInstance() + .getRenderPartialTicks()); + if (fadeVec != null) + MatrixStacker.of(ms) + .translate(fadeVec.scale(-1 + currentFade)); + render(world, buffer, ms, currentFade); + ms.pop(); + } + + protected abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java new file mode 100644 index 000000000..e392cf7eb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.metadoc; + +public abstract class MetaDocInstruction { + + public boolean isBlocking() { + return false; + } + + public abstract boolean isComplete(); + + public abstract void tick(MetaDocScene scene); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java new file mode 100644 index 000000000..2c786329b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java @@ -0,0 +1,117 @@ +package com.simibubi.create.foundation.metadoc; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.IdentityHashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.metadoc.instructions.DelayInstruction; +import com.simibubi.create.foundation.metadoc.instructions.DisplayWorldSectionInstruction; +import com.simibubi.create.foundation.metadoc.instructions.ShowCompleteSchematicInstruction; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3i; + +public class MetaDocScene { + + List schedule, activeSchedule; + Set elements; + Map> groups; + MetaDocWorld world; + + public MetaDocScene(MetaDocWorld world) { + this.world = world; + elements = new HashSet<>(); + groups = new IdentityHashMap<>(); + schedule = new ArrayList<>(); + activeSchedule = new ArrayList<>(); + } + + public void begin() { + activeSchedule.clear(); + activeSchedule.addAll(schedule); + } + + public void render(IRenderTypeBuffer buffer, MatrixStack ms) { + ms.push(); + MutableBoundingBox bounds = world.getBounds(); + ms.translate(bounds.getXSize() / -2f, -.5f, bounds.getZSize() / -2f); + elements.forEach(e -> { + if (e.visible) + e.render(world, buffer, ms); + }); + ms.pop(); + } + + public void tick() { + for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { + MetaDocInstruction metaDocInstruction = iterator.next(); + metaDocInstruction.tick(this); + if (metaDocInstruction.isComplete()) { + iterator.remove(); + continue; + } + if (metaDocInstruction.isBlocking()) + break; + } + } + + public void addElement(MetaDocSceneElement e) { + elements.add(e); + } + + public MetaDocWorld getWorld() { + return world; + } + + public MutableBoundingBox getBounds() { + return world.getBounds(); + } + + public SceneBuilder builder() { + return new SceneBuilder(); + } + + public class SceneBuilder { + + public SceneBuilder showBasePlate() { + Vec3i length = getBounds().getLength(); + return showSection(BlockPos.ZERO, new Vec3i(length.getX(), 0, length.getZ()), Direction.UP); + } + + public SceneBuilder showSection(BlockPos origin, Vec3i size, Direction fadeInDirection) { + return addInstruction( + new DisplayWorldSectionInstruction(10, fadeInDirection, new WorldSectionElement.Cuboid(origin, size))); + } + + public SceneBuilder showSection(WorldSectionElement element, Direction fadeInDirection) { + return addInstruction(new DisplayWorldSectionInstruction(10, fadeInDirection, element)); + } + + public SceneBuilder debugSchematic() { + return addInstruction(new ShowCompleteSchematicInstruction()); + } + + public SceneBuilder idle(int ticks) { + return addInstruction(new DelayInstruction(ticks)); + } + + public SceneBuilder idleSeconds(int seconds) { + return idle(seconds * 20); + } + + public SceneBuilder addInstruction(MetaDocInstruction instruction) { + schedule.add(instruction); + return this; + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java new file mode 100644 index 000000000..fff1429d3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.metadoc; + +import com.mojang.blaze3d.matrix.MatrixStack; + +import net.minecraft.client.renderer.IRenderTypeBuffer; + +public abstract class MetaDocSceneElement { + + boolean visible = true; + + public abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java index 45553b045..36561772a 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java @@ -1,29 +1,86 @@ package com.simibubi.create.foundation.metadoc; +import java.util.List; + +import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; -import com.simibubi.create.foundation.gui.GuiGameElement; -import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.MatrixStacker; -import net.minecraft.block.Blocks; import net.minecraftforge.fml.client.gui.GuiUtils; public class MetaDocScreen extends AbstractSimiScreen { + private List stories; + private int index = 0; + private LerpedFloat fadeIn; + + public MetaDocScreen(List stories) { + this.stories = stories; + fadeIn = LerpedFloat.linear() + .startWithValue(0) + .chase(1, .5f, Chaser.EXP); + } + + @Override + public void tick() { + fadeIn.tickChaser(); + stories.get(index) + .tick(); + } + @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + RenderSystem.enableBlend(); + renderStory(); + renderWidgets(partialTicks); + } - int tooltipX = 50; - int tooltipY = 50; - int tooltipTextWidth = width - 100; - int backgroundColor = GuiUtils.DEFAULT_BACKGROUND_COLOR; - int borderColorStart = GuiUtils.DEFAULT_BORDER_COLOR_START; - int borderColorEnd = GuiUtils.DEFAULT_BORDER_COLOR_END; - int zLevel = 100; - int tooltipHeight = height - 100; + protected void renderStory() { + MetaDocScene story = stories.get(index); + MatrixStack ms = new MatrixStack(); + ms.push(); - drawString(font, "MetaDoc Experimental 0", tooltipX, tooltipY - 16, 0xffffff); + ms.translate(width / 2, height / 2, 200); + MatrixStacker.of(ms) + .rotateX(-45) + .rotateY(45); + ms.scale(30, -30, 30); + SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + story.render(buffer, ms); + buffer.draw(); + ms.pop(); + } + + protected void renderWidgets(float pt) { + float fade = fadeIn.getValue(pt); + int textColor = 0xeeeeee; + + drawString(font, "MetaDoc Experimental 0", 50, 50 - 16, textColor); + + RenderSystem.pushMatrix(); + + if (fade < 1) + RenderSystem.translated(0, (1 - fade) * 5, 0); + + int closeWidth = 24; + int closeHeight = 24; + int closeX = (width - closeWidth) / 2; + int closeY = height - closeHeight - 31; + renderBox(closeX, closeY, closeWidth, closeHeight, 0xdd000000, 0x30eebb00, 0x10eebb00); + AllIcons.I_CONFIRM.draw(closeX + 4, closeY + 4); + + RenderSystem.popMatrix(); + } + + protected void renderBox(int tooltipX, int tooltipY, int tooltipTextWidth, int tooltipHeight, int backgroundColor, + int borderColorStart, int borderColorEnd) { + int zLevel = 400; GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, @@ -42,15 +99,6 @@ public class MetaDocScreen extends AbstractSimiScreen { borderColorStart, borderColorStart); GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); - - RenderSystem.pushMatrix(); - RenderSystem.translated(width/2, height/2, 200); - GuiGameElement.of(Blocks.DIAMOND_BLOCK.getDefaultState()) - .rotate(22.5, AnimationTickHolder.getRenderTick() % 360f, 0) - .scale(50) - .render(); - RenderSystem.popMatrix(); - } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java new file mode 100644 index 000000000..ecd1e78ca --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.metadoc; + +import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; + +import net.minecraft.util.math.Vec3i; + +public abstract class MetaDocStoryBoard { + + public abstract String getSchematicName(); + + public abstract void program(SceneBuilder scene, Vec3i worldSize); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java similarity index 85% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java rename to src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java index e5e33b156..75247e7c8 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java @@ -18,7 +18,7 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.RenderTooltipEvent; -public class MetaDocHandler { +public class MetaDocTooltipHandler { static LerpedFloat holdWProgress = LerpedFloat.linear() .startWithValue(0); @@ -38,21 +38,27 @@ public class MetaDocHandler { return; ItemStack stack = slotUnderMouse.getStack(); + + if (!MetaDocs.all.containsKey(stack.getItem() + .getRegistryName())) + return; + if (prevStack != stack) holdWProgress.startWithValue(0); float value = holdWProgress.getValue(); - if (InputMappings.isKeyDown(instance.getWindow() - .getHandle(), - instance.gameSettings.keyBindForward.getKey() - .getKeyCode())) { -// if (AllKeys.altDown()) { + int keyCode = instance.gameSettings.keyBindForward.getKey() + .getKeyCode(); + long window = instance.getWindow() + .getHandle(); + + if (InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) - ScreenOpener.open(new MetaDocScreen()); + ScreenOpener.open(new MetaDocScreen(MetaDocs.compile(stack.getItem() + .getRegistryName()))); holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); - } else { + } else holdWProgress.setValue(Math.max(0, value - .05f)); - } lastHoveredStack = stack; } @@ -88,7 +94,7 @@ public class MetaDocHandler { return ColorHelper.mixColors(0x5000FF, 5592575, progress * 2); // if (progress < .75f) // return ColorHelper.mixColors(16733695, 5636095, (progress - .5f) * 4); - return ColorHelper.mixColors(5592575, 5636095, (progress - .5f) * 2); + return ColorHelper.mixColors(5592575, 0xffffff, (progress - .5f) * 2); } private static ITextComponent makeProgressBar(float progress) { @@ -98,11 +104,11 @@ public class MetaDocHandler { if (progress < 1) bar += Strings.repeat("\u2592", 12 - filledLength); - TextFormatting color = TextFormatting.GRAY; + TextFormatting color = TextFormatting.DARK_GRAY; if (progress > 0) - color = TextFormatting.BLUE; + color = TextFormatting.GRAY; if (progress == 1f) - color = TextFormatting.AQUA; + color = TextFormatting.WHITE; ITextComponent leftBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); ITextComponent rightBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java new file mode 100644 index 000000000..de74c9309 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.metadoc; + +import com.simibubi.create.content.schematics.SchematicWorld; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +public class MetaDocWorld extends SchematicWorld { + + public MetaDocWorld(BlockPos anchor, World original) { + super(anchor, original); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java new file mode 100644 index 000000000..61a2fea77 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java @@ -0,0 +1,73 @@ +package com.simibubi.create.foundation.metadoc; + +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.zip.GZIPInputStream; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.metadoc.stories.CogwheelStory; +import com.tterrag.registrate.util.entry.ItemProviderEntry; + +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.NBTSizeTracker; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.Template; + +public class MetaDocs { + + static Map> all = new HashMap<>(); + + public static void register() { + + addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + + } + + private static void addStoryBoard(ItemProviderEntry component, MetaDocStoryBoard storyBoard) { + ResourceLocation id = component.getId(); + all.computeIfAbsent(id, $ -> new ArrayList<>()) + .add(storyBoard); + } + + public static List compile(ResourceLocation id) { + return all.get(id) + .stream() + .map(sb -> { + Template activeTemplate = loadSchematic(sb.getSchematicName()); + MetaDocWorld world = new MetaDocWorld(BlockPos.ZERO, Minecraft.getInstance().world); + activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); + MetaDocScene scene = new MetaDocScene(world); + sb.program(scene.builder(), world.getBounds() + .getLength()); + scene.begin(); + return scene; + }) + .collect(Collectors.toList()); + } + + public static Template loadSchematic(String path) { + Template t = new Template(); + String filepath = "doc/" + path + ".nbt"; + try (DataInputStream stream = + new DataInputStream(new BufferedInputStream(new GZIPInputStream(Create.class.getClassLoader() + .getResourceAsStream(filepath))))) { + CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); + t.read(nbt); + } catch (IOException e) { + Create.logger.warn("Failed to read metadoc schematic", e); + } + return t; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java new file mode 100644 index 000000000..6f5e1ede0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java @@ -0,0 +1,152 @@ +package com.simibubi.create.foundation.metadoc; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Random; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import org.apache.commons.lang3.tuple.Pair; +import org.lwjgl.opengl.GL11; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.utility.SuperByteBuffer; +import com.simibubi.create.foundation.utility.SuperByteBufferCache; +import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; +import com.simibubi.create.foundation.utility.TileEntityRenderHelper; + +import net.minecraft.block.BlockRenderType; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BlockModelRenderer; +import net.minecraft.client.renderer.BlockRendererDispatcher; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3i; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.model.data.EmptyModelData; + +public abstract class WorldSectionElement extends AnimatedSceneElement implements Predicate { + + public static final Compartment> DOC_WORLD_SECTION = new Compartment<>(); + + List renderedTileEntities; + + @Override + public void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + renderTileEntities(world, ms, buffer); + if (buffer instanceof IRenderTypeBuffer.Impl) + ((IRenderTypeBuffer.Impl) buffer).draw(); + renderStructure(world, ms, buffer, fade); + } + + @Override + public abstract int hashCode(); + + public abstract Stream all(); + + public static class Cuboid extends WorldSectionElement { + + MutableBoundingBox bb; + Vec3i origin; + Vec3i size; + + public Cuboid(BlockPos origin, Vec3i size) { + bb = new MutableBoundingBox(origin, origin.add(size)); + this.origin = origin; + this.size = size; + } + + @Override + public boolean test(BlockPos t) { + return bb.isVecInside(t); + } + + @Override + public Stream all() { + return BlockPos.func_229383_a_(bb); + } + + @Override + public int hashCode() { + return origin.hashCode() ^ size.hashCode(); + } + + } + + protected void renderStructure(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float fade) { + SuperByteBufferCache bufferCache = CreateClient.bufferCache; + List blockLayers = RenderType.getBlockLayers(); + int code = hashCode(); + + buffer.getBuffer(RenderType.getSolid()); + for (int i = 0; i < blockLayers.size(); i++) { + RenderType layer = blockLayers.get(i); + Pair key = Pair.of(code, i); + SuperByteBuffer contraptionBuffer = + bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, layer)); + if (contraptionBuffer.isEmpty()) + continue; + + int light = 0xF000F0; + if (fade != 1) { + light = (int) (0xF * fade); + light = light << 4 | light << 20; + } + + contraptionBuffer.light(light) + .renderInto(ms, buffer.getBuffer(layer)); + } + } + + private void renderTileEntities(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { + if (renderedTileEntities == null) { + renderedTileEntities = new ArrayList<>(); + all().map(world::getTileEntity) + .filter(Objects::nonNull) + .forEach(renderedTileEntities::add); + } + + TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer); + } + + private SuperByteBuffer buildStructureBuffer(MetaDocWorld world, RenderType layer) { + ForgeHooksClient.setRenderLayer(layer); + MatrixStack ms = new MatrixStack(); + BlockRendererDispatcher dispatcher = Minecraft.getInstance() + .getBlockRendererDispatcher(); + BlockModelRenderer blockRenderer = dispatcher.getBlockModelRenderer(); + Random random = new Random(); + BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); + builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + + all().forEach(pos -> { + BlockState state = world.getBlockState(pos); + if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) + return; + if (!RenderTypeLookup.canRenderInLayer(state, layer)) + return; + + IBakedModel originalModel = dispatcher.getModelForState(state); + ms.push(); + ms.translate(pos.getX(), pos.getY(), pos.getZ()); + blockRenderer.renderModel(world, originalModel, state, pos, ms, builder, true, random, 42, + OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + ms.pop(); + }); + + builder.finishDrawing(); + return new SuperByteBuffer(builder); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java new file mode 100644 index 000000000..a44bed1fb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java @@ -0,0 +1,9 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +public class DelayInstruction extends TickingInstruction { + + public DelayInstruction(int ticks) { + super(true, ticks); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java new file mode 100644 index 000000000..ba07163c1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.WorldSectionElement; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; + +public class DisplayWorldSectionInstruction extends TickingInstruction { + + private Direction fadeInFrom; + private WorldSectionElement element; + + public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, WorldSectionElement element) { + super(false, fadeInTicks); + this.fadeInFrom = fadeInFrom; + this.element = element; + } + + @Override + protected void firstTick(MetaDocScene scene) { + super.firstTick(scene); + scene.addElement(element); + element.setFade(0); + element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); + } + + @Override + public void tick(MetaDocScene scene) { + super.tick(scene); + float fade = (remainingTicks / (float) totalTicks); + element.setFade(1 - fade * fade); + if (remainingTicks == 0) + element.setFade(1); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java new file mode 100644 index 000000000..dbfa9c776 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java @@ -0,0 +1,22 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocInstruction; +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.WorldSectionElement; + +import net.minecraft.util.math.BlockPos; + +public class ShowCompleteSchematicInstruction extends MetaDocInstruction { + + @Override + public void tick(MetaDocScene scene) { + scene.addElement(new WorldSectionElement.Cuboid(BlockPos.ZERO, scene.getBounds() + .getLength())); + } + + @Override + public boolean isComplete() { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java new file mode 100644 index 000000000..cef9e1e25 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocInstruction; +import com.simibubi.create.foundation.metadoc.MetaDocScene; + +public abstract class TickingInstruction extends MetaDocInstruction { + + private boolean blocking; + protected int totalTicks; + protected int remainingTicks; + + public TickingInstruction(boolean blocking, int ticks) { + this.blocking = blocking; + remainingTicks = totalTicks = ticks; + } + + protected void firstTick(MetaDocScene scene) {} + + @Override + public void tick(MetaDocScene scene) { + if (remainingTicks == totalTicks) + firstTick(scene); + if (remainingTicks > 0) + remainingTicks--; + } + + @Override + public boolean isComplete() { + return remainingTicks == 0; + } + + @Override + public boolean isBlocking() { + return blocking; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java new file mode 100644 index 000000000..b44e403d4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java @@ -0,0 +1,24 @@ +package com.simibubi.create.foundation.metadoc.stories; + +import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; +import com.simibubi.create.foundation.metadoc.MetaDocStoryBoard; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; + +public class CogwheelStory extends MetaDocStoryBoard { + + @Override + public String getSchematicName() { + return "cogwheel/test"; + } + + @Override + public void program(SceneBuilder scene, Vec3i worldSize) { + scene.showBasePlate() + .idle(5) + .showSection(BlockPos.ZERO.up(), worldSize, Direction.DOWN); + } + +} diff --git a/src/main/resources/doc/cogwheel/test.nbt b/src/main/resources/doc/cogwheel/test.nbt new file mode 100644 index 0000000000000000000000000000000000000000..4aa492260c6e802598f0ab4f0bcc9350bbc987a2 GIT binary patch literal 540 zcmV+%0^|K3iwFP!000000KJyMZqq;zhR5FB#CDP3Ql5e*=mkY^fJ=lFfq+Z3wWsM4 zCu_W01#;@+zzcBabvSY2>W)Jlg~+x>ZOll~#>wor`TfPKO#ot$&TLQsK>ZpuV+;|l zyzvGd)D^?%BDd+nC3NvD22ohoOxl$I<-GQIH)FpiXz2+KdO`+AFgTLIQ4CH~K~GQ6 z(sQ_0$lwSDM>05y!D%XF_zD@m`Z$8YkqnMvaCS-=z68TpA4f1alEG07PE(TMOEP@* zaRh@S863snG^H566vI~^M=&^&!BMT81jOpXD^RlnF`L}f^PWuUt=oR^w#cY6NMJlg zzqaKoa@F54vvF!38hIu~X|NVUQ<#>P(F_4c{ zmk&8ij$`>a%wfB7sDEJ%W=p%`S60pJN8vvc>V@YQ818xC#-Pr4G3;+P$tq8dQ literal 0 HcmV?d00001 From e178cab4a89f92d55199774a3d7739e269827cc1 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 10 Feb 2021 03:13:33 +0100 Subject: [PATCH 03/23] Multiple scenes per doc --- .../metadoc/MetaDocInstruction.java | 8 ++- .../foundation/metadoc/MetaDocScene.java | 21 +++++- .../metadoc/MetaDocSceneElement.java | 4 ++ .../foundation/metadoc/MetaDocScreen.java | 60 ++++++++++++++++-- .../foundation/metadoc/MetaDocWorld.java | 16 +++++ .../create/foundation/metadoc/MetaDocs.java | 11 +++- .../metadoc/WorldSectionElement.java | 9 ++- .../instructions/HideAllInstruction.java | 47 ++++++++++++++ .../instructions/TickingInstruction.java | 6 ++ .../metadoc/stories/CogwheelStory.java | 8 ++- .../doc/cogwheel/{test.nbt => s1.nbt} | Bin src/main/resources/doc/cogwheel/s2.nbt | Bin 0 -> 420 bytes src/main/resources/doc/cogwheel/s3.nbt | Bin 0 -> 854 bytes src/main/resources/doc/cogwheel/s4.nbt | Bin 0 -> 845 bytes src/main/resources/doc/cogwheel/s5.nbt | Bin 0 -> 290 bytes 15 files changed, 172 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java rename src/main/resources/doc/cogwheel/{test.nbt => s1.nbt} (100%) create mode 100644 src/main/resources/doc/cogwheel/s2.nbt create mode 100644 src/main/resources/doc/cogwheel/s3.nbt create mode 100644 src/main/resources/doc/cogwheel/s4.nbt create mode 100644 src/main/resources/doc/cogwheel/s5.nbt diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java index e392cf7eb..13bdda9e9 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java @@ -1,13 +1,15 @@ package com.simibubi.create.foundation.metadoc; public abstract class MetaDocInstruction { - + public boolean isBlocking() { return false; } - + + public void reset(MetaDocScene scene) {} + public abstract boolean isComplete(); - + public abstract void tick(MetaDocScene scene); } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java index 2c786329b..cc17692af 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java @@ -11,6 +11,7 @@ import java.util.Set; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.metadoc.instructions.DelayInstruction; import com.simibubi.create.foundation.metadoc.instructions.DisplayWorldSectionInstruction; +import com.simibubi.create.foundation.metadoc.instructions.HideAllInstruction; import com.simibubi.create.foundation.metadoc.instructions.ShowCompleteSchematicInstruction; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -34,11 +35,21 @@ public class MetaDocScene { activeSchedule = new ArrayList<>(); } - public void begin() { + public void reset() { activeSchedule.clear(); + schedule.forEach(mdi -> mdi.reset(this)); + } + + public void begin() { + reset(); activeSchedule.addAll(schedule); } + public void fadeOut() { + reset(); + activeSchedule.add(new HideAllInstruction(10, Direction.DOWN)); + } + public void render(IRenderTypeBuffer buffer, MatrixStack ms) { ms.push(); MutableBoundingBox bounds = world.getBounds(); @@ -71,6 +82,10 @@ public class MetaDocScene { return world; } + public Set getElements() { + return elements; + } + public MutableBoundingBox getBounds() { return world.getBounds(); } @@ -88,11 +103,11 @@ public class MetaDocScene { public SceneBuilder showSection(BlockPos origin, Vec3i size, Direction fadeInDirection) { return addInstruction( - new DisplayWorldSectionInstruction(10, fadeInDirection, new WorldSectionElement.Cuboid(origin, size))); + new DisplayWorldSectionInstruction(20, fadeInDirection, new WorldSectionElement.Cuboid(origin, size))); } public SceneBuilder showSection(WorldSectionElement element, Direction fadeInDirection) { - return addInstruction(new DisplayWorldSectionInstruction(10, fadeInDirection, element)); + return addInstruction(new DisplayWorldSectionInstruction(20, fadeInDirection, element)); } public SceneBuilder debugSchematic() { diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java index fff1429d3..1b208c990 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java @@ -10,4 +10,8 @@ public abstract class MetaDocSceneElement { public abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + public void setVisible(boolean visible) { + this.visible = visible; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java index 36561772a..faccdf6f1 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java @@ -11,16 +11,21 @@ import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.client.gui.GuiUtils; public class MetaDocScreen extends AbstractSimiScreen { private List stories; - private int index = 0; private LerpedFloat fadeIn; + private LerpedFloat lazyIndex; + private int index = 0; + public MetaDocScreen(List stories) { this.stories = stories; + lazyIndex = LerpedFloat.linear() + .startWithValue(index); fadeIn = LerpedFloat.linear() .startWithValue(0) .chase(1, .5f, Chaser.EXP); @@ -28,27 +33,63 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override public void tick() { + lazyIndex.tickChaser(); fadeIn.tickChaser(); stories.get(index) .tick(); + float lazyIndexValue = lazyIndex.getValue(); + if (Math.abs(lazyIndexValue - index) > 1 / 512f) + stories.get(lazyIndexValue < index ? index - 1 : index + 1) + .tick(); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + int prevIndex = index; + index = delta > 0 ? index + 1 : index - 1; + index = MathHelper.clamp(index, 0, stories.size() - 1); + if (prevIndex != index && Math.abs(index - lazyIndex.getValue()) < 1.25f) { + stories.get(prevIndex) + .fadeOut(); + stories.get(index) + .begin(); + lazyIndex.chase(index, 1 / 4f, Chaser.EXP); + return true; + } else + index = prevIndex; + return super.mouseScrolled(mouseX, mouseY, delta); } @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderStory(); - renderWidgets(partialTicks); + renderStories(partialTicks); + renderWidgets(mouseX, mouseY, partialTicks); } - protected void renderStory() { - MetaDocScene story = stories.get(index); + protected void renderStories(float partialTicks) { + renderStory(index, partialTicks); + float lazyIndexValue = lazyIndex.getValue(partialTicks); + if (Math.abs(lazyIndexValue - index) > 1 / 512f) + renderStory(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + } + + protected void renderStory(int i, float partialTicks) { + MetaDocScene story = stories.get(i); MatrixStack ms = new MatrixStack(); ms.push(); + ms.translate(width / 2, height / 2, 200); MatrixStacker.of(ms) .rotateX(-45) .rotateY(45); + + float value = lazyIndex.getValue(partialTicks); + float diff = i - value; + float slide = i == index ? 400 : MathHelper.lerp(Math.abs(diff), 0, 400); + ms.translate(diff * slide, 0, 0); + ms.scale(30, -30, 30); SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); @@ -57,7 +98,7 @@ public class MetaDocScreen extends AbstractSimiScreen { ms.pop(); } - protected void renderWidgets(float pt) { + protected void renderWidgets(int mouseX, int mouseY, float pt) { float fade = fadeIn.getValue(pt); int textColor = 0xeeeeee; @@ -72,7 +113,12 @@ public class MetaDocScreen extends AbstractSimiScreen { int closeHeight = 24; int closeX = (width - closeWidth) / 2; int closeY = height - closeHeight - 31; - renderBox(closeX, closeY, closeWidth, closeHeight, 0xdd000000, 0x30eebb00, 0x10eebb00); + + boolean hovered = !(mouseX < closeX || mouseX > closeX + closeWidth); + hovered &= !(mouseY < closeY || mouseY > closeY + closeHeight); + + renderBox(closeX, closeY, closeWidth, closeHeight, 0xdd000000, hovered ? 0x70ffffff : 0x30eebb00, + hovered ? 0x30ffffff : 0x10eebb00); AllIcons.I_CONFIRM.draw(closeX + 4, closeY + 4); RenderSystem.popMatrix(); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java index de74c9309..5307ba49c 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java @@ -3,12 +3,28 @@ package com.simibubi.create.foundation.metadoc; import com.simibubi.create.content.schematics.SchematicWorld; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; import net.minecraft.world.World; public class MetaDocWorld extends SchematicWorld { + int overrideLight; + public MetaDocWorld(BlockPos anchor, World original) { super(anchor, original); } + public void pushFakeLight(int light) { + this.overrideLight = light; + } + + public void popLight() { + this.overrideLight = -1; + } + + @Override + public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { + return overrideLight == -1 ? super.getLightLevel(p_226658_1_, p_226658_2_) : overrideLight; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java index 61a2fea77..649b7fb71 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.metadoc; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.IOException; +import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -30,7 +31,8 @@ public class MetaDocs { public static void register() { - addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + for (int i = 1; i < 6; i++) + addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory(i)); } @@ -59,9 +61,12 @@ public class MetaDocs { public static Template loadSchematic(String path) { Template t = new Template(); String filepath = "doc/" + path + ".nbt"; + InputStream resourceAsStream = Create.class.getClassLoader() + .getResourceAsStream(filepath); + if (resourceAsStream == null) + throw new IllegalStateException("Could not find metadoc schematic: " + filepath); try (DataInputStream stream = - new DataInputStream(new BufferedInputStream(new GZIPInputStream(Create.class.getClassLoader() - .getResourceAsStream(filepath))))) { + new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); t.read(nbt); } catch (IOException e) { diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java index 6f5e1ede0..274551085 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java @@ -44,7 +44,14 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement @Override public void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + int light = -1; + if (fade != 1) + light = (int) (0xF * fade); + + world.pushFakeLight(light); renderTileEntities(world, ms, buffer); + world.popLight(); + if (buffer instanceof IRenderTypeBuffer.Impl) ((IRenderTypeBuffer.Impl) buffer).draw(); renderStructure(world, ms, buffer, fade); @@ -87,7 +94,7 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement protected void renderStructure(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float fade) { SuperByteBufferCache bufferCache = CreateClient.bufferCache; List blockLayers = RenderType.getBlockLayers(); - int code = hashCode(); + int code = hashCode() ^ world.hashCode(); buffer.getBuffer(RenderType.getSolid()); for (int i = 0; i < blockLayers.size(); i++) { diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java new file mode 100644 index 000000000..46d8a2833 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java @@ -0,0 +1,47 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.AnimatedSceneElement; +import com.simibubi.create.foundation.metadoc.MetaDocScene; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; + +public class HideAllInstruction extends TickingInstruction { + + private Direction fadeOutTo; + + public HideAllInstruction(int fadeOutTicks, Direction fadeOutTo) { + super(false, fadeOutTicks); + this.fadeOutTo = fadeOutTo; + } + + @Override + protected void firstTick(MetaDocScene scene) { + super.firstTick(scene); + scene.getElements() + .forEach(element -> { + if (element instanceof AnimatedSceneElement) { + AnimatedSceneElement animatedSceneElement = (AnimatedSceneElement) element; + animatedSceneElement.setFade(1); + animatedSceneElement.setFadeVec(new Vec3d(fadeOutTo.getDirectionVec()).scale(.5f)); + } else + element.setVisible(false); + }); + } + + @Override + public void tick(MetaDocScene scene) { + super.tick(scene); + float fade = (remainingTicks / (float) totalTicks); + scene.getElements() + .forEach(element -> { + if (!(element instanceof AnimatedSceneElement)) + return; + AnimatedSceneElement animatedSceneElement = (AnimatedSceneElement) element; + animatedSceneElement.setFade(fade * fade); + if (remainingTicks == 0) + animatedSceneElement.setFade(0); + }); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java index cef9e1e25..eae1b3f41 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java @@ -14,6 +14,12 @@ public abstract class TickingInstruction extends MetaDocInstruction { remainingTicks = totalTicks = ticks; } + @Override + public void reset(MetaDocScene scene) { + super.reset(scene); + remainingTicks = totalTicks; + } + protected void firstTick(MetaDocScene scene) {} @Override diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java index b44e403d4..f640b6cb5 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java @@ -9,9 +9,15 @@ import net.minecraft.util.math.Vec3i; public class CogwheelStory extends MetaDocStoryBoard { + private int index; + + public CogwheelStory(int index) { + this.index = index; + } + @Override public String getSchematicName() { - return "cogwheel/test"; + return "cogwheel/s" + index; } @Override diff --git a/src/main/resources/doc/cogwheel/test.nbt b/src/main/resources/doc/cogwheel/s1.nbt similarity index 100% rename from src/main/resources/doc/cogwheel/test.nbt rename to src/main/resources/doc/cogwheel/s1.nbt diff --git a/src/main/resources/doc/cogwheel/s2.nbt b/src/main/resources/doc/cogwheel/s2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e7889a802b2378bbe288f9fa797d8abf5a36a6ef GIT binary patch literal 420 zcmb2|=3sz;z0>Y`9X1d-?*G~Fw%-NmTJHFS>v8;!U&>P6M)JO%?whiU{qs+s(?(gE zPYu?vJI(s``*t^vd+Op8n$h-rB6*d+X-a-|bm%3NPQSjoJAzIQZ&~E!P(bOk+3SeR8!<@z&FGPw`qc z{kp=|q%W~bCA6%<`HcSJnBQ0T?_8zl{Db#Q=;VjbV))vhF5dJ?RC@7hA%#C}^3r+j J?h;%K3;@j}$B6&{ literal 0 HcmV?d00001 diff --git a/src/main/resources/doc/cogwheel/s3.nbt b/src/main/resources/doc/cogwheel/s3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b60d58b68ada73bcccf62049f528e5753266bdae GIT binary patch literal 854 zcmV-c1F8HUiwFP!000000M(eyZrVT)$H!i;V@&#SY2TyQTq+=_MT$t&C{^1_ zCvdW1l*};-=Hz{u1P&u`ECPoUIN2}>`7#OlD&sH$$0Bezfiq7jAzzG;uQCoJa4Z6c z6FAwh2>G%I`6}Zu0>>h7IDwN5PRJK0o+B~Z$G z>cjyv@Zm{EpoVS9V334(*bgF9LC4iI;}g-*jof%MnM^+F<6CW0*T;AI{C!bPrP?m` z33L78_#T{i=$tZk9-`A7>71#MLwRT2p8N&94QfpA&Q*y zOA#Hg8=efJE?Di|b~C@)PXz{SdxT)scMh5cY_{a36TM7(2cxd)rAuCkrq!9IM;NMt ze6yTR*77jW#+sZP~Ir z?XehDbm$5Pa@OY`?8Q<)%b((|@b$`yHf>&HJ16pw^=m%ibvJ{>hr|tH9ModDbbdpz zd?_%P77Kszs@ZJc?`oND%LSF43XvwA(z+nL#9>5U+occr?Y@!u5 z%duJk92UUg0UQy)sZT4QU#)w->R>143~#Y*jlXpf9hshR7t*zrlGJlZn$t0sYg zn&D-7gLM`Wh3J>Ihm$fbh^n+J#lxA_s8$q@FNqQ_w0MQy1)cE=)LGYaQRhyjQ-Jt9 zMNFZ{r+?~>jP}+jg*J*{|BP1>7c?vobCx`*TO?tp;ZaX;@1dU}5&6-G`F_9|VeQD%~nZGGcy6Xf?yT7P?4 zyze*nD@RGKq6x>#q^vj9@xq!Z+WfCVn-q-Y6rrDKDvHA-f7+=zLzxuKDau<6XsKDZZRmAC@Y_h2@1_L>3d&B@FvGa7A}LGEuTYMf`Qn)!RQ1sL>> XrI+7mK8l~z_Fwo1I8@9g(GLIsF%+TR literal 0 HcmV?d00001 diff --git a/src/main/resources/doc/cogwheel/s5.nbt b/src/main/resources/doc/cogwheel/s5.nbt new file mode 100644 index 0000000000000000000000000000000000000000..056249163b06bf89d63030cf0b3f6666204fb0e1 GIT binary patch literal 290 zcmV+-0p0!|iwFP!000000F9KfPQx%1MW5s6l9Ztv19QKkGczM=WYR~mNa7M3A@#%f zJ`z+%s7kDRB`b=2e3GXtc}r9g2X_%oMAO=gOHI#;O6jAEP6AD-X!F|o<|Ay!mwiS0 z>_a*D#NG+rdXLP$7q0IfH4cq?d&N9&{qNU zmGfx8!+^&Cp1D$>FP-^TvB0eLmGdy*F@Pt9fxZ~%i-Eav9tJ!H@T3@^F9YeuBB13S#Cn|sF7edT?*~kR|0Kd Date: Wed, 10 Feb 2021 16:40:30 +0100 Subject: [PATCH 04/23] Refined animations, key input --- .../foundation/metadoc/MetaDocScene.java | 7 +- .../foundation/metadoc/MetaDocScreen.java | 82 ++++++++++++++++--- .../foundation/metadoc/MetaDocWorld.java | 20 ++++- .../metadoc/WorldSectionElement.java | 15 ++-- .../instructions/HideAllInstruction.java | 3 +- .../metadoc/stories/CogwheelStory.java | 2 +- 6 files changed, 104 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java index cc17692af..7642c1927 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java @@ -42,12 +42,13 @@ public class MetaDocScene { public void begin() { reset(); + elements.clear(); activeSchedule.addAll(schedule); } public void fadeOut() { reset(); - activeSchedule.add(new HideAllInstruction(10, Direction.DOWN)); + activeSchedule.add(new HideAllInstruction(10, null)); } public void render(IRenderTypeBuffer buffer, MatrixStack ms) { @@ -103,11 +104,11 @@ public class MetaDocScene { public SceneBuilder showSection(BlockPos origin, Vec3i size, Direction fadeInDirection) { return addInstruction( - new DisplayWorldSectionInstruction(20, fadeInDirection, new WorldSectionElement.Cuboid(origin, size))); + new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement.Cuboid(origin, size))); } public SceneBuilder showSection(WorldSectionElement element, Direction fadeInDirection) { - return addInstruction(new DisplayWorldSectionInstruction(20, fadeInDirection, element)); + return addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, element)); } public SceneBuilder debugSchematic() { diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java index faccdf6f1..3f0f7ae8b 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java @@ -11,6 +11,8 @@ import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.client.GameSettings; +import net.minecraft.client.Minecraft; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.client.gui.GuiUtils; @@ -28,7 +30,7 @@ public class MetaDocScreen extends AbstractSimiScreen { .startWithValue(index); fadeIn = LerpedFloat.linear() .startWithValue(0) - .chase(1, .5f, Chaser.EXP); + .chase(1, .1f, Chaser.EXP); } @Override @@ -45,23 +47,32 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override public boolean mouseScrolled(double mouseX, double mouseY, double delta) { + if (scroll(delta > 0)) + return true; + return super.mouseScrolled(mouseX, mouseY, delta); + } + + protected boolean scroll(boolean forward) { int prevIndex = index; - index = delta > 0 ? index + 1 : index - 1; + index = forward ? index + 1 : index - 1; index = MathHelper.clamp(index, 0, stories.size() - 1); - if (prevIndex != index && Math.abs(index - lazyIndex.getValue()) < 1.25f) { + if (prevIndex != index && Math.abs(index - lazyIndex.getValue()) < 1.5f) { stories.get(prevIndex) .fadeOut(); stories.get(index) .begin(); lazyIndex.chase(index, 1 / 4f, Chaser.EXP); return true; - } else + } else index = prevIndex; - return super.mouseScrolled(mouseX, mouseY, delta); + return false; } @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + partialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); + RenderSystem.enableBlend(); renderStories(partialTicks); renderWidgets(mouseX, mouseY, partialTicks); @@ -78,16 +89,15 @@ public class MetaDocScreen extends AbstractSimiScreen { MetaDocScene story = stories.get(i); MatrixStack ms = new MatrixStack(); ms.push(); - ms.translate(width / 2, height / 2, 200); MatrixStacker.of(ms) .rotateX(-45) .rotateY(45); - float value = lazyIndex.getValue(partialTicks); - float diff = i - value; - float slide = i == index ? 400 : MathHelper.lerp(Math.abs(diff), 0, 400); + double value = lazyIndex.getValue(partialTicks); + double diff = i - value; + double slide = MathHelper.lerp(diff * diff, 200, 600); ms.translate(diff * slide, 0, 0); ms.scale(30, -30, 30); @@ -106,16 +116,14 @@ public class MetaDocScreen extends AbstractSimiScreen { RenderSystem.pushMatrix(); - if (fade < 1) + if (fade < fadeIn.getChaseTarget()) RenderSystem.translated(0, (1 - fade) * 5, 0); int closeWidth = 24; int closeHeight = 24; int closeX = (width - closeWidth) / 2; int closeY = height - closeHeight - 31; - - boolean hovered = !(mouseX < closeX || mouseX > closeX + closeWidth); - hovered &= !(mouseY < closeY || mouseY > closeY + closeHeight); + boolean hovered = isMouseOver(mouseX, mouseY, closeX, closeY, closeWidth, closeHeight); renderBox(closeX, closeY, closeWidth, closeHeight, 0xdd000000, hovered ? 0x70ffffff : 0x30eebb00, hovered ? 0x30ffffff : 0x10eebb00); @@ -124,6 +132,54 @@ public class MetaDocScreen extends AbstractSimiScreen { RenderSystem.popMatrix(); } + @Override + public boolean mouseClicked(double x, double y, int button) { + int closeWidth = 24; + int closeHeight = 24; + int closeX = (width - closeWidth) / 2; + int closeY = height - closeHeight - 31; + if (isMouseOver(x, y, closeX, closeY, closeWidth, closeHeight)) { + onClose(); + return true; + } + + return super.mouseClicked(x, y, button); + } + + @Override + public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { + GameSettings settings = Minecraft.getInstance().gameSettings; + int sCode = settings.keyBindBack.getKey() + .getKeyCode(); + int aCode = settings.keyBindLeft.getKey() + .getKeyCode(); + int dCode = settings.keyBindRight.getKey() + .getKeyCode(); + + if (code == sCode) { + onClose(); + return true; + } + + if (code == aCode) { + scroll(false); + return true; + } + + if (code == dCode) { + scroll(true); + return true; + } + + return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); + } + + protected boolean isMouseOver(double mouseX, double mouseY, int x, int y, int w, int h) { + boolean hovered = !(mouseX < x || mouseX > x + w); + hovered &= !(mouseY < y || mouseY > y + h); + return hovered; + } + protected void renderBox(int tooltipX, int tooltipY, int tooltipTextWidth, int tooltipHeight, int backgroundColor, int borderColorStart, int borderColorEnd) { int zLevel = 400; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java index 5307ba49c..a4388670d 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java @@ -2,6 +2,8 @@ package com.simibubi.create.foundation.metadoc; import com.simibubi.create.content.schematics.SchematicWorld; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; import net.minecraft.world.World; @@ -9,6 +11,7 @@ import net.minecraft.world.World; public class MetaDocWorld extends SchematicWorld { int overrideLight; + WorldSectionElement mask; public MetaDocWorld(BlockPos anchor, World original) { super(anchor, original); @@ -24,7 +27,22 @@ public class MetaDocWorld extends SchematicWorld { @Override public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { - return overrideLight == -1 ? super.getLightLevel(p_226658_1_, p_226658_2_) : overrideLight; + return overrideLight == -1 ? 15 : overrideLight; + } + + public void setMask(WorldSectionElement mask) { + this.mask = mask; + } + + public void clearMask() { + this.mask = null; + } + + @Override + public BlockState getBlockState(BlockPos globalPos) { + if (mask != null && !mask.test(globalPos.subtract(anchor))) + return Blocks.AIR.getDefaultState(); + return super.getBlockState(globalPos); } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java index 274551085..d1260037f 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java @@ -31,6 +31,7 @@ import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec3i; import net.minecraftforge.client.ForgeHooksClient; @@ -45,13 +46,13 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement @Override public void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { int light = -1; - if (fade != 1) - light = (int) (0xF * fade); - + if (fade != 1) + light = (int) (MathHelper.lerp(fade, 5, 14)); + world.pushFakeLight(light); renderTileEntities(world, ms, buffer); world.popLight(); - + if (buffer instanceof IRenderTypeBuffer.Impl) ((IRenderTypeBuffer.Impl) buffer).draw(); renderStructure(world, ms, buffer, fade); @@ -104,13 +105,13 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, layer)); if (contraptionBuffer.isEmpty()) continue; - + int light = 0xF000F0; if (fade != 1) { light = (int) (0xF * fade); light = light << 4 | light << 20; } - + contraptionBuffer.light(light) .renderInto(ms, buffer.getBuffer(layer)); } @@ -136,6 +137,7 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement Random random = new Random(); BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + world.setMask(this); all().forEach(pos -> { BlockState state = world.getBlockState(pos); @@ -152,6 +154,7 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement ms.pop(); }); + world.clearMask(); builder.finishDrawing(); return new SuperByteBuffer(builder); } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java index 46d8a2833..678f83772 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java @@ -23,7 +23,8 @@ public class HideAllInstruction extends TickingInstruction { if (element instanceof AnimatedSceneElement) { AnimatedSceneElement animatedSceneElement = (AnimatedSceneElement) element; animatedSceneElement.setFade(1); - animatedSceneElement.setFadeVec(new Vec3d(fadeOutTo.getDirectionVec()).scale(.5f)); + animatedSceneElement + .setFadeVec(fadeOutTo == null ? null : new Vec3d(fadeOutTo.getDirectionVec()).scale(.5f)); } else element.setVisible(false); }); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java index f640b6cb5..b5bcdad87 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java @@ -23,7 +23,7 @@ public class CogwheelStory extends MetaDocStoryBoard { @Override public void program(SceneBuilder scene, Vec3i worldSize) { scene.showBasePlate() - .idle(5) + .idle(10) .showSection(BlockPos.ZERO.up(), worldSize, Direction.DOWN); } From 8ab27904db889f64ea7f501591f881af9bbf4b0c Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 12 Feb 2021 17:08:48 +0100 Subject: [PATCH 05/23] More Instructions --- src/generated/resources/.cache/cache | 28 +- .../assets/create/blockstates/fluid_pipe.json | 100 ++++---- .../create/blockstates/radial_chassis.json | 96 +++---- .../resources/assets/create/lang/en_us.json | 16 ++ .../assets/create/lang/unfinished/de_de.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 +- .../com/simibubi/create/CreateClient.java | 6 +- .../contraptions/base/KineticTileEntity.java | 2 +- .../content/schematics/SchematicWorld.java | 18 +- .../foundation/data/AllLangPartials.java | 34 ++- .../create/foundation/data/LangMerger.java | 12 +- .../gui/AbstractSimiContainerScreen.java | 3 + .../foundation/gui/AbstractSimiScreen.java | 10 +- .../foundation/metadoc/MetaDocElement.java | 17 ++ .../metadoc/MetaDocLocalization.java | 74 ++++++ .../foundation/metadoc/MetaDocScene.java | 241 ++++++++++++++++-- .../metadoc/MetaDocSceneElement.java | 17 -- .../foundation/metadoc/MetaDocScreen.java | 132 +++++----- .../foundation/metadoc/MetaDocStoryBoard.java | 2 + .../foundation/metadoc/MetaDocWorld.java | 34 ++- .../create/foundation/metadoc/MetaDocs.java | 70 +++-- .../create/foundation/metadoc/Select.java | 69 +++++ .../metadoc/content/CogwheelStory.java | 51 ++++ .../metadoc/content/MetaDocIndex.java | 22 ++ .../metadoc/content/SharedText.java | 23 ++ .../elements/AnimatedOverlayElement.java | 29 +++ .../{ => elements}/AnimatedSceneElement.java | 12 +- .../elements/MetaDocOverlayElement.java | 14 + .../metadoc/elements/MetaDocSceneElement.java | 13 + .../metadoc/elements/ParrotElement.java | 72 ++++++ .../metadoc/elements/TextWindowElement.java | 69 +++++ .../{ => elements}/WorldSectionElement.java | 112 ++++---- .../instructions/CreateParrotInstruction.java | 13 + .../DisplayWorldSectionInstruction.java | 30 +-- .../FadeIntoSceneInstruction.java | 37 +++ .../instructions/HideAllInstruction.java | 27 +- .../ReplaceBlocksInstruction.java | 40 +++ .../instructions/RotateSceneInstruction.java | 34 +++ .../ShowCompleteSchematicInstruction.java | 8 +- .../instructions/TextWindowInstruction.java | 52 ++++ .../TileEntityDataInstruction.java | 50 ++++ .../instructions/WorldModifyInstruction.java | 32 +++ .../metadoc/stories/CogwheelStory.java | 30 --- .../foundation/utility/ColorHelper.java | 6 + .../utility/SuperByteBufferCache.java | 5 + 54 files changed, 1555 insertions(+), 405 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/Select.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java rename src/main/java/com/simibubi/create/foundation/metadoc/{ => elements}/AnimatedSceneElement.java (78%) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java rename src/main/java/com/simibubi/create/foundation/metadoc/{ => elements}/WorldSectionElement.java (69%) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 7546069c8..91688b763 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -140,7 +140,7 @@ de8a40b7daf1497d5aecee47a43b3e0b1d030b00 assets/create/blockstates/fancy_scoria_ fc9ac0a7e7191b93516719455a17177fa6524ecc assets/create/blockstates/fancy_weathered_limestone_bricks_slab.json b2a7c321b1795f20e7433f81a55ce4683de081b8 assets/create/blockstates/fancy_weathered_limestone_bricks_stairs.json 6372fe02ba0065acb0758121c45a15a1a8fdc5de assets/create/blockstates/fancy_weathered_limestone_bricks_wall.json -4c3e0500f9382d2e426e823fe876f57f4d7ee3b4 assets/create/blockstates/fluid_pipe.json +48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json f0eaab18e16c4f3f65ebf3b55b08f0dc445720fe assets/create/blockstates/fluid_tank.json 5408d92ab02af86539ac42971d4033545970bb3a assets/create/blockstates/fluid_valve.json e9da1794b6ece7f9aa8bcb43d42c23a55446133b assets/create/blockstates/flywheel.json @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -bdd56f32ce0a148b6e466a55ab2777f69fc08cfc assets/create/blockstates/radial_chassis.json +6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,18 +401,18 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -acc852d80378b426d7ee6cb59c169e06b6d63b25 assets/create/lang/en_us.json -30ce93c56557cea2f384a47b549fb893700523a5 assets/create/lang/unfinished/de_de.json -77b8310f3cbed36fa0d2ee29e65ac6aee0c2adc2 assets/create/lang/unfinished/es_mx.json -8db9f9147dcef8c8182c548a524f96f578c116ec assets/create/lang/unfinished/fr_fr.json -89f7029d73733938ee9f900fc36d52ab7fc97563 assets/create/lang/unfinished/it_it.json -b1935e7f8d79d1112e1685adb42daedb976ac6d7 assets/create/lang/unfinished/ja_jp.json -23aaf879d07a24775aeba3b98c355c992b24f28b assets/create/lang/unfinished/ko_kr.json -7372533759001f094dbcad787f01f3de7422d8c0 assets/create/lang/unfinished/nl_nl.json -0d1e5d79ef196a06b273962d5ac8f2013f91209c assets/create/lang/unfinished/pt_br.json -54da7badbd4fb043f73f6e9a4dfc52bd9e7f515c assets/create/lang/unfinished/ru_ru.json -45ca54406acac857752c67a45729da953d11f94a assets/create/lang/unfinished/zh_cn.json -4093ea8612465858aa57581b36f8f60aa23ac203 assets/create/lang/unfinished/zh_tw.json +a3e1a1b7946534a5db2482cc6d43aadbdaf0938f assets/create/lang/en_us.json +56c92fc5d2526d6ab9086d2edb03956234cad255 assets/create/lang/unfinished/de_de.json +4cab4140761c85fe6f2cb0a636ade5d63be422c4 assets/create/lang/unfinished/es_mx.json +c1436ba5bd506cd531586a1ca87f7bcc1091a2d6 assets/create/lang/unfinished/fr_fr.json +4747471601a24efbc6cb01b339bafb984b6903c6 assets/create/lang/unfinished/it_it.json +5b87db032d1726cc10a225bf0c4740f50169517f assets/create/lang/unfinished/ja_jp.json +acc6638d1ae47eab3c33431e3b794d85bf158f8f assets/create/lang/unfinished/ko_kr.json +88a425173c828ce221435dfd9a29316cfe05204b assets/create/lang/unfinished/nl_nl.json +4672e12982db0283e4826904c2538a5465c5c1e6 assets/create/lang/unfinished/pt_br.json +85d5f3d8fd543c5f8d2d50e689b5ad25765c7cc2 assets/create/lang/unfinished/ru_ru.json +ad1f7b8a42bc74dd416380faf2b66f2ca1302ec0 assets/create/lang/unfinished/zh_cn.json +c561cc74bcfc00b664ec299fb8d6f9ee2c236d24 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/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 581373307..80a25280c 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,9 +60,9 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", + "up": "true", + "south": "false", "north": "true" }, "apply": { @@ -71,9 +71,9 @@ }, { "when": { - "south": "true", - "up": "true", "down": "false", + "up": "true", + "south": "true", "north": "false" }, "apply": { @@ -82,9 +82,9 @@ }, { "when": { - "south": "false", - "up": "false", "down": "true", + "up": "false", + "south": "false", "north": "true" }, "apply": { @@ -93,9 +93,9 @@ }, { "when": { - "south": "true", - "up": "false", "down": "true", + "up": "false", + "south": "true", "north": "false" }, "apply": { @@ -104,9 +104,9 @@ }, { "when": { - "south": "false", - "up": "true", "down": "true", + "up": "true", + "south": "false", "north": "false" }, "apply": { @@ -115,20 +115,9 @@ }, { "when": { - "south": "false", - "up": "true", "down": "false", - "north": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_x" - } - }, - { - "when": { + "up": "true", "south": "false", - "up": "false", - "down": "true", "north": "false" }, "apply": { @@ -137,9 +126,20 @@ }, { "when": { + "down": "true", + "up": "false", + "south": "false", + "north": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_x" + } + }, + { + "when": { + "down": "false", + "up": "false", "south": "true", - "up": "false", - "down": "false", "north": "true" }, "apply": { @@ -148,9 +148,9 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", + "up": "false", + "south": "false", "north": "true" }, "apply": { @@ -159,9 +159,9 @@ }, { "when": { - "south": "true", - "up": "false", "down": "false", + "up": "false", + "south": "true", "north": "false" }, "apply": { @@ -170,9 +170,9 @@ }, { "when": { - "south": "false", - "up": "false", "down": "false", + "up": "false", + "south": "false", "north": "false" }, "apply": { @@ -302,8 +302,8 @@ }, { "when": { - "up": "true", "down": "false", + "up": "true", "west": "false", "east": "true" }, @@ -313,8 +313,8 @@ }, { "when": { - "up": "true", "down": "false", + "up": "true", "west": "true", "east": "false" }, @@ -324,8 +324,8 @@ }, { "when": { - "up": "false", "down": "true", + "up": "false", "west": "false", "east": "true" }, @@ -335,8 +335,8 @@ }, { "when": { - "up": "false", "down": "true", + "up": "false", "west": "true", "east": "false" }, @@ -346,19 +346,8 @@ }, { "when": { - "up": "true", "down": "true", - "west": "false", - "east": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_z" - } - }, - { - "when": { "up": "true", - "down": "false", "west": "false", "east": "false" }, @@ -368,8 +357,19 @@ }, { "when": { - "up": "false", + "down": "false", + "up": "true", + "west": "false", + "east": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_z" + } + }, + { + "when": { "down": "true", + "up": "false", "west": "false", "east": "false" }, @@ -379,8 +379,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "true", "east": "true" }, @@ -390,8 +390,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "false", "east": "true" }, @@ -401,8 +401,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "true", "east": "false" }, @@ -412,8 +412,8 @@ }, { "when": { - "up": "false", "down": "false", + "up": "false", "west": "false", "east": "false" }, diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 1aa3d3728..f97d8c8bc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -29,8 +29,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "x" + "axis": "x", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "y" + "axis": "y", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "sticky_south": "true", - "axis": "z" + "axis": "z", + "sticky_south": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "x" + "axis": "x", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "y" + "axis": "y", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "sticky_south": "false", - "axis": "z" + "axis": "z", + "sticky_south": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index fb30e864a..69da8b46a 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1786,6 +1786,22 @@ "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "This is Shared stuff", + "create.metadoc.shared.when_wrenched": "When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 10f43ea40..7ffbf545b 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: 1095", + "_": "Missing Localizations: 1107", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 5982b8d60..1e175818f 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: 886", + "_": "Missing Localizations: 898", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 f9524d01b..0c4230e07 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: 666", + "_": "Missing Localizations: 678", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "Celui-ci n'est peut-être pas pour vous. Que dire de celui-là?", "create.tooltip.randomWipDescription8": "Utilisez-le et regrettez immédiatement votre décision.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 d8b4ba2dd..50077225a 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: 3", + "_": "Missing Localizations: 15", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "Questo forse non fa per te. Che ne dici di quello?", "create.tooltip.randomWipDescription8": "Usalo e rimpiangi immediatamente la tua decisione.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 51e3ebb30..33203a9f6 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: 12", + "_": "Missing Localizations: 24", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "これは君に向いていないかもしれない。 あれはどう??", "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔する。", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 f9779a768..baf40797c 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: 55", + "_": "Missing Localizations: 67", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "This one maybe isn't for you. What about that one?", "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 cbd42c8a8..7b9c03a39 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: 1155", + "_": "Missing Localizations: 1167", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "Deze is misschien niet geschikt voor jou.", "create.tooltip.randomWipDescription8": "Gebruikt het en je zal meteen spijt hebben.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 a967dbbe6..071a3425e 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: 1221", + "_": "Missing Localizations: 1233", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "UNLOCALIZED: This one maybe isn't for you. What about that one?", "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 01743b81b..102977f20 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: 5", + "_": "Missing Localizations: 17", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "Этот, возможно, но не для тебя. Как насчет этого?", "create.tooltip.randomWipDescription8": "Используя его, вы немедленно пожалеете о своем решении.", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 625bf7385..56c4a2cbe 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: 3", + "_": "Missing Localizations: 15", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "这玩意不是给你用的,换个吧", "create.tooltip.randomWipDescription8": "试试就逝世。", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 8fa416308..f3a73370e 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: 8", + "_": "Missing Localizations: 20", "_": "->------------------------] Game Elements [------------------------<-", @@ -1787,6 +1787,22 @@ "create.tooltip.randomWipDescription7": "這東西不是給你用的,再找找吧!", "create.tooltip.randomWipDescription8": "用了就死定了。", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", + "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", + "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", + "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", + "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", + "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", + "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", + "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", + "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", + "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "_": "Thank you for translating Create!" } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 07668a3b6..861006a1d 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,8 +16,8 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.metadoc.MetaDocs; -import com.simibubi.create.foundation.metadoc.WorldSectionElement; +import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -76,7 +76,7 @@ public class CreateClient { AllEntityTypes.registerRenderers(); getColorHandler().init(); AllFluids.assignRenderLayers(); - MetaDocs.register(); + MetaDocIndex.register(); IResourceManager resourceManager = Minecraft.getInstance() .getResourceManager(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index a7d96c5be..944d6a0f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -66,7 +66,7 @@ public abstract class KineticTileEntity extends SmartTileEntity @Override public void initialize() { - if (hasNetwork()) { + if (hasNetwork() && !world.isRemote) { KineticNetwork network = getOrCreateNetwork(); if (!network.initialized) network.initFromTE(capacity, stress, networkSize); diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java index e414c36e6..7fabee37f 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java @@ -34,11 +34,12 @@ import net.minecraft.world.biome.Biomes; public class SchematicWorld extends WrappedWorld { - private Map blocks; - private Map tileEntities; - private List renderedTileEntities; - private List entities; - private MutableBoundingBox bounds; + protected Map blocks; + protected Map tileEntities; + protected List renderedTileEntities; + protected List entities; + protected MutableBoundingBox bounds; + public BlockPos anchor; public boolean renderMode; @@ -179,6 +180,13 @@ public class SchematicWorld extends WrappedWorld { pos = pos.subtract(anchor); bounds.expandTo(new MutableBoundingBox(pos, pos)); blocks.put(pos, arg1); + if (tileEntities.containsKey(pos)) { + TileEntity tileEntity = tileEntities.get(pos); + if (!tileEntity.getType().isValidBlock(arg1.getBlock())) { + tileEntities.remove(pos); + renderedTileEntities.remove(tileEntity); + } + } return true; } diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 34dcfeb86..8a4aaef81 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -1,21 +1,49 @@ package com.simibubi.create.foundation.data; +import com.google.common.base.Supplier; +import com.google.gson.JsonElement; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.metadoc.MetaDocs; +import com.simibubi.create.foundation.utility.FilesHelper; +import com.simibubi.create.foundation.utility.Lang; + public enum AllLangPartials { - + ADVANCEMENTS("Advancements"), MESSAGES("UI & Messages"), TOOLTIPS("Item Descriptions"), - + METADOC("MetaDoc Text", MetaDocs::provideLangEntries), + ; - + private String display; + private Supplier provider; private AllLangPartials(String display) { this.display = display; + this.provider = this::fromResource; + } + + private AllLangPartials(String display, Supplier customProvider) { + this.display = display; + this.provider = customProvider; } public String getDisplay() { return display; } + public JsonElement provide() { + return provider.get(); + } + + private JsonElement fromResource() { + String fileName = Lang.asId(name()); + String filepath = "assets/" + Create.ID + "/lang/default/" + fileName + ".json"; + JsonElement element = FilesHelper.loadJsonResource(filepath); + if (element == null) + throw new IllegalStateException(String.format("Could not find default lang file: %s", filepath)); + return element; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java index d51631052..9c9b9f9d9 100644 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java @@ -24,7 +24,6 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.FilesHelper; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.data.DataGenerator; import net.minecraft.data.DirectoryCache; @@ -201,14 +200,9 @@ public class LangMerger implements IDataProvider { } private void collectEntries() { - for (AllLangPartials partial : AllLangPartials.values()) { - String fileName = Lang.asId(partial.name()); - String filepath = "assets/" + Create.ID + "/lang/default/" + fileName + ".json"; - JsonElement element = FilesHelper.loadJsonResource(filepath); - if (element == null) - throw new IllegalStateException(String.format("Could not find default lang file: %s", filepath)); - addAll(partial.getDisplay(), element.getAsJsonObject()); - } + for (AllLangPartials partial : AllLangPartials.values()) + addAll(partial.getDisplay(), partial.provide() + .getAsJsonObject()); } private void save(DirectoryCache cache, List dataIn, int missingKeys, Path target, String message) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java index 5ed72ec0e..106379330 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiContainerScreen.java @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.widget.Widget; @@ -41,6 +42,8 @@ public abstract class AbstractSimiContainerScreen extends C @Override public void render(int mouseX, int mouseY, float partialTicks) { + partialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); renderBackground(); renderWindow(mouseX, mouseY, partialTicks); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index 1ec2a4129..2b1902376 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -5,6 +5,7 @@ import java.util.List; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.Widget; import net.minecraft.util.text.StringTextComponent; @@ -32,6 +33,8 @@ public abstract class AbstractSimiScreen extends Screen { @Override public void render(int mouseX, int mouseY, float partialTicks) { + partialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); renderBackground(); renderWindow(mouseX, mouseY, partialTicks); for (Widget widget : widgets) @@ -79,7 +82,7 @@ public abstract class AbstractSimiScreen extends Screen { } return super.mouseScrolled(mouseX, mouseY, delta); } - + @Override public boolean mouseReleased(double x, double y, int button) { boolean result = false; @@ -106,8 +109,9 @@ public abstract class AbstractSimiScreen extends Screen { for (Widget widget : widgets) { if (!widget.isHovered()) continue; - - if (widget instanceof AbstractSimiWidget && !((AbstractSimiWidget) widget).getToolTip().isEmpty()) { + + if (widget instanceof AbstractSimiWidget && !((AbstractSimiWidget) widget).getToolTip() + .isEmpty()) { renderTooltip(((AbstractSimiWidget) widget).getToolTip(), mouseX, mouseY); } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java new file mode 100644 index 000000000..753d454c8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java @@ -0,0 +1,17 @@ +package com.simibubi.create.foundation.metadoc; + +public class MetaDocElement { + + boolean visible = true; + + public void tick() {} + + public boolean isVisible() { + return visible; + } + + public void setVisible(boolean visible) { + this.visible = visible; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java new file mode 100644 index 000000000..55b28c150 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java @@ -0,0 +1,74 @@ +package com.simibubi.create.foundation.metadoc; + +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.util.ResourceLocation; + +public class MetaDocLocalization { + + static Map shared = new HashMap<>(); + static Map>> specific = new HashMap<>(); + + // + + public static void registerShared(String key, String enUS) { + shared.put(key, enUS); + } + + public static void registerSpecific(ResourceLocation component, int scene, String key, String enUS) { + specific.computeIfAbsent(component, $ -> new HashMap<>()) + .computeIfAbsent(scene, $ -> new HashMap<>()) + .put(key, enUS); + } + + // + + public static String getShared(String key) { + if (MetaDocIndex.EDITOR_MODE) + return shared.get(key); + return Lang.translate(langKeyForShared(key)); + } + + public static String getSpecific(ResourceLocation component, int scene, String k) { + if (MetaDocIndex.EDITOR_MODE) + return specific.get(component) + .get(scene) + .get(k); + return Lang.translate(langKeyForSpecific(component.getPath(), scene, k)); + } + + // + + static final String LANG_PREFIX = "metadoc."; + + public static JsonElement record() { + JsonObject object = new JsonObject(); + shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); + specific.forEach((rl, map) -> { + String component = rl.getPath(); + for (int i = 0; i < map.size(); i++) { + final int scene = i; + Map sceneMap = map.get(i); + sceneMap.forEach( + (k, v) -> object.addProperty(Create.ID + "." + langKeyForSpecific(component, scene, k), v)); + } + }); + return object; + } + + protected static String langKeyForSpecific(String component, int scene, String k) { + return LANG_PREFIX + component + ".scene_" + scene + "." + k; + } + + protected static String langKeyForShared(String k) { + return LANG_PREFIX + "shared." + k; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java index 7642c1927..eb92fb29d 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java @@ -2,46 +2,82 @@ package com.simibubi.create.foundation.metadoc; import java.util.ArrayList; import java.util.HashSet; -import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; +import com.simibubi.create.foundation.metadoc.elements.MetaDocOverlayElement; +import com.simibubi.create.foundation.metadoc.elements.MetaDocSceneElement; +import com.simibubi.create.foundation.metadoc.elements.ParrotElement; +import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; +import com.simibubi.create.foundation.metadoc.instructions.CreateParrotInstruction; import com.simibubi.create.foundation.metadoc.instructions.DelayInstruction; import com.simibubi.create.foundation.metadoc.instructions.DisplayWorldSectionInstruction; import com.simibubi.create.foundation.metadoc.instructions.HideAllInstruction; +import com.simibubi.create.foundation.metadoc.instructions.ReplaceBlocksInstruction; +import com.simibubi.create.foundation.metadoc.instructions.RotateSceneInstruction; import com.simibubi.create.foundation.metadoc.instructions.ShowCompleteSchematicInstruction; +import com.simibubi.create.foundation.metadoc.instructions.TextWindowInstruction; +import com.simibubi.create.foundation.metadoc.instructions.TileEntityDataInstruction; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.Vector4f; import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; public class MetaDocScene { List schedule, activeSchedule; - Set elements; - Map> groups; + Set elements; MetaDocWorld world; + ResourceLocation component; + int sceneIndex; + SceneTransform transform; - public MetaDocScene(MetaDocWorld world) { + public MetaDocScene(MetaDocWorld world, ResourceLocation component, int sceneIndex) { this.world = world; + this.component = component; + this.sceneIndex = sceneIndex; elements = new HashSet<>(); - groups = new IdentityHashMap<>(); schedule = new ArrayList<>(); activeSchedule = new ArrayList<>(); + transform = new SceneTransform(); + } + + public String getTitle() { + return getString("title"); + } + + public String getString(String key) { + return MetaDocLocalization.getSpecific(component, sceneIndex, key); } public void reset() { activeSchedule.clear(); schedule.forEach(mdi -> mdi.reset(this)); } - + public void begin() { reset(); + world.restore(); + transform = new SceneTransform(); + forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); elements.clear(); activeSchedule.addAll(schedule); } @@ -51,18 +87,27 @@ public class MetaDocScene { activeSchedule.add(new HideAllInstruction(10, null)); } - public void render(IRenderTypeBuffer buffer, MatrixStack ms) { + public void renderScene(IRenderTypeBuffer buffer, MatrixStack ms) { ms.push(); - MutableBoundingBox bounds = world.getBounds(); - ms.translate(bounds.getXSize() / -2f, -.5f, bounds.getZSize() / -2f); - elements.forEach(e -> { - if (e.visible) + forEach(MetaDocSceneElement.class, e -> { + if (e.isVisible()) e.render(world, buffer, ms); }); ms.pop(); } + public void renderOverlay(MetaDocScreen screen, MatrixStack ms, float partialTicks) { + ms.push(); + forEach(MetaDocOverlayElement.class, e -> { + if (e.isVisible()) + e.render(this, screen, ms, partialTicks); + }); + ms.pop(); + } + public void tick() { + transform.tick(); + forEach(MetaDocElement::tick); for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { MetaDocInstruction metaDocInstruction = iterator.next(); metaDocInstruction.tick(this); @@ -75,7 +120,7 @@ public class MetaDocScene { } } - public void addElement(MetaDocSceneElement e) { + public void addElement(MetaDocElement e) { elements.add(e); } @@ -83,32 +128,133 @@ public class MetaDocScene { return world; } - public Set getElements() { + public Set getElements() { return elements; } + public void forEach(Consumer function) { + for (MetaDocElement metaDocElement : elements) + function.accept(metaDocElement); + } + + public void forEach(Class type, Consumer function) { + for (MetaDocElement metaDocElement : elements) + if (type.isInstance(metaDocElement)) + function.accept(type.cast(metaDocElement)); + } + public MutableBoundingBox getBounds() { - return world.getBounds(); + return world == null ? new MutableBoundingBox() : world.getBounds(); } public SceneBuilder builder() { return new SceneBuilder(); } + private Supplier textGetter(String key) { + return () -> MetaDocLocalization.getSpecific(component, sceneIndex, key); + } + + public SceneTransform getTransform() { + return transform; + } + + public class SceneTransform { + + public LerpedFloat xRotation, yRotation; + + // Screen params + int width, height; + double offset; + Matrix4f cachedMat; + + public SceneTransform() { + xRotation = LerpedFloat.angular() + .startWithValue(-35); + yRotation = LerpedFloat.angular() + .startWithValue(55); + } + + public void tick() { + xRotation.tickChaser(); + yRotation.tickChaser(); + } + + public void updateScreenParams(int width, int height, double offset) { + this.width = width; + this.height = height; + this.offset = offset; + cachedMat = null; + } + + public MatrixStack apply(MatrixStack ms) { + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + ms.translate(width / 2, height / 2, 200); + + MatrixStacker.of(ms) + .rotateX(-35) + .rotateY(55); + ms.translate(offset, 0, 0); + MatrixStacker.of(ms) + .rotateY(-55) + .rotateX(35); + + MatrixStacker.of(ms) + .rotateX(xRotation.getValue(pt)) + .rotateY(yRotation.getValue(pt)); + ms.scale(30, -30, 30); + + MutableBoundingBox bounds = getBounds(); + ms.translate(bounds.getXSize() / -2f, -.5f, bounds.getZSize() / -2f); + + return ms; + } + + public Vec3d screenToScene(float x, float y) { + refreshMatrix(); + Vector4f vec = new Vector4f(x, y, 0, 1); + cachedMat.invert(); + vec.transform(cachedMat); + cachedMat.invert(); + MutableBoundingBox bounds = getBounds(); + return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); + } + + public Vec2f sceneToScreen(Vec3d vec) { + refreshMatrix(); + Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); + vec4.transform(cachedMat); + return new Vec2f(vec4.getX(), vec4.getY()); + } + + protected void refreshMatrix() { + if (cachedMat != null) + return; + MatrixStack ms = apply(new MatrixStack()); +// MatrixStacker.of(ms) +// .rotateY(180); + cachedMat = ms.peek() + .getModel(); + } + + } + public class SceneBuilder { public SceneBuilder showBasePlate() { Vec3i length = getBounds().getLength(); - return showSection(BlockPos.ZERO, new Vec3i(length.getX(), 0, length.getZ()), Direction.UP); + return showSection(Select.cuboid(BlockPos.ZERO, new Vec3i(length.getX(), 0, length.getZ())), Direction.UP); } - public SceneBuilder showSection(BlockPos origin, Vec3i size, Direction fadeInDirection) { + public SceneBuilder showText(Vec3d position, String key, String defaultText, int fadeTime, int duration) { + MetaDocLocalization.registerSpecific(component, sceneIndex, key, defaultText); + return addInstruction(new TextWindowInstruction(textGetter(key), fadeTime, duration, position)); + } + + public SceneBuilder showSection(Select selection, Direction fadeInDirection) { return addInstruction( - new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement.Cuboid(origin, size))); - } - - public SceneBuilder showSection(WorldSectionElement element, Direction fadeInDirection) { - return addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, element)); + new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement(selection))); } public SceneBuilder debugSchematic() { @@ -123,11 +269,62 @@ public class MetaDocScene { return idle(seconds * 20); } + public SceneBuilder rotateCameraY(float degrees) { + return addInstruction(new RotateSceneInstruction(0, degrees, true)); + } + + public SceneBuilder setBlocks(Select selection, BlockState state) { + return addInstruction(new ReplaceBlocksInstruction(selection, state, true)); + } + + public SceneBuilder replaceBlocks(Select selection, BlockState state) { + return addInstruction(new ReplaceBlocksInstruction(selection, state, false)); + } + + public SceneBuilder setKineticSpeed(Select selection, float speed) { + return modifyKineticSpeed(selection, f -> speed); + } + + public SceneBuilder multiplyKineticSpeed(Select selection, float modifier) { + return modifyKineticSpeed(selection, f -> f * modifier); + } + + public SceneBuilder modifyKineticSpeed(Select selection, UnaryOperator speedFunc) { + return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { + if (!nbt.contains("Speed")) + return nbt; + nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); + return nbt; + }, false)); + } + + public SceneBuilder flapFunnels(Select selection, boolean outward) { + return addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> { + nbt.putInt("Flap", outward ? -1 : 1); + return nbt; + }, false)); + } + + public SceneBuilder createParrotOn(BlockPos pos, Direction fadeInDirection) { + return addInstruction( + new CreateParrotInstruction(15, fadeInDirection, new ParrotElement(new Vec3d(pos).add(.5, 0, .5)))); + } + + public SceneBuilder createParrot(Vec3d location, Direction fadeInDirection) { + return addInstruction(new CreateParrotInstruction(15, fadeInDirection, new ParrotElement(location))); + } + public SceneBuilder addInstruction(MetaDocInstruction instruction) { schedule.add(instruction); return this; } + // + + public Select everywhere() { + return Select.cuboid(BlockPos.ZERO, getBounds().getLength()); + } + } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java deleted file mode 100644 index 1b208c990..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocSceneElement.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import com.mojang.blaze3d.matrix.MatrixStack; - -import net.minecraft.client.renderer.IRenderTypeBuffer; - -public abstract class MetaDocSceneElement { - - boolean visible = true; - - public abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms); - - public void setVisible(boolean visible) { - this.visible = visible; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java index 3f0f7ae8b..e9188f03b 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java @@ -6,26 +6,28 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.GameSettings; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.util.math.MathHelper; import net.minecraftforge.fml.client.gui.GuiUtils; public class MetaDocScreen extends AbstractSimiScreen { - private List stories; + private List scenes; private LerpedFloat fadeIn; private LerpedFloat lazyIndex; private int index = 0; - public MetaDocScreen(List stories) { - this.stories = stories; + public MetaDocScreen(List scenes) { + this.scenes = scenes; lazyIndex = LerpedFloat.linear() .startWithValue(index); fadeIn = LerpedFloat.linear() @@ -37,11 +39,11 @@ public class MetaDocScreen extends AbstractSimiScreen { public void tick() { lazyIndex.tickChaser(); fadeIn.tickChaser(); - stories.get(index) + scenes.get(index) .tick(); float lazyIndexValue = lazyIndex.getValue(); if (Math.abs(lazyIndexValue - index) > 1 / 512f) - stories.get(lazyIndexValue < index ? index - 1 : index + 1) + scenes.get(lazyIndexValue < index ? index - 1 : index + 1) .tick(); } @@ -55,11 +57,11 @@ public class MetaDocScreen extends AbstractSimiScreen { protected boolean scroll(boolean forward) { int prevIndex = index; index = forward ? index + 1 : index - 1; - index = MathHelper.clamp(index, 0, stories.size() - 1); + index = MathHelper.clamp(index, 0, scenes.size() - 1); if (prevIndex != index && Math.abs(index - lazyIndex.getValue()) < 1.5f) { - stories.get(prevIndex) + scenes.get(prevIndex) .fadeOut(); - stories.get(index) + scenes.get(index) .begin(); lazyIndex.chase(index, 1 / 4f, Chaser.EXP); return true; @@ -70,9 +72,6 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { - partialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); - RenderSystem.enableBlend(); renderStories(partialTicks); renderWidgets(mouseX, mouseY, partialTicks); @@ -86,49 +85,65 @@ public class MetaDocScreen extends AbstractSimiScreen { } protected void renderStory(int i, float partialTicks) { - MetaDocScene story = stories.get(i); + SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); + MetaDocScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); - ms.push(); - - ms.translate(width / 2, height / 2, 200); - MatrixStacker.of(ms) - .rotateX(-45) - .rotateY(45); - double value = lazyIndex.getValue(partialTicks); double diff = i - value; - double slide = MathHelper.lerp(diff * diff, 200, 600); - ms.translate(diff * slide, 0, 0); + double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; - ms.scale(30, -30, 30); - - SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); - story.render(buffer, ms); + ms.push(); + story.transform.updateScreenParams(width, height, slide); + story.transform.apply(ms); + story.renderScene(buffer, ms); buffer.draw(); ms.pop(); } - protected void renderWidgets(int mouseX, int mouseY, float pt) { - float fade = fadeIn.getValue(pt); + protected void renderWidgets(int mouseX, int mouseY, float partialTicks) { + float fade = fadeIn.getValue(partialTicks); + float lazyIndexValue = lazyIndex.getValue(partialTicks); + float indexDiff = Math.abs(lazyIndexValue - index); int textColor = 0xeeeeee; - drawString(font, "MetaDoc Experimental 0", 50, 50 - 16, textColor); + { + int y = 34; + drawString(font, "MetaDoc Experimental 0", 50, y, textColor); + y += 10; + drawString(font, "> " + scenes.get(index) + .getTitle(), 50, y, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + y += 10; + if (MetaDocIndex.EDITOR_MODE) + drawString(font, "Mouse: " + mouseX + ", " + mouseY, 50, y, 0x8d8d8d); + } + // Scene overlay RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 100); + renderOverlay(index, partialTicks); + if (indexDiff > 1 / 512f) + renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + RenderSystem.popMatrix(); + // Close button + RenderSystem.pushMatrix(); if (fade < fadeIn.getChaseTarget()) RenderSystem.translated(0, (1 - fade) * 5, 0); - int closeWidth = 24; int closeHeight = 24; int closeX = (width - closeWidth) / 2; int closeY = height - closeHeight - 31; boolean hovered = isMouseOver(mouseX, mouseY, closeX, closeY, closeWidth, closeHeight); - - renderBox(closeX, closeY, closeWidth, closeHeight, 0xdd000000, hovered ? 0x70ffffff : 0x30eebb00, - hovered ? 0x30ffffff : 0x10eebb00); + renderBox(closeX, closeY, closeWidth, closeHeight, hovered); AllIcons.I_CONFIRM.draw(closeX + 4, closeY + 4); + RenderSystem.popMatrix(); + } + private void renderOverlay(int i, float partialTicks) { + RenderSystem.pushMatrix(); + MetaDocScene story = scenes.get(i); + MatrixStack ms = new MatrixStack(); + story.renderOverlay(this, ms, partialTicks); RenderSystem.popMatrix(); } @@ -155,17 +170,17 @@ public class MetaDocScreen extends AbstractSimiScreen { .getKeyCode(); int dCode = settings.keyBindRight.getKey() .getKeyCode(); - + if (code == sCode) { onClose(); return true; } - + if (code == aCode) { scroll(false); return true; } - + if (code == dCode) { scroll(true); return true; @@ -173,6 +188,10 @@ public class MetaDocScreen extends AbstractSimiScreen { return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } + + public FontRenderer getFontRenderer() { + return font; + } protected boolean isMouseOver(double mouseX, double mouseY, int x, int y, int w, int h) { boolean hovered = !(mouseX < x || mouseX > x + w); @@ -180,27 +199,26 @@ public class MetaDocScreen extends AbstractSimiScreen { return hovered; } - protected void renderBox(int tooltipX, int tooltipY, int tooltipTextWidth, int tooltipHeight, int backgroundColor, - int borderColorStart, int borderColorEnd) { - int zLevel = 400; - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, - backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, - tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, - tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, - backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, - tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, - tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, - tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, - borderColorStart, borderColorStart); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, - tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + public void drawString(String s, int x, int y, int color) { + drawString(font, s, x, y, color); + } + + public void renderBox(int x, int y, int w, int h, boolean highlighted) { + renderBox(x, y, w, h, 0xdd000000, highlighted ? 0x70ffffff : 0x30eebb00, highlighted ? 0x30ffffff : 0x10eebb00); + } + + public void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, int borderColorEnd) { + int zLevel = 100; + GuiUtils.drawGradientRect(zLevel, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, + borderColorEnd); + GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart); + GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd); } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java index ecd1e78ca..5199eec25 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java @@ -7,6 +7,8 @@ import net.minecraft.util.math.Vec3i; public abstract class MetaDocStoryBoard { public abstract String getSchematicName(); + + public abstract String getStoryTitle(); public abstract void program(SceneBuilder scene, Vec3i worldSize); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java index a4388670d..4673cee68 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java @@ -1,20 +1,50 @@ package com.simibubi.create.foundation.metadoc; +import java.util.HashMap; +import java.util.Map; + import com.simibubi.create.content.schematics.SchematicWorld; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; import net.minecraft.world.World; public class MetaDocWorld extends SchematicWorld { + protected Map originalBlocks; + protected Map originalTileEntities; + int overrideLight; - WorldSectionElement mask; + Select mask; public MetaDocWorld(BlockPos anchor, World original) { super(anchor, original); + originalBlocks = new HashMap<>(); + originalTileEntities = new HashMap<>(); + } + + public void createBackup() { + originalBlocks.clear(); + originalTileEntities.clear(); + blocks.forEach((k, v) -> originalBlocks.put(k, v)); + tileEntities.forEach((k, v) -> originalTileEntities.put(k, TileEntity.create(v.write(new CompoundNBT())))); + } + + public void restore() { + blocks.clear(); + tileEntities.clear(); + renderedTileEntities.clear(); + originalBlocks.forEach((k, v) -> blocks.put(k, v)); + originalTileEntities.forEach((k, v) -> { + TileEntity te = TileEntity.create(v.write(new CompoundNBT())); + te.setLocation(this, te.getPos()); + tileEntities.put(k, te); + renderedTileEntities.add(te); + }); } public void pushFakeLight(int light) { @@ -30,7 +60,7 @@ public class MetaDocWorld extends SchematicWorld { return overrideLight == -1 ? 15 : overrideLight; } - public void setMask(WorldSectionElement mask) { + public void setMask(Select mask) { this.mask = mask; } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java index 649b7fb71..7d94caf57 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java @@ -8,12 +8,12 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import java.util.zip.GZIPInputStream; -import com.simibubi.create.AllBlocks; +import com.google.gson.JsonElement; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.stories.CogwheelStory; +import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.metadoc.content.SharedText; import com.tterrag.registrate.util.entry.ItemProviderEntry; import net.minecraft.client.Minecraft; @@ -22,6 +22,7 @@ import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTSizeTracker; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; @@ -29,33 +30,40 @@ public class MetaDocs { static Map> all = new HashMap<>(); - public static void register() { - - for (int i = 1; i < 6; i++) - addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory(i)); - - } - - private static void addStoryBoard(ItemProviderEntry component, MetaDocStoryBoard storyBoard) { + public static void addStoryBoard(ItemProviderEntry component, MetaDocStoryBoard storyBoard) { ResourceLocation id = component.getId(); all.computeIfAbsent(id, $ -> new ArrayList<>()) .add(storyBoard); } public static List compile(ResourceLocation id) { - return all.get(id) - .stream() - .map(sb -> { - Template activeTemplate = loadSchematic(sb.getSchematicName()); - MetaDocWorld world = new MetaDocWorld(BlockPos.ZERO, Minecraft.getInstance().world); - activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); - MetaDocScene scene = new MetaDocScene(world); - sb.program(scene.builder(), world.getBounds() - .getLength()); - scene.begin(); - return scene; - }) - .collect(Collectors.toList()); + + if (MetaDocIndex.EDITOR_MODE) { + MetaDocLocalization.shared.clear(); + MetaDocLocalization.specific.clear(); + SharedText.gatherText(); + } + + List list = all.get(id); + List scenes = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { + + MetaDocStoryBoard sb = list.get(i); + Template activeTemplate = loadSchematic(sb.getSchematicName()); + MetaDocWorld world = new MetaDocWorld(BlockPos.ZERO, Minecraft.getInstance().world); + activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); + world.createBackup(); + + MetaDocScene scene = new MetaDocScene(world, id, i); + MetaDocLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); + sb.program(scene.builder(), world.getBounds() + .getLength()); + scene.begin(); + scenes.add(scene); + + } + + return scenes; } public static Template loadSchematic(String path) { @@ -75,4 +83,18 @@ public class MetaDocs { return t; } + public static JsonElement provideLangEntries() { + MetaDocIndex.register(); + SharedText.gatherText(); + all.forEach((id, list) -> { + for (int i = 0; i < list.size(); i++) { + MetaDocStoryBoard sb = list.get(i); + MetaDocScene scene = new MetaDocScene(null, id, i); + MetaDocLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); + sb.program(scene.builder(), Vec3i.NULL_VECTOR); + } + }); + return MetaDocLocalization.record(); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/Select.java b/src/main/java/com/simibubi/create/foundation/metadoc/Select.java new file mode 100644 index 000000000..688b59ed3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/Select.java @@ -0,0 +1,69 @@ +package com.simibubi.create.foundation.metadoc; + +import java.util.function.Predicate; +import java.util.stream.Stream; + +import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3i; + +public abstract class Select implements Predicate { + + public static Select cuboid(BlockPos origin, Vec3i size) { + return new Cuboid(origin, size); + } + + public static Select pos(int x, int y, int z) { + return new Cuboid(new BlockPos(x, y, z), BlockPos.ZERO); + } + + public static Select everything(MetaDocScene scene) { + MutableBoundingBox bounds = scene.getBounds(); + return cuboid(BlockPos.ZERO, bounds.getLength()); + } + + // + + public WorldSectionElement asElement() { + return new WorldSectionElement(this); + } + + // + + @Override + public abstract int hashCode(); + + public abstract Stream all(); + + private static class Cuboid extends Select { + + MutableBoundingBox bb; + Vec3i origin; + Vec3i size; + + public Cuboid(BlockPos origin, Vec3i size) { + bb = new MutableBoundingBox(origin, origin.add(size)); + this.origin = origin; + this.size = size; + } + + @Override + public boolean test(BlockPos t) { + return bb.isVecInside(t); + } + + @Override + public Stream all() { + return BlockPos.func_229383_a_(bb); + } + + @Override + public int hashCode() { + return origin.hashCode() ^ size.hashCode(); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java new file mode 100644 index 000000000..e332e4e15 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java @@ -0,0 +1,51 @@ +package com.simibubi.create.foundation.metadoc.content; + +import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; +import com.simibubi.create.foundation.metadoc.MetaDocStoryBoard; +import com.simibubi.create.foundation.metadoc.Select; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public class CogwheelStory extends MetaDocStoryBoard { + + private int index; + + public CogwheelStory(int index) { + this.index = index; + } + + @Override + public String getSchematicName() { + return "cogwheel/s" + index; + } + + @Override + public String getStoryTitle() { + return "My First Metadoc Story, Part " + index; + } + + @Override + public void program(SceneBuilder scene, Vec3i worldSize) { + scene.showBasePlate(); + scene.idle(10); + + scene.showSection(Select.cuboid(BlockPos.ZERO.up(), worldSize), Direction.DOWN); + scene.multiplyKineticSpeed(scene.everywhere(), 2); + scene.rotateCameraY(90); + scene.createParrotOn(new BlockPos(0.5, 2.5, 1.5), Direction.DOWN); +// scene.idle(10); +// scene.createParrotOn(new BlockPos(5, 1, 5), Direction.DOWN); +// scene.idle(10); +// scene.createParrotOn(new BlockPos(0, 1, 5), Direction.DOWN); + + scene.idle(40); + scene.showText(new Vec3d(0.5, 2, 1.5), "swinging_text", "there's a parrot", 10, 50); + scene.idle(10); + scene.rotateCameraY(180); + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java new file mode 100644 index 000000000..db91c27a1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java @@ -0,0 +1,22 @@ +package com.simibubi.create.foundation.metadoc.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.metadoc.MetaDocs; + +public class MetaDocIndex { + + /** + * When true, lang files are bypassed and any text in metadoc can be hot-swapped + * without the need of runData + */ + public static final boolean EDITOR_MODE = true; + + public static void register() { + // Register storyboards here (Requires re-launch) + + for (int i = 1; i < 6; i++) + MetaDocs.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory(i)); + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java new file mode 100644 index 000000000..b2d061111 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.metadoc.content; + +import com.simibubi.create.foundation.metadoc.MetaDocLocalization; + +public class SharedText { + + public static void gatherText() { + // Add entries used across several metadoc stories (Safe for hotswap) + + add("when_wrenched", "When Wrenched"); + add("more_shared", "This is Shared stuff"); + + } + + public static String get(String key) { + return MetaDocLocalization.getShared(key); + } + + private static void add(String k, String v) { + MetaDocLocalization.registerShared(k, v); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java new file mode 100644 index 000000000..1c8cf29a0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java @@ -0,0 +1,29 @@ +package com.simibubi.create.foundation.metadoc.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.MetaDocScreen; +import com.simibubi.create.foundation.utility.LerpedFloat; + +public abstract class AnimatedOverlayElement extends MetaDocOverlayElement { + + protected LerpedFloat fade; + + public AnimatedOverlayElement() { + fade = LerpedFloat.linear() + .startWithValue(0); + } + + public void setFade(float fade) { + this.fade.setValue(fade); + } + + @Override + public final void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks) { + float currentFade = fade.getValue(partialTicks); + render(scene, screen, ms, partialTicks, currentFade); + } + + protected abstract void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks, float fade); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java similarity index 78% rename from src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java rename to src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java index fc13b7bff..a3d2bfc82 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/AnimatedSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java @@ -1,6 +1,7 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.metadoc.elements; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.metadoc.MetaDocWorld; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -40,4 +41,13 @@ public abstract class AnimatedSceneElement extends MetaDocSceneElement { protected abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade); + protected int lightCoordsFromFade(float fade) { + int light = 0xF000F0; + if (fade != 1) { + light = (int) (0xF * fade); + light = light << 4 | light << 20; + } + return light; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java new file mode 100644 index 000000000..29566ef8c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.metadoc.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.metadoc.MetaDocElement; +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.MetaDocScreen; + +public abstract class MetaDocOverlayElement extends MetaDocElement { + + public void tick() {} + + public abstract void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java new file mode 100644 index 000000000..a5507a70a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.metadoc.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.metadoc.MetaDocElement; +import com.simibubi.create.foundation.metadoc.MetaDocWorld; + +import net.minecraft.client.renderer.IRenderTypeBuffer; + +public abstract class MetaDocSceneElement extends MetaDocElement { + + public abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java new file mode 100644 index 000000000..5df7d845b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java @@ -0,0 +1,72 @@ +package com.simibubi.create.foundation.metadoc.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.metadoc.MetaDocWorld; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.ParrotEntity; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class ParrotElement extends AnimatedSceneElement { + + private Vec3d location; + private ParrotEntity entity; + + public ParrotElement(Vec3d location) { + this.location = location; + } + + @Override + public void tick() { + super.tick(); + if (entity == null) + return; + entity.ticksExisted++; + +// entity.prevRotationYawHead = entity.rotationYawHead; + entity.oFlapSpeed = entity.flapSpeed; + entity.oFlap = entity.flap; + entity.onGround = true; + +// entity.rotationYawHead++; + entity.flapSpeed = .5f; + entity.flap = 1; +// entity.flap += entity.flapSpeed; +// entity.flap += .5f + Create.random.nextFloat(); + } + + @Override + protected void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + EntityRendererManager entityrenderermanager = Minecraft.getInstance() + .getRenderManager(); + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + + if (entity == null) { + entity = new ParrotEntity(EntityType.PARROT, world); + entity.setVariant(Create.random.nextInt(5)); +// entity.setPartying(BlockPos.ZERO, true); + } + + ms.push(); + ms.translate(location.x, location.y, location.z); + + MatrixStacker.of(ms) + .rotateY(AnimationTickHolder.getRenderTick() * 15) + .rotateZ(30); + ms.translate(-.25f, 0, 0); + + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java new file mode 100644 index 000000000..4cbb84268 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java @@ -0,0 +1,69 @@ +package com.simibubi.create.foundation.metadoc.elements; + +import java.util.List; +import java.util.function.Supplier; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.MetaDocScreen; +import com.simibubi.create.foundation.utility.ColorHelper; + +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.client.gui.GuiUtils; + +public class TextWindowElement extends AnimatedOverlayElement { + + Supplier textGetter; + String bakedText; + Vec3d vec; + + public TextWindowElement(Supplier textGetter) { + this.textGetter = textGetter; + } + + public TextWindowElement moveTo(Vec3d vec) { + this.vec = vec; + return this; + } + + @Override + protected void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks, float fade) { + if (bakedText == null) + bakedText = textGetter.get(); + if (fade < 1 / 16f) + return; + Vec2f sceneToScreen = scene.getTransform() + .sceneToScreen(vec); + int targetX = screen.width * 6 / 8; + int textWidth = screen.width - targetX; + + List list = screen.getFontRenderer() + .listFormattedStringToWidth(bakedText, textWidth); + int boxWidth = 0; + for (String string : list) + boxWidth = Math.max(boxWidth, screen.getFontRenderer() + .getStringWidth(string)); + int boxHeight = screen.getFontRenderer() + .getWordWrappedHeight(bakedText, textWidth); + + RenderSystem.pushMatrix(); + RenderSystem.translatef(0, sceneToScreen.y, 400); + + screen.renderBox(targetX - 10, 3, boxWidth, boxHeight -1 , 0x55000000, 0x30eebb00, 0x10eebb00); + + RenderSystem.pushMatrix(); + RenderSystem.translatef(sceneToScreen.x, 0, 0); + double lineTarget = (targetX - sceneToScreen.x) * fade; + RenderSystem.scaled(lineTarget, 1, 1); + GuiUtils.drawGradientRect(-100, 0, 0, 1, 1, 0xFFFFFFFF, 0xFFFFFFFF); + GuiUtils.drawGradientRect(-100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); + RenderSystem.popMatrix(); + + screen.getFontRenderer() + .drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(0xeeeeee, fade)); + RenderSystem.popMatrix(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java similarity index 69% rename from src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java rename to src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java index d1260037f..c3f867a6b 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java @@ -1,17 +1,17 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.metadoc.elements; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Random; -import java.util.function.Predicate; -import java.util.stream.Stream; import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.metadoc.MetaDocWorld; +import com.simibubi.create.foundation.metadoc.Select; import com.simibubi.create.foundation.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; @@ -29,25 +29,44 @@ import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.MutableBoundingBox; -import net.minecraft.util.math.Vec3i; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; -public abstract class WorldSectionElement extends AnimatedSceneElement implements Predicate { +public class WorldSectionElement extends AnimatedSceneElement { public static final Compartment> DOC_WORLD_SECTION = new Compartment<>(); List renderedTileEntities; + Select section; + boolean redraw; + + public WorldSectionElement(Select section) { + this.section = section; + } + + public void queueRedraw(MetaDocWorld world) { + redraw = true; + } + + public void tick() { + if (renderedTileEntities == null) + return; + renderedTileEntities.forEach(te -> { + if (te instanceof ITickableTileEntity) + ((ITickableTileEntity) te).tick(); + }); + } @Override public void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { int light = -1; if (fade != 1) light = (int) (MathHelper.lerp(fade, 5, 14)); + if (redraw) + renderedTileEntities = null; world.pushFakeLight(light); renderTileEntities(world, ms, buffer); @@ -56,40 +75,7 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement if (buffer instanceof IRenderTypeBuffer.Impl) ((IRenderTypeBuffer.Impl) buffer).draw(); renderStructure(world, ms, buffer, fade); - } - - @Override - public abstract int hashCode(); - - public abstract Stream all(); - - public static class Cuboid extends WorldSectionElement { - - MutableBoundingBox bb; - Vec3i origin; - Vec3i size; - - public Cuboid(BlockPos origin, Vec3i size) { - bb = new MutableBoundingBox(origin, origin.add(size)); - this.origin = origin; - this.size = size; - } - - @Override - public boolean test(BlockPos t) { - return bb.isVecInside(t); - } - - @Override - public Stream all() { - return BlockPos.func_229383_a_(bb); - } - - @Override - public int hashCode() { - return origin.hashCode() ^ size.hashCode(); - } - + redraw = false; } protected void renderStructure(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float fade) { @@ -101,17 +87,14 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement for (int i = 0; i < blockLayers.size(); i++) { RenderType layer = blockLayers.get(i); Pair key = Pair.of(code, i); + if (redraw) + bufferCache.invalidate(DOC_WORLD_SECTION, key); SuperByteBuffer contraptionBuffer = bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, layer)); if (contraptionBuffer.isEmpty()) continue; - int light = 0xF000F0; - if (fade != 1) { - light = (int) (0xF * fade); - light = light << 4 | light << 20; - } - + int light = lightCoordsFromFade(fade); contraptionBuffer.light(light) .renderInto(ms, buffer.getBuffer(layer)); } @@ -120,10 +103,12 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement private void renderTileEntities(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { if (renderedTileEntities == null) { renderedTileEntities = new ArrayList<>(); - all().map(world::getTileEntity) + section.all() + .map(world::getTileEntity) .filter(Objects::nonNull) .forEach(renderedTileEntities::add); - } + } else + renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer); } @@ -137,22 +122,23 @@ public abstract class WorldSectionElement extends AnimatedSceneElement implement Random random = new Random(); BufferBuilder builder = new BufferBuilder(DefaultVertexFormats.BLOCK.getIntegerSize()); builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); - world.setMask(this); + world.setMask(this.section); - all().forEach(pos -> { - BlockState state = world.getBlockState(pos); - if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) - return; - if (!RenderTypeLookup.canRenderInLayer(state, layer)) - return; + section.all() + .forEach(pos -> { + BlockState state = world.getBlockState(pos); + if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) + return; + if (!RenderTypeLookup.canRenderInLayer(state, layer)) + return; - IBakedModel originalModel = dispatcher.getModelForState(state); - ms.push(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.renderModel(world, originalModel, state, pos, ms, builder, true, random, 42, - OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); - ms.pop(); - }); + IBakedModel originalModel = dispatcher.getModelForState(state); + ms.push(); + ms.translate(pos.getX(), pos.getY(), pos.getZ()); + blockRenderer.renderModel(world, originalModel, state, pos, ms, builder, true, random, 42, + OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + ms.pop(); + }); world.clearMask(); builder.finishDrawing(); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java new file mode 100644 index 000000000..b279103a5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.elements.ParrotElement; + +import net.minecraft.util.Direction; + +public class CreateParrotInstruction extends FadeIntoSceneInstruction { + + public CreateParrotInstruction(int fadeInTicks, Direction fadeInFrom, ParrotElement element) { + super(fadeInTicks, fadeInFrom, element); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java index ba07163c1..b1116ff0c 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java @@ -1,37 +1,13 @@ package com.simibubi.create.foundation.metadoc.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.WorldSectionElement; +import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; import net.minecraft.util.Direction; -import net.minecraft.util.math.Vec3d; -public class DisplayWorldSectionInstruction extends TickingInstruction { - - private Direction fadeInFrom; - private WorldSectionElement element; +public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction { public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, WorldSectionElement element) { - super(false, fadeInTicks); - this.fadeInFrom = fadeInFrom; - this.element = element; - } - - @Override - protected void firstTick(MetaDocScene scene) { - super.firstTick(scene); - scene.addElement(element); - element.setFade(0); - element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); - } - - @Override - public void tick(MetaDocScene scene) { - super.tick(scene); - float fade = (remainingTicks / (float) totalTicks); - element.setFade(1 - fade * fade); - if (remainingTicks == 0) - element.setFade(1); + super(fadeInTicks, fadeInFrom, element); } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java new file mode 100644 index 000000000..d37ab5296 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java @@ -0,0 +1,37 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.elements.AnimatedSceneElement; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; + +public class FadeIntoSceneInstruction extends TickingInstruction { + + private Direction fadeInFrom; + private T element; + + public FadeIntoSceneInstruction(int fadeInTicks, Direction fadeInFrom, T element) { + super(false, fadeInTicks); + this.fadeInFrom = fadeInFrom; + this.element = element; + } + + @Override + protected void firstTick(MetaDocScene scene) { + super.firstTick(scene); + scene.addElement(element); + element.setFade(0); + element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); + } + + @Override + public void tick(MetaDocScene scene) { + super.tick(scene); + float fade = (remainingTicks / (float) totalTicks); + element.setFade(1 - fade * fade); + if (remainingTicks == 0) + element.setFade(1); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java index 678f83772..ce2941c0d 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java @@ -1,7 +1,8 @@ package com.simibubi.create.foundation.metadoc.instructions; -import com.simibubi.create.foundation.metadoc.AnimatedSceneElement; import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.elements.AnimatedOverlayElement; +import com.simibubi.create.foundation.metadoc.elements.AnimatedSceneElement; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; @@ -25,6 +26,9 @@ public class HideAllInstruction extends TickingInstruction { animatedSceneElement.setFade(1); animatedSceneElement .setFadeVec(fadeOutTo == null ? null : new Vec3d(fadeOutTo.getDirectionVec()).scale(.5f)); + } else if (element instanceof AnimatedOverlayElement) { + AnimatedOverlayElement animatedSceneElement = (AnimatedOverlayElement) element; + animatedSceneElement.setFade(1); } else element.setVisible(false); }); @@ -34,15 +38,18 @@ public class HideAllInstruction extends TickingInstruction { public void tick(MetaDocScene scene) { super.tick(scene); float fade = (remainingTicks / (float) totalTicks); - scene.getElements() - .forEach(element -> { - if (!(element instanceof AnimatedSceneElement)) - return; - AnimatedSceneElement animatedSceneElement = (AnimatedSceneElement) element; - animatedSceneElement.setFade(fade * fade); - if (remainingTicks == 0) - animatedSceneElement.setFade(0); - }); + + scene.forEach(AnimatedSceneElement.class, ase -> { + ase.setFade(fade * fade); + if (remainingTicks == 0) + ase.setFade(0); + }); + + scene.forEach(AnimatedOverlayElement.class, aoe -> { + aoe.setFade(fade * fade); + if (remainingTicks == 0) + aoe.setFade(0); + }); } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java new file mode 100644 index 000000000..7812fff46 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java @@ -0,0 +1,40 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.MetaDocWorld; +import com.simibubi.create.foundation.metadoc.Select; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; + +public class ReplaceBlocksInstruction extends WorldModifyInstruction { + + private BlockState stateToUse; + private boolean replaceAir; + + public ReplaceBlocksInstruction(Select selection, BlockState stateToUse, boolean replaceAir) { + super(selection); + this.stateToUse = stateToUse; + this.replaceAir = replaceAir; + } + + @Override + protected void runModification(Select selection, MetaDocScene scene) { + MetaDocWorld world = scene.getWorld(); + selection.all() + .forEach(pos -> { + if (!world.getBounds() + .isVecInside(pos)) + return; + if (!replaceAir && world.getBlockState(pos) == Blocks.AIR.getDefaultState()) + return; + world.setBlockState(pos, stateToUse); + }); + } + + @Override + protected boolean needsRedraw() { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java new file mode 100644 index 000000000..57075f101 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java @@ -0,0 +1,34 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocInstruction; +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneTransform; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; + +public class RotateSceneInstruction extends MetaDocInstruction { + + private float xRot; + private float yRot; + private boolean relative; + + public RotateSceneInstruction(float xRot, float yRot, boolean relative) { + this.xRot = xRot; + this.yRot = yRot; + this.relative = relative; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(MetaDocScene scene) { + SceneTransform transform = scene.getTransform(); + float targetX = relative ? transform.xRotation.getChaseTarget() + xRot : xRot; + float targetY = relative ? transform.yRotation.getChaseTarget() + yRot : yRot; + transform.xRotation.chase(targetX, .1f, Chaser.EXP); + transform.yRotation.chase(targetY, .1f, Chaser.EXP); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java index dbfa9c776..1824e7187 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java @@ -2,16 +2,14 @@ package com.simibubi.create.foundation.metadoc.instructions; import com.simibubi.create.foundation.metadoc.MetaDocInstruction; import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.WorldSectionElement; - -import net.minecraft.util.math.BlockPos; +import com.simibubi.create.foundation.metadoc.Select; public class ShowCompleteSchematicInstruction extends MetaDocInstruction { @Override public void tick(MetaDocScene scene) { - scene.addElement(new WorldSectionElement.Cuboid(BlockPos.ZERO, scene.getBounds() - .getLength())); + scene.addElement(Select.everything(scene) + .asElement()); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java new file mode 100644 index 000000000..f1d232d29 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java @@ -0,0 +1,52 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.elements.TextWindowElement; + +import net.minecraft.util.math.Vec3d; + +public class TextWindowInstruction extends TickingInstruction { + + private TextWindowElement element; + private int fadeTime; + + public TextWindowInstruction(Supplier text, int fadeTime, int duration, Vec3d position) { + super(false, duration + 2 * fadeTime); + this.fadeTime = fadeTime; + element = new TextWindowElement(text).moveTo(position); + } + + @Override + protected void firstTick(MetaDocScene scene) { + super.firstTick(scene); + scene.addElement(element); + element.setVisible(true); + element.setFade(0); + } + + @Override + public void tick(MetaDocScene scene) { + super.tick(scene); + int elapsed = totalTicks - remainingTicks; + + if (elapsed < fadeTime) { + float fade = (elapsed / (float) fadeTime); + element.setFade(fade * fade); + + } else if (remainingTicks < fadeTime) { + float fade = (remainingTicks / (float) fadeTime); + element.setFade(fade * fade); + + } else + element.setFade(1); + + if (remainingTicks == 0) { + element.setFade(0); + element.setFade(0); + element.setVisible(false); + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java new file mode 100644 index 000000000..070af58b6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java @@ -0,0 +1,50 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import java.util.function.UnaryOperator; + +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.MetaDocWorld; +import com.simibubi.create.foundation.metadoc.Select; +import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; + +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityDataInstruction extends WorldModifyInstruction { + + private boolean redraw; + private UnaryOperator data; + private Class type; + + public TileEntityDataInstruction(Select selection, Class type, + UnaryOperator data, boolean redraw) { + super(selection); + this.type = type; + this.data = data; + this.redraw = redraw; + } + + @Override + protected void runModification(Select selection, MetaDocScene scene) { + MetaDocWorld world = scene.getWorld(); + selection.all() + .forEach(pos -> { + if (!world.getBounds() + .isVecInside(pos)) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (!type.isInstance(tileEntity)) + return; + CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); + tileEntity.read(apply); + if (tileEntity instanceof SyncedTileEntity) + ((SyncedTileEntity) tileEntity).readClientUpdate(apply); + }); + } + + @Override + protected boolean needsRedraw() { + return redraw; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java new file mode 100644 index 000000000..0fc337b00 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java @@ -0,0 +1,32 @@ +package com.simibubi.create.foundation.metadoc.instructions; + +import com.simibubi.create.foundation.metadoc.MetaDocInstruction; +import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.metadoc.Select; +import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; + +public abstract class WorldModifyInstruction extends MetaDocInstruction { + + private Select selection; + + public WorldModifyInstruction(Select selection) { + this.selection = selection; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(MetaDocScene scene) { + runModification(selection, scene); + if (needsRedraw()) + scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); + } + + protected abstract void runModification(Select selection, MetaDocScene scene); + + protected abstract boolean needsRedraw(); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java deleted file mode 100644 index b5bcdad87..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/stories/CogwheelStory.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.simibubi.create.foundation.metadoc.stories; - -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; -import com.simibubi.create.foundation.metadoc.MetaDocStoryBoard; - -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3i; - -public class CogwheelStory extends MetaDocStoryBoard { - - private int index; - - public CogwheelStory(int index) { - this.index = index; - } - - @Override - public String getSchematicName() { - return "cogwheel/s" + index; - } - - @Override - public void program(SceneBuilder scene, Vec3i worldSize) { - scene.showBasePlate() - .idle(10) - .showSection(BlockPos.ZERO.up(), worldSize, Direction.DOWN); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java index 7dfc7e24a..dbe8ffca1 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java @@ -4,6 +4,7 @@ import java.util.UUID; import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; public class ColorHelper { @@ -29,6 +30,11 @@ public class ColorHelper { else return 255 - progress; } + + public static int applyAlpha(int color, float alpha) { + int alphaChannel = (int) (0xFF * MathHelper.clamp(alpha, 0, 1)); + return (color & 0xFFFFFF) | alphaChannel << 24; + } public static int mixColors(int color1, int color2, float w) { int r1 = (color1 >> 16); diff --git a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java index f37b65912..d85e749fb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java +++ b/src/main/java/com/simibubi/create/foundation/utility/SuperByteBufferCache.java @@ -85,6 +85,11 @@ public class SuperByteBufferCache { return null; } } + + public void invalidate(Compartment compartment, T key) { + Cache compartmentCache = this.cache.get(compartment); + compartmentCache.invalidate(key); + } public void registerCompartment(Compartment instance) { cache.put(instance, CacheBuilder.newBuilder() From 18067e8d5ce8d4b2f01034c0fbd95e6eb56b66e0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Feb 2021 19:35:26 +0100 Subject: [PATCH 06/23] Ponder - rebrand - support for particles - support for fluids - support for outliner - coloured text labels - debug scenes - proper UI stuff - proper layered rendering --- src/generated/resources/.cache/cache | 26 +- .../create/blockstates/radial_chassis.json | 72 +-- .../resources/assets/create/lang/en_us.json | 36 +- .../assets/create/lang/unfinished/de_de.json | 38 +- .../assets/create/lang/unfinished/es_mx.json | 38 +- .../assets/create/lang/unfinished/fr_fr.json | 38 +- .../assets/create/lang/unfinished/it_it.json | 38 +- .../assets/create/lang/unfinished/ja_jp.json | 38 +- .../assets/create/lang/unfinished/ko_kr.json | 38 +- .../assets/create/lang/unfinished/nl_nl.json | 38 +- .../assets/create/lang/unfinished/pt_br.json | 38 +- .../assets/create/lang/unfinished/ru_ru.json | 38 +- .../assets/create/lang/unfinished/zh_cn.json | 38 +- .../assets/create/lang/unfinished/zh_tw.json | 38 +- .../com/simibubi/create/CreateClient.java | 6 +- .../particle/RotationIndicatorParticle.java | 5 +- .../content/schematics/SchematicWorld.java | 5 + .../simibubi/create/events/ClientEvents.java | 8 +- .../foundation/data/AllLangPartials.java | 4 +- .../create/foundation/gui/AllIcons.java | 6 +- .../metadoc/MetaDocInstruction.java | 15 - .../foundation/metadoc/MetaDocScene.java | 330 ------------- .../foundation/metadoc/MetaDocStoryBoard.java | 15 - .../foundation/metadoc/MetaDocWorld.java | 78 --- .../create/foundation/metadoc/Select.java | 69 --- .../metadoc/content/CogwheelStory.java | 51 -- .../metadoc/content/MetaDocIndex.java | 22 - .../metadoc/content/SharedText.java | 23 - .../elements/AnimatedOverlayElement.java | 29 -- .../elements/AnimatedSceneElement.java | 53 -- .../elements/MetaDocOverlayElement.java | 14 - .../metadoc/elements/MetaDocSceneElement.java | 13 - .../metadoc/elements/ParrotElement.java | 72 --- .../metadoc/elements/TextWindowElement.java | 69 --- .../ShowCompleteSchematicInstruction.java | 20 - .../instructions/TextWindowInstruction.java | 52 -- .../instructions/WorldModifyInstruction.java | 32 -- .../PonderElement.java} | 6 +- .../foundation/ponder/PonderInstruction.java | 15 + .../PonderLocalization.java} | 20 +- .../PonderRegistry.java} | 56 ++- .../create/foundation/ponder/PonderScene.java | 462 ++++++++++++++++++ .../foundation/ponder/PonderStoryBoard.java | 14 + .../PonderTooltipHandler.java} | 57 ++- .../PonderUI.java} | 207 ++++++-- .../create/foundation/ponder/PonderWorld.java | 158 ++++++ .../ponder/PonderWorldParticles.java | 109 +++++ .../create/foundation/ponder/Select.java | 167 +++++++ .../ponder/content/CogwheelStory.java | 42 ++ .../ponder/content/DebugScenes.java | 198 ++++++++ .../ponder/content/PonderIndex.java | 27 + .../ponder/content/PonderPalette.java | 27 + .../ponder/content/ShaftAsRelay.java | 54 ++ .../ponder/content/ShaftsCanBeEncased.java | 55 +++ .../foundation/ponder/content/SharedText.java | 23 + .../elements/AnimatedOverlayElement.java | 29 ++ .../ponder/elements/AnimatedSceneElement.java | 80 +++ .../ponder/elements/OutlinerElement.java | 26 + .../ponder/elements/ParrotElement.java | 119 +++++ .../ponder/elements/PonderOverlayElement.java | 14 + .../ponder/elements/PonderSceneElement.java | 18 + .../ponder/elements/TextWindowElement.java | 89 ++++ .../elements/WorldSectionElement.java | 90 ++-- .../instructions/CreateParrotInstruction.java | 4 +- .../instructions/DelayInstruction.java | 2 +- .../DisplayWorldSectionInstruction.java | 4 +- .../EmitParticlesInstruction.java | 50 ++ .../FadeIntoSceneInstruction.java | 10 +- .../instructions/HideAllInstruction.java | 12 +- .../MarkAsFinishedInstruction.java | 18 + .../instructions/MovePoiInstruction.java | 26 + .../ReplaceBlocksInstruction.java | 16 +- .../instructions/RotateSceneInstruction.java | 12 +- .../ShowCompleteSchematicInstruction.java | 20 + .../ponder/instructions/TextInstruction.java | 84 ++++ .../instructions/TickingInstruction.java | 14 +- .../TileEntityDataInstruction.java | 12 +- .../instructions/WorldModifyInstruction.java | 32 ++ .../foundation/ponder/ui/PonderButton.java | 136 ++++++ .../foundation/utility/ColorHelper.java | 25 +- .../create/foundation/utility/VecHelper.java | 7 +- .../resources/META-INF/accesstransformer.cfg | 5 +- .../assets/create/textures/gui/icons.png | Bin 4765 -> 2598 bytes src/main/resources/doc/cogwheel/s1.nbt | Bin 540 -> 0 bytes src/main/resources/doc/cogwheel/s2.nbt | Bin 420 -> 0 bytes src/main/resources/doc/cogwheel/s3.nbt | Bin 854 -> 0 bytes src/main/resources/doc/cogwheel/s4.nbt | Bin 845 -> 0 bytes src/main/resources/doc/cogwheel/s5.nbt | Bin 290 -> 0 bytes src/main/resources/ponder/cogwheel/first.nbt | Bin 0 -> 679 bytes src/main/resources/ponder/debug/scene_1.nbt | Bin 0 -> 341 bytes src/main/resources/ponder/debug/scene_2.nbt | Bin 0 -> 344 bytes src/main/resources/ponder/debug/scene_3.nbt | Bin 0 -> 845 bytes src/main/resources/ponder/debug/scene_4.nbt | Bin 0 -> 608 bytes src/main/resources/ponder/debug/scene_5.nbt | Bin 0 -> 333 bytes .../ponder/shaft/encasing_shafts.nbt | Bin 0 -> 497 bytes src/main/resources/ponder/shaft/shaft.nbt | Bin 0 -> 541 bytes 96 files changed, 2829 insertions(+), 1365 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/Select.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java delete mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocElement.java => ponder/PonderElement.java} (57%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocLocalization.java => ponder/PonderLocalization.java} (77%) rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocs.java => ponder/PonderRegistry.java} (56%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocTooltipHandler.java => ponder/PonderTooltipHandler.java} (66%) rename src/main/java/com/simibubi/create/foundation/{metadoc/MetaDocScreen.java => ponder/PonderUI.java} (50%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Select.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/elements/WorldSectionElement.java (61%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/CreateParrotInstruction.java (67%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/DelayInstruction.java (67%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/DisplayWorldSectionInstruction.java (68%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/FadeIntoSceneInstruction.java (72%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/HideAllInstruction.java (77%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/ReplaceBlocksInstruction.java (55%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/RotateSceneInstruction.java (65%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/TickingInstruction.java (58%) rename src/main/java/com/simibubi/create/foundation/{metadoc => ponder}/instructions/TileEntityDataInstruction.java (76%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java delete mode 100644 src/main/resources/doc/cogwheel/s1.nbt delete mode 100644 src/main/resources/doc/cogwheel/s2.nbt delete mode 100644 src/main/resources/doc/cogwheel/s3.nbt delete mode 100644 src/main/resources/doc/cogwheel/s4.nbt delete mode 100644 src/main/resources/doc/cogwheel/s5.nbt create mode 100644 src/main/resources/ponder/cogwheel/first.nbt create mode 100644 src/main/resources/ponder/debug/scene_1.nbt create mode 100644 src/main/resources/ponder/debug/scene_2.nbt create mode 100644 src/main/resources/ponder/debug/scene_3.nbt create mode 100644 src/main/resources/ponder/debug/scene_4.nbt create mode 100644 src/main/resources/ponder/debug/scene_5.nbt create mode 100644 src/main/resources/ponder/shaft/encasing_shafts.nbt create mode 100644 src/main/resources/ponder/shaft/shaft.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 91688b763..588bd62e9 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json +4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,18 +401,18 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -a3e1a1b7946534a5db2482cc6d43aadbdaf0938f assets/create/lang/en_us.json -56c92fc5d2526d6ab9086d2edb03956234cad255 assets/create/lang/unfinished/de_de.json -4cab4140761c85fe6f2cb0a636ade5d63be422c4 assets/create/lang/unfinished/es_mx.json -c1436ba5bd506cd531586a1ca87f7bcc1091a2d6 assets/create/lang/unfinished/fr_fr.json -4747471601a24efbc6cb01b339bafb984b6903c6 assets/create/lang/unfinished/it_it.json -5b87db032d1726cc10a225bf0c4740f50169517f assets/create/lang/unfinished/ja_jp.json -acc6638d1ae47eab3c33431e3b794d85bf158f8f assets/create/lang/unfinished/ko_kr.json -88a425173c828ce221435dfd9a29316cfe05204b assets/create/lang/unfinished/nl_nl.json -4672e12982db0283e4826904c2538a5465c5c1e6 assets/create/lang/unfinished/pt_br.json -85d5f3d8fd543c5f8d2d50e689b5ad25765c7cc2 assets/create/lang/unfinished/ru_ru.json -ad1f7b8a42bc74dd416380faf2b66f2ca1302ec0 assets/create/lang/unfinished/zh_cn.json -c561cc74bcfc00b664ec299fb8d6f9ee2c236d24 assets/create/lang/unfinished/zh_tw.json +694cfe3d8fe9793b7ac0fbc7bbd3cf6bf455bf92 assets/create/lang/en_us.json +499d461cf16f5a94049fbbe9eb758e0eaa19fa83 assets/create/lang/unfinished/de_de.json +8e486714ce38b6702fc614f4ba7cd34e003800aa assets/create/lang/unfinished/es_mx.json +53f2918966bd9c045314a02ff0f5439720969087 assets/create/lang/unfinished/fr_fr.json +073ead0ceacdcf666fece6a78071a36fa9c3d356 assets/create/lang/unfinished/it_it.json +0967bfc8888598329563ff6ee419038aef03df0a assets/create/lang/unfinished/ja_jp.json +50e210e32d4a55561ffed5a62ac10802107b719e assets/create/lang/unfinished/ko_kr.json +40784b923f0defdecbd35f73c7d7ead9c3fe9d8a assets/create/lang/unfinished/nl_nl.json +ad719b1559c58c9e7c1b22023c5e686d4fa1ca19 assets/create/lang/unfinished/pt_br.json +1190f9152de89c7e0b7561c3cdddae6fe2f1aa19 assets/create/lang/unfinished/ru_ru.json +bbcd8d37a18c779dfcca9aeaeb2b2d101a4b4fe2 assets/create/lang/unfinished/zh_cn.json +be270f1d2bc61ebd4a9f1be5b00daa56947de2d7 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/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index f97d8c8bc..8bd829ffc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "x" + "axis": "x", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "y" + "axis": "y", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "sticky_west": "true", - "axis": "z" + "axis": "z", + "sticky_west": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "x" + "axis": "x", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "y" + "axis": "y", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "sticky_west": "false", - "axis": "z" + "axis": "z", + "sticky_west": "false" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "x" + "axis": "x", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "y" + "axis": "y", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "sticky_east": "true", - "axis": "z" + "axis": "z", + "sticky_east": "true" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "x" + "axis": "x", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "y" + "axis": "y", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "sticky_east": "false", - "axis": "z" + "axis": "z", + "sticky_east": "false" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 69da8b46a..42a9f52d3 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1789,18 +1789,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "This is Shared stuff", - "create.metadoc.shared.when_wrenched": "When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", + "create.ponder.pondering": "Pondering about...", + "create.ponder.shared.more_shared": "This is Shared stuff", + "create.ponder.shared.when_wrenched": "When Wrenched", + "create.ponder.cogwheel.scene_0.title": "My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "Das X axis", + "create.ponder.brass_hand.scene_0.y": "Das Y axis", + "create.ponder.brass_hand.scene_0.z": "Das Z axis", + "create.ponder.brass_hand.scene_0.title": "Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "Incoming...", + "create.ponder.brass_hand.scene_4.title": "Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 7ffbf545b..799d157eb 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: 1107", + "_": "Missing Localizations: 1119", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 1e175818f..440b56c5b 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: 898", + "_": "Missing Localizations: 910", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 0c4230e07..9afcc1138 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: 678", + "_": "Missing Localizations: 690", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 50077225a..3d2f316b5 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: 15", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 33203a9f6..004d882f2 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: 24", + "_": "Missing Localizations: 36", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 baf40797c..51612fa21 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: 67", + "_": "Missing Localizations: 79", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 7b9c03a39..2fb0077c9 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: 1167", + "_": "Missing Localizations: 1179", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 071a3425e..be5288f9b 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: 1233", + "_": "Missing Localizations: 1245", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 102977f20..261a60115 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: 17", + "_": "Missing Localizations: 29", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 56c4a2cbe..135caaf45 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: 15", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" 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 f3a73370e..c300d3e80 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: 20", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -1790,18 +1790,30 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", - "create.metadoc.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.metadoc.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.metadoc.cogwheel.scene_0.test_text": "UNLOCALIZED: Test text for scene 1", - "create.metadoc.cogwheel.scene_0.title": "UNLOCALIZED: My First Metadoc Story, Part 1", - "create.metadoc.cogwheel.scene_1.test_text": "UNLOCALIZED: Test text for scene 2", - "create.metadoc.cogwheel.scene_1.title": "UNLOCALIZED: My First Metadoc Story, Part 2", - "create.metadoc.cogwheel.scene_2.test_text": "UNLOCALIZED: Test text for scene 3", - "create.metadoc.cogwheel.scene_2.title": "UNLOCALIZED: My First Metadoc Story, Part 3", - "create.metadoc.cogwheel.scene_3.test_text": "UNLOCALIZED: Test text for scene 4", - "create.metadoc.cogwheel.scene_3.title": "UNLOCALIZED: My First Metadoc Story, Part 4", - "create.metadoc.cogwheel.scene_4.test_text": "UNLOCALIZED: Test text for scene 5", - "create.metadoc.cogwheel.scene_4.title": "UNLOCALIZED: My First Metadoc Story, Part 5", + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", + "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", + "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 861006a1d..4ff75d77b 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -16,8 +16,8 @@ import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.outliner.Outliner; @@ -76,7 +76,7 @@ public class CreateClient { AllEntityTypes.registerRenderers(); getColorHandler().init(); AllFluids.assignRenderLayers(); - MetaDocIndex.register(); + PonderIndex.register(); IResourceManager resourceManager = Minecraft.getInstance() .getResourceManager(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index 5ca7b26e6..a54ab7a67 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -84,8 +84,9 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { public Particle makeParticle(RotationIndicatorParticleData data, World worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { - ClientPlayerEntity player = Minecraft.getInstance().player; - boolean visible = player != null && GogglesItem.canSeeParticles(player); + Minecraft mc = Minecraft.getInstance(); + ClientPlayerEntity player = mc.player; + boolean visible = worldIn != mc.world || player != null && GogglesItem.canSeeParticles(player); return new RotationIndicatorParticle(worldIn, x, y, z, data.color, data.radius1, data.radius2, data.speed, data.getAxis(), data.lifeSpan, visible, this.spriteSet); } diff --git a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java index 7fabee37f..06abab70c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java @@ -187,6 +187,11 @@ public class SchematicWorld extends WrappedWorld { renderedTileEntities.remove(tileEntity); } } + + TileEntity tileEntity = getTileEntity(pos); + if (tileEntity != null) + tileEntities.put(pos, tileEntity); + return true; } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index a434233c7..957bde4ad 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -26,9 +26,9 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; -import com.simibubi.create.foundation.metadoc.MetaDocTooltipHandler; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; +import com.simibubi.create.foundation.ponder.PonderTooltipHandler; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.edgeInteraction.EdgeInteractionRenderer; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringRenderer; @@ -88,7 +88,7 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); - MetaDocTooltipHandler.tick(); + PonderTooltipHandler.tick(); ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); @@ -150,7 +150,7 @@ public class ClientEvents { @SubscribeEvent public static void getItemTooltipColor(RenderTooltipEvent.Color event) { - MetaDocTooltipHandler.handleTooltipColor(event); + PonderTooltipHandler.handleTooltipColor(event); } @SubscribeEvent @@ -175,7 +175,7 @@ public class ClientEvents { itemTooltip.addAll(0, toolTip); } - MetaDocTooltipHandler.addToTooltip(event.getToolTip(), stack); + PonderTooltipHandler.addToTooltip(event.getToolTip(), stack); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index 8a4aaef81..eddac4b90 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.data; import com.google.common.base.Supplier; import com.google.gson.JsonElement; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.MetaDocs; +import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.utility.FilesHelper; import com.simibubi.create.foundation.utility.Lang; @@ -12,7 +12,7 @@ public enum AllLangPartials { ADVANCEMENTS("Advancements"), MESSAGES("UI & Messages"), TOOLTIPS("Item Descriptions"), - METADOC("MetaDoc Text", MetaDocs::provideLangEntries), + METADOC("MetaDoc Text", PonderRegistry::provideLangEntries), ; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index c1279fce0..51e0c0764 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -115,7 +115,11 @@ public class AllIcons { I_FOLLOW_DIAGONAL = next(), I_FOLLOW_MATERIAL = next(), - I_SCHEMATIC = newRow(); + I_SCHEMATIC = newRow(), + + I_MTD_LEFT = newRow(), + I_MTD_CLOSE = next(), + I_MTD_RIGHT = next(); public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java deleted file mode 100644 index 13bdda9e9..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocInstruction.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -public abstract class MetaDocInstruction { - - public boolean isBlocking() { - return false; - } - - public void reset(MetaDocScene scene) {} - - public abstract boolean isComplete(); - - public abstract void tick(MetaDocScene scene); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java deleted file mode 100644 index eb92fb29d..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScene.java +++ /dev/null @@ -1,330 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.function.Consumer; -import java.util.function.Supplier; -import java.util.function.UnaryOperator; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; -import com.simibubi.create.foundation.metadoc.elements.MetaDocOverlayElement; -import com.simibubi.create.foundation.metadoc.elements.MetaDocSceneElement; -import com.simibubi.create.foundation.metadoc.elements.ParrotElement; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; -import com.simibubi.create.foundation.metadoc.instructions.CreateParrotInstruction; -import com.simibubi.create.foundation.metadoc.instructions.DelayInstruction; -import com.simibubi.create.foundation.metadoc.instructions.DisplayWorldSectionInstruction; -import com.simibubi.create.foundation.metadoc.instructions.HideAllInstruction; -import com.simibubi.create.foundation.metadoc.instructions.ReplaceBlocksInstruction; -import com.simibubi.create.foundation.metadoc.instructions.RotateSceneInstruction; -import com.simibubi.create.foundation.metadoc.instructions.ShowCompleteSchematicInstruction; -import com.simibubi.create.foundation.metadoc.instructions.TextWindowInstruction; -import com.simibubi.create.foundation.metadoc.instructions.TileEntityDataInstruction; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.block.BlockState; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.Vector4f; -import net.minecraft.util.Direction; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MutableBoundingBox; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; - -public class MetaDocScene { - - List schedule, activeSchedule; - Set elements; - MetaDocWorld world; - ResourceLocation component; - int sceneIndex; - SceneTransform transform; - - public MetaDocScene(MetaDocWorld world, ResourceLocation component, int sceneIndex) { - this.world = world; - this.component = component; - this.sceneIndex = sceneIndex; - elements = new HashSet<>(); - schedule = new ArrayList<>(); - activeSchedule = new ArrayList<>(); - transform = new SceneTransform(); - } - - public String getTitle() { - return getString("title"); - } - - public String getString(String key) { - return MetaDocLocalization.getSpecific(component, sceneIndex, key); - } - - public void reset() { - activeSchedule.clear(); - schedule.forEach(mdi -> mdi.reset(this)); - } - - public void begin() { - reset(); - world.restore(); - transform = new SceneTransform(); - forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); - elements.clear(); - activeSchedule.addAll(schedule); - } - - public void fadeOut() { - reset(); - activeSchedule.add(new HideAllInstruction(10, null)); - } - - public void renderScene(IRenderTypeBuffer buffer, MatrixStack ms) { - ms.push(); - forEach(MetaDocSceneElement.class, e -> { - if (e.isVisible()) - e.render(world, buffer, ms); - }); - ms.pop(); - } - - public void renderOverlay(MetaDocScreen screen, MatrixStack ms, float partialTicks) { - ms.push(); - forEach(MetaDocOverlayElement.class, e -> { - if (e.isVisible()) - e.render(this, screen, ms, partialTicks); - }); - ms.pop(); - } - - public void tick() { - transform.tick(); - forEach(MetaDocElement::tick); - for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { - MetaDocInstruction metaDocInstruction = iterator.next(); - metaDocInstruction.tick(this); - if (metaDocInstruction.isComplete()) { - iterator.remove(); - continue; - } - if (metaDocInstruction.isBlocking()) - break; - } - } - - public void addElement(MetaDocElement e) { - elements.add(e); - } - - public MetaDocWorld getWorld() { - return world; - } - - public Set getElements() { - return elements; - } - - public void forEach(Consumer function) { - for (MetaDocElement metaDocElement : elements) - function.accept(metaDocElement); - } - - public void forEach(Class type, Consumer function) { - for (MetaDocElement metaDocElement : elements) - if (type.isInstance(metaDocElement)) - function.accept(type.cast(metaDocElement)); - } - - public MutableBoundingBox getBounds() { - return world == null ? new MutableBoundingBox() : world.getBounds(); - } - - public SceneBuilder builder() { - return new SceneBuilder(); - } - - private Supplier textGetter(String key) { - return () -> MetaDocLocalization.getSpecific(component, sceneIndex, key); - } - - public SceneTransform getTransform() { - return transform; - } - - public class SceneTransform { - - public LerpedFloat xRotation, yRotation; - - // Screen params - int width, height; - double offset; - Matrix4f cachedMat; - - public SceneTransform() { - xRotation = LerpedFloat.angular() - .startWithValue(-35); - yRotation = LerpedFloat.angular() - .startWithValue(55); - } - - public void tick() { - xRotation.tickChaser(); - yRotation.tickChaser(); - } - - public void updateScreenParams(int width, int height, double offset) { - this.width = width; - this.height = height; - this.offset = offset; - cachedMat = null; - } - - public MatrixStack apply(MatrixStack ms) { - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); - ms.translate(width / 2, height / 2, 200); - - MatrixStacker.of(ms) - .rotateX(-35) - .rotateY(55); - ms.translate(offset, 0, 0); - MatrixStacker.of(ms) - .rotateY(-55) - .rotateX(35); - - MatrixStacker.of(ms) - .rotateX(xRotation.getValue(pt)) - .rotateY(yRotation.getValue(pt)); - ms.scale(30, -30, 30); - - MutableBoundingBox bounds = getBounds(); - ms.translate(bounds.getXSize() / -2f, -.5f, bounds.getZSize() / -2f); - - return ms; - } - - public Vec3d screenToScene(float x, float y) { - refreshMatrix(); - Vector4f vec = new Vector4f(x, y, 0, 1); - cachedMat.invert(); - vec.transform(cachedMat); - cachedMat.invert(); - MutableBoundingBox bounds = getBounds(); - return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); - } - - public Vec2f sceneToScreen(Vec3d vec) { - refreshMatrix(); - Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); - vec4.transform(cachedMat); - return new Vec2f(vec4.getX(), vec4.getY()); - } - - protected void refreshMatrix() { - if (cachedMat != null) - return; - MatrixStack ms = apply(new MatrixStack()); -// MatrixStacker.of(ms) -// .rotateY(180); - cachedMat = ms.peek() - .getModel(); - } - - } - - public class SceneBuilder { - - public SceneBuilder showBasePlate() { - Vec3i length = getBounds().getLength(); - return showSection(Select.cuboid(BlockPos.ZERO, new Vec3i(length.getX(), 0, length.getZ())), Direction.UP); - } - - public SceneBuilder showText(Vec3d position, String key, String defaultText, int fadeTime, int duration) { - MetaDocLocalization.registerSpecific(component, sceneIndex, key, defaultText); - return addInstruction(new TextWindowInstruction(textGetter(key), fadeTime, duration, position)); - } - - public SceneBuilder showSection(Select selection, Direction fadeInDirection) { - return addInstruction( - new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement(selection))); - } - - public SceneBuilder debugSchematic() { - return addInstruction(new ShowCompleteSchematicInstruction()); - } - - public SceneBuilder idle(int ticks) { - return addInstruction(new DelayInstruction(ticks)); - } - - public SceneBuilder idleSeconds(int seconds) { - return idle(seconds * 20); - } - - public SceneBuilder rotateCameraY(float degrees) { - return addInstruction(new RotateSceneInstruction(0, degrees, true)); - } - - public SceneBuilder setBlocks(Select selection, BlockState state) { - return addInstruction(new ReplaceBlocksInstruction(selection, state, true)); - } - - public SceneBuilder replaceBlocks(Select selection, BlockState state) { - return addInstruction(new ReplaceBlocksInstruction(selection, state, false)); - } - - public SceneBuilder setKineticSpeed(Select selection, float speed) { - return modifyKineticSpeed(selection, f -> speed); - } - - public SceneBuilder multiplyKineticSpeed(Select selection, float modifier) { - return modifyKineticSpeed(selection, f -> f * modifier); - } - - public SceneBuilder modifyKineticSpeed(Select selection, UnaryOperator speedFunc) { - return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { - if (!nbt.contains("Speed")) - return nbt; - nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); - return nbt; - }, false)); - } - - public SceneBuilder flapFunnels(Select selection, boolean outward) { - return addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> { - nbt.putInt("Flap", outward ? -1 : 1); - return nbt; - }, false)); - } - - public SceneBuilder createParrotOn(BlockPos pos, Direction fadeInDirection) { - return addInstruction( - new CreateParrotInstruction(15, fadeInDirection, new ParrotElement(new Vec3d(pos).add(.5, 0, .5)))); - } - - public SceneBuilder createParrot(Vec3d location, Direction fadeInDirection) { - return addInstruction(new CreateParrotInstruction(15, fadeInDirection, new ParrotElement(location))); - } - - public SceneBuilder addInstruction(MetaDocInstruction instruction) { - schedule.add(instruction); - return this; - } - - // - - public Select everywhere() { - return Select.cuboid(BlockPos.ZERO, getBounds().getLength()); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java deleted file mode 100644 index 5199eec25..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocStoryBoard.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; - -import net.minecraft.util.math.Vec3i; - -public abstract class MetaDocStoryBoard { - - public abstract String getSchematicName(); - - public abstract String getStoryTitle(); - - public abstract void program(SceneBuilder scene, Vec3i worldSize); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java deleted file mode 100644 index 4673cee68..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocWorld.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import java.util.HashMap; -import java.util.Map; - -import com.simibubi.create.content.schematics.SchematicWorld; - -import net.minecraft.block.BlockState; -import net.minecraft.block.Blocks; -import net.minecraft.nbt.CompoundNBT; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.LightType; -import net.minecraft.world.World; - -public class MetaDocWorld extends SchematicWorld { - - protected Map originalBlocks; - protected Map originalTileEntities; - - int overrideLight; - Select mask; - - public MetaDocWorld(BlockPos anchor, World original) { - super(anchor, original); - originalBlocks = new HashMap<>(); - originalTileEntities = new HashMap<>(); - } - - public void createBackup() { - originalBlocks.clear(); - originalTileEntities.clear(); - blocks.forEach((k, v) -> originalBlocks.put(k, v)); - tileEntities.forEach((k, v) -> originalTileEntities.put(k, TileEntity.create(v.write(new CompoundNBT())))); - } - - public void restore() { - blocks.clear(); - tileEntities.clear(); - renderedTileEntities.clear(); - originalBlocks.forEach((k, v) -> blocks.put(k, v)); - originalTileEntities.forEach((k, v) -> { - TileEntity te = TileEntity.create(v.write(new CompoundNBT())); - te.setLocation(this, te.getPos()); - tileEntities.put(k, te); - renderedTileEntities.add(te); - }); - } - - public void pushFakeLight(int light) { - this.overrideLight = light; - } - - public void popLight() { - this.overrideLight = -1; - } - - @Override - public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { - return overrideLight == -1 ? 15 : overrideLight; - } - - public void setMask(Select mask) { - this.mask = mask; - } - - public void clearMask() { - this.mask = null; - } - - @Override - public BlockState getBlockState(BlockPos globalPos) { - if (mask != null && !mask.test(globalPos.subtract(anchor))) - return Blocks.AIR.getDefaultState(); - return super.getBlockState(globalPos); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/Select.java b/src/main/java/com/simibubi/create/foundation/metadoc/Select.java deleted file mode 100644 index 688b59ed3..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/Select.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.foundation.metadoc; - -import java.util.function.Predicate; -import java.util.stream.Stream; - -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MutableBoundingBox; -import net.minecraft.util.math.Vec3i; - -public abstract class Select implements Predicate { - - public static Select cuboid(BlockPos origin, Vec3i size) { - return new Cuboid(origin, size); - } - - public static Select pos(int x, int y, int z) { - return new Cuboid(new BlockPos(x, y, z), BlockPos.ZERO); - } - - public static Select everything(MetaDocScene scene) { - MutableBoundingBox bounds = scene.getBounds(); - return cuboid(BlockPos.ZERO, bounds.getLength()); - } - - // - - public WorldSectionElement asElement() { - return new WorldSectionElement(this); - } - - // - - @Override - public abstract int hashCode(); - - public abstract Stream all(); - - private static class Cuboid extends Select { - - MutableBoundingBox bb; - Vec3i origin; - Vec3i size; - - public Cuboid(BlockPos origin, Vec3i size) { - bb = new MutableBoundingBox(origin, origin.add(size)); - this.origin = origin; - this.size = size; - } - - @Override - public boolean test(BlockPos t) { - return bb.isVecInside(t); - } - - @Override - public Stream all() { - return BlockPos.func_229383_a_(bb); - } - - @Override - public int hashCode() { - return origin.hashCode() ^ size.hashCode(); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java deleted file mode 100644 index e332e4e15..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/content/CogwheelStory.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.simibubi.create.foundation.metadoc.content; - -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneBuilder; -import com.simibubi.create.foundation.metadoc.MetaDocStoryBoard; -import com.simibubi.create.foundation.metadoc.Select; - -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; - -public class CogwheelStory extends MetaDocStoryBoard { - - private int index; - - public CogwheelStory(int index) { - this.index = index; - } - - @Override - public String getSchematicName() { - return "cogwheel/s" + index; - } - - @Override - public String getStoryTitle() { - return "My First Metadoc Story, Part " + index; - } - - @Override - public void program(SceneBuilder scene, Vec3i worldSize) { - scene.showBasePlate(); - scene.idle(10); - - scene.showSection(Select.cuboid(BlockPos.ZERO.up(), worldSize), Direction.DOWN); - scene.multiplyKineticSpeed(scene.everywhere(), 2); - scene.rotateCameraY(90); - scene.createParrotOn(new BlockPos(0.5, 2.5, 1.5), Direction.DOWN); -// scene.idle(10); -// scene.createParrotOn(new BlockPos(5, 1, 5), Direction.DOWN); -// scene.idle(10); -// scene.createParrotOn(new BlockPos(0, 1, 5), Direction.DOWN); - - scene.idle(40); - scene.showText(new Vec3d(0.5, 2, 1.5), "swinging_text", "there's a parrot", 10, 50); - scene.idle(10); - scene.rotateCameraY(180); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java deleted file mode 100644 index db91c27a1..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/content/MetaDocIndex.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.simibubi.create.foundation.metadoc.content; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.foundation.metadoc.MetaDocs; - -public class MetaDocIndex { - - /** - * When true, lang files are bypassed and any text in metadoc can be hot-swapped - * without the need of runData - */ - public static final boolean EDITOR_MODE = true; - - public static void register() { - // Register storyboards here (Requires re-launch) - - for (int i = 1; i < 6; i++) - MetaDocs.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory(i)); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java deleted file mode 100644 index b2d061111..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/content/SharedText.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.simibubi.create.foundation.metadoc.content; - -import com.simibubi.create.foundation.metadoc.MetaDocLocalization; - -public class SharedText { - - public static void gatherText() { - // Add entries used across several metadoc stories (Safe for hotswap) - - add("when_wrenched", "When Wrenched"); - add("more_shared", "This is Shared stuff"); - - } - - public static String get(String key) { - return MetaDocLocalization.getShared(key); - } - - private static void add(String k, String v) { - MetaDocLocalization.registerShared(k, v); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java deleted file mode 100644 index 1c8cf29a0..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedOverlayElement.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScreen; -import com.simibubi.create.foundation.utility.LerpedFloat; - -public abstract class AnimatedOverlayElement extends MetaDocOverlayElement { - - protected LerpedFloat fade; - - public AnimatedOverlayElement() { - fade = LerpedFloat.linear() - .startWithValue(0); - } - - public void setFade(float fade) { - this.fade.setValue(fade); - } - - @Override - public final void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks) { - float currentFade = fade.getValue(partialTicks); - render(scene, screen, ms, partialTicks, currentFade); - } - - protected abstract void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks, float fade); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java deleted file mode 100644 index a3d2bfc82..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/AnimatedSceneElement.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.util.math.Vec3d; - -public abstract class AnimatedSceneElement extends MetaDocSceneElement { - - protected Vec3d fadeVec; - protected LerpedFloat fade; - - public AnimatedSceneElement() { - fade = LerpedFloat.linear() - .startWithValue(0); - } - - public void setFade(float fade) { - this.fade.setValue(fade); - } - - public void setFadeVec(Vec3d fadeVec) { - this.fadeVec = fadeVec; - } - - @Override - public final void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { - ms.push(); - float currentFade = fade.getValue(Minecraft.getInstance() - .getRenderPartialTicks()); - if (fadeVec != null) - MatrixStacker.of(ms) - .translate(fadeVec.scale(-1 + currentFade)); - render(world, buffer, ms, currentFade); - ms.pop(); - } - - protected abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade); - - protected int lightCoordsFromFade(float fade) { - int light = 0xF000F0; - if (fade != 1) { - light = (int) (0xF * fade); - light = light << 4 | light << 20; - } - return light; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java deleted file mode 100644 index 29566ef8c..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocOverlayElement.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocElement; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScreen; - -public abstract class MetaDocOverlayElement extends MetaDocElement { - - public void tick() {} - - public abstract void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java deleted file mode 100644 index a5507a70a..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/MetaDocSceneElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.metadoc.MetaDocElement; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; - -import net.minecraft.client.renderer.IRenderTypeBuffer; - -public abstract class MetaDocSceneElement extends MetaDocElement { - - public abstract void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java deleted file mode 100644 index 5df7d845b..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/ParrotElement.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.IRenderTypeBuffer; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.ParrotEntity; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.Vec3d; - -public class ParrotElement extends AnimatedSceneElement { - - private Vec3d location; - private ParrotEntity entity; - - public ParrotElement(Vec3d location) { - this.location = location; - } - - @Override - public void tick() { - super.tick(); - if (entity == null) - return; - entity.ticksExisted++; - -// entity.prevRotationYawHead = entity.rotationYawHead; - entity.oFlapSpeed = entity.flapSpeed; - entity.oFlap = entity.flap; - entity.onGround = true; - -// entity.rotationYawHead++; - entity.flapSpeed = .5f; - entity.flap = 1; -// entity.flap += entity.flapSpeed; -// entity.flap += .5f + Create.random.nextFloat(); - } - - @Override - protected void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { - EntityRendererManager entityrenderermanager = Minecraft.getInstance() - .getRenderManager(); - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); - - if (entity == null) { - entity = new ParrotEntity(EntityType.PARROT, world); - entity.setVariant(Create.random.nextInt(5)); -// entity.setPartying(BlockPos.ZERO, true); - } - - ms.push(); - ms.translate(location.x, location.y, location.z); - - MatrixStacker.of(ms) - .rotateY(AnimationTickHolder.getRenderTick() * 15) - .rotateZ(30); - ms.translate(-.25f, 0, 0); - - entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); - ms.pop(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java deleted file mode 100644 index 4cbb84268..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/TextWindowElement.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.simibubi.create.foundation.metadoc.elements; - -import java.util.List; -import java.util.function.Supplier; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScreen; -import com.simibubi.create.foundation.utility.ColorHelper; - -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; -import net.minecraftforge.fml.client.gui.GuiUtils; - -public class TextWindowElement extends AnimatedOverlayElement { - - Supplier textGetter; - String bakedText; - Vec3d vec; - - public TextWindowElement(Supplier textGetter) { - this.textGetter = textGetter; - } - - public TextWindowElement moveTo(Vec3d vec) { - this.vec = vec; - return this; - } - - @Override - protected void render(MetaDocScene scene, MetaDocScreen screen, MatrixStack ms, float partialTicks, float fade) { - if (bakedText == null) - bakedText = textGetter.get(); - if (fade < 1 / 16f) - return; - Vec2f sceneToScreen = scene.getTransform() - .sceneToScreen(vec); - int targetX = screen.width * 6 / 8; - int textWidth = screen.width - targetX; - - List list = screen.getFontRenderer() - .listFormattedStringToWidth(bakedText, textWidth); - int boxWidth = 0; - for (String string : list) - boxWidth = Math.max(boxWidth, screen.getFontRenderer() - .getStringWidth(string)); - int boxHeight = screen.getFontRenderer() - .getWordWrappedHeight(bakedText, textWidth); - - RenderSystem.pushMatrix(); - RenderSystem.translatef(0, sceneToScreen.y, 400); - - screen.renderBox(targetX - 10, 3, boxWidth, boxHeight -1 , 0x55000000, 0x30eebb00, 0x10eebb00); - - RenderSystem.pushMatrix(); - RenderSystem.translatef(sceneToScreen.x, 0, 0); - double lineTarget = (targetX - sceneToScreen.x) * fade; - RenderSystem.scaled(lineTarget, 1, 1); - GuiUtils.drawGradientRect(-100, 0, 0, 1, 1, 0xFFFFFFFF, 0xFFFFFFFF); - GuiUtils.drawGradientRect(-100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); - RenderSystem.popMatrix(); - - screen.getFontRenderer() - .drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(0xeeeeee, fade)); - RenderSystem.popMatrix(); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java deleted file mode 100644 index 1824e7187..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ShowCompleteSchematicInstruction.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.simibubi.create.foundation.metadoc.instructions; - -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.Select; - -public class ShowCompleteSchematicInstruction extends MetaDocInstruction { - - @Override - public void tick(MetaDocScene scene) { - scene.addElement(Select.everything(scene) - .asElement()); - } - - @Override - public boolean isComplete() { - return true; - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java deleted file mode 100644 index f1d232d29..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TextWindowInstruction.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.simibubi.create.foundation.metadoc.instructions; - -import java.util.function.Supplier; - -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.elements.TextWindowElement; - -import net.minecraft.util.math.Vec3d; - -public class TextWindowInstruction extends TickingInstruction { - - private TextWindowElement element; - private int fadeTime; - - public TextWindowInstruction(Supplier text, int fadeTime, int duration, Vec3d position) { - super(false, duration + 2 * fadeTime); - this.fadeTime = fadeTime; - element = new TextWindowElement(text).moveTo(position); - } - - @Override - protected void firstTick(MetaDocScene scene) { - super.firstTick(scene); - scene.addElement(element); - element.setVisible(true); - element.setFade(0); - } - - @Override - public void tick(MetaDocScene scene) { - super.tick(scene); - int elapsed = totalTicks - remainingTicks; - - if (elapsed < fadeTime) { - float fade = (elapsed / (float) fadeTime); - element.setFade(fade * fade); - - } else if (remainingTicks < fadeTime) { - float fade = (remainingTicks / (float) fadeTime); - element.setFade(fade * fade); - - } else - element.setFade(1); - - if (remainingTicks == 0) { - element.setFade(0); - element.setFade(0); - element.setVisible(false); - } - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java deleted file mode 100644 index 0fc337b00..000000000 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/WorldModifyInstruction.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.simibubi.create.foundation.metadoc.instructions; - -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.Select; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; - -public abstract class WorldModifyInstruction extends MetaDocInstruction { - - private Select selection; - - public WorldModifyInstruction(Select selection) { - this.selection = selection; - } - - @Override - public boolean isComplete() { - return true; - } - - @Override - public void tick(MetaDocScene scene) { - runModification(selection, scene); - if (needsRedraw()) - scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); - } - - protected abstract void runModification(Select selection, MetaDocScene scene); - - protected abstract boolean needsRedraw(); - -} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java similarity index 57% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java index 753d454c8..e22fcae23 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java @@ -1,10 +1,10 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; -public class MetaDocElement { +public class PonderElement { boolean visible = true; - public void tick() {} + public void tick(PonderScene scene) {} public boolean isVisible() { return visible; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java new file mode 100644 index 000000000..10316af3f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java @@ -0,0 +1,15 @@ +package com.simibubi.create.foundation.ponder; + +public abstract class PonderInstruction { + + public boolean isBlocking() { + return false; + } + + public void reset(PonderScene scene) {} + + public abstract boolean isComplete(); + + public abstract void tick(PonderScene scene); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java similarity index 77% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index 55b28c150..2ab41b185 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.util.HashMap; import java.util.Map; @@ -6,12 +6,12 @@ import java.util.Map; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.util.ResourceLocation; -public class MetaDocLocalization { +public class PonderLocalization { static Map shared = new HashMap<>(); static Map>> specific = new HashMap<>(); @@ -31,13 +31,13 @@ public class MetaDocLocalization { // public static String getShared(String key) { - if (MetaDocIndex.EDITOR_MODE) + if (PonderIndex.EDITOR_MODE) return shared.get(key); return Lang.translate(langKeyForShared(key)); } public static String getSpecific(ResourceLocation component, int scene, String k) { - if (MetaDocIndex.EDITOR_MODE) + if (PonderIndex.EDITOR_MODE) return specific.get(component) .get(scene) .get(k); @@ -46,10 +46,14 @@ public class MetaDocLocalization { // - static final String LANG_PREFIX = "metadoc."; + static final String LANG_PREFIX = "ponder."; public static JsonElement record() { JsonObject object = new JsonObject(); + + addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder"); + addGeneral(object, PonderUI.PONDERING, "Pondering about..."); + shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); specific.forEach((rl, map) -> { String component = rl.getPath(); @@ -62,6 +66,10 @@ public class MetaDocLocalization { }); return object; } + + private static void addGeneral(JsonObject json, String key, String enUS) { + json.addProperty(Create.ID + "." + key, enUS); + } protected static String langKeyForSpecific(String component, int scene, String k) { return LANG_PREFIX + component + ".scene_" + scene + "." + k; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java similarity index 56% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 7d94caf57..fcc7945d1 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocs.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.io.BufferedInputStream; import java.io.DataInputStream; @@ -12,8 +12,9 @@ import java.util.zip.GZIPInputStream; import com.google.gson.JsonElement; import com.simibubi.create.Create; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; -import com.simibubi.create.foundation.metadoc.content.SharedText; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.SharedText; import com.tterrag.registrate.util.entry.ItemProviderEntry; import net.minecraft.client.Minecraft; @@ -26,38 +27,38 @@ import net.minecraft.util.math.Vec3i; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; -public class MetaDocs { +public class PonderRegistry { - static Map> all = new HashMap<>(); + static Map> all = new HashMap<>(); - public static void addStoryBoard(ItemProviderEntry component, MetaDocStoryBoard storyBoard) { + public static void addStoryBoard(ItemProviderEntry component, PonderStoryBoard storyBoard) { ResourceLocation id = component.getId(); all.computeIfAbsent(id, $ -> new ArrayList<>()) .add(storyBoard); } - public static List compile(ResourceLocation id) { + public static List compile(ResourceLocation id) { - if (MetaDocIndex.EDITOR_MODE) { - MetaDocLocalization.shared.clear(); - MetaDocLocalization.specific.clear(); + if (PonderIndex.EDITOR_MODE) { + PonderLocalization.shared.clear(); + PonderLocalization.specific.clear(); SharedText.gatherText(); } - List list = all.get(id); - List scenes = new ArrayList<>(); + List list = all.get(id); + List scenes = new ArrayList<>(); for (int i = 0; i < list.size(); i++) { - MetaDocStoryBoard sb = list.get(i); + PonderStoryBoard sb = list.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); - MetaDocWorld world = new MetaDocWorld(BlockPos.ZERO, Minecraft.getInstance().world); + PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); world.createBackup(); - MetaDocScene scene = new MetaDocScene(world, id, i); - MetaDocLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - sb.program(scene.builder(), world.getBounds() - .getLength()); + PonderScene scene = new PonderScene(world, id, i); + PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); + SceneBuilder builder = scene.builder(); + sb.program(builder, builder.getSceneBuildingUtil()); scene.begin(); scenes.add(scene); @@ -68,33 +69,34 @@ public class MetaDocs { public static Template loadSchematic(String path) { Template t = new Template(); - String filepath = "doc/" + path + ".nbt"; + String filepath = "ponder/" + path + ".nbt"; InputStream resourceAsStream = Create.class.getClassLoader() .getResourceAsStream(filepath); if (resourceAsStream == null) - throw new IllegalStateException("Could not find metadoc schematic: " + filepath); + throw new IllegalStateException("Could not find ponder schematic: " + filepath); try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); t.read(nbt); } catch (IOException e) { - Create.logger.warn("Failed to read metadoc schematic", e); + Create.logger.warn("Failed to read ponder schematic", e); } return t; } public static JsonElement provideLangEntries() { - MetaDocIndex.register(); + PonderIndex.register(); SharedText.gatherText(); all.forEach((id, list) -> { for (int i = 0; i < list.size(); i++) { - MetaDocStoryBoard sb = list.get(i); - MetaDocScene scene = new MetaDocScene(null, id, i); - MetaDocLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - sb.program(scene.builder(), Vec3i.NULL_VECTOR); + PonderStoryBoard sb = list.get(i); + PonderScene scene = new PonderScene(null, id, i); + PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); + SceneBuilder builder = scene.builder(); + sb.program(builder, builder.getSceneBuildingUtil()); } }); - return MetaDocLocalization.record(); + return PonderLocalization.record(); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java new file mode 100644 index 000000000..84fd7d8f5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -0,0 +1,462 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.function.UnaryOperator; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +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.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement; +import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; +import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; +import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; +import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; +import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction; +import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; +import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; +import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction; +import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction; +import com.simibubi.create.foundation.ponder.instructions.TextInstruction; +import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.outliner.Outliner; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Vector4f; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public class PonderScene { + + List schedule, activeSchedule; + Set elements; + PonderWorld world; + ResourceLocation component; + int sceneIndex; + SceneTransform transform; + public boolean finished; + SceneRenderInfo info; + Outliner outliner; + + Vec3d pointOfInterest; + Vec3d chasingPointOfInterest; + + private int offsetX; + private int offsetZ; + private int size; + + public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { + pointOfInterest = Vec3d.ZERO; + + this.world = world; + this.component = component; + this.sceneIndex = sceneIndex; + + outliner = new Outliner(); + elements = new HashSet<>(); + schedule = new ArrayList<>(); + activeSchedule = new ArrayList<>(); + transform = new SceneTransform(); + size = getBounds().getXSize(); + info = new SceneRenderInfo(); + } + + public String getTitle() { + return getString("title"); + } + + public String getString(String key) { + return PonderLocalization.getSpecific(component, sceneIndex, key); + } + + public void reset() { + activeSchedule.clear(); + schedule.forEach(mdi -> mdi.reset(this)); + } + + public void begin() { + reset(); + world.restore(); + transform = new SceneTransform(); + finished = false; + forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); + elements.clear(); + activeSchedule.addAll(schedule); + } + + public void fadeOut() { + reset(); + activeSchedule.add(new HideAllInstruction(10, null)); + } + + public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms) { + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + + ms.push(); + forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms)); + for (RenderType type : RenderType.getBlockLayers()) + forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms)); + forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms)); + info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt)); + world.renderParticles(ms, buffer, info); + outliner.renderOutlines(ms, buffer); + ms.pop(); + } + + public void renderOverlay(PonderUI screen, MatrixStack ms, float partialTicks) { + ms.push(); + forEachVisible(PonderOverlayElement.class, e -> e.render(this, screen, ms, partialTicks)); + ms.pop(); + } + + public void setPointOfInterest(Vec3d poi) { + if (chasingPointOfInterest == null) + pointOfInterest = poi; + chasingPointOfInterest = poi; + } + + public Vec3d getPointOfInterest() { + return pointOfInterest; + } + + public void tick() { + if (chasingPointOfInterest != null) + pointOfInterest = VecHelper.lerp(.25f, pointOfInterest, chasingPointOfInterest); + + outliner.tickOutlines(); + world.tickParticles(); + transform.tick(); + forEach(e -> e.tick(this)); + + for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { + PonderInstruction instruction = iterator.next(); + instruction.tick(this); + if (instruction.isComplete()) { + iterator.remove(); + continue; + } + if (instruction.isBlocking()) + break; + } + + if (activeSchedule.isEmpty()) + finished = true; + } + + public void addElement(PonderElement e) { + elements.add(e); + } + + public PonderWorld getWorld() { + return world; + } + + public Set getElements() { + return elements; + } + + public void forEach(Consumer function) { + for (PonderElement elemtent : elements) + function.accept(elemtent); + } + + public void forEach(Class type, Consumer function) { + for (PonderElement element : elements) + if (type.isInstance(element)) + function.accept(type.cast(element)); + } + + public void forEachVisible(Class type, Consumer function) { + for (PonderElement element : elements) + if (type.isInstance(element) && element.isVisible()) + function.accept(type.cast(element)); + } + + public MutableBoundingBox getBounds() { + return world == null ? new MutableBoundingBox() : world.getBounds(); + } + + public SceneBuilder builder() { + return new SceneBuilder(); + } + + private Supplier textGetter(String key) { + return () -> PonderLocalization.getSpecific(component, sceneIndex, key); + } + + public SceneTransform getTransform() { + return transform; + } + + public class SceneTransform { + + public LerpedFloat xRotation, yRotation; + + // Screen params + int width, height; + double offset; + Matrix4f cachedMat; + + public SceneTransform() { + xRotation = LerpedFloat.angular() + .startWithValue(-35); + yRotation = LerpedFloat.angular() + .startWithValue(55 + 90); + } + + public void tick() { + xRotation.tickChaser(); + yRotation.tickChaser(); + } + + public void updateScreenParams(int width, int height, double offset) { + this.width = width; + this.height = height; + this.offset = offset; + cachedMat = null; + } + + public MatrixStack apply(MatrixStack ms) { + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + ms.translate(width / 2, height / 2, 200); + + MatrixStacker.of(ms) + .rotateX(-35) + .rotateY(55); + ms.translate(offset, 0, 0); + MatrixStacker.of(ms) + .rotateY(-55) + .rotateX(35); + + MatrixStacker.of(ms) + .rotateX(xRotation.getValue(pt)) + .rotateY(yRotation.getValue(pt)); + ms.scale(30, -30, 30); + ms.translate((size + offsetX) / -2f, -.5f, (size + offsetZ) / -2f); + + return ms; + } + + public Vec3d screenToScene(float x, float y) { + refreshMatrix(); + Vector4f vec = new Vector4f(x, y, 0, 1); + cachedMat.invert(); + vec.transform(cachedMat); + cachedMat.invert(); + MutableBoundingBox bounds = getBounds(); + return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); + } + + public Vec2f sceneToScreen(Vec3d vec) { + refreshMatrix(); + Vector4f vec4 = new Vector4f((float) vec.x, (float) vec.y, (float) vec.z, 1); + vec4.transform(cachedMat); + return new Vec2f(vec4.getX(), vec4.getY()); + } + + protected void refreshMatrix() { + if (cachedMat != null) + return; + cachedMat = apply(new MatrixStack()).peek() + .getModel(); + } + + } + + public class SceneRenderInfo extends ActiveRenderInfo { + + public void set(float xRotation, float yRotation) { + setDirection(yRotation, xRotation); + } + + } + + public class SceneBuilder { + + private SceneBuildingUtil sceneBuildingUtil; + + public SceneBuilder() { + sceneBuildingUtil = new SceneBuildingUtil(); + } + + public SceneBuildingUtil getSceneBuildingUtil() { + return sceneBuildingUtil; + } + + public SceneBuilder showBasePlate() { + return showSection(Select.cuboid(new BlockPos(offsetX, 0, offsetZ), new Vec3i(size, 0, size)), + Direction.UP); + } + + public SceneBuilder showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, + int duration) { + PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); + return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, position)); + } + + public SceneBuilder showSelectionWithText(PonderPalette color, Select selection, String key, String defaultText, + int duration) { + PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); + return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, selection)); + } + + public SceneBuilder showText(PonderPalette color, int y, String key, String defaultText, int duration) { + PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); + return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, y)); + } + + public SceneBuilder showSection(Select selection, Direction fadeInDirection) { + return addInstruction( + new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement(selection))); + } + + public SceneBuilder debugSchematic() { + return addInstruction(new ShowCompleteSchematicInstruction()); + } + + public SceneBuilder idle(int ticks) { + return addInstruction(new DelayInstruction(ticks)); + } + + public SceneBuilder idleSeconds(int seconds) { + return idle(seconds * 20); + } + + public SceneBuilder markAsFinished() { + return addInstruction(new MarkAsFinishedInstruction()); + } + + public SceneBuilder rotateCameraY(float degrees) { + return addInstruction(new RotateSceneInstruction(0, degrees, true)); + } + + public SceneBuilder setBlocks(Select selection, BlockState state) { + return addInstruction(new ReplaceBlocksInstruction(selection, state, true)); + } + + public SceneBuilder replaceBlocks(Select selection, BlockState state) { + return addInstruction(new ReplaceBlocksInstruction(selection, state, false)); + } + + public SceneBuilder setKineticSpeed(Select selection, float speed) { + return modifyKineticSpeed(selection, f -> speed); + } + + public SceneBuilder multiplyKineticSpeed(Select selection, float modifier) { + return modifyKineticSpeed(selection, f -> f * modifier); + } + + public SceneBuilder modifyKineticSpeed(Select selection, UnaryOperator speedFunc) { + addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> { + if (!nbt.contains("Speed")) + return nbt; + float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); + // TODO speed gauge consistency + nbt.putFloat("Value", Math.abs(newSpeed) / 256f); + return nbt; + }, false)); + + return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { + if (!nbt.contains("Speed")) + return nbt; + nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); + return nbt; + }, false)); + } + + public SceneBuilder flapFunnels(Select selection, boolean outward) { + return addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> { + nbt.putInt("Flap", outward ? -1 : 1); + return nbt; + }, false)); + } + + public SceneBuilder createParrotSpinningOn(BlockPos pos, Direction fadeInDirection) { + return addInstruction(new CreateParrotInstruction(15, fadeInDirection, + ParrotElement.spinOnComponent(new Vec3d(pos).add(.5, 0, .5), pos.down()))); + } + + public SceneBuilder createParrotLookingAtPOI(Vec3d location, Direction fadeInDirection) { + return addInstruction(new CreateParrotInstruction(15, fadeInDirection, ParrotElement.lookAtPOI(location))); + } + + public SceneBuilder movePOI(Vec3d location) { + return addInstruction(new MovePoiInstruction(location)); + } + + public SceneBuilder addInstruction(PonderInstruction instruction) { + schedule.add(instruction); + return this; + } + + public class SceneBuildingUtil { + + public Vec3d centerOf(int x, int y, int z) { + return VecHelper.getCenterOf(new BlockPos(x, y, z)); + } + + public Vec3d vector(double x, double y, double z) { + return new Vec3d(x, y, z); + } + + public Select everywhere() { + return Select.everything(getBounds()); + } + + public Select column(int x, int z) { + return Select.column(getBounds(), x, z); + } + + public Select layer(int y) { + return layers(y, 1); + } + + public Select layers(int y, int height) { + return Select.layer(getBounds(), y, height); + } + + public Select layersFrom(int y) { + return Select.layer(getBounds(), y, getBounds().getYSize()); + } + + } + + public SceneBuilder configureBasePlate(int xOffset, int zOffset, int basePlateSize) { + offsetX = xOffset; + offsetZ = zOffset; + size = basePlateSize; + return this; + } + + } + + public Outliner getOutliner() { + return outliner; + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java new file mode 100644 index 000000000..1fb3fc6a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.ponder; + +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; + +public abstract class PonderStoryBoard { + + public abstract String getSchematicName(); + + public abstract String getStoryTitle(); + + public abstract void program(SceneBuilder scene, SceneBuildingUtil util); + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java similarity index 66% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java index 75247e7c8..a691b96cc 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -1,15 +1,18 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.util.List; import com.google.common.base.Strings; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.settings.KeyBinding; import net.minecraft.client.util.InputMappings; import net.minecraft.inventory.container.Slot; import net.minecraft.item.ItemStack; @@ -18,11 +21,12 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.RenderTooltipEvent; -public class MetaDocTooltipHandler { +public class PonderTooltipHandler { static LerpedFloat holdWProgress = LerpedFloat.linear() .startWithValue(0); static ItemStack lastHoveredStack = null; + public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder"; public static void tick() { Minecraft instance = Minecraft.getInstance(); @@ -39,7 +43,7 @@ public class MetaDocTooltipHandler { ItemStack stack = slotUnderMouse.getStack(); - if (!MetaDocs.all.containsKey(stack.getItem() + if (!PonderRegistry.all.containsKey(stack.getItem() .getRegistryName())) return; @@ -47,14 +51,14 @@ public class MetaDocTooltipHandler { holdWProgress.startWithValue(0); float value = holdWProgress.getValue(); - int keyCode = instance.gameSettings.keyBindForward.getKey() + int keyCode = ponderKeybind().getKey() .getKeyCode(); long window = instance.getWindow() .getHandle(); if (InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) - ScreenOpener.open(new MetaDocScreen(MetaDocs.compile(stack.getItem() + ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem() .getRegistryName()))); holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); } else @@ -68,7 +72,7 @@ public class MetaDocTooltipHandler { return; float renderPartialTicks = Minecraft.getInstance() .getRenderPartialTicks(); - toolTip.add(makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); + toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); } public static void handleTooltipColor(RenderTooltipEvent.Color event) { @@ -92,29 +96,36 @@ public class MetaDocTooltipHandler { private static int getSmoothColorForProgress(float progress) { if (progress < .5f) return ColorHelper.mixColors(0x5000FF, 5592575, progress * 2); -// if (progress < .75f) -// return ColorHelper.mixColors(16733695, 5636095, (progress - .5f) * 4); return ColorHelper.mixColors(5592575, 0xffffff, (progress - .5f) * 2); } private static ITextComponent makeProgressBar(float progress) { - String bar = ""; - int filledLength = (int) (12 * progress); - bar += Strings.repeat("\u2588", filledLength); - if (progress < 1) - bar += Strings.repeat("\u2592", 12 - filledLength); + String holdW = Lang + .createTranslationTextComponent(HOLD_TO_PONDER, new StringTextComponent(ponderKeybind().getKeyBinding() + .getLocalizedName()).applyTextStyle(TextFormatting.WHITE)) + .applyTextStyle(TextFormatting.GRAY) + .getFormattedText(); - TextFormatting color = TextFormatting.DARK_GRAY; - if (progress > 0) - color = TextFormatting.GRAY; - if (progress == 1f) - color = TextFormatting.WHITE; + FontRenderer fontRenderer = Minecraft.getInstance().fontRenderer; + float charWidth = fontRenderer.getStringWidth("|"); + float tipWidth = fontRenderer.getStringWidth(holdW); - ITextComponent leftBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); - ITextComponent rightBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); - ITextComponent barComponent = new StringTextComponent(bar).applyTextStyle(color); - return leftBr.appendSibling(barComponent) - .appendSibling(rightBr); + int total = (int) (tipWidth / charWidth); + int current = (int) (progress * total); + + if (progress > 0) { + String bars = ""; + bars += TextFormatting.WHITE + Strings.repeat("|", current); + if (progress < 1) + bars += TextFormatting.GRAY + Strings.repeat("|", total - current); + return new StringTextComponent(bars); + } + + return new StringTextComponent(holdW); + } + + protected static KeyBinding ponderKeybind() { + return Minecraft.getInstance().gameSettings.keyBindForward; } } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java similarity index 50% rename from src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java rename to src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index e9188f03b..04c3b7935 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -1,32 +1,45 @@ -package com.simibubi.create.foundation.metadoc; +package com.simibubi.create.foundation.ponder; import java.util.List; +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllIcons; -import com.simibubi.create.foundation.metadoc.content.MetaDocIndex; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; import net.minecraft.client.GameSettings; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.MutableBoundingBox; import net.minecraftforge.fml.client.gui.GuiUtils; +import net.minecraftforge.registries.ForgeRegistries; -public class MetaDocScreen extends AbstractSimiScreen { +public class PonderUI extends AbstractSimiScreen { - private List scenes; + public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; + private List scenes; private LerpedFloat fadeIn; + ItemStack stack; private LerpedFloat lazyIndex; private int index = 0; - public MetaDocScreen(List scenes) { + private PonderButton left, right, icon; + + public PonderUI(List scenes) { this.scenes = scenes; lazyIndex = LerpedFloat.linear() .startWithValue(index); @@ -35,6 +48,39 @@ public class MetaDocScreen extends AbstractSimiScreen { .chase(1, .1f, Chaser.EXP); } + @Override + protected void init() { + super.init(); + widgets.clear(); + + ResourceLocation component = scenes.get(0).component; + if (ForgeRegistries.ITEMS.containsKey(component)) + stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); + else + stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); + + int bY = height - 20 - 31; + widgets.add(icon = new PonderButton(31, 31, () -> { + }).showing(stack) + .fade(0, -1)); + + int spacing = 8; + int bX = (width - 20) / 2 - (20 + spacing); + GameSettings bindings = minecraft.gameSettings; + widgets.add(left = new PonderButton(bX, bY, () -> this.scroll(false)).showing(AllIcons.I_MTD_LEFT) + .shortcut(bindings.keyBindLeft) + .fade(0, -1)); + bX += 20 + spacing; + widgets.add(new PonderButton(bX, bY, this::onClose).showing(AllIcons.I_MTD_CLOSE) + .shortcut(bindings.keyBindInventory) + .fade(0, -1)); + bX += 20 + spacing; + widgets.add(right = new PonderButton(bX, bY, () -> this.scroll(true)).showing(AllIcons.I_MTD_RIGHT) + .shortcut(bindings.keyBindRight) + .fade(0, -1)); + + } + @Override public void tick() { lazyIndex.tickChaser(); @@ -73,30 +119,65 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderStories(partialTicks); + renderVisibleScenes(partialTicks); renderWidgets(mouseX, mouseY, partialTicks); } - protected void renderStories(float partialTicks) { - renderStory(index, partialTicks); + protected void renderVisibleScenes(float partialTicks) { + renderScene(index, partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); if (Math.abs(lazyIndexValue - index) > 1 / 512f) - renderStory(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + renderScene(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); } - protected void renderStory(int i, float partialTicks) { + protected void renderScene(int i, float partialTicks) { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); - MetaDocScene story = scenes.get(i); + PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); double value = lazyIndex.getValue(partialTicks); double diff = i - value; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; + RenderSystem.enableAlphaTest(); + RenderSystem.enableBlend(); + RenderSystem.enableDepthTest(); + ms.push(); story.transform.updateScreenParams(width, height, slide); story.transform.apply(ms); story.renderScene(buffer, ms); buffer.draw(); + + // coords for debug + if (PonderIndex.EDITOR_MODE) { + MutableBoundingBox bounds = story.getBounds(); + + RenderSystem.pushMatrix(); + RenderSystem.multMatrix(ms.peek().getModel()); + RenderSystem.scaled(-1/16d, -1/16d, 1/16d); + RenderSystem.translated(1, -8, -1/64f); + + RenderSystem.pushMatrix(); + for (int x = 0; x <= bounds.getXSize(); x++) { + RenderSystem.translated(-16, 0, 0); + font.drawString(x == bounds.getXSize() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); + } + RenderSystem.popMatrix(); + + RenderSystem.pushMatrix(); + RenderSystem.scaled(-1, 1, 1); + RenderSystem.rotatef(-90, 0, 1, 0); + RenderSystem.translated(-8, -2, 2/64f); + for (int z = 0; z <= bounds.getZSize(); z++) { + RenderSystem.translated(16, 0, 0); + font.drawString(z == bounds.getZSize() ? "z" : "" + z, 0, 0, 0xFFFFFFFF); + } + RenderSystem.popMatrix(); + + buffer.draw(); + RenderSystem.popMatrix(); + } + ms.pop(); } @@ -107,41 +188,68 @@ public class MetaDocScreen extends AbstractSimiScreen { int textColor = 0xeeeeee; { - int y = 34; - drawString(font, "MetaDoc Experimental 0", 50, y, textColor); - y += 10; - drawString(font, "> " + scenes.get(index) - .getTitle(), 50, y, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); - y += 10; - if (MetaDocIndex.EDITOR_MODE) - drawString(font, "Mouse: " + mouseX + ", " + mouseY, 50, y, 0x8d8d8d); + // Chapter title + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 800); + int x = icon.x + icon.getWidth() + 8; + int y = icon.y; + drawString(font, Lang.translate(PONDERING), x, y, 0xffa3a3a3); + y += 12; + x += 0; + RenderSystem.translated(0, 3 * (indexDiff), 0); + font.drawSplitString(scenes.get(index) + .getTitle(), x, y, left.x - x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + RenderSystem.popMatrix(); } - // Scene overlay - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 100); - renderOverlay(index, partialTicks); - if (indexDiff > 1 / 512f) - renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); - RenderSystem.popMatrix(); + { + // Scene overlay + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 100); + renderOverlay(index, partialTicks); + if (indexDiff > 1 / 512f) + renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + RenderSystem.popMatrix(); + } + + // Widgets + widgets.forEach(w -> { + if (w instanceof PonderButton) { + PonderButton mtdButton = (PonderButton) w; + mtdButton.fade(fade); + } + }); + + if (index == 0 || index == 1 && lazyIndexValue < index) + left.fade(lazyIndexValue); + if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) + right.fade(scenes.size() - lazyIndexValue - 1); + + if (scenes.get(index).finished) + right.flash(); + else + right.dim(); + } + + protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { + int bWidth = 20; + int bHeight = 20; + int bX = (width - bWidth) / 2 + (index - 1) * (bWidth + 8); + int bY = height - bHeight - 31; - // Close button RenderSystem.pushMatrix(); if (fade < fadeIn.getChaseTarget()) RenderSystem.translated(0, (1 - fade) * 5, 0); - int closeWidth = 24; - int closeHeight = 24; - int closeX = (width - closeWidth) / 2; - int closeY = height - closeHeight - 31; - boolean hovered = isMouseOver(mouseX, mouseY, closeX, closeY, closeWidth, closeHeight); - renderBox(closeX, closeY, closeWidth, closeHeight, hovered); - AllIcons.I_CONFIRM.draw(closeX + 4, closeY + 4); + boolean hovered = isMouseOver(mouseX, mouseY, bX, bY, bWidth, bHeight); + renderBox(bX, bY, bWidth, bHeight, hovered); + icon.draw(bX + 2, bY + 2); + drawCenteredString(font, key.getLocalizedName(), bX + bWidth / 2 + 8, bY + bHeight - 6, 0xff606060); RenderSystem.popMatrix(); } private void renderOverlay(int i, float partialTicks) { RenderSystem.pushMatrix(); - MetaDocScene story = scenes.get(i); + PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); story.renderOverlay(this, ms, partialTicks); RenderSystem.popMatrix(); @@ -149,14 +257,22 @@ public class MetaDocScreen extends AbstractSimiScreen { @Override public boolean mouseClicked(double x, double y, int button) { - int closeWidth = 24; - int closeHeight = 24; - int closeX = (width - closeWidth) / 2; - int closeY = height - closeHeight - 31; - if (isMouseOver(x, y, closeX, closeY, closeWidth, closeHeight)) { - onClose(); + MutableBoolean handled = new MutableBoolean(false); + widgets.forEach(w -> { + if (handled.booleanValue()) + return; + if (!w.isMouseOver(x, y)) + return; + if (w instanceof PonderButton) { + PonderButton mtdButton = (PonderButton) w; + mtdButton.runCallback(); + handled.setTrue(); + return; + } + }); + + if (handled.booleanValue()) return true; - } return super.mouseClicked(x, y, button); } @@ -188,7 +304,7 @@ public class MetaDocScreen extends AbstractSimiScreen { return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } - + public FontRenderer getFontRenderer() { return font; } @@ -203,11 +319,12 @@ public class MetaDocScreen extends AbstractSimiScreen { drawString(font, s, x, y, color); } - public void renderBox(int x, int y, int w, int h, boolean highlighted) { + public static void renderBox(int x, int y, int w, int h, boolean highlighted) { renderBox(x, y, w, h, 0xdd000000, highlighted ? 0x70ffffff : 0x30eebb00, highlighted ? 0x30ffffff : 0x10eebb00); } - public void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, int borderColorEnd) { + public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, + int borderColorEnd) { int zLevel = 100; GuiUtils.drawGradientRect(zLevel, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor); GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java new file mode 100644 index 000000000..0c67d647a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -0,0 +1,158 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.HashMap; +import java.util.Map; + +import javax.annotation.Nullable; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.schematics.SchematicWorld; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.IParticleFactory; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.IParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.shapes.VoxelShape; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.LightType; +import net.minecraft.world.World; +import net.minecraftforge.registries.ForgeRegistries; + +public class PonderWorld extends SchematicWorld { + + protected Map originalBlocks; + protected Map originalTileEntities; + protected PonderWorldParticles particles; + + int overrideLight; + Select mask; + + public PonderWorld(BlockPos anchor, World original) { + super(anchor, original); + originalBlocks = new HashMap<>(); + originalTileEntities = new HashMap<>(); + particles = new PonderWorldParticles(this); + } + + public void createBackup() { + originalBlocks.clear(); + originalTileEntities.clear(); + blocks.forEach((k, v) -> originalBlocks.put(k, v)); + tileEntities.forEach((k, v) -> originalTileEntities.put(k, TileEntity.create(v.write(new CompoundNBT())))); + } + + public void restore() { + blocks.clear(); + tileEntities.clear(); + renderedTileEntities.clear(); + originalBlocks.forEach((k, v) -> blocks.put(k, v)); + originalTileEntities.forEach((k, v) -> { + TileEntity te = TileEntity.create(v.write(new CompoundNBT())); + te.setLocation(this, te.getPos()); + tileEntities.put(k, te); + renderedTileEntities.add(te); + }); + particles.clearEffects(); + } + + public void pushFakeLight(int light) { + this.overrideLight = light; + } + + public void popLight() { + this.overrideLight = -1; + } + + @Override + public int getLightLevel(LightType p_226658_1_, BlockPos p_226658_2_) { + return overrideLight == -1 ? 15 : overrideLight; + } + + public void setMask(Select mask) { + this.mask = mask; + } + + public void clearMask() { + this.mask = null; + } + + @Override + public BlockState getBlockState(BlockPos globalPos) { + if (mask != null && !mask.test(globalPos.subtract(anchor))) + return Blocks.AIR.getDefaultState(); + return super.getBlockState(globalPos); + } + + @Override // For particle collision + public IBlockReader getExistingChunk(int p_225522_1_, int p_225522_2_) { + return this; + } + + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari) { + particles.renderParticles(ms, buffer, ari); + } + + public void tickParticles() { + particles.tick(); + } + + @Override + public void addParticle(IParticleData data, double x, double y, double z, double mx, double my, double mz) { + addParticle(makeParticle(data, x, y, z, mx, my, mz)); + } + + @Nullable + @SuppressWarnings("unchecked") + private Particle makeParticle(T data, double x, double y, double z, double mx, double my, + double mz) { + ParticleManager particleManager = Minecraft.getInstance().particles; + ResourceLocation key = ForgeRegistries.PARTICLE_TYPES.getKey(data.getType()); + IParticleFactory iparticlefactory = (IParticleFactory) particleManager.factories.get(key); + return iparticlefactory == null ? null : iparticlefactory.makeParticle(data, this, x, y, z, mx, my, mz); + } + + public void addParticle(Particle p) { + if (p != null) + particles.addParticle(p); + } + + public void addBlockDestroyEffects(BlockPos pos, BlockState state) { + VoxelShape voxelshape = state.getShape(this, pos); + AxisAlignedBB bb = voxelshape.getBoundingBox(); + double d1 = Math.min(1.0D, bb.maxX - bb.minX); + double d2 = Math.min(1.0D, bb.maxY - bb.minY); + double d3 = Math.min(1.0D, bb.maxZ - bb.minZ); + int i = Math.max(2, MathHelper.ceil(d1 / 0.25D)); + int j = Math.max(2, MathHelper.ceil(d2 / 0.25D)); + int k = Math.max(2, MathHelper.ceil(d3 / 0.25D)); + + for (int l = 0; l < i; ++l) { + for (int i1 = 0; i1 < j; ++i1) { + for (int j1 = 0; j1 < k; ++j1) { + double d4 = (l + 0.5D) / i; + double d5 = (i1 + 0.5D) / j; + double d6 = (j1 + 0.5D) / k; + double d7 = d4 * d1 + bb.minX; + double d8 = d5 * d2 + bb.minY; + double d9 = d6 * d3 + bb.minZ; + addParticle(new BlockParticleData(ParticleTypes.BLOCK, state), pos.getX() + d7, pos.getY() + d8, + pos.getZ() + d9, d4 - 0.5D, d5 - 0.5D, d6 - 0.5D); + } + } + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java new file mode 100644 index 000000000..902c1e766 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java @@ -0,0 +1,109 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.Collection; +import java.util.Iterator; +import java.util.Map; +import java.util.Queue; + +import com.google.common.collect.EvictingQueue; +import com.google.common.collect.Maps; +import com.google.common.collect.Queues; +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.IParticleRenderType; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Tessellator; + +public class PonderWorldParticles { + + private final Map> byType = Maps.newIdentityHashMap(); + private final Queue queue = Queues.newArrayDeque(); + + PonderWorld world; + + public PonderWorldParticles(PonderWorld world) { + this.world = world; + } + + public void addParticle(Particle p) { + this.queue.add(p); + } + + public void tick() { + this.byType.forEach((p_228347_1_, p_228347_2_) -> this.tickParticleList(p_228347_2_)); + + Particle particle; + if (queue.isEmpty()) + return; + while ((particle = this.queue.poll()) != null) + this.byType.computeIfAbsent(particle.getRenderType(), $ -> EvictingQueue.create(16384)) + .add(particle); + } + + private void tickParticleList(Collection p_187240_1_) { + if (p_187240_1_.isEmpty()) + return; + + Iterator iterator = p_187240_1_.iterator(); + while (iterator.hasNext()) { + Particle particle = iterator.next(); + particle.tick(); + if (!particle.isAlive()) + iterator.remove(); + } + } + + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_) { + Minecraft mc = Minecraft.getInstance(); + LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager(); + float p_228345_5_ = mc.getRenderPartialTicks(); + + p_228345_3_.enableLightmap(); + Runnable enable = () -> { + RenderSystem.enableAlphaTest(); + RenderSystem.defaultAlphaFunc(); + RenderSystem.enableDepthTest(); + RenderSystem.enableFog(); + }; + RenderSystem.pushMatrix(); + RenderSystem.multMatrix(ms.peek() + .getModel()); + + for (IParticleRenderType iparticlerendertype : this.byType.keySet()) { // Forge: allow custom + // IParticleRenderType's + if (iparticlerendertype == IParticleRenderType.NO_RENDER) + continue; + enable.run(); // Forge: MC-168672 Make sure all render types have the correct GL state. + Iterable iterable = this.byType.get(iparticlerendertype); + if (iterable != null) { + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuffer(); + iparticlerendertype.beginRender(bufferbuilder, mc.textureManager); + + for (Particle particle : iterable) + particle.buildGeometry(bufferbuilder, p_228345_4_, p_228345_5_); + + iparticlerendertype.finishRender(tessellator); + } + } + + RenderSystem.popMatrix(); + RenderSystem.depthMask(true); + RenderSystem.disableBlend(); + RenderSystem.defaultAlphaFunc(); + p_228345_3_.disableLightmap(); + RenderSystem.disableFog(); + } + + public void clearEffects() { + this.byType.clear(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Select.java b/src/main/java/com/simibubi/create/foundation/ponder/Select.java new file mode 100644 index 000000000..869482b0f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/Select.java @@ -0,0 +1,167 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; + +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; +import com.simibubi.create.foundation.utility.outliner.Outliner; + +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public abstract class Select implements Predicate { + + public static Select cuboid(BlockPos origin, Vec3i size) { + return new Cuboid(origin, size); + } + + public static Select pos(int x, int y, int z) { + return new Cuboid(new BlockPos(x, y, z), BlockPos.ZERO); + } + + public static Select fromTo(int x, int y, int z, int x2, int y2, int z2) { + return new Cuboid(new BlockPos(x, y, z), new BlockPos(x2 - x, y2 - y, z2 - z)); + } + + public static Select everything(MutableBoundingBox bounds) { + return cuboid(BlockPos.ZERO, bounds.getLength()); + } + + public static Select compound(Select... other) { + return new Compound(other); + } + + public static Select column(MutableBoundingBox bounds, int x, int z) { + return cuboid(new BlockPos(x, 1, z), new Vec3i(0, bounds.getYSize(), 0)); + } + + public static Select layer(MutableBoundingBox bounds, int y, int height) { + return cuboid(new BlockPos(0, y, 0), + new Vec3i(bounds.getXSize(), Math.min(bounds.getYSize() - y, height) - 1, bounds.getZSize())); + } + + // + + public WorldSectionElement asElement() { + return new WorldSectionElement(this); + } + + // + + @Override + public abstract int hashCode(); + + public abstract Stream all(); + + public abstract Vec3d getCenter(); + + public abstract OutlineParams makeOutline(Outliner outliner); + + private static class Compound extends Select { + + private Select[] parts; + private int hash; + private Vec3d center; + private Set cluster; + + public Compound(Select... parts) { + this.parts = parts; + if (parts.length == 0) + throw new IllegalArgumentException("Cannot instantiate Compound Select with zero parts"); + + cluster = new HashSet<>(); + parts[0].all() + .map(BlockPos::toImmutable) + .forEach(cluster::add); + hash = parts[0].hashCode(); + center = parts[0].getCenter() + .scale(1f / parts.length); + for (int i = 1; i < parts.length; i++) { + Select select = parts[i]; + select.all() + .map(BlockPos::toImmutable) + .forEach(cluster::add); + hash = hash ^ select.hashCode(); + center = center.add(select.getCenter() + .scale(1f / parts.length)); + } + } + + @Override + public boolean test(BlockPos t) { + for (Select select : parts) + if (select.test(t)) + return true; + return false; + } + + @Override + public int hashCode() { + return hash; + } + + @Override + public Stream all() { + return cluster.stream(); + } + + @Override + public Vec3d getCenter() { + return center; + } + + @Override + public OutlineParams makeOutline(Outliner outliner) { + return outliner.showCluster(this, cluster); + } + + } + + private static class Cuboid extends Select { + + MutableBoundingBox bb; + Vec3i origin; + Vec3i size; + + public Cuboid(BlockPos origin, Vec3i size) { + bb = new MutableBoundingBox(origin, origin.add(size)); + this.origin = origin; + this.size = size; + } + + @Override + public boolean test(BlockPos t) { + return bb.isVecInside(t); + } + + @Override + public Stream all() { + return BlockPos.func_229383_a_(bb); + } + + @Override + public int hashCode() { + return origin.hashCode() ^ size.hashCode(); + } + + @Override + public Vec3d getCenter() { + return new AxisAlignedBB(new BlockPos(origin), new BlockPos(origin).add(size) + .add(1, 1, 1)).getCenter(); + } + + @Override + public OutlineParams makeOutline(Outliner outliner) { + return outliner.showAABB(this, new AxisAlignedBB(new BlockPos(origin), new BlockPos(origin).add(size) + .add(1, 1, 1))); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java new file mode 100644 index 000000000..921db2309 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java @@ -0,0 +1,42 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.foundation.ponder.PonderStoryBoard; +import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class CogwheelStory extends PonderStoryBoard { + + public CogwheelStory() { + } + + @Override + public String getSchematicName() { + return "cogwheel/first"; + } + + @Override + public String getStoryTitle() { + return "My First Ponder Story, Parrots"; + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + + scene.movePOI(new Vec3d(3.5, 4, 4.5)); + scene.showBasePlate(); + scene.idle(10); + + scene.createParrotSpinningOn(new BlockPos(1, 4, 2), Direction.DOWN); + scene.showSection(util.layersFrom(1), Direction.DOWN); + + scene.idle(10); + scene.rotateCameraY(180); + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java new file mode 100644 index 000000000..2d3327ba5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -0,0 +1,198 @@ +package com.simibubi.create.foundation.ponder.content; + +import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; +import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.PonderStoryBoard; +import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.tterrag.registrate.util.entry.ItemEntry; + +import net.minecraft.block.Blocks; +import net.minecraft.item.Item; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; + +public abstract class DebugScenes extends PonderStoryBoard { + + private int index; + + public static void registerAll() { + ItemEntry item = AllItems.BRASS_HAND; + int i = 0; + PonderRegistry.addStoryBoard(item, new CoordinateScene(++i)); + PonderRegistry.addStoryBoard(item, new BlocksScene(++i)); + PonderRegistry.addStoryBoard(item, new FluidsScene(++i)); + PonderRegistry.addStoryBoard(item, new OffScreenScene(++i)); + PonderRegistry.addStoryBoard(item, new ParticlesScene(++i)); + } + + public DebugScenes(int index) { + this.index = index; + } + + @Override + public final String getSchematicName() { + return "debug/scene_" + index; + } + + @Override + public String getStoryTitle() { + return "Debug Scene " + index + (getTitle().isEmpty() ? "" : ": " + getTitle()); + } + + protected String getTitle() { + return ""; + } + + static class CoordinateScene extends DebugScenes { + + public CoordinateScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + scene.idle(10); + scene.showSection(util.layersFrom(1), Direction.DOWN); +// scene.showTargetedText(WHITE, new Vec3d(1.5, 1.5, 1.5), "coordinate", "Schematic orientation: ", 40); + + scene.idle(10); + scene.showSelectionWithText(PonderPalette.RED, Select.fromTo(2, 1, 1, 4, 1, 1), "x", "Das X axis", 20); + scene.idle(20); + scene.showSelectionWithText(PonderPalette.GREEN, Select.fromTo(1, 2, 1, 1, 4, 1), "y", "Das Y axis", 20); + scene.idle(20); + scene.showSelectionWithText(PonderPalette.BLUE, Select.fromTo(1, 1, 2, 1, 1, 4), "z", "Das Z axis", 20); + scene.idle(10); + } + + @Override + protected String getTitle() { + return "Coordinate Space"; + } + + } + + static class BlocksScene extends DebugScenes { + + public BlocksScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + scene.idle(10); + scene.showSection(util.layersFrom(1), Direction.DOWN); + scene.idle(10); + scene.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000); + scene.idle(20); + scene.replaceBlocks(Select.fromTo(1, 1, 2, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState()); + scene.idle(10); + scene.replaceBlocks(Select.pos(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState()); + scene.markAsFinished(); + } + + @Override + protected String getTitle() { + return "Changing Blocks"; + } + + } + + static class FluidsScene extends DebugScenes { + + public FluidsScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + scene.idle(10); + scene.showSection(util.layersFrom(1), Direction.DOWN); + scene.showTargetedText(WHITE, new Vec3d(1, 2.5, 4.5), "fluids", "Fluid rendering test.", 1000); + scene.markAsFinished(); + } + + @Override + protected String getTitle() { + return "Showing Fluids"; + } + + } + + static class ParticlesScene extends DebugScenes { + + public ParticlesScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + scene.idle(10); + scene.showSection(util.layersFrom(1), Direction.DOWN); + scene.idle(10); + + Vec3d emitterPos = util.vector(2.5, 2.25, 2.5); + Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector(0, .1, 0)); + Emitter rotation = + Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), + util.vector(0, .1, 0)); + + scene.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20); + scene.idle(30); + scene.addInstruction(new EmitParticlesInstruction(emitterPos, emitter, 1, 60)); + scene.addInstruction(new EmitParticlesInstruction(emitterPos, rotation, 20, 1)); + scene.idle(30); + scene.rotateCameraY(180); + } + + @Override + protected String getTitle() { + return "Emitting particles"; + } + + } + + static class OffScreenScene extends DebugScenes { + + public OffScreenScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.configureBasePlate(1, 0, 6); + scene.showBasePlate(); + Select out1 = Select.fromTo(7, 0, 0, 8, 0, 5); + Select out2 = Select.fromTo(0, 0, 0, 0, 0, 5); + scene.idle(10); + scene.showSection(Select.compound(util.layersFrom(1), out1, out2), Direction.DOWN); + scene.idle(10); + + scene.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", + "Blocks outside of the base plate do not affect scaling", 100); + scene.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate", + "configureBasePlate() makes sure of that.", 100); + scene.markAsFinished(); + } + + @Override + protected String getTitle() { + return "Out of bounds / configureBasePlate"; + } + + } + +} 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 new file mode 100644 index 000000000..4a560622f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.ponder.PonderRegistry; + +public class PonderIndex { + + /** + * When true, lang files are bypassed and any text in ponder can be hot-swapped + * without the need of runData + */ + public static final boolean EDITOR_MODE = true; + + public static void register() { + // Register storyboards here (Requires re-launch) + + PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); + + PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftAsRelay()); + PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftsCanBeEncased()); + + DebugScenes.registerAll(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java new file mode 100644 index 000000000..ede4108ed --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderPalette.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.ponder.content; + +public enum PonderPalette { + + WHITE(0xFF_eeeeee), + BLACK(0xFF_221111), + + RED(0xFF_ff5d6c), + GREEN(0xFF_8cba51), + BLUE(0xFF_5f6caf), + + SLOW(0xFF_22ff22), + MEDIUM(0xFF_0084ff), + FAST(0xFF_ff55ff), + + ; + + private int color; + + private PonderPalette(int color) { + this.color = color; + } + + public int getColor() { + return color; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java new file mode 100644 index 000000000..90f5fa097 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java @@ -0,0 +1,54 @@ +package com.simibubi.create.foundation.ponder.content; + +import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; + +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.PonderStoryBoard; +import com.simibubi.create.foundation.ponder.Select; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +class ShaftAsRelay extends PonderStoryBoard { + + @Override + public String getSchematicName() { + return "shaft/shaft"; + } + + @Override + public String getStoryTitle() { + return "Relaying rotational force using Shafts"; + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + + Select encased = util.column(4, 2); + Select gauge = util.column(0, 2); + Select shafts = Select.cuboid(new BlockPos(1, 1, 2), new Vec3i(2, 0, 0)); + + scene.idle(10); + scene.showSection(encased, Direction.DOWN); + scene.idle(10); + scene.showSection(gauge, Direction.DOWN); + scene.setKineticSpeed(gauge, 0); + + scene.idle(20); + scene.showSection(shafts, Direction.DOWN); + scene.setKineticSpeed(gauge, -112); + + scene.idle(10); + scene.showTargetedText(WHITE, new Vec3d(3, 1.5, 2.5), "shaft_relay", + "Shafts seem to relay rotation in a straight line.", 1000); + + scene.idle(20); + scene.markAsFinished(); + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java new file mode 100644 index 000000000..a93b98143 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java @@ -0,0 +1,55 @@ +package com.simibubi.create.foundation.ponder.content; + +import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.PonderStoryBoard; +import com.simibubi.create.foundation.ponder.Select; + +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +class ShaftsCanBeEncased extends PonderStoryBoard { + + @Override + public String getSchematicName() { + return "shaft/encasing_shafts"; + } + + @Override + public String getStoryTitle() { + return "Encasing Shafts"; + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + + Select shaft = Select.cuboid(new BlockPos(0, 1, 2), new Vec3i(4, 0, 2)); + Select andesite = Select.pos(3, 1, 2); + Select brass = Select.pos(1, 1, 2); + + scene.showSection(shaft, Direction.DOWN); + scene.idle(20); + + scene.setBlocks(andesite, AllBlocks.ANDESITE_ENCASED_SHAFT.getDefaultState() + .with(EncasedShaftBlock.AXIS, Axis.X)); + scene.setKineticSpeed(shaft, -112); + scene.idle(10); + + scene.setBlocks(brass, AllBlocks.BRASS_ENCASED_SHAFT.getDefaultState() + .with(EncasedShaftBlock.AXIS, Axis.X)); + scene.setKineticSpeed(shaft, -112); + + scene.idle(10); + scene.showTargetedText(WHITE, new Vec3d(1.5, 2, 2.5), "shaft_can_be_encased", + "I could use Brass or Andesite Casing to hide them.", 1000); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java new file mode 100644 index 000000000..c0c449599 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.foundation.ponder.PonderLocalization; + +public class SharedText { + + public static void gatherText() { + // Add entries used across several ponder scenes (Safe for hotswap) + + add("when_wrenched", "When Wrenched"); + add("more_shared", "This is Shared stuff"); + + } + + public static String get(String key) { + return PonderLocalization.getShared(key); + } + + private static void add(String k, String v) { + PonderLocalization.registerShared(k, v); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java new file mode 100644 index 000000000..ef2950bf0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java @@ -0,0 +1,29 @@ +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.PonderUI; +import com.simibubi.create.foundation.utility.LerpedFloat; + +public abstract class AnimatedOverlayElement extends PonderOverlayElement { + + protected LerpedFloat fade; + + public AnimatedOverlayElement() { + fade = LerpedFloat.linear() + .startWithValue(0); + } + + public void setFade(float fade) { + this.fade.setValue(fade); + } + + @Override + public final void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks) { + float currentFade = fade.getValue(partialTicks); + render(scene, screen, ms, partialTicks, currentFade); + } + + protected abstract void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade); + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java new file mode 100644 index 000000000..61326ecba --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java @@ -0,0 +1,80 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.math.Vec3d; + +public abstract class AnimatedSceneElement extends PonderSceneElement { + + protected Vec3d fadeVec; + protected LerpedFloat fade; + + public AnimatedSceneElement() { + fade = LerpedFloat.linear() + .startWithValue(0); + } + + public void setFade(float fade) { + this.fade.setValue(fade); + } + + public void setFadeVec(Vec3d fadeVec) { + this.fadeVec = fadeVec; + } + + @Override + public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { + ms.push(); + float currentFade = applyFade(ms); + renderFirst(world, buffer, ms, currentFade); + ms.pop(); + } + + @Override + public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) { + ms.push(); + float currentFade = applyFade(ms); + renderLayer(world, buffer, type, ms, currentFade); + ms.pop(); + } + + @Override + public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { + ms.push(); + float currentFade = applyFade(ms); + renderLast(world, buffer, ms, currentFade); + ms.pop(); + } + + protected float applyFade(MatrixStack ms) { + float currentFade = fade.getValue(Minecraft.getInstance() + .getRenderPartialTicks()); + if (fadeVec != null) + MatrixStacker.of(ms) + .translate(fadeVec.scale(-1 + currentFade)); + return currentFade; + } + + protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, + float fade) {} + + protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} + + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} + + protected int lightCoordsFromFade(float fade) { + int light = 0xF000F0; + if (fade != 1) { + light = (int) (0xF * fade); + light = light << 4 | light << 20; + } + return light; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java new file mode 100644 index 000000000..087190cf8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.ponder.elements; + +import java.util.function.Consumer; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.utility.outliner.Outliner; + +public class OutlinerElement extends AnimatedSceneElement { + + private Consumer outlinerCall; + + public OutlinerElement(Consumer outlinerCall) { + this.outlinerCall = outlinerCall; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (fade.getValue() < 1/16f) + return; + if (fade.getValue(0) > fade.getValue(1)) + return; + outlinerCall.accept(scene.getOutliner()); + } + +} 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 new file mode 100644 index 000000000..428274395 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java @@ -0,0 +1,119 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.Create; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.MatrixStacker; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.command.arguments.EntityAnchorArgument; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.ParrotEntity; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +public class ParrotElement extends AnimatedSceneElement { + + private Vec3d location; + private ParrotEntity entity; + private ParrotPose pose; + + public static ParrotElement lookAtPOI(Vec3d location) { + ParrotElement parrotElement = new ParrotElement(location); + parrotElement.pose = parrotElement.new FacePointOfInterestPose(); + return parrotElement; + } + + public static ParrotElement spinOnComponent(Vec3d location, BlockPos componentPos) { + ParrotElement parrotElement = new ParrotElement(location); + parrotElement.pose = parrotElement.new SpinOnComponentPose(componentPos); + return parrotElement; + } + + protected ParrotElement(Vec3d location) { + this.location = location; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (entity == null) + return; + + entity.ticksExisted++; + entity.prevRotationYawHead = entity.rotationYawHead; + entity.oFlapSpeed = entity.flapSpeed; + entity.oFlap = entity.flap; + entity.onGround = true; + + pose.tick(scene); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + EntityRendererManager entityrenderermanager = Minecraft.getInstance() + .getRenderManager(); + float pt = Minecraft.getInstance() + .getRenderPartialTicks(); + + if (entity == null) + pose.create(world); + + ms.push(); + ms.translate(location.x, location.y, location.z); + + MatrixStacker.of(ms) + .rotateY(MathHelper.lerp(pt, entity.prevRotationYaw, entity.rotationYaw)); + + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); + ms.pop(); + } + + abstract class ParrotPose { + + abstract void tick(PonderScene scene); + + void create(PonderWorld world) { + entity = new ParrotEntity(EntityType.PARROT, world); + entity.setVariant(Create.random.nextInt(5)); + } + + } + + class SpinOnComponentPose extends ParrotPose { + + private BlockPos componentPos; + + public SpinOnComponentPose(BlockPos componentPos) { + this.componentPos = componentPos; + } + + @Override + void tick(PonderScene scene) { + TileEntity tileEntity = scene.getWorld() + .getTileEntity(componentPos); + if (!(tileEntity instanceof KineticTileEntity)) + return; + float rpm = ((KineticTileEntity) tileEntity).getSpeed(); + entity.prevRotationYaw = entity.rotationYaw; + entity.rotationYaw += (rpm * .3f); + } + + } + + class FacePointOfInterestPose extends ParrotPose { + + @Override + void tick(PonderScene scene) { + entity.lookAt(EntityAnchorArgument.Type.EYES, scene.getPointOfInterest()); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java new file mode 100644 index 000000000..89db05a60 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderOverlayElement.java @@ -0,0 +1,14 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderElement; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderUI; + +public abstract class PonderOverlayElement extends PonderElement { + + public void tick(PonderScene scene) {} + + public abstract void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks); + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java new file mode 100644 index 000000000..e07338444 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderElement; +import com.simibubi.create.foundation.ponder.PonderWorld; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; + +public abstract class PonderSceneElement extends PonderElement { + + public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + + public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms); + + public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + +} 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 new file mode 100644 index 000000000..cab914bf0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -0,0 +1,89 @@ +package com.simibubi.create.foundation.ponder.elements; + +import java.util.List; +import java.util.function.Supplier; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.utility.ColorHelper; + +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.fml.client.gui.GuiUtils; + +public class TextWindowElement extends AnimatedOverlayElement { + + Supplier textGetter; + String bakedText; + + // from 0 to 200 + int y; + + Vec3d vec; + int color; + + public TextWindowElement(Supplier textGetter) { + this.textGetter = textGetter; + } + + public void colored(int color) { + this.color = color; + } + + public TextWindowElement pointAt(Vec3d vec) { + this.vec = vec; + return this; + } + + public TextWindowElement setY(int y) { + this.y = y; + return this; + } + + @Override + protected void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade) { + if (bakedText == null) + bakedText = textGetter.get(); + if (fade < 1 / 16f) + return; + Vec2f sceneToScreen = vec != null ? scene.getTransform() + .sceneToScreen(vec) : new Vec2f(0, (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)); + int textWidth = screen.width - targetX; + + List list = screen.getFontRenderer() + .listFormattedStringToWidth(bakedText, textWidth); + int boxWidth = 0; + for (String string : list) + boxWidth = Math.max(boxWidth, screen.getFontRenderer() + .getStringWidth(string)); + int boxHeight = screen.getFontRenderer() + .getWordWrappedHeight(bakedText, textWidth); + + RenderSystem.pushMatrix(); + RenderSystem.translatef(0, sceneToScreen.y, 400); + + PonderUI.renderBox(targetX - 10, 3, boxWidth, boxHeight - 1, 0xaa000000, 0x30eebb00, 0x10eebb00); + + int brighterColor = ColorHelper.mixAlphaColors(color, 0xFFffffdd, 1 / 2f); + if (vec != null) { + RenderSystem.pushMatrix(); + RenderSystem.translatef(sceneToScreen.x, 0, 0); + double lineTarget = (targetX - sceneToScreen.x) * fade; + RenderSystem.scaled(lineTarget, 1, 1); + GuiUtils.drawGradientRect(-100, 0, 0, 1, 1, brighterColor, brighterColor); + GuiUtils.drawGradientRect(-100, 0, 1, 1, 2, 0xFF494949, 0xFF393939); + RenderSystem.popMatrix(); + } + + screen.getFontRenderer() + .drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(brighterColor, fade)); + RenderSystem.popMatrix(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java similarity index 61% rename from src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java rename to src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index c3f867a6b..4114ba1a4 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc.elements; +package com.simibubi.create.foundation.ponder.elements; import java.util.ArrayList; import java.util.List; @@ -10,8 +10,9 @@ import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.metadoc.Select; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.utility.SuperByteBuffer; import com.simibubi.create.foundation.utility.SuperByteBufferCache; import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; @@ -19,6 +20,7 @@ import com.simibubi.create.foundation.utility.TileEntityRenderHelper; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelRenderer; import net.minecraft.client.renderer.BlockRendererDispatcher; @@ -26,9 +28,9 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; -import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.fluid.IFluidState; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; @@ -47,11 +49,11 @@ public class WorldSectionElement extends AnimatedSceneElement { this.section = section; } - public void queueRedraw(MetaDocWorld world) { + public void queueRedraw(PonderWorld world) { redraw = true; } - public void tick() { + public void tick(PonderScene scene) { if (renderedTileEntities == null) return; renderedTileEntities.forEach(te -> { @@ -61,7 +63,13 @@ public class WorldSectionElement extends AnimatedSceneElement { } @Override - public void render(MetaDocWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, + float fade) { + renderStructure(world, ms, buffer, type, fade); + } + + @Override + public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { int light = -1; if (fade != 1) light = (int) (MathHelper.lerp(fade, 5, 14)); @@ -71,36 +79,33 @@ public class WorldSectionElement extends AnimatedSceneElement { world.pushFakeLight(light); renderTileEntities(world, ms, buffer); world.popLight(); + } - if (buffer instanceof IRenderTypeBuffer.Impl) - ((IRenderTypeBuffer.Impl) buffer).draw(); - renderStructure(world, ms, buffer, fade); + protected void renderStructure(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, RenderType type, + float fade) { + SuperByteBufferCache bufferCache = CreateClient.bufferCache; + int code = hashCode() ^ world.hashCode(); + + Pair key = Pair.of(code, RenderType.getBlockLayers() + .indexOf(type)); + if (redraw) + bufferCache.invalidate(DOC_WORLD_SECTION, key); + SuperByteBuffer contraptionBuffer = + bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, type)); + if (contraptionBuffer.isEmpty()) + return; + + int light = lightCoordsFromFade(fade); + contraptionBuffer.light(light) + .renderInto(ms, buffer.getBuffer(type)); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { redraw = false; } - protected void renderStructure(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float fade) { - SuperByteBufferCache bufferCache = CreateClient.bufferCache; - List blockLayers = RenderType.getBlockLayers(); - int code = hashCode() ^ world.hashCode(); - - buffer.getBuffer(RenderType.getSolid()); - for (int i = 0; i < blockLayers.size(); i++) { - RenderType layer = blockLayers.get(i); - Pair key = Pair.of(code, i); - if (redraw) - bufferCache.invalidate(DOC_WORLD_SECTION, key); - SuperByteBuffer contraptionBuffer = - bufferCache.get(DOC_WORLD_SECTION, key, () -> buildStructureBuffer(world, layer)); - if (contraptionBuffer.isEmpty()) - continue; - - int light = lightCoordsFromFade(fade); - contraptionBuffer.light(light) - .renderInto(ms, buffer.getBuffer(layer)); - } - } - - private void renderTileEntities(MetaDocWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { + private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { if (renderedTileEntities == null) { renderedTileEntities = new ArrayList<>(); section.all() @@ -113,7 +118,7 @@ public class WorldSectionElement extends AnimatedSceneElement { TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer); } - private SuperByteBuffer buildStructureBuffer(MetaDocWorld world, RenderType layer) { + private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { ForgeHooksClient.setRenderLayer(layer); MatrixStack ms = new MatrixStack(); BlockRendererDispatcher dispatcher = Minecraft.getInstance() @@ -127,16 +132,19 @@ public class WorldSectionElement extends AnimatedSceneElement { section.all() .forEach(pos -> { BlockState state = world.getBlockState(pos); - if (state.getRenderType() == BlockRenderType.ENTITYBLOCK_ANIMATED) - return; - if (!RenderTypeLookup.canRenderInLayer(state, layer)) - return; + IFluidState ifluidstate = world.getFluidState(pos); - IBakedModel originalModel = dispatcher.getModelForState(state); ms.push(); ms.translate(pos.getX(), pos.getY(), pos.getZ()); - blockRenderer.renderModel(world, originalModel, state, pos, ms, builder, true, random, 42, - OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + + if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR + && RenderTypeLookup.canRenderInLayer(state, layer)) + blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, + random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + + if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) + dispatcher.renderFluid(pos, world, builder, ifluidstate); + ms.pop(); }); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java index b279103a5..7d400aa2d 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/CreateParrotInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DelayInstruction.java similarity index 67% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/DelayInstruction.java index a44bed1fb..0965aa74b 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DelayInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DelayInstruction.java @@ -1,4 +1,4 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; public class DelayInstruction extends TickingInstruction { diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java similarity index 68% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java index b1116ff0c..f7532c299 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/DisplayWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java @@ -1,6 +1,6 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java new file mode 100644 index 000000000..7c1d0197c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java @@ -0,0 +1,50 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.ParticleManager; +import net.minecraft.particles.IParticleData; +import net.minecraft.util.math.Vec3d; + +public class EmitParticlesInstruction extends TickingInstruction { + + private Vec3d anchor; + private Emitter emitter; + private float runsPerTick; + + @FunctionalInterface + public static interface Emitter { + + public static Emitter simple(T data, Vec3d motion) { + return (w, x, y, z) -> w.addParticle(data, x, y, z, motion.x, motion.y, motion.z); + } + + static ParticleManager paticleManager() { + return Minecraft.getInstance().particles; + } + + public void create(PonderWorld world, double x, double y, double z); + + } + + public EmitParticlesInstruction(Vec3d anchor, Emitter emitter, float runsPerTick, int ticks) { + super(false, ticks); + this.anchor = anchor; + this.emitter = emitter; + this.runsPerTick = runsPerTick; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + int runs = (int) runsPerTick; + if (Create.random.nextFloat() < (runsPerTick - runs)) + runs++; + for (int i = 0; i < runs; i++) + emitter.create(scene.getWorld(), anchor.x, anchor.y, anchor.z); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java similarity index 72% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index d37ab5296..49e0b402a 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -1,7 +1,7 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.elements.AnimatedSceneElement; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; @@ -18,7 +18,7 @@ public class FadeIntoSceneInstruction extends Ti } @Override - protected void firstTick(MetaDocScene scene) { + protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.addElement(element); element.setFade(0); @@ -26,7 +26,7 @@ public class FadeIntoSceneInstruction extends Ti } @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { super.tick(scene); float fade = (remainingTicks / (float) totalTicks); element.setFade(1 - fade * fade); diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java similarity index 77% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java index ce2941c0d..4849d2a64 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/HideAllInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HideAllInstruction.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.elements.AnimatedOverlayElement; -import com.simibubi.create.foundation.metadoc.elements.AnimatedSceneElement; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.elements.AnimatedOverlayElement; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; @@ -17,7 +17,7 @@ public class HideAllInstruction extends TickingInstruction { } @Override - protected void firstTick(MetaDocScene scene) { + protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.getElements() .forEach(element -> { @@ -35,7 +35,7 @@ public class HideAllInstruction extends TickingInstruction { } @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { super.tick(scene); float fade = (remainingTicks / (float) totalTicks); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java new file mode 100644 index 000000000..ecaf7b30d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; + +public class MarkAsFinishedInstruction extends PonderInstruction { + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + scene.finished = true; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java new file mode 100644 index 000000000..7209eda0f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MovePoiInstruction.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; + +import net.minecraft.util.math.Vec3d; + +public class MovePoiInstruction extends PonderInstruction { + + private Vec3d poi; + + public MovePoiInstruction(Vec3d poi) { + this.poi = poi; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + scene.setPointOfInterest(poi); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java similarity index 55% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index 7812fff46..c723b4d93 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -1,8 +1,8 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.metadoc.Select; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.ponder.Select; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -19,15 +19,17 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { } @Override - protected void runModification(Select selection, MetaDocScene scene) { - MetaDocWorld world = scene.getWorld(); + protected void runModification(Select selection, PonderScene scene) { + PonderWorld world = scene.getWorld(); selection.all() .forEach(pos -> { if (!world.getBounds() .isVecInside(pos)) return; - if (!replaceAir && world.getBlockState(pos) == Blocks.AIR.getDefaultState()) + BlockState prevState = world.getBlockState(pos); + if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) return; + world.addBlockDestroyEffects(pos, prevState); world.setBlockState(pos, stateToUse); }); } diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java similarity index 65% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java index 57075f101..04c49d793 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/RotateSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java @@ -1,11 +1,11 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocScene.SceneTransform; +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; -public class RotateSceneInstruction extends MetaDocInstruction { +public class RotateSceneInstruction extends PonderInstruction { private float xRot; private float yRot; @@ -23,7 +23,7 @@ public class RotateSceneInstruction extends MetaDocInstruction { } @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { SceneTransform transform = scene.getTransform(); float targetX = relative ? transform.xRotation.getChaseTarget() + xRot : xRot; float targetY = relative ? transform.yRotation.getChaseTarget() + yRot : yRot; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java new file mode 100644 index 000000000..0368437c3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java @@ -0,0 +1,20 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.Select; + +public class ShowCompleteSchematicInstruction extends PonderInstruction { + + @Override + public void tick(PonderScene scene) { + scene.addElement(Select.everything(scene.getBounds()) + .asElement()); + } + + @Override + public boolean isComplete() { + return true; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java new file mode 100644 index 000000000..ca81f4bb6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -0,0 +1,84 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import java.util.function.Supplier; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.elements.OutlinerElement; +import com.simibubi.create.foundation.ponder.elements.TextWindowElement; + +import net.minecraft.util.math.Vec3d; + +public class TextInstruction extends TickingInstruction { + + private TextWindowElement element; + private OutlinerElement outline; + private static final int fadeTime = 5; + + protected TextInstruction(int color, Supplier text, int duration) { + super(false, duration + 2 * fadeTime); + } + + public TextInstruction(int color, Supplier text, int duration, Select selection) { + this(color, text, duration); + element = new TextWindowElement(text).pointAt(selection.getCenter()); + element.colored(color); + outline = new OutlinerElement(o -> selection.makeOutline(o) + .lineWidth(1 / 16f) + .colored(color)); + } + + public TextInstruction(int color, Supplier text, int duration, Vec3d position) { + this(color, text, duration); + element = new TextWindowElement(text).pointAt(position); + element.colored(color); + } + + public TextInstruction(int color, Supplier text, int duration, int y) { + this(color, text, duration); + element = new TextWindowElement(text).setY(y); + element.colored(color); + } + + @Override + protected void firstTick(PonderScene scene) { + super.firstTick(scene); + scene.addElement(element); + element.setVisible(true); + element.setFade(0); + if (outline != null) { + scene.addElement(outline); + outline.setFade(1); + outline.setVisible(true); + } + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + int elapsed = totalTicks - remainingTicks; + + if (elapsed < fadeTime) { + float fade = (elapsed / (float) fadeTime); + element.setFade(fade * fade); + + } else if (remainingTicks < fadeTime) { + float fade = (remainingTicks / (float) fadeTime); + element.setFade(fade * fade); + + } else + element.setFade(1); + + if (remainingTicks == 0) { + element.setFade(0); + element.setFade(0); + element.setVisible(false); + if (outline != null) { + outline.setFade(0); + outline.setVisible(false); + } + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java similarity index 58% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java index eae1b3f41..aed61a680 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TickingInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java @@ -1,9 +1,9 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; -import com.simibubi.create.foundation.metadoc.MetaDocInstruction; -import com.simibubi.create.foundation.metadoc.MetaDocScene; +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; -public abstract class TickingInstruction extends MetaDocInstruction { +public abstract class TickingInstruction extends PonderInstruction { private boolean blocking; protected int totalTicks; @@ -15,15 +15,15 @@ public abstract class TickingInstruction extends MetaDocInstruction { } @Override - public void reset(MetaDocScene scene) { + public void reset(PonderScene scene) { super.reset(scene); remainingTicks = totalTicks; } - protected void firstTick(MetaDocScene scene) {} + protected void firstTick(PonderScene scene) {} @Override - public void tick(MetaDocScene scene) { + public void tick(PonderScene scene) { if (remainingTicks == totalTicks) firstTick(scene); if (remainingTicks > 0) diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java similarity index 76% rename from src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java rename to src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java index 070af58b6..efcae7a9e 100644 --- a/src/main/java/com/simibubi/create/foundation/metadoc/instructions/TileEntityDataInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java @@ -1,10 +1,10 @@ -package com.simibubi.create.foundation.metadoc.instructions; +package com.simibubi.create.foundation.ponder.instructions; import java.util.function.UnaryOperator; -import com.simibubi.create.foundation.metadoc.MetaDocScene; -import com.simibubi.create.foundation.metadoc.MetaDocWorld; -import com.simibubi.create.foundation.metadoc.Select; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.ponder.Select; import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import net.minecraft.nbt.CompoundNBT; @@ -25,8 +25,8 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { } @Override - protected void runModification(Select selection, MetaDocScene scene) { - MetaDocWorld world = scene.getWorld(); + protected void runModification(Select selection, PonderScene scene) { + PonderWorld world = scene.getWorld(); selection.all() .forEach(pos -> { if (!world.getBounds() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java new file mode 100644 index 000000000..02ab81aac --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java @@ -0,0 +1,32 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; + +public abstract class WorldModifyInstruction extends PonderInstruction { + + private Select selection; + + public WorldModifyInstruction(Select selection) { + this.selection = selection; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + runModification(selection, scene); + if (needsRedraw()) + scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); + } + + protected abstract void runModification(Select selection, PonderScene scene); + + protected abstract boolean needsRedraw(); + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java new file mode 100644 index 000000000..9ff50f0e7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -0,0 +1,136 @@ +package com.simibubi.create.foundation.ponder.ui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.settings.KeyBinding; +import net.minecraft.item.ItemStack; + +public class PonderButton extends AbstractSimiWidget { + + private AllIcons icon; + private ItemStack item; + protected boolean pressed; + private Runnable onClick; + private int xFadeModifier; + private int yFadeModifier; + private float fade; + private KeyBinding shortcut; + private LerpedFloat flash; + + public static final int SIZE = 20; + + public PonderButton(int x, int y, Runnable onClick) { + super(x, y, SIZE, SIZE); + this.onClick = onClick; + flash = LerpedFloat.linear() + .startWithValue(0); + } + + public PonderButton showing(AllIcons icon) { + this.icon = icon; + return this; + } + + public PonderButton showing(ItemStack item) { + this.item = item; + return this; + } + + public PonderButton shortcut(KeyBinding key) { + this.shortcut = key; + return this; + } + + public PonderButton fade(int xModifier, int yModifier) { + this.xFadeModifier = xModifier; + this.yFadeModifier = yModifier; + return this; + } + + public void fade(float fade) { + this.fade = fade; + } + + public void flash() { + float value = flash.getValue(); + flash.setValue(value + (1 - value) * .2f); + } + + public void dim() { + float value = flash.getValue(); + flash.setValue(value * .5f); + } + + @Override + public void renderButton(int mouseX, int mouseY, float partialTicks) { + if (!visible) + return; + if (fade < .1f) + return; + + isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height && fade > .75f; + + RenderSystem.pushMatrix(); + RenderSystem.disableDepthTest(); + if (fade < 1) + RenderSystem.translated((1 - fade) * -5 * xFadeModifier, (1 - fade) * -5 * yFadeModifier, 0); + + float flashValue = flash.getValue(partialTicks); + if (flashValue > .1f) + fade *= 3 * flashValue + (Math.sin(AnimationTickHolder.getRenderTick() / 6)) / 1f; + + int backgroundColor = ColorHelper.applyAlpha(0xdd000000, fade); + int borderColorStart = ColorHelper.applyAlpha(isHovered ? 0x70ffffff : 0x40aa9999, fade); + int borderColorEnd = ColorHelper.applyAlpha(isHovered ? 0x30ffffff : 0x20aa9999, fade); + + PonderUI.renderBox(x, y, width, height, backgroundColor, borderColorStart, borderColorEnd); + RenderSystem.translated(0, 0, 800); + + if (icon != null) { + RenderSystem.enableBlend(); + RenderSystem.color4f(1, 1, 1, fade); + icon.draw(this, x + 2, y + 2); + } + if (item != null) { + GuiGameElement.of(item) + .at(x - 2, y - 2) + .scale(1.5f) + .render(); + } + if (shortcut != null) + drawCenteredString(Minecraft.getInstance().fontRenderer, shortcut.getLocalizedName(), x + SIZE / 2 + 8, + y + SIZE - 6, ColorHelper.applyAlpha(0xff606060, fade)); + + RenderSystem.popMatrix(); + } + + public void runCallback() { + onClick.run(); + } + + @Override + public void onClick(double p_onClick_1_, double p_onClick_3_) { + super.onClick(p_onClick_1_, p_onClick_3_); + this.pressed = true; + } + + @Override + public void onRelease(double p_onRelease_1_, double p_onRelease_3_) { + super.onRelease(p_onRelease_1_, p_onRelease_3_); + this.pressed = false; + } + + public void setToolTip(String text) { + toolTip.clear(); + toolTip.add(text); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java index dbe8ffca1..e1d369fbb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ColorHelper.java @@ -30,8 +30,11 @@ public class ColorHelper { else return 255 - progress; } - + public static int applyAlpha(int color, float alpha) { + int prevAlphaChannel = (color >> 24) & 0xFF; + if (prevAlphaChannel > 0) + alpha *= prevAlphaChannel / 256f; int alphaChannel = (int) (0xFF * MathHelper.clamp(alpha, 0, 1)); return (color & 0xFFFFFF) | alphaChannel << 24; } @@ -49,9 +52,25 @@ public class ColorHelper { return color; } + public static int mixAlphaColors(int color1, int color2, float w) { + int a1 = (color1 >> 24); + int r1 = (color1 >> 16) & 0xFF; + int g1 = (color1 >> 8) & 0xFF; + int b1 = color1 & 0xFF; + int a2 = (color2 >> 24); + int r2 = (color2 >> 16) & 0xFF; + int g2 = (color2 >> 8) & 0xFF; + int b2 = color2 & 0xFF; + + int color = ((int) (a1 + (a2 - a1) * w) << 24) + ((int) (r1 + (r2 - r1) * w) << 16) + + ((int) (g1 + (g2 - g1) * w) << 8) + (int) (b1 + (b2 - b1) * w); + + return color; + } + public static void glColor(int color) { color = mixColors(color, 0xFFFFFF, .5f); - int r = (color >> 16); + int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = color & 0xFF; @@ -63,7 +82,7 @@ public class ColorHelper { } public static Vec3d getRGB(int color) { - int r = (color >> 16); + int r = (color >> 16) & 0xFF; int g = (color >> 8) & 0xFF; int b = color & 0xFF; return new Vec3d(r, g, b).scale(1 / 256d); 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 d5cac157a..61691caf0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -72,7 +72,7 @@ public class VecHelper { vec = vec.normalize(); return new Vec3d(1, 1, 1).subtract(Math.abs(vec.x), Math.abs(vec.y), Math.abs(vec.z)); } - + public static Vec3d axisAlingedPlaneOf(Direction face) { return axisAlingedPlaneOf(new Vec3d(face.getDirectionVec())); } @@ -118,6 +118,11 @@ public class VecHelper { .scale(maxLength) : vec; } + public static Vec3d lerp(float p, Vec3d from, Vec3d to) { + return from.add(from.subtract(to) + .scale(p)); + } + public static Vec3d clampComponentWise(Vec3d vec, float maxLength) { return new Vec3d(MathHelper.clamp(vec.x, -maxLength, maxLength), MathHelper.clamp(vec.y, -maxLength, maxLength), MathHelper.clamp(vec.z, -maxLength, maxLength)); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 98de531a9..aabe3062b 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -23,4 +23,7 @@ public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments # Server Tick List (For stopping placed fluids from spilling) public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet -public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet \ No newline at end of file +public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet + +# Particle Manager +public net.minecraft.client.particle.ParticleManager field_178932_g # factories \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index e305d5bf327f3e51a08b67913d965c706f64bbdc..8bc0cb6a5651c9be3005c7c353cc406b42b56589 100644 GIT binary patch literal 2598 zcmdT`i#ycY8vgyvxQ|QZHo|OjNlor;BzMVmGTMk-i*eaRluL|X7`I&Jpc;m9sZcTs znWWflr;SjVHcGCE7{g#(8e^R4?0wGp8_s&3^}Or-p6^-fdET|Y_gguqUG2q0kRkv8 zh&i0H#R34xTY`WPj0X`7UT1!=SggG@&^UNtfk)stD;FyOcw8vT3FPPTgQuO(*zs^? zW@cz;=Wj~zF7fQZAoy6^pO08*2KgS@zK z^r^G403hD*V}hUSg3@`hSO;6HGYNhS()A?db8*5|YqH_oJn#Lm|C{g znc@#|S&*ObfFwJLz*E8s=!Wq8ON{p3iMIaMdv0yWDZc5G(r!-RA+<<@3Q?)b*73OK zm&rdRwUFoTs)?G;ftg#Si_I_8NY(mriN(Ga9_wM*tH7W$i3dY(6!e;Sl z!%d^4>DD}2n@6VX$D*T$ikCxcEJQAa6}k6SJdOPGHHgS6IY+xzu}m!lr5MRHb#MO+ z4aT@=To|@626QVN~}TxSu(XhAfLa!bzTxuCmuxU}5G6-y_c0Z}ZCIU-ekyh>%<1O_aN4}WPbnvlHPnCq z40NF*C?D=MfV0xJb?N`)xykC1m)shydQzTcY4zl&k>Zo_{#Ki%^9oWP z|8v;?JvAW{Ts@W^V`Gc#J$nb`K9C&Vyjasp(|&g#&h|r^13~N&&F9I3oy-FlAo1Av zt-R9gD}gTid(0aMc)@&|*moaKiXOu~ZE-HSCF>b?&Uzn=+WA@blXZF6yV2Ti87-N1 z?`+md|D5)G#k@$Z=1phQhFYd4WctRXDFDzsU(m0KBGi@VG0xJfPZ5l}LY2b>*E1Q+ zI`kTXNy8Qb z{Sd>w9aRTTV$24o#gv0DzG&S@?SpFXAuOGp6d)}L;jK!NGRx{t#;S03r^l;n&rXER zQu4lwY=3Dg!_Pd_+zesR=dBRL@lqA72-!&5LvMAOcfQiVdZc>zT$#D_h8|1WGBz>E zzk0#L>w25&yx#Stii-<)pD&cIWPUT2`xT2;s(o#6(}JmsFiT!leKya>CA;kK%|uRQ z3k8}iaNqI1ay~+^#m9!-BST3kT&1J)jfE7u$T4Hju(AJKNx;yhdP?h645it4yw{3x z5YRcmI&5@r4dbU(zwB)Ks~5Yc6!z(@9IEk)xPau{&*EDw=@=bYKL(Ntb(b3d9+kqs zt5AuhdUP88Y8l=Kbhjj52d`qXaY<<1{pqsPSL=}%+@~)MbfJ-uGnd8g*@`6;&Z+7o9gjS^R^3LM3mOVe!IgnYVf2Wl zcz1(#P*vd<4pI(ZHL=mU>ym<#6?><^HOGD$th(wnAdncD_RP*a#o5R;X>BcQ33nmCfeHjm1d%)-oFi=~}UMP$^&lxzN zA3&!5Rwwwz)Pvu>B<|dDzY=0wdorfsi`g}>@W*?269|jiu3pAJQ`up7Mjh*-Zy$GS zsYh=zpsW}I$d#P7%ock;40LC5br!=Al{LaxVaJ#~qmtW^Z|8oEsAsmy{X(#^NJCc2 zea6@Mz3YfP&6ni-Ii9A6Oat53XbQSY)G*mH{g|{TI z+G49YDQCxT_yw}P!|c{J(#N7pXMz+(-0OACyrj7HT#b-ZvOQcd2cyq;kBoiWnE%Lu zx1d)GzHq(TkvS($yz>bYju_jNxWsJhLbQ&Nj1w@@Ot!EjtUy<#sz&hc&x6lubEM^& zM%_iVQ%xZ5?-EErzgtkhR_EFcTCOoa0zX5eSWNde zoTQYiD|7Hlh6Q?lnnM=Is4Bdx7@$OKCc)hLw95mPRRmD`%7tEJ=_8sfVh#vl+nshj zh#Bk@%QNmH8_KzQ0ZWcp%2}gFx$4^TCK}OyJgD=fKlXwdsAZ&aC}`X^3dS zO=PZ|yp3|^u1K6MNhCh_cOqwQpZ3`47y9~7AJ*Bq5mP1pFoO$LJLh1l9PneSk-&Zl zUBLpRq$MwR@@e{&+QG8_oV>i*yIk!1ByTyM2U6b<#7+@8iA$dgw+Y?a4vab4n!u39eqo2czT)>irSH^&|L z5&5Y~5q#kiTGq@%B*+#-tAv*UD z%M`wU_lLg@G?)_8Q_`JctnIv2aVZ926RD{kyDke5lDWxUO?=jolG{U&XP(6EQ9FFO z8gY==_BwZGZKwDgwPQXOLTs;ZRj7b+c*Jb%lw8FgqjRfJVr^=D1=ok^(llYNI#BWo zfkXi!j0NvW#Opyy)Po$hXb@n+yv?NR)PZ|XlsgrPxBgOdX5tPNv#QBd4}duNsSM($ zA~*^yB$tR1Yp+xyrru0^cTMId2|WNAdD^Nt^HhU?4Q77x zZQh1A|8qS*+=*vOVTb+X*>C`Gsxrhwp)LuZ@>}K4|?2;{b`E^h1Gp7nA3Aua9^yb zp^I9Qi!5p-@tik2b{#=tFCR1NErK!EO$=!H;^& zJ9MpYTvV}^tIXa{F`drj{`%(Ix3&UO;o_nnCa?N=s3PxD1b25zRboh0a;29h>#cgg zU0Gew^zvm=oj0S8R@S7!A1hCz9))#pK6@Nf`bqzgiobb4U=c7%YA ztYA`wYJ3uB5JE)z;FkpEyDXZ zd+HX~U=IO#_98719jH@svb*6)I&%x77RHjMBD-jjc}JhAb+{X!!x_qu)f2lC=0Orgy8aO#0-12?&BDxd3cZ=ozd#YNE8 zHH6w9S4neoY6<^vZ6W#K92_o|C*yR;>>;XO?c4!zo#Bo{ykSY6U zE0!q_r|n8~Uu8lv9!ZI~5$bJjv_Je^a1GXF%CXw(w}3$IqV3_YX^H=HSN3J0;3fE?s<&%nV?2;#Y>22+b!MqmL_XK$(iDuufOX33jcaMOPRaoFNcs zd# zuS=O8YTa5?g73j$AB4h^oj%0NLp{)7BgT<$Nb}F|EAmuJt-BO~d>^N$3(g`FxS6PStfYh9QI->rzbn!bdr%BLp|x?0*X@#0 zIB=C!xS0<(bEv)idxn4Jg@A?@wqs@j+uyhv-~|H zhI5PV+pl5vv;|L(S>kw$6Lyo8iGCWm*vcDcX%XFjP%gx_HljR^bcN=Mg zxh2ExD|yMEEEl%5aNR`Pi!yR$`IvFr*7gq-tgEMX8FAx5(1H6jMlIB zFE?e=T+ijx_jUW%>k$*MXbB46Q8A(jo8h%!&hEEogwswY@kC9@Hd#stZr4jBhNaQs zgwU>twY&BxX33myO5R3#yt34h#yLA^OVh#oh%H5pTKbsKv@Bsca*B**Y)RF|chK`! zg7)k@Fz-gwvpc~y!#BsCp29o}>n#c1P0gDoX%w|NCH2~5cK9YJhlNfl!#?pt;TB5H z8++Ay?U1a^hC%QguxItn;&YAH>4m*WA?&St7`-sr(woL5aCrfVY_rLt zb>Mp|lM>U;LeiKH9@gAK8Ru||)=Y z)PL$PWuM4<7A3d!NGi?G%nZ~;EpDyE*Y!z*o&qcBrpql^YFNyzWr&@-GklEFh1{U!4;Oz_l;C zP@{j(o@*}fORCC|7K%-5t4IHC%i!F~qPGZA%lEcKmt2DVbPG10&4qw*1<-&Ddgb%HZX=1 zy*Pl7k+Nmuf2v5Oi+!pSRx28kn3aY31q2Ypzf9ba9x7IRct~5bG?M>PgqrfI7I`qx znsiET@zYH1BSDzec_uJZ$nEN3E(( z$kPcNu<|mhkLVSnhKpy9qxqh@WZR2?#f$um0F3y<51B!hZgiW3b$pGj5O{lsp~Yw> zlnb4Q+V@;uV}#mHk3$cu0+F{8G*SJBo4aeGk@d-8&&;88lmY2Z3!B~OqIMonIw8xx zjSMX#)mj9P1kkA&4et&C$CR7)kf#HS29;g)A_#Z~{g zLnX_1<#>NNi9z#!oiD^}ImpfVR%jCt6S1#Tw{x-^)bM5yYqE8tXVV2@@<+=<^7|2bP_V7g)4wNFQJN=4@dGf* z-CtZ;=NEs_!&9hUicqF81Y11J;XDGX0h(HQ?gjv>W{|m2b;8aGFp`kQl{WJr(bhFD zwah@WF+=hs!hsEX>`BDctty4!$-&hRQ@+zt-s-{~ z%Wrr0KTDZA^=l)9K9Oc)tf-g%}<2;>^GmdDKb?I*sP_waHNFa@!q9 zcoNp%G;{ultKZCYe^4!6aC0n)Y=8VW+TS9d-bZ8#SxRoqA~3ZcINB9GOFSIO5TE3c zdYpR<8LtP{Q}}YZ{EDw`ik1&{b9PhB#Tb)ob%P@}-xj}1A#}XU%<<4PW5=+$JI2>& z)OoOdu>l<-tlgI4*(8kv!3qZIA^kM*l(wZfB*qzlz$V5>MQVvamI zsGootCb>uqPfA4Mf(AT;6O9mbSzSwd<-JBrY`8(szt7OK%|ll#Sz?BKd#8G#%X4$S z7KXS&@JA;XWADhmhRWyxXYgB}`1=OvshZfW;^fyHv5gKf-F@&bug0RI z+!S-k;DCI$LpNUQDtHFZ&wqnpyN&X^leSi2#`Iekp+FiJUD|p@U8uACb$9g%9!VDu zdoq-Yi>bQ<54Fk-Lm@&rCIQ>@6NLJhzU#adWFlMOqYjfi%>%E7{t)O!ayravaCU6i^&sjIi?)WxAF1u5IzhmTl|vZT_@an z$0S+ZA;Q4_)T6M|Q?7wKI~P3WVdsdga(19W(<(#6lyBSm zjtUkFE{lb-U(FvL25pq{7fWMv=KRiNV7nIj#0lC&CH0}D{dOZvPQrsTjP>Q3tesjZ zX>XVxIia}oN^m=d4pL-0HU-!!S+Bx zOM*aP-54yp^pMj)XxKFrsWOX?x!E4LKMq6h2~>VE^I(eO#B8n$xLF_>CbQ%DRuM+* zm>RNVL2TZ*yKI4*fbXw~!3wU5BSGHT$jY+zOZ*`LdHubNvJ0AzT~!T$eHwrhK(Jid z4zSRZYCu$`5x_Fn048`QpiZNgvYF@zrUAFwYHT*G=A_^cU$!PNu>-84LO{#3_Rs@w zqkMEDmtF#el}as#)(d$u*_G;K#8sEupaa5b2+mZAGWunrGgysfdS|3H97EU!^8z}D z7b!sPMqllVro|;@2#p(iHvr5j3V;hbBsuZ0a0hFDApo$Yd-qK2_-@aCb+`awJ5$Zt z%c54?h#e~C!N%J~@9!<=&IK9U&ua;R_?Ubn9JyWn;pn5*4bK*JlZ@3&+Ee`t0o+8? z>JBGo`SAA=joVPS#v-A#v({BBa9>xQCbYSZdVG|WqB1una)mz;vmhiWsPoSnrp+0- zVdIYGzzQlh++ue_++fNNZw86Hd-?HKo}e*;3_md0%2JFwl$y9X8>zU6SKSlWs03xD zM}jK-uxa?RG@_u%>DXX7ZC2a5qAg|P#`Crc-+%k|`@OLRjRjt`w?VKnbKrk z8^^L|e~37{tmdG#iZE-5l}u%rjbXpOGCDKr2*z5VIyHf)fFUCsg{e$HDn7SJ#zvbz zwDt(SA=M-j)FE1Y0sX3`+AOEt6#+|*~issQlwkP zDlstm{%nf!o6z`Y#;Q_o0Gc>y2M501qGTy+d9anm0b{j~Q^YDeHO3OhcTM}lTC;4D zd~RfFp%=zvtgcE0Stade6qw>mo3R>0@wMyw9v3wS?bQlOYl39J9p<{>l6bTH!b7_) zNvkW8Yem@Qp;4beY@Fl+G4Ly87N^;)*m)|M)Fn@JRtZcJw~x}tlWieVZa|`_){K2w z%>S#m2=vE76Jve$2}p)-avO7@$9CXPB70TcUb?4Q3M$~wXE-c7JB-P@B3HpF3Uhg9 z?|1*aic|^H==;kohWX7IU|qk=+*Dcg#SHp27r-sN-it#T027R2Re)78eAm{J(SyXLNKGXbfodK50W;Ui(r4oKLtNuRePI G&wl~&$vRO0 diff --git a/src/main/resources/doc/cogwheel/s1.nbt b/src/main/resources/doc/cogwheel/s1.nbt deleted file mode 100644 index 4aa492260c6e802598f0ab4f0bcc9350bbc987a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 540 zcmV+%0^|K3iwFP!000000KJyMZqq;zhR5FB#CDP3Ql5e*=mkY^fJ=lFfq+Z3wWsM4 zCu_W01#;@+zzcBabvSY2>W)Jlg~+x>ZOll~#>wor`TfPKO#ot$&TLQsK>ZpuV+;|l zyzvGd)D^?%BDd+nC3NvD22ohoOxl$I<-GQIH)FpiXz2+KdO`+AFgTLIQ4CH~K~GQ6 z(sQ_0$lwSDM>05y!D%XF_zD@m`Z$8YkqnMvaCS-=z68TpA4f1alEG07PE(TMOEP@* zaRh@S863snG^H566vI~^M=&^&!BMT81jOpXD^RlnF`L}f^PWuUt=oR^w#cY6NMJlg zzqaKoa@F54vvF!38hIu~X|NVUQ<#>P(F_4c{ zmk&8ij$`>a%wfB7sDEJ%W=p%`S60pJN8vvc>V@YQ818xC#-Pr4G3;+P$tq8dQ diff --git a/src/main/resources/doc/cogwheel/s2.nbt b/src/main/resources/doc/cogwheel/s2.nbt deleted file mode 100644 index e7889a802b2378bbe288f9fa797d8abf5a36a6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 420 zcmb2|=3sz;z0>Y`9X1d-?*G~Fw%-NmTJHFS>v8;!U&>P6M)JO%?whiU{qs+s(?(gE zPYu?vJI(s``*t^vd+Op8n$h-rB6*d+X-a-|bm%3NPQSjoJAzIQZ&~E!P(bOk+3SeR8!<@z&FGPw`qc z{kp=|q%W~bCA6%<`HcSJnBQ0T?_8zl{Db#Q=;VjbV))vhF5dJ?RC@7hA%#C}^3r+j J?h;%K3;@j}$B6&{ diff --git a/src/main/resources/doc/cogwheel/s3.nbt b/src/main/resources/doc/cogwheel/s3.nbt deleted file mode 100644 index b60d58b68ada73bcccf62049f528e5753266bdae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 854 zcmV-c1F8HUiwFP!000000M(eyZrVT)$H!i;V@&#SY2TyQTq+=_MT$t&C{^1_ zCvdW1l*};-=Hz{u1P&u`ECPoUIN2}>`7#OlD&sH$$0Bezfiq7jAzzG;uQCoJa4Z6c z6FAwh2>G%I`6}Zu0>>h7IDwN5PRJK0o+B~Z$G z>cjyv@Zm{EpoVS9V334(*bgF9LC4iI;}g-*jof%MnM^+F<6CW0*T;AI{C!bPrP?m` z33L78_#T{i=$tZk9-`A7>71#MLwRT2p8N&94QfpA&Q*y zOA#Hg8=efJE?Di|b~C@)PXz{SdxT)scMh5cY_{a36TM7(2cxd)rAuCkrq!9IM;NMt ze6yTR*77jW#+sZP~Ir z?XehDbm$5Pa@OY`?8Q<)%b((|@b$`yHf>&HJ16pw^=m%ibvJ{>hr|tH9ModDbbdpz zd?_%P77Kszs@ZJc?`oND%LSF43XvwA(z+nL#9>5U+occr?Y@!u5 z%duJk92UUg0UQy)sZT4QU#)w->R>143~#Y*jlXpf9hshR7t*zrlGJlZn$t0sYg zn&D-7gLM`Wh3J>Ihm$fbh^n+J#lxA_s8$q@FNqQ_w0MQy1)cE=)LGYaQRhyjQ-Jt9 zMNFZ{r+?~>jP}+jg*J*{|BP1>7c?vobCx`*TO?tp;ZaX;@1dU}5&6-G`F_9|VeQD%~nZGGcy6Xf?yT7P?4 zyze*nD@RGKq6x>#q^vj9@xq!Z+WfCVn-q-Y6rrDKDvHA-f7+=zLzxuKDau<6XsKDZZRmAC@Y_h2@1_L>3d&B@FvGa7A}LGEuTYMf`Qn)!RQ1sL>> XrI+7mK8l~z_Fwo1I8@9g(GLIsF%+TR diff --git a/src/main/resources/doc/cogwheel/s5.nbt b/src/main/resources/doc/cogwheel/s5.nbt deleted file mode 100644 index 056249163b06bf89d63030cf0b3f6666204fb0e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290 zcmV+-0p0!|iwFP!000000F9KfPQx%1MW5s6l9Ztv19QKkGczM=WYR~mNa7M3A@#%f zJ`z+%s7kDRB`b=2e3GXtc}r9g2X_%oMAO=gOHI#;O6jAEP6AD-X!F|o<|Ay!mwiS0 z>_a*D#NG+rdXLP$7q0IfH4cq?d&N9&{qNU zmGfx8!+^&Cp1D$>FP-^TvB0eLmGdy*F@Pt9fxZ~%i-Eav9tJ!H@T3@^F9YeuBB13S#Cn|sF7edT?*~kR|0Kde|7bzCIi0I$KlH`*THQXy3!;1X@^ZL*4! zHS3K+d+OW3kyGzH4llsf?8aU>0l7{ll+*Xg`WT<~lRw9sX^sT~w}X@!-|9osokPfpayAqWmda2SHa5u7lh zft;u(r@IzGa43Sq5FC!+gh3GfB8YwsaVUbr5FC!+v@J#Siz50p#GwcdLvT2P69z-{ ziy`_o#GwcdLvT2P69z~0izE6q#GwcdLvVO6Cjq)Vvx%G1D?4)`UuxqnVjwDm$ElGn z^WZ#RsccfHLiULBg>FBzq=9nar-hW+*DIg%=)_%?n~B#&<}#xM_D-Z-YcuB%ABjSw z%3i#<@=$i_-t1m01M)Jfs&7^G{mU_j(Wy1Etl#Uk!Y7TwQZ0&HPUdPUtx6M@saGa- z{|?dHs;WM@^E-FXp*z2K@w{&n`eXYcrFUfx`9I7#8Zw7;>R|V`j^m*^=r8IxgnLuR z^V{kmp_Z*W_+4#QID0kmbC?vRz469PtfiayO^>$!8b&wl zK~w@{Rrm!ny;cpL*e5eo?q8+N91y-+SU{P1+) znvfcCZVx`Jgt3>C&6l)WGnYEM6rexNvd{n#N zM73`r(-#%4>(c6|71h(Fj-FlxOng)&L>Db5?6+K)shp&Gx}Hgy@5Xu%_U_DiwHqQd z;Wi<)$&F=09=GA&H5uRZj-YnkjiN@L7ZjBKQ$5=b{Um4;4C$e;e=MwcBTcEadm!U$ N_yL(2a*?JE008JoQMdpA literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_1.nbt b/src/main/resources/ponder/debug/scene_1.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2252fa1c3b42c7abd480834a3cfa141592cff4e3 GIT binary patch literal 341 zcmV-b0jmBViwFP!000000F9N;PJ}QJho{UGVZC}VQD4Ca@a);6SJK6*&GKhMYc}!0 zd_KY0g%DtWlQg9C>(@?ZlJ1Cd67Rk(6VWize(2$wQ)Zjsg0r56$SK`dZF%s!e)5Gtkcr^z)X70gnJ4 z4R~Vi4CF3A-36%omWKh403Ho^V(tRuu7SF1pzd2920Q|I^or-|Xet|m9iE{yBY82k zrJLF{w(QJ%c=AnqD*j$7imSKd>gm%3Ta;~6cD7eW;$cqoC-#5dijT^8f5z@ctm_w- nq5Bc4T)n26Q2Xj@PBC3Sn_ymT=Uv+nWk2)_+gBT|s|Nr8YB{DE literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_2.nbt b/src/main/resources/ponder/debug/scene_2.nbt new file mode 100644 index 0000000000000000000000000000000000000000..16f82250c43d9ac4905d112aca5a1f2cf563909f GIT binary patch literal 344 zcmV-e0jK^SiwFP!000000F9N;PJ}QJho`h%0grkxzJo8YXV1oyS5k45W?3M#$+|w6 z&u1~)T|!v+P0|q3Z@&JSNtzR7q@4X>Nkqfg#BW9^H{N>7j)ur+^Io^*&gJ3fDI?jn zE+(Brl6KyBK4pvtGcog8#fG37nV8jeFT`K`R67VR%qXAFc_n1kpoIL?* zngBIj@<_m=0FMSdF(gn^3Dk7SBLR;BJR0zb(-<>yX3uMkIB{#9H714v`bPo%v*eM0 zM*$uUc;Y=P;GUP5c+YE|H714z`dI`0yyTI9M*$vv#dFh{n!V@YiBT!37qe%&-`j@E z-hBG4YuZEc{|Zr@eYngXD(kr@+otR}D09kR`?lkLc)|j1zO5s1JZIirGAnbOXdi}%^P^AXl`p1Cec<81R4PH_8dym{l^*|s4{f9Vf_u-pAe2LJ%DL!(Fl literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_3.nbt b/src/main/resources/ponder/debug/scene_3.nbt new file mode 100644 index 0000000000000000000000000000000000000000..aedc65d0e9519518ca0d6a37870d52fb474ca5a8 GIT binary patch literal 845 zcmV-T1G4-diwFP!000000JWFjZ<{a>#}8~Lgtlut?O}h$e!NuOORG+k_EJ@NhdJ8F)Mqk%)K! zs?A_>6Q_&2!k0I{WK5IPj0!w@=+-7Ut2{nC2p4%tgf5m<~bcP=pRc=omk{2p^6y z6v?=Vxd=kX#+XJBc|j0)F{VQhIuxP95ISbR2x7m+7{~b9!Vn8X5R7B?%%Wps9POhq z#x#n^Q;NvbF&%=?p$Hv@&@uZ?5&J&IfUyg)@3y&Y4CwXSbZiW0AK7$ljA;x}6Bwc< zjOh@B4n^oNgpP>~hKP+Z28nNOOQO136*O`QAn3hRjc6U!SqLrU5*ggJe*Hn3tr1^-=16H#484FqmA6oEP;MfLz44I4uhXlm~^Vl0q-=?6JD8*I4z_k{hI2 zS=FaDMWNaaZ?zjr`Ipbj73cB5A=&o8^nZi^?GFLWCXFa}>+$Zvg-Qsv5o-NR`&HT- zaDt5?9cDK0`rpnce?X_r><#F&Q)qvHX}kAe;5DbsycsB0ZRT)bE@si`mf=38TVnf| zZi!Xvnr1=Fh2ZLI`^W=&8QgPtcONBukq1k0S|n*XuRh4ZJbnN4v|L4k&lhPT158R9 z;`oWU3GzJRx!f=RDo-<>s}FroXEs{~alt*fAZ*O_nbm~y1B44Y!I-bqLI_=G! zie=5!0bM_MvS+)vKHHw=b|-_Xn^&=C(?4d?Eo&M(U)w)OdtSC(lchXJl3T57#`V?t z&OjFP-?G;^X$I}6chjed=r(l literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_4.nbt b/src/main/resources/ponder/debug/scene_4.nbt new file mode 100644 index 0000000000000000000000000000000000000000..589150451a2210b54c7e83cacfc011c48fce3330 GIT binary patch literal 608 zcmV-m0-yaKiwFP!000000L_-$j+-zLh6j8IkVpF?0puH7ULx{HC(CN|j380PpBIo>FT5jdQ{5d@ATaNN4Qg&cn(XRO5t98TZ} z0!I=!Ze2d1UOu5-OB_z%2m(hEIBs2xP%lQP*Aj;lID){D1ddx5C)A4*>b1n-1dbqZ zB!T1BB?$ErgnBJ;IDsPw968B}fMpLxfcRD*?xC6Y?%qD?=Ee77Z!^6Be6@#+%-JL{@;;f3RU1l19+px7M;i(A_D(X)I$5b%Enz6Omvj&T@y{V3Nu!Rb%0NSvFz^Yq!^CLL_|d1_ytw8)i3W%#Li%rifEC2J2tD zZ2Ke;otZR#vA> z^W)JTadC)Kjg}EVDGlCJk8{U6jmu-rI#wsd^g7ntj&&R5jr-u7>>9_2w$^U$B(SR# zH|3>{+Ft0QwsO@H4wXFYH{oKOJM0 u?Ri-OhXKi&NQr+;P*y}CaPwqIfs|G-kK+s=_4gdgwnjlU9 literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_5.nbt b/src/main/resources/ponder/debug/scene_5.nbt new file mode 100644 index 0000000000000000000000000000000000000000..be49148df9337d9d76e9b4362695227fd520e827 GIT binary patch literal 333 zcmV-T0kZxdiwFP!000000F9KvZi6rkhD{PSpr=VYOna1`cb<0IwMxNlqtOHL>EXvGk+r3g9v{*3>KQ~)KYV7^fTKw5cRB0Wne(2^m80aBFkaBN-u6{?uLmLNM9 zrlL6{1mk zXFdvs&ywNu7DqBTiouyeF??1GpSL)Y!BMN63Zy+!0m3x!RC|p3`%~MS=FpiAD-eAb zHL7ugT{AOV9Gr-n$4<9Mgy|ob1*ms@MR>Uyi?!D$+7A~)c&MF??PAfSc)lrub;Du2 zC}QvG!@CZBx&|Cv=FL2~o-Vi4I)9g{0q+25Iz_%uFUAqa fWd5Z8hQz^lZ<_Qc`e0nNr1*hf*OR!Z00jU5I+K=) literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/shaft/encasing_shafts.nbt b/src/main/resources/ponder/shaft/encasing_shafts.nbt new file mode 100644 index 0000000000000000000000000000000000000000..4b7d064c0fe766d5538430ac0115ed91db953917 GIT binary patch literal 497 zcmV05y z!O;v(*CeCPl2PYl9L3;h24{N|j5;euosV%8gQFQ7vFW=RdEi<58TB7`%{VX3IIm+I z#o%ZLr*qc~cm0=p2CAAy17_SH7WWTr=4wPA!|I2RO+iVK!NmyUvi5TW$vfNF+{N$L z4=q5C=|x1Sfd+Y95dJ5?+o6HMIC>20*H8k|74S0mNU&jWi>AcM+*KG|o>8*?=5u

4DO@zR#2B%?3YY}+$Sx3GEa)k@w>NPZs(LwD-4>vmef?*4dFvuh^17l; z60%D?-|TtnZ3vUx23O6tldm?Dwkj~JmapeC$UgYGLEqj}61ZGa$d~nOh6R`#TLvV8 ny>kJ?-4^z!tIjQLheR*m+h{+b53a7Lg1_K5UTxw;7YP6W*h%hs literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/shaft/shaft.nbt b/src/main/resources/ponder/shaft/shaft.nbt new file mode 100644 index 0000000000000000000000000000000000000000..36ea03bc3d34fae6de5a4220567c973220654d6c GIT binary patch literal 541 zcmV+&0^#a+|}^82#GVMGD!uY-FkYr;D2~ zL`-NCAm~58g(h_6~25u{g?q$6`Yn9X~@Whfo6#wZB8v_ zWlP#ol6Tbfkk(cO_@OYvc5g4bfvmkmjh7HF}TXI8HMVW4S~) zTT)o1r8y&~&APZdv7x>D^yl66mGW4WM$>;JWDfZoYZ|oSxX)lPBg1+QY}I6NBCnMz zWNq}km?`T#2ya)oqxS3pUEcAU1hzKwIaZL)WbKf;0~eC(9q2&|3ORKV_tej}YN;!9 f!OU+lQ*_6#q?eayoidsp$v5}`v@Fk5?Faw>26YO$ literal 0 HcmV?d00001 From 203ca6f849110bac7dd683f7c2b2c0efc51b8ad3 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 18 Feb 2021 15:44:18 +0100 Subject: [PATCH 07/23] Birbs and Click input --- src/generated/resources/.cache/cache | 24 ++-- .../resources/assets/create/lang/en_us.json | 17 ++- .../assets/create/lang/unfinished/de_de.json | 19 ++- .../assets/create/lang/unfinished/es_mx.json | 25 ++-- .../assets/create/lang/unfinished/fr_fr.json | 25 ++-- .../assets/create/lang/unfinished/it_it.json | 25 ++-- .../assets/create/lang/unfinished/ja_jp.json | 25 ++-- .../assets/create/lang/unfinished/ko_kr.json | 25 ++-- .../assets/create/lang/unfinished/nl_nl.json | 25 ++-- .../assets/create/lang/unfinished/pt_br.json | 25 ++-- .../assets/create/lang/unfinished/ru_ru.json | 25 ++-- .../assets/create/lang/unfinished/zh_cn.json | 25 ++-- .../assets/create/lang/unfinished/zh_tw.json | 25 ++-- .../relays/gauge/SpeedGaugeTileEntity.java | 44 +++--- .../create/foundation/gui/AllGuiTextures.java | 3 + .../create/foundation/gui/AllIcons.java | 5 +- .../foundation/ponder/PonderRegistry.java | 1 - .../create/foundation/ponder/PonderScene.java | 60 +++++--- .../create/foundation/ponder/PonderUI.java | 93 ++++++++++-- .../create/foundation/ponder/PonderWorld.java | 3 + .../ponder/content/CogwheelStory.java | 42 ------ .../ponder/content/DebugScenes.java | 124 ++++++++++++++-- .../ponder/content/PonderIndex.java | 4 - .../ponder/content/ShaftAsRelay.java | 33 +++-- .../ponder/content/ShaftsCanBeEncased.java | 19 ++- .../foundation/ponder/content/SharedText.java | 4 +- .../ponder/elements/InputWindowElement.java | 135 ++++++++++++++++++ .../ponder/elements/ParrotElement.java | 44 +++++- .../EmitParticlesInstruction.java | 6 + .../instructions/FadeInOutInstruction.java | 49 +++++++ .../instructions/ShowInputInstruction.java | 31 ++++ .../ponder/instructions/TextInstruction.java | 41 ++---- .../create/foundation/utility/VecHelper.java | 2 +- .../assets/create/textures/gui/icons.png | Bin 2598 -> 2719 bytes .../assets/create/textures/gui/widgets.png | Bin 1895 -> 1972 bytes src/main/resources/ponder/cogwheel/first.nbt | Bin 679 -> 0 bytes src/main/resources/ponder/debug/scene_6.nbt | Bin 0 -> 436 bytes src/main/resources/ponder/debug/scene_7.nbt | Bin 0 -> 578 bytes src/main/resources/ponder/shaft/shaft.nbt | Bin 541 -> 563 bytes 39 files changed, 757 insertions(+), 296 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeInOutInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowInputInstruction.java delete mode 100644 src/main/resources/ponder/cogwheel/first.nbt create mode 100644 src/main/resources/ponder/debug/scene_6.nbt create mode 100644 src/main/resources/ponder/debug/scene_7.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 588bd62e9..e0d2e9685 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,18 +401,18 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -694cfe3d8fe9793b7ac0fbc7bbd3cf6bf455bf92 assets/create/lang/en_us.json -499d461cf16f5a94049fbbe9eb758e0eaa19fa83 assets/create/lang/unfinished/de_de.json -8e486714ce38b6702fc614f4ba7cd34e003800aa assets/create/lang/unfinished/es_mx.json -53f2918966bd9c045314a02ff0f5439720969087 assets/create/lang/unfinished/fr_fr.json -073ead0ceacdcf666fece6a78071a36fa9c3d356 assets/create/lang/unfinished/it_it.json -0967bfc8888598329563ff6ee419038aef03df0a assets/create/lang/unfinished/ja_jp.json -50e210e32d4a55561ffed5a62ac10802107b719e assets/create/lang/unfinished/ko_kr.json -40784b923f0defdecbd35f73c7d7ead9c3fe9d8a assets/create/lang/unfinished/nl_nl.json -ad719b1559c58c9e7c1b22023c5e686d4fa1ca19 assets/create/lang/unfinished/pt_br.json -1190f9152de89c7e0b7561c3cdddae6fe2f1aa19 assets/create/lang/unfinished/ru_ru.json -bbcd8d37a18c779dfcca9aeaeb2b2d101a4b4fe2 assets/create/lang/unfinished/zh_cn.json -be270f1d2bc61ebd4a9f1be5b00daa56947de2d7 assets/create/lang/unfinished/zh_tw.json +1c2c42b885b5d2b23f452d1550fb6c3a3a7ab952 assets/create/lang/en_us.json +90fb5c8d2b384d93c3bbc2693103be18a0ff3dc7 assets/create/lang/unfinished/de_de.json +3789e356240833be498849723cde53f12553c889 assets/create/lang/unfinished/es_mx.json +89aa38cb8250cd56dff4ae00d1491aea7e8aea36 assets/create/lang/unfinished/fr_fr.json +61e46061b0e9487f381c32a6c1004aacdb0be2b1 assets/create/lang/unfinished/it_it.json +70d3beec87b4e461b02b38feec572fcf92ffad35 assets/create/lang/unfinished/ja_jp.json +d77cefebb91bce27fc098d4e5a81a39c5b3f10de assets/create/lang/unfinished/ko_kr.json +6f7f629f4e8597c39f1cb259359e451255b31864 assets/create/lang/unfinished/nl_nl.json +0fd66b2ff7124cff646f32cebcd679d5e16ed805 assets/create/lang/unfinished/pt_br.json +5cf5aae29b48a7066c98dfbb130f58dcca7be5f6 assets/create/lang/unfinished/ru_ru.json +d1afca478f7ceaa739220873cfdff4f2caa3b3fd assets/create/lang/unfinished/zh_cn.json +ee8599a8bf1c4fac02dc9501de5d08f58b19f395 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 32a7025d9..9ea4a76c2 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1797,14 +1797,11 @@ "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", "create.ponder.pondering": "Pondering about...", - "create.ponder.shared.more_shared": "This is Shared stuff", - "create.ponder.shared.when_wrenched": "When Wrenched", - "create.ponder.cogwheel.scene_0.title": "My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "Sneak +", + "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "Das X axis", "create.ponder.brass_hand.scene_0.y": "Das Y axis", @@ -1814,11 +1811,13 @@ "create.ponder.brass_hand.scene_1.title": "Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "Incoming...", "create.ponder.brass_hand.scene_4.title": "Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 a51776d21..845da707f 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: 1119", + "_": "Missing Localizations: 1124", "_": "->------------------------] Game Elements [------------------------<-", @@ -1798,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1815,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 440b56c5b..9946947f4 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: 910", + "_": "Missing Localizations: 915", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 9afcc1138..cdeab2100 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: 690", + "_": "Missing Localizations: 695", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "Statistiques cinétiques:", "create.gui.goggles.at_current_speed": "À la vitesse actuelle", "create.gui.goggles.pole_length": "Longueur de la barre", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "Informations sur la jauge:", "create.gui.speedometer.title": "Vitesse de rotation", "create.gui.stressometer.title": "Stress du réseau", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 3d2f316b5..5169c7260 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: 27", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "Statistiche cinetiche:", "create.gui.goggles.at_current_speed": "Alla velocità attuale", "create.gui.goggles.pole_length": "Lunghezza palo:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "Informazioni sul calibro:", "create.gui.speedometer.title": "Velocità di rotazione", "create.gui.stressometer.title": "Stress della rete", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 004d882f2..0d1de356a 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: 36", + "_": "Missing Localizations: 41", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "動力の統計:", "create.gui.goggles.at_current_speed": "現在の速度", "create.gui.goggles.pole_length": "ポールの長さ:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "計器の情報:", "create.gui.speedometer.title": "回転速度", "create.gui.stressometer.title": "ネットワークの応力", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 51612fa21..33c304adf 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: 79", + "_": "Missing Localizations: 84", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "가동 상태:", "create.gui.goggles.at_current_speed": "현재 에너지량", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "게이지 정보:", "create.gui.speedometer.title": "회전 속도", "create.gui.stressometer.title": "네트워크 부하", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 2fb0077c9..f09b09a1d 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: 1179", + "_": "Missing Localizations: 1184", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 be5288f9b..5e937709f 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: 1245", + "_": "Missing Localizations: 1250", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "UNLOCALIZED: Kinetic Stats:", "create.gui.goggles.at_current_speed": "UNLOCALIZED: at current speed", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 261a60115..82bb3ce9f 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: 29", + "_": "Missing Localizations: 34", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", "create.gui.goggles.at_current_speed": "На текущей скорости", "create.gui.goggles.pole_length": "Длина поршня", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", "create.gui.stressometer.title": "Сетевой момент", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 135caaf45..3ea36f056 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: 27", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "动力学状态:", "create.gui.goggles.at_current_speed": "当前速度应力值", "create.gui.goggles.pole_length": "活塞杆长度:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "仪表信息:", "create.gui.speedometer.title": "旋转速度", "create.gui.stressometer.title": "网络应力", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 c300d3e80..03543e9a6 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: 32", + "_": "Missing Localizations: 37", "_": "->------------------------] Game Elements [------------------------<-", @@ -823,6 +823,12 @@ "create.gui.goggles.kinetic_stats": "機械學狀態:", "create.gui.goggles.at_current_speed": "現在速度動能值", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.assembly.exception": "UNLOCALIZED: This Contraption was unable to assemble:", + "create.gui.assembly.exception.unmovableBlock": "UNLOCALIZED: Unmovable Block (%4$s) at [%1$s %2$s %3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "UNLOCALIZED: The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.structureTooLarge": "UNLOCALIZED: There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.tooManyPistonPoles": "UNLOCALIZED: There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", + "create.gui.assembly.exception.noPistonPoles": "UNLOCALIZED: The Piston is missing some extension Poles", "create.gui.gauge.info_header": "儀表訊息:", "create.gui.speedometer.title": "旋轉速度", "create.gui.stressometer.title": "網路動能", @@ -1792,14 +1798,11 @@ "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", - "create.ponder.shared.more_shared": "UNLOCALIZED: This is Shared stuff", - "create.ponder.shared.when_wrenched": "UNLOCALIZED: When Wrenched", - "create.ponder.cogwheel.scene_0.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_1.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.cogwheel.scene_2.title": "UNLOCALIZED: My First Ponder Story, Parrots", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts seem to relay rotation in a straight line.", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: I could use Brass or Andesite Casing to hide them.", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", @@ -1809,11 +1812,13 @@ "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds2": "UNLOCALIZED: Blocks outside of the base plate \n\nIgnored by scaling, thanks to configureBasePlate()", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java index 373387ab7..9d64fbe32 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java @@ -13,7 +13,7 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.TextFormatting; -public class SpeedGaugeTileEntity extends GaugeTileEntity{ +public class SpeedGaugeTileEntity extends GaugeTileEntity { public SpeedGaugeTileEntity(TileEntityType type) { super(type); @@ -23,28 +23,36 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity{ public void onSpeedChanged(float prevSpeed) { super.onSpeedChanged(prevSpeed); float speed = Math.abs(getSpeed()); - float medium = AllConfigs.SERVER.kinetics.mediumSpeed.get().floatValue(); - float fast = AllConfigs.SERVER.kinetics.fastSpeed.get().floatValue(); - float max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get().floatValue(); - color = ColorHelper.mixColors(SpeedLevel.of(speed).getColor(), 0xffffff, .25f); + color = speed == 0 ? 0x333333 + : ColorHelper.mixColors(SpeedLevel.of(speed) + .getColor(), 0xffffff, .25f); if (speed == 69) - AllTriggers.triggerForNearbyPlayers(AllTriggers.SPEED_READ, world, pos, 6, - GogglesItem::canSeeParticles); - if (speed == 0) { - dialTarget = 0; - color = 0x333333; - } else if (speed < medium) { - dialTarget = MathHelper.lerp(speed / medium, 0, .45f); - } else if (speed < fast) { - dialTarget = MathHelper.lerp((speed - medium) / (fast - medium), .45f, .75f); - } else { - dialTarget = MathHelper.lerp((speed - fast) / (max - fast), .75f, 1.125f); - } - + AllTriggers.triggerForNearbyPlayers(AllTriggers.SPEED_READ, world, pos, 6, GogglesItem::canSeeParticles); + + dialTarget = getDialTarget(speed); markDirty(); } + public static float getDialTarget(float speed) { + float medium = AllConfigs.SERVER.kinetics.mediumSpeed.get() + .floatValue(); + float fast = AllConfigs.SERVER.kinetics.fastSpeed.get() + .floatValue(); + float max = AllConfigs.SERVER.kinetics.maxRotationSpeed.get() + .floatValue(); + float target = 0; + if (speed == 0) + target = 0; + else if (speed < medium) + target = MathHelper.lerp(speed / medium, 0, .45f); + else if (speed < fast) + target = MathHelper.lerp((speed - medium) / (fast - medium), .45f, .75f); + else + target = MathHelper.lerp((speed - fast) / (max - fast), .75f, 1.125f); + return target; + } + @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { super.addToGoggleTooltip(tooltip, isPlayerSneaking); diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index 5528f791b..bb7c03018 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -78,6 +78,9 @@ public enum AllGuiTextures { INDICATOR_GREEN("widgets.png", 36, 18, 18, 6), INDICATOR_YELLOW("widgets.png", 54, 18, 18, 6), INDICATOR_RED("widgets.png", 72, 18, 18, 6), + + SPEECH_TOOLTIP("widgets.png", 0, 24, 8, 8), + SPEECH_TOOLTIP_HIGHLIGHT("widgets.png", 8, 24, 8, 8), ; diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 51e0c0764..faa7d9af7 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -70,7 +70,10 @@ public class AllIcons { I_REPLACE = next(), I_CLEAR = next(), I_OVERLAY = next(), - I_FLATTEN = next(); + I_FLATTEN = next(), + I_LMB = next(), + I_SCROLL = next(), + I_RMB = next(); public static final AllIcons I_TOOL_DEPLOY = newRow(), 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 fcc7945d1..3f8b855ea 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -23,7 +23,6 @@ import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTSizeTracker; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3i; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 84fd7d8f5..7157d1891 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; 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.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement; import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; @@ -21,12 +22,15 @@ import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction; import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction; import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction; +import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction; import com.simibubi.create.foundation.ponder.instructions.TextInstruction; import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; @@ -41,6 +45,7 @@ import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; +import net.minecraft.particles.RedstoneParticleData; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -360,7 +365,7 @@ public class PonderScene { } public SceneBuilder replaceBlocks(Select selection, BlockState state) { - return addInstruction(new ReplaceBlocksInstruction(selection, state, false)); + return addInstruction(new ReplaceBlocksInstruction(selection, state, true)); } public SceneBuilder setKineticSpeed(Select selection, float speed) { @@ -373,17 +378,11 @@ public class PonderScene { public SceneBuilder modifyKineticSpeed(Select selection, UnaryOperator speedFunc) { addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> { - if (!nbt.contains("Speed")) - return nbt; float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); - // TODO speed gauge consistency - nbt.putFloat("Value", Math.abs(newSpeed) / 256f); + nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed)); return nbt; }, false)); - return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { - if (!nbt.contains("Speed")) - return nbt; nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); return nbt; }, false)); @@ -396,19 +395,42 @@ public class PonderScene { }, false)); } - public SceneBuilder createParrotSpinningOn(BlockPos pos, Direction fadeInDirection) { - return addInstruction(new CreateParrotInstruction(15, fadeInDirection, - ParrotElement.spinOnComponent(new Vec3d(pos).add(.5, 0, .5), pos.down()))); - } - - public SceneBuilder createParrotLookingAtPOI(Vec3d location, Direction fadeInDirection) { - return addInstruction(new CreateParrotInstruction(15, fadeInDirection, ParrotElement.lookAtPOI(location))); - } - public SceneBuilder movePOI(Vec3d location) { return addInstruction(new MovePoiInstruction(location)); } + public SceneBuilder showControls(InputWindowElement element, int duration) { + return addInstruction(new ShowInputInstruction(element, duration)); + } + + public SceneBuilder emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) { + return addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); + } + + public SceneBuilder indicateSuccess(BlockPos pos) { + return addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), + Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2)); + } + + public SceneBuilder birbOnTurntable(BlockPos pos) { + return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, + ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos))); + } + + public SceneBuilder birbOnSpinnyShaft(BlockPos pos) { + return addInstruction( + new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos) + .add(0, 0.5, 0), pos))); + } + + public SceneBuilder birbLookingAtPOI(Vec3d location) { + return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.lookAtPOI(location))); + } + + public SceneBuilder birbPartying(Vec3d location) { + return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.dance(location))); + } + public SceneBuilder addInstruction(PonderInstruction instruction) { schedule.add(instruction); return this; @@ -420,6 +442,10 @@ public class PonderScene { return VecHelper.getCenterOf(new BlockPos(x, y, z)); } + public Vec3d topOf(int x, int y, int z) { + return new Vec3d(x + .5, y + 1, z + .5); + } + public Vec3d vector(double x, double y, double z) { return new Vec3d(x, y, z); } 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 04c3b7935..acaf4089b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -7,6 +7,7 @@ import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.ui.PonderButton; @@ -15,6 +16,7 @@ import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.Pointing; import net.minecraft.client.GameSettings; import net.minecraft.client.Minecraft; @@ -141,43 +143,44 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.enableAlphaTest(); RenderSystem.enableBlend(); RenderSystem.enableDepthTest(); - + ms.push(); story.transform.updateScreenParams(width, height, slide); story.transform.apply(ms); story.renderScene(buffer, ms); buffer.draw(); - + // coords for debug if (PonderIndex.EDITOR_MODE) { MutableBoundingBox bounds = story.getBounds(); - + RenderSystem.pushMatrix(); - RenderSystem.multMatrix(ms.peek().getModel()); - RenderSystem.scaled(-1/16d, -1/16d, 1/16d); - RenderSystem.translated(1, -8, -1/64f); - + RenderSystem.multMatrix(ms.peek() + .getModel()); + RenderSystem.scaled(-1 / 16d, -1 / 16d, 1 / 16d); + RenderSystem.translated(1, -8, -1 / 64f); + RenderSystem.pushMatrix(); for (int x = 0; x <= bounds.getXSize(); x++) { RenderSystem.translated(-16, 0, 0); font.drawString(x == bounds.getXSize() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); } RenderSystem.popMatrix(); - + RenderSystem.pushMatrix(); RenderSystem.scaled(-1, 1, 1); RenderSystem.rotatef(-90, 0, 1, 0); - RenderSystem.translated(-8, -2, 2/64f); + RenderSystem.translated(-8, -2, 2 / 64f); for (int z = 0; z <= bounds.getZSize(); z++) { RenderSystem.translated(16, 0, 0); font.drawString(z == bounds.getZSize() ? "z" : "" + z, 0, 0, 0xFFFFFFFF); } RenderSystem.popMatrix(); - + buffer.draw(); RenderSystem.popMatrix(); } - + ms.pop(); } @@ -229,6 +232,7 @@ public class PonderUI extends AbstractSimiScreen { right.flash(); else right.dim(); + } protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { @@ -320,7 +324,72 @@ public class PonderUI extends AbstractSimiScreen { } public static void renderBox(int x, int y, int w, int h, boolean highlighted) { - renderBox(x, y, w, h, 0xdd000000, highlighted ? 0x70ffffff : 0x30eebb00, highlighted ? 0x30ffffff : 0x10eebb00); + renderBox(x, y, w, h, 0xff000000, highlighted ? 0xf0ffeedd : 0x40ffeedd, highlighted ? 0x60ffeedd : 0x20ffeedd); + } + + public static void renderSpeechBox(int x, int y, int w, int h, boolean highlighted, Pointing pointing, + boolean returnWithLocalTransform) { + if (!returnWithLocalTransform) + RenderSystem.pushMatrix(); + + int boxX = x; + int boxY = y; + int divotX = x; + int divotY = y; + int divotRotation = 0; + int divotSize = 8; + int distance = 1; + int divotRadius = divotSize / 2; + + switch (pointing) { + default: + case DOWN: + divotRotation = 0; + boxX -= w / 2; + boxY -= h + divotSize + 1 + distance; + divotX -= divotRadius; + divotY -= divotSize + distance; + break; + case LEFT: + divotRotation = 90; + boxX += divotSize + 1 + distance; + boxY -= h / 2; + divotX += distance; + divotY -= divotRadius; + break; + case RIGHT: + divotRotation = 270; + boxX -= w + divotSize + 1 + distance; + boxY -= h / 2; + divotX -= divotSize + distance; + divotY -= divotRadius; + break; + case UP: + divotRotation = 180; + boxX -= w / 2; + boxY += divotSize + 1 + distance; + divotX -= divotRadius; + divotY += distance; + break; + } + + renderBox(boxX, boxY, w, h, highlighted); + + RenderSystem.pushMatrix(); + AllGuiTextures toRender = highlighted ? AllGuiTextures.SPEECH_TOOLTIP_HIGHLIGHT : AllGuiTextures.SPEECH_TOOLTIP; + RenderSystem.translated(divotX + divotRadius, divotY + divotRadius, 10); + RenderSystem.rotatef(divotRotation, 0, 0, 1); + RenderSystem.translated(-divotRadius, -divotRadius, 0); + toRender.draw(0, 0); + RenderSystem.popMatrix(); + + if (returnWithLocalTransform) { + RenderSystem.translated(boxX, boxY, 0); + return; + } + + RenderSystem.popMatrix(); + } public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, 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 0c67d647a..b478ec6d4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -131,6 +131,9 @@ public class PonderWorld extends SchematicWorld { public void addBlockDestroyEffects(BlockPos pos, BlockState state) { VoxelShape voxelshape = state.getShape(this, pos); + if (voxelshape.isEmpty()) + return; + AxisAlignedBB bb = voxelshape.getBoundingBox(); double d1 = Math.min(1.0D, bb.maxX - bb.minX); double d2 = Math.min(1.0D, bb.maxY - bb.minY); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java deleted file mode 100644 index 921db2309..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/CogwheelStory.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.simibubi.create.foundation.ponder.content; - -import com.simibubi.create.foundation.ponder.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.Select; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; - -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; - -public class CogwheelStory extends PonderStoryBoard { - - public CogwheelStory() { - } - - @Override - public String getSchematicName() { - return "cogwheel/first"; - } - - @Override - public String getStoryTitle() { - return "My First Ponder Story, Parrots"; - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - - scene.movePOI(new Vec3d(3.5, 4, 4.5)); - scene.showBasePlate(); - scene.idle(10); - - scene.createParrotSpinningOn(new BlockPos(1, 4, 2), Direction.DOWN); - scene.showSection(util.layersFrom(1), Direction.DOWN); - - scene.idle(10); - scene.rotateCameraY(180); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 2d3327ba5..1d93364d7 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -11,14 +11,18 @@ import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.PonderStoryBoard; import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; import com.tterrag.registrate.util.entry.ItemEntry; import net.minecraft.block.Blocks; import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; public abstract class DebugScenes extends PonderStoryBoard { @@ -33,6 +37,8 @@ public abstract class DebugScenes extends PonderStoryBoard { PonderRegistry.addStoryBoard(item, new FluidsScene(++i)); PonderRegistry.addStoryBoard(item, new OffScreenScene(++i)); PonderRegistry.addStoryBoard(item, new ParticlesScene(++i)); + PonderRegistry.addStoryBoard(item, new ControlsScene(++i)); + PonderRegistry.addStoryBoard(item, new BirbScene(++i)); } public DebugScenes(int index) { @@ -64,7 +70,6 @@ public abstract class DebugScenes extends PonderStoryBoard { scene.showBasePlate(); scene.idle(10); scene.showSection(util.layersFrom(1), Direction.DOWN); -// scene.showTargetedText(WHITE, new Vec3d(1.5, 1.5, 1.5), "coordinate", "Schematic orientation: ", 40); scene.idle(10); scene.showSelectionWithText(PonderPalette.RED, Select.fromTo(2, 1, 1, 4, 1, 1), "x", "Das X axis", 20); @@ -96,9 +101,10 @@ public abstract class DebugScenes extends PonderStoryBoard { scene.idle(10); scene.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000); scene.idle(20); - scene.replaceBlocks(Select.fromTo(1, 1, 2, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState()); + scene.replaceBlocks(Select.fromTo(1, 1, 3, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState()); scene.idle(10); scene.replaceBlocks(Select.pos(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState()); + scene.rotateCameraY(180); scene.markAsFinished(); } @@ -131,6 +137,36 @@ public abstract class DebugScenes extends PonderStoryBoard { } + static class OffScreenScene extends DebugScenes { + + public OffScreenScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.configureBasePlate(1, 0, 6); + scene.showBasePlate(); + Select out1 = Select.fromTo(7, 0, 0, 8, 0, 5); + Select out2 = Select.fromTo(0, 0, 0, 0, 0, 5); + scene.idle(10); + scene.showSection(Select.compound(util.layersFrom(1), out1, out2), Direction.DOWN); + scene.idle(10); + + scene.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", + "Blocks outside of the base plate do not affect scaling", 100); + scene.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate", + "configureBasePlate() makes sure of that.", 100); + scene.markAsFinished(); + } + + @Override + protected String getTitle() { + return "Out of bounds / configureBasePlate"; + } + + } + static class ParticlesScene extends DebugScenes { public ParticlesScene(int index) { @@ -165,34 +201,94 @@ public abstract class DebugScenes extends PonderStoryBoard { } - static class OffScreenScene extends DebugScenes { + static class ControlsScene extends DebugScenes { - public OffScreenScene(int index) { + public ControlsScene(int index) { super(index); } @Override public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.configureBasePlate(1, 0, 6); scene.showBasePlate(); - Select out1 = Select.fromTo(7, 0, 0, 8, 0, 5); - Select out2 = Select.fromTo(0, 0, 0, 0, 0, 5); scene.idle(10); - scene.showSection(Select.compound(util.layersFrom(1), out1, out2), Direction.DOWN); + scene.showSection(util.layer(1), Direction.DOWN); + scene.idle(4); + scene.showSection(util.layer(2), Direction.DOWN); + scene.idle(4); + scene.showSection(util.layer(3), Direction.DOWN); scene.idle(10); - scene.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", - "Blocks outside of the base plate do not affect scaling", 100); - scene.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate", - "configureBasePlate() makes sure of that.", 100); - scene.markAsFinished(); + scene.showControls(new InputWindowElement(util.topOf(3, 1, 1), Pointing.DOWN).rightClick() + .whileSneaking() + .withWrench(), 40); + scene.idle(8); + scene.replaceBlocks(Select.pos(3, 1, 1), AllBlocks.SHAFT.getDefaultState()); + scene.idle(20); + + scene.showControls(new InputWindowElement(new Vec3d(1, 4.5, 3.5), Pointing.LEFT).rightClick() + .withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20); + scene.idle(4); + scene.showSection(util.layer(4), Direction.DOWN); + scene.idle(8); + + scene.showControls(new InputWindowElement(new Vec3d(2.5, 1.5, 3), Pointing.UP).whileCTRL() + .scroll() + .withWrench(), 40); } @Override protected String getTitle() { - return "Out of bounds / configureBasePlate"; + return "Basic player interaction"; } } + static class BirbScene extends DebugScenes { + + public BirbScene(int index) { + super(index); + } + + @Override + public void program(SceneBuilder scene, SceneBuildingUtil util) { + scene.showBasePlate(); + scene.idle(10); + scene.showSection(util.layersFrom(1), Direction.DOWN); + scene.idle(10); + BlockPos pos = new BlockPos(1, 2, 3); + scene.birbOnSpinnyShaft(pos); + scene.showTargetedText(PonderPalette.GREEN, util.topOf(1, 2, 3), "birbs_interesting", + "More birbs = More interesting", 100); + scene.idle(10); + scene.birbPartying(util.topOf(0, 1, 2)); + scene.idle(10); + + scene.movePOI(Vec3d.ZERO); + scene.birbLookingAtPOI(util.centerOf(3, 1, 3) + .add(0, 0.25f, 0)); + scene.idle(20); + + scene.replaceBlocks(Select.pos(4, 1, 0), Blocks.GOLD_BLOCK.getDefaultState()); + scene.movePOI(util.centerOf(4, 1, 0)); + scene.idle(20); + + scene.replaceBlocks(Select.pos(0, 1, 4), Blocks.GOLD_BLOCK.getDefaultState()); + scene.movePOI(util.centerOf(0, 1, 4)); + scene.showTargetedText(PonderPalette.FAST, util.centerOf(0, 1, 4), "poi", "Point of Interest", 20); + scene.idle(20); + + scene.replaceBlocks(Select.pos(4, 1, 0), Blocks.AIR.getDefaultState()); + scene.movePOI(util.centerOf(4, 1, 0)); + scene.idle(20); + + scene.replaceBlocks(Select.pos(0, 1, 4), Blocks.AIR.getDefaultState()); + scene.movePOI(util.centerOf(0, 1, 4)); + } + + @Override + protected String getTitle() { + return "Birbs"; + } + + } } 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 4a560622f..7ff108e90 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 @@ -14,10 +14,6 @@ public class PonderIndex { public static void register() { // Register storyboards here (Requires re-launch) - PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); - PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); - PonderRegistry.addStoryBoard(AllBlocks.COGWHEEL, new CogwheelStory()); - PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftAsRelay()); PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftsCanBeEncased()); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java index 90f5fa097..627e014ed 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java @@ -10,7 +10,6 @@ import com.simibubi.create.foundation.ponder.Select; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; class ShaftAsRelay extends PonderStoryBoard { @@ -26,26 +25,30 @@ class ShaftAsRelay extends PonderStoryBoard { @Override public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); + scene.configureBasePlate(0, 0, 5); + scene.showSection(util.layer(0), Direction.UP); - Select encased = util.column(4, 2); - Select gauge = util.column(0, 2); - Select shafts = Select.cuboid(new BlockPos(1, 1, 2), new Vec3i(2, 0, 0)); - - scene.idle(10); - scene.showSection(encased, Direction.DOWN); - scene.idle(10); - scene.showSection(gauge, Direction.DOWN); + Select gauge = Select.pos(0, 1, 2); + scene.showSection(gauge, Direction.UP); scene.setKineticSpeed(gauge, 0); - scene.idle(20); - scene.showSection(shafts, Direction.DOWN); - scene.setKineticSpeed(gauge, -112); + scene.idle(5); + scene.showSection(Select.pos(5, 1, 2), Direction.DOWN); + scene.idle(10); + for (int i = 4; i >= 1; i--) { + if (i == 2) + scene.rotateCameraY(70); + scene.idle(5); + scene.showSection(Select.pos(i, 1, 2), Direction.DOWN); + } + + scene.setKineticSpeed(gauge, 64); + scene.indicateSuccess(new BlockPos(0, 1, 2)); scene.idle(10); scene.showTargetedText(WHITE, new Vec3d(3, 1.5, 2.5), "shaft_relay", - "Shafts seem to relay rotation in a straight line.", 1000); - + "Shafts will relay rotation in a straight line.", 1000); + scene.idle(20); scene.markAsFinished(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java index a93b98143..2ddf32ba9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java @@ -8,6 +8,9 @@ import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.PonderStoryBoard; import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.utility.Pointing; +import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -38,18 +41,26 @@ class ShaftsCanBeEncased extends PonderStoryBoard { scene.showSection(shaft, Direction.DOWN); scene.idle(20); - scene.setBlocks(andesite, AllBlocks.ANDESITE_ENCASED_SHAFT.getDefaultState() + BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT; + scene.showControls(new InputWindowElement(util.topOf(3, 1, 2), Pointing.DOWN).rightClick() + .withItem(AllBlocks.ANDESITE_CASING.asStack()), 60); + scene.idle(7); + scene.setBlocks(andesite, andesiteEncased.getDefaultState() .with(EncasedShaftBlock.AXIS, Axis.X)); scene.setKineticSpeed(shaft, -112); scene.idle(10); - - scene.setBlocks(brass, AllBlocks.BRASS_ENCASED_SHAFT.getDefaultState() + + BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_SHAFT; + scene.showControls(new InputWindowElement(util.topOf(1, 0, 2), Pointing.UP).rightClick() + .withItem(AllBlocks.BRASS_CASING.asStack()), 60); + scene.idle(7); + scene.setBlocks(brass, brassEncased.getDefaultState() .with(EncasedShaftBlock.AXIS, Axis.X)); scene.setKineticSpeed(shaft, -112); scene.idle(10); scene.showTargetedText(WHITE, new Vec3d(1.5, 2, 2.5), "shaft_can_be_encased", - "I could use Brass or Andesite Casing to hide them.", 1000); + "Andesite or Brass Casing can be used to encase them.", 1000); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java index c0c449599..84b615ad1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -7,8 +7,8 @@ public class SharedText { public static void gatherText() { // Add entries used across several ponder scenes (Safe for hotswap) - add("when_wrenched", "When Wrenched"); - add("more_shared", "This is Shared stuff"); + add("sneak_and", "Sneak +"); + add("ctrl_and", "Ctrl +"); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java new file mode 100644 index 000000000..ae9ed8a89 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java @@ -0,0 +1,135 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.ponder.PonderLocalization; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.ponder.content.PonderPalette; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; + +public class InputWindowElement extends AnimatedOverlayElement { + + private Pointing direction; + + String key; + AllIcons icon; + ItemStack item = ItemStack.EMPTY; + + private Vec3d sceneSpace; + + public InputWindowElement(Vec3d sceneSpace, Pointing direction) { + this.sceneSpace = sceneSpace; + this.direction = direction; + } + + public InputWindowElement withItem(ItemStack stack) { + item = stack; + return this; + } + + public InputWindowElement withWrench() { + item = AllItems.WRENCH.asStack(); + return this; + } + + public InputWindowElement scroll() { + icon = AllIcons.I_SCROLL; + return this; + } + + public InputWindowElement rightClick() { + icon = AllIcons.I_RMB; + return this; + } + + public InputWindowElement leftClick() { + icon = AllIcons.I_LMB; + return this; + } + + public InputWindowElement whileSneaking() { + key = "sneak_and"; + return this; + } + + public InputWindowElement whileCTRL() { + key = "ctrl_and"; + return this; + } + + @Override + protected void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade) { + FontRenderer font = screen.getFontRenderer(); + int width = 0; + int height = 0; + + int xFade = direction == Pointing.RIGHT ? -1 : direction == Pointing.LEFT ? 1 : 0; + int yFade = direction == Pointing.DOWN ? -1 : direction == Pointing.UP ? 1 : 0; + xFade *= 10 * (1 - fade); + yFade *= 10 * (1 - fade); + + boolean hasItem = !item.isEmpty(); + boolean hasText = key != null; + boolean hasIcon = icon != null; + int keyWidth = 0; + String text = hasText ? PonderLocalization.getShared(key) : ""; + + if (fade < 1 / 16f) + return; + Vec2f sceneToScreen = scene.getTransform() + .sceneToScreen(sceneSpace); + + if (hasIcon) { + width += 24; + height = 24; + } + + if (hasText) { + keyWidth = font.getStringWidth(text); + width += keyWidth; + } + + if (hasItem) { + width += 24; + height = 24; + } + + RenderSystem.pushMatrix(); + RenderSystem.translated(sceneToScreen.x + xFade, sceneToScreen.y + yFade, 400); + + PonderUI.renderSpeechBox(0, 0, width, height, false, direction, true); + + if (hasText) + font.drawString(text, 2, (height - font.FONT_HEIGHT) / 2 + 2, + ColorHelper.applyAlpha(PonderPalette.WHITE.getColor(), fade)); + + if (hasIcon) { + RenderSystem.pushMatrix(); + RenderSystem.translated(keyWidth, 0, 0); + RenderSystem.scaled(1.5, 1.5, 1.5); + icon.draw(0, 0); + RenderSystem.popMatrix(); + } + + if (hasItem) { + GuiGameElement.of(item) + .at(keyWidth + 24, 0) + .scale(1.5) + .render(); + RenderSystem.disableDepthTest(); + } + + RenderSystem.popMatrix(); + } + +} 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 428274395..1209312f2 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 @@ -5,12 +5,12 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.entity.EntityRendererManager; -import net.minecraft.command.arguments.EntityAnchorArgument; import net.minecraft.entity.EntityType; import net.minecraft.entity.passive.ParrotEntity; import net.minecraft.tileentity.TileEntity; @@ -29,13 +29,19 @@ public class ParrotElement extends AnimatedSceneElement { parrotElement.pose = parrotElement.new FacePointOfInterestPose(); return parrotElement; } - + public static ParrotElement spinOnComponent(Vec3d location, BlockPos componentPos) { ParrotElement parrotElement = new ParrotElement(location); parrotElement.pose = parrotElement.new SpinOnComponentPose(componentPos); return parrotElement; } + public static ParrotElement dance(Vec3d location) { + ParrotElement parrotElement = new ParrotElement(location); + parrotElement.pose = parrotElement.new DancePose(); + return parrotElement; + } + protected ParrotElement(Vec3d location) { this.location = location; } @@ -69,7 +75,7 @@ public class ParrotElement extends AnimatedSceneElement { ms.translate(location.x, location.y, location.z); MatrixStacker.of(ms) - .rotateY(MathHelper.lerp(pt, entity.prevRotationYaw, entity.rotationYaw)); + .rotateY(AngleHelper.angleLerp(pt, entity.prevRotationYaw, entity.rotationYaw)); entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); ms.pop(); @@ -81,7 +87,24 @@ public class ParrotElement extends AnimatedSceneElement { void create(PonderWorld world) { entity = new ParrotEntity(EntityType.PARROT, world); - entity.setVariant(Create.random.nextInt(5)); + int nextInt = Create.random.nextInt(5); + entity.setVariant(nextInt == 1 ? 0 : nextInt); // blue parrots are kinda hard to see + } + + } + + class DancePose extends ParrotPose { + + @Override + void create(PonderWorld world) { + super.create(world); + entity.setPartying(BlockPos.ZERO, true); + } + + @Override + void tick(PonderScene scene) { + entity.prevRotationYaw = entity.rotationYaw; + entity.rotationYaw -= 2; } } @@ -111,7 +134,18 @@ public class ParrotElement extends AnimatedSceneElement { @Override void tick(PonderScene scene) { - entity.lookAt(EntityAnchorArgument.Type.EYES, scene.getPointOfInterest()); + Vec3d p_200602_2_ = scene.getPointOfInterest(); + Vec3d vec3d = location.add(entity.getEyePosition(0)); + double d0 = p_200602_2_.x - vec3d.x; + 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.prevRotationYaw = entity.rotationYaw; + entity.prevRotationPitch = entity.rotationPitch; + entity.rotationPitch = + MathHelper.wrapDegrees((float) -(MathHelper.atan2(d1, d3) * (double) (180F / (float) Math.PI))); + entity.rotationYaw = + MathHelper.wrapDegrees((float) -(MathHelper.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java index 7c1d0197c..eb4a85f6c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/EmitParticlesInstruction.java @@ -22,6 +22,12 @@ public class EmitParticlesInstruction extends TickingInstruction { return (w, x, y, z) -> w.addParticle(data, x, y, z, motion.x, motion.y, motion.z); } + public static Emitter withinBlockSpace(T data, Vec3d motion) { + return (w, x, y, z) -> w.addParticle(data, Math.floor(x) + Create.random.nextFloat(), + Math.floor(y) + Create.random.nextFloat(), Math.floor(z) + Create.random.nextFloat(), motion.x, + motion.y, motion.z); + } + static ParticleManager paticleManager() { return Minecraft.getInstance().particles; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeInOutInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeInOutInstruction.java new file mode 100644 index 000000000..a7f195ffe --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeInOutInstruction.java @@ -0,0 +1,49 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderScene; + +public abstract class FadeInOutInstruction extends TickingInstruction { + + protected static final int fadeTime = 5; + + public FadeInOutInstruction(int duration) { + super(false, duration + 2 * fadeTime); + } + + protected abstract void show(PonderScene scene); + + protected abstract void hide(PonderScene scene); + + protected abstract void applyFade(PonderScene scene, float fade); + + @Override + protected void firstTick(PonderScene scene) { + super.firstTick(scene); + show(scene); + applyFade(scene, 0); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + int elapsed = totalTicks - remainingTicks; + + if (elapsed < fadeTime) { + float fade = (elapsed / (float) fadeTime); + applyFade(scene, fade * fade); + + } else if (remainingTicks < fadeTime) { + float fade = (remainingTicks / (float) fadeTime); + applyFade(scene, fade * fade); + + } else + applyFade(scene, 1); + + if (remainingTicks == 0) { + applyFade(scene, 0); + hide(scene); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowInputInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowInputInstruction.java new file mode 100644 index 000000000..4a1864478 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowInputInstruction.java @@ -0,0 +1,31 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; + +public class ShowInputInstruction extends FadeInOutInstruction { + + private InputWindowElement element; + + public ShowInputInstruction(InputWindowElement element, int ticks) { + super(ticks); + this.element = element; + } + + @Override + protected void show(PonderScene scene) { + scene.addElement(element); + element.setVisible(true); + } + + @Override + protected void hide(PonderScene scene) { + element.setVisible(false); + } + + @Override + protected void applyFade(PonderScene scene, float fade) { + element.setFade(fade); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index ca81f4bb6..ab7c84761 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -9,14 +9,13 @@ import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import net.minecraft.util.math.Vec3d; -public class TextInstruction extends TickingInstruction { +public class TextInstruction extends FadeInOutInstruction { private TextWindowElement element; private OutlinerElement outline; - private static final int fadeTime = 5; protected TextInstruction(int color, Supplier text, int duration) { - super(false, duration + 2 * fadeTime); + super(duration); } public TextInstruction(int color, Supplier text, int duration, Select selection) { @@ -41,11 +40,9 @@ public class TextInstruction extends TickingInstruction { } @Override - protected void firstTick(PonderScene scene) { - super.firstTick(scene); + protected void show(PonderScene scene) { scene.addElement(element); element.setVisible(true); - element.setFade(0); if (outline != null) { scene.addElement(outline); outline.setFade(1); @@ -54,31 +51,17 @@ public class TextInstruction extends TickingInstruction { } @Override - public void tick(PonderScene scene) { - super.tick(scene); - int elapsed = totalTicks - remainingTicks; - - if (elapsed < fadeTime) { - float fade = (elapsed / (float) fadeTime); - element.setFade(fade * fade); - - } else if (remainingTicks < fadeTime) { - float fade = (remainingTicks / (float) fadeTime); - element.setFade(fade * fade); - - } else - element.setFade(1); - - if (remainingTicks == 0) { - element.setFade(0); - element.setFade(0); - element.setVisible(false); - if (outline != null) { - outline.setFade(0); - outline.setVisible(false); - } + protected void hide(PonderScene scene) { + element.setVisible(false); + if (outline != null) { + outline.setFade(0); + outline.setVisible(false); } + } + @Override + protected void applyFade(PonderScene scene, float fade) { + element.setFade(fade); } } 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 61691caf0..300f02316 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -119,7 +119,7 @@ public class VecHelper { } public static Vec3d lerp(float p, Vec3d from, Vec3d to) { - return from.add(from.subtract(to) + return from.add(to.subtract(from) .scale(p)); } diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 8bc0cb6a5651c9be3005c7c353cc406b42b56589..3276c6033f25f4f3b11ffed88de3f52b4c42e5f5 100644 GIT binary patch literal 2719 zcmdT`i8s_;AODSEY%@%j43a5Lie%qq#!lI@?_}&dMHt4CR8nLoAtRN2e=I{v$oil{ z7(!&7kg<+;de8Hm^ZpC(J?Ea!{e15CoO?g_eDA&A2gZgvFcv-*003Zmx|*f{0HO^+ z027!7-ep#1e^{`ojyg~=c;+XK(7US{r~yFr6V@YV1{xPJ);H6l;rH*~larG}LqkVK zMiv(rS5{VVI9x_XhQ7Xjb#=9&p&=fRr-d0AOw3RXlIjU2nS5}%Q`(%?H$az#eC40Baun42PWt&uYf>6K z4f$%EoXVIoqZl}9=59BwLv%M-$|7SJZ-8=AZiY|pbFVam`~oE`xa2S!!XB_kzj;mi z6mZ@I@01J~z3h+({$q!ykMs;LvrjgfD>F)*F%2?MjtZYug6QsS+hjd}x^eCu)G&6dIzuEK8CafEg%}vJP+-O@G-U?)F?n&Kg+r8DbKpj_01|F{;MC#c{s4aD{A6ElrK|P z9!V-0^-t6lQuO9@eUoeCYvEgWr;KhuO~+NN$!vUBX*$(>T8;||4zX&AC?3+>Vf8M; zG&rB06p*AI6iilnlCqo z-xL;HT7cz$nhEz_JxK$F_Q?R%SGwhpQNKoSVX)G8EJ9Lc`57@ZtP$64qBwyD?GHT! z)B+-gdp0>{{76n_hRu~26*f_{R!{S(fyu9EOsivaM5YUVZSYv#y0*%o(knfwK1pC; z8;A1#k*7K;gR0Z`$Wl@VFOH%^)){3rblS9XDL%1v-Hg0Ju@y8DMXRU=7Ug{B^fV1O zBC1?-VcZaf$LKw7?JmGptwIc#Lj=#G7WAzQdU8bb10&-`7*(C#UW-&!Rk_Za3X83) z#7r3)ALdvT30f+v-IpzXV)sC4H>+tzqDatqY-u!(wyHDyJ%sGmd1r9UuF(8_qHp;P zqa{xd%8Jkr}so4k}g1dVYaj^VM|Cn%}gHhTOz>7QCC_9ZWlg9;eN7SG7*F%>@gIFiiHRXx6-}Dx9%+uC+3rrO(N#|<1 z8hT5MT*23+VVEm@jfg5reA6r89vR?Q&_c|lc%;%mZiCs?kk4Pkqir3trJ+`T;Yhi5 z%MZOqGd|s`h&cAeVV!`=fl@EN>%DyBv(s7*J8YBo3tF26(_MtVgHKtY@ao^P4K1&E z2Y{3$k*MFS?Z*BGQ`8co)FX(;GUZWWy_lC5|B)XKOI^-s@)&L*`!^B3aLP2Y*rU3- z2&9*lP#j$t)*A5+JIu91$nv>If<`ke@bp&;Ud}f#_t+X&@ZgS2;&b=HO(8Bhuv6)W zYnsDt(E^5AqS=~iZom5yEKb+IT%FoyBg3aIHs9JRTkmy}7g|kPrG(r%>dJHNkh>da z9hz~wf~De;XS-dtD1vNGoVR)v%m|sv@C00}4drHI#aA{m4;x5Pi!R`z!DvpcmPr>9 zdlRoa0?wYo7VnX`3qkT7RF<|#;*&4xqAsJ3MvcRX*K%sh37uap%+evpOkQ}0fWrzK zwcu|B^gCIt{-cUYsi5YqXS$*s4BTHfNva| z3Y$-`r77d10&VFTRSo_pNMR~BqOjp{ZyZGiRJjRA&T@SelG(xUd{m^!1Oi}Uf>jVt zo==BKHUyc0<->v+pJTM51&uitP zXu2sjttJ)@^!faZ?GUN~cx2di1WIP>v7U;#giRlmNHzjLWl}4iG587DBPp=aU!Eoq zxi1t(@jv}M3~S5%4qa|ZmGQDDF|XES5IUsa2ur{1F@4$}UlN~R$y2-voej-AZ}${5 z*I}aZiw@T_Kz58tV6vR6@Ij=KRMZKu&!R%NazEK{G3@`PxN&a$)Z+CtmW%uA-QR#q zXJ^^+WYdWLhSHdMz4-SctOVZ>@-c!uU+Q=d*2G@|O2q#0s|76(t|8*x>^aro)+aW9 zWa~qE*XasmBB{R!^dXiBb$*r9%R{7Nl)@($i3h~0LcJk%qE_(29q;{4%UML^9A^OZ zhcNA>`sa)2I}cevdl&!4no7M%^l66e4dgjv4vp64d8^_C_J&^oxR|nia*EIy`)Z?( zSPA;-MngfljE0C8o&pI?8G;jQ!oUoq{;f{V-_1 z5iK?UHP8hO)4sw84U5`8Jb2?N>D2L!L|KYP2^fR(Ni%2%hkUf=m^w79q_(|XrTs{B z8Q>=$>{1pt8UG@0Sqy=sW`C3T(R2=blEyNy{F^#c~(Q2^0vhX7}jQu~`**NB*oTIWvG9!>D-R*aD z*9FEvvcQs~>}&^HA}B&wr3UQN5uo~sp+`em0yf(>v(FYu-G`fj*OEk}bX41UtHQ(P uOPBm1X|zPN`tKe5*XaMbkTx`Q0@9&(c{zkpTBa3&fS#72W`(*_?0*2r*ykz$ literal 2598 zcmdT`i#ycY8vgyvxQ|QZHo|OjNlor;BzMVmGTMk-i*eaRluL|X7`I&Jpc;m9sZcTs znWWflr;SjVHcGCE7{g#(8e^R4?0wGp8_s&3^}Or-p6^-fdET|Y_gguqUG2q0kRkv8 zh&i0H#R34xTY`WPj0X`7UT1!=SggG@&^UNtfk)stD;FyOcw8vT3FPPTgQuO(*zs^? zW@cz;=Wj~zF7fQZAoy6^pO08*2KgS@zK z^r^G403hD*V}hUSg3@`hSO;6HGYNhS()A?db8*5|YqH_oJn#Lm|C{g znc@#|S&*ObfFwJLz*E8s=!Wq8ON{p3iMIaMdv0yWDZc5G(r!-RA+<<@3Q?)b*73OK zm&rdRwUFoTs)?G;ftg#Si_I_8NY(mriN(Ga9_wM*tH7W$i3dY(6!e;Sl z!%d^4>DD}2n@6VX$D*T$ikCxcEJQAa6}k6SJdOPGHHgS6IY+xzu}m!lr5MRHb#MO+ z4aT@=To|@626QVN~}TxSu(XhAfLa!bzTxuCmuxU}5G6-y_c0Z}ZCIU-ekyh>%<1O_aN4}WPbnvlHPnCq z40NF*C?D=MfV0xJb?N`)xykC1m)shydQzTcY4zl&k>Zo_{#Ki%^9oWP z|8v;?JvAW{Ts@W^V`Gc#J$nb`K9C&Vyjasp(|&g#&h|r^13~N&&F9I3oy-FlAo1Av zt-R9gD}gTid(0aMc)@&|*moaKiXOu~ZE-HSCF>b?&Uzn=+WA@blXZF6yV2Ti87-N1 z?`+md|D5)G#k@$Z=1phQhFYd4WctRXDFDzsU(m0KBGi@VG0xJfPZ5l}LY2b>*E1Q+ zI`kTXNy8Qb z{Sd>w9aRTTV$24o#gv0DzG&S@?SpFXAuOGp6d)}L;jK!NGRx{t#;S03r^l;n&rXER zQu4lwY=3Dg!_Pd_+zesR=dBRL@lqA72-!&5LvMAOcfQiVdZc>zT$#D_h8|1WGBz>E zzk0#L>w25&yx#Stii-<)pD&cIWPUT2`xT2;s(o#6(}JmsFiT!leKya>CA;kK%|uRQ z3k8}iaNqI1ay~+^#m9!-BST3kT&1J)jfE7u$T4Hju(AJKNx;yhdP?h645it4yw{3x z5YRcmI&5@r4dbU(zwB)Ks~5Yc6!z(@9IEk)xPau{&*EDw=@=bYKL(Ntb(b3d9+kqs zt5AuhdUP88Y8l=Kbhjj52d`qXaY<<1{pqsPSL=}%+@~)MbfJ-uGnd8g*@`6;&Z+7o9gjS^R^3LM3mOVe!IgnYVf2Wl zcz1(#P*vd<4pI(ZHL=mU>ym<#6?><^HOGD$th(wnAdncD_RP*a#o5R;X>BcQ33nmCfeHjm1d%)-oFi=~}UMP$^&lxzN zA3&!5Rwwwz)Pvu>B<|dDzY=0wdorfsi`g}>@W*?269|jiu3pAJQ`up7Mjh*-Zy$GS zsYh=zpsW}I$d#P7%ock;40LC5br!=Al{LaxVaJ#~qmtW^Z|8oEsAsmy{X(#^NJCc2 zea6@Mz3YfP&6ni-Ii9A6Oat53XbQSY)G*mH{g|{TI z+G49YDQCxT_yw}P!|c{J(#N7pXMz+(-0OACyrj7HT#b-ZvOQcd2cyq;kBoiWnE%Lu zx1d)GzHq(TkvS($yz>bYju_jNxWsJhLbQ&Nj1w@@Ot!EjtUy<#sz&hc&x6lubEM^& zM%_iVQ%xZ5?-EErzgtkhR_EFcTCOoa0zX5eSWNde zoTQYiD|7Hlh6Q?lnnM=Is4Bdx7@$OKCc)hLw95mPRRmD`%7tEJ=_8sfVh#vl+nshj zh#Bk@%QNmH8_KzQ0ZWcp%2}gFx$4^TCK}OyJgD=fKlXwdsAZ&aC}`X^3dS zO=PZ|yp3|^u1K6MNhCh_cOqwQpZ3`47y9~7AJ*Bq5mP1pFoO$LJLh1l9PneSk-&Zl zUBLpRq$MwR@@e{&+QG8_oV>i*yIk!1ByTyM2U6b<#7+@8iA$dgw+Y?a4vab4n!u39eqo2czT)>irSH^&|L z5&5Y~5q#kiTGq@%B*+#-tAv*UD z%M`wU_lLg@G?)_8Q_`JctnIv2aVZ926RD{kyDke5lDWxUO?=jolG{U&XP(6EQ9FFO z8gY==_BwZGZKwDgwPQXOLTs;ZRj7b+c*Jb%lw8FgqjRfJVr^=D1=ok^(llYNI#BWo zfkXi!j0NvW#Opyy)Po$hXb@n+yv?NR)PZ|XlsgrPxBgOdX5tPNv#QBd4}duNsSM($ zA~*^yB$tR1Yp+xyrru0^cTMId2|WNAdD^Nt^HhU?4Q77x zZQh1A|8qS*+=*vOVTbG>MQ^N0KarnPE(VC z0=Scq0tN*DMQ(&SlRg6%e*`s2L_t(|UhS0UcNAq9M>oVBQ4*6#LV^(z8#ch+D0XFO zOI_+xLo@asE7pj;D`Ejfv7^|DxPP1PyL%~T_%@#ye!qL>%spq$nP<*(XLkz6(S(oE zG%8K=DUo8ac-Xbv64pzR6i!W%jA~9X`pD*(X*ncofZ}P9P@rL^f8~(O0g9&|TYzaf zBx8Uvu|NbfEr(jsi~-IFgv~>TdWlx1<&ca4 z+5)ja3=z$=9Fj3WvAw;$tu1UGO9V45hhz;sZl>js>;YndsJfY!Lox>7?vsE* zQ!@bm2u8Uvg>xQ$?RU(aapx?aaDr3lf95S8rLR<)J*RK(y!rFz z&Fz~ryHqMoE|(W9T(o$}(xpolFIu>uTrN+mRF*AYv2xYw)vH#nSiY=Msm!WY*Q{N) ze#6F%8`iH|yQW&L@`Mwd!np1fNzcH*rp;TnP6)4mThEreHVu^e2M6!I=idA7f8fD~ z9)9G}#~vRne@_`2dg95ao_^-p?aw{`!iz7xJXD!JJUsl$j#poM{f#%@di$Ln?+)iW zzw({X|KrcU4*dPk{`>?;qxKEpkADne-vG8gKLXcfaDao2y$_BwJi>Ju3dz55 z?{KOY7}5I$)RIF delta 728 zcmV;}0w?{n59bb$K>;qYLN5Xj0002hP=MF~006plQchEokpj7Y0J~`3hAc`GDLCt^X`)-cHT)y2;ygbkOuxDmx_PO&rcV-LcQHRe` zH!Ms2@JO*({Lh1b$r8@X&``J}L&LE83?u%(9J7`nc>@$Ljf4V2W-UQ-2Plp_w*YGi zk~6@lSRjH~OOTua8XLpqqas6QEkSYyXliN-mp4XgW-UQ-2DmH`E)N}QC7M`EkemUU z1F=915zShH=j*b<+$U?3p|zFm>8ZH&35& z%dNM~ynX6_9kXT!=FGkGuDkEK_r7`e&z&=W0Z+KVDRl6b&(d8gEnL*Sc*)YGOBQ!8 zT39NTCYQ_0maka3YW3<>D_1OERxX!kRVr)Nu3Nuh zzn}UOeJ diff --git a/src/main/resources/ponder/cogwheel/first.nbt b/src/main/resources/ponder/cogwheel/first.nbt deleted file mode 100644 index 3adbe8a14225d25b0f70925745bc16c4abc8d986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmV;Y0$BYYiwFP!000000M(YyZqq;z#>e|7bzCIi0I$KlH`*THQXy3!;1X@^ZL*4! zHS3K+d+OW3kyGzH4llsf?8aU>0l7{ll+*Xg`WT<~lRw9sX^sT~w}X@!-|9osokPfpayAqWmda2SHa5u7lh zft;u(r@IzGa43Sq5FC!+gh3GfB8YwsaVUbr5FC!+v@J#Siz50p#GwcdLvT2P69z-{ ziy`_o#GwcdLvT2P69z~0izE6q#GwcdLvVO6Cjq)Vvx%G1D?4)`UuxqnVjwDm$ElGn z^WZ#RsccfHLiULBg>FBzq=9nar-hW+*DIg%=)_%?n~B#&<}#xM_D-Z-YcuB%ABjSw z%3i#<@=$i_-t1m01M)Jfs&7^G{mU_j(Wy1Etl#Uk!Y7TwQZ0&HPUdPUtx6M@saGa- z{|?dHs;WM@^E-FXp*z2K@w{&n`eXYcrFUfx`9I7#8Zw7;>R|V`j^m*^=r8IxgnLuR z^V{kmp_Z*W_+4#QID0kmbC?vRz469PtfiayO^>$!8b&wl zK~w@{Rrm!ny;cpL*e5eo?q8+N91y-+SU{P1+) znvfcCZVx`Jgt3>C&6l)WGnYEM6rexNvd{n#N zM73`r(-#%4>(c6|71h(Fj-FlxOng)&L>Db5?6+K)shp&Gx}Hgy@5Xu%_U_DiwHqQd z;Wi<)$&F=09=GA&H5uRZj-YnkjiN@L7ZjBKQ$5=b{Um4;4C$e;e=MwcBTcEadm!U$ N_yL(2a*?JE008JoQMdpA diff --git a/src/main/resources/ponder/debug/scene_6.nbt b/src/main/resources/ponder/debug/scene_6.nbt new file mode 100644 index 0000000000000000000000000000000000000000..6a7f63510763f478e666f0882d5c687a3fa3b59f GIT binary patch literal 436 zcmV;l0ZaZLiwFP!000000Iik5O2jY_h9^y`ZAI~*Ac!}gV$YsM5WSXcJF>xUQ#z4V zAI#@7U6b8)Dcu1b2sF(<-z0z1rU1x6k@-Xk07FY-%OS(o8E24Sh#ZdQjjdj(@SWQn zWM?TRZ9+myPCE=4yBaZ~5qp}1!I2D(VsK)J362=i>~j(ZM>05y!HJPDd`=iXPjMuJ zqZpjcRxo^)44|twS2g(1@`9DNPK;IAe-&#-=!u z!BL}}0%SXPDWs1bVh!uO^LzhD>laU5?Uf>f#ME$6_2_#uY%5Jzm$c9?Ze%9Is&>CV z8LCJ)d8~TdG|#$u8wRo;?pfeg3r%Eb#3QliwfYk=`FElmCFXG4=?0y{;a8t#pzie& z;bLi8ta|U=j9R-Y*S7)0(W~v~YGE9fm2G`(kBo}zt)jDyp@rWH-PTB6?N?De^tQu( zxNm%he)p3VADiTxu#T8e{@%>J^iy)Cdi^Np);YU`^hGy>TWSVH5IEa~(M_exP^s~= e)qNR_^9J8(r=PJWV_Wa<7kmTIB;Zs%2LJ$$ThC|! literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/debug/scene_7.nbt b/src/main/resources/ponder/debug/scene_7.nbt new file mode 100644 index 0000000000000000000000000000000000000000..d0b4f88f6f857f99f811d2594febf92e29960dc3 GIT binary patch literal 578 zcmV-I0=@koiwFP!000000IgNcZrd;nrfoU3-5xfe1A6IubUE$suwJqO!G>*@K((1h zh+_$o46i%osrr1Q6Wh%k$I~GM3|bQPk^Cr12|x_Yh(8zrK>dZSjv>Or3M> zIIZ{&Jo^qjkKqIkILra3D}_TmV>ZEn%_$DYa9Uvw95RQP$8Z7%95#rPKu|o`gr;O^ zS2PR@sp%&IUu5t))kv1pWnPMGp@hN&{8Et_%VbpymB8zj$!}bQ5Y821_I_L2yqeLk z*-d;?8CiM>T+Gl`Qm;dZK61rVVV^#4YhX5~d!vS8;NNGY-+{Ni3t=+18qNOJ*vEU_ z#EV7B4Q30o;!8?yGMA-J>FV)*)YOswN&1fTFVZ)ss&ZJ};CyKW|4rjflZFu+mE&S9 z3bZ0UmB-t$JiJ~WtjS~V=&Es)p_0VY)tAz$(taqHOVlp`M=^x=7B{Bh<@oINy@cmu zi=COR=@?u75nC}_D4wIWSU*RT2-u8o5Uw}mCDnAgrlye9V)tS}yL$7oTCIe|MJfvl zk{}aEzG|sZ*Uuf9BR3YpCC?2;a9NR8oy*5Z%(}^@F}vZuJ=-Cx@BpB0O=fjjFYNkr zH|WAT?&hO-_-|prd+N5_Hd}a+p{XY=bOxtN&7zD-&i%pN+7_TSB>%{mD9Ol5`4xF}ldpKTC zOqb(3aF_#!J8;_KJLK7S$n!o9bKr0X&h}S0l@=3&`K;L9nzOf?d0WaP5UFmLt(&s)EGK($1Rx+^zm z%NIzPm0~ez#QfN;ZKSWd3Ze@{QvV99`f*y!{hXj2RjarCx<-vae3_B#JU~< z#hjEPM{BV@AB7R{u~;I!Skfq|7Bf3Cg{qRx5enM3=YQT-b7?V2RY4y~$Qa`HT9v5l z^H&7JipJ5o$}*fnFcY~!Vu(9wz`NVxTESfCtY&4^95L^*!Wm_+$iQEf5uDYGMC7W- zl9|-T0=IgFTV&71__%L7Z9#LgeH`LhgV>5O7`_u$+@Lm674)0G!*4NS%z4oY000Y{ B7zzLY literal 541 zcmV+&0^#a+|}^82#GVMGD!uY-FkYr;D2~ zL`-NCAm~58g(h_6~25u{g?q$6`Yn9X~@Whfo6#wZB8v_ zWlP#ol6Tbfkk(cO_@OYvc5g4bfvmkmjh7HF}TXI8HMVW4S~) zTT)o1r8y&~&APZdv7x>D^yl66mGW4WM$>;JWDfZoYZ|oSxX)lPBg1+QY}I6NBCnMz zWNq}km?`T#2ya)oqxS3pUEcAU1hzKwIaZL)WbKf;0~eC(9q2&|3ORKV_tej}YN;!9 f!OU+lQ*_6#q?eayoidsp$v5}`v@Fk5?Faw>26YO$ From 45fc0ca7ee3145e0c9cc78900708aebfe3051263 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 19 Feb 2021 20:21:29 +0100 Subject: [PATCH 08/23] post-merge fixup --- .../create/blockstates/radial_chassis.json | 24 +++++++------- .../resources/assets/create/lang/en_us.json | 2 ++ .../assets/create/lang/unfinished/es_es.json | 31 +++++++++++++++++- .../data/create/advancements/aesthetics.json | 4 +-- .../ponder/elements/WorldSectionElement.java | 8 ++--- .../assets/create/textures/gui/icons.png | Bin 4765 -> 2719 bytes 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 2e2d16cf1..8bd829ffc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 002bcd0e1..7b70e9d81 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1824,6 +1824,8 @@ "create.ponder.brass_hand.scene_4.incoming": "Incoming...", "create.ponder.brass_hand.scene_4.title": "Debug Scene 5: Emitting particles", "create.ponder.brass_hand.scene_5.title": "Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.birbs_interesting": "More birbs = More interesting", + "create.ponder.brass_hand.scene_6.poi": "Point of Interest", "create.ponder.brass_hand.scene_6.title": "Debug Scene 7: Birbs", "_": "Thank you for translating Create!" 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 86d845459..0574cbdcc 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: 11", + "_": "Missing Localizations: 36", "_": "->------------------------] Game Elements [------------------------<-", @@ -1800,6 +1800,35 @@ "create.tooltip.randomWipDescription7": "Este quizás no es para ti. ¿Qué tal ese?", "create.tooltip.randomWipDescription8": "Úsalo y arrepiéntete de tu decisión inmediatamente", + + "_": "->------------------------] MetaDoc Text [------------------------<-", + + "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", + "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", + "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", + "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", + "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", + "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "_": "Thank you for translating Create!" } \ No newline at end of file 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/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index 4114ba1a4..bc5321c4b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -13,10 +13,10 @@ import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.ponder.Select; -import com.simibubi.create.foundation.utility.SuperByteBuffer; -import com.simibubi.create.foundation.utility.SuperByteBufferCache; -import com.simibubi.create.foundation.utility.SuperByteBufferCache.Compartment; -import com.simibubi.create.foundation.utility.TileEntityRenderHelper; +import com.simibubi.create.foundation.render.Compartment; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.SuperByteBufferCache; +import com.simibubi.create.foundation.render.TileEntityRenderHelper; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 499eccc3826ff754420db87460668b49e8a36fdf..3276c6033f25f4f3b11ffed88de3f52b4c42e5f5 100644 GIT binary patch literal 2719 zcmdT`i8s_;AODSEY%@%j43a5Lie%qq#!lI@?_}&dMHt4CR8nLoAtRN2e=I{v$oil{ z7(!&7kg<+;de8Hm^ZpC(J?Ea!{e15CoO?g_eDA&A2gZgvFcv-*003Zmx|*f{0HO^+ z027!7-ep#1e^{`ojyg~=c;+XK(7US{r~yFr6V@YV1{xPJ);H6l;rH*~larG}LqkVK zMiv(rS5{VVI9x_XhQ7Xjb#=9&p&=fRr-d0AOw3RXlIjU2nS5}%Q`(%?H$az#eC40Baun42PWt&uYf>6K z4f$%EoXVIoqZl}9=59BwLv%M-$|7SJZ-8=AZiY|pbFVam`~oE`xa2S!!XB_kzj;mi z6mZ@I@01J~z3h+({$q!ykMs;LvrjgfD>F)*F%2?MjtZYug6QsS+hjd}x^eCu)G&6dIzuEK8CafEg%}vJP+-O@G-U?)F?n&Kg+r8DbKpj_01|F{;MC#c{s4aD{A6ElrK|P z9!V-0^-t6lQuO9@eUoeCYvEgWr;KhuO~+NN$!vUBX*$(>T8;||4zX&AC?3+>Vf8M; zG&rB06p*AI6iilnlCqo z-xL;HT7cz$nhEz_JxK$F_Q?R%SGwhpQNKoSVX)G8EJ9Lc`57@ZtP$64qBwyD?GHT! z)B+-gdp0>{{76n_hRu~26*f_{R!{S(fyu9EOsivaM5YUVZSYv#y0*%o(knfwK1pC; z8;A1#k*7K;gR0Z`$Wl@VFOH%^)){3rblS9XDL%1v-Hg0Ju@y8DMXRU=7Ug{B^fV1O zBC1?-VcZaf$LKw7?JmGptwIc#Lj=#G7WAzQdU8bb10&-`7*(C#UW-&!Rk_Za3X83) z#7r3)ALdvT30f+v-IpzXV)sC4H>+tzqDatqY-u!(wyHDyJ%sGmd1r9UuF(8_qHp;P zqa{xd%8Jkr}so4k}g1dVYaj^VM|Cn%}gHhTOz>7QCC_9ZWlg9;eN7SG7*F%>@gIFiiHRXx6-}Dx9%+uC+3rrO(N#|<1 z8hT5MT*23+VVEm@jfg5reA6r89vR?Q&_c|lc%;%mZiCs?kk4Pkqir3trJ+`T;Yhi5 z%MZOqGd|s`h&cAeVV!`=fl@EN>%DyBv(s7*J8YBo3tF26(_MtVgHKtY@ao^P4K1&E z2Y{3$k*MFS?Z*BGQ`8co)FX(;GUZWWy_lC5|B)XKOI^-s@)&L*`!^B3aLP2Y*rU3- z2&9*lP#j$t)*A5+JIu91$nv>If<`ke@bp&;Ud}f#_t+X&@ZgS2;&b=HO(8Bhuv6)W zYnsDt(E^5AqS=~iZom5yEKb+IT%FoyBg3aIHs9JRTkmy}7g|kPrG(r%>dJHNkh>da z9hz~wf~De;XS-dtD1vNGoVR)v%m|sv@C00}4drHI#aA{m4;x5Pi!R`z!DvpcmPr>9 zdlRoa0?wYo7VnX`3qkT7RF<|#;*&4xqAsJ3MvcRX*K%sh37uap%+evpOkQ}0fWrzK zwcu|B^gCIt{-cUYsi5YqXS$*s4BTHfNva| z3Y$-`r77d10&VFTRSo_pNMR~BqOjp{ZyZGiRJjRA&T@SelG(xUd{m^!1Oi}Uf>jVt zo==BKHUyc0<->v+pJTM51&uitP zXu2sjttJ)@^!faZ?GUN~cx2di1WIP>v7U;#giRlmNHzjLWl}4iG587DBPp=aU!Eoq zxi1t(@jv}M3~S5%4qa|ZmGQDDF|XES5IUsa2ur{1F@4$}UlN~R$y2-voej-AZ}${5 z*I}aZiw@T_Kz58tV6vR6@Ij=KRMZKu&!R%NazEK{G3@`PxN&a$)Z+CtmW%uA-QR#q zXJ^^+WYdWLhSHdMz4-SctOVZ>@-c!uU+Q=d*2G@|O2q#0s|76(t|8*x>^aro)+aW9 zWa~qE*XasmBB{R!^dXiBb$*r9%R{7Nl)@($i3h~0LcJk%qE_(29q;{4%UML^9A^OZ zhcNA>`sa)2I}cevdl&!4no7M%^l66e4dgjv4vp64d8^_C_J&^oxR|nia*EIy`)Z?( zSPA;-MngfljE0C8o&pI?8G;jQ!oUoq{;f{V-_1 z5iK?UHP8hO)4sw84U5`8Jb2?N>D2L!L|KYP2^fR(Ni%2%hkUf=m^w79q_(|XrTs{B z8Q>=$>{1pt8UG@0Sqy=sW`C3T(R2=blEyNy{F^#c~(Q2^0vhX7}jQu~`**NB*oTIWvG9!>D-R*aD z*9FEvvcQs~>}&^HA}B&wr3UQN5uo~sp+`em0yf(>v(FYu-G`fj*OEk}bX41UtHQ(P uOPBm1X|zPN`tKe5*XaMbkTx`Q0@9&(c{zkpTBa3&fS#72W`(*_?0*2r*ykz$ literal 4765 zcmeHL`Cro6*Z*KPWlcGwrKJ|lsF{;!Hfow8wyNM#=2Ey-mYRqgTBf4R)Qq`+nk6Ns zZMZAB04^w$DVDiq0*X5&xloY{1c+ao@AvgQ&+GXEo}Zo{?(5$3I`?&7=brOE=Y8%? zJLTrMWs}Y(006c)J014`0MObJ1Z@0aZSspL4gM}+JRFY#)jfJMYl3RX5!WLCP?NP; zabf+MtQO^T4g&yNE58rWNa@8J0HATu`S=mf_yExevs(0WJ8Ke?6R!e)dH2*)JK*t+ z4G$kX9Capcym`kSek^vs({}P>XOPG1ZMXhR-+&{eAN05x`_mQ;3ak5EFsJ9R;J#Q< zLl?Cq7g^Lw;yG`4>^g$PUOr~jTLfdSn;6)9VKeJdcOj50olJGy#r*nuzx#_%gCF&l zcj#K*xTs<+SDC$^Vmh74{q@baZ*2vn!o@{DOkVZ#P(|LQ2=4Bbs>G10E+9$I&VfFt*l9dKUSVbJqqjIeD*k|^ppM}$=OeSoJ@CWj-c`E>GZ(#?Fa!K zS;3?V$q`?F2U;9zsq$L?i~Lt7#%EucnG4`wWrp)UHJGjWGN%IJhr_Rvd9?f~IQP_a zORU}eUhHJuM^2e-@ifI4#jw*mU0*Nfq2j1aLrf#2b#_J z1!M70(|T9E+_0bz!@_`)_rvdAZbC~OA~?nC{ld8YsSipx)Hf-QMbuWqfZ+~GTZH#- z_S7w|!5#wg>_u82I#8$NWOu`pbmkUDEsP~iMRw65@z^h+IabOqW;F*t9lO7KMOU7^ zOniHUeS5tRR{7Snu%wkRcP2)RWLji-GCD%BWm)gc%Mf>?q(A#cN(44lSC;62)n2+8 z{|Ve*>gk_`j`Uv`d1B*t`-MhY?sfa{59Gy1m_nKF;nV}w25xfMR6f_?-a=V^ii@DF zYY4SJu9D{F)Dr&T-Y8Mzy_E=XZuL@)ch$vKo^`EEm+wg1a_Q4xhV?wsOPqiY2Oqu$ zwekwSXMN=m$?;gyfaRI!BveX^fN%Y%Cc5SI5=7+NvCAv&*aLh(?9ecFh~u;ZAXE0y zRxDEgjMjuz&fHD@#KkbW^ILV+;avizB$dVo_>dt`-p#X+g2-v*igy_`$wfiw##auZAFnl%T(f zUY9aG)Vj5(1mA;P_SLCUdT6ZY|`94lh7o0^Va5GWuSV;%Hqbw&Le^;a>_MjMgLTlp~uiGW1 zaNsJda5Eon=1_ez_(XK`a09i|hNn?pmpA-TJaYZ%6t$}7d0yF(<8yI*9WxR2X8C(Y z4CfZzw_n5TX$zhnv&8WhC+sFG6a6%Bv6VN@(jvP5pj?P;ZA5t->!2BWY7f@$?>5o~ zb4!NXSMriSSuSjA;kt>o7iHwi@-gGKt?eHwSXWQ&GVr1sLZ6d0A-lLXB?KbD7_DFL zUvA2#xt`0X@9Xxj*CQri(GnECqhdr6Hp6SdoZWBF2&bJ);)$A)ZL*XQ+^&~M3`?WM z387sPYj^EY%#u0Zl)R1fcx9<0jdOO;mZpRE5nGBHwe&HeX<5Q@*VBU?UXLo{ahHs8NJ%xD|)>{(1o0>OG(kNW+{4$%FnVFKr8kXB;PL_z*=CbP z>%jL`CMBkwg`_bZJgm8eGS1-^t)Y&y=;{E_|N0O9d=)?LQU3H;cuXx#tyvp_&Fom` zWV`S_SD!DLw6+KY3lwOir4HDZFRkg9w%s#se`-6JDmNOkc-^7kF@UqanBO_W8Q{jZD0&3 zdT{_DBW26R|5TAm7yDEvtX4E6F)Iu63kV>Hf0?);Jyfjt@Q}7*$+i~(ix>GB0T}UzA2Ne1-RL$6>-ZX5A@KGNLyOT& zC>J^pwePvS#t5~Y9)})Q1tM=HXrlTLH+R=WBkPmHo|!}GCDPOo*v|+ z4X?EU1$i{%Ct_cxZs%k-sNu~Z)@18O&!!8+V%yWU?d@pD{baMqOEIQ zYMFs#V}|5OgaaG&*pskz*`&DlH_FE1o1Hl6+@^eG7@KH>TU83dlY^@trhKQPyw!y} zmf!B~fzFfh9YwFMjHz_uD-1o+Zd$K8kJ=nf;>87B5vO~Q`lWUE4S{p#$r}0HPlty! z^1U*GV$JVF%;t#i;6*bP+n5$9r_-6m@qQ1w3Nbq3#hHOC@~D*(bQ;a;Ym=eU<+eMJ z@Fc9iY3BS9SHGF*{-9dC;O1Bo+5Y%%w7*3@y^qKgvXtDIMPO<@aI`CWmUuXlAwJ0? z^*Hw!GF}g?r|{)+`4wN?6fGa@=Io}Li!mnG>IO${zAb*2Lg;vxnd6~p#*SfgcZ{#m zsPka^VgouvSi3F7vq>5Uf)xzZL;7jrDQ!z}NQ^T8flZ8&jzsK(Jo?R;%X~+?xO6XE zV4pW#S)(u9%ZE&ntBV6?+VUEDTJu)!?P{aF8U)`pO&CpH=sq-{g*l^A+Squp#TvbvV^%6pBL*l>fMf1jaen}@DgvcwGe_D=Oem*?hu zEevsm;Ezr&#@>;A4VBRY&fvE`@%IhTQ#G+$#mTQZVjCS|y8GZ=UX4YyVRB^CN5|xa zxhdw7!2$Vhhi<&qRqza+pZ^BIb{pk+CvC05jOn*7LV+|cy0rC*x=?5N>+b3kJd!RR z_GBm(7gKi!9%_{vhC+mLOaiv)CkXX1eb;#_$V9flM;#`4#tpGh-ilC?aP;aW5)KzP z2wS&2F)h;Px*|$df~Bi~)uJ4xw48@7e@~@qZyoOU4}ae6t1Mm1 zzFZ^sVDjayCI$u0=Ah2*v0PP;tWikT)LSdB7n3L6a!fg#Z{y?RA$%BCw)iE*yH2?E zj!Ck*Lxh3$~)^Mb%v1Kd|Wo8eF!kIZES zSX}t%ConjbxK$h}D;!r)gCPCaxr`Pk>Lgk%rd$Jeb}o3#!_E;~bv07Pkdg6)BX zmIQ&ox-nRG=^>|q(6DPLQe_q&bF)2ge;kJ16R7-T=D`%liP>BiaI-)%OlHUPts;!r zF*Rh#g4n!qci93r0pDK}gB4sAM}oYwk(Fibm-s^h^7?xjWfwFbyQ&%h`!oP2fMB_@ z9blm+)qto>BY5S*zJW%SELXRsQ}^v+0YIEJtd<^^;P zFH(TojlS9!O^Zv+5E?i3ZUC556aW`=NOIy~;SSdRLI7Y(_wJe4@!g*P>Tm(VcBY!O zmqo3(5j#}OgN?U~-rrl!oeMIypVtxs@iF;EIC8uC!_h~r8=fudCK;=lw5R$P0=S8& z)g4aG^5O3#8n>ZtjYUFfXRWJN;J&UpO=xo+_4p_$MP+VEy>w5r6jZ>U&v00Fb{La)MXrKV6z1~I z-tYc-6{!-Y(f5~G4D*{az`A~!xv8?~iy8E5E`VEjy%&cx045m4ssO8G$mb7`^vFL? zCxDQ%1~{iR02=&veEuiy{$Kr1N%-IC_ Date: Sun, 21 Feb 2021 03:18:04 +0100 Subject: [PATCH 09/23] Such convenience - Organized util and scene builder methods into nested classes - Selection rework, allows for addition and substraction - World sections now merge into a global world section after fading in - Support for managing reference to elements created by previous instructions - more util - Support for animating world sections to roughly simulate a contraption - Less paperwork for making new scenes - Support for outliner chaseAABB - Support for outlining selections --- src/generated/resources/.cache/cache | 30 +- .../create/blockstates/radial_chassis.json | 72 +-- .../resources/assets/create/lang/en_us.json | 19 +- .../assets/create/lang/unfinished/de_de.json | 21 +- .../assets/create/lang/unfinished/es_es.json | 21 +- .../assets/create/lang/unfinished/es_mx.json | 21 +- .../assets/create/lang/unfinished/fr_fr.json | 21 +- .../assets/create/lang/unfinished/it_it.json | 21 +- .../assets/create/lang/unfinished/ja_jp.json | 21 +- .../assets/create/lang/unfinished/ko_kr.json | 21 +- .../assets/create/lang/unfinished/nl_nl.json | 21 +- .../assets/create/lang/unfinished/pt_br.json | 21 +- .../assets/create/lang/unfinished/ru_ru.json | 21 +- .../assets/create/lang/unfinished/zh_cn.json | 21 +- .../assets/create/lang/unfinished/zh_tw.json | 21 +- .../data/create/advancements/aesthetics.json | 4 +- .../create/foundation/ponder/ElementLink.java | 23 + .../foundation/ponder/PonderElement.java | 4 +- .../foundation/ponder/PonderInstruction.java | 26 + .../foundation/ponder/PonderRegistry.java | 57 +- .../create/foundation/ponder/PonderScene.java | 273 ++------- .../foundation/ponder/PonderStoryBoard.java | 14 - .../ponder/PonderStoryBoardEntry.java | 25 + .../create/foundation/ponder/PonderUI.java | 4 +- .../create/foundation/ponder/PonderWorld.java | 4 +- .../foundation/ponder/SceneBuilder.java | 292 ++++++++++ .../foundation/ponder/SceneBuildingUtil.java | 115 ++++ .../create/foundation/ponder/Select.java | 167 ------ .../create/foundation/ponder/Selection.java | 155 +++++ .../ponder/content/DebugScenes.java | 550 ++++++++++-------- .../ponder/content/KineticsScenes.java | 99 ++++ .../ponder/content/PonderIndex.java | 17 +- .../ponder/content/ShaftAsRelay.java | 57 -- .../ponder/content/ShaftsCanBeEncased.java | 66 --- .../ponder/elements/AnimatedSceneElement.java | 7 +- .../ponder/elements/WorldSectionElement.java | 147 ++++- .../AnimateWorldSectionInstruction.java | 68 +++ .../instructions/ChaseAABBInstruction.java | 30 + .../instructions/CreateParrotInstruction.java | 5 + .../DisplayWorldSectionInstruction.java | 33 +- .../FadeIntoSceneInstruction.java | 26 +- .../FadeOutOfSceneInstruction.java | 46 ++ .../MarkAsFinishedInstruction.java | 2 +- .../OutlineSelectionInstruction.java | 28 + .../ReplaceBlocksInstruction.java | 29 +- .../ShowCompleteSchematicInstruction.java | 5 +- .../ponder/instructions/TextInstruction.java | 4 +- .../TileEntityDataInstruction.java | 31 +- .../instructions/WorldModifyInstruction.java | 10 +- .../foundation/utility/outliner/Outliner.java | 6 +- src/main/resources/ponder/debug/scene_8.nbt | Bin 0 -> 319 bytes .../{encasing_shafts.nbt => encasing.nbt} | Bin .../ponder/shaft/{shaft.nbt => relay.nbt} | Bin 53 files changed, 1771 insertions(+), 1031 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Select.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/Selection.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java create mode 100644 src/main/resources/ponder/debug/scene_8.nbt rename src/main/resources/ponder/shaft/{encasing_shafts.nbt => encasing.nbt} (100%) rename src/main/resources/ponder/shaft/{shaft.nbt => relay.nbt} (100%) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 208ff9692..d8d0cdebf 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json +6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -880014dda429e6e2f21e227398d861e4da5e90c6 assets/create/lang/en_us.json -c07a94266b5ccde4d9e35467943cc512fe4b5896 assets/create/lang/unfinished/de_de.json -e5a0e1b67981159c16eb4563736f85310c77f979 assets/create/lang/unfinished/es_es.json -4c492fcb95abe9242c3149ba2b08451ba078c223 assets/create/lang/unfinished/es_mx.json -a9ea43cba7ebf87860d165839c98986b8da17f8e assets/create/lang/unfinished/fr_fr.json -cc4fe91e45becc807f49b7114d32d44812d0ec42 assets/create/lang/unfinished/it_it.json -287f5a8985786f1fe4a44a4ff4907902074aa725 assets/create/lang/unfinished/ja_jp.json -2125c67df82987c0bf66efb0b6c59da916362480 assets/create/lang/unfinished/ko_kr.json -9cfd8839a607ba5230a9716bcda3fae0fc9fd9fd assets/create/lang/unfinished/nl_nl.json -d972eac60bf24d8102c013667b3c76291912edb4 assets/create/lang/unfinished/pt_br.json -a552694a6a62274a33cdea255584c3ea3bbc25ef assets/create/lang/unfinished/ru_ru.json -d4ea1d09bb09cd8fdbf9a9c996ab66e8db290e92 assets/create/lang/unfinished/zh_cn.json -5b453190f3d422b4124b426fe61cc831b89fd2fa assets/create/lang/unfinished/zh_tw.json +4bc90775f20e4373d8acfcd68df5a65134e04866 assets/create/lang/en_us.json +556b49bc145684816fe4ed3d01b8292b027785f6 assets/create/lang/unfinished/de_de.json +0112e46354dc5a3e404e80f18c3e9cf2ce2ac3a7 assets/create/lang/unfinished/es_es.json +22d8dbe2f7a2b7bb7b8175e6ea7ffe5461138339 assets/create/lang/unfinished/es_mx.json +5aac59946786fe76ff0d5ab8e548c086adb46a7b assets/create/lang/unfinished/fr_fr.json +479b811f2a0a687e7a1d14cfbed85af8ed8167b9 assets/create/lang/unfinished/it_it.json +22ab034f6f8cadcbc689f27e8697e52bc9fd701f assets/create/lang/unfinished/ja_jp.json +c046e6335a67a8685bb7e74cd6b14a5ee9c376db assets/create/lang/unfinished/ko_kr.json +96995633b85eaff2ac1b38a8958c6d167150d255 assets/create/lang/unfinished/nl_nl.json +8e8159926be6be37f97f6d4cf47deb8c236b83dc assets/create/lang/unfinished/pt_br.json +4485be9e7a8a2b0d006464390e664d6d504328b5 assets/create/lang/unfinished/ru_ru.json +8bfa521e0220fe71dbeb537a08845522e1ae0899 assets/create/lang/unfinished/zh_cn.json +eeaa83dafc8a683b4834cd87a49cb9b3c88e4121 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 @@ -1587,7 +1587,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/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 8bd829ffc..f97d8c8bc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -89,8 +89,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "true" + "sticky_west": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -99,8 +99,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "true" + "sticky_west": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -109,8 +109,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "true" + "sticky_west": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky", @@ -119,8 +119,8 @@ }, { "when": { - "axis": "x", - "sticky_west": "false" + "sticky_west": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -129,8 +129,8 @@ }, { "when": { - "axis": "y", - "sticky_west": "false" + "sticky_west": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -139,8 +139,8 @@ }, { "when": { - "axis": "z", - "sticky_west": "false" + "sticky_west": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z", @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -207,8 +207,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "true" + "sticky_east": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -217,8 +217,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "true" + "sticky_east": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -227,8 +227,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "true" + "sticky_east": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z_sticky" @@ -236,8 +236,8 @@ }, { "when": { - "axis": "x", - "sticky_east": "false" + "sticky_east": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -246,8 +246,8 @@ }, { "when": { - "axis": "y", - "sticky_east": "false" + "sticky_east": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -256,8 +256,8 @@ }, { "when": { - "axis": "z", - "sticky_east": "false" + "sticky_east": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_z" diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 7b70e9d81..c60e2f77b 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1813,20 +1813,25 @@ "create.ponder.brass_hand.scene_0.x": "Das X axis", "create.ponder.brass_hand.scene_0.y": "Das Y axis", "create.ponder.brass_hand.scene_0.z": "Das Z axis", - "create.ponder.brass_hand.scene_0.title": "Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "Incoming...", - "create.ponder.brass_hand.scene_4.title": "Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "Emitting particles", + "create.ponder.brass_hand.scene_5.title": "Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "Point of Interest", - "create.ponder.brass_hand.scene_6.title": "Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "Birbs", + "create.ponder.brass_hand.scene_7.seamless": "Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "Sections", "_": "Thank you for translating Create!" 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 e8f533dd4..0cb77f8ea 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: 994", + "_": "Missing Localizations: 999", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 0574cbdcc..221c74307 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: 36", + "_": "Missing Localizations: 41", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 1b52d7196..52d63a589 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: 924", + "_": "Missing Localizations: 929", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 6b3650342..eb814a792 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: 706", + "_": "Missing Localizations: 711", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 0f7271a5a..475eac406 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: 41", + "_": "Missing Localizations: 46", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 de73897c0..84938edd3 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: 48", + "_": "Missing Localizations: 53", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 cc4731bfb..c7f7cb301 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: 95", + "_": "Missing Localizations: 100", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 3afae9153..2dba21e1c 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: 1193", + "_": "Missing Localizations: 1198", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 9ba011116..8fc37b357 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: 1259", + "_": "Missing Localizations: 1264", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 3c7745036..f3920d706 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: 45", + "_": "Missing Localizations: 50", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 73a434dea..6f7297f43 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: 43", + "_": "Missing Localizations: 48", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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 b5d3185c0..e99ebdaa8 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: 48", + "_": "Missing Localizations: 53", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,20 +1814,25 @@ "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Debug Scene 1: Coordinate Space", + "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Debug Scene 2: Changing Blocks", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Debug Scene 3: Showing Fluids", + "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Debug Scene 4: Out of bounds / configureBasePlate", + "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Debug Scene 5: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Debug Scene 6: Basic player interaction", + "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", + "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Debug Scene 7: Birbs", + "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", + "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", + "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", + "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", + "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", + "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "_": "Thank you for translating Create!" 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/foundation/ponder/ElementLink.java b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java new file mode 100644 index 000000000..02e4eb7a7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.UUID; + +public class ElementLink { + + private Class elementClass; + private UUID id; + + public ElementLink(Class elementClass, UUID id) { + this.elementClass = elementClass; + this.id = id; + } + + public UUID getId() { + return id; + } + + public T cast(PonderElement e) { + return elementClass.cast(e); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java index e22fcae23..9c482406e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java @@ -5,6 +5,8 @@ public class PonderElement { boolean visible = true; public void tick(PonderScene scene) {} + + public void reset(PonderScene scene) {} public boolean isVisible() { return visible; @@ -13,5 +15,5 @@ public class PonderElement { public void setVisible(boolean visible) { this.visible = visible; } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java index 10316af3f..36eb4ce40 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.ponder; +import java.util.function.Consumer; + public abstract class PonderInstruction { public boolean isBlocking() { @@ -12,4 +14,28 @@ public abstract class PonderInstruction { public abstract void tick(PonderScene scene); + public static PonderInstruction simple(Consumer callback) { + return new Simple(callback); + } + + private static class Simple extends PonderInstruction { + + private Consumer callback; + + public Simple(Consumer callback) { + this.callback = callback; + } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { + callback.accept(scene); + } + + } + } 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 3f8b855ea..ab705012b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -12,7 +12,7 @@ import java.util.zip.GZIPInputStream; import com.google.gson.JsonElement; import com.simibubi.create.Create; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; +import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.content.SharedText; import com.tterrag.registrate.util.entry.ItemProviderEntry; @@ -28,12 +28,16 @@ import net.minecraft.world.gen.feature.template.Template; public class PonderRegistry { - static Map> all = new HashMap<>(); + static Map> all = new HashMap<>(); - public static void addStoryBoard(ItemProviderEntry component, PonderStoryBoard storyBoard) { + public static void addStoryBoard(ItemProviderEntry component, String schematic, PonderStoryBoard storyBoard) { ResourceLocation id = component.getId(); all.computeIfAbsent(id, $ -> new ArrayList<>()) - .add(storyBoard); + .add(new PonderStoryBoardEntry(storyBoard, schematic)); + } + + public static MultiSceneBuilder forComponent(ItemProviderEntry component) { + return new MultiSceneBuilder(component); } public static List compile(ResourceLocation id) { @@ -44,28 +48,31 @@ public class PonderRegistry { SharedText.gatherText(); } - List list = all.get(id); + List list = all.get(id); List scenes = new ArrayList<>(); + for (int i = 0; i < list.size(); i++) { - - PonderStoryBoard sb = list.get(i); + PonderStoryBoardEntry sb = list.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); world.createBackup(); - - PonderScene scene = new PonderScene(world, id, i); - PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - SceneBuilder builder = scene.builder(); - sb.program(builder, builder.getSceneBuildingUtil()); + PonderScene scene = compileScene(id, i, sb, world); scene.begin(); scenes.add(scene); - } return scenes; } + public static PonderScene compileScene(ResourceLocation id, int i, PonderStoryBoardEntry sb, PonderWorld world) { + PonderScene scene = new PonderScene(world, id, i); + SceneBuilder builder = scene.builder(); + sb.getBoard() + .program(builder, scene.getSceneBuildingUtil()); + return scene; + } + public static Template loadSchematic(String path) { Template t = new Template(); String filepath = "ponder/" + path + ".nbt"; @@ -87,15 +94,25 @@ public class PonderRegistry { PonderIndex.register(); SharedText.gatherText(); all.forEach((id, list) -> { - for (int i = 0; i < list.size(); i++) { - PonderStoryBoard sb = list.get(i); - PonderScene scene = new PonderScene(null, id, i); - PonderLocalization.registerSpecific(id, i, "title", sb.getStoryTitle()); - SceneBuilder builder = scene.builder(); - sb.program(builder, builder.getSceneBuildingUtil()); - } + for (int i = 0; i < list.size(); i++) + compileScene(id, i, list.get(i), null); }); return PonderLocalization.record(); } + + public static class MultiSceneBuilder { + + private ItemProviderEntry component; + + MultiSceneBuilder(ItemProviderEntry component) { + this.component = component; + } + + public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) { + PonderRegistry.addStoryBoard(component, schematicPath, storyBoard); + return this; + } + + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 7157d1891..ff655e3dd 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -1,77 +1,61 @@ package com.simibubi.create.foundation.ponder; import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; -import java.util.function.UnaryOperator; import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.content.contraptions.base.KineticTileEntity; -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.InputWindowElement; -import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement; import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; -import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; -import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; -import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; -import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; -import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction; -import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; -import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; -import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction; -import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction; -import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction; -import com.simibubi.create.foundation.ponder.instructions.TextInstruction; -import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.Outliner; -import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; -import net.minecraft.particles.RedstoneParticleData; -import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; public class PonderScene { + boolean finished; + int sceneIndex; + List schedule, activeSchedule; + Map linkedElements; Set elements; + PonderWorld world; ResourceLocation component; - int sceneIndex; SceneTransform transform; - public boolean finished; SceneRenderInfo info; Outliner outliner; + String defaultTitle; Vec3d pointOfInterest; Vec3d chasingPointOfInterest; + WorldSectionElement baseWorldSection; - private int offsetX; - private int offsetZ; - private int size; + int offsetX; + int offsetZ; + int size; public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { pointOfInterest = Vec3d.ZERO; @@ -82,11 +66,16 @@ public class PonderScene { outliner = new Outliner(); elements = new HashSet<>(); + linkedElements = new HashMap<>(); schedule = new ArrayList<>(); activeSchedule = new ArrayList<>(); transform = new SceneTransform(); size = getBounds().getXSize(); info = new SceneRenderInfo(); + baseWorldSection = new WorldSectionElement(); + + PonderLocalization.registerSpecific(component, sceneIndex, "title", "Untitled Scene"); + setPointOfInterest(new Vec3d(0, 4, 0)); } public String getTitle() { @@ -107,9 +96,19 @@ public class PonderScene { world.restore(); transform = new SceneTransform(); finished = false; - forEach(WorldSectionElement.class, wse -> wse.queueRedraw(world)); + setPointOfInterest(new Vec3d(0, 4, 0)); + forEach(pe -> pe.reset(this)); elements.clear(); + linkedElements.clear(); activeSchedule.addAll(schedule); + + baseWorldSection.setEmpty(); + baseWorldSection.forceApplyFade(1); + elements.add(baseWorldSection); + } + + public WorldSectionElement getBaseWorldSection() { + return baseWorldSection; } public void fadeOut() { @@ -176,6 +175,22 @@ public class PonderScene { elements.add(e); } + public void linkElement(E e, ElementLink link) { + linkedElements.put(link.getId(), e); + } + + public E resolve(ElementLink link) { + return link.cast(linkedElements.get(link.getId())); + } + + public void runWith(ElementLink link, Consumer callback) { + callback.accept(resolve(link)); + } + + public F applyTo(ElementLink link, Function function) { + return function.apply(resolve(link)); + } + public PonderWorld getWorld() { return world; } @@ -206,10 +221,14 @@ public class PonderScene { } public SceneBuilder builder() { - return new SceneBuilder(); + return new SceneBuilder(this); } - private Supplier textGetter(String key) { + public SceneBuildingUtil getSceneBuildingUtil() { + return new SceneBuildingUtil(getBounds()); + } + + Supplier textGetter(String key) { return () -> PonderLocalization.getSpecific(component, sceneIndex, key); } @@ -301,188 +320,16 @@ public class PonderScene { } - public class SceneBuilder { - - private SceneBuildingUtil sceneBuildingUtil; - - public SceneBuilder() { - sceneBuildingUtil = new SceneBuildingUtil(); - } - - public SceneBuildingUtil getSceneBuildingUtil() { - return sceneBuildingUtil; - } - - public SceneBuilder showBasePlate() { - return showSection(Select.cuboid(new BlockPos(offsetX, 0, offsetZ), new Vec3i(size, 0, size)), - Direction.UP); - } - - public SceneBuilder showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, - int duration) { - PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); - return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, position)); - } - - public SceneBuilder showSelectionWithText(PonderPalette color, Select selection, String key, String defaultText, - int duration) { - PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); - return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, selection)); - } - - public SceneBuilder showText(PonderPalette color, int y, String key, String defaultText, int duration) { - PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); - return addInstruction(new TextInstruction(color.getColor(), textGetter(key), duration, y)); - } - - public SceneBuilder showSection(Select selection, Direction fadeInDirection) { - return addInstruction( - new DisplayWorldSectionInstruction(15, fadeInDirection, new WorldSectionElement(selection))); - } - - public SceneBuilder debugSchematic() { - return addInstruction(new ShowCompleteSchematicInstruction()); - } - - public SceneBuilder idle(int ticks) { - return addInstruction(new DelayInstruction(ticks)); - } - - public SceneBuilder idleSeconds(int seconds) { - return idle(seconds * 20); - } - - public SceneBuilder markAsFinished() { - return addInstruction(new MarkAsFinishedInstruction()); - } - - public SceneBuilder rotateCameraY(float degrees) { - return addInstruction(new RotateSceneInstruction(0, degrees, true)); - } - - public SceneBuilder setBlocks(Select selection, BlockState state) { - return addInstruction(new ReplaceBlocksInstruction(selection, state, true)); - } - - public SceneBuilder replaceBlocks(Select selection, BlockState state) { - return addInstruction(new ReplaceBlocksInstruction(selection, state, true)); - } - - public SceneBuilder setKineticSpeed(Select selection, float speed) { - return modifyKineticSpeed(selection, f -> speed); - } - - public SceneBuilder multiplyKineticSpeed(Select selection, float modifier) { - return modifyKineticSpeed(selection, f -> f * modifier); - } - - public SceneBuilder modifyKineticSpeed(Select selection, UnaryOperator speedFunc) { - addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> { - float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); - nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed)); - return nbt; - }, false)); - return addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { - nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); - return nbt; - }, false)); - } - - public SceneBuilder flapFunnels(Select selection, boolean outward) { - return addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> { - nbt.putInt("Flap", outward ? -1 : 1); - return nbt; - }, false)); - } - - public SceneBuilder movePOI(Vec3d location) { - return addInstruction(new MovePoiInstruction(location)); - } - - public SceneBuilder showControls(InputWindowElement element, int duration) { - return addInstruction(new ShowInputInstruction(element, duration)); - } - - public SceneBuilder emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) { - return addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); - } - - public SceneBuilder indicateSuccess(BlockPos pos) { - return addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), - Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2)); - } - - public SceneBuilder birbOnTurntable(BlockPos pos) { - return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, - ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos))); - } - - public SceneBuilder birbOnSpinnyShaft(BlockPos pos) { - return addInstruction( - new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos) - .add(0, 0.5, 0), pos))); - } - - public SceneBuilder birbLookingAtPOI(Vec3d location) { - return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.lookAtPOI(location))); - } - - public SceneBuilder birbPartying(Vec3d location) { - return addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.dance(location))); - } - - public SceneBuilder addInstruction(PonderInstruction instruction) { - schedule.add(instruction); - return this; - } - - public class SceneBuildingUtil { - - public Vec3d centerOf(int x, int y, int z) { - return VecHelper.getCenterOf(new BlockPos(x, y, z)); - } - - public Vec3d topOf(int x, int y, int z) { - return new Vec3d(x + .5, y + 1, z + .5); - } - - public Vec3d vector(double x, double y, double z) { - return new Vec3d(x, y, z); - } - - public Select everywhere() { - return Select.everything(getBounds()); - } - - public Select column(int x, int z) { - return Select.column(getBounds(), x, z); - } - - public Select layer(int y) { - return layers(y, 1); - } - - public Select layers(int y, int height) { - return Select.layer(getBounds(), y, height); - } - - public Select layersFrom(int y) { - return Select.layer(getBounds(), y, getBounds().getYSize()); - } - - } - - public SceneBuilder configureBasePlate(int xOffset, int zOffset, int basePlateSize) { - offsetX = xOffset; - offsetZ = zOffset; - size = basePlateSize; - return this; - } - - } - public Outliner getOutliner() { return outliner; } + public boolean isFinished() { + return finished; + } + + public void setFinished(boolean finished) { + this.finished = finished; + } + } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java deleted file mode 100644 index 1fb3fc6a4..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoard.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; - -public abstract class PonderStoryBoard { - - public abstract String getSchematicName(); - - public abstract String getStoryTitle(); - - public abstract void program(SceneBuilder scene, SceneBuildingUtil util); - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java new file mode 100644 index 000000000..aa397e763 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.ponder; + +public class PonderStoryBoardEntry { + + private String schematicName; + private PonderStoryBoard board; + + public PonderStoryBoardEntry(PonderStoryBoard board, String schematicName) { + this.board = board; + this.schematicName = schematicName; + } + + public interface PonderStoryBoard { + public abstract void program(SceneBuilder scene, SceneBuildingUtil util); + } + + public String getSchematicName() { + return schematicName; + } + + public PonderStoryBoard getBoard() { + return board; + } + +} 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 acaf4089b..4f5290764 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -106,7 +106,7 @@ public class PonderUI extends AbstractSimiScreen { int prevIndex = index; index = forward ? index + 1 : index - 1; index = MathHelper.clamp(index, 0, scenes.size() - 1); - if (prevIndex != index && Math.abs(index - lazyIndex.getValue()) < 1.5f) { + if (prevIndex != index) {// && Math.abs(index - lazyIndex.getValue()) < 1.5f) { scenes.get(prevIndex) .fadeOut(); scenes.get(index) @@ -228,7 +228,7 @@ public class PonderUI extends AbstractSimiScreen { if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) right.fade(scenes.size() - lazyIndexValue - 1); - if (scenes.get(index).finished) + if (scenes.get(index).isFinished()) right.flash(); else right.dim(); 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 b478ec6d4..fd62396bc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -38,7 +38,7 @@ public class PonderWorld extends SchematicWorld { protected PonderWorldParticles particles; int overrideLight; - Select mask; + Selection mask; public PonderWorld(BlockPos anchor, World original) { super(anchor, original); @@ -81,7 +81,7 @@ public class PonderWorld extends SchematicWorld { return overrideLight == -1 ? 15 : overrideLight; } - public void setMask(Select mask) { + public void setMask(Selection mask) { this.mask = mask; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java new file mode 100644 index 000000000..e9cb9a5f6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -0,0 +1,292 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +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.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; +import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; +import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; +import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; +import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.ponder.instructions.FadeOutOfSceneInstruction; +import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction; +import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; +import com.simibubi.create.foundation.ponder.instructions.OutlineSelectionInstruction; +import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; +import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction; +import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction; +import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction; +import com.simibubi.create.foundation.ponder.instructions.TextInstruction; +import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.block.BlockState; +import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public class SceneBuilder { + + public final OverlayInstructions overlay; + public final SpecialInstructions special; + public final WorldInstructions world; + public final DebugInstructions debug; + public final EffectInstructions effects; + + private final PonderScene scene; + + public SceneBuilder(PonderScene ponderScene) { + scene = ponderScene; + overlay = new OverlayInstructions(); + special = new SpecialInstructions(); + world = new WorldInstructions(); + debug = new DebugInstructions(); + effects = new EffectInstructions(); + } + + // General + + public void title(String title) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, "title", title); + } + + public void configureBasePlate(int xOffset, int zOffset, int basePlateSize) { + scene.offsetX = xOffset; + scene.offsetZ = zOffset; + scene.size = basePlateSize; + } + + public void showBasePlate() { + world.showSection(scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.offsetX, 0, scene.offsetZ), + new Vec3i(scene.size, 0, scene.size)), Direction.UP); + } + + public void idle(int ticks) { + addInstruction(new DelayInstruction(ticks)); + } + + public void idleSeconds(int seconds) { + idle(seconds * 20); + } + + public void markAsFinished() { + addInstruction(new MarkAsFinishedInstruction()); + } + + public void rotateCameraY(float degrees) { + addInstruction(new RotateSceneInstruction(0, degrees, true)); + } + + public class EffectInstructions { + + public void emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) { + addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); + } + + public void indicateSuccess(BlockPos pos) { + addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), + Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2)); + } + + } + + public class OverlayInstructions { + + public void showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, + int duration) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position)); + } + + public void showSelectionWithText(PonderPalette color, Selection selection, String key, String defaultText, + int duration) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection)); + } + + public void showText(PonderPalette color, int y, String key, String defaultText, int duration) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, y)); + } + + public void showControls(InputWindowElement element, int duration) { + addInstruction(new ShowInputInstruction(element, duration)); + } + + public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AxisAlignedBB boundingBox, int duration) { + addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration)); + } + + public void showOutline(PonderPalette color, Object slot, Selection selection, int duration) { + addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); + } + + } + + public class SpecialInstructions { + + public void birbOnTurntable(BlockPos pos) { + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, + ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos))); + } + + public void birbOnSpinnyShaft(BlockPos pos) { + addInstruction( + new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos) + .add(0, 0.5, 0), pos))); + } + + public void birbLookingAtPOI(Vec3d location) { + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.lookAtPOI(location))); + } + + public void birbPartying(Vec3d location) { + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.dance(location))); + } + + public void movePointOfInterest(Vec3d location) { + addInstruction(new MovePoiInstruction(location)); + } + + public void movePointOfInterest(BlockPos location) { + movePointOfInterest(VecHelper.getCenterOf(location)); + } + + } + + public class WorldInstructions { + + public void showSection(Selection selection, Direction fadeInDirection) { + addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, true)); + } + + public ElementLink showIndependentSection(Selection selection, Direction fadeInDirection) { + DisplayWorldSectionInstruction instruction = + new DisplayWorldSectionInstruction(15, fadeInDirection, selection, false); + addInstruction(instruction); + return instruction.createLink(scene); + } + + public void hideSection(Selection selection, Direction fadeOutDirection) { + WorldSectionElement worldSectionElement = new WorldSectionElement(selection); + ElementLink elementLink = + new ElementLink<>(WorldSectionElement.class, UUID.randomUUID()); + + addInstruction(scene -> { + scene.getBaseWorldSection() + .erase(selection); + scene.linkElement(worldSectionElement, elementLink); + scene.addElement(worldSectionElement); + worldSectionElement.queueRedraw(); + }); + + hideIndependentSection(elementLink, fadeOutDirection); + } + + public void hideIndependentSection(ElementLink link, Direction fadeOutDirection) { + addInstruction(new FadeOutOfSceneInstruction<>(15, fadeOutDirection, link)); + } + + public ElementLink makeSectionIndependent(Selection selection) { + WorldSectionElement worldSectionElement = new WorldSectionElement(selection); + ElementLink elementLink = + new ElementLink<>(WorldSectionElement.class, UUID.randomUUID()); + + addInstruction(scene -> { + scene.getBaseWorldSection() + .erase(selection); + scene.linkElement(worldSectionElement, elementLink); + scene.addElement(worldSectionElement); + worldSectionElement.resetAnimatedTransform(); + worldSectionElement.setVisible(true); + worldSectionElement.forceApplyFade(1); + }); + + return elementLink; + } + + public void rotateSection(ElementLink link, double xRotation, double yRotation, + double zRotation, int duration) { + addInstruction( + AnimateWorldSectionInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration)); + } + + public void moveSection(ElementLink link, Vec3d offset, int duration) { + addInstruction(AnimateWorldSectionInstruction.move(link, offset, duration)); + } + + public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { + addInstruction(new ReplaceBlocksInstruction(selection, state, true, spawnParticles)); + } + + public void setBlock(BlockPos pos, BlockState state) { + setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, true); + } + + public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) { + addInstruction(new ReplaceBlocksInstruction(selection, state, false, spawnParticles)); + } + + public void setKineticSpeed(Selection selection, float speed) { + modifyKineticSpeed(selection, f -> speed); + } + + public void multiplyKineticSpeed(Selection selection, float modifier) { + modifyKineticSpeed(selection, f -> f * modifier); + } + + public void modifyKineticSpeed(Selection selection, UnaryOperator speedFunc) { + addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> { + float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); + nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed)); + return nbt; + }, false)); + addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { + nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); + return nbt; + }, false)); + } + + public void flapFunnels(Selection selection, boolean outward) { + addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> { + nbt.putInt("Flap", outward ? -1 : 1); + return nbt; + }, false)); + } + + } + + public class DebugInstructions { + + public void debugSchematic() { + addInstruction(new ShowCompleteSchematicInstruction()); + } + + public void addInstructionInstance(PonderInstruction instruction) { + addInstruction(instruction); + } + + } + + private void addInstruction(PonderInstruction instruction) { + scene.schedule.add(instruction); + } + + private void addInstruction(Consumer callback) { + scene.schedule.add(PonderInstruction.simple(callback)); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java new file mode 100644 index 000000000..d6a47ae91 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -0,0 +1,115 @@ +package com.simibubi.create.foundation.ponder; + +import com.simibubi.create.foundation.utility.VecHelper; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; + +public class SceneBuildingUtil { + + public final SelectionUtil select; + public final VectorUtil vector; + public final PositionUtil grid; + + private final MutableBoundingBox sceneBounds; + + SceneBuildingUtil(MutableBoundingBox sceneBounds) { + this.sceneBounds = sceneBounds; + this.select = new SelectionUtil(); + this.vector = new VectorUtil(); + this.grid = new PositionUtil(); + } + + public class PositionUtil { + + public BlockPos at(int x, int y, int z) { + return new BlockPos(x, y, z); + } + + public BlockPos zero() { + return at(0, 0, 0); + } + + } + + public class VectorUtil { + + public Vec3d centerOf(int x, int y, int z) { + return centerOf(grid.at(x, y, z)); + } + + public Vec3d centerOf(BlockPos pos) { + return VecHelper.getCenterOf(pos); + } + + public Vec3d topOf(int x, int y, int z) { + return blockSurface(grid.at(x, y, z), Direction.UP); + } + + public Vec3d topOf(BlockPos pos) { + return blockSurface(pos, Direction.UP); + } + + public Vec3d blockSurface(BlockPos pos, Direction face) { + return blockSurface(pos, face, 0); + } + + public Vec3d blockSurface(BlockPos pos, Direction face, float margin) { + return centerOf(pos).add(new Vec3d(face.getDirectionVec()).scale(.5f + margin)); + } + + public Vec3d at(double x, double y, double z) { + return new Vec3d(x, y, z); + } + + } + + public class SelectionUtil { + + public Selection everywhere() { + return Selection.of(sceneBounds); + } + + public Selection position(int x, int y, int z) { + return position(grid.at(x, y, z)); + } + + public Selection position(BlockPos pos) { + return cuboid(pos, BlockPos.ZERO); + } + + public Selection fromTo(int x, int y, int z, int x2, int y2, int z2) { + return fromTo(new BlockPos(x, y, z), new BlockPos(x2, y2, z2)); + } + + public Selection fromTo(BlockPos pos1, BlockPos pos2) { + return cuboid(pos1, pos2.subtract(pos1)); + } + + public Selection column(int x, int z) { + return cuboid(new BlockPos(x, 1, z), new Vec3i(0, sceneBounds.getYSize(), 0)); + } + + public Selection layer(int y) { + return layers(y, 1); + } + + public Selection layersFrom(int y) { + return layers(y, sceneBounds.getYSize() - y); + } + + public Selection layers(int y, int height) { + return cuboid(new BlockPos(0, y, 0), new Vec3i(sceneBounds.getXSize(), + Math.min(sceneBounds.getYSize() - y, height) - 1, sceneBounds.getZSize())); + } + + public Selection cuboid(BlockPos origin, Vec3i size) { + return Selection.of(new MutableBoundingBox(origin, origin.add(size))); + } + + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Select.java b/src/main/java/com/simibubi/create/foundation/ponder/Select.java deleted file mode 100644 index 869482b0f..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/Select.java +++ /dev/null @@ -1,167 +0,0 @@ -package com.simibubi.create.foundation.ponder; - -import java.util.HashSet; -import java.util.Set; -import java.util.function.Predicate; -import java.util.stream.Stream; - -import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; -import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; -import com.simibubi.create.foundation.utility.outliner.Outliner; - -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MutableBoundingBox; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; - -public abstract class Select implements Predicate { - - public static Select cuboid(BlockPos origin, Vec3i size) { - return new Cuboid(origin, size); - } - - public static Select pos(int x, int y, int z) { - return new Cuboid(new BlockPos(x, y, z), BlockPos.ZERO); - } - - public static Select fromTo(int x, int y, int z, int x2, int y2, int z2) { - return new Cuboid(new BlockPos(x, y, z), new BlockPos(x2 - x, y2 - y, z2 - z)); - } - - public static Select everything(MutableBoundingBox bounds) { - return cuboid(BlockPos.ZERO, bounds.getLength()); - } - - public static Select compound(Select... other) { - return new Compound(other); - } - - public static Select column(MutableBoundingBox bounds, int x, int z) { - return cuboid(new BlockPos(x, 1, z), new Vec3i(0, bounds.getYSize(), 0)); - } - - public static Select layer(MutableBoundingBox bounds, int y, int height) { - return cuboid(new BlockPos(0, y, 0), - new Vec3i(bounds.getXSize(), Math.min(bounds.getYSize() - y, height) - 1, bounds.getZSize())); - } - - // - - public WorldSectionElement asElement() { - return new WorldSectionElement(this); - } - - // - - @Override - public abstract int hashCode(); - - public abstract Stream all(); - - public abstract Vec3d getCenter(); - - public abstract OutlineParams makeOutline(Outliner outliner); - - private static class Compound extends Select { - - private Select[] parts; - private int hash; - private Vec3d center; - private Set cluster; - - public Compound(Select... parts) { - this.parts = parts; - if (parts.length == 0) - throw new IllegalArgumentException("Cannot instantiate Compound Select with zero parts"); - - cluster = new HashSet<>(); - parts[0].all() - .map(BlockPos::toImmutable) - .forEach(cluster::add); - hash = parts[0].hashCode(); - center = parts[0].getCenter() - .scale(1f / parts.length); - for (int i = 1; i < parts.length; i++) { - Select select = parts[i]; - select.all() - .map(BlockPos::toImmutable) - .forEach(cluster::add); - hash = hash ^ select.hashCode(); - center = center.add(select.getCenter() - .scale(1f / parts.length)); - } - } - - @Override - public boolean test(BlockPos t) { - for (Select select : parts) - if (select.test(t)) - return true; - return false; - } - - @Override - public int hashCode() { - return hash; - } - - @Override - public Stream all() { - return cluster.stream(); - } - - @Override - public Vec3d getCenter() { - return center; - } - - @Override - public OutlineParams makeOutline(Outliner outliner) { - return outliner.showCluster(this, cluster); - } - - } - - private static class Cuboid extends Select { - - MutableBoundingBox bb; - Vec3i origin; - Vec3i size; - - public Cuboid(BlockPos origin, Vec3i size) { - bb = new MutableBoundingBox(origin, origin.add(size)); - this.origin = origin; - this.size = size; - } - - @Override - public boolean test(BlockPos t) { - return bb.isVecInside(t); - } - - @Override - public Stream all() { - return BlockPos.func_229383_a_(bb); - } - - @Override - public int hashCode() { - return origin.hashCode() ^ size.hashCode(); - } - - @Override - public Vec3d getCenter() { - return new AxisAlignedBB(new BlockPos(origin), new BlockPos(origin).add(size) - .add(1, 1, 1)).getCenter(); - } - - @Override - public OutlineParams makeOutline(Outliner outliner) { - return outliner.showAABB(this, new AxisAlignedBB(new BlockPos(origin), new BlockPos(origin).add(size) - .add(1, 1, 1))); - } - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/Selection.java b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java new file mode 100644 index 000000000..589a9834f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/Selection.java @@ -0,0 +1,155 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Predicate; + +import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; +import com.simibubi.create.foundation.utility.outliner.Outliner; + +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3d; + +public abstract class Selection implements Predicate { + + public static Selection of(MutableBoundingBox bb) { + return new Simple(bb); + } + + public abstract Selection add(Selection other); + + public abstract Selection substract(Selection other); + + public abstract Selection copy(); + + public abstract Vec3d getCenter(); + + public abstract void forEach(Consumer callback); + + public abstract OutlineParams makeOutline(Outliner outliner, Object slot); + + public OutlineParams makeOutline(Outliner outliner) { + return makeOutline(outliner, this); + } + + private static class Compound extends Selection { + + Set posSet; + Vec3d center; + + public Compound(Simple initial) { + posSet = new HashSet<>(); + add(initial); + } + + private Compound(Set template) { + posSet = new HashSet<>(template); + } + + @Override + public boolean test(BlockPos t) { + return posSet.contains(t); + } + + @Override + public Selection add(Selection other) { + other.forEach(p -> posSet.add(p.toImmutable())); + center = null; + return this; + } + + @Override + public Selection substract(Selection other) { + other.forEach(p -> posSet.remove(p.toImmutable())); + center = null; + return this; + } + + @Override + public void forEach(Consumer callback) { + posSet.forEach(callback); + } + + @Override + public OutlineParams makeOutline(Outliner outliner, Object slot) { + return outliner.showCluster(slot, posSet); + } + + @Override + public Vec3d getCenter() { + return center == null ? center = evalCenter() : center; + } + + private Vec3d evalCenter() { + Vec3d center = Vec3d.ZERO; + if (posSet.isEmpty()) + return center; + for (BlockPos blockPos : posSet) + center = center.add(new Vec3d(blockPos)); + center = center.scale(1f / posSet.size()); + return center.add(new Vec3d(.5, .5, .5)); + } + + @Override + public Selection copy() { + return new Compound(posSet); + } + + } + + private static class Simple extends Selection { + + private MutableBoundingBox bb; + private AxisAlignedBB aabb; + + public Simple(MutableBoundingBox bb) { + this.bb = bb; + this.aabb = getAABB(); + } + + @Override + public boolean test(BlockPos t) { + return bb.isVecInside(t); + } + + @Override + public Selection add(Selection other) { + return new Compound(this).add(other); + } + + @Override + public Selection substract(Selection other) { + return new Compound(this).substract(other); + } + + @Override + public void forEach(Consumer callback) { + BlockPos.func_229383_a_(bb) + .forEach(callback); + } + + @Override + public Vec3d getCenter() { + return aabb.getCenter(); + } + + @Override + public OutlineParams makeOutline(Outliner outliner, Object slot) { + return outliner.showAABB(slot, aabb); + } + + private AxisAlignedBB getAABB() { + return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX + 1, bb.maxY + 1, bb.maxZ + 1); + } + + @Override + public Selection copy() { + return new Simple(new MutableBoundingBox(bb)); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 1d93364d7..353b1caaf 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -6,13 +6,14 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; +import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; +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.instructions.EmitParticlesInstruction; +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.ItemEntry; @@ -22,273 +23,328 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -public abstract class DebugScenes extends PonderStoryBoard { +public class DebugScenes { - private int index; + private static int index; public static void registerAll() { + index = 1; + add(DebugScenes::coordinateScene); + add(DebugScenes::blocksScene); + add(DebugScenes::fluidsScene); + add(DebugScenes::offScreenScene); + add(DebugScenes::particleScene); + add(DebugScenes::controlsScene); + add(DebugScenes::birbScene); + add(DebugScenes::sectionsScene); + } + + private static void add(PonderStoryBoard sb) { ItemEntry item = AllItems.BRASS_HAND; - int i = 0; - PonderRegistry.addStoryBoard(item, new CoordinateScene(++i)); - PonderRegistry.addStoryBoard(item, new BlocksScene(++i)); - PonderRegistry.addStoryBoard(item, new FluidsScene(++i)); - PonderRegistry.addStoryBoard(item, new OffScreenScene(++i)); - PonderRegistry.addStoryBoard(item, new ParticlesScene(++i)); - PonderRegistry.addStoryBoard(item, new ControlsScene(++i)); - PonderRegistry.addStoryBoard(item, new BirbScene(++i)); + String schematicPath = "debug/scene_" + index; + PonderRegistry.addStoryBoard(item, schematicPath, sb); + index++; } - public DebugScenes(int index) { - this.index = index; + public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Coordinate Space"); + scene.showBasePlate(); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + + Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1); + Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1); + Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4); + + scene.idle(10); + scene.overlay.showSelectionWithText(PonderPalette.RED, xAxis, "x", "Das X axis", 20); + scene.idle(20); + scene.overlay.showSelectionWithText(PonderPalette.GREEN, yAxis, "y", "Das Y axis", 20); + scene.idle(20); + scene.overlay.showSelectionWithText(PonderPalette.BLUE, zAxis, "z", "Das Z axis", 20); + scene.idle(10); } - @Override - public final String getSchematicName() { - return "debug/scene_" + index; + public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Changing Blocks"); + scene.showBasePlate(); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.idle(10); + scene.overlay.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000); + scene.idle(20); + scene.world.replaceBlocks(util.select.fromTo(1, 1, 3, 2, 2, 4), + AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), true); + scene.idle(10); + scene.world.replaceBlocks(util.select.position(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState(), true); + scene.rotateCameraY(180); + scene.markAsFinished(); } - @Override - public String getStoryTitle() { - return "Debug Scene " + index + (getTitle().isEmpty() ? "" : ": " + getTitle()); - } + public static void fluidsScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Showing Fluids"); + scene.showBasePlate(); + scene.idle(10); + Vec3d parrotPos = util.vector.topOf(1, 0, 1); + scene.special.birbLookingAtPOI(parrotPos); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.overlay.showTargetedText(WHITE, new Vec3d(1, 2.5, 4.5), "fluids", "Fluid rendering test.", 1000); + scene.markAsFinished(); - protected String getTitle() { - return ""; - } + Object outlineSlot = new Object(); - static class CoordinateScene extends DebugScenes { + Vec3d vec1 = util.vector.topOf(1, 0, 0); + Vec3d vec2 = util.vector.topOf(0, 0, 1); + AxisAlignedBB boundingBox1 = new AxisAlignedBB(vec1, vec1).expand(0, 2.5, 0) + .grow(.15, 0, .15); + AxisAlignedBB boundingBox2 = new AxisAlignedBB(vec2, vec2).expand(0, .125, 0) + .grow(.45, 0, .45); + Vec3d poi1 = boundingBox1.getCenter(); + Vec3d poi2 = boundingBox2.getCenter(); - public CoordinateScene(int index) { - super(index); + for (int i = 0; i < 10; i++) { + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, outlineSlot, + i % 2 == 0 ? boundingBox1 : boundingBox2, 15); + scene.idle(3); + scene.special.movePointOfInterest(i % 2 == 0 ? poi1 : poi2); + scene.idle(12); } - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - scene.idle(10); - scene.showSection(util.layersFrom(1), Direction.DOWN); - - scene.idle(10); - scene.showSelectionWithText(PonderPalette.RED, Select.fromTo(2, 1, 1, 4, 1, 1), "x", "Das X axis", 20); - scene.idle(20); - scene.showSelectionWithText(PonderPalette.GREEN, Select.fromTo(1, 2, 1, 1, 4, 1), "y", "Das Y axis", 20); - scene.idle(20); - scene.showSelectionWithText(PonderPalette.BLUE, Select.fromTo(1, 1, 2, 1, 1, 4), "z", "Das Z axis", 20); - scene.idle(10); - } - - @Override - protected String getTitle() { - return "Coordinate Space"; - } + scene.idle(12); + scene.special.movePointOfInterest(util.grid.at(-4, 5, 4)); + scene.overlay.showTargetedText(PonderPalette.RED, parrotPos.add(-.25f, 0.25f, .25f), "wut", "dafuq?", 40); } - static class BlocksScene extends DebugScenes { + public static void offScreenScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Out of bounds / configureBasePlate"); + scene.configureBasePlate(1, 0, 6); + scene.showBasePlate(); - public BlocksScene(int index) { - super(index); - } + Selection out1 = util.select.fromTo(7, 0, 0, 8, 0, 5); + Selection out2 = util.select.fromTo(0, 0, 0, 0, 0, 5); + Selection blocksExceptBasePlate = util.select.layersFrom(1) + .add(out1) + .add(out2); - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - scene.idle(10); - scene.showSection(util.layersFrom(1), Direction.DOWN); - scene.idle(10); - scene.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000); - scene.idle(20); - scene.replaceBlocks(Select.fromTo(1, 1, 3, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState()); - scene.idle(10); - scene.replaceBlocks(Select.pos(3, 1, 1), Blocks.GOLD_BLOCK.getDefaultState()); - scene.rotateCameraY(180); - scene.markAsFinished(); - } + scene.idle(10); + scene.world.showSection(blocksExceptBasePlate, Direction.DOWN); + scene.idle(10); - @Override - protected String getTitle() { - return "Changing Blocks"; - } + scene.overlay.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", + "Blocks outside of the base plate do not affect scaling", 100); + scene.overlay.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate", + "configureBasePlate() makes sure of that.", 100); + scene.markAsFinished(); + } + + public static void particleScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Emitting particles"); + scene.showBasePlate(); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.idle(10); + + Vec3d emitterPos = util.vector.at(2.5, 2.25, 2.5); + Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.at(0, .1, 0)); + Emitter rotation = + Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), + util.vector.at(0, .1, 0)); + + scene.overlay.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20); + scene.idle(30); + scene.effects.emitParticles(emitterPos, emitter, 1, 60); + scene.effects.emitParticles(emitterPos, rotation, 20, 1); + scene.idle(30); + scene.rotateCameraY(180); + } + + public static void controlsScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Basic player interaction"); + scene.showBasePlate(); + scene.idle(10); + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.idle(4); + scene.world.showSection(util.select.layer(2), Direction.DOWN); + scene.idle(4); + scene.world.showSection(util.select.layer(3), Direction.DOWN); + scene.idle(10); + + BlockPos shaftPos = util.grid.at(3, 1, 1); + Selection shaftSelection = util.select.position(shaftPos); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftPos), Pointing.DOWN).rightClick() + .whileSneaking() + .withWrench(), 40); + scene.idle(20); + scene.world.replaceBlocks(shaftSelection, AllBlocks.SHAFT.getDefaultState(), true); + + scene.idle(20); + scene.world.hideSection(shaftSelection, Direction.UP); + + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(util.vector.at(1, 4.5, 3.5), Pointing.LEFT).rightClick() + .withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20); + scene.world.showSection(util.select.layer(4), Direction.DOWN); + + scene.idle(40); + + BlockPos chassis = util.grid.at(1, 1, 3); + Vec3d chassisSurface = util.vector.blockSurface(chassis, Direction.NORTH); + + Object chassisValueBoxHighlight = new Object(); + Object chassisEffectHighlight = new Object(); + + AxisAlignedBB point = new AxisAlignedBB(chassisSurface, chassisSurface); + AxisAlignedBB expanded = point.grow(1 / 4f, 1 / 4f, 1 / 16f); + + Selection singleBlock = util.select.position(1, 2, 3); + Selection twoBlocks = util.select.fromTo(1, 2, 3, 1, 3, 3); + Selection threeBlocks = util.select.fromTo(1, 2, 3, 1, 4, 3); + + Selection singleRow = util.select.fromTo(1, 2, 3, 3, 2, 3); + Selection twoRows = util.select.fromTo(1, 2, 3, 3, 3, 3); + Selection threeRows = twoRows.copy() + .add(threeBlocks); + + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, point, 1); + scene.idle(1); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, chassisValueBoxHighlight, expanded, 120); + scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).scroll() + .withWrench(), 40); + + PonderPalette white = PonderPalette.WHITE; + scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, threeBlocks, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, twoBlocks, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, singleBlock, 10); + scene.idle(10); + + scene.idle(30); + scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).whileCTRL() + .scroll() + .withWrench(), 40); + + scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, threeRows, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10); + scene.idle(10); + scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10); + scene.idle(10); + + scene.markAsFinished(); + } + + public static void birbScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Birbs"); + scene.showBasePlate(); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.idle(10); + + BlockPos pos = new BlockPos(1, 2, 3); + scene.special.birbOnSpinnyShaft(pos); + scene.overlay.showTargetedText(PonderPalette.GREEN, util.vector.topOf(pos), "birbs_interesting", + "More birbs = More interesting", 100); + + scene.idle(10); + scene.special.birbPartying(util.vector.topOf(0, 1, 2)); + scene.idle(10); + + scene.special.birbLookingAtPOI(util.vector.centerOf(3, 1, 3) + .add(0, 0.25f, 0)); + scene.idle(20); + + BlockPos poi1 = util.grid.at(4, 1, 0); + BlockPos poi2 = util.grid.at(0, 1, 4); + + scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.getDefaultState()); + scene.special.movePointOfInterest(poi1); + scene.idle(20); + + scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState()); + scene.special.movePointOfInterest(poi2); + scene.overlay.showTargetedText(PonderPalette.FAST, util.vector.centerOf(poi2), "poi", "Point of Interest", 20); + scene.idle(20); + + scene.world.setBlock(poi1, Blocks.AIR.getDefaultState()); + scene.special.movePointOfInterest(poi1); + scene.idle(20); + + scene.world.setBlock(poi2, Blocks.AIR.getDefaultState()); + scene.special.movePointOfInterest(poi2); + } + + public static void sectionsScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Sections"); + scene.showBasePlate(); + scene.idle(10); + scene.rotateCameraY(95); + + BlockPos mergePos = util.grid.at(1, 1, 1); + BlockPos independentPos = util.grid.at(3, 1, 1); + Selection toMerge = util.select.position(mergePos); + Selection independent = util.select.position(independentPos); + Selection start = util.select.layersFrom(1) + .substract(toMerge) + .substract(independent); + + scene.world.showSection(start, Direction.DOWN); + scene.idle(20); + + scene.world.showSection(toMerge, Direction.DOWN); + ElementLink link = scene.world.showIndependentSection(independent, Direction.DOWN); + + scene.idle(20); + + scene.overlay.showTargetedText(PonderPalette.GREEN, util.vector.topOf(mergePos), "merged", + "This Section got merged to base.", 40); + scene.idle(10); + scene.overlay.showTargetedText(PonderPalette.RED, util.vector.topOf(independentPos), "independent", + "This Section renders independently.", 40); + + scene.idle(40); + + scene.world.hideIndependentSection(link, Direction.DOWN); + scene.world.hideSection(util.select.fromTo(mergePos, util.grid.at(1, 1, 4)), Direction.DOWN); + + scene.idle(20); + + Selection hiddenReplaceArea = util.select.fromTo(2, 1, 2, 4, 1, 4) + .substract(util.select.position(4, 1, 3)) + .substract(util.select.position(2, 1, 3)); + + scene.world.hideSection(hiddenReplaceArea, Direction.UP); + scene.idle(20); + scene.world.setBlocks(hiddenReplaceArea, AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), false); + scene.world.showSection(hiddenReplaceArea, Direction.DOWN); + scene.idle(20); + scene.overlay.showSelectionWithText(PonderPalette.BLUE, hiddenReplaceArea, "seamless", + "Seamless substitution of blocks", 30); + + scene.idle(40); + + ElementLink helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea); + scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60); + scene.world.moveSection(helicopter, util.vector.at(0, 4, 5), 50); + scene.overlay.showText(PonderPalette.BLUE, 30, "blast_off", "Up, up and away.", 30); + + scene.idle(40); + scene.world.hideIndependentSection(helicopter, Direction.UP); } - static class FluidsScene extends DebugScenes { - - public FluidsScene(int index) { - super(index); - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - scene.idle(10); - scene.showSection(util.layersFrom(1), Direction.DOWN); - scene.showTargetedText(WHITE, new Vec3d(1, 2.5, 4.5), "fluids", "Fluid rendering test.", 1000); - scene.markAsFinished(); - } - - @Override - protected String getTitle() { - return "Showing Fluids"; - } - - } - - static class OffScreenScene extends DebugScenes { - - public OffScreenScene(int index) { - super(index); - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.configureBasePlate(1, 0, 6); - scene.showBasePlate(); - Select out1 = Select.fromTo(7, 0, 0, 8, 0, 5); - Select out2 = Select.fromTo(0, 0, 0, 0, 0, 5); - scene.idle(10); - scene.showSection(Select.compound(util.layersFrom(1), out1, out2), Direction.DOWN); - scene.idle(10); - - scene.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", - "Blocks outside of the base plate do not affect scaling", 100); - scene.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate", - "configureBasePlate() makes sure of that.", 100); - scene.markAsFinished(); - } - - @Override - protected String getTitle() { - return "Out of bounds / configureBasePlate"; - } - - } - - static class ParticlesScene extends DebugScenes { - - public ParticlesScene(int index) { - super(index); - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - scene.idle(10); - scene.showSection(util.layersFrom(1), Direction.DOWN); - scene.idle(10); - - Vec3d emitterPos = util.vector(2.5, 2.25, 2.5); - Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector(0, .1, 0)); - Emitter rotation = - Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), - util.vector(0, .1, 0)); - - scene.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20); - scene.idle(30); - scene.addInstruction(new EmitParticlesInstruction(emitterPos, emitter, 1, 60)); - scene.addInstruction(new EmitParticlesInstruction(emitterPos, rotation, 20, 1)); - scene.idle(30); - scene.rotateCameraY(180); - } - - @Override - protected String getTitle() { - return "Emitting particles"; - } - - } - - static class ControlsScene extends DebugScenes { - - public ControlsScene(int index) { - super(index); - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - scene.idle(10); - scene.showSection(util.layer(1), Direction.DOWN); - scene.idle(4); - scene.showSection(util.layer(2), Direction.DOWN); - scene.idle(4); - scene.showSection(util.layer(3), Direction.DOWN); - scene.idle(10); - - scene.showControls(new InputWindowElement(util.topOf(3, 1, 1), Pointing.DOWN).rightClick() - .whileSneaking() - .withWrench(), 40); - scene.idle(8); - scene.replaceBlocks(Select.pos(3, 1, 1), AllBlocks.SHAFT.getDefaultState()); - scene.idle(20); - - scene.showControls(new InputWindowElement(new Vec3d(1, 4.5, 3.5), Pointing.LEFT).rightClick() - .withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20); - scene.idle(4); - scene.showSection(util.layer(4), Direction.DOWN); - scene.idle(8); - - scene.showControls(new InputWindowElement(new Vec3d(2.5, 1.5, 3), Pointing.UP).whileCTRL() - .scroll() - .withWrench(), 40); - } - - @Override - protected String getTitle() { - return "Basic player interaction"; - } - - } - - static class BirbScene extends DebugScenes { - - public BirbScene(int index) { - super(index); - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - scene.idle(10); - scene.showSection(util.layersFrom(1), Direction.DOWN); - scene.idle(10); - BlockPos pos = new BlockPos(1, 2, 3); - scene.birbOnSpinnyShaft(pos); - scene.showTargetedText(PonderPalette.GREEN, util.topOf(1, 2, 3), "birbs_interesting", - "More birbs = More interesting", 100); - scene.idle(10); - scene.birbPartying(util.topOf(0, 1, 2)); - scene.idle(10); - - scene.movePOI(Vec3d.ZERO); - scene.birbLookingAtPOI(util.centerOf(3, 1, 3) - .add(0, 0.25f, 0)); - scene.idle(20); - - scene.replaceBlocks(Select.pos(4, 1, 0), Blocks.GOLD_BLOCK.getDefaultState()); - scene.movePOI(util.centerOf(4, 1, 0)); - scene.idle(20); - - scene.replaceBlocks(Select.pos(0, 1, 4), Blocks.GOLD_BLOCK.getDefaultState()); - scene.movePOI(util.centerOf(0, 1, 4)); - scene.showTargetedText(PonderPalette.FAST, util.centerOf(0, 1, 4), "poi", "Point of Interest", 20); - scene.idle(20); - - scene.replaceBlocks(Select.pos(4, 1, 0), Blocks.AIR.getDefaultState()); - scene.movePOI(util.centerOf(4, 1, 0)); - scene.idle(20); - - scene.replaceBlocks(Select.pos(0, 1, 4), Blocks.AIR.getDefaultState()); - scene.movePOI(util.centerOf(0, 1, 4)); - } - - @Override - protected String getTitle() { - return "Birbs"; - } - - } } 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 new file mode 100644 index 000000000..7917de013 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -0,0 +1,99 @@ +package com.simibubi.create.foundation.ponder.content; + +import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; +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.utility.Pointing; +import com.tterrag.registrate.util.entry.BlockEntry; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3i; + +public class KineticsScenes { + + public static void template(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("This is a template"); + scene.showBasePlate(); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + } + + // + + public static void shaftAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Relaying rotational force using Shafts"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos gaugePos = util.grid.at(0, 1, 2); + Selection gauge = util.select.position(gaugePos); + scene.world.showSection(gauge, Direction.UP); + scene.world.setKineticSpeed(gauge, 0); + + scene.idle(5); + scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN); + scene.idle(10); + + for (int i = 4; i >= 1; i--) { + if (i == 2) + scene.rotateCameraY(70); + scene.idle(5); + scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + } + + scene.world.setKineticSpeed(gauge, 64); + scene.effects.indicateSuccess(gaugePos); + scene.idle(10); + scene.overlay.showTargetedText(WHITE, util.vector.at(3, 1.5, 2.5), "shaft_relay", + "Shafts will relay rotation in a straight line.", 1000); + + scene.idle(20); + scene.markAsFinished(); + } + + public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Encasing Shafts"); + scene.showBasePlate(); + + Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(4, 0, 2)); + Selection andesite = util.select.position(3, 1, 2); + Selection brass = util.select.position(1, 1, 2); + + scene.world.showSection(shaft, Direction.DOWN); + scene.idle(20); + + BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT; + ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(3, 1, 2), Pointing.DOWN).rightClick() + .withItem(andesiteCasingItem), 60); + scene.idle(7); + scene.world.setBlocks(andesite, andesiteEncased.getDefaultState() + .with(EncasedShaftBlock.AXIS, Axis.X), true); + scene.world.setKineticSpeed(shaft, -112); + scene.idle(10); + + BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_SHAFT; + ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(1, 0, 2), Pointing.UP).rightClick() + .withItem(brassCasingItem), 60); + scene.idle(7); + scene.world.setBlocks(brass, brassEncased.getDefaultState() + .with(EncasedShaftBlock.AXIS, Axis.X), true); + scene.world.setKineticSpeed(shaft, -112); + + scene.idle(10); + scene.overlay.showTargetedText(WHITE, util.vector.at(1.5, 2, 2.5), "shaft_can_be_encased", + "Andesite or Brass Casing can be used to encase them.", 1000); + } + +} 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 7ff108e90..f5c46f990 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 @@ -4,20 +4,19 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.ponder.PonderRegistry; public class PonderIndex { - - /** - * When true, lang files are bypassed and any text in ponder can be hot-swapped - * without the need of runData - */ + public static final boolean EDITOR_MODE = true; public static void register() { - // Register storyboards here (Requires re-launch) + // Register storyboards here (Changes require re-launch) - PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftAsRelay()); - PonderRegistry.addStoryBoard(AllBlocks.SHAFT, new ShaftsCanBeEncased()); + PonderRegistry.forComponent(AllBlocks.SHAFT) + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) + .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); - DebugScenes.registerAll(); + // Debug scenes, can be found in game via the Brass Hand + if (EDITOR_MODE) + DebugScenes.registerAll(); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java deleted file mode 100644 index 627e014ed..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftAsRelay.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.simibubi.create.foundation.ponder.content; - -import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; - -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.Select; - -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; - -class ShaftAsRelay extends PonderStoryBoard { - - @Override - public String getSchematicName() { - return "shaft/shaft"; - } - - @Override - public String getStoryTitle() { - return "Relaying rotational force using Shafts"; - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.configureBasePlate(0, 0, 5); - scene.showSection(util.layer(0), Direction.UP); - - Select gauge = Select.pos(0, 1, 2); - scene.showSection(gauge, Direction.UP); - scene.setKineticSpeed(gauge, 0); - - scene.idle(5); - scene.showSection(Select.pos(5, 1, 2), Direction.DOWN); - scene.idle(10); - - for (int i = 4; i >= 1; i--) { - if (i == 2) - scene.rotateCameraY(70); - scene.idle(5); - scene.showSection(Select.pos(i, 1, 2), Direction.DOWN); - } - - scene.setKineticSpeed(gauge, 64); - scene.indicateSuccess(new BlockPos(0, 1, 2)); - scene.idle(10); - scene.showTargetedText(WHITE, new Vec3d(3, 1.5, 2.5), "shaft_relay", - "Shafts will relay rotation in a straight line.", 1000); - - scene.idle(20); - scene.markAsFinished(); - - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java deleted file mode 100644 index 2ddf32ba9..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ShaftsCanBeEncased.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.simibubi.create.foundation.ponder.content; - -import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; - -import com.simibubi.create.AllBlocks; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder; -import com.simibubi.create.foundation.ponder.PonderScene.SceneBuilder.SceneBuildingUtil; -import com.simibubi.create.foundation.ponder.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.Select; -import com.simibubi.create.foundation.ponder.elements.InputWindowElement; -import com.simibubi.create.foundation.utility.Pointing; -import com.tterrag.registrate.util.entry.BlockEntry; - -import net.minecraft.util.Direction; -import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; - -class ShaftsCanBeEncased extends PonderStoryBoard { - - @Override - public String getSchematicName() { - return "shaft/encasing_shafts"; - } - - @Override - public String getStoryTitle() { - return "Encasing Shafts"; - } - - @Override - public void program(SceneBuilder scene, SceneBuildingUtil util) { - scene.showBasePlate(); - - Select shaft = Select.cuboid(new BlockPos(0, 1, 2), new Vec3i(4, 0, 2)); - Select andesite = Select.pos(3, 1, 2); - Select brass = Select.pos(1, 1, 2); - - scene.showSection(shaft, Direction.DOWN); - scene.idle(20); - - BlockEntry andesiteEncased = AllBlocks.ANDESITE_ENCASED_SHAFT; - scene.showControls(new InputWindowElement(util.topOf(3, 1, 2), Pointing.DOWN).rightClick() - .withItem(AllBlocks.ANDESITE_CASING.asStack()), 60); - scene.idle(7); - scene.setBlocks(andesite, andesiteEncased.getDefaultState() - .with(EncasedShaftBlock.AXIS, Axis.X)); - scene.setKineticSpeed(shaft, -112); - scene.idle(10); - - BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_SHAFT; - scene.showControls(new InputWindowElement(util.topOf(1, 0, 2), Pointing.UP).rightClick() - .withItem(AllBlocks.BRASS_CASING.asStack()), 60); - scene.idle(7); - scene.setBlocks(brass, brassEncased.getDefaultState() - .with(EncasedShaftBlock.AXIS, Axis.X)); - scene.setKineticSpeed(shaft, -112); - - scene.idle(10); - scene.showTargetedText(WHITE, new Vec3d(1.5, 2, 2.5), "shaft_can_be_encased", - "Andesite or Brass Casing can be used to encase them.", 1000); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java index 61326ecba..e7b04fb40 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; public abstract class AnimatedSceneElement extends PonderSceneElement { @@ -20,6 +21,10 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { .startWithValue(0); } + public void forceApplyFade(float fade) { + this.fade.startWithValue(fade); + } + public void setFade(float fade) { this.fade.setValue(fade); } @@ -71,7 +76,7 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { protected int lightCoordsFromFade(float fade) { int light = 0xF000F0; if (fade != 1) { - light = (int) (0xF * fade); + light = (int) (MathHelper.lerp(fade, 5, 0xF)); light = light << 4 | light << 20; } return light; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index bc5321c4b..b46466c6b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.ponder.elements; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Random; import org.apache.commons.lang3.tuple.Pair; @@ -12,11 +11,14 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.TileEntityRenderHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -34,6 +36,7 @@ import net.minecraft.fluid.IFluidState; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; @@ -42,18 +45,99 @@ public class WorldSectionElement extends AnimatedSceneElement { public static final Compartment> DOC_WORLD_SECTION = new Compartment<>(); List renderedTileEntities; - Select section; + Selection section; boolean redraw; - public WorldSectionElement(Select section) { - this.section = section; + Vec3d prevAnimatedOffset = Vec3d.ZERO; + Vec3d animatedOffset = Vec3d.ZERO; + Vec3d prevAnimatedRotation = Vec3d.ZERO; + Vec3d animatedRotation = Vec3d.ZERO; + Vec3d centerOfRotation = Vec3d.ZERO; + + public WorldSectionElement() {} + + public WorldSectionElement(Selection section) { + this.section = section.copy(); + centerOfRotation = section.getCenter(); } - public void queueRedraw(PonderWorld world) { + public void mergeOnto(WorldSectionElement other) { + setVisible(false); + if (other.isEmpty()) + other.set(section); + else + other.add(section); + } + + public void set(Selection selection) { + applyNewSelection(selection.copy()); + } + + public void add(Selection toAdd) { + applyNewSelection(this.section.add(toAdd)); + } + + public void erase(Selection toErase) { + applyNewSelection(this.section.substract(toErase)); + } + + private void applyNewSelection(Selection selection) { + this.section = selection; + centerOfRotation = this.section.getCenter(); + queueRedraw(); + } + + @Override + public void reset(PonderScene scene) { + super.reset(scene); + resetAnimatedTransform(); + } + + public void resetAnimatedTransform() { + prevAnimatedOffset = Vec3d.ZERO; + animatedOffset = Vec3d.ZERO; + prevAnimatedRotation = Vec3d.ZERO; + animatedRotation = Vec3d.ZERO; + } + + public void queueRedraw() { redraw = true; } + public boolean isEmpty() { + return section == null; + } + + public void setEmpty() { + section = null; + } + + public void setAnimatedRotation(Vec3d eulerAngles) { + this.animatedRotation = eulerAngles; + } + + public Vec3d getAnimatedRotation() { + return animatedRotation; + } + + public void setAnimatedOffset(Vec3d offset) { + this.animatedOffset = offset; + } + + public Vec3d getAnimatedOffset() { + return animatedOffset; + } + + @Override + public boolean isVisible() { + return super.isVisible() && !isEmpty(); + } + public void tick(PonderScene scene) { + prevAnimatedOffset = animatedOffset; + prevAnimatedRotation = animatedRotation; + if (!isVisible()) + return; if (renderedTileEntities == null) return; renderedTileEntities.forEach(te -> { @@ -65,6 +149,19 @@ public class WorldSectionElement extends AnimatedSceneElement { @Override protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade) { + float pt = AnimationTickHolder.getPartialTicks(); + + MatrixStacker.of(ms) + .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); + + if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) + MatrixStacker.of(ms) + .translate(centerOfRotation) + .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) + .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) + .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) + .translateBack(centerOfRotation); + renderStructure(world, ms, buffer, type, fade); } @@ -99,7 +196,7 @@ public class WorldSectionElement extends AnimatedSceneElement { contraptionBuffer.light(light) .renderInto(ms, buffer.getBuffer(type)); } - + @Override protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { redraw = false; @@ -108,10 +205,11 @@ public class WorldSectionElement extends AnimatedSceneElement { private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { if (renderedTileEntities == null) { renderedTileEntities = new ArrayList<>(); - section.all() - .map(world::getTileEntity) - .filter(Objects::nonNull) - .forEach(renderedTileEntities::add); + section.forEach(pos -> { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity != null) + renderedTileEntities.add(tileEntity); + }); } else renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); @@ -129,24 +227,23 @@ public class WorldSectionElement extends AnimatedSceneElement { builder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); world.setMask(this.section); - section.all() - .forEach(pos -> { - BlockState state = world.getBlockState(pos); - IFluidState ifluidstate = world.getFluidState(pos); + section.forEach(pos -> { + BlockState state = world.getBlockState(pos); + IFluidState ifluidstate = world.getFluidState(pos); - ms.push(); - ms.translate(pos.getX(), pos.getY(), pos.getZ()); + ms.push(); + ms.translate(pos.getX(), pos.getY(), pos.getZ()); - if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR - && RenderTypeLookup.canRenderInLayer(state, layer)) - blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, - random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR + && RenderTypeLookup.canRenderInLayer(state, layer)) + blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, + random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); - if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) - dispatcher.renderFluid(pos, world, builder, ifluidstate); + if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) + dispatcher.renderFluid(pos, world, builder, ifluidstate); - ms.pop(); - }); + ms.pop(); + }); world.clearMask(); builder.finishDrawing(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java new file mode 100644 index 000000000..5b67ebb56 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java @@ -0,0 +1,68 @@ +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.PonderScene; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; + +import net.minecraft.util.math.Vec3d; + +public class AnimateWorldSectionInstruction extends TickingInstruction { + + protected Vec3d deltaPerTick; + protected Vec3d totalDelta; + protected Vec3d target; + protected ElementLink link; + protected WorldSectionElement element; + + private BiConsumer setter; + private Function getter; + + public static AnimateWorldSectionInstruction rotate(ElementLink link, Vec3d rotation, + int ticks) { + return new AnimateWorldSectionInstruction(link, rotation, ticks, WorldSectionElement::setAnimatedRotation, + WorldSectionElement::getAnimatedRotation); + } + + public static AnimateWorldSectionInstruction move(ElementLink link, Vec3d offset, int ticks) { + return new AnimateWorldSectionInstruction(link, offset, ticks, WorldSectionElement::setAnimatedOffset, + WorldSectionElement::getAnimatedOffset); + } + + protected AnimateWorldSectionInstruction(ElementLink link, Vec3d totalDelta, int ticks, + BiConsumer setter, Function getter) { + super(false, ticks); + this.link = link; + this.setter = setter; + this.getter = getter; + this.deltaPerTick = totalDelta.scale(1d / ticks); + this.totalDelta = totalDelta; + this.target = totalDelta; + } + + @Override + protected final void firstTick(PonderScene scene) { + super.firstTick(scene); + element = scene.resolve(link); + if (element == null) + return; + target = getter.apply(element) + .add(totalDelta); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (element == null) + return; + if (remainingTicks == 0) { + setter.accept(element, target); + return; + } + setter.accept(element, getter.apply(element) + .add(deltaPerTick)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java new file mode 100644 index 000000000..e0a19f30b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ChaseAABBInstruction.java @@ -0,0 +1,30 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.content.PonderPalette; + +import net.minecraft.util.math.AxisAlignedBB; + +public class ChaseAABBInstruction extends TickingInstruction { + + private AxisAlignedBB bb; + private Object slot; + private PonderPalette color; + + public ChaseAABBInstruction(PonderPalette color, Object slot, AxisAlignedBB bb, int ticks) { + super(false, ticks); + this.color = color; + this.slot = slot; + this.bb = bb; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + scene.getOutliner() + .chaseAABB(slot, bb) + .lineWidth(1 / 16f) + .colored(color.getColor()); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java index 7d400aa2d..56ada8ae2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateParrotInstruction.java @@ -9,5 +9,10 @@ public class CreateParrotInstruction extends FadeIntoSceneInstruction getElementClass() { + return ParrotElement.class; + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java index f7532c299..07cd403c8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java @@ -1,13 +1,42 @@ package com.simibubi.create.foundation.ponder.instructions; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import net.minecraft.util.Direction; public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction { - public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, WorldSectionElement element) { - super(fadeInTicks, fadeInFrom, element); + private Selection initialSelection; + private boolean mergeToBase; + + public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, boolean mergeToBase) { + super(fadeInTicks, fadeInFrom, new WorldSectionElement(selection)); + initialSelection = selection; + this.mergeToBase = mergeToBase; + } + + @Override + protected void firstTick(PonderScene scene) { + super.firstTick(scene); + element.set(initialSelection); + element.setVisible(true); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (remainingTicks > 0) + return; + if (!mergeToBase) + return; + element.mergeOnto(scene.getBaseWorldSection()); } + @Override + protected Class getElementClass() { + return WorldSectionElement.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 49e0b402a..04af5ceaf 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 @@ -1,21 +1,25 @@ package com.simibubi.create.foundation.ponder.instructions; +import java.util.UUID; + +import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import net.minecraft.util.Direction; import net.minecraft.util.math.Vec3d; -public class FadeIntoSceneInstruction extends TickingInstruction { +public abstract class FadeIntoSceneInstruction extends TickingInstruction { private Direction fadeInFrom; - private T element; + protected T element; + private ElementLink elementLink; public FadeIntoSceneInstruction(int fadeInTicks, Direction fadeInFrom, T element) { - super(false, fadeInTicks); - this.fadeInFrom = fadeInFrom; - this.element = element; - } + super(false, fadeInTicks); + this.fadeInFrom = fadeInFrom; + this.element = element; + } @Override protected void firstTick(PonderScene scene) { @@ -23,6 +27,8 @@ public class FadeIntoSceneInstruction extends Ti scene.addElement(element); element.setFade(0); element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); + if (elementLink != null) + scene.linkElement(element, elementLink); } @Override @@ -34,4 +40,12 @@ public class FadeIntoSceneInstruction extends Ti element.setFade(1); } + public ElementLink createLink(PonderScene scene) { + elementLink = new ElementLink<>(getElementClass(), UUID.randomUUID()); + scene.linkElement(element, elementLink); + return elementLink; + } + + protected abstract Class getElementClass(); + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java new file mode 100644 index 000000000..88545e101 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeOutOfSceneInstruction.java @@ -0,0 +1,46 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; + +import net.minecraft.util.Direction; +import net.minecraft.util.math.Vec3d; + +public class FadeOutOfSceneInstruction extends TickingInstruction { + + private Direction fadeOutTo; + private ElementLink link; + private T element; + + public FadeOutOfSceneInstruction(int fadeOutTicks, Direction fadeOutTo, ElementLink link) { + super(false, fadeOutTicks); + this.fadeOutTo = fadeOutTo.getOpposite(); + this.link = link; + } + + @Override + protected void firstTick(PonderScene scene) { + super.firstTick(scene); + element = scene.resolve(link); + if (element == null) + return; + element.setVisible(true); + element.setFade(1); + element.setFadeVec(new Vec3d(fadeOutTo.getDirectionVec()).scale(.5f)); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (element == null) + return; + float fade = (remainingTicks / (float) totalTicks); + element.setFade(1 - (1 - fade) * (1 - fade)); + if (remainingTicks == 0) { + element.setVisible(false); + element.setFade(0); + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java index ecaf7b30d..a7f2e15b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/MarkAsFinishedInstruction.java @@ -12,7 +12,7 @@ public class MarkAsFinishedInstruction extends PonderInstruction { @Override public void tick(PonderScene scene) { - scene.finished = true; + scene.setFinished(true); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java new file mode 100644 index 000000000..23207f9fc --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/OutlineSelectionInstruction.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.content.PonderPalette; + +public class OutlineSelectionInstruction extends TickingInstruction { + + private PonderPalette color; + private Object slot; + private Selection selection; + + public OutlineSelectionInstruction(PonderPalette color, Object slot, Selection selection, int ticks) { + super(false, ticks); + this.color = color; + this.slot = slot; + this.selection = selection; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + selection.makeOutline(scene.getOutliner(), slot) + .lineWidth(1 / 16f) + .colored(color.getColor()); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index c723b4d93..0b61a362c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.ponder.instructions; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.Selection; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -11,27 +11,30 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { private BlockState stateToUse; private boolean replaceAir; + private boolean spawnParticles; - public ReplaceBlocksInstruction(Select selection, BlockState stateToUse, boolean replaceAir) { + public ReplaceBlocksInstruction(Selection selection, BlockState stateToUse, boolean replaceAir, + boolean spawnParticles) { super(selection); this.stateToUse = stateToUse; this.replaceAir = replaceAir; + this.spawnParticles = spawnParticles; } @Override - protected void runModification(Select selection, PonderScene scene) { + protected void runModification(Selection selection, PonderScene scene) { PonderWorld world = scene.getWorld(); - selection.all() - .forEach(pos -> { - if (!world.getBounds() - .isVecInside(pos)) - return; - BlockState prevState = world.getBlockState(pos); - if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) - return; + selection.forEach(pos -> { + if (!world.getBounds() + .isVecInside(pos)) + return; + BlockState prevState = world.getBlockState(pos); + if (!replaceAir && prevState == Blocks.AIR.getDefaultState()) + return; + if (spawnParticles) world.addBlockDestroyEffects(pos, prevState); - world.setBlockState(pos, stateToUse); - }); + world.setBlockState(pos, stateToUse); + }); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java index 0368437c3..6ed5b5a6e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java @@ -2,14 +2,13 @@ package com.simibubi.create.foundation.ponder.instructions; import com.simibubi.create.foundation.ponder.PonderInstruction; import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; public class ShowCompleteSchematicInstruction extends PonderInstruction { @Override public void tick(PonderScene scene) { - scene.addElement(Select.everything(scene.getBounds()) - .asElement()); + scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere())); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index ab7c84761..31c3c44a4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -3,7 +3,7 @@ package com.simibubi.create.foundation.ponder.instructions; import java.util.function.Supplier; import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.OutlinerElement; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; @@ -18,7 +18,7 @@ public class TextInstruction extends FadeInOutInstruction { super(duration); } - public TextInstruction(int color, Supplier text, int duration, Select selection) { + public TextInstruction(int color, Supplier text, int duration, Selection selection) { this(color, text, duration); element = new TextWindowElement(text).pointAt(selection.getCenter()); element.colored(color); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java index efcae7a9e..d484bae49 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TileEntityDataInstruction.java @@ -4,7 +4,7 @@ import java.util.function.UnaryOperator; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import net.minecraft.nbt.CompoundNBT; @@ -16,7 +16,7 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { private UnaryOperator data; private Class type; - public TileEntityDataInstruction(Select selection, Class type, + public TileEntityDataInstruction(Selection selection, Class type, UnaryOperator data, boolean redraw) { super(selection); this.type = type; @@ -25,21 +25,20 @@ public class TileEntityDataInstruction extends WorldModifyInstruction { } @Override - protected void runModification(Select selection, PonderScene scene) { + protected void runModification(Selection selection, PonderScene scene) { PonderWorld world = scene.getWorld(); - selection.all() - .forEach(pos -> { - if (!world.getBounds() - .isVecInside(pos)) - return; - TileEntity tileEntity = world.getTileEntity(pos); - if (!type.isInstance(tileEntity)) - return; - CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); - tileEntity.read(apply); - if (tileEntity instanceof SyncedTileEntity) - ((SyncedTileEntity) tileEntity).readClientUpdate(apply); - }); + selection.forEach(pos -> { + if (!world.getBounds() + .isVecInside(pos)) + return; + TileEntity tileEntity = world.getTileEntity(pos); + if (!type.isInstance(tileEntity)) + return; + CompoundNBT apply = data.apply(tileEntity.write(new CompoundNBT())); + tileEntity.read(apply); + if (tileEntity instanceof SyncedTileEntity) + ((SyncedTileEntity) tileEntity).readClientUpdate(apply); + }); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java index 02ab81aac..7e387de05 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java @@ -2,14 +2,14 @@ package com.simibubi.create.foundation.ponder.instructions; import com.simibubi.create.foundation.ponder.PonderInstruction; import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.Select; +import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; public abstract class WorldModifyInstruction extends PonderInstruction { - private Select selection; + private Selection selection; - public WorldModifyInstruction(Select selection) { + public WorldModifyInstruction(Selection selection) { this.selection = selection; } @@ -22,10 +22,10 @@ public abstract class WorldModifyInstruction extends PonderInstruction { public void tick(PonderScene scene) { runModification(selection, scene); if (needsRedraw()) - scene.forEach(WorldSectionElement.class, wse -> wse.queueRedraw(scene.getWorld())); + scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } - protected abstract void runModification(Select selection, PonderScene scene); + protected abstract void runModification(Selection selection, PonderScene scene); protected abstract boolean needsRedraw(); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java index 3d0311265..67e1a46c4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java @@ -60,14 +60,14 @@ public class Outliner { public OutlineParams showAABB(Object slot, AxisAlignedBB bb, int ttl) { createAABBOutlineIfMissing(slot, bb); ChasingAABBOutline outline = getAndRefreshAABB(slot, ttl); - outline.prevBB = outline.targetBB = bb; + outline.prevBB = outline.targetBB = outline.bb = bb; return outline.getParams(); } public OutlineParams showAABB(Object slot, AxisAlignedBB bb) { createAABBOutlineIfMissing(slot, bb); ChasingAABBOutline outline = getAndRefreshAABB(slot); - outline.prevBB = outline.targetBB = bb; + outline.prevBB = outline.targetBB = outline.bb = bb; return outline.getParams(); } @@ -107,7 +107,7 @@ public class Outliner { // Utility private void createAABBOutlineIfMissing(Object slot, AxisAlignedBB bb) { - if (!outlines.containsKey(slot)) { + if (!outlines.containsKey(slot) || !(outlines.get(slot).outline instanceof AABBOutline)) { ChasingAABBOutline outline = new ChasingAABBOutline(bb); outlines.put(slot, new OutlineEntry(outline)); } diff --git a/src/main/resources/ponder/debug/scene_8.nbt b/src/main/resources/ponder/debug/scene_8.nbt new file mode 100644 index 0000000000000000000000000000000000000000..eb2a7ac88bd906d7c2c437cefee318dd02deef21 GIT binary patch literal 319 zcmb2|=3sz;-l>lMM-&8Fm!H|N?e*1W`@^5-eSdQ?yP0L`4sKt?n@8lIy`L-^@Ei&DDZLo! zW0gAj?)ffn|Lu=nuCw8KU~oXNVKJj$==BdJ+VfuT6*-XDpv>UTJZIgtR`<1Yp4 zSDd@||J=NLHD!x?51w16aQ^k_4LKV(7tXq46E(S}LihNNyR&oV-I-Iv Date: Sun, 21 Feb 2021 19:29:23 +0100 Subject: [PATCH 10/23] Basic item simulation - Support for generic entities inside ponder scenes - Instructions for manipulating/creating entities - Client-side belts are now slightly smarter inside a ponder world - Some doc for the doc --- src/generated/resources/.cache/cache | 26 ++-- .../resources/assets/create/lang/en_us.json | 2 + .../assets/create/lang/unfinished/de_de.json | 4 +- .../assets/create/lang/unfinished/es_es.json | 4 +- .../assets/create/lang/unfinished/es_mx.json | 4 +- .../assets/create/lang/unfinished/fr_fr.json | 4 +- .../assets/create/lang/unfinished/it_it.json | 4 +- .../assets/create/lang/unfinished/ja_jp.json | 4 +- .../assets/create/lang/unfinished/ko_kr.json | 4 +- .../assets/create/lang/unfinished/nl_nl.json | 4 +- .../assets/create/lang/unfinished/pt_br.json | 4 +- .../assets/create/lang/unfinished/ru_ru.json | 4 +- .../assets/create/lang/unfinished/zh_cn.json | 4 +- .../assets/create/lang/unfinished/zh_tw.json | 4 +- .../relays/belt/transport/BeltInventory.java | 9 +- .../create/foundation/ponder/PonderScene.java | 10 +- .../create/foundation/ponder/PonderWorld.java | 93 ++++++++++++- .../foundation/ponder/SceneBuilder.java | 128 +++++++++++++++++- .../foundation/ponder/SceneBuildingUtil.java | 9 +- .../ponder/content/DebugScenes.java | 48 ++++++- .../ponder/content/PonderIndex.java | 6 +- .../ShowCompleteSchematicInstruction.java | 19 --- src/main/resources/ponder/debug/scene_9.nbt | Bin 0 -> 1004 bytes 23 files changed, 336 insertions(+), 62 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java create mode 100644 src/main/resources/ponder/debug/scene_9.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index d8d0cdebf..1db70f66e 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -4bc90775f20e4373d8acfcd68df5a65134e04866 assets/create/lang/en_us.json -556b49bc145684816fe4ed3d01b8292b027785f6 assets/create/lang/unfinished/de_de.json -0112e46354dc5a3e404e80f18c3e9cf2ce2ac3a7 assets/create/lang/unfinished/es_es.json -22d8dbe2f7a2b7bb7b8175e6ea7ffe5461138339 assets/create/lang/unfinished/es_mx.json -5aac59946786fe76ff0d5ab8e548c086adb46a7b assets/create/lang/unfinished/fr_fr.json -479b811f2a0a687e7a1d14cfbed85af8ed8167b9 assets/create/lang/unfinished/it_it.json -22ab034f6f8cadcbc689f27e8697e52bc9fd701f assets/create/lang/unfinished/ja_jp.json -c046e6335a67a8685bb7e74cd6b14a5ee9c376db assets/create/lang/unfinished/ko_kr.json -96995633b85eaff2ac1b38a8958c6d167150d255 assets/create/lang/unfinished/nl_nl.json -8e8159926be6be37f97f6d4cf47deb8c236b83dc assets/create/lang/unfinished/pt_br.json -4485be9e7a8a2b0d006464390e664d6d504328b5 assets/create/lang/unfinished/ru_ru.json -8bfa521e0220fe71dbeb537a08845522e1ae0899 assets/create/lang/unfinished/zh_cn.json -eeaa83dafc8a683b4834cd87a49cb9b3c88e4121 assets/create/lang/unfinished/zh_tw.json +9797de418101ddd344ac8ec2b91fb2ba25ea504e assets/create/lang/en_us.json +64b7f0ddac53567a3a23cd29774fdb2b93f9e777 assets/create/lang/unfinished/de_de.json +54ea6fa80308ee8908ae2596e8bcaa6d9e5d0731 assets/create/lang/unfinished/es_es.json +c1bf9ae424ffe72ba3684d1aa359f2b4a2bb2e88 assets/create/lang/unfinished/es_mx.json +104eeb4b28ce3be1c0fc7ce2b779dc79dc1e2f5d assets/create/lang/unfinished/fr_fr.json +da5819debc20d7a65c3f8472889f8be1e9bc97c5 assets/create/lang/unfinished/it_it.json +c697d1f20b6482e03a42cbdd9c2fad1b63094dcb assets/create/lang/unfinished/ja_jp.json +0746089d44ec5328f8ce8c8cf2328b2de5ec885e assets/create/lang/unfinished/ko_kr.json +cac8ff78aecfbf596af332d21406fddca9f53d5a assets/create/lang/unfinished/nl_nl.json +7424b098208ec7d3a06c6bf614a303b12944d4b5 assets/create/lang/unfinished/pt_br.json +95adcdad2f75c548cac7cdf61fd141b08e451f50 assets/create/lang/unfinished/ru_ru.json +be41354ccd7dbfbc60a4e36cf37388c7c7a4f88d assets/create/lang/unfinished/zh_cn.json +241fd40fc3ceba47f58c83da244fca4efd969b05 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 c60e2f77b..9a46b7f06 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1816,6 +1816,7 @@ "create.ponder.brass_hand.scene_0.title": "Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "wut?", "create.ponder.brass_hand.scene_2.title": "Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate do not affect scaling", @@ -1832,6 +1833,7 @@ "create.ponder.brass_hand.scene_7.independent": "This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "Sections", + "create.ponder.brass_hand.scene_8.title": "Manipulating Items", "_": "Thank you for translating Create!" 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 0cb77f8ea..31dadf6af 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: 999", + "_": "Missing Localizations: 1001", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 221c74307..00206466e 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: 41", + "_": "Missing Localizations: 43", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 52d63a589..68c3b6cb4 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: 929", + "_": "Missing Localizations: 931", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 eb814a792..66937b528 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: 711", + "_": "Missing Localizations: 713", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 475eac406..e92f0ea32 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: 46", + "_": "Missing Localizations: 48", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 84938edd3..9f93dbcd0 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: 53", + "_": "Missing Localizations: 55", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 c7f7cb301..335c22dcb 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: 100", + "_": "Missing Localizations: 102", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 2dba21e1c..ff376eb23 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: 1198", + "_": "Missing Localizations: 1200", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 8fc37b357..4faf91a40 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: 1264", + "_": "Missing Localizations: 1266", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 f3920d706..45b635dfe 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: 50", + "_": "Missing Localizations: 52", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 6f7297f43..180130ec7 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: 48", + "_": "Missing Localizations: 50", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" 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 e99ebdaa8..d0555d929 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: 53", + "_": "Missing Localizations: 55", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,7 @@ "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", + "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", @@ -1833,6 +1834,7 @@ "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", + "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 8b4dcbde9..97ab06030 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -38,6 +38,7 @@ public class BeltInventory { final List toInsert; final List toRemove; boolean beltMovementPositive; + boolean virtualMode; final float SEGMENT_WINDOW = .75f; public BeltInventory(BeltTileEntity te) { @@ -45,6 +46,7 @@ public class BeltInventory { items = new LinkedList<>(); toInsert = new LinkedList<>(); toRemove = new LinkedList<>(); + virtualMode = false; } public void tick() { @@ -82,7 +84,7 @@ public class BeltInventory { .get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL; float spacing = 1; World world = belt.getWorld(); - boolean onClient = world.isRemote; + boolean onClient = world.isRemote && !virtualMode; // resolve ending only when items will reach it this tick Ending ending = Ending.UNRESOLVED; @@ -436,5 +438,10 @@ public class BeltInventory { public List getTransportedItems() { return items; } + + // Simulating belt interactions in a client-only world + public void enableVirtualMode() { + virtualMode = true; + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index ff655e3dd..fc3486513 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -28,6 +28,7 @@ import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; +import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec2f; @@ -126,6 +127,7 @@ public class PonderScene { forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms)); forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms)); info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt)); + world.renderEntities(ms, buffer, info); world.renderParticles(ms, buffer, info); outliner.renderOutlines(ms, buffer); ms.pop(); @@ -152,7 +154,7 @@ public class PonderScene { pointOfInterest = VecHelper.lerp(.25f, pointOfInterest, chasingPointOfInterest); outliner.tickOutlines(); - world.tickParticles(); + world.tick(); transform.tick(); forEach(e -> e.tick(this)); @@ -203,6 +205,12 @@ public class PonderScene { for (PonderElement elemtent : elements) function.accept(elemtent); } + + public void forEachWorldEntity(Class type, Consumer function) { + for (Entity element : world.getEntities()) + if (type.isInstance(element)) + function.accept(type.cast(element)); + } public void forEach(Class type, Consumer function) { for (PonderElement element : elements) 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 fd62396bc..3f2fe4cfa 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -1,12 +1,19 @@ package com.simibubi.create.foundation.ponder; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; import javax.annotation.Nullable; 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.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -16,6 +23,11 @@ import net.minecraft.client.particle.Particle; import net.minecraft.client.particle.ParticleManager; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.inventory.container.PlayerContainer; import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.BlockParticleData; import net.minecraft.particles.IParticleData; @@ -25,6 +37,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.LightType; @@ -35,6 +48,7 @@ public class PonderWorld extends SchematicWorld { protected Map originalBlocks; protected Map originalTileEntities; + protected List originalEntities; protected PonderWorldParticles particles; int overrideLight; @@ -44,6 +58,7 @@ public class PonderWorld extends SchematicWorld { super(anchor, original); originalBlocks = new HashMap<>(); originalTileEntities = new HashMap<>(); + originalEntities = new ArrayList<>(); particles = new PonderWorldParticles(this); } @@ -52,9 +67,12 @@ public class PonderWorld extends SchematicWorld { originalTileEntities.clear(); blocks.forEach((k, v) -> originalBlocks.put(k, v)); tileEntities.forEach((k, v) -> originalTileEntities.put(k, TileEntity.create(v.write(new CompoundNBT())))); + entities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this) + .ifPresent(originalEntities::add)); } public void restore() { + entities.clear(); blocks.clear(); tileEntities.clear(); renderedTileEntities.clear(); @@ -65,7 +83,10 @@ public class PonderWorld extends SchematicWorld { tileEntities.put(k, te); renderedTileEntities.add(te); }); + originalEntities.forEach(e -> EntityType.loadEntityUnchecked(e.serializeNBT(), this) + .ifPresent(entities::add)); particles.clearEffects(); + fixVirtualTileEntities(); } public void pushFakeLight(int light) { @@ -101,12 +122,60 @@ public class PonderWorld extends SchematicWorld { return this; } + public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari) { + Vec3d vec3d = ari.getProjectedView(); + float pt = AnimationTickHolder.getPartialTicks(); + double d0 = vec3d.getX(); + double d1 = vec3d.getY(); + double d2 = vec3d.getZ(); + + for (Entity entity : entities) { + if (entity.ticksExisted == 0) { + entity.lastTickPosX = entity.getX(); + entity.lastTickPosY = entity.getY(); + entity.lastTickPosZ = entity.getZ(); + } + renderEntity(entity, d0, d1, d2, pt, ms, buffer); + } + + buffer.draw(RenderType.getEntitySolid(PlayerContainer.BLOCK_ATLAS_TEXTURE)); + buffer.draw(RenderType.getEntityCutout(PlayerContainer.BLOCK_ATLAS_TEXTURE)); + buffer.draw(RenderType.getEntityCutoutNoCull(PlayerContainer.BLOCK_ATLAS_TEXTURE)); + buffer.draw(RenderType.getEntitySmoothCutout(PlayerContainer.BLOCK_ATLAS_TEXTURE)); + } + + private void renderEntity(Entity entity, double x, double y, double z, float pt, MatrixStack ms, + IRenderTypeBuffer buffer) { + double d0 = MathHelper.lerp((double) pt, entity.lastTickPosX, entity.getX()); + double d1 = MathHelper.lerp((double) pt, entity.lastTickPosY, entity.getY()); + double d2 = MathHelper.lerp((double) pt, entity.lastTickPosZ, entity.getZ()); + float f = MathHelper.lerp(pt, entity.prevRotationYaw, entity.rotationYaw); + EntityRendererManager renderManager = Minecraft.getInstance() + .getRenderManager(); + int light = renderManager.getRenderer(entity) + .getLight(entity, pt); + renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light); + } + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari) { particles.renderParticles(ms, buffer, ari); } - public void tickParticles() { + public void tick() { particles.tick(); + + for (Iterator iterator = entities.iterator(); iterator.hasNext();) { + Entity entity = iterator.next(); + + entity.ticksExisted++; + entity.lastTickPosX = entity.getX(); + entity.lastTickPosY = entity.getY(); + entity.lastTickPosZ = entity.getZ(); + entity.tick(); + + if (!entity.isAlive()) + iterator.remove(); + } } @Override @@ -129,11 +198,31 @@ public class PonderWorld extends SchematicWorld { particles.addParticle(p); } + public void fixVirtualTileEntities() { + for (TileEntity tileEntity : tileEntities.values()) { + if (!(tileEntity instanceof BeltTileEntity)) + continue; + BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; + if (!beltTileEntity.isController()) + continue; + BlockPos controllerPos = tileEntity.getPos(); + beltTileEntity.getInventory() + .enableVirtualMode(); + for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) { + TileEntity tileEntity2 = getTileEntity(blockPos); + if (!(tileEntity2 instanceof BeltTileEntity)) + continue; + BeltTileEntity belt2 = (BeltTileEntity) tileEntity2; + belt2.setController(controllerPos); + } + } + } + public void addBlockDestroyEffects(BlockPos pos, BlockState state) { VoxelShape voxelshape = state.getShape(this, pos); if (voxelshape.isEmpty()) return; - + AxisAlignedBB bb = voxelshape.getBoundingBox(); double d1 = Math.min(1.0D, bb.maxX - bb.minX); double d2 = Math.min(1.0D, bb.maxY - bb.minY); 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 e9cb9a5f6..cc2d8e782 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -2,9 +2,11 @@ package com.simibubi.create.foundation.ponder; import java.util.UUID; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.UnaryOperator; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +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; @@ -24,28 +26,57 @@ import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; import com.simibubi.create.foundation.ponder.instructions.OutlineSelectionInstruction; import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction; -import com.simibubi.create.foundation.ponder.instructions.ShowCompleteSchematicInstruction; import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction; import com.simibubi.create.foundation.ponder.instructions.TextInstruction; import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +import net.minecraft.world.World; +/** + * Enqueue instructions to the schedule via this object's methods. + */ public class SceneBuilder { + /** + * Ponder's toolkit for showing information on top of the scene world, such as + * highlighted bounding boxes, texts, icons and keybindings. + */ public final OverlayInstructions overlay; - public final SpecialInstructions special; + + /** + * Instructions for manipulating the schematic and its currently visible areas. + * Allows to show, hide and modify blocks as the scene plays out. + */ public final WorldInstructions world; + + /** + * Additional tools for debugging ponder and bypassing the facade + */ public final DebugInstructions debug; + + /** + * Special effects to embellish and communicate with + */ public final EffectInstructions effects; + /** + * Random other instructions that might come in handy + */ + public final SpecialInstructions special; + private final PonderScene scene; public SceneBuilder(PonderScene ponderScene) { @@ -59,33 +90,85 @@ public class SceneBuilder { // General + /** + * Assign the standard english translation for this scene's title using this + * method, anywhere inside the program function. + * + * @param title + */ public void title(String title) { PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, "title", title); } + /** + * Communicates to the ponder UI which parts of the schematic make up the base + * horizontally. Use of this is encouraged whenever there are components outside + * the the base plate.
+ * As a result, showBasePlate() will only show the configured size, and the + * scene's scaling inside the UI will be consistent with its base size. + * + * @param xOffset Block spaces between the base plate and the schematic + * boundary on the Western side. + * @param zOffset Block spaces between the base plate and the schematic + * boundary on the Northern side. + * @param basePlateSize Length in blocks of the base plate itself. Ponder + * assumes it to be square + */ public void configureBasePlate(int xOffset, int zOffset, int basePlateSize) { scene.offsetX = xOffset; scene.offsetZ = zOffset; scene.size = basePlateSize; } + /** + * Fade the layer of blocks into the scene ponder assumes to be the base plate + * of the schematic's structure. Makes for a nice opener + */ public void showBasePlate() { world.showSection(scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.offsetX, 0, scene.offsetZ), new Vec3i(scene.size, 0, scene.size)), Direction.UP); } + /** + * Before running the upcoming instructions, wait for a duration to let previous + * actions play out.
+ * Idle does not stall any animations, only schedules a time gap between + * instructions. + * + * @param ticks Duration to wait for + */ public void idle(int ticks) { addInstruction(new DelayInstruction(ticks)); } + /** + * Before running the upcoming instructions, wait for a duration to let previous + * actions play out.
+ * Idle does not stall any animations, only schedules a time gap between + * instructions. + * + * @param seconds Duration to wait for + */ public void idleSeconds(int seconds) { idle(seconds * 20); } + /** + * Once the scene reaches this instruction in the timeline, mark it as + * "finished". This happens automatically when the end of a storyboard is + * reached, but can be desirable to do earlier, in order to bypass the wait for + * any residual text windows to time out.
+ * So far this event only affects the "next scene" button in the UI to flash. + */ public void markAsFinished() { addInstruction(new MarkAsFinishedInstruction()); } + /** + * Pans the scene's camera view around the vertical axis by the given amount + * + * @param degrees + */ public void rotateCameraY(float degrees) { addInstruction(new RotateSceneInstruction(0, degrees, true)); } @@ -125,11 +208,11 @@ public class SceneBuilder { public void showControls(InputWindowElement element, int duration) { addInstruction(new ShowInputInstruction(element, duration)); } - + public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AxisAlignedBB boundingBox, int duration) { addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration)); } - + public void showOutline(PonderPalette color, Object slot, Selection selection, int duration) { addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); } @@ -240,6 +323,36 @@ public class SceneBuilder { addInstruction(new ReplaceBlocksInstruction(selection, state, false, spawnParticles)); } + public void modifyEntities(Class entityClass, Consumer entityCallBack) { + addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack)); + } + + public void createEntity(Function factory) { + addInstruction(scene -> scene.getWorld() + .addEntity(factory.apply(scene.getWorld()))); + } + + public void createItemEntity(Vec3d location, Vec3d motion, ItemStack stack) { + createEntity(world -> { + ItemEntity itemEntity = new ItemEntity(world, location.x, location.y, location.z, stack); + itemEntity.setMotion(motion); + return itemEntity; + }); + } + + public void createItemOnBelt(BlockPos beltLocation, Direction insertionSide, ItemStack stack) { + addInstruction(scene -> { + TileEntity tileEntity = scene.getWorld() + .getTileEntity(beltLocation); + if (!(tileEntity instanceof BeltTileEntity)) + return; + BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; + DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); + behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); + }); + flapFunnels(scene.getSceneBuildingUtil().select.position(beltLocation.up()), true); + } + public void setKineticSpeed(Selection selection, float speed) { modifyKineticSpeed(selection, f -> speed); } @@ -272,13 +385,18 @@ public class SceneBuilder { public class DebugInstructions { public void debugSchematic() { - addInstruction(new ShowCompleteSchematicInstruction()); + addInstruction( + scene -> scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere()))); } public void addInstructionInstance(PonderInstruction instruction) { addInstruction(instruction); } + public void enqueueCallback(Consumer callback) { + addInstruction(callback); + } + } private void addInstruction(PonderInstruction instruction) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java index d6a47ae91..a0920675a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -8,12 +8,15 @@ import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; +/** + * Helpful shortcuts for marking boundaries, points or sections inside the scene + */ public class SceneBuildingUtil { public final SelectionUtil select; public final VectorUtil vector; public final PositionUtil grid; - + private final MutableBoundingBox sceneBounds; SceneBuildingUtil(MutableBoundingBox sceneBounds) { @@ -48,11 +51,11 @@ public class SceneBuildingUtil { public Vec3d topOf(int x, int y, int z) { return blockSurface(grid.at(x, y, z), Direction.UP); } - + public Vec3d topOf(BlockPos pos) { return blockSurface(pos, Direction.UP); } - + public Vec3d blockSurface(BlockPos pos, Direction face) { return blockSurface(pos, face, 0); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 353b1caaf..a57e536b0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -19,6 +19,8 @@ import com.simibubi.create.foundation.utility.Pointing; import com.tterrag.registrate.util.entry.ItemEntry; import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.particles.ParticleTypes; @@ -41,6 +43,7 @@ public class DebugScenes { add(DebugScenes::controlsScene); add(DebugScenes::birbScene); add(DebugScenes::sectionsScene); + add(DebugScenes::itemScene); } private static void add(PonderStoryBoard sb) { @@ -116,7 +119,7 @@ public class DebugScenes { scene.idle(12); scene.special.movePointOfInterest(util.grid.at(-4, 5, 4)); - scene.overlay.showTargetedText(PonderPalette.RED, parrotPos.add(-.25f, 0.25f, .25f), "wut", "dafuq?", 40); + scene.overlay.showTargetedText(PonderPalette.RED, parrotPos.add(-.25f, 0.25f, .25f), "wut", "wut?", 40); } @@ -201,7 +204,7 @@ public class DebugScenes { AxisAlignedBB point = new AxisAlignedBB(chassisSurface, chassisSurface); AxisAlignedBB expanded = point.grow(1 / 4f, 1 / 4f, 1 / 16f); - + Selection singleBlock = util.select.position(1, 2, 3); Selection twoBlocks = util.select.fromTo(1, 2, 3, 1, 3, 3); Selection threeBlocks = util.select.fromTo(1, 2, 3, 1, 4, 3); @@ -233,7 +236,7 @@ public class DebugScenes { scene.overlay.showControls(new InputWindowElement(chassisSurface, Pointing.UP).whileCTRL() .scroll() .withWrench(), 40); - + scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10); scene.idle(10); scene.overlay.showOutline(white, chassisEffectHighlight, twoRows, 10); @@ -244,7 +247,7 @@ public class DebugScenes { scene.idle(10); scene.overlay.showOutline(white, chassisEffectHighlight, singleRow, 10); scene.idle(10); - + scene.markAsFinished(); } @@ -347,4 +350,41 @@ public class DebugScenes { } + public static void itemScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.configureBasePlate(0, 0, 6); + scene.title("Manipulating Items"); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + + ItemStack brassItem = AllItems.BRASS_INGOT.asStack(); + ItemStack copperItem = AllItems.COPPER_INGOT.asStack(); + + for (int z = 4; z >= 2; z--) { + scene.world.createItemEntity(util.vector.centerOf(0, 4, z), Vec3d.ZERO, brassItem.copy()); + scene.idle(10); + } + + BlockPos beltPos = util.grid.at(2, 1, 3); + scene.world.createItemOnBelt(beltPos, Direction.EAST, copperItem.copy()); + + scene.idle(35); + + scene.world.modifyEntities(ItemEntity.class, entity -> { + if (copperItem.isItemEqual(entity.getItem())) + entity.setNoGravity(true); + }); + + scene.idle(20); + + scene.world.modifyEntities(ItemEntity.class, entity -> { + if (brassItem.isItemEqual(entity.getItem())) + entity.setMotion(util.vector.at(-.15f, .5f, 0)); + }); + + scene.idle(27); + + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + } + } 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 f5c46f990..a7af34338 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 @@ -4,11 +4,13 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.ponder.PonderRegistry; public class PonderIndex { - + public static final boolean EDITOR_MODE = true; public static void register() { - // Register storyboards here (Changes require re-launch) + // Register storyboards here + // (!) Added entries require re-launch + // (!) Modifications inside storyboard methods only require re-opening the ui PonderRegistry.forComponent(AllBlocks.SHAFT) .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java deleted file mode 100644 index 6ed5b5a6e..000000000 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ShowCompleteSchematicInstruction.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.simibubi.create.foundation.ponder.instructions; - -import com.simibubi.create.foundation.ponder.PonderInstruction; -import com.simibubi.create.foundation.ponder.PonderScene; -import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; - -public class ShowCompleteSchematicInstruction extends PonderInstruction { - - @Override - public void tick(PonderScene scene) { - scene.addElement(new WorldSectionElement(scene.getSceneBuildingUtil().select.everywhere())); - } - - @Override - public boolean isComplete() { - return true; - } - -} diff --git a/src/main/resources/ponder/debug/scene_9.nbt b/src/main/resources/ponder/debug/scene_9.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e981d81ed96b66d9e8535dccc30097669e9ac155 GIT binary patch literal 1004 zcmVbrh-$x$LiUIl%nCvYw04V=@ z)g1OALTNLbp@DMrA-u>{a%p1v@IxP1p-jDKIT&zbg~e*cx{cRj<27u22OQ>r6FA^- z2b_9%8*IE5o2D<{0f#x@1P(ad0jD0mgI>OaUYl^315V(8!yRyzk~-+c9Q4|R!yIq| z2OREzQ^&o@rXGQVrh$W|n{b!|PT+vU9dPQw9W><*nr^~j4mg1W4sXSYfyoQYfu9wK z>CuOB-NO_5*W7&Zsz}Mwi=lUdcBb?thiE7Ykz{uM%ZCy;IHN*MKnDT%$0?=s9=z92 zIfQ3cqcJ~`5k%l;DSVq~B(Ou1O^Y1QFEfcYOJcHAS303$@BKlx1DgM&`6<&x4j6%M`B{na4vVtyX!Cx^m7d=Z8z@5rjiwGC79e4ME4|1P!O!t@SNT})jKUoq zil+1Lx=OvJO5c*2eW~)X&Q$M9O6_(pN81!Fi5RXn$v(FN9nmGfkRrmcBsqV4Ud z@Bid|@T5cE@3as8x4ysLMC(6)_sOPLh#alO@=e=8M68G@!Z$0)j8wDpo0oA=KYg-# zI-6t`&l4pnMuH>_PPHmfmv8bS7|h6z&eeE~De#fV4HAa9&J1|hOSrn8 Date: Wed, 24 Feb 2021 17:48:45 +0100 Subject: [PATCH 11/23] Desperate Control - Belt items and item entities now support element links (albeit in a slightly limited fashion) --- .../relays/belt/transport/BeltInventory.java | 2 +- .../create/foundation/ponder/ElementLink.java | 4 ++ .../foundation/ponder/SceneBuilder.java | 60 +++++++++++++++---- .../ponder/content/DebugScenes.java | 13 +++- .../ponder/elements/BeltItemElement.java | 11 ++++ .../ponder/elements/EntityElement.java | 16 +++++ .../ponder/elements/TrackedElement.java | 42 +++++++++++++ .../FadeIntoSceneInstruction.java | 4 +- 8 files changed, 134 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/BeltItemElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/EntityElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 97ab06030..6ae301df1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -107,7 +107,7 @@ public class BeltInventory { movement *= ServerSpeedProvider.get(); // Don't move if held by processing (client) - if (onClient && currentItem.locked) + if (world.isRemote && currentItem.locked) continue; // Don't move if other items are waiting in front diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java index 02e4eb7a7..cc336981c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ElementLink.java @@ -7,6 +7,10 @@ public class ElementLink { private Class elementClass; private UUID id; + public ElementLink(Class elementClass) { + this(elementClass, UUID.randomUUID()); + } + public ElementLink(Class elementClass, UUID id) { this.elementClass = elementClass; this.id = id; 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 cc2d8e782..48ad11306 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -10,6 +10,8 @@ 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.BeltItemElement; +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.WorldSectionElement; @@ -30,6 +32,8 @@ import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction; import com.simibubi.create.foundation.ponder.instructions.TextInstruction; import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -265,8 +269,7 @@ public class SceneBuilder { public void hideSection(Selection selection, Direction fadeOutDirection) { WorldSectionElement worldSectionElement = new WorldSectionElement(selection); - ElementLink elementLink = - new ElementLink<>(WorldSectionElement.class, UUID.randomUUID()); + ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); addInstruction(scene -> { scene.getBaseWorldSection() @@ -285,8 +288,7 @@ public class SceneBuilder { public ElementLink makeSectionIndependent(Selection selection) { WorldSectionElement worldSectionElement = new WorldSectionElement(selection); - ElementLink elementLink = - new ElementLink<>(WorldSectionElement.class, UUID.randomUUID()); + ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); addInstruction(scene -> { scene.getBaseWorldSection() @@ -327,30 +329,64 @@ public class SceneBuilder { addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack)); } - public void createEntity(Function factory) { - addInstruction(scene -> scene.getWorld() - .addEntity(factory.apply(scene.getWorld()))); + public ElementLink createEntity(Function factory) { + ElementLink link = new ElementLink<>(EntityElement.class, UUID.randomUUID()); + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + Entity entity = factory.apply(world); + EntityElement handle = new EntityElement(entity); + scene.addElement(handle); + scene.linkElement(handle, link); + world.addEntity(entity); + }); + return link; } - public void createItemEntity(Vec3d location, Vec3d motion, ItemStack stack) { - createEntity(world -> { + public ElementLink createItemEntity(Vec3d location, Vec3d motion, ItemStack stack) { + return createEntity(world -> { ItemEntity itemEntity = new ItemEntity(world, location.x, location.y, location.z, stack); itemEntity.setMotion(motion); return itemEntity; }); } - public void createItemOnBelt(BlockPos beltLocation, Direction insertionSide, ItemStack stack) { + public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, + ItemStack stack) { + ElementLink link = new ElementLink<>(BeltItemElement.class); addInstruction(scene -> { - TileEntity tileEntity = scene.getWorld() - .getTileEntity(beltLocation); + PonderWorld world = scene.getWorld(); + TileEntity tileEntity = world.getTileEntity(beltLocation); if (!(tileEntity instanceof BeltTileEntity)) return; + BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); + + BeltTileEntity controllerTE = beltTileEntity.getControllerTE(); + if (controllerTE != null) + controllerTE.tick(); + + TransportedItemStackHandlerBehaviour transporter = + beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); + transporter.handleProcessingOnAllItems(tis -> { + BeltItemElement tracker = new BeltItemElement(tis); + scene.addElement(tracker); + scene.linkElement(tracker, link); + return TransportedResult.doNothing(); + }); + }); flapFunnels(scene.getSceneBuildingUtil().select.position(beltLocation.up()), true); + return link; + } + + public void stallBeltItem(ElementLink link, boolean stalled) { + addInstruction(scene -> { + BeltItemElement resolve = scene.resolve(link); + if (resolve != null) + resolve.ifPresent(tis -> tis.locked = stalled); + }); } public void setKineticSpeed(Selection selection, float speed) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index a57e536b0..163682fbc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -12,6 +12,7 @@ import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBo 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.BeltItemElement; 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; @@ -366,9 +367,17 @@ public class DebugScenes { } BlockPos beltPos = util.grid.at(2, 1, 3); - scene.world.createItemOnBelt(beltPos, Direction.EAST, copperItem.copy()); + ElementLink itemOnBelt = + scene.world.createItemOnBelt(beltPos, Direction.EAST, copperItem.copy()); - scene.idle(35); + scene.idle(10); + scene.world.stallBeltItem(itemOnBelt, true); + scene.idle(5); + scene.overlay.showTargetedText(PonderPalette.FAST, util.vector.topOf(2, 1, 2), "stalling", + "Belt Items can only be force-stalled on the belt they were created on.", 40); + scene.idle(45); + scene.world.stallBeltItem(itemOnBelt, false); + scene.idle(20); scene.world.modifyEntities(ItemEntity.class, entity -> { if (copperItem.isItemEqual(entity.getItem())) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/BeltItemElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/BeltItemElement.java new file mode 100644 index 000000000..4935b3da4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/BeltItemElement.java @@ -0,0 +1,11 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; + +public class BeltItemElement extends TrackedElement { + + public BeltItemElement(TransportedItemStack wrapped) { + super(wrapped); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/EntityElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/EntityElement.java new file mode 100644 index 000000000..556d300a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/EntityElement.java @@ -0,0 +1,16 @@ +package com.simibubi.create.foundation.ponder.elements; + +import net.minecraft.entity.Entity; + +public class EntityElement extends TrackedElement { + + public EntityElement(Entity wrapped) { + super(wrapped); + } + + @Override + protected boolean isStillValid(Entity element) { + return element.isAlive(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java new file mode 100644 index 000000000..4c4bc96fb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java @@ -0,0 +1,42 @@ +package com.simibubi.create.foundation.ponder.elements; + +import java.lang.ref.WeakReference; +import java.util.function.Consumer; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderWorld; + +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.RenderType; + +public abstract class TrackedElement extends PonderSceneElement { + + private WeakReference reference; + + public TrackedElement(T wrapped) { + this.reference = new WeakReference<>(wrapped); + } + + public void ifPresent(Consumer func) { + if (reference == null) + return; + T resolved = reference.get(); + if (resolved == null) + return; + func.accept(resolved); + } + + protected boolean isStillValid(T element) { + return true; + } + + @Override + public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {} + + @Override + public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) {} + + @Override + public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {} + +} 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 04af5ceaf..a45b1d967 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 @@ -1,7 +1,5 @@ package com.simibubi.create.foundation.ponder.instructions; -import java.util.UUID; - import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; @@ -41,7 +39,7 @@ public abstract class FadeIntoSceneInstruction e } public ElementLink createLink(PonderScene scene) { - elementLink = new ElementLink<>(getElementClass(), UUID.randomUUID()); + elementLink = new ElementLink<>(getElementClass()); scene.linkElement(element, elementLink); return elementLink; } From 692c6deaafffe218fcf376b2e164ecc01fb3bc35 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 26 Feb 2021 19:46:56 +0100 Subject: [PATCH 12/23] More pondering - First couple of funnel scenes - More utility methods - Scene progress bar - An inspect mode that does nothing --- src/generated/resources/.cache/cache | 26 +- .../resources/assets/create/lang/en_us.json | 15 ++ .../assets/create/lang/unfinished/de_de.json | 16 +- .../assets/create/lang/unfinished/es_es.json | 16 +- .../assets/create/lang/unfinished/es_mx.json | 16 +- .../assets/create/lang/unfinished/fr_fr.json | 16 +- .../assets/create/lang/unfinished/it_it.json | 16 +- .../assets/create/lang/unfinished/ja_jp.json | 16 +- .../assets/create/lang/unfinished/ko_kr.json | 16 +- .../assets/create/lang/unfinished/nl_nl.json | 16 +- .../assets/create/lang/unfinished/pt_br.json | 16 +- .../assets/create/lang/unfinished/ru_ru.json | 16 +- .../assets/create/lang/unfinished/zh_cn.json | 16 +- .../assets/create/lang/unfinished/zh_tw.json | 16 +- .../create/foundation/gui/AllIcons.java | 4 +- .../foundation/ponder/PonderInstruction.java | 2 + .../foundation/ponder/PonderRegistry.java | 20 +- .../create/foundation/ponder/PonderScene.java | 55 ++-- .../create/foundation/ponder/PonderUI.java | 104 +++++++- .../foundation/ponder/SceneBuilder.java | 108 +++++++- .../foundation/ponder/SceneBuildingUtil.java | 2 +- .../ponder/content/DebugScenes.java | 14 +- .../ponder/content/FunnelScenes.java | 234 ++++++++++++++++++ .../ponder/content/KineticsScenes.java | 4 +- .../ponder/content/PonderIndex.java | 10 +- .../ponder/elements/InputWindowElement.java | 10 +- .../ponder/elements/TextWindowElement.java | 12 +- .../ponder/elements/WorldSectionElement.java | 12 + .../ReplaceBlocksInstruction.java | 8 +- .../ponder/instructions/TextInstruction.java | 4 +- .../instructions/TickingInstruction.java | 7 + .../behaviour/filtering/FilteringHandler.java | 2 + .../assets/create/textures/gui/icons.png | Bin 2719 -> 2858 bytes .../resources/ponder/funnels/direction.nbt | Bin 0 -> 920 bytes src/main/resources/ponder/funnels/intro.nbt | Bin 0 -> 922 bytes .../resources/ponder/funnels/mounting.nbt | Bin 0 -> 474 bytes 36 files changed, 757 insertions(+), 88 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java create mode 100644 src/main/resources/ponder/funnels/direction.nbt create mode 100644 src/main/resources/ponder/funnels/intro.nbt create mode 100644 src/main/resources/ponder/funnels/mounting.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 00a1f5066..887d155c4 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -69eecffe64535bdf97970f09d3fd18ffa1dae05b assets/create/lang/en_us.json -b61608001cf56be4b8dc32bec82a763610b558fc assets/create/lang/unfinished/de_de.json -03756500794e32ff51549269a33b824acaeb74e4 assets/create/lang/unfinished/es_es.json -eebffed3ac6127426f8702ee0303cf9669741476 assets/create/lang/unfinished/es_mx.json -600126988d661c32b917643fb57c57848f58373f assets/create/lang/unfinished/fr_fr.json -fadd7a77044e77183ca72484ec8fa6ddf14312bf assets/create/lang/unfinished/it_it.json -51f49b662a8acc436ab98d1fa6287b97be2e5acc assets/create/lang/unfinished/ja_jp.json -a92852c60438845b5672c0f2049cc059140644b6 assets/create/lang/unfinished/ko_kr.json -daafb42a5c92310dcb9aa223e5e9683be1fa4487 assets/create/lang/unfinished/nl_nl.json -be51f53337c9f91d722ffc592070e01115cd575c assets/create/lang/unfinished/pt_br.json -464e5a32896c5b6a3c201d1979c98654c672ad89 assets/create/lang/unfinished/ru_ru.json -7e12449d2bacf443f8f97ba42bfd82b00a69129c assets/create/lang/unfinished/zh_cn.json -cf33f05e397956a60cc386e4244cf96a57b9c152 assets/create/lang/unfinished/zh_tw.json +187d765fed859da0aa91e67d35b18589882ae179 assets/create/lang/en_us.json +d9dc6a731465072a69754252c9097bfc83f2e0b8 assets/create/lang/unfinished/de_de.json +ae5554d2809e669e80f455abd0e67a764fff31da assets/create/lang/unfinished/es_es.json +e17b3b528004939b86009e3f88679555f33fbc90 assets/create/lang/unfinished/es_mx.json +4f385f92b948be135e268bf7f6f71e346266128d assets/create/lang/unfinished/fr_fr.json +1662dcbf578c71c8f2c92dff276766d1b80eae8c assets/create/lang/unfinished/it_it.json +53e51f744fd205abfd6cb69ba213d0ba867b1e95 assets/create/lang/unfinished/ja_jp.json +75cf95c526518a104c7a1289a4ce529d2d8ffde1 assets/create/lang/unfinished/ko_kr.json +e76bf18f466986aadd4b53991267305755ce299c assets/create/lang/unfinished/nl_nl.json +06370d657c5967e43df0f4925b3c5b06844a9172 assets/create/lang/unfinished/pt_br.json +586f3041725e75e02d440f233c12df3be879cecf assets/create/lang/unfinished/ru_ru.json +bbb874798f5125d4870e31bf6636f8e9b40a40b0 assets/create/lang/unfinished/zh_cn.json +e3aeeeaccee348630734c63fcbc3e3bea0af6663 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 9764be514..c95acc466 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1807,6 +1807,13 @@ "create.ponder.pondering": "Pondering about...", "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "Andesite or Brass Casing can be used to encase them.", @@ -1834,7 +1841,15 @@ "create.ponder.brass_hand.scene_7.independent": "This Section renders independently.", "create.ponder.brass_hand.scene_7.merged": "This Section got merged to base.", "create.ponder.brass_hand.scene_7.title": "Sections", + "create.ponder.brass_hand.scene_8.stalling": "Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility", "_": "Thank you for translating Create!" 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 43e84ee08..09c4d73bb 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: 1003", + "_": "Missing Localizations: 1017", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 a03dbe654..dd5db5758 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: 45", + "_": "Missing Localizations: 59", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 a7d6d9546..d8fe9bdc7 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: 933", + "_": "Missing Localizations: 947", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 687cfad34..a6065aa98 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: 715", + "_": "Missing Localizations: 729", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 0c803dad6..4118fc830 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: 50", + "_": "Missing Localizations: 64", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 234cd9e64..5ecc3c2d7 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: 57", + "_": "Missing Localizations: 71", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 c7c0fb134..fe8092627 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: 104", + "_": "Missing Localizations: 118", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 356848779..f2efff87e 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: 1202", + "_": "Missing Localizations: 1216", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 cb2a4fd96..915c5f059 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: 1268", + "_": "Missing Localizations: 1282", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 1825f983a..f804d2544 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: 54", + "_": "Missing Localizations: 68", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 13d306dd7..75275ef6d 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: 52", + "_": "Missing Localizations: 66", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 701d142ac..3b9c69967 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: 57", + "_": "Missing Localizations: 71", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,6 +1808,13 @@ "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", @@ -1837,6 +1844,13 @@ "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", + "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index faa7d9af7..7d85393c7 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -122,7 +122,9 @@ public class AllIcons { I_MTD_LEFT = newRow(), I_MTD_CLOSE = next(), - I_MTD_RIGHT = next(); + I_MTD_RIGHT = next(), + I_MTD_SCAN = next(), + I_MTD_REPLAY = next(); public AllIcons(int x, int y) { iconX = x * 16; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java index 36eb4ce40..1cee38f86 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderInstruction.java @@ -12,6 +12,8 @@ public abstract class PonderInstruction { public abstract boolean isComplete(); + public void onScheduled(PonderScene scene) {} + public abstract void tick(PonderScene scene); public static PonderInstruction simple(Consumer callback) { 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 ab705012b..39a69fa25 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -35,9 +35,9 @@ public class PonderRegistry { all.computeIfAbsent(id, $ -> new ArrayList<>()) .add(new PonderStoryBoardEntry(storyBoard, schematic)); } - - public static MultiSceneBuilder forComponent(ItemProviderEntry component) { - return new MultiSceneBuilder(component); + + public static MultiSceneBuilder forComponents(ItemProviderEntry component, ItemProviderEntry... additional) { + return new MultiSceneBuilder(component, additional); } public static List compile(ResourceLocation id) { @@ -50,7 +50,7 @@ public class PonderRegistry { List list = all.get(id); List scenes = new ArrayList<>(); - + for (int i = 0; i < list.size(); i++) { PonderStoryBoardEntry sb = list.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); @@ -99,20 +99,24 @@ public class PonderRegistry { }); return PonderLocalization.record(); } - + public static class MultiSceneBuilder { private ItemProviderEntry component; + private ItemProviderEntry[] additional; - MultiSceneBuilder(ItemProviderEntry component) { + MultiSceneBuilder(ItemProviderEntry component, ItemProviderEntry[] additional) { this.component = component; + this.additional = additional; } - + public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) { PonderRegistry.addStoryBoard(component, schematicPath, storyBoard); + for (ItemProviderEntry itemProviderEntry : additional) + PonderRegistry.addStoryBoard(itemProviderEntry, schematicPath, storyBoard); return this; } - + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index fc3486513..6c0b98bd6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -18,6 +18,7 @@ import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; @@ -30,6 +31,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; import net.minecraft.entity.Entity; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; @@ -38,11 +40,11 @@ public class PonderScene { boolean finished; int sceneIndex; - + List schedule, activeSchedule; Map linkedElements; Set elements; - + PonderWorld world; ResourceLocation component; SceneTransform transform; @@ -58,6 +60,9 @@ public class PonderScene { int offsetZ; int size; + int totalTime; + int currentTime; + public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { pointOfInterest = Vec3d.ZERO; @@ -88,30 +93,40 @@ public class PonderScene { } public void reset() { + currentTime = 0; activeSchedule.clear(); schedule.forEach(mdi -> mdi.reset(this)); } public void begin() { reset(); + forEach(pe -> pe.reset(this)); + world.restore(); + elements.clear(); + linkedElements.clear(); + transform = new SceneTransform(); finished = false; setPointOfInterest(new Vec3d(0, 4, 0)); - forEach(pe -> pe.reset(this)); - elements.clear(); - linkedElements.clear(); - activeSchedule.addAll(schedule); - + baseWorldSection.setEmpty(); baseWorldSection.forceApplyFade(1); elements.add(baseWorldSection); + + totalTime = 0; + activeSchedule.addAll(schedule); + activeSchedule.forEach(i -> i.onScheduled(this)); } public WorldSectionElement getBaseWorldSection() { return baseWorldSection; } + public float getSceneProgress() { + return totalTime == 0 ? 0 : currentTime / (float) totalTime; + } + public void fadeOut() { reset(); activeSchedule.add(new HideAllInstruction(10, null)); @@ -158,6 +173,9 @@ public class PonderScene { transform.tick(); forEach(e -> e.tick(this)); + if (currentTime < totalTime) + currentTime++; + for (Iterator iterator = activeSchedule.iterator(); iterator.hasNext();) { PonderInstruction instruction = iterator.next(); instruction.tick(this); @@ -173,6 +191,10 @@ public class PonderScene { finished = true; } + public void addToSceneTime(int time) { + totalTime += time; + } + public void addElement(PonderElement e) { elements.add(e); } @@ -205,7 +227,7 @@ public class PonderScene { for (PonderElement elemtent : elements) function.accept(elemtent); } - + public void forEachWorldEntity(Class type, Consumer function) { for (Entity element : world.getEntities()) if (type.isInstance(element)) @@ -289,19 +311,18 @@ public class PonderScene { .rotateX(xRotation.getValue(pt)) .rotateY(yRotation.getValue(pt)); ms.scale(30, -30, 30); - ms.translate((size + offsetX) / -2f, -.5f, (size + offsetZ) / -2f); + ms.translate((size + offsetX) / -2f, -1f, (size + offsetZ) / -2f); return ms; } - public Vec3d screenToScene(float x, float y) { - refreshMatrix(); - Vector4f vec = new Vector4f(x, y, 0, 1); - cachedMat.invert(); - vec.transform(cachedMat); - cachedMat.invert(); - MutableBoundingBox bounds = getBounds(); - return new Vec3d(vec.getX() + bounds.getXSize() / -2f, vec.getY(), vec.getZ() + bounds.getZSize() / -2f); + public Vec3d screenToScene(float x, float y, int depth) { + float pt = AnimationTickHolder.getPartialTicks(); + Vec3d vec = new Vec3d(x, y, depth); + + // wut + + return vec; } public Vec2f sceneToScreen(Vec3d vec) { 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 4f5290764..6856871ce 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -13,6 +13,7 @@ import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; @@ -23,6 +24,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MutableBoundingBox; @@ -34,17 +36,21 @@ public class PonderUI extends AbstractSimiScreen { public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; private List scenes; private LerpedFloat fadeIn; + private LerpedFloat sceneProgress; ItemStack stack; + private boolean identifyMode; private LerpedFloat lazyIndex; private int index = 0; - private PonderButton left, right, icon; + private PonderButton left, right, icon, refresh, scan; public PonderUI(List scenes) { this.scenes = scenes; lazyIndex = LerpedFloat.linear() .startWithValue(index); + sceneProgress = LerpedFloat.linear() + .startWithValue(0); fadeIn = LerpedFloat.linear() .startWithValue(0) .chase(1, .1f, Chaser.EXP); @@ -66,29 +72,46 @@ public class PonderUI extends AbstractSimiScreen { }).showing(stack) .fade(0, -1)); - int spacing = 8; - int bX = (width - 20) / 2 - (20 + spacing); GameSettings bindings = minecraft.gameSettings; + int spacing = 8; + int bX = (width - 20) / 2 - (70 + 2 * spacing); + + widgets.add(scan = new PonderButton(bX, bY, () -> identifyMode = !identifyMode).showing(AllIcons.I_MTD_SCAN) + .shortcut(bindings.keyBindDrop) + .fade(0, -1)); + + bX += 50 + spacing; widgets.add(left = new PonderButton(bX, bY, () -> this.scroll(false)).showing(AllIcons.I_MTD_LEFT) .shortcut(bindings.keyBindLeft) .fade(0, -1)); + bX += 20 + spacing; widgets.add(new PonderButton(bX, bY, this::onClose).showing(AllIcons.I_MTD_CLOSE) .shortcut(bindings.keyBindInventory) .fade(0, -1)); + bX += 20 + spacing; widgets.add(right = new PonderButton(bX, bY, () -> this.scroll(true)).showing(AllIcons.I_MTD_RIGHT) .shortcut(bindings.keyBindRight) .fade(0, -1)); + bX += 50 + spacing; + widgets.add(refresh = new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) + .shortcut(bindings.keyBindBack) + .fade(0, -1)); + } @Override public void tick() { + PonderScene activeScene = scenes.get(index); + activeScene.tick(); + sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP); + lazyIndex.tickChaser(); fadeIn.tickChaser(); - scenes.get(index) - .tick(); + sceneProgress.tickChaser(); + float lazyIndexValue = lazyIndex.getValue(); if (Math.abs(lazyIndexValue - index) > 1 / 512f) scenes.get(lazyIndexValue < index ? index - 1 : index + 1) @@ -102,6 +125,11 @@ public class PonderUI extends AbstractSimiScreen { return super.mouseScrolled(mouseX, mouseY, delta); } + protected void replay() { + scenes.get(index) + .begin(); + } + protected boolean scroll(boolean forward) { int prevIndex = index; index = forward ? index + 1 : index - 1; @@ -121,18 +149,18 @@ public class PonderUI extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderVisibleScenes(partialTicks); + renderVisibleScenes(mouseX, mouseY, partialTicks); renderWidgets(mouseX, mouseY, partialTicks); } - protected void renderVisibleScenes(float partialTicks) { - renderScene(index, partialTicks); + protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { + renderScene(mouseX, mouseY, index, partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); if (Math.abs(lazyIndexValue - index) > 1 / 512f) - renderScene(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + renderScene(mouseX, mouseY, lazyIndexValue < index ? index - 1 : index + 1, partialTicks); } - protected void renderScene(int i, float partialTicks) { + protected void renderScene(int mouseX, int mouseY, int i, float partialTicks) { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); @@ -157,18 +185,23 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.pushMatrix(); RenderSystem.multMatrix(ms.peek() .getModel()); + RenderSystem.scaled(-1 / 16d, -1 / 16d, 1 / 16d); RenderSystem.translated(1, -8, -1 / 64f); + // X AXIS RenderSystem.pushMatrix(); + RenderSystem.translated(4, -3, 0); for (int x = 0; x <= bounds.getXSize(); x++) { RenderSystem.translated(-16, 0, 0); font.drawString(x == bounds.getXSize() ? "x" : "" + x, 0, 0, 0xFFFFFFFF); } RenderSystem.popMatrix(); + // Z AXIS RenderSystem.pushMatrix(); RenderSystem.scaled(-1, 1, 1); + RenderSystem.translated(0, -3, -4); RenderSystem.rotatef(-90, 0, 1, 0); RenderSystem.translated(-8, -2, 2 / 64f); for (int z = 0; z <= bounds.getZSize(); z++) { @@ -177,6 +210,23 @@ public class PonderUI extends AbstractSimiScreen { } RenderSystem.popMatrix(); + // DIRECTIONS + RenderSystem.pushMatrix(); + RenderSystem.translated(bounds.getXSize() * -8, 0, bounds.getZSize() * 8); + RenderSystem.rotatef(-90, 0, 1, 0); + for (Direction d : Iterate.horizontalDirections) { + RenderSystem.rotatef(90, 0, 1, 0); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, bounds.getZSize() * 16); + RenderSystem.rotatef(-90, 1, 0, 0); + font.drawString(d.name() + .substring(0, 1), 0, 0, 0x66FFFFFF); + font.drawString("|", 2, 10, 0x44FFFFFF); + font.drawString(".", 2, 14, 0x22FFFFFF); + RenderSystem.popMatrix(); + } + RenderSystem.popMatrix(); + buffer.draw(); RenderSystem.popMatrix(); } @@ -205,6 +255,16 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.popMatrix(); } + if (identifyMode) { + RenderSystem.pushMatrix(); + RenderSystem.translated(mouseX, mouseY, 800); + drawString(font, "?", 6, 2, 0xddffffff); + RenderSystem.popMatrix(); + scan.flash(); + } else { + scan.dim(); + } + { // Scene overlay RenderSystem.pushMatrix(); @@ -228,11 +288,24 @@ public class PonderUI extends AbstractSimiScreen { if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) right.fade(scenes.size() - lazyIndexValue - 1); - if (scenes.get(index).isFinished()) + boolean finished = scenes.get(index) + .isFinished(); + if (finished) right.flash(); else right.dim(); + { + int x = (width / 2) - 110; + int y = right.y + right.getHeight() + 4; + int w = width - 2 * x; + renderBox(x, y, w, 1, false); + RenderSystem.pushMatrix(); + RenderSystem.translated(x - 2, y - 2, 0); + RenderSystem.scaled((w + 4) * sceneProgress.getValue(partialTicks), 1, 1); + GuiUtils.drawGradientRect(200, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd); + RenderSystem.popMatrix(); + } } protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { @@ -290,9 +363,11 @@ public class PonderUI extends AbstractSimiScreen { .getKeyCode(); int dCode = settings.keyBindRight.getKey() .getKeyCode(); + int qCode = settings.keyBindDrop.getKey() + .getKeyCode(); if (code == sCode) { - onClose(); + replay(); return true; } @@ -306,6 +381,11 @@ public class PonderUI extends AbstractSimiScreen { return true; } + if (code == qCode) { + identifyMode = !identifyMode; + return true; + } + return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } 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 48ad11306..f4121cb2b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -5,7 +5,10 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.UnaryOperator; +import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; +import com.simibubi.create.content.contraptions.base.KineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; 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; @@ -34,6 +37,7 @@ import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruct import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; +import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; @@ -43,6 +47,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.particles.RedstoneParticleData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -183,9 +188,55 @@ public class SceneBuilder { addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); } + private void rotationIndicator(BlockPos pos, boolean direction) { + addInstruction(scene -> { + BlockState blockState = scene.world.getBlockState(pos); + TileEntity tileEntity = scene.world.getTileEntity(pos); + + if (!(blockState.getBlock() instanceof KineticBlock)) + return; + if (!(tileEntity instanceof KineticTileEntity)) + return; + + KineticTileEntity kte = (KineticTileEntity) tileEntity; + KineticBlock kb = (KineticBlock) blockState.getBlock(); + Axis rotationAxis = kb.getRotationAxis(blockState); + + float speed = kte.getTheoreticalSpeed(); + int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 + : SpeedLevel.of(speed) + .getColor(); + + Vec3d location = VecHelper.getCenterOf(pos); + RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, speed, + kb.getParticleInitialRadius(), kb.getParticleTargetRadius(), 20, rotationAxis.name() + .charAt(0)); + + for (int i = 0; i < 20; i++) + scene.world.addParticle(particleData, location.x, location.y, location.z, 0, 0, 0); + }); + } + + public void rotationSpeedIndicator(BlockPos pos) { + rotationIndicator(pos, false); + } + + public void rotationDirectionIndicator(BlockPos pos) { + rotationIndicator(pos, true); + } + + public void indicateRedstone(BlockPos pos) { + createRedstoneParticles(pos, 0xFF0000, 10); + } + public void indicateSuccess(BlockPos pos) { - addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), - Emitter.withinBlockSpace(new RedstoneParticleData(.5f, 1, .7f, 1), new Vec3d(0, 0, 0)), 20, 2)); + createRedstoneParticles(pos, 0x80FFaa, 10); + } + + public void createRedstoneParticles(BlockPos pos, int color, int amount) { + Vec3d rgb = ColorHelper.getRGB(color); + addInstruction(new EmitParticlesInstruction(VecHelper.getCenterOf(pos), Emitter.withinBlockSpace( + new RedstoneParticleData((float) rgb.x, (float) rgb.y, (float) rgb.z, 1), Vec3d.ZERO), amount, 2)); } } @@ -195,7 +246,13 @@ public class SceneBuilder { public void showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, int duration) { PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position)); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, false)); + } + + public void showTargetedTextNearScene(PonderPalette color, Vec3d position, String key, String defaultText, + int duration) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, true)); } public void showSelectionWithText(PonderPalette color, Selection selection, String key, String defaultText, @@ -210,7 +267,7 @@ public class SceneBuilder { } public void showControls(InputWindowElement element, int duration) { - addInstruction(new ShowInputInstruction(element, duration)); + addInstruction(new ShowInputInstruction(element.clone(), duration)); } public void chaseBoundingBoxOutline(PonderPalette color, Object slot, AxisAlignedBB boundingBox, int duration) { @@ -314,7 +371,7 @@ public class SceneBuilder { } public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { - addInstruction(new ReplaceBlocksInstruction(selection, state, true, spawnParticles)); + addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); } public void setBlock(BlockPos pos, BlockState state) { @@ -322,13 +379,37 @@ public class SceneBuilder { } public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) { - addInstruction(new ReplaceBlocksInstruction(selection, state, false, spawnParticles)); + modifyBlocks(selection, $ -> state, spawnParticles); + } + + public void modifyBlock(BlockPos pos, UnaryOperator stateFunc, boolean spawnParticles) { + modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), stateFunc, spawnParticles); + } + + public void modifyBlocks(Selection selection, UnaryOperator stateFunc, boolean spawnParticles) { + addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles)); } public void modifyEntities(Class entityClass, Consumer entityCallBack) { addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack)); } + public void modifyEntitiesInside(Class entityClass, Selection area, + Consumer entityCallBack) { + addInstruction(scene -> scene.forEachWorldEntity(entityClass, e -> { + if (area.test(e.getPosition())) + entityCallBack.accept(e); + })); + } + + public void modifyEntity(ElementLink link, Consumer entityCallBack) { + addInstruction(scene -> { + EntityElement resolve = scene.resolve(link); + if (resolve != null) + resolve.ifPresent(entityCallBack::accept); + }); + } + public ElementLink createEntity(Function factory) { ElementLink link = new ElementLink<>(EntityElement.class, UUID.randomUUID()); addInstruction(scene -> { @@ -362,7 +443,7 @@ public class SceneBuilder { BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); - + BeltTileEntity controllerTE = beltTileEntity.getControllerTE(); if (controllerTE != null) controllerTE.tick(); @@ -381,6 +462,19 @@ public class SceneBuilder { return link; } + public void removeItemsFromBelt(BlockPos beltLocation) { + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + TileEntity tileEntity = world.getTileEntity(beltLocation); + if (!(tileEntity instanceof BeltTileEntity)) + return; + BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; + TransportedItemStackHandlerBehaviour transporter = + beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); + transporter.handleProcessingOnAllItems(tis -> TransportedResult.removeItem()); + }); + } + public void stallBeltItem(ElementLink link, boolean stalled) { addInstruction(scene -> { BeltItemElement resolve = scene.resolve(link); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java index a0920675a..58e7ebd0e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -64,7 +64,7 @@ public class SceneBuildingUtil { return centerOf(pos).add(new Vec3d(face.getDirectionVec()).scale(.5f + margin)); } - public Vec3d at(double x, double y, double z) { + public Vec3d of(double x, double y, double z) { return new Vec3d(x, y, z); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 163682fbc..7aaadea6f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -59,7 +59,7 @@ public class DebugScenes { scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - + Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1); Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1); Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4); @@ -153,11 +153,11 @@ public class DebugScenes { scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); scene.idle(10); - Vec3d emitterPos = util.vector.at(2.5, 2.25, 2.5); - Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.at(0, .1, 0)); + Vec3d emitterPos = util.vector.of(2.5, 2.25, 2.5); + Emitter emitter = Emitter.simple(ParticleTypes.LAVA, util.vector.of(0, .1, 0)); Emitter rotation = Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), - util.vector.at(0, .1, 0)); + util.vector.of(0, .1, 0)); scene.overlay.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20); scene.idle(30); @@ -191,7 +191,7 @@ public class DebugScenes { scene.idle(20); - scene.overlay.showControls(new InputWindowElement(util.vector.at(1, 4.5, 3.5), Pointing.LEFT).rightClick() + scene.overlay.showControls(new InputWindowElement(util.vector.of(1, 4.5, 3.5), Pointing.LEFT).rightClick() .withItem(new ItemStack(Blocks.POLISHED_ANDESITE)), 20); scene.world.showSection(util.select.layer(4), Direction.DOWN); @@ -343,7 +343,7 @@ public class DebugScenes { ElementLink helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea); scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60); - scene.world.moveSection(helicopter, util.vector.at(0, 4, 5), 50); + scene.world.moveSection(helicopter, util.vector.of(0, 4, 5), 50); scene.overlay.showText(PonderPalette.BLUE, 30, "blast_off", "Up, up and away.", 30); scene.idle(40); @@ -388,7 +388,7 @@ public class DebugScenes { scene.world.modifyEntities(ItemEntity.class, entity -> { if (brassItem.isItemEqual(entity.getItem())) - entity.setMotion(util.vector.at(-.15f, .5f, 0)); + entity.setMotion(util.vector.of(-.15f, .5f, 0)); }); scene.idle(27); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java new file mode 100644 index 000000000..d477d8100 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -0,0 +1,234 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +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.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.item.ItemStack; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class FunnelScenes { + + public static void intro(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Using funnels"); + scene.configureBasePlate(0, 1, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); + + scene.idle(10); + + Selection verticalFunnel = util.select.fromTo(2, -1, 4, 2, 4, 4) + .add(util.select.fromTo(1, 1, 4, 1, 4, 4)); + Selection beltFunnels = util.select.fromTo(1, 2, 2, 3, 2, 2); + Selection beltFunnelEnv = util.select.fromTo(0, 1, 0, 5, 2, 2) + .substract(beltFunnels); + + scene.world.showSection(beltFunnelEnv, Direction.DOWN); + + scene.idle(20); + scene.world.showSection(beltFunnels, Direction.DOWN); + + BlockPos entryBeltPos = util.grid.at(3, 1, 2); + BlockPos exitBeltPos = util.grid.at(1, 1, 2); + ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); + Selection exitFunnel = util.select.position(exitBeltPos.up()); + + for (int i = 0; i < 8; i++) { + scene.idle(8); + scene.world.removeItemsFromBelt(exitBeltPos); + scene.world.flapFunnels(exitFunnel, false); + if (i == 2) + scene.rotateCameraY(70); + if (i < 6) + scene.world.createItemOnBelt(entryBeltPos, Direction.EAST, itemStack); + } + + scene.rotateCameraY(-70); + scene.idle(10); + + Selection outputFunnel = util.select.position(1, 2, 4); + scene.world.setBlocks(outputFunnel, Blocks.AIR.getDefaultState(), false); + scene.world.setBlocks(util.select.fromTo(2, -1, 4, 2, 0, 4), AllBlocks.ANDESITE_CASING.getDefaultState(), true); + ElementLink independentSection = + scene.world.showIndependentSection(verticalFunnel, Direction.UP); + + Vec3d topItemSpawn = util.vector.centerOf(2, 6, 4); + Vec3d sideItemSpawn = util.vector.centerOf(1, 3, 4) + .add(0.15f, -0.45f, 0); + ElementLink lastItemEntity = null; + + for (int i = 0; i < 4; i++) { + if (lastItemEntity != null) + scene.world.modifyEntity(lastItemEntity, Entity::remove); + if (i < 3) + lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.4, 0), itemStack); + scene.idle(8); + } + + scene.world.moveSection(independentSection, util.vector.of(0, 1, 0), 15); + scene.idle(10); + scene.world.setBlocks(outputFunnel, AllBlocks.ANDESITE_FUNNEL.getDefaultState() + .with(FunnelBlock.FACING, Direction.WEST) + .with(FunnelBlock.EXTRACTING, true), false); + + for (int i = 0; i < 3; i++) { + scene.idle(8); + scene.world.flapFunnels(outputFunnel, false); + scene.world.createItemEntity(sideItemSpawn, util.vector.of(-.05, 0, 0), itemStack); + } + + scene.idle(8); + scene.overlay.showText(PonderPalette.WHITE, 0, "funnels_transfer", + "Funnels are ideal for transferring items from and to inventories.", 360); + scene.markAsFinished(); + } + + public static void directionality(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Direction of Transfer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); + scene.world.setBlocks(util.select.position(3, 1, 1), AllBlocks.ANDESITE_CASING.getDefaultState(), false); + + BlockPos topFunnel = util.grid.at(3, 3, 2); + Selection topFunnelSelection = util.select.position(topFunnel); + Selection firstShow = util.select.fromTo(3, 1, 2, 3, 2, 2); + scene.idle(5); + + scene.world.showSection(firstShow, Direction.DOWN); + scene.idle(15); + + ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); + Vec3d topCenter = util.vector.centerOf(topFunnel); + Vec3d topSide = util.vector.blockSurface(topFunnel, Direction.EAST); + + InputWindowElement controlsSneak = new InputWindowElement(topCenter, Pointing.DOWN).rightClick() + .whileSneaking(); + + // Placing funnels without sneak + scene.world.showSection(topFunnelSelection, Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "regular_place", + "Placed normally, it pull items from the inventory.", 80); + scene.idle(45); + + ElementLink itemLink = + scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); + scene.idle(40); + + scene.world.modifyEntity(itemLink, Entity::remove); + scene.world.hideSection(topFunnelSelection, Direction.UP); + scene.idle(20); + + // Placing funnels with sneak + scene.world.modifyBlock(topFunnel, s -> s.with(FunnelBlock.EXTRACTING, false), false); + scene.idle(5); + + scene.world.showSection(topFunnelSelection, Direction.DOWN); + scene.overlay.showControls(controlsSneak, 35); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "sneak_place", + "Placed while sneaking, it will put items into the inventory.", 80); + scene.idle(45); + + itemLink = scene.world.createItemEntity(topCenter.add(0, 3, 0), util.vector.of(0, -0.2, 0), itemStack); + scene.idle(10); + + scene.world.modifyEntity(itemLink, Entity::remove); + scene.idle(45); + + // Wrench interaction + InputWindowElement wrenchControls = new InputWindowElement(topSide, Pointing.RIGHT).rightClick() + .withWrench(); + scene.overlay.showControls(wrenchControls, 40); + scene.idle(10); + scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); + scene.idle(10); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "wrench_reverse", + "Using a wrench, the funnel can be flipped after placement.", 80); + + itemLink = scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); + scene.idle(30); + + scene.overlay.showControls(wrenchControls, 40); + scene.idle(10); + scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); + scene.idle(10); + scene.world.modifyEntity(itemLink, Entity::remove); + + scene.idle(20); + + // Side funnel + BlockPos sideFunnel = util.grid.at(3, 2, 1); + Selection sideFunnelSelection = util.select.fromTo(sideFunnel.down(), sideFunnel); + Vec3d sideCenter = util.vector.centerOf(sideFunnel); + + scene.world.modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false); + scene.world.showSection(sideFunnelSelection, Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, sideCenter, "same_for_other", + "Same rules will apply for most orientations.", 70); + + scene.idle(20); + + scene.world.flapFunnels(sideFunnelSelection, true); + itemLink = scene.world.createItemEntity(sideCenter.subtract(0, .45, 0), util.vector.of(0, 0, -0.1), itemStack); + scene.idle(60); + scene.world.hideSection(sideFunnelSelection, Direction.UP); + scene.world.hideSection(topFunnelSelection, Direction.UP); + scene.world.modifyEntity(itemLink, Entity::remove); + scene.idle(20); + + // Belt funnel + Selection beltFunnelSetup = util.select.fromTo(0, 1, 0, 2, 2, 5); + Selection gearshiftAndLever = util.select.fromTo(1, 1, 4, 1, 2, 4); + Selection gearshiftedKinetics = util.select.fromTo(1, 1, 2, 2, 1, 4); + Vec3d topOfBeltFunnel = util.vector.topOf(2, 2, 2); + BlockPos beltPos = util.grid.at(2, 1, 2); + BlockPos cogPos = util.grid.at(1, 1, 3); + + scene.world.showSection(beltFunnelSetup, Direction.DOWN); + scene.overlay.showTargetedText(PonderPalette.WHITE, topOfBeltFunnel, "belt_funnel", + "Funnels on belts will extract/insert depending on its movement direction.", 140); + scene.idle(15); + + for (int i = 0; i < 2; i++) { + scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack); + scene.effects.rotationDirectionIndicator(cogPos); + scene.idle(50); + + scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); + scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f); + scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); + scene.effects.rotationDirectionIndicator(cogPos); + scene.idle(35); + + scene.world.removeItemsFromBelt(beltPos); + scene.world.flapFunnels(beltFunnelSetup, false); + + if (i == 0) { + scene.idle(50); + scene.world.modifyBlocks(gearshiftAndLever, s -> s.cycle(BlockStateProperties.POWERED), false); + scene.world.modifyKineticSpeed(gearshiftedKinetics, f -> -f); + scene.effects.indicateRedstone(util.grid.at(1, 2, 4)); + } + } + } + + public static void mounting(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Funnel compatibility"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + } + +} 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 7917de013..d186e6a4e 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 @@ -52,7 +52,7 @@ public class KineticsScenes { scene.world.setKineticSpeed(gauge, 64); scene.effects.indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showTargetedText(WHITE, util.vector.at(3, 1.5, 2.5), "shaft_relay", + scene.overlay.showTargetedText(WHITE, util.vector.of(3, 1.5, 2.5), "shaft_relay", "Shafts will relay rotation in a straight line.", 1000); scene.idle(20); @@ -92,7 +92,7 @@ public class KineticsScenes { scene.world.setKineticSpeed(shaft, -112); scene.idle(10); - scene.overlay.showTargetedText(WHITE, util.vector.at(1.5, 2, 2.5), "shaft_can_be_encased", + scene.overlay.showTargetedText(WHITE, util.vector.of(1.5, 2, 2.5), "shaft_can_be_encased", "Andesite or Brass Casing can be used to encase them.", 1000); } 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 a7af34338..79a49ba66 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 @@ -12,10 +12,18 @@ public class PonderIndex { // (!) Added entries require re-launch // (!) Modifications inside storyboard methods only require re-opening the ui - PonderRegistry.forComponent(AllBlocks.SHAFT) + PonderRegistry.forComponents(AllBlocks.SHAFT) .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); + PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) + .addStoryBoard("funnels/intro", FunnelScenes::intro) + .addStoryBoard("funnels/direction", FunnelScenes::directionality) + .addStoryBoard("funnels/mounting", FunnelScenes::mounting); + // redstone + // brass vs andesite + // arm compat? + // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) DebugScenes.registerAll(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java index ae9ed8a89..2de36010f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java @@ -20,12 +20,18 @@ import net.minecraft.util.math.Vec3d; public class InputWindowElement extends AnimatedOverlayElement { private Pointing direction; - String key; AllIcons icon; ItemStack item = ItemStack.EMPTY; - private Vec3d sceneSpace; + + public InputWindowElement clone() { + InputWindowElement inputWindowElement = new InputWindowElement(sceneSpace, direction); + inputWindowElement.key = key; + inputWindowElement.icon = icon; + inputWindowElement.item = item.copy(); + return inputWindowElement; + } public InputWindowElement(Vec3d sceneSpace, Pointing direction) { this.sceneSpace = sceneSpace; 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 cab914bf0..b9e03a520 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 @@ -23,6 +23,7 @@ public class TextWindowElement extends AnimatedOverlayElement { int y; Vec3d vec; + boolean nearScene; int color; public TextWindowElement(Supplier textGetter) { @@ -42,6 +43,11 @@ public class TextWindowElement extends AnimatedOverlayElement { this.y = y; return this; } + + public TextWindowElement placeNearTarget() { + this.nearScene = true; + return this; + } @Override protected void render(PonderScene scene, PonderUI screen, MatrixStack ms, float partialTicks, float fade) { @@ -54,7 +60,11 @@ public class TextWindowElement extends AnimatedOverlayElement { float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); - int textWidth = screen.width - targetX; + + if (nearScene) + targetX = (int) Math.min(targetX, sceneToScreen.x + 50); + + int textWidth = Math.min(screen.width - targetX, 180); List list = screen.getFontRenderer() .listFormattedStringToWidth(bakedText, textWidth); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index b46466c6b..0bb0cae53 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -172,6 +172,18 @@ public class WorldSectionElement extends AnimatedSceneElement { light = (int) (MathHelper.lerp(fade, 5, 14)); if (redraw) renderedTileEntities = null; + + //TODO: extract method + float pt = AnimationTickHolder.getPartialTicks(); + MatrixStacker.of(ms) + .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); + if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) + MatrixStacker.of(ms) + .translate(centerOfRotation) + .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) + .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) + .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) + .translateBack(centerOfRotation); world.pushFakeLight(light); renderTileEntities(world, ms, buffer); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java index 0b61a362c..d71ad0919 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/ReplaceBlocksInstruction.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.ponder.instructions; +import java.util.function.UnaryOperator; + import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.ponder.Selection; @@ -9,11 +11,11 @@ import net.minecraft.block.Blocks; public class ReplaceBlocksInstruction extends WorldModifyInstruction { - private BlockState stateToUse; + private UnaryOperator stateToUse; private boolean replaceAir; private boolean spawnParticles; - public ReplaceBlocksInstruction(Selection selection, BlockState stateToUse, boolean replaceAir, + public ReplaceBlocksInstruction(Selection selection, UnaryOperator stateToUse, boolean replaceAir, boolean spawnParticles) { super(selection); this.stateToUse = stateToUse; @@ -33,7 +35,7 @@ public class ReplaceBlocksInstruction extends WorldModifyInstruction { return; if (spawnParticles) world.addBlockDestroyEffects(pos, prevState); - world.setBlockState(pos, stateToUse); + world.setBlockState(pos, stateToUse.apply(prevState)); }); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index 31c3c44a4..484fb6de8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -27,10 +27,12 @@ public class TextInstruction extends FadeInOutInstruction { .colored(color)); } - public TextInstruction(int color, Supplier text, int duration, Vec3d position) { + public TextInstruction(int color, Supplier text, int duration, Vec3d position, boolean near) { this(color, text, duration); element = new TextWindowElement(text).pointAt(position); element.colored(color); + if (near) + element.placeNearTarget(); } public TextInstruction(int color, Supplier text, int duration, int y) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java index aed61a680..93f2b5a03 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TickingInstruction.java @@ -21,6 +21,13 @@ public abstract class TickingInstruction extends PonderInstruction { } protected void firstTick(PonderScene scene) {} + + @Override + public void onScheduled(PonderScene scene) { + super.onScheduled(scene); + if (isBlocking()) + scene.addToSceneTime(totalTicks); + } @Override public void tick(PonderScene scene) { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java index b71159441..621cd3d2a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/filtering/FilteringHandler.java @@ -126,6 +126,8 @@ public class FilteringHandler { return false; if (!filtering.isCountVisible()) return false; + if (!filtering.isActive()) + return false; if (filtering.slotPositioning instanceof ValueBoxTransform.Sided) ((Sided) filtering.slotPositioning).fromSide(result.getFace()); if (!filtering.testHit(objectMouseOver.getHitVec())) diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 3276c6033f25f4f3b11ffed88de3f52b4c42e5f5..000090fafd170660d0268f17bb6fcac13ecb9d57 100644 GIT binary patch literal 2858 zcmdT`i8s{i8~=VyGs7^nAWO20$`+cGU84wPW^7qfh%3u9T$hY4#*oHRG4^bwixym4 zwuBkdZOS&8ELWBxG!h08#&UIj%lZ8azvrCyeBRIdJm)#*eb484pC`cvXMse>AOHYB zT3MRe0RXtW1pz_GE)dF`9e%Q4JBzbGdH122U9!i=6l)3qRmsAe*Py#x&Bofnd>1Ds zCX$kpNF-8kZ|~I9)Yq?HBO@a-Gc&ENt*ff4a5x-=LfH+&#H;UeY!>)S_Ztl=u-E^rwqMubK zKIA}tdcQ{bZPh`mL9s8d*H>Kf`~c611WaQmj<5Fs{1TvY&nc*1JV=}0g%SPzPSO{mv80V{*ItOwd>n9&@5+i8)4k(JfC+S#wUjH<)dd1j_==ZT07K@4fVAgMkd2jhC zzZ)vV8ahqPsyk`+qs|W}gTCfbCYWU+AmqX`7!HLflc0_*jN8RP7gN)ixP!Pk0_f^X zsUu_+1`gCv-)%_ScIa*S7ZXx4b*!>O!ezJIXt%9!s$xU+mki%i0*3*|k9(DG~F7!xQDd(6BNn@`}?>f)1$CbA{vrSjK{6jn_j1o{z+>OfKs`lzZ7p zDS9~}v9DO;iIegI)DKO_QL}{hHK%VVuc1^Ci<^w%WK2MSXg8M=ns_6Va!BVOO*K4c zT*&50r8e*Y1dVTPDSN)Sr7Vej)~*9oX|RFz!0Ta!(UK{VO zuXg)vM6;>Zjbl!$HTy)Er2<#H4_qGja!*Hy38l_wcHf5Im-4t9c^f;_OVw4l`t(DI zaY~A9;|o;@h3sd}D9~-$jfQYJP?(fqJQ4((Jazh+24B&JR%X@JSabJIXd+SLTpK|* zO`985=f6F;sV);|sjJ}rgsl~CiP9$=V?Ljc@PFZ7SnDO>D{7!bXf1A|_Op+>^bt)# zG$!s&sl`TiJlPW~&OF_D_EpSZ<@(&eal$4(bv1b^^2f`$Mt788zec@0K4_Nb#~Q@F zJ87e)Q@eNOZcA$I{n_u{DuqcR23=2iC`|s;QD<#R8aXKsk3qOVvp*H~TcsdwQP@Tw z#ipVBahLE(xxILKzY$3Z70>Zan}kAhlzsJ4->#Q+Pqj?lV}xguc`zxf!e{HOHq`q35TH!uL#sIDgk8UvIKFf482k{?Qt?Yy9@{79NvtE&xiwuf=A$8SmLKbS}#R z^U9*mGJ81?=U~5y%}IAl6Qe(>68Ir#=3$4bIN>Y(t>L#Pk4$C3;@oo-wZ#-az%1wG8;zE1l` z)&huz8D5UIbtKA#@hg#W%>AE~3KLV2DqTOtJ?6<6m7RDvs<5l_j+BG`XL$2EfkSrs zEZZ})Tf|83Zf%dLrAXp$1*j6Ns~X&3ex-gTBN{Z)EiCa6TS)-6^hNzTd)lEU)k=J_j6BGC|3_#@zTp_?7W2uBWc{$#Ncvkh z)8O-l@rYE^iDS~0ST~RUeDD0y81)N7VouWtSVYFcVE@c;G+6H~LvhYbLpE?sMn z`QOzK%I>|nov$*~C&?!>y7XRC8WL(0&Cb>60v}jAiH))lUqXySs$E-@%!QtMi{QFi zhqb}PlHLM&QzQ$bId)0iH$XU@ayV^(XkcN1#`v@tLa4~x>yK5_vYIPyd2S_UUYRY6 zl0;)x3qhfDMd37jX>F^u+mGsizK>HgFWcV^Z-C^*wvgyeykqYrXPYZ>s(F@HH|Bgt zD{jJBbm`5!wB;R#Qrl%^O?&vJ6K3B%e7a8C(3jirmA>ntZFCWAv8hL zqEYM&Z0(WW={>3=#Vr!bkIAyMJ{Gb$cS3|)nyTaP_~cTR85G4A8eUYJWi=ij1+YRR z?pl@u(u^@p^9BV-8?}%+A+$lu9hZ-$3ObFKYe=Qijm{P$`%oya-1nEoq3fjJ;fs~1 z_Zcb@)=LA)^`MOrgQ!PP*&5BePWdZMF!z$=g-=`#{{-i)Egd2ItFAR97dESTQI%-1_axS~b^Yn12k!KIcxTX-vrvm)`iM?&Z=>4#`d z60|ii&QwI|aL_1GEoGj{g!ICFzarpgk<7b3(ih8e!2W6hS!V1jt^(K4qoMUyeM^yq zLQHgj6}dgy211>)i@wNe^q%yEI~)$$xsDms+zI<+8}Ay5yuA>2Zk{e(SyS3=OCkw$ pQA+-!lm9;W|M7viE@yc;>g(cF8!f+S_U=3iSefI@%FlYl`~y7|JaGU3 literal 2719 zcmdT`i8s_;AODSEY%@%j43a5Lie%qq#!lI@?_}&dMHt4CR8nLoAtRN2e=I{v$oil{ z7(!&7kg<+;de8Hm^ZpC(J?Ea!{e15CoO?g_eDA&A2gZgvFcv-*003Zmx|*f{0HO^+ z027!7-ep#1e^{`ojyg~=c;+XK(7US{r~yFr6V@YV1{xPJ);H6l;rH*~larG}LqkVK zMiv(rS5{VVI9x_XhQ7Xjb#=9&p&=fRr-d0AOw3RXlIjU2nS5}%Q`(%?H$az#eC40Baun42PWt&uYf>6K z4f$%EoXVIoqZl}9=59BwLv%M-$|7SJZ-8=AZiY|pbFVam`~oE`xa2S!!XB_kzj;mi z6mZ@I@01J~z3h+({$q!ykMs;LvrjgfD>F)*F%2?MjtZYug6QsS+hjd}x^eCu)G&6dIzuEK8CafEg%}vJP+-O@G-U?)F?n&Kg+r8DbKpj_01|F{;MC#c{s4aD{A6ElrK|P z9!V-0^-t6lQuO9@eUoeCYvEgWr;KhuO~+NN$!vUBX*$(>T8;||4zX&AC?3+>Vf8M; zG&rB06p*AI6iilnlCqo z-xL;HT7cz$nhEz_JxK$F_Q?R%SGwhpQNKoSVX)G8EJ9Lc`57@ZtP$64qBwyD?GHT! z)B+-gdp0>{{76n_hRu~26*f_{R!{S(fyu9EOsivaM5YUVZSYv#y0*%o(knfwK1pC; z8;A1#k*7K;gR0Z`$Wl@VFOH%^)){3rblS9XDL%1v-Hg0Ju@y8DMXRU=7Ug{B^fV1O zBC1?-VcZaf$LKw7?JmGptwIc#Lj=#G7WAzQdU8bb10&-`7*(C#UW-&!Rk_Za3X83) z#7r3)ALdvT30f+v-IpzXV)sC4H>+tzqDatqY-u!(wyHDyJ%sGmd1r9UuF(8_qHp;P zqa{xd%8Jkr}so4k}g1dVYaj^VM|Cn%}gHhTOz>7QCC_9ZWlg9;eN7SG7*F%>@gIFiiHRXx6-}Dx9%+uC+3rrO(N#|<1 z8hT5MT*23+VVEm@jfg5reA6r89vR?Q&_c|lc%;%mZiCs?kk4Pkqir3trJ+`T;Yhi5 z%MZOqGd|s`h&cAeVV!`=fl@EN>%DyBv(s7*J8YBo3tF26(_MtVgHKtY@ao^P4K1&E z2Y{3$k*MFS?Z*BGQ`8co)FX(;GUZWWy_lC5|B)XKOI^-s@)&L*`!^B3aLP2Y*rU3- z2&9*lP#j$t)*A5+JIu91$nv>If<`ke@bp&;Ud}f#_t+X&@ZgS2;&b=HO(8Bhuv6)W zYnsDt(E^5AqS=~iZom5yEKb+IT%FoyBg3aIHs9JRTkmy}7g|kPrG(r%>dJHNkh>da z9hz~wf~De;XS-dtD1vNGoVR)v%m|sv@C00}4drHI#aA{m4;x5Pi!R`z!DvpcmPr>9 zdlRoa0?wYo7VnX`3qkT7RF<|#;*&4xqAsJ3MvcRX*K%sh37uap%+evpOkQ}0fWrzK zwcu|B^gCIt{-cUYsi5YqXS$*s4BTHfNva| z3Y$-`r77d10&VFTRSo_pNMR~BqOjp{ZyZGiRJjRA&T@SelG(xUd{m^!1Oi}Uf>jVt zo==BKHUyc0<->v+pJTM51&uitP zXu2sjttJ)@^!faZ?GUN~cx2di1WIP>v7U;#giRlmNHzjLWl}4iG587DBPp=aU!Eoq zxi1t(@jv}M3~S5%4qa|ZmGQDDF|XES5IUsa2ur{1F@4$}UlN~R$y2-voej-AZ}${5 z*I}aZiw@T_Kz58tV6vR6@Ij=KRMZKu&!R%NazEK{G3@`PxN&a$)Z+CtmW%uA-QR#q zXJ^^+WYdWLhSHdMz4-SctOVZ>@-c!uU+Q=d*2G@|O2q#0s|76(t|8*x>^aro)+aW9 zWa~qE*XasmBB{R!^dXiBb$*r9%R{7Nl)@($i3h~0LcJk%qE_(29q;{4%UML^9A^OZ zhcNA>`sa)2I}cevdl&!4no7M%^l66e4dgjv4vp64d8^_C_J&^oxR|nia*EIy`)Z?( zSPA;-MngfljE0C8o&pI?8G;jQ!oUoq{;f{V-_1 z5iK?UHP8hO)4sw84U5`8Jb2?N>D2L!L|KYP2^fR(Ni%2%hkUf=m^w79q_(|XrTs{B z8Q>=$>{1pt8UG@0Sqy=sW`C3T(R2=blEyNy{F^#c~(Q2^0vhX7}jQu~`**NB*oTIWvG9!>D-R*aD z*9FEvvcQs~>}&^HA}B&wr3UQN5uo~sp+`em0yf(>v(FYu-G`fj*OEk}bX41UtHQ(P uOPBm1X|zPN`tKe5*XaMbkTx`Q0@9&(c{zkpTBa3&fS#72W`(*_?0*2r*ykz$ diff --git a/src/main/resources/ponder/funnels/direction.nbt b/src/main/resources/ponder/funnels/direction.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b9f65898e54b5ac3883386fb4bbc1a084cebdf20 GIT binary patch literal 920 zcmV;J184jniwFP!000000L52PZ`(EyrbJ4X+mJG6TV z80l;ap-F+H<0Mb{Rej$6SBvy$OR*!%Hd8bk0YZ*=_uYMW$2%n@q)V77u7DCk+>UTF z+;NvAAZ=j_FvP7ciBE;f&PPu>T4b6yp$882z+s*^!4{l)g&w&GJ#w)LhkD>JPn@736RzP!J@Q38^0f(vdf+e* zoO&^jTriJZY{H=)III;XB~+eTO7`AsF3kXRUn!BRshl6ie-^@mPDohfWOrOh$TT0= z177HWM13`pHbC^9x!8-bd*L)Ig-in)Iv7l(1kvKNFYa!A^EZ*+&4Czi1c3MIpp)0 z{C4fw-6L8l=^n~+oKQ+%c9E`y@qA7NWcQsiIJeH>tlCwp&t-yb7 zYtwEoxBKpod1g_1f7}#wTo~@&>-2KxAg@3Ofkb++->gM#k;_=J62_7x+ z=>36Bc6wctL+cN1*dd<x-z)G$yp&;{xH8#cWmta@~>XCG$ba93Ah>Kfecc!bC z1s7v&f0T`tKt*Q65vPkeaq)pBn_JXp%`iFmHL>bVQBn&v9JZvSBEak=+KnA!u}H?s zDDh2nI4SRDnOQx#camEjXZ)ftB)D2QS%GD0I32+%%8HXK2rHfQ`y8onz2JK2u2#D{ u3_}D6B9zh_BFKO*rF$t60?ub&n!Q)t^1ncvLgA23K9g^(EbpPK4*&pT%DsyK literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/funnels/intro.nbt b/src/main/resources/ponder/funnels/intro.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8f1f190f5c1d23e07122f249a849beeaef67214a GIT binary patch literal 922 zcmV;L17-XliwFP!000000L_!Jhfe%zwONI|k@MptEyi0APO+ z{Q`UJK^KL|Ookfl>Opjz%j87I^v@qXV1?9`Q?)z>p*GxL=~1`wT5P5FQqY>CX%6x4ln)>cxpqMM{=l44r*6 zbE!^3=niucjZh&I<9o>UvZ zMVs#W+Q6e|v(wbZTU(nD`ft+|)1@YV{%fby8fwMR8;bAr#wpcVkIFSTUA}jEuz4Ug zy@!6s4=Sb1ZrYG_VSA;pS4hjCTT|NjiQ*%(mrPJM+XQ8+>a@6|G1&g7xX>e111a-V z&c(7L(O+3^P%Q&&t^)9k(hUc4CX7e)jiuS!sXejEXtR`IG!p{zmMzuHr~iccu$Fu_ z?yYw4Ox3Qxux;MEI=_YXl-2o_>a~1ckWHuHIU0lZ%WkVn6N66?-mF5;Cz-*cL<)kF zQ)TgTWub+fA1yu)FR$*DnQ$6hdf~sEM|6C#9+M}$O%x9e{1dooB2_>KmSh@E7ik9X{aCL w=_1Zk4Vj6llqi!2oHMuzGA= z{Vi1S=4}bGb72ZPE(v)cO*lrJYqA+lcA*grj%08YgEOscfs@T>E;)k1kqnMvaKu>C zxkg;+OEA0;3@?^AlEG07PBw0_(3fCnjI^!!O0~Yl$Nn95u_S zK-x!=@bZh-HZ&=-t8@Ak^XFuz1yV+ zDRK;`J;p?L&E8sUXZkvLe^!qi>nS1sNVppgsDbt3l)Tjv`G1^M zHq~`j&njweI^7}>rlb3&0QE`l5Z;_p_gh2wP&*spF=$e}Iw^v6{lnq>KfZlER-)}1 z!y#S=V>hwG>a%wp`t<84Vs6)?$2H`QZUYvuYIL1+xpkhl1yuN*ysjxdQ{?w}J;T`a zMTXlxihS!fn}sZjesl<`#fFajzubK~IQM3=<&&=tMeMsjCo%~BIT8uC?=|VK=!0?b QLo0s4ZzppOk=zFW0AU>C*#H0l literal 0 HcmV?d00001 From 43f0ad1c785c3e62af5b4c7a249f1da15274939e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 28 Feb 2021 01:34:56 +0100 Subject: [PATCH 13/23] Freeze and Identify - Ponder scenes can now be paused and analysed, viewing tooltips for targeted blocks in the scene - During editing, identify mode can be used to move targeted positions to the clipboard - Ponder-compatible components can be pondered about in identify mode --- src/generated/resources/.cache/cache | 26 +-- .../resources/assets/create/lang/en_us.json | 10 +- .../assets/create/lang/unfinished/de_de.json | 12 +- .../assets/create/lang/unfinished/es_es.json | 12 +- .../assets/create/lang/unfinished/es_mx.json | 12 +- .../assets/create/lang/unfinished/fr_fr.json | 12 +- .../assets/create/lang/unfinished/it_it.json | 12 +- .../assets/create/lang/unfinished/ja_jp.json | 12 +- .../assets/create/lang/unfinished/ko_kr.json | 12 +- .../assets/create/lang/unfinished/nl_nl.json | 12 +- .../assets/create/lang/unfinished/pt_br.json | 12 +- .../assets/create/lang/unfinished/ru_ru.json | 12 +- .../assets/create/lang/unfinished/zh_cn.json | 12 +- .../assets/create/lang/unfinished/zh_tw.json | 12 +- .../schematics/client/tools/DeployTool.java | 2 +- .../schematics/client/tools/FlipTool.java | 3 +- .../schematics/client/tools/RotateTool.java | 3 +- .../client/tools/SchematicToolBase.java | 2 +- .../simibubi/create/events/ClientEvents.java | 4 +- .../collision/CollisionDebugger.java | 114 -------------- .../foundation/collision/OBBCollider.java | 13 -- .../foundation/ponder/PonderLocalization.java | 2 + .../create/foundation/ponder/PonderScene.java | 107 +++++++++++-- .../ponder/PonderTooltipHandler.java | 50 ++++-- .../create/foundation/ponder/PonderUI.java | 148 ++++++++++++++---- .../create/foundation/ponder/PonderWorld.java | 8 +- .../ponder/PonderWorldParticles.java | 3 +- .../ponder/elements/AnimatedSceneElement.java | 47 +++--- .../ponder/elements/ParrotElement.java | 4 +- .../ponder/elements/PonderSceneElement.java | 6 +- .../ponder/elements/TrackedElement.java | 6 +- .../ponder/elements/WorldSectionElement.java | 141 ++++++++++++----- .../render/TileEntityRenderHelper.java | 18 ++- .../backend/light/LightVolumeDebugger.java | 3 +- .../tileEntity/behaviour/ValueBox.java | 4 +- .../utility/outliner/AABBOutline.java | 2 +- .../utility/outliner/BlockClusterOutline.java | 2 +- .../utility/outliner/ChasingAABBOutline.java | 5 +- .../utility/outliner/LineOutline.java | 6 +- .../foundation/utility/outliner/Outline.java | 2 +- .../foundation/utility/outliner/Outliner.java | 7 +- 41 files changed, 547 insertions(+), 345 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/collision/CollisionDebugger.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 887d155c4..aef7b05d8 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -187d765fed859da0aa91e67d35b18589882ae179 assets/create/lang/en_us.json -d9dc6a731465072a69754252c9097bfc83f2e0b8 assets/create/lang/unfinished/de_de.json -ae5554d2809e669e80f455abd0e67a764fff31da assets/create/lang/unfinished/es_es.json -e17b3b528004939b86009e3f88679555f33fbc90 assets/create/lang/unfinished/es_mx.json -4f385f92b948be135e268bf7f6f71e346266128d assets/create/lang/unfinished/fr_fr.json -1662dcbf578c71c8f2c92dff276766d1b80eae8c assets/create/lang/unfinished/it_it.json -53e51f744fd205abfd6cb69ba213d0ba867b1e95 assets/create/lang/unfinished/ja_jp.json -75cf95c526518a104c7a1289a4ce529d2d8ffde1 assets/create/lang/unfinished/ko_kr.json -e76bf18f466986aadd4b53991267305755ce299c assets/create/lang/unfinished/nl_nl.json -06370d657c5967e43df0f4925b3c5b06844a9172 assets/create/lang/unfinished/pt_br.json -586f3041725e75e02d440f233c12df3be879cecf assets/create/lang/unfinished/ru_ru.json -bbb874798f5125d4870e31bf6636f8e9b40a40b0 assets/create/lang/unfinished/zh_cn.json -e3aeeeaccee348630734c63fcbc3e3bea0af6663 assets/create/lang/unfinished/zh_tw.json +07eaea807200c157af29adbbc411d2a80b9cade5 assets/create/lang/en_us.json +3f89caaa4c6ac34222ebd1d5577139c18a9aa6b8 assets/create/lang/unfinished/de_de.json +591db95e6cd9e9f3f106ef4dc1f9ce475edee4df assets/create/lang/unfinished/es_es.json +ee7da78e00b92e5fde92c8ad8b25627bb7f478c7 assets/create/lang/unfinished/es_mx.json +3b604e06a29ddac65e71e4b853e88066496b3118 assets/create/lang/unfinished/fr_fr.json +d50db792720189290b382537f2703d08feab7f52 assets/create/lang/unfinished/it_it.json +2969a487f270d80969d69a5f76cef7e1b41c5c9e assets/create/lang/unfinished/ja_jp.json +5df95bcadb862b4522439ea66dc28a018771562b assets/create/lang/unfinished/ko_kr.json +9f65db261fdda1c22691b5238a8327d7aabcb912 assets/create/lang/unfinished/nl_nl.json +1864077ccca4c023e5bee33a3b1efe9ccdcaad28 assets/create/lang/unfinished/pt_br.json +1559765f5d8f1361e1a78680c60dd16ac5111259 assets/create/lang/unfinished/ru_ru.json +7b9680e0d83fdd4749418e54342fa567b4e2ea6b assets/create/lang/unfinished/zh_cn.json +ea077d3e3141001ebe3fb2cda60276ac21647a1f 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 c95acc466..b7a9084e2 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1804,15 +1804,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", + "create.ponder.subject": "Subject of this scene", "create.ponder.pondering": "Pondering about...", + "create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", @@ -1845,10 +1849,12 @@ "create.ponder.brass_hand.scene_8.title": "Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility", "_": "Thank you for translating Create!" 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 09c4d73bb..2bf4d5364 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: 1017", + "_": "Missing Localizations: 1023", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 dd5db5758..9f0011544 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: 59", + "_": "Missing Localizations: 65", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 d8fe9bdc7..33cd85111 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: 947", + "_": "Missing Localizations: 953", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 a6065aa98..01831c87c 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: 729", + "_": "Missing Localizations: 735", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 4118fc830..14100deba 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: 64", + "_": "Missing Localizations: 70", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 5ecc3c2d7..88b1f8229 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: 71", + "_": "Missing Localizations: 77", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 fe8092627..b755f5f47 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: 118", + "_": "Missing Localizations: 124", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 f2efff87e..2890bc7ef 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: 1216", + "_": "Missing Localizations: 1222", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 915c5f059..768fd4e46 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: 1282", + "_": "Missing Localizations: 1288", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 f804d2544..f14fee5da 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: 68", + "_": "Missing Localizations: 74", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 75275ef6d..aa9fa5d81 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: 66", + "_": "Missing Localizations: 72", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" 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 3b9c69967..feddcaa20 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: 71", + "_": "Missing Localizations: 77", "_": "->------------------------] Game Elements [------------------------<-", @@ -1805,15 +1805,19 @@ "_": "->------------------------] MetaDoc Text [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", + "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", + "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", @@ -1846,10 +1850,12 @@ "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels in line with a belt will adjust their direction based it.", + "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", "_": "Thank you for translating Create!" diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java index ea5de6a18..6dba9fb9e 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/DeployTool.java @@ -67,7 +67,7 @@ public class DeployTool extends PlacementToolBase { .translateBack(origin); AABBOutline outline = schematicHandler.getOutline(); - outline.render(ms, buffer); + outline.render(ms, buffer, pt); outline.getParams() .clearTextures(); ms.pop(); diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java index 32eb4c7fd..28f06d271 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/FlipTool.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.outliner.AABBOutline; import net.minecraft.util.Direction; @@ -74,7 +75,7 @@ public class FlipTool extends PlacementToolBase { .disableNormals() .colored(0xdddddd) .withFaceTextures(tex, tex); - outline.render(ms, buffer); + outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()); super.renderOnSchematic(ms, buffer); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java index 8c34beb39..e0c0eecc6 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/RotateTool.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.schematics.client.tools; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.outliner.LineOutline; import net.minecraft.util.math.AxisAlignedBB; @@ -35,7 +36,7 @@ public class RotateTool extends PlacementToolBase { .colored(0xdddddd) .lineWidth(1 / 16f); line.set(start, end) - .render(ms, buffer); + .render(ms, buffer, AnimationTickHolder.getPartialTicks()); super.renderOnSchematic(ms, buffer); } diff --git a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java index 6a7863831..ae07bed15 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/tools/SchematicToolBase.java @@ -143,7 +143,7 @@ public abstract class SchematicToolBase implements ISchematicTool { .colored(0x6886c5) .withFaceTexture(AllSpecialTextures.CHECKERED) .lineWidth(1 / 16f); - outline.render(ms, buffer); + outline.render(ms, buffer, AnimationTickHolder.getPartialTicks()); outline.getParams() .clearTextures(); ms.pop(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 58a641c74..9a2811ab0 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -139,6 +139,7 @@ public class ClientEvents { @SubscribeEvent public static void onRenderWorld(RenderWorldLastEvent event) { Vec3d cameraPos = Minecraft.getInstance().gameRenderer.getActiveRenderInfo().getProjectedView(); + float pt = AnimationTickHolder.getPartialTicks(); MatrixStack ms = event.getMatrixStack(); ms.push(); @@ -149,9 +150,8 @@ public class ClientEvents { CreateClient.schematicHandler.render(ms, buffer); CreateClient.ghostBlocks.renderAll(ms, buffer); - CreateClient.outliner.renderOutlines(ms, buffer); + CreateClient.outliner.renderOutlines(ms, buffer, pt); // LightVolumeDebugger.render(ms, buffer); -// CollisionDebugger.render(ms, buffer); buffer.draw(); RenderSystem.enableCull(); diff --git a/src/main/java/com/simibubi/create/foundation/collision/CollisionDebugger.java b/src/main/java/com/simibubi/create/foundation/collision/CollisionDebugger.java deleted file mode 100644 index 0f697c166..000000000 --- a/src/main/java/com/simibubi/create/foundation/collision/CollisionDebugger.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.simibubi.create.foundation.collision; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.AllSpecialTextures; -import com.simibubi.create.CreateClient; -import com.simibubi.create.foundation.collision.ContinuousOBBCollider.ContinuousSeparationManifold; -import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AngleHelper; -import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.outliner.AABBOutline; - -import net.minecraft.client.Minecraft; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.math.RayTraceResult.Type; -import net.minecraft.util.math.Vec3d; - -public class CollisionDebugger { - - public static AxisAlignedBB AABB = new AxisAlignedBB(BlockPos.ZERO.up(10)); - public static OrientedBB OBB = new OrientedBB(new AxisAlignedBB(BlockPos.ZERO)); - public static Vec3d motion = Vec3d.ZERO; - static ContinuousSeparationManifold seperation; - static double angle = 0; - static AABBOutline outline; - - public static void onScroll(double delta) { - angle += delta; - angle = (int) angle; - OBB.setRotation(new Matrix3d().asZRotation(AngleHelper.rad(angle))); - } - - public static void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - ms.push(); - outline = new AABBOutline(OBB.getAsAxisAlignedBB()); - outline.getParams() - .withFaceTexture(seperation == null ? AllSpecialTextures.CHECKERED : null) - .colored(0xffffff); - if (seperation != null) - outline.getParams() - .lineWidth(1 / 64f) - .colored(0xff6544); - MatrixStacker.of(ms) - .translate(OBB.center); - ms.peek() - .getModel() - .multiply(OBB.rotation.getAsMatrix4f()); - MatrixStacker.of(ms) - .translateBack(OBB.center); - outline.render(ms, buffer); - ms.pop(); - -// ms.push(); -// if (motion.length() != 0 && (seperation == null || seperation.getTimeOfImpact() != 1)) { -// outline.getParams() -// .colored(0x6544ff) -// .lineWidth(1 / 32f); -// MatrixStacker.of(ms) -// .translate(seperation != null ? seperation.getAllowedMotion(motion) : motion) -// .translate(OBB.center); -// ms.peek() -// .getModel() -// .multiply(OBB.rotation.getAsMatrix4f()); -// MatrixStacker.of(ms) -// .translateBack(OBB.center); -// outline.render(ms, buffer); -// } -// ms.pop(); - - ms.push(); - if (seperation != null) { - Vec3d asSeparationVec = seperation.asSeparationVec(.5f); - if (asSeparationVec != null) { - outline.getParams() - .colored(0x65ff44) - .lineWidth(1 / 32f); - MatrixStacker.of(ms) - .translate(asSeparationVec) - .translate(OBB.center); - ms.peek() - .getModel() - .multiply(OBB.rotation.getAsMatrix4f()); - MatrixStacker.of(ms) - .translateBack(OBB.center); - outline.render(ms, buffer); - } - } - ms.pop(); - } - - public static void tick() { - AABB = new AxisAlignedBB(BlockPos.ZERO.up(60)).offset(.5, 0, .5); - motion = Vec3d.ZERO; - RayTraceResult mouse = Minecraft.getInstance().objectMouseOver; - if (mouse != null && mouse.getType() == Type.BLOCK) { - BlockRayTraceResult hit = (BlockRayTraceResult) mouse; - OBB.setCenter(hit.getHitVec()); - seperation = OBB.intersect(AABB, motion); - } - CreateClient.outliner.showAABB(AABB, AABB) - .withFaceTexture(seperation == null ? AllSpecialTextures.CHECKERED : null); - } - - static void showDebugLine(Vec3d relativeStart, Vec3d relativeEnd, int color, String id, int offset) { - Vec3d center = CollisionDebugger.AABB.getCenter() - .add(0, 1 + offset / 16f, 0); - CreateClient.outliner.showLine(id + OBBCollider.checkCount, center.add(relativeStart), center.add(relativeEnd)) - .colored(color) - .lineWidth(1 / 32f); - } - -} diff --git a/src/main/java/com/simibubi/create/foundation/collision/OBBCollider.java b/src/main/java/com/simibubi/create/foundation/collision/OBBCollider.java index daf13ab6b..ece63976a 100644 --- a/src/main/java/com/simibubi/create/foundation/collision/OBBCollider.java +++ b/src/main/java/com/simibubi/create/foundation/collision/OBBCollider.java @@ -1,6 +1,5 @@ package com.simibubi.create.foundation.collision; -import static com.simibubi.create.foundation.collision.CollisionDebugger.showDebugLine; import static java.lang.Math.abs; import static java.lang.Math.signum; @@ -60,7 +59,6 @@ public class OBBCollider { if (diff > 0) return true; -// boolean isBestSeperation = distance != 0 && -(diff) <= abs(bestSeparation.getValue()); boolean isBestSeperation = checkCount == 2; // Debug specific separations if (isBestSeperation) { @@ -68,17 +66,6 @@ public class OBBCollider { double value = sTL * abs(diff); mf.axis = axis.normalize(); mf.separation = value; - - // Visualize values - if (CollisionDebugger.AABB != null) { - Vec3d normalizedAxis = axis.normalize(); - showDebugLine(Vec3d.ZERO, normalizedAxis.scale(TL), 0xbb00bb, "tl", 4); - showDebugLine(Vec3d.ZERO, normalizedAxis.scale(sTL * rA), 0xff4444, "ra", 3); - showDebugLine(normalizedAxis.scale(sTL * (distance - rB)), normalizedAxis.scale(TL), 0x4444ff, "rb", 2); - showDebugLine(normalizedAxis.scale(sTL * (distance - rB)), - normalizedAxis.scale(sTL * (distance - rB) + value), 0xff9966, "separation", 1); - System.out.println("TL:" + TL + ", rA: " + rA + ", rB: " + rB); - } } return false; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index 2ab41b185..217137336 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -52,7 +52,9 @@ public class PonderLocalization { JsonObject object = new JsonObject(); addGeneral(object, PonderTooltipHandler.HOLD_TO_PONDER, "Hold [%1$s] to Ponder"); + addGeneral(object, PonderTooltipHandler.SUBJECT, "Subject of this scene"); addGeneral(object, PonderUI.PONDERING, "Pondering about..."); + addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]"); shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); specific.forEach((rl, map) -> { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 6c0b98bd6..fe79bbd4d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -12,7 +12,11 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import org.apache.commons.lang3.mutable.MutableDouble; +import org.apache.commons.lang3.mutable.MutableObject; + import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement; import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; @@ -21,20 +25,27 @@ import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.Outliner; +import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; import net.minecraft.entity.Entity; -import net.minecraft.util.ResourceLocation; +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; public class PonderScene { @@ -84,6 +95,59 @@ public class PonderScene { setPointOfInterest(new Vec3d(0, 4, 0)); } + public void deselect() { + forEach(WorldSectionElement.class, WorldSectionElement::resetSelectedBlock); + } + + public Pair rayTraceScene(Vec3d from, Vec3d to) { + MutableObject> nearestHit = new MutableObject<>(); + MutableDouble bestDistance = new MutableDouble(0); + + forEach(WorldSectionElement.class, wse -> { + wse.resetSelectedBlock(); + if (!wse.isVisible()) + return; + Pair rayTrace = wse.rayTrace(world, from, to); + if (rayTrace == null) + return; + double distanceTo = rayTrace.getFirst() + .distanceTo(from); + if (nearestHit.getValue() != null && distanceTo >= bestDistance.getValue()) + return; + + nearestHit.setValue(Pair.of(wse, rayTrace.getSecond())); + bestDistance.setValue(distanceTo); + }); + + if (nearestHit.getValue() == null) + return Pair.of(ItemStack.EMPTY, null); + + BlockPos selectedPos = nearestHit.getValue() + .getSecond(); + + BlockPos origin = new BlockPos(offsetX, 0, offsetZ); + if (!world.getBounds() + .isVecInside(selectedPos)) + return Pair.of(ItemStack.EMPTY, null); + if (new MutableBoundingBox(origin, origin.add(new Vec3i(size - 1, 0, size - 1))).isVecInside(selectedPos)) { + if (PonderIndex.EDITOR_MODE) + nearestHit.getValue() + .getFirst() + .selectBlock(selectedPos); + return Pair.of(ItemStack.EMPTY, selectedPos); + } + + nearestHit.getValue() + .getFirst() + .selectBlock(selectedPos); + BlockState blockState = world.getBlockState(selectedPos); + ItemStack pickBlock = blockState.getPickBlock( + new BlockRayTraceResult(VecHelper.getCenterOf(selectedPos), Direction.UP, selectedPos, true), world, + selectedPos, Minecraft.getInstance().player); + + return Pair.of(pickBlock, selectedPos); + } + public String getTitle() { return getString("title"); } @@ -132,19 +196,16 @@ public class PonderScene { activeSchedule.add(new HideAllInstruction(10, null)); } - public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms) { - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); - + public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms, float pt) { ms.push(); - forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms)); + forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt)); for (RenderType type : RenderType.getBlockLayers()) - forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms)); - forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms)); + forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt)); + forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt)); info.set(transform.xRotation.getValue(pt), transform.yRotation.getValue(pt)); - world.renderEntities(ms, buffer, info); - world.renderParticles(ms, buffer, info); - outliner.renderOutlines(ms, buffer); + world.renderEntities(ms, buffer, info, pt); + world.renderParticles(ms, buffer, info, pt); + outliner.renderOutlines(ms, buffer, pt); ms.pop(); } @@ -295,8 +356,10 @@ public class PonderScene { } public MatrixStack apply(MatrixStack ms) { - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); + return apply(ms, AnimationTickHolder.getPartialTicks()); + } + + public MatrixStack apply(MatrixStack ms, float pt) { ms.translate(width / 2, height / 2, 200); MatrixStacker.of(ms) @@ -316,12 +379,22 @@ public class PonderScene { return ms; } - public Vec3d screenToScene(float x, float y, int depth) { + public Vec3d screenToScene(double x, double y, int depth) { + refreshMatrix(); float pt = AnimationTickHolder.getPartialTicks(); Vec3d vec = new Vec3d(x, y, depth); - - // wut - + + vec = vec.subtract(width / 2, height / 2, 200); + vec = VecHelper.rotate(vec, 35, Axis.X); + vec = VecHelper.rotate(vec, -55, Axis.Y); + vec = vec.subtract(offset, 0, 0); + vec = VecHelper.rotate(vec, 55, Axis.Y); + vec = VecHelper.rotate(vec, -35, Axis.X); + vec = VecHelper.rotate(vec, -xRotation.getValue(pt), Axis.X); + vec = VecHelper.rotate(vec, -yRotation.getValue(pt), Axis.Y); + vec = vec.mul(1f / 30, 1f / -30, 1f / 30); + vec = vec.subtract((size + offsetX) / -2f, -1f, (size + offsetZ) / -2f); + return vec; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java index a691b96cc..6bf190ba3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -4,6 +4,7 @@ import java.util.List; import com.google.common.base.Strings; import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; @@ -25,29 +26,41 @@ public class PonderTooltipHandler { static LerpedFloat holdWProgress = LerpedFloat.linear() .startWithValue(0); - static ItemStack lastHoveredStack = null; + static ItemStack lastHoveredStack = ItemStack.EMPTY; + static boolean subject = false; + public static final String HOLD_TO_PONDER = PonderLocalization.LANG_PREFIX + "hold_to_ponder"; + public static final String SUBJECT = PonderLocalization.LANG_PREFIX + "subject"; public static void tick() { Minecraft instance = Minecraft.getInstance(); Screen currentScreen = instance.currentScreen; - if (!(currentScreen instanceof ContainerScreen)) - return; - ContainerScreen cs = (ContainerScreen) currentScreen; - + ItemStack stack = ItemStack.EMPTY; ItemStack prevStack = lastHoveredStack; - lastHoveredStack = null; - Slot slotUnderMouse = cs.getSlotUnderMouse(); - if (slotUnderMouse == null || !slotUnderMouse.getHasStack()) + lastHoveredStack = ItemStack.EMPTY; + subject = false; + + if (currentScreen instanceof ContainerScreen) { + ContainerScreen cs = (ContainerScreen) currentScreen; + Slot slotUnderMouse = cs.getSlotUnderMouse(); + if (slotUnderMouse == null || !slotUnderMouse.getHasStack()) + return; + stack = slotUnderMouse.getStack(); + } else if (currentScreen instanceof PonderUI) { + PonderUI ponderUI = (PonderUI) currentScreen; + stack = ponderUI.getHoveredTooltipItem(); + if (stack.isItemEqual(ponderUI.getSubject())) + subject = true; + } else return; - ItemStack stack = slotUnderMouse.getStack(); - + if (stack.isEmpty()) + return; if (!PonderRegistry.all.containsKey(stack.getItem() .getRegistryName())) return; - if (prevStack != stack) + if (prevStack.isEmpty() || !prevStack.isItemEqual(stack)) holdWProgress.startWithValue(0); float value = holdWProgress.getValue(); @@ -56,10 +69,13 @@ public class PonderTooltipHandler { long window = instance.getWindow() .getHandle(); - if (InputMappings.isKeyDown(window, keyCode)) { - if (value >= 1) + if (!subject && InputMappings.isKeyDown(window, keyCode)) { + if (value >= 1) { ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem() .getRegistryName()))); + holdWProgress.startWithValue(0); + return; + } holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); } else holdWProgress.setValue(Math.max(0, value - .05f)); @@ -68,10 +84,14 @@ public class PonderTooltipHandler { } public static void addToTooltip(List toolTip, ItemStack stack) { + float renderPartialTicks = AnimationTickHolder.getPartialTicks(); if (lastHoveredStack != stack) return; - float renderPartialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); + if (subject) { + toolTip.set(1, Lang.createTranslationTextComponent(SUBJECT) + .applyTextStyle(TextFormatting.GREEN)); + return; + } toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); } 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 6856871ce..ba6d4110d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -9,41 +9,58 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.client.ClipboardHelper; import net.minecraft.client.GameSettings; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.registries.ForgeRegistries; public class PonderUI extends AbstractSimiScreen { public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; + public static final String IDENTIFY_MODE = PonderLocalization.LANG_PREFIX + "identify_mode"; + private List scenes; private LerpedFloat fadeIn; private LerpedFloat sceneProgress; ItemStack stack; + private boolean identifyMode; + private ItemStack hoveredTooltipItem; + private BlockPos hoveredBlockPos; + + private ClipboardHelper clipboardHelper; + private BlockPos copiedBlockPos; private LerpedFloat lazyIndex; private int index = 0; - private PonderButton left, right, icon, refresh, scan; + private PonderButton left, right, icon, scan; public PonderUI(List scenes) { this.scenes = scenes; @@ -54,6 +71,7 @@ public class PonderUI extends AbstractSimiScreen { fadeIn = LerpedFloat.linear() .startWithValue(0) .chase(1, .1f, Chaser.EXP); + clipboardHelper = new ClipboardHelper(); } @Override @@ -76,7 +94,12 @@ public class PonderUI extends AbstractSimiScreen { int spacing = 8; int bX = (width - 20) / 2 - (70 + 2 * spacing); - widgets.add(scan = new PonderButton(bX, bY, () -> identifyMode = !identifyMode).showing(AllIcons.I_MTD_SCAN) + widgets.add(scan = new PonderButton(bX, bY, () -> { + identifyMode = !identifyMode; + if (!identifyMode) + scenes.get(index) + .deselect(); + }).showing(AllIcons.I_MTD_SCAN) .shortcut(bindings.keyBindDrop) .fade(0, -1)); @@ -96,7 +119,7 @@ public class PonderUI extends AbstractSimiScreen { .fade(0, -1)); bX += 50 + spacing; - widgets.add(refresh = new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) + widgets.add(new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) .shortcut(bindings.keyBindBack) .fade(0, -1)); @@ -105,17 +128,38 @@ public class PonderUI extends AbstractSimiScreen { @Override public void tick() { PonderScene activeScene = scenes.get(index); - activeScene.tick(); + if (!identifyMode) + activeScene.tick(); sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP); - lazyIndex.tickChaser(); fadeIn.tickChaser(); sceneProgress.tickChaser(); - float lazyIndexValue = lazyIndex.getValue(); - if (Math.abs(lazyIndexValue - index) > 1 / 512f) - scenes.get(lazyIndexValue < index ? index - 1 : index + 1) - .tick(); + if (!identifyMode) { + float lazyIndexValue = lazyIndex.getValue(); + if (Math.abs(lazyIndexValue - index) > 1 / 512f) + scenes.get(lazyIndexValue < index ? index - 1 : index + 1) + .tick(); + } + + updateIdentifiedItem(activeScene); + } + + public void updateIdentifiedItem(PonderScene activeScene) { + hoveredTooltipItem = ItemStack.EMPTY; + hoveredBlockPos = null; + if (!identifyMode) + return; + + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); + double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + SceneTransform t = activeScene.getTransform(); + Vec3d vec1 = t.screenToScene(mouseX, mouseY, 1000); + Vec3d vec2 = t.screenToScene(mouseX, mouseY, -100); + Pair pair = activeScene.rayTraceScene(vec1, vec2); + hoveredTooltipItem = pair.getFirst(); + hoveredBlockPos = pair.getSecond(); } @Override @@ -126,6 +170,7 @@ public class PonderUI extends AbstractSimiScreen { } protected void replay() { + identifyMode = false; scenes.get(index) .begin(); } @@ -140,6 +185,7 @@ public class PonderUI extends AbstractSimiScreen { scenes.get(index) .begin(); lazyIndex.chase(index, 1 / 4f, Chaser.EXP); + identifyMode = false; return true; } else index = prevIndex; @@ -149,8 +195,8 @@ public class PonderUI extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderVisibleScenes(mouseX, mouseY, partialTicks); - renderWidgets(mouseX, mouseY, partialTicks); + renderVisibleScenes(mouseX, mouseY, identifyMode ? 0 : partialTicks); + renderWidgets(mouseX, mouseY, identifyMode ? 0 : partialTicks); } protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { @@ -164,7 +210,7 @@ public class PonderUI extends AbstractSimiScreen { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); - double value = lazyIndex.getValue(partialTicks); + double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks()); double diff = i - value; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; @@ -174,8 +220,8 @@ public class PonderUI extends AbstractSimiScreen { ms.push(); story.transform.updateScreenParams(width, height, slide); - story.transform.apply(ms); - story.renderScene(buffer, ms); + story.transform.apply(ms, partialTicks); + story.renderScene(buffer, ms, partialTicks); buffer.draw(); // coords for debug @@ -238,6 +284,7 @@ public class PonderUI extends AbstractSimiScreen { float fade = fadeIn.getValue(partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); float indexDiff = Math.abs(lazyIndexValue - index); + PonderScene activeScene = scenes.get(index); int textColor = 0xeeeeee; { @@ -250,16 +297,35 @@ public class PonderUI extends AbstractSimiScreen { y += 12; x += 0; RenderSystem.translated(0, 3 * (indexDiff), 0); - font.drawSplitString(scenes.get(index) - .getTitle(), x, y, left.x - x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + font.drawSplitString(activeScene.getTitle(), x, y, left.x - x, + ColorHelper.applyAlpha(textColor, 1 - indexDiff)); RenderSystem.popMatrix(); } if (identifyMode) { RenderSystem.pushMatrix(); - RenderSystem.translated(mouseX, mouseY, 800); - drawString(font, "?", 6, 2, 0xddffffff); + RenderSystem.translated(mouseX, mouseY, 100); + if (hoveredTooltipItem.isEmpty()) { + String tooltip = Lang + .createTranslationTextComponent(IDENTIFY_MODE, + new StringTextComponent(minecraft.gameSettings.keyBindDrop.getKeyBinding() + .getLocalizedName()).applyTextStyle(TextFormatting.WHITE)) + .applyTextStyle(TextFormatting.GRAY) + .getFormattedText(); + renderTooltip(font.listFormattedStringToWidth(tooltip, width / 3), 0, 0); + } else + renderTooltip(hoveredTooltipItem, 0, 0); + if (hoveredBlockPos != null && PonderIndex.EDITOR_MODE) { + RenderSystem.translated(0, -15, 0); + boolean copied = copiedBlockPos != null && hoveredBlockPos.equals(copiedBlockPos); + String coords = new StringTextComponent( + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ()) + .applyTextStyles(copied ? TextFormatting.GREEN : TextFormatting.GOLD) + .getFormattedText(); + renderTooltip(coords, 0, 0); + } RenderSystem.popMatrix(); + scan.flash(); } else { scan.dim(); @@ -288,8 +354,7 @@ public class PonderUI extends AbstractSimiScreen { if (index == scenes.size() - 1 || index == scenes.size() - 2 && lazyIndexValue > index) right.fade(scenes.size() - lazyIndexValue - 1); - boolean finished = scenes.get(index) - .isFinished(); + boolean finished = activeScene.isFinished(); if (finished) right.flash(); else @@ -325,6 +390,8 @@ public class PonderUI extends AbstractSimiScreen { } private void renderOverlay(int i, float partialTicks) { + if (identifyMode) + return; RenderSystem.pushMatrix(); PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); @@ -351,6 +418,15 @@ public class PonderUI extends AbstractSimiScreen { if (handled.booleanValue()) return true; + if (identifyMode && hoveredBlockPos != null && PonderIndex.EDITOR_MODE) { + clipboardHelper.setClipboardString(minecraft.getWindow() + .getHandle(), + "BlockPos copied = util.grid.at(" + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + + hoveredBlockPos.getZ() + ");"); + copiedBlockPos = hoveredBlockPos; + return true; + } + return super.mouseClicked(x, y, button); } @@ -383,6 +459,9 @@ public class PonderUI extends AbstractSimiScreen { if (code == qCode) { identifyMode = !identifyMode; + if (!identifyMode) + scenes.get(index) + .deselect(); return true; } @@ -474,17 +553,24 @@ public class PonderUI extends AbstractSimiScreen { public static void renderBox(int x, int y, int w, int h, int backgroundColor, int borderColorStart, int borderColorEnd) { - int zLevel = 100; - GuiUtils.drawGradientRect(zLevel, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd); - GuiUtils.drawGradientRect(zLevel, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, - borderColorEnd); - GuiUtils.drawGradientRect(zLevel, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart); - GuiUtils.drawGradientRect(zLevel, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd); + int z = 100; + GuiUtils.drawGradientRect(z, x - 3, y - 4, x + w + 3, y - 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(z, x - 3, y + h + 3, x + w + 3, y + h + 4, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y + h + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(z, x - 4, y - 3, x - 3, y + h + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(z, x + w + 3, y - 3, x + w + 4, y + h + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(z, x - 3, y - 3 + 1, x - 3 + 1, y + h + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(z, x + w + 2, y - 3 + 1, x + w + 3, y + h + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(z, x - 3, y - 3, x + w + 3, y - 3 + 1, borderColorStart, borderColorStart); + GuiUtils.drawGradientRect(z, x - 3, y + h + 2, x + w + 3, y + h + 3, borderColorEnd, borderColorEnd); + } + + public ItemStack getHoveredTooltipItem() { + return hoveredTooltipItem; + } + + public ItemStack getSubject() { + return stack; } } 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 3f2fe4cfa..23aa0d735 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -13,7 +13,6 @@ 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.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -122,9 +121,8 @@ public class PonderWorld extends SchematicWorld { return this; } - public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari) { + public void renderEntities(MatrixStack ms, SuperRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) { Vec3d vec3d = ari.getProjectedView(); - float pt = AnimationTickHolder.getPartialTicks(); double d0 = vec3d.getX(); double d1 = vec3d.getY(); double d2 = vec3d.getZ(); @@ -157,8 +155,8 @@ public class PonderWorld extends SchematicWorld { renderManager.render(entity, d0 - x, d1 - y, d2 - z, f, pt, ms, buffer, light); } - public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari) { - particles.renderParticles(ms, buffer, ari); + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo ari, float pt) { + particles.renderParticles(ms, buffer, ari, pt); } public void tick() { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java index 902c1e766..1f121ba1e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java @@ -59,10 +59,9 @@ public class PonderWorldParticles { } } - public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_) { + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_, float p_228345_5_) { Minecraft mc = Minecraft.getInstance(); LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager(); - float p_228345_5_ = mc.getRenderPartialTicks(); p_228345_3_.enableLightmap(); Runnable enable = () -> { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java index e7b04fb40..4c98c08aa 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedSceneElement.java @@ -5,7 +5,6 @@ import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.math.MathHelper; @@ -24,7 +23,7 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { public void forceApplyFade(float fade) { this.fade.startWithValue(fade); } - + public void setFade(float fade) { this.fade.setValue(fade); } @@ -32,46 +31,46 @@ public abstract class AnimatedSceneElement extends PonderSceneElement { public void setFadeVec(Vec3d fadeVec) { this.fadeVec = fadeVec; } - + @Override - public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { + public final void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) { ms.push(); - float currentFade = applyFade(ms); - renderFirst(world, buffer, ms, currentFade); + float currentFade = applyFade(ms, pt); + renderFirst(world, buffer, ms, currentFade, pt); ms.pop(); } @Override - public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) { + public final void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, + float pt) { ms.push(); - float currentFade = applyFade(ms); - renderLayer(world, buffer, type, ms, currentFade); - ms.pop(); - } - - @Override - public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) { - ms.push(); - float currentFade = applyFade(ms); - renderLast(world, buffer, ms, currentFade); + float currentFade = applyFade(ms, pt); + renderLayer(world, buffer, type, ms, currentFade, pt); ms.pop(); } - protected float applyFade(MatrixStack ms) { - float currentFade = fade.getValue(Minecraft.getInstance() - .getRenderPartialTicks()); + @Override + public final void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) { + ms.push(); + float currentFade = applyFade(ms, pt); + renderLast(world, buffer, ms, currentFade, pt); + ms.pop(); + } + + protected float applyFade(MatrixStack ms, float pt) { + float currentFade = fade.getValue(pt); if (fadeVec != null) MatrixStacker.of(ms) .translate(fadeVec.scale(-1 + currentFade)); return currentFade; } - protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, - float fade) {} + protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade, + float pt) {} - protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} + protected void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {} - protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) {} + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) {} protected int lightCoordsFromFade(float fade) { int light = 0xF000F0; 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 1209312f2..b8cc26f85 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 @@ -62,11 +62,9 @@ public class ParrotElement extends AnimatedSceneElement { } @Override - protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { EntityRendererManager entityrenderermanager = Minecraft.getInstance() .getRenderManager(); - float pt = Minecraft.getInstance() - .getRenderPartialTicks(); if (entity == null) pose.create(world); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java index e07338444..dfa176d04 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/PonderSceneElement.java @@ -9,10 +9,10 @@ import net.minecraft.client.renderer.RenderType; public abstract class PonderSceneElement extends PonderElement { - public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + public abstract void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt); - public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms); + public abstract void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt); - public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms); + public abstract void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java index 4c4bc96fb..b7c2cd7f9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TrackedElement.java @@ -31,12 +31,12 @@ public abstract class TrackedElement extends PonderSceneElement { } @Override - public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {} + public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {} @Override - public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms) {} + public void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float pt) {} @Override - public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms) {} + public void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float pt) {} } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index 0bb0cae53..185328f5e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -4,10 +4,10 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; @@ -16,8 +16,10 @@ import com.simibubi.create.foundation.render.Compartment; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.TileEntityRenderHelper; +import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockRenderType; @@ -30,13 +32,22 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; +import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.fluid.IFluidState; import net.minecraft.tileentity.ITickableTileEntity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceContext; +import net.minecraft.util.math.RayTraceContext.BlockMode; +import net.minecraft.util.math.RayTraceContext.FluidMode; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.shapes.ISelectionContext; +import net.minecraft.util.math.shapes.VoxelShape; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; @@ -54,6 +65,8 @@ public class WorldSectionElement extends AnimatedSceneElement { Vec3d animatedRotation = Vec3d.ZERO; Vec3d centerOfRotation = Vec3d.ZERO; + BlockPos selectedBlock; + public WorldSectionElement() {} public WorldSectionElement(Selection section) { @@ -91,15 +104,24 @@ public class WorldSectionElement extends AnimatedSceneElement { public void reset(PonderScene scene) { super.reset(scene); resetAnimatedTransform(); + resetSelectedBlock(); } - + + public void selectBlock(BlockPos pos) { + selectedBlock = pos; + } + + public void resetSelectedBlock() { + selectedBlock = null; + } + public void resetAnimatedTransform() { prevAnimatedOffset = Vec3d.ZERO; animatedOffset = Vec3d.ZERO; prevAnimatedRotation = Vec3d.ZERO; animatedRotation = Vec3d.ZERO; } - + public void queueRedraw() { redraw = true; } @@ -133,6 +155,57 @@ public class WorldSectionElement extends AnimatedSceneElement { return super.isVisible() && !isEmpty(); } + class WorldSectionRayTraceResult { + Vec3d actualHitVec; + BlockPos worldPos; + } + + public Pair rayTrace(PonderWorld world, Vec3d source, Vec3d target) { + world.setMask(this.section); + Vec3d transformedTarget = reverseTransformVec(target); + BlockRayTraceResult rayTraceBlocks = world.rayTraceBlocks(new RayTraceContext(reverseTransformVec(source), + transformedTarget, BlockMode.OUTLINE, FluidMode.NONE, null)); + world.clearMask(); + + if (rayTraceBlocks == null) + return null; + if (rayTraceBlocks.getHitVec() == null) + return null; + + double t = rayTraceBlocks.getHitVec() + .subtract(transformedTarget) + .lengthSquared() + / source.subtract(target) + .lengthSquared(); + Vec3d actualHit = VecHelper.lerp((float) t, target, source); + return Pair.of(actualHit, rayTraceBlocks.getPos()); + } + + private Vec3d reverseTransformVec(Vec3d in) { + float pt = AnimationTickHolder.getPartialTicks(); + in = in.subtract(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); + if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) { + in = in.subtract(centerOfRotation); + in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x), Axis.X); + in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z), Axis.Z); + in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y), Axis.Y); + in = in.add(centerOfRotation); + } + return in; + } + + public void transformMS(MatrixStack ms, float pt) { + MatrixStacker.of(ms) + .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); + if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) + MatrixStacker.of(ms) + .translate(centerOfRotation) + .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) + .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) + .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) + .translateBack(centerOfRotation); + } + public void tick(PonderScene scene) { prevAnimatedOffset = animatedOffset; prevAnimatedRotation = animatedRotation; @@ -147,46 +220,22 @@ public class WorldSectionElement extends AnimatedSceneElement { } @Override - protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, - float fade) { - float pt = AnimationTickHolder.getPartialTicks(); - - MatrixStacker.of(ms) - .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); - - if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) - MatrixStacker.of(ms) - .translate(centerOfRotation) - .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) - .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) - .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) - .translateBack(centerOfRotation); - + protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade, + float pt) { + transformMS(ms, pt); renderStructure(world, ms, buffer, type, fade); } @Override - public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + public void renderFirst(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { int light = -1; if (fade != 1) light = (int) (MathHelper.lerp(fade, 5, 14)); if (redraw) renderedTileEntities = null; - - //TODO: extract method - float pt = AnimationTickHolder.getPartialTicks(); - MatrixStacker.of(ms) - .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); - if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) - MatrixStacker.of(ms) - .translate(centerOfRotation) - .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) - .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) - .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) - .translateBack(centerOfRotation); - + transformMS(ms, pt); world.pushFakeLight(light); - renderTileEntities(world, ms, buffer); + renderTileEntities(world, ms, buffer, pt); world.popLight(); } @@ -210,11 +259,30 @@ public class WorldSectionElement extends AnimatedSceneElement { } @Override - protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade) { + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { redraw = false; + if (selectedBlock == null) + return; + BlockState blockState = world.getBlockState(selectedBlock); + if (blockState.isAir(world, selectedBlock)) + return; + VoxelShape shape = + blockState.getShape(world, selectedBlock, ISelectionContext.forEntity(Minecraft.getInstance().player)); + if (shape.isEmpty()) + return; + + ms.push(); + transformMS(ms, pt); + RenderSystem.disableTexture(); + WorldRenderer.drawBox(ms, buffer.getBuffer(RenderType.getLines()), shape.getBoundingBox() + .offset(selectedBlock), 1, 1, 1, 1); + if (buffer instanceof SuperRenderTypeBuffer) + ((SuperRenderTypeBuffer) buffer).draw(RenderType.getLines()); + RenderSystem.enableTexture(); + ms.pop(); } - private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer) { + private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float pt) { if (renderedTileEntities == null) { renderedTileEntities = new ArrayList<>(); section.forEach(pos -> { @@ -224,8 +292,7 @@ public class WorldSectionElement extends AnimatedSceneElement { }); } else renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); - - TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer); + TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer, pt); } private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { diff --git a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java index 0af8bcff9..6fe466e6f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -24,13 +24,23 @@ public class TileEntityRenderHelper { public static void renderTileEntities(World world, Iterable customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer) { - renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer); } + + public static void renderTileEntities(World world, Iterable customRenderTEs, MatrixStack ms, + MatrixStack localTransform, IRenderTypeBuffer buffer, float pt) { + renderTileEntities(world, null, customRenderTEs, ms, localTransform, buffer, pt); + } - public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld, Iterable customRenderTEs, MatrixStack ms, - MatrixStack localTransform, IRenderTypeBuffer buffer) { - float pt = AnimationTickHolder.getPartialTicks(); + public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld, + Iterable customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer) { + renderTileEntities(world, renderWorld, customRenderTEs, ms, localTransform, buffer, + AnimationTickHolder.getPartialTicks()); + } + + public static void renderTileEntities(World world, PlacementSimulationWorld renderWorld, + Iterable customRenderTEs, MatrixStack ms, MatrixStack localTransform, IRenderTypeBuffer buffer, + float pt) { Matrix4f matrix = localTransform.peek() .getModel(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java index 811987c5d..ca96b1b79 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolumeDebugger.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.outliner.AABBOutline; @@ -29,6 +30,6 @@ public class LightVolumeDebugger { outline.getParams().colored(pair.getSecond()); return outline; }) - .forEach(outline -> outline.render(ms, buffer)); + .forEach(outline -> outline.render(ms, buffer, AnimationTickHolder.getPartialTicks())); } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java index 2dcf74527..5914501db 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/ValueBox.java @@ -73,7 +73,7 @@ public class ValueBox extends ChasingAABBOutline { } @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { boolean hasTransform = transform != null; if (transform instanceof Sided && params.getHighlightedFace() != null) ((Sided) transform).fromSide(params.getHighlightedFace()); @@ -88,7 +88,7 @@ public class ValueBox extends ChasingAABBOutline { .getNormal() .copy(); params.colored(isPassive ? passiveColor : highlightColor); - super.render(ms, buffer); + super.render(ms, buffer, pt); float fontScale = hasTransform ? -transform.getFontScale() : -1 / 64f; ms.scale(fontScale, fontScale, fontScale); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java index 55c0462fb..5efa0fe17 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/AABBOutline.java @@ -22,7 +22,7 @@ public class AABBOutline extends Outline { } @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { renderBB(ms, buffer, bb); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java index 06f7beb9f..c960eae5e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/BlockClusterOutline.java @@ -30,7 +30,7 @@ public class BlockClusterOutline extends Outline { } @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { for (MergeEntry edge : cluster.visibleEdges) { Vec3d start = new Vec3d(edge.pos); Direction direction = Direction.getFacingFromAxis(AxisDirection.POSITIVE, edge.axis); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java index 6621b1a0e..d70ef3189 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/ChasingAABBOutline.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.MathHelper; @@ -29,8 +28,8 @@ public class ChasingAABBOutline extends AABBOutline { } @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - renderBB(ms, buffer, interpolateBBs(prevBB, bb, AnimationTickHolder.getPartialTicks())); + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { + renderBB(ms, buffer, interpolateBBs(prevBB, bb, pt)); } private static AxisAlignedBB interpolateBBs(AxisAlignedBB current, AxisAlignedBB target, float pt) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java index 4a72da0da..66885d45b 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/LineOutline.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.utility.outliner; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; @@ -19,7 +18,7 @@ public class LineOutline extends Outline { } @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { renderCuboidLine(ms, buffer, start, end); } @@ -46,8 +45,7 @@ public class LineOutline extends Outline { } @Override - public void render(MatrixStack ms, SuperRenderTypeBuffer buffer) { - float pt = AnimationTickHolder.getPartialTicks(); + public void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { float distanceToTarget = 1 - MathHelper.lerp(pt, prevProgress, progress); Vec3d start = end.add(this.start.subtract(end) .scale(distanceToTarget)); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java index c91099558..e5f90c3ca 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outline.java @@ -31,7 +31,7 @@ public abstract class Outline { params = new OutlineParams(); } - public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer); + public abstract void render(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt); public void renderCuboidLine(MatrixStack ms, SuperRenderTypeBuffer buffer, Vec3d start, Vec3d end) { Vec3d diff = end.subtract(start); diff --git a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java index 67e1a46c4..25185c7d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java +++ b/src/main/java/com/simibubi/create/foundation/utility/outliner/Outliner.java @@ -10,7 +10,6 @@ import java.util.Set; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBox; -import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.outliner.LineOutline.EndChasingLineOutline; import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; @@ -146,7 +145,7 @@ public class Outliner { toClear.forEach(outlines::remove); } - public void renderOutlines(MatrixStack ms, SuperRenderTypeBuffer buffer) { + public void renderOutlines(MatrixStack ms, SuperRenderTypeBuffer buffer, float pt) { outlines.forEach((key, entry) -> { Outline outline = entry.getOutline(); outline.params.alpha = 1; @@ -156,13 +155,13 @@ public class Outliner { float fadeticks = OutlineEntry.fadeTicks; float lastAlpha = prevTicks >= 0 ? 1 : 1 + (prevTicks / fadeticks); float currentAlpha = 1 + (entry.ticksTillRemoval / fadeticks); - float alpha = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), lastAlpha, currentAlpha); + float alpha = MathHelper.lerp(pt, lastAlpha, currentAlpha); outline.params.alpha = alpha * alpha * alpha; if (outline.params.alpha < 1 / 8f) return; } - outline.render(ms, buffer); + outline.render(ms, buffer, pt); }); } From 0a1be94cbbaaef8dc5be70fed09ee7df7b20abd0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 28 Feb 2021 23:49:51 +0100 Subject: [PATCH 14/23] Funnel Fantasy VII - Finished ponder entries about funnels - Smart TEs can now enter "virtual mode" to run both client and server code (support for it needs individual adjustment) - Removed obsolete quads from the andesite funnels' model - Not enough ponder instructions - Fixed upright belt items in ponder UI --- src/generated/resources/.cache/cache | 12 +- .../create/blockstates/andesite_funnel.json | 16 +- ...site_funnel_vertical_filterless_pull.json} | 2 +- ...nel_vertical_filterless_pull_powered.json} | 2 +- ...site_funnel_vertical_filterless_push.json} | 2 +- ...nel_vertical_filterless_push_powered.json} | 2 +- .../data/create/advancements/aesthetics.json | 4 +- .../java/com/simibubi/create/AllBlocks.java | 4 +- .../java/com/simibubi/create/AllShapes.java | 4 +- .../contraptions/base/KineticTileEntity.java | 1 - .../components/saw/SawTileEntity.java | 4 +- .../fluids/actors/ItemDrainTileEntity.java | 10 +- .../relays/belt/transport/BeltInventory.java | 9 +- .../block/funnel/FunnelGenerator.java | 6 +- .../create/foundation/ponder/PonderScene.java | 14 + .../create/foundation/ponder/PonderUI.java | 1 + .../create/foundation/ponder/PonderWorld.java | 18 +- .../foundation/ponder/SceneBuilder.java | 66 ++++- .../ponder/content/FunnelScenes.java | 244 +++++++++++++++++- .../ponder/content/PonderIndex.java | 12 +- .../ponder/elements/WorldSectionElement.java | 8 +- .../AnimateWorldSectionInstruction.java | 6 +- .../ponder/instructions/TextInstruction.java | 4 +- .../tileEntity/SmartTileEntity.java | 15 +- .../funnel/block_vertical_filterless.json | 168 ++++++++++++ src/main/resources/ponder/funnels/brass.nbt | Bin 0 -> 941 bytes src/main/resources/ponder/funnels/compat.nbt | Bin 0 -> 939 bytes .../resources/ponder/funnels/mounting.nbt | Bin 474 -> 0 bytes .../resources/ponder/funnels/redstone.nbt | Bin 0 -> 506 bytes .../resources/ponder/funnels/transposer.nbt | Bin 0 -> 882 bytes 30 files changed, 558 insertions(+), 76 deletions(-) rename src/generated/resources/assets/create/models/block/{andesite_funnel_vertical_pull.json => andesite_funnel_vertical_filterless_pull.json} (86%) rename src/generated/resources/assets/create/models/block/{andesite_funnel_vertical_pull_powered.json => andesite_funnel_vertical_filterless_pull_powered.json} (86%) rename src/generated/resources/assets/create/models/block/{andesite_funnel_vertical_push.json => andesite_funnel_vertical_filterless_push.json} (86%) rename src/generated/resources/assets/create/models/block/{andesite_funnel_vertical_push_powered.json => andesite_funnel_vertical_filterless_push_powered.json} (86%) create mode 100644 src/main/resources/assets/create/models/block/funnel/block_vertical_filterless.json create mode 100644 src/main/resources/ponder/funnels/brass.nbt create mode 100644 src/main/resources/ponder/funnels/compat.nbt delete mode 100644 src/main/resources/ponder/funnels/mounting.nbt create mode 100644 src/main/resources/ponder/funnels/redstone.nbt create mode 100644 src/main/resources/ponder/funnels/transposer.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index aef7b05d8..e4ec0acbe 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -16,7 +16,7 @@ a579c40c43dc2174afb66f42d00d0c4a0efaaeee assets/create/blockstates/andesite_bric 96b5284693da168ab8e0809d86515b5f1a7e763f assets/create/blockstates/andesite_cobblestone_stairs.json 82bd82270aff7d51e9239680ef4dd7b5c899ceb0 assets/create/blockstates/andesite_cobblestone_wall.json 9639b901ffdd2ecccab5575c5c9e6c7b5c901e02 assets/create/blockstates/andesite_encased_shaft.json -53cf4cfd94db1f44e9865b9fe5db383d01a12671 assets/create/blockstates/andesite_funnel.json +ca9a629472625abf741f02b94ce4578292fb14a7 assets/create/blockstates/andesite_funnel.json 398922758a6219544e5b85c91c9cf8a543b437e5 assets/create/blockstates/andesite_pillar.json 1d2d8081581e07d9be4b382aede4f2de4401cc6b assets/create/blockstates/andesite_tunnel.json e555e3c2b2d3f01440e48db4ba88f7e00fd99b6f assets/create/blockstates/basin.json @@ -465,10 +465,10 @@ a033fbac3129bba9211c6c4a0e16c905643afa39 assets/create/models/block/andesite_cob 9841d6a09a09bf4d5d6a39bdc4904d86b3a825f8 assets/create/models/block/andesite_funnel_horizontal_pull_powered.json 86d5df6e365d9b2e9682f0839f61058360828ba2 assets/create/models/block/andesite_funnel_horizontal_push.json 50af1ff6ce9af162d4e438f21952c7215608dc8e assets/create/models/block/andesite_funnel_horizontal_push_powered.json -618d6ca90addb5913c72789f6188c957afa503f3 assets/create/models/block/andesite_funnel_vertical_pull.json -45365708fa75e2cd3d0702fb0e4960861ada27ab assets/create/models/block/andesite_funnel_vertical_pull_powered.json -53bdeba42894242088e8f7e7734a101fa998d0e4 assets/create/models/block/andesite_funnel_vertical_push.json -3e88fa45e22868dae92a014e589585d37eb465ad assets/create/models/block/andesite_funnel_vertical_push_powered.json +75c914bf9448e25fd01d597de48375a9782bef36 assets/create/models/block/andesite_funnel_vertical_filterless_pull.json +4d70a221809f5bc598a0a0e98bd152e9ab7a2f7f assets/create/models/block/andesite_funnel_vertical_filterless_pull_powered.json +a41c7351513a9514dfdc0fc552b646b1d715c977 assets/create/models/block/andesite_funnel_vertical_filterless_push.json +e7931f28887baadd52ac988fc8eeeb84ee6f0d27 assets/create/models/block/andesite_funnel_vertical_filterless_push_powered.json b1d0bb538fc8285b7d3fd77a977d78a104b83b62 assets/create/models/block/andesite_pillar.json aaf2e4259bcfcedd3400e9acb2d64c0cf06f7fb1 assets/create/models/block/andesite_tunnel/cross.json 75f628178fa21a2bd301eea8d1cebf7e94f7d5cc assets/create/models/block/andesite_tunnel/straight.json @@ -1579,7 +1579,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/blockstates/andesite_funnel.json b/src/generated/resources/assets/create/blockstates/andesite_funnel.json index 7330405c1..9ea4b09ee 100644 --- a/src/generated/resources/assets/create/blockstates/andesite_funnel.json +++ b/src/generated/resources/assets/create/blockstates/andesite_funnel.json @@ -1,21 +1,21 @@ { "variants": { "extracting=false,facing=down,powered=false": { - "model": "create:block/andesite_funnel_vertical_pull", + "model": "create:block/andesite_funnel_vertical_filterless_pull", "x": 180, "y": 180 }, "extracting=true,facing=down,powered=false": { - "model": "create:block/andesite_funnel_vertical_push", + "model": "create:block/andesite_funnel_vertical_filterless_push", "x": 180, "y": 180 }, "extracting=false,facing=up,powered=false": { - "model": "create:block/andesite_funnel_vertical_pull", + "model": "create:block/andesite_funnel_vertical_filterless_pull", "y": 180 }, "extracting=true,facing=up,powered=false": { - "model": "create:block/andesite_funnel_vertical_push", + "model": "create:block/andesite_funnel_vertical_filterless_push", "y": 180 }, "extracting=false,facing=north,powered=false": { @@ -49,21 +49,21 @@ "y": 90 }, "extracting=false,facing=down,powered=true": { - "model": "create:block/andesite_funnel_vertical_pull_powered", + "model": "create:block/andesite_funnel_vertical_filterless_pull_powered", "x": 180, "y": 180 }, "extracting=true,facing=down,powered=true": { - "model": "create:block/andesite_funnel_vertical_push_powered", + "model": "create:block/andesite_funnel_vertical_filterless_push_powered", "x": 180, "y": 180 }, "extracting=false,facing=up,powered=true": { - "model": "create:block/andesite_funnel_vertical_pull_powered", + "model": "create:block/andesite_funnel_vertical_filterless_pull_powered", "y": 180 }, "extracting=true,facing=up,powered=true": { - "model": "create:block/andesite_funnel_vertical_push_powered", + "model": "create:block/andesite_funnel_vertical_filterless_push_powered", "y": 180 }, "extracting=false,facing=north,powered=true": { diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_pull.json similarity index 86% rename from src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_pull.json index 02736f668..a05b1954a 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_pull.json @@ -1,5 +1,5 @@ { - "parent": "create:block/funnel/block_vertical", + "parent": "create:block/funnel/block_vertical_filterless", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_pull_powered.json similarity index 86% rename from src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull_powered.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_pull_powered.json index 7752f5d86..979f71145 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull_powered.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_pull_powered.json @@ -1,5 +1,5 @@ { - "parent": "create:block/funnel/block_vertical", + "parent": "create:block/funnel/block_vertical_filterless", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_push.json similarity index 86% rename from src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_push.json index acbd75ff3..ef3fe4431 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_push.json @@ -1,5 +1,5 @@ { - "parent": "create:block/funnel/block_vertical", + "parent": "create:block/funnel/block_vertical_filterless", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_push_powered.json similarity index 86% rename from src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push_powered.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_push_powered.json index 6bbc397da..4afdf8a20 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push_powered.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_filterless_push_powered.json @@ -1,5 +1,5 @@ { - "parent": "create:block/funnel/block_vertical", + "parent": "create:block/funnel/block_vertical_filterless", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", 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/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index aea45c42e..9634be56c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1083,7 +1083,7 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(FunnelMovementBehaviour.andesite())) - .blockstate(new FunnelGenerator("andesite")::generate) + .blockstate(new FunnelGenerator("andesite", false)::generate) .item(FunnelItem::new) .model(FunnelGenerator.itemModel("andesite")) .build() @@ -1102,7 +1102,7 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(FunnelMovementBehaviour.brass())) - .blockstate(new FunnelGenerator("brass")::generate) + .blockstate(new FunnelGenerator("brass", true)::generate) .item(FunnelItem::new) .model(FunnelGenerator.itemModel("brass")) .build() diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index e7442c5b8..7c102139e 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -187,10 +187,10 @@ public class AllShapes { TANK_TOP_BOTTOM = shape(TANK_BOTTOM_LID).add(TANK_TOP_LID) .add(TANK) .build(), - FUNNEL_FLOOR = shape(2, -2, 2, 14, 8, 14).add(1, 2, 1, 15, 8, 15) + FUNNEL_FLOOR = shape(2, -2, 2, 14, 8, 14).add(1, 1, 1, 15, 8, 15) .add(0, 4, 0, 16, 10, 16) .build(), - FUNNEL_CEILING = shape(2, 8, 2, 14, 18, 14).add(1, 8, 1, 15, 14, 15) + FUNNEL_CEILING = shape(2, 8, 2, 14, 18, 14).add(1, 8, 1, 15, 15, 15) .add(0, 6, 0, 16, 12, 16) .build(), DEPOT = shape(CASING_11PX.get(Direction.UP)).add(1, 11, 1, 15, 13, 15) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java index 9ef0a28ff..050c5702e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntity.java @@ -15,7 +15,6 @@ import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.base.IRotate.StressImpact; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; -import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java index 8652591db..bcb39ea99 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawTileEntity.java @@ -129,7 +129,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { if (inventory.remainingTime > 0) spawnParticles(inventory.getStackInSlot(0)); - if (world.isRemote) + if (world.isRemote && !isVirtual()) return; if (inventory.remainingTime < 20 && !inventory.appliedRecipe) { @@ -317,7 +317,7 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity { return; if (inventory.isEmpty()) return; - if (world.isRemote) + if (world.isRemote && !isVirtual()) return; List> recipes = getRecipes(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java index fd5a060a4..3f8f791fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainTileEntity.java @@ -95,10 +95,12 @@ public class ItemDrainTileEntity extends SmartTileEntity { return; } + boolean onClient = world.isRemote && !isVirtual(); + if (processingTicks > 0) { heldItem.prevBeltPosition = .5f; boolean wasAtBeginning = processingTicks == FILLING_TIME; - if (!world.isRemote || processingTicks < FILLING_TIME) + if (!onClient || processingTicks < FILLING_TIME) processingTicks--; if (!continueProcessing()) { processingTicks = 0; @@ -117,7 +119,7 @@ public class ItemDrainTileEntity extends SmartTileEntity { if (heldItem.beltPosition > 1) { heldItem.beltPosition = 1; - if (world.isRemote) + if (onClient) return; Direction side = heldItem.insertedFrom; @@ -183,7 +185,7 @@ public class ItemDrainTileEntity extends SmartTileEntity { if (!EmptyingByBasin.canItemBeEmptied(world, heldItem.stack)) return; heldItem.beltPosition = .5f; - if (world.isRemote) + if (onClient) return; processingTicks = FILLING_TIME; sendData(); @@ -192,7 +194,7 @@ public class ItemDrainTileEntity extends SmartTileEntity { } protected boolean continueProcessing() { - if (world.isRemote) + if (world.isRemote && !isVirtual()) return true; if (processingTicks < 5) return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java index 6ae301df1..1dbd82087 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltInventory.java @@ -38,7 +38,6 @@ public class BeltInventory { final List toInsert; final List toRemove; boolean beltMovementPositive; - boolean virtualMode; final float SEGMENT_WINDOW = .75f; public BeltInventory(BeltTileEntity te) { @@ -46,7 +45,6 @@ public class BeltInventory { items = new LinkedList<>(); toInsert = new LinkedList<>(); toRemove = new LinkedList<>(); - virtualMode = false; } public void tick() { @@ -84,7 +82,7 @@ public class BeltInventory { .get(BeltBlock.SLOPE) == BeltSlope.HORIZONTAL; float spacing = 1; World world = belt.getWorld(); - boolean onClient = world.isRemote && !virtualMode; + boolean onClient = world.isRemote && !belt.isVirtual(); // resolve ending only when items will reach it this tick Ending ending = Ending.UNRESOLVED; @@ -439,9 +437,4 @@ public class BeltInventory { return items; } - // Simulating belt interactions in a client-only world - public void enableVirtualMode() { - virtualMode = true; - } - } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java index 5c5fc8bd1..b41d3384f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java @@ -19,9 +19,11 @@ public class FunnelGenerator extends SpecialBlockStateGen { private String type; private ResourceLocation particleTexture; + private boolean hasFilter; - public FunnelGenerator(String type) { + public FunnelGenerator(String type, boolean hasFilter) { this.type = type; + this.hasFilter = hasFilter; this.particleTexture = Create.asResource("block/" + type + "_casing"); } @@ -44,7 +46,7 @@ public class FunnelGenerator extends SpecialBlockStateGen { Direction facing = s.get(FunnelBlock.FACING); boolean horizontal = facing.getAxis() .isHorizontal(); - String parent = horizontal ? "horizontal" : "vertical"; + String parent = horizontal ? "horizontal" : hasFilter ? "vertical" : "vertical_filterless"; BlockModelBuilder model = p.models() .withExistingParent("block/" + type + "_funnel_" + parent + extracting + powered, diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index fe79bbd4d..02052a610 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -36,6 +36,7 @@ import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.Vector4f; import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ArmorStandEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -66,6 +67,7 @@ public class PonderScene { Vec3d pointOfInterest; Vec3d chasingPointOfInterest; WorldSectionElement baseWorldSection; + Entity renderViewEntity; int offsetX; int offsetZ; @@ -90,6 +92,7 @@ public class PonderScene { size = getBounds().getXSize(); info = new SceneRenderInfo(); baseWorldSection = new WorldSectionElement(); + renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); PonderLocalization.registerSpecific(component, sceneIndex, "title", "Untitled Scene"); setPointOfInterest(new Vec3d(0, 4, 0)); @@ -198,7 +201,13 @@ public class PonderScene { public void renderScene(SuperRenderTypeBuffer buffer, MatrixStack ms, float pt) { ms.push(); + Minecraft mc = Minecraft.getInstance(); + Entity prevRVE = mc.renderViewEntity; + + mc.renderViewEntity = this.renderViewEntity; forEachVisible(PonderSceneElement.class, e -> e.renderFirst(world, buffer, ms, pt)); + mc.renderViewEntity = prevRVE; + for (RenderType type : RenderType.getBlockLayers()) forEachVisible(PonderSceneElement.class, e -> e.renderLayer(world, buffer, type, ms, pt)); forEachVisible(PonderSceneElement.class, e -> e.renderLast(world, buffer, ms, pt)); @@ -379,6 +388,11 @@ public class PonderScene { return ms; } + public void updateSceneRVE() { + Vec3d v = screenToScene(width / 2, height / 2, 500); + renderViewEntity.setPosition(v.x, v.y, v.z); + } + public Vec3d screenToScene(double x, double y, int depth) { refreshMatrix(); float pt = AnimationTickHolder.getPartialTicks(); 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 ba6d4110d..4197cd7fd 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -221,6 +221,7 @@ public class PonderUI extends AbstractSimiScreen { ms.push(); story.transform.updateScreenParams(width, height, slide); story.transform.apply(ms, partialTicks); + story.transform.updateSceneRVE(); story.renderScene(buffer, ms, partialTicks); buffer.draw(); 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 23aa0d735..1b75b6571 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -13,6 +13,7 @@ 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.renderState.SuperRenderTypeBuffer; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -161,16 +162,16 @@ public class PonderWorld extends SchematicWorld { public void tick() { particles.tick(); - + for (Iterator iterator = entities.iterator(); iterator.hasNext();) { Entity entity = iterator.next(); - + entity.ticksExisted++; entity.lastTickPosX = entity.getX(); entity.lastTickPosY = entity.getY(); entity.lastTickPosZ = entity.getZ(); entity.tick(); - + if (!entity.isAlive()) iterator.remove(); } @@ -198,14 +199,17 @@ public class PonderWorld extends SchematicWorld { public void fixVirtualTileEntities() { for (TileEntity tileEntity : tileEntities.values()) { - if (!(tileEntity instanceof BeltTileEntity)) + if (!(tileEntity instanceof SmartTileEntity)) continue; - BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; + SmartTileEntity smartTileEntity = (SmartTileEntity) tileEntity; + smartTileEntity.markVirtual(); + + if (!(smartTileEntity instanceof BeltTileEntity)) + continue; + BeltTileEntity beltTileEntity = (BeltTileEntity) smartTileEntity; if (!beltTileEntity.isController()) continue; BlockPos controllerPos = tileEntity.getPos(); - beltTileEntity.getInventory() - .enableVirtualMode(); for (BlockPos blockPos : BeltBlock.getBeltChain(this, controllerPos)) { TileEntity tileEntity2 = getTileEntity(blockPos); if (!(tileEntity2 instanceof BeltTileEntity)) 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 f4121cb2b..36a2b9e94 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -34,6 +34,7 @@ import com.simibubi.create.foundation.ponder.instructions.RotateSceneInstruction import com.simibubi.create.foundation.ponder.instructions.ShowInputInstruction; import com.simibubi.create.foundation.ponder.instructions.TextInstruction; import com.simibubi.create.foundation.ponder.instructions.TileEntityDataInstruction; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; @@ -44,6 +45,7 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.RedstoneParticleData; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; @@ -228,7 +230,7 @@ public class SceneBuilder { public void indicateRedstone(BlockPos pos) { createRedstoneParticles(pos, 0xFF0000, 10); } - + public void indicateSuccess(BlockPos pos) { createRedstoneParticles(pos, 0x80FFaa, 10); } @@ -245,27 +247,37 @@ public class SceneBuilder { public void showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, int duration) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + registerText(key, defaultText); addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, false)); } public void showTargetedTextNearScene(PonderPalette color, Vec3d position, String key, String defaultText, int duration) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + registerText(key, defaultText); addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, true)); } public void showSelectionWithText(PonderPalette color, Selection selection, String key, String defaultText, int duration) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection)); + registerText(key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection, false)); + } + + public void showSelectionWithTextNearScene(PonderPalette color, Selection selection, String key, + String defaultText, int duration) { + registerText(key, defaultText); + addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection, true)); } public void showText(PonderPalette color, int y, String key, String defaultText, int duration) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + registerText(key, defaultText); addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, y)); } + private void registerText(String key, String defaultText) { + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + } + public void showControls(InputWindowElement element, int duration) { addInstruction(new ShowInputInstruction(element.clone(), duration)); } @@ -431,6 +443,21 @@ public class SceneBuilder { }); } + public void createItemOnBeltLike(BlockPos location, Direction insertionSide, ItemStack stack) { + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + TileEntity tileEntity = world.getTileEntity(location); + if (!(tileEntity instanceof SmartTileEntity)) + return; + SmartTileEntity beltTileEntity = (SmartTileEntity) tileEntity; + DirectBeltInputBehaviour behaviour = beltTileEntity.getBehaviour(DirectBeltInputBehaviour.TYPE); + if (behaviour == null) + return; + behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); + }); + flapFunnels(scene.getSceneBuildingUtil().select.position(location.up()), true); + } + public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, ItemStack stack) { ElementLink link = new ElementLink<>(BeltItemElement.class); @@ -492,15 +519,32 @@ public class SceneBuilder { } public void modifyKineticSpeed(Selection selection, UnaryOperator speedFunc) { - addInstruction(new TileEntityDataInstruction(selection, SpeedGaugeTileEntity.class, nbt -> { + modifyTileNBT(selection, SpeedGaugeTileEntity.class, nbt -> { float newSpeed = speedFunc.apply(nbt.getFloat("Speed")); nbt.putFloat("Value", SpeedGaugeTileEntity.getDialTarget(newSpeed)); - return nbt; - }, false)); - addInstruction(new TileEntityDataInstruction(selection, KineticTileEntity.class, nbt -> { + }); + modifyTileNBT(selection, KineticTileEntity.class, nbt -> { nbt.putFloat("Speed", speedFunc.apply(nbt.getFloat("Speed"))); + }); + } + + public void setFilterData(Selection selection, Class teType, ItemStack filter) { + modifyTileNBT(selection, teType, nbt -> { + nbt.put("Filter", filter.serializeNBT()); + }); + } + + public void modifyTileNBT(Selection selection, Class teType, + Consumer consumer) { + modifyTileNBT(selection, teType, consumer, false); + } + + public void modifyTileNBT(Selection selection, Class teType, + Consumer consumer, boolean reDrawBlocks) { + addInstruction(new TileEntityDataInstruction(selection, teType, nbt -> { + consumer.accept(nbt); return nbt; - }, false)); + }, reDrawBlocks)); } public void flapFunnels(Selection selection, boolean outward) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java index d477d8100..1ca756fda 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; @@ -12,12 +15,18 @@ import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.Pointing; import net.minecraft.block.Blocks; +import net.minecraft.block.LeverBlock; +import net.minecraft.block.RedstoneWireBlock; import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraftforge.items.ItemHandlerHelper; public class FunnelScenes { @@ -120,7 +129,7 @@ public class FunnelScenes { // Placing funnels without sneak scene.world.showSection(topFunnelSelection, Direction.DOWN); scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "regular_place", - "Placed normally, it pull items from the inventory.", 80); + "Placed normally, it pulls items from the inventory.", 80); scene.idle(45); ElementLink itemLink = @@ -138,7 +147,7 @@ public class FunnelScenes { scene.world.showSection(topFunnelSelection, Direction.DOWN); scene.overlay.showControls(controlsSneak, 35); scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "sneak_place", - "Placed while sneaking, it will put items into the inventory.", 80); + "Placed while sneaking, it puts items into the inventory.", 80); scene.idle(45); itemLink = scene.world.createItemEntity(topCenter.add(0, 3, 0), util.vector.of(0, -0.2, 0), itemStack); @@ -197,7 +206,7 @@ public class FunnelScenes { BlockPos cogPos = util.grid.at(1, 1, 3); scene.world.showSection(beltFunnelSetup, Direction.DOWN); - scene.overlay.showTargetedText(PonderPalette.WHITE, topOfBeltFunnel, "belt_funnel", + scene.overlay.showTargetedText(PonderPalette.WHITE, topOfBeltFunnel, "belt_funnel_direction", "Funnels on belts will extract/insert depending on its movement direction.", 140); scene.idle(15); @@ -224,11 +233,238 @@ public class FunnelScenes { } } - public static void mounting(SceneBuilder scene, SceneBuildingUtil util) { + public static void compat(SceneBuilder scene, SceneBuildingUtil util) { scene.title("Funnel compatibility"); scene.configureBasePlate(0, 0, 5); + + BlockPos sawFunnel = util.grid.at(4, 2, 1); + BlockPos depotFunnel = util.grid.at(2, 2, 2); + BlockPos drainFunnel = util.grid.at(0, 2, 3); + scene.world.showSection(util.select.layer(0), Direction.UP); + Selection firstShow = util.select.layer(1) + .add(util.select.position(sawFunnel.south())) + .add(util.select.position(depotFunnel.south())) + .add(util.select.position(drainFunnel.south())); + scene.idle(5); + + scene.world.showSection(firstShow, Direction.DOWN); + + scene.idle(8); + scene.overlay.showText(PonderPalette.WHITE, 0, "funnels_compat", + "Funnels should also interact nicely with a handful of other components.", 360); + scene.idle(40); + + scene.world.showSection(util.select.position(sawFunnel), Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.BLUE, util.vector.centerOf(sawFunnel.down()), "saws", + "Vertical Saws", 40); + scene.idle(8); + scene.world.createItemOnBeltLike(sawFunnel.down(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG)); + scene.idle(40); + + scene.world.showSection(util.select.position(depotFunnel), Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.BLUE, util.vector.centerOf(depotFunnel.down()), "depots", + "Depots", 40); + scene.idle(8); + scene.world.createItemOnBeltLike(depotFunnel.down(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE)); + scene.idle(40); + + scene.world.showSection(util.select.position(drainFunnel), Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.BLUE, util.vector.centerOf(drainFunnel.down()), "drains", + "Item Drains", 40); + scene.idle(8); + scene.world.createItemOnBeltLike(drainFunnel.down(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET)); + scene.idle(40); + + scene.markAsFinished(); + } + + public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Redstone control"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + + ItemStack itemStack = AllBlocks.BRASS_BLOCK.asStack(); + Vec3d topItemSpawn = util.vector.centerOf(3, 6, 2); + ElementLink lastItemEntity = null; + + BlockPos lever = util.grid.at(1, 2, 2); + BlockPos redstone = util.grid.at(2, 2, 2); + BlockPos funnel = util.grid.at(3, 2, 2); + + AxisAlignedBB redstoneBB = new AxisAlignedBB(funnel).grow(-1 / 16f, -6 / 16f, -1 / 16f) + .offset(0, -5 / 16f, 0); + + for (int i = 0; i < 4; i++) { + if (lastItemEntity != null) + scene.world.modifyEntity(lastItemEntity, Entity::remove); + lastItemEntity = scene.world.createItemEntity(topItemSpawn, util.vector.of(0, -0.2, 0), itemStack); + scene.idle(8); + + if (i == 3) { + scene.world.modifyBlock(lever, s -> s.cycle(LeverBlock.POWERED), false); + scene.world.modifyBlock(redstone, s -> s.with(RedstoneWireBlock.POWER, 15), false); + scene.world.modifyBlock(funnel, s -> s.cycle(FunnelBlock.POWERED), false); + scene.effects.indicateRedstone(lever); + scene.idle(4); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, funnel, redstoneBB, 80); + scene.overlay.showTargetedText(PonderPalette.RED, util.vector.blockSurface(funnel, Direction.DOWN), + "redstone_prevents", "Redstone power will prevent any funnel from acting.", 80); + } else { + scene.idle(4); + } + } } + public static void brass(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("The Brass Funnel"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos firstDepot = util.grid.at(3, 1, 1); + BlockPos secondDepot = util.grid.at(1, 1, 1); + Selection depots = util.select.fromTo(firstDepot, secondDepot); + Selection beltAndStuff = util.select.fromTo(0, 1, 2, 4, 1, 2) + .add(util.select.fromTo(0, 1, 3, 0, 2, 5)); + Selection withoutBelt = util.select.layersFrom(1) + .substract(beltAndStuff) + .substract(depots); + + scene.world.showSection(withoutBelt, Direction.DOWN); + ElementLink independentSection = + scene.world.showIndependentSection(depots, Direction.DOWN); + scene.world.moveSection(independentSection, util.vector.of(0, 0, 1), 0); + + BlockPos andesiteFunnel = util.grid.at(3, 2, 2); + BlockPos brassFunnel = util.grid.at(1, 2, 2); + ItemStack itemStack = AllItems.BRASS_INGOT.asStack(); + scene.idle(10); + + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, util.vector.topOf(andesiteFunnel), "andesite", + "Andesite Funnels can only ever extract single items.", 60); + scene.idle(10); + scene.world.createItemOnBeltLike(andesiteFunnel.down() + .north(), Direction.SOUTH, itemStack); + scene.world.flapFunnels(util.select.position(andesiteFunnel), true); + scene.idle(60); + + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, util.vector.topOf(brassFunnel), "brass", + "Brass Funnels can extract up to a full stack.", 60); + scene.idle(10); + scene.world.createItemOnBeltLike(brassFunnel.down() + .north(), Direction.SOUTH, ItemHandlerHelper.copyStackWithSize(itemStack, 64)); + scene.world.flapFunnels(util.select.position(brassFunnel), true); + scene.idle(60); + + AxisAlignedBB filterSlot = new AxisAlignedBB(brassFunnel).grow(-.35, -.35, -.35) + .offset(0, 0.2, 0); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).scroll(), 60); + scene.idle(10); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, filterSlot.getCenter(), "scroll_filter", + "Scrolling on the filter slot allows for precise control over the extracted stack size.", 80); + scene.idle(90); + + // belt + scene.world.hideIndependentSection(independentSection, Direction.NORTH); + scene.world.hideSection(util.select.position(brassFunnel), Direction.UP); + scene.idle(20); + + scene.world.modifyBlock(brassFunnel, s -> s.cycle(BeltFunnelBlock.SHAPE), false); + scene.world.showSection(util.select.position(brassFunnel), Direction.DOWN); + scene.world.showSection(beltAndStuff, Direction.SOUTH); + scene.idle(10); + + ItemStack dirt = new ItemStack(Items.DIRT); + ItemStack gravel = new ItemStack(Items.GRAVEL); + ItemStack emerald = new ItemStack(Items.EMERALD); + + for (int i = 0; i < 14; i++) { + + if (i < 12) + scene.world.createItemOnBelt(andesiteFunnel.down(), Direction.SOUTH, + i % 3 == 0 ? dirt : i % 3 == 1 ? gravel : emerald); + scene.idle(10); + + if (i > 0 && (i < 3 || i % 3 == 0)) { + scene.world.removeItemsFromBelt(brassFunnel.down()); + scene.world.flapFunnels(util.select.position(brassFunnel), false); + } + + scene.world.modifyEntities(ItemEntity.class, e -> { + if (e.getY() < 1) + e.remove(); + }); + + if (i == 2) { + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).rightClick() + .withItem(emerald), 60); + scene.idle(10); + scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, filterSlot.getCenter(), "item_filter", + "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", 80); + scene.world.setFilterData(util.select.position(brassFunnel), FunnelTileEntity.class, emerald); + } else + scene.idle(10); + + if (i == 8) + scene.markAsFinished(); + } + } + + public static void transposer(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Direct transfer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos funnelPos = util.grid.at(2, 2, 2); + Selection funnelSelect = util.select.position(funnelPos); + + ElementLink rightChest = + scene.world.showIndependentSection(util.select.position(0, 2, 2), Direction.DOWN); + ElementLink leftChest = + scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); + scene.world.moveSection(rightChest, util.vector.of(2, 1, 0), 0); + scene.world.moveSection(leftChest, util.vector.of(-2, -1, 0), 0); + scene.idle(5); + + scene.world.showSection(funnelSelect, Direction.DOWN); + scene.idle(20); + + scene.overlay.showSelectionWithTextNearScene(PonderPalette.RED, funnelSelect, "cant_transpose", + "Funnels cannot ever transfer between closed inventories directly.", 40); + scene.idle(50); + + scene.world.hideSection(funnelSelect, Direction.SOUTH); + scene.idle(20); + + scene.world.setBlocks(funnelSelect, AllBlocks.CHUTE.getDefaultState(), false); + scene.world.showSection(funnelSelect, Direction.NORTH); + scene.idle(10); + + scene.overlay.showTargetedTextNearScene(PonderPalette.GREEN, util.vector.centerOf(funnelPos), "chute_is_better", + "Chutes or Smart chutes might be more suitable for such purposes.", 40); + scene.idle(50); + + scene.world.hideSection(funnelSelect, Direction.UP); + scene.world.hideIndependentSection(leftChest, Direction.UP); + scene.world.hideIndependentSection(rightChest, Direction.UP); + scene.idle(20); + + Selection belt = util.select.layer(1); + scene.world.setBlocks(funnelSelect, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(belt, Direction.DOWN); + scene.world.showSection(util.select.fromTo(0, 2, 2, 4, 2, 2), Direction.DOWN); + scene.overlay.showTargetedTextNearScene(PonderPalette.GREEN, util.vector.topOf(1, 2, 2), "belt_is_better", + "Same applies for horizontal movement.\nA mechanical belt should help here.", 120); + + scene.markAsFinished(); + } + } 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 79a49ba66..1dd3ee9a0 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 @@ -16,14 +16,16 @@ public class PonderIndex { .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); + // Funnels + PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) .addStoryBoard("funnels/intro", FunnelScenes::intro) .addStoryBoard("funnels/direction", FunnelScenes::directionality) - .addStoryBoard("funnels/mounting", FunnelScenes::mounting); - // redstone - // brass vs andesite - // arm compat? - + .addStoryBoard("funnels/compat", FunnelScenes::compat) + .addStoryBoard("funnels/redstone", FunnelScenes::redstone) + .addStoryBoard("funnels/transposer", FunnelScenes::transposer); + PonderRegistry.addStoryBoard(AllBlocks.ANDESITE_FUNNEL, "funnels/brass", FunnelScenes::brass); + // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) DebugScenes.registerAll(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index 185328f5e..6ad6a0e68 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -134,16 +134,20 @@ public class WorldSectionElement extends AnimatedSceneElement { section = null; } - public void setAnimatedRotation(Vec3d eulerAngles) { + public void setAnimatedRotation(Vec3d eulerAngles, boolean force) { this.animatedRotation = eulerAngles; + if (force) + prevAnimatedRotation = animatedRotation; } public Vec3d getAnimatedRotation() { return animatedRotation; } - public void setAnimatedOffset(Vec3d offset) { + public void setAnimatedOffset(Vec3d offset, boolean force) { this.animatedOffset = offset; + if (force) + prevAnimatedOffset = animatedOffset; } public Vec3d getAnimatedOffset() { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java index 5b67ebb56..9fda1e459 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java @@ -22,12 +22,12 @@ public class AnimateWorldSectionInstruction extends TickingInstruction { public static AnimateWorldSectionInstruction rotate(ElementLink link, Vec3d rotation, int ticks) { - return new AnimateWorldSectionInstruction(link, rotation, ticks, WorldSectionElement::setAnimatedRotation, - WorldSectionElement::getAnimatedRotation); + return new AnimateWorldSectionInstruction(link, rotation, ticks, + (wse, v) -> wse.setAnimatedRotation(v, ticks == 0), WorldSectionElement::getAnimatedRotation); } public static AnimateWorldSectionInstruction move(ElementLink link, Vec3d offset, int ticks) { - return new AnimateWorldSectionInstruction(link, offset, ticks, WorldSectionElement::setAnimatedOffset, + return new AnimateWorldSectionInstruction(link, offset, ticks, (wse, v) -> wse.setAnimatedOffset(v, ticks == 0), WorldSectionElement::getAnimatedOffset); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index 484fb6de8..ebcc0329a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -18,13 +18,15 @@ public class TextInstruction extends FadeInOutInstruction { super(duration); } - public TextInstruction(int color, Supplier text, int duration, Selection selection) { + public TextInstruction(int color, Supplier text, int duration, Selection selection, boolean near) { this(color, text, duration); element = new TextWindowElement(text).pointAt(selection.getCenter()); element.colored(color); outline = new OutlinerElement(o -> selection.makeOutline(o) .lineWidth(1 / 16f) .colored(color)); + if (near) + element.placeNearTarget(); } public TextInstruction(int color, Supplier text, int duration, Vec3d position, boolean near) { diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java index a40427a62..57d2c92b0 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -23,6 +23,9 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka private int lazyTickRate; private int lazyTickCounter; + // Used for simulating this TE in a client-only setting + private boolean virtualMode; + public SmartTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); behaviours = new HashMap<>(); @@ -148,13 +151,21 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka return (T) behaviours.get(type); return null; } - + protected boolean isItemHandlerCap(Capability cap) { return cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY; } - + protected boolean isFluidHandlerCap(Capability cap) { return cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY; } + + public void markVirtual() { + virtualMode = true; + } + + public boolean isVirtual() { + return virtualMode; + } } diff --git a/src/main/resources/assets/create/models/block/funnel/block_vertical_filterless.json b/src/main/resources/assets/create/models/block/funnel/block_vertical_filterless.json new file mode 100644 index 000000000..ca31358f9 --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block_vertical_filterless.json @@ -0,0 +1,168 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "3": "create:block/brass_funnel_back", + "5": "create:block/brass_funnel_tall", + "7": "create:block/brass_funnel_plating", + "8": "create:block/brass_storage_block", + "9": "create:block/brass_funnel_slope", + "10": "create:block/funnel_closed", + "2_2": "create:block/brass_funnel_pull" + }, + "elements": [ + { + "name": "LeftWall", + "from": [0, 4, 0], + "to": [2, 10, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]}, + "faces": { + "north": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, + "south": {"uv": [0, 0, 2, 6], "texture": "#2_2"}, + "west": {"uv": [0, 0, 16, 6], "texture": "#2_2"}, + "up": {"uv": [0, 0, 2, 16], "texture": "#8"}, + "down": {"uv": [0, 0, 16, 2], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "LeftWall", + "from": [14, 4, 0], + "to": [16, 10, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]}, + "faces": { + "north": {"uv": [2, 0, 0, 6], "rotation": 180, "texture": "#2_2"}, + "east": {"uv": [0, 6, 16, 0], "rotation": 180, "texture": "#2_2"}, + "south": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, + "up": {"uv": [14, 0, 16, 16], "texture": "#8"}, + "down": {"uv": [0, 14, 16, 16], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "Top", + "from": [2, 4, 0], + "to": [14, 10, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 2]}, + "faces": { + "north": {"uv": [2, 0, 14, 6], "texture": "#2_2"}, + "up": {"uv": [2, 0, 14, 2], "texture": "#8"}, + "down": {"uv": [0, 2, 2, 14], "rotation": 270, "texture": "#8"} + } + }, + { + "name": "Top", + "from": [2, 4, 14], + "to": [14, 10, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4, 18]}, + "faces": { + "south": {"uv": [14, 0, 2, 6], "texture": "#2_2"}, + "up": {"uv": [2, 16, 14, 14], "rotation": 180, "texture": "#8"}, + "down": {"uv": [14, 14, 16, 2], "rotation": 270, "texture": "#8"} + } + }, + { + "from": [1, 1, 1], + "to": [15, 4, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [7, -6, 10]}, + "faces": { + "north": {"uv": [1, 0, 15, 3], "texture": "#5"}, + "east": {"uv": [1, 0, 15, 3], "texture": "#5"}, + "south": {"uv": [1, 0, 15, 3], "texture": "#5"}, + "west": {"uv": [1, 0, 15, 3], "texture": "#5"}, + "down": {"uv": [2, 2, 14, 14], "rotation": 270, "texture": "#8"} + } + }, + { + "from": [1, 5, 2], + "to": [2, 10, 14], + "rotation": {"angle": 22.5, "axis": "z", "origin": [2, 10, 8]}, + "faces": { + "east": {"uv": [2, 2, 14, 7], "texture": "#9"} + } + }, + { + "from": [14, 5, 2], + "to": [15, 10, 14], + "rotation": {"angle": -22.5, "axis": "z", "origin": [14, 10, 8]}, + "faces": { + "west": {"uv": [2, 2, 14, 7], "texture": "#9"} + } + }, + { + "from": [2, 5, 14], + "to": [14, 10, 15], + "rotation": {"angle": 22.5, "axis": "x", "origin": [8, 10, 14]}, + "faces": { + "north": {"uv": [2, 2, 14, 7], "texture": "#9"} + } + }, + { + "from": [2, 5, 1], + "to": [14, 10, 2], + "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 10, 2]}, + "faces": { + "south": {"uv": [2, 2, 14, 7], "texture": "#9"} + } + }, + { + "from": [3, 5, 3], + "to": [13, 6, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [11, 13, 11]}, + "faces": { + "up": {"uv": [3, 3, 13, 13], "texture": "#10"} + } + }, + { + "name": "Back", + "from": [1.95, -1.95, 1.95], + "to": [14.05, 2, 14.05], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0.025, 8]}, + "faces": { + "north": {"uv": [2, 12, 14, 16], "texture": "#9"}, + "east": {"uv": [2, 12, 14, 16], "texture": "#9"}, + "south": {"uv": [2, 12, 14, 16], "texture": "#9"}, + "west": {"uv": [2, 12, 14, 16], "texture": "#9"}, + "down": {"uv": [6, 8, 12, 14], "rotation": 180, "texture": "#3"} + } + }, + { + "name": "Back", + "from": [2.1, 2, 2.05], + "to": [13.9, 4.1, 13.1], + "rotation": {"angle": 0, "axis": "y", "origin": [8, -6, 24.1]}, + "faces": { + "east": {"uv": [2.5, 1.5, 8, 0.5], "texture": "#5"}, + "west": {"uv": [2.5, 0.5, 8, 1.5], "rotation": 180, "texture": "#5"} + } + } + ], + "display": {}, + "groups": [ + { + "name": "block_retracted", + "origin": [8, 8, 8], + "children": [ + { + "name": "BeltFunnel", + "origin": [9, -4, 8], + "children": [ + { + "name": "FrontSection", + "origin": [9, -4, 8], + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] + }, + { + "name": "Base", + "origin": [9, -4, 8], + "children": [10, 11] + } + ] + } + ] + }, + { + "name": "Item Filter", + "origin": [8, 0, 8], + "children": [12, 13, 14, 15] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/ponder/funnels/brass.nbt b/src/main/resources/ponder/funnels/brass.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f5dc748bc91be2f4516e5a269a7bc4689014e20b GIT binary patch literal 941 zcmV;e15*4SiwFP!000000L@p;Zrer>9&$;FqGTk8v?$PHniS|8#Fy4lT2w$`2XI?7 zxd>}Hf8i_{NI%WH#%y#PUpocU(vo7tIV0?>s(XP3wTz+NF; z0bNlSViYDb8EUYr3(;9F$LBhsKR%}0{h8rw3wq?8q8LuYeJK!(}oWKF6 zTHYQUuR*4c<2&Fm2b{nGr&_)P&%OiC`*4^8PT+vEPK5){%z@{9ILrYjaKQ1(Yg@)| zuyvPAwE~BH1rGVzhr=9jf<~MKm^d>r_*n}5u|j%&m|`JK0{xSPDHi7aVlqL+AULH? zK^k!v!lA*rF7cY#+pc8Rx)rv^N(kX;ftbF(mU($hKlSy4zlxM3t;$fO_|;O8Kr)cR zD4FNhxc3h|?9=@d-4E&hneMM4hG@WbCZ-S^pB(?1Ky)e>YK)~qTvPag%=U+R15B<( zf1sF}8NCe?=p3V2N_8GWJm3W%XXfJfD;q!+d=h{^OeyuhfM2`|$(~WDwT%c?B=$-Y z&oDO)b!WNR-j~7sxnYmO&FiP-#%tgvygxU7E8KLS7dL)8+<2{UlRPhOSUcQ6E8O(% z;>No-HzD+n(iGDbCqG}=j&TpR66g-a7dkOYb+Oa8JvjI%HJu~B;E77fv!;PuCpIdH zW$^M(#f7H1Fpx4&Z zj!zasVBXLm{F*As9ehn>oFdEx~)&j@DBXRupHjaY^j;lESyL$3CshXMz@ZF|Hm$S^^Xe9Gyd>Xl^wq=3*XmEV2_dBk|b3wr_(J%0soq5@Gfr@4LLBm z!9*j(u4{y2F39!BrX}B$@{NZ4An&SensYU^`(?VE;X@;RQDUu881z1H!~aI5Gf8tk P{ullS86ZczFcSa(@>Ryy literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/funnels/compat.nbt b/src/main/resources/ponder/funnels/compat.nbt new file mode 100644 index 0000000000000000000000000000000000000000..73e10aa154911c94d35ea85a64efa0235fac6ca3 GIT binary patch literal 939 zcmV;c162GUiwFP!000000L50@ZsRr(9o=k6$u=p_?k>;|=r?R0ie|kC8eowYjk{?3 zVldL!CL)spNv)DT<*W9!?VojMNtWU&F0m*O0s4B2~2JZnceD?UcOBrD5dT;?M48RHq2nVV`$@z*m!$3z5`C+fD=04bi+G< z7{sQmeO+?hTD>Li2ahGNaDUvhI>Hv;@#*CMEDRR7Ps3n);BQ;5>?mc*M zUX}&NyfK0ZzM%AE1jof{&Nuic`HLWJmhFdaf$i9(2}G9$H@cNz{16SBLog!BmG;g*v1jS>0B|Pm#Ah^7P+j2b?;aJBem9U zXqhi7A+Q+9tG~x5+RN+T56_<0S1x(AW7uRTZ5)lG&5o|yjy+QW{J`NL~r*qt1ppHN$nDqy?VzmSyE%6 z&wf?LaLVquUa&%n)ndsN1rQol^&Y!+vcYW41kYHppkLQMWR?v@|*J|_Zk4Vj6llqi!2oHMuzGA= z{Vi1S=4}bGb72ZPE(v)cO*lrJYqA+lcA*grj%08YgEOscfs@T>E;)k1kqnMvaKu>C zxkg;+OEA0;3@?^AlEG07PBw0_(3fCnjI^!!O0~Yl$Nn95u_S zK-x!=@bZh-HZ&=-t8@Ak^XFuz1yV+ zDRK;`J;p?L&E8sUXZkvLe^!qi>nS1sNVppgsDbt3l)Tjv`G1^M zHq~`j&njweI^7}>rlb3&0QE`l5Z;_p_gh2wP&*spF=$e}Iw^v6{lnq>KfZlER-)}1 z!y#S=V>hwG>a%wp`t<84Vs6)?$2H`QZUYvuYIL1+xpkhl1yuN*ysjxdQ{?w}J;T`a zMTXlxihS!fn}sZjesl<`#fFajzubK~IQM3=<&&=tMeMsjCo%~BIT8uC?=|VK=!0?b QLo0s4ZzppOk=zFW0AU>C*#H0l diff --git a/src/main/resources/ponder/funnels/redstone.nbt b/src/main/resources/ponder/funnels/redstone.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f30d0417f84ddb88bc0e30d08842d55642346ec3 GIT binary patch literal 506 zcmVId`lSy)&uT*Xd8NZ~)f|8$1!Rsbb%Cx0UYfZ@vKdkF<Gj1b|0orqy%^js z2142dvU_vZlz7Usi|qYrc(7D-TU+!-ckNkgRDpWZRXse=?X@NgbbGDIy=K=5g+w?U zfV%?tXK_M!vuvS1O2U0@v@g;p&5De5a}})^uox z1Gs>j-ixd8Aa6xIXftgr9X*kLbqM*8uNMC&Q(U2Uo$1jAu<5xgpu(SI zMNOm6DEN2j(^OV`?s4dIl`(e1Epz5f$57P@f1rIrMd7!?wb7n2<<6_I9rKF!!=C+r wTr<2H-645*^?AMc_^KTFoP94X`Y++;gCOw@t&_%oyu}~*3pG-pXf6i;0Ps!yod5s; literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/funnels/transposer.nbt b/src/main/resources/ponder/funnels/transposer.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fd13cd84c4bc4c8f8698502596b7d5d8eb1c2683 GIT binary patch literal 882 zcmV-&1C9J2iwFP!000000L@oTPuoBc9e?9Z`Y!C=mvK;K$H*enacyI*J1Yf0>=mCH^0y=y;!X`A3 z>r|(xz^o>OCz*&(RYZSmH^Iw=DmP7+2Z7Q|W3gjC#;J*MDlx7Fj%R`6Ti}$-S%Tx# z#8h!y3mne^$G5;KmusQ3YoYTp9M1yBx4?md(|n9ugL7NV)KUw-JPW^;;dmA}z6DOX zd<(yP3%{1(cosN*Elva;KhXgMM>%5halCJ2(15VbRLXnccMdwABM6VgP{vqnaBggHV0~ZBfQfSW4S7%Z z4gCn#I;clNo(9lpvz*1LzW91&3iFTX1x7IqAKd+fetZBo-w7z6mZ+4eh{(8U0rmBszvNi#<_L2mXi6-x_Om!=$ z6+v^KpV71w@}f!QY8*^vrUM&?LeUI8!vmQRv%03O3L6x{UPGEB-5jJGW68RDH}0dV z+60AF^Jrm#=E2r?$++sGYzvVkV#FtogkRE3qnsqzm?dB-(GA*S$hAZ0>yxm(fw?ea zv{A^=9deFYO-ohztUV$hw}wyS5&3vEe42N5-(TYXZB2SFFOcU&ttuVl86KY!Tb;(Y zweQQOX~P{_2_k!V|b^iV|&p*Ou<|ot*7TlwT^{;%-69_F>5)? zP-`^bH5(0@Ic$LNa@K33eyZ^}7My6%rZVE$EJATHIv#%LST%C66t?3woKjrw?3I-3R76vczqC#Km?lqwZ8=o^3GKO>sz IJqr;40CrEP2><{9 literal 0 HcmV?d00001 From 2e1129a3a50e97681ef1e2956838c920540a73d4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 2 Mar 2021 05:53:43 +0100 Subject: [PATCH 15/23] Thinking about Gantries - Added Ponder entries for gantry shafts and carriages - Added ability to mark lang key prefixes as ignored, leaving out 'dev-only' lang entries from the localization templates - Gantry Pinion -> Gantry Carriage - Scenes can now be "re-assembled" by their storyboard while Ponder is opened using shift+refresh - removed the requirement of editor provided lang keys for text windows - couple fixes, changes to instructions --- src/generated/resources/.cache/cache | 38 +-- ...antry_pinion.json => gantry_carriage.json} | 24 +- .../resources/assets/create/lang/en_ud.json | 2 +- .../resources/assets/create/lang/en_us.json | 156 +++++++--- .../assets/create/lang/unfinished/de_de.json | 158 +++++++--- .../assets/create/lang/unfinished/es_es.json | 158 +++++++--- .../assets/create/lang/unfinished/es_mx.json | 158 +++++++--- .../assets/create/lang/unfinished/fr_fr.json | 158 +++++++--- .../assets/create/lang/unfinished/it_it.json | 158 +++++++--- .../assets/create/lang/unfinished/ja_jp.json | 158 +++++++--- .../assets/create/lang/unfinished/ko_kr.json | 158 +++++++--- .../assets/create/lang/unfinished/nl_nl.json | 158 +++++++--- .../assets/create/lang/unfinished/pt_br.json | 158 +++++++--- .../assets/create/lang/unfinished/ru_ru.json | 158 +++++++--- .../assets/create/lang/unfinished/zh_cn.json | 158 +++++++--- .../assets/create/lang/unfinished/zh_tw.json | 158 +++++++--- .../create/models/item/gantry_carriage.json | 3 + .../create/models/item/gantry_pinion.json | 3 - ...antry_pinion.json => gantry_carriage.json} | 4 +- ...antry_pinion.json => gantry_carriage.json} | 2 +- ...antry_pinion.json => gantry_carriage.json} | 2 +- .../com/simibubi/create/AllBlockPartials.java | 2 +- .../java/com/simibubi/create/AllBlocks.java | 6 +- .../com/simibubi/create/AllTileEntities.java | 12 +- .../structureMovement/Contraption.java | 8 +- ...ionBlock.java => GantryCarriageBlock.java} | 12 +- ...derer.java => GantryCarriageRenderer.java} | 8 +- ...ity.java => GantryCarriageTileEntity.java} | 14 +- .../gantry/GantryContraption.java | 2 +- .../particle/RotationIndicatorParticle.java | 2 + .../relays/advanced/GantryShaftBlock.java | 10 + .../advanced/GantryShaftTileEntity.java | 24 +- .../foundation/data/AllLangPartials.java | 2 +- .../create/foundation/data/LangMerger.java | 23 +- .../data/recipe/StandardRecipeGen.java | 2 +- .../foundation/ponder/PonderLocalization.java | 11 +- .../create/foundation/ponder/PonderScene.java | 20 +- .../create/foundation/ponder/PonderUI.java | 19 +- .../foundation/ponder/SceneBuilder.java | 77 ++--- .../ponder/content/DebugScenes.java | 81 +++-- .../ponder/content/FunnelScenes.java | 111 ++++--- .../ponder/content/GantryScenes.java | 292 ++++++++++++++++++ .../ponder/content/KineticsScenes.java | 12 +- .../ponder/content/PonderIndex.java | 8 + .../foundation/ponder/content/SharedText.java | 2 + .../ponder/elements/OutlinerElement.java | 17 +- .../ponder/elements/TextWindowElement.java | 84 +++-- .../ponder/elements/WorldSectionElement.java | 6 +- .../DisplayWorldSectionInstruction.java | 20 +- .../ponder/instructions/TextInstruction.java | 35 +-- .../instructions/WorldModifyInstruction.java | 2 +- .../horizontal.json | 0 .../item.json | 0 .../vertical.json | 0 .../wheels.json | 0 .../resources/ponder/gantry/direction.nbt | Bin 0 -> 819 bytes src/main/resources/ponder/gantry/intro.nbt | Bin 0 -> 708 bytes src/main/resources/ponder/gantry/redstone.nbt | Bin 0 -> 718 bytes .../resources/ponder/gantry/subgantry.nbt | Bin 0 -> 716 bytes 59 files changed, 2134 insertions(+), 920 deletions(-) rename src/generated/resources/assets/create/blockstates/{gantry_pinion.json => gantry_carriage.json} (53%) create mode 100644 src/generated/resources/assets/create/models/item/gantry_carriage.json delete mode 100644 src/generated/resources/assets/create/models/item/gantry_pinion.json rename src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/{gantry_pinion.json => gantry_carriage.json} (81%) rename src/generated/resources/data/create/loot_tables/blocks/{gantry_pinion.json => gantry_carriage.json} (86%) rename src/generated/resources/data/create/recipes/crafting/kinetics/{gantry_pinion.json => gantry_carriage.json} (89%) rename src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/{GantryPinionBlock.java => GantryCarriageBlock.java} (91%) rename src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/{GantryPinionRenderer.java => GantryCarriageRenderer.java} (90%) rename src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/{GantryPinionTileEntity.java => GantryCarriageTileEntity.java} (91%) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java rename src/main/resources/assets/create/models/block/{gantry_pinion => gantry_carriage}/horizontal.json (100%) rename src/main/resources/assets/create/models/block/{gantry_pinion => gantry_carriage}/item.json (100%) rename src/main/resources/assets/create/models/block/{gantry_pinion => gantry_carriage}/vertical.json (100%) rename src/main/resources/assets/create/models/block/{gantry_pinion => gantry_carriage}/wheels.json (100%) create mode 100644 src/main/resources/ponder/gantry/direction.nbt create mode 100644 src/main/resources/ponder/gantry/intro.nbt create mode 100644 src/main/resources/ponder/gantry/redstone.nbt create mode 100644 src/main/resources/ponder/gantry/subgantry.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e4ec0acbe..22ff97d25 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -157,7 +157,7 @@ afff479c0e5284771afa9e7ce513595fe65860ee assets/create/blockstates/gabbro_cobble a1f31a194129cfb65e335b3b96490f9275f9c564 assets/create/blockstates/gabbro_cobblestone_stairs.json a64d8d0924c0b5b192f355343dd9b3a440875f6a assets/create/blockstates/gabbro_cobblestone_wall.json a6b44e8a1c4ce0c7442b2384b41ad36dd133f19b assets/create/blockstates/gabbro_pillar.json -2d7ffcb339b0a38b98935a382ac2a164866255b1 assets/create/blockstates/gantry_pinion.json +23744450886af88ed468aecbbd7b8d7babcbbd6f assets/create/blockstates/gantry_carriage.json 9fa39a44bba30c5ae8fa245b122a837c705462b4 assets/create/blockstates/gantry_shaft.json eca1f0e56efdadb241f42dc6ebb036f1d52213a9 assets/create/blockstates/gearbox.json f34814b17cde3231a1dfb271f3dabf8d6de4fbf6 assets/create/blockstates/gearshift.json @@ -400,20 +400,20 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 6801fa1f466f172700e573e5b8ee8ee5f9ca4583 assets/create/blockstates/yellow_valve_handle.json 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json -e3f618c5b622d21880de858678d1802cbf65e615 assets/create/lang/en_ud.json -07eaea807200c157af29adbbc411d2a80b9cade5 assets/create/lang/en_us.json -3f89caaa4c6ac34222ebd1d5577139c18a9aa6b8 assets/create/lang/unfinished/de_de.json -591db95e6cd9e9f3f106ef4dc1f9ce475edee4df assets/create/lang/unfinished/es_es.json -ee7da78e00b92e5fde92c8ad8b25627bb7f478c7 assets/create/lang/unfinished/es_mx.json -3b604e06a29ddac65e71e4b853e88066496b3118 assets/create/lang/unfinished/fr_fr.json -d50db792720189290b382537f2703d08feab7f52 assets/create/lang/unfinished/it_it.json -2969a487f270d80969d69a5f76cef7e1b41c5c9e assets/create/lang/unfinished/ja_jp.json -5df95bcadb862b4522439ea66dc28a018771562b assets/create/lang/unfinished/ko_kr.json -9f65db261fdda1c22691b5238a8327d7aabcb912 assets/create/lang/unfinished/nl_nl.json -1864077ccca4c023e5bee33a3b1efe9ccdcaad28 assets/create/lang/unfinished/pt_br.json -1559765f5d8f1361e1a78680c60dd16ac5111259 assets/create/lang/unfinished/ru_ru.json -7b9680e0d83fdd4749418e54342fa567b4e2ea6b assets/create/lang/unfinished/zh_cn.json -ea077d3e3141001ebe3fb2cda60276ac21647a1f assets/create/lang/unfinished/zh_tw.json +2384c6457ecf24c7b38358179b8fa6eb93b9627a assets/create/lang/en_ud.json +569b3aaadf1e5c5849692c4e918dc762edd9a316 assets/create/lang/en_us.json +70a747f3639180da9cba1b8747fb19dacb1e9619 assets/create/lang/unfinished/de_de.json +610b1e766bc338d38906a160908cdb79e0d3bc54 assets/create/lang/unfinished/es_es.json +8eff0c23695d3e8c26d1265a82324242a9762226 assets/create/lang/unfinished/es_mx.json +fb150f105517632023265602cfc3c948be932917 assets/create/lang/unfinished/fr_fr.json +09111dedc02d6803134a8276ec481abcaa0e00c7 assets/create/lang/unfinished/it_it.json +c1f6faed7efb6f224aec7563b0ac6b891bc780d4 assets/create/lang/unfinished/ja_jp.json +c6139e7280236adcd136d40a94cd1cb708d402c6 assets/create/lang/unfinished/ko_kr.json +bb3fda881575df3ae26921edc3f4a3e2ecbc6ccd assets/create/lang/unfinished/nl_nl.json +8915f0902e59c1bbfb2c16e43e2ce62b3d616e0d assets/create/lang/unfinished/pt_br.json +ad8d2b7c8c7f3ac584218c33f86ba67c1873b7fc assets/create/lang/unfinished/ru_ru.json +e549baab96828524fc4694355546c685859956d6 assets/create/lang/unfinished/zh_cn.json +2506abb1c796aad920e803a8e1427908c5b115c1 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 @@ -1325,7 +1325,7 @@ b10971277417369f421324b28f0a4b47ce4c8625 assets/create/models/item/gabbro_bricks b3d7398dbc16c450928bd76b772c273382687447 assets/create/models/item/gabbro_cobblestone_stairs.json 5680f24b43838cb6632bfcedba282a244bd24db0 assets/create/models/item/gabbro_cobblestone_wall.json 20950b692eecfccd77d96678bb3d909d51f6d787 assets/create/models/item/gabbro_pillar.json -b10f1b188f2bf380628377bd42af2b8f8ffe5611 assets/create/models/item/gantry_pinion.json +a642f570ec8223c066e542f062aff3b7f93e002b assets/create/models/item/gantry_carriage.json b4bfd5041b62f3a0a955fa4872d178b590614f22 assets/create/models/item/gantry_shaft.json 6ab0d17f3d02678ed992e188ff09f6b2c00b5b03 assets/create/models/item/gearbox.json 2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.json @@ -1738,7 +1738,7 @@ b42213bffce4e51618e1bba481959208d247c120 data/create/advancements/recipes/create 11d89eca0ccb0f1a8cd27acc9fc0c10d7bf83285 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_pipe.json a2b33e972c7130cbf105f34d88dd7a9a53d5465c data/create/advancements/recipes/create.base/crafting/kinetics/fluid_tank.json a91b11ae44d9b1f479c6dee1f1a4580104059287 data/create/advancements/recipes/create.base/crafting/kinetics/fluid_valve.json -e17c45fc17e1a8e1e618b6eae02fa0aba3247495 data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json +b2a73fc7e0e4e764c2af400a6e093c2d78d7d37d data/create/advancements/recipes/create.base/crafting/kinetics/gantry_carriage.json d1d2fc2f5c4e89393808c65e015917eabb50dffe data/create/advancements/recipes/create.base/crafting/kinetics/gantry_shaft.json dae9e65a089955c0367dc1453e104c3153ebad79 data/create/advancements/recipes/create.base/crafting/kinetics/gearbox.json 8f9819912605cb2499cb3e79ecb0e709b0e38c19 data/create/advancements/recipes/create.base/crafting/kinetics/gearboxfrom_conversion.json @@ -2448,7 +2448,7 @@ e51893e1601c470da466b35b17251238e15d0361 data/create/loot_tables/blocks/gabbro_b 54879fe6ca3b7271fbb94ec26bef1c3031942d4d data/create/loot_tables/blocks/gabbro_cobblestone_stairs.json ae19749df10663efc51b8b27af310164f250ed38 data/create/loot_tables/blocks/gabbro_cobblestone_wall.json e8d09c919e3b8125d7da0f38383c01bcfc61c7a8 data/create/loot_tables/blocks/gabbro_pillar.json -04e42ba63002ed8ba67780123413f6ff3fb85b02 data/create/loot_tables/blocks/gantry_pinion.json +0ea37ff1af6c6a884670cd12ff1d8fdf223519c5 data/create/loot_tables/blocks/gantry_carriage.json f2883656e417a78e5e4093002eb1e36ffa1157e9 data/create/loot_tables/blocks/gantry_shaft.json b0109b4a4f0f738cbbe6b5911e8c3c0310b76f99 data/create/loot_tables/blocks/gearbox.json 5f39461c5c9d3ad8d84195b06b9468fe2b0fb269 data/create/loot_tables/blocks/gearshift.json @@ -2797,7 +2797,7 @@ f4ae37f736d06ccda5fbba7831a7a174ec916a05 data/create/recipes/crafting/kinetics/f 86ad4d2820e8e2b01de8d977af7796119dfb7430 data/create/recipes/crafting/kinetics/fluid_tank.json 3dad2a849796df268cd3a06ed37376f2cc529957 data/create/recipes/crafting/kinetics/fluid_valve.json 84153bd478c0e63a04c77579d6595043f604b7ab data/create/recipes/crafting/kinetics/furnace_minecart_from_contraption_cart.json -5299a12e9272089e64073c8e151b70a5bc57b53c data/create/recipes/crafting/kinetics/gantry_pinion.json +9e75756423b7f9372a2330a7140f80b1b87bd30e data/create/recipes/crafting/kinetics/gantry_carriage.json 21095a156547d4a7d215964be793f1e960b81c09 data/create/recipes/crafting/kinetics/gantry_shaft.json 5eb05cdf88bccdaddfe7ebfbd8b70d1196d422a6 data/create/recipes/crafting/kinetics/gearbox.json b5da8c58f6b8aba525ae8a12ad906db37b78a566 data/create/recipes/crafting/kinetics/gearboxfrom_conversion.json diff --git a/src/generated/resources/assets/create/blockstates/gantry_pinion.json b/src/generated/resources/assets/create/blockstates/gantry_carriage.json similarity index 53% rename from src/generated/resources/assets/create/blockstates/gantry_pinion.json rename to src/generated/resources/assets/create/blockstates/gantry_carriage.json index 1280e18d4..06cac5b0c 100644 --- a/src/generated/resources/assets/create/blockstates/gantry_pinion.json +++ b/src/generated/resources/assets/create/blockstates/gantry_carriage.json @@ -1,51 +1,51 @@ { "variants": { "axis_along_first=false,facing=down": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "x": 270, "y": 90 }, "axis_along_first=true,facing=down": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "x": 270 }, "axis_along_first=false,facing=up": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "x": 90, "y": 90 }, "axis_along_first=true,facing=up": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "x": 90 }, "axis_along_first=false,facing=north": { - "model": "create:block/gantry_pinion/vertical", + "model": "create:block/gantry_carriage/vertical", "y": 180 }, "axis_along_first=true,facing=north": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "y": 180 }, "axis_along_first=false,facing=south": { - "model": "create:block/gantry_pinion/vertical" + "model": "create:block/gantry_carriage/vertical" }, "axis_along_first=true,facing=south": { - "model": "create:block/gantry_pinion/horizontal" + "model": "create:block/gantry_carriage/horizontal" }, "axis_along_first=false,facing=west": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "y": 90 }, "axis_along_first=true,facing=west": { - "model": "create:block/gantry_pinion/vertical", + "model": "create:block/gantry_carriage/vertical", "y": 90 }, "axis_along_first=false,facing=east": { - "model": "create:block/gantry_pinion/horizontal", + "model": "create:block/gantry_carriage/horizontal", "y": 270 }, "axis_along_first=true,facing=east": { - "model": "create:block/gantry_pinion/vertical", + "model": "create:block/gantry_carriage/vertical", "y": 270 } } diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 65c0554be..7f167ccad 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -158,7 +158,7 @@ "block.create.gabbro_cobblestone_stairs": "s\u0279\u0131\u0250\u0287S \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141", "block.create.gabbro_cobblestone_wall": "\u05DF\u05DF\u0250M \u01DDuo\u0287s\u01DD\u05DFqqo\u0186 o\u0279qq\u0250\u2141", "block.create.gabbro_pillar": "\u0279\u0250\u05DF\u05DF\u0131\u0500 o\u0279qq\u0250\u2141", - "block.create.gantry_pinion": "uo\u0131u\u0131\u0500 \u028E\u0279\u0287u\u0250\u2141", + "block.create.gantry_carriage": "\u01DDb\u0250\u0131\u0279\u0279\u0250\u0186 \u028E\u0279\u0287u\u0250\u2141", "block.create.gantry_shaft": "\u0287\u025F\u0250\u0265S \u028E\u0279\u0287u\u0250\u2141", "block.create.gearbox": "xoq\u0279\u0250\u01DD\u2141", "block.create.gearshift": "\u0287\u025F\u0131\u0265s\u0279\u0250\u01DD\u2141", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index b7a9084e2..b3690cb9c 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -161,7 +161,7 @@ "block.create.gabbro_cobblestone_stairs": "Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "Gabbro Pillar", - "block.create.gantry_pinion": "Gantry Pinion", + "block.create.gantry_carriage": "Gantry Carriage", "block.create.gantry_shaft": "Gantry Shaft", "block.create.gearbox": "Gearbox", "block.create.gearshift": "Gearshift", @@ -1801,61 +1801,119 @@ "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "Hold [%1$s] to Ponder", "create.ponder.subject": "Subject of this scene", "create.ponder.pondering": "Pondering about...", "create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.ctrl_and": "Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "Das X axis", - "create.ponder.brass_hand.scene_0.y": "Das Y axis", - "create.ponder.brass_hand.scene_0.z": "Das Z axis", - "create.ponder.brass_hand.scene_0.title": "Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "wut?", - "create.ponder.brass_hand.scene_2.title": "Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "Incoming...", - "create.ponder.brass_hand.scene_4.title": "Emitting particles", - "create.ponder.brass_hand.scene_5.title": "Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "Point of Interest", - "create.ponder.brass_hand.scene_6.title": "Birbs", - "create.ponder.brass_hand.scene_7.seamless": "Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "Sections", - "create.ponder.brass_hand.scene_8.stalling": "Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "Depots", + "create.ponder.brass_funnel.scene_3.text_4": "Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 2bf4d5364..01610abd3 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: 1023", + "_": "Missing Localizations: 1059", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "Gabelsteinbruchstein", "block.create.gabbro_cobblestone_wall": "Gabelsteinbruchstein", "block.create.gabbro_pillar": "Gabelsteinsäule", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Getriebe", "block.create.gearshift": "Gangschaltung", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 9f0011544..b99910daf 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: 65", + "_": "Missing Localizations: 102", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "Escaleras de adoquínes de gabro", "block.create.gabbro_cobblestone_wall": "Pared de adoquínes de gabro", "block.create.gabbro_pillar": "Pilar de gabro", - "block.create.gantry_pinion": "Piñón de grúa", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "Eje de grúa", "block.create.gearbox": "Caja de transmisión", "block.create.gearshift": "Caja de cambios", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "Úsalo y arrepiéntete de tu decisión inmediatamente", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 33cd85111..6611145d1 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: 953", + "_": "Missing Localizations: 989", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "Escaleras de Piedra Labrada de Gabro", "block.create.gabbro_cobblestone_wall": "Pared de Piedra Labrada de Gabro", "block.create.gabbro_pillar": "Pilar de Gabro", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Transmisión", "block.create.gearshift": "Cambio de Marcha", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 01831c87c..249958a19 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: 735", + "_": "Missing Localizations: 771", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Boîte à roue dentée", "block.create.gearshift": "Décaleur de rotation", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "Utilisez-le et regrettez immédiatement votre décision.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 14100deba..593c35df1 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: 70", + "_": "Missing Localizations: 107", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "Scalini di pietrisco di gabbro", "block.create.gabbro_cobblestone_wall": "Muretto di pietrisco di gabbro", "block.create.gabbro_pillar": "Pilastro di gabbro", - "block.create.gantry_pinion": "Pignone a portale", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "Albero a portale", "block.create.gearbox": "Riduttore", "block.create.gearshift": "Cambio", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "Usalo e rimpiangi immediatamente la tua decisione.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 88b1f8229..e46f52ebf 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: 77", + "_": "Missing Localizations: 114", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "斑れい岩の丸石の階段", "block.create.gabbro_cobblestone_wall": "斑れい岩の丸石の壁", "block.create.gabbro_pillar": "斑れい岩の柱", - "block.create.gantry_pinion": "ガントリーピニオン", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "ガントリーシャフト", "block.create.gearbox": "ギアボックス", "block.create.gearshift": "ギアシフト", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "それを使ったことをすぐ後悔する。", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 b755f5f47..e6ab8c399 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: 124", + "_": "Missing Localizations: 160", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "반려암 조약돌 계단", "block.create.gabbro_cobblestone_wall": "반려암 조약돌 담장", "block.create.gabbro_pillar": "반려암 기둥", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "기어박스", "block.create.gearshift": "기어쉬프트", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "Use it and regret your decision immediately.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 2890bc7ef..dd0cc915d 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: 1222", + "_": "Missing Localizations: 1258", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Versnellingsbak", "block.create.gearshift": "Versnellingspook", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "Gebruikt het en je zal meteen spijt hebben.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 768fd4e46..0dd6b00bf 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: 1288", + "_": "Missing Localizations: 1324", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "UNLOCALIZED: Gabbro Cobblestone Stairs", "block.create.gabbro_cobblestone_wall": "UNLOCALIZED: Gabbro Cobblestone Wall", "block.create.gabbro_pillar": "UNLOCALIZED: Gabbro Pillar", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Caixa de Transmissão", "block.create.gearshift": "Câmbio", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "UNLOCALIZED: Use it and regret your decision immediately.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 f14fee5da..e9c2d527f 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: 74", + "_": "Missing Localizations: 110", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "Ступени из габбро-булыжника", "block.create.gabbro_cobblestone_wall": "Стена из габбро-булыжника", "block.create.gabbro_pillar": "Габбро колонна", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "Коробка передач", "block.create.gearshift": "Реверсивный механизм", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "Используя его, вы немедленно пожалеете о своем решении.", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 aa9fa5d81..6bd1e6840 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: 72", + "_": "Missing Localizations: 108", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "辉长岩圆石楼梯", "block.create.gabbro_cobblestone_wall": "辉长岩圆石墙", "block.create.gabbro_pillar": "竖纹辉长岩", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "十字齿轮箱", "block.create.gearshift": "反转齿轮箱", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "试试就逝世。", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" 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 feddcaa20..0fdf50b31 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: 77", + "_": "Missing Localizations: 113", "_": "->------------------------] Game Elements [------------------------<-", @@ -162,7 +162,7 @@ "block.create.gabbro_cobblestone_stairs": "碎輝長岩樓梯", "block.create.gabbro_cobblestone_wall": "碎輝長岩牆", "block.create.gabbro_pillar": "豎紋輝長岩", - "block.create.gantry_pinion": "UNLOCALIZED: Gantry Pinion", + "block.create.gantry_carriage": "UNLOCALIZED: Gantry Carriage", "block.create.gantry_shaft": "UNLOCALIZED: Gantry Shaft", "block.create.gearbox": "齒輪箱", "block.create.gearshift": "變速箱", @@ -1802,61 +1802,119 @@ "create.tooltip.randomWipDescription8": "用了就死定了。", - "_": "->------------------------] MetaDoc Text [------------------------<-", + "_": "->------------------------] Ponder Content [------------------------<-", "create.ponder.hold_to_ponder": "UNLOCALIZED: Hold [%1$s] to Ponder", "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.brass_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.brass_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.brass_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.brass_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", - "create.ponder.shaft.scene_0.shaft_relay": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.shaft.scene_0.title": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_1.shaft_can_be_encased": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - "create.ponder.shaft.scene_1.title": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_hand.scene_0.x": "UNLOCALIZED: Das X axis", - "create.ponder.brass_hand.scene_0.y": "UNLOCALIZED: Das Y axis", - "create.ponder.brass_hand.scene_0.z": "UNLOCALIZED: Das Z axis", - "create.ponder.brass_hand.scene_0.title": "UNLOCALIZED: Coordinate Space", - "create.ponder.brass_hand.scene_1.change_blocks": "UNLOCALIZED: Blocks can be modified", - "create.ponder.brass_hand.scene_1.title": "UNLOCALIZED: Changing Blocks", - "create.ponder.brass_hand.scene_2.wut": "UNLOCALIZED: wut?", - "create.ponder.brass_hand.scene_2.title": "UNLOCALIZED: Showing Fluids", - "create.ponder.brass_hand.scene_2.fluids": "UNLOCALIZED: Fluid rendering test.", - "create.ponder.brass_hand.scene_3.outofbounds": "UNLOCALIZED: Blocks outside of the base plate do not affect scaling", - "create.ponder.brass_hand.scene_3.thanks_to_configureBasePlate": "UNLOCALIZED: configureBasePlate() makes sure of that.", - "create.ponder.brass_hand.scene_3.title": "UNLOCALIZED: Out of bounds / configureBasePlate", - "create.ponder.brass_hand.scene_4.incoming": "UNLOCALIZED: Incoming...", - "create.ponder.brass_hand.scene_4.title": "UNLOCALIZED: Emitting particles", - "create.ponder.brass_hand.scene_5.title": "UNLOCALIZED: Basic player interaction", - "create.ponder.brass_hand.scene_6.birbs_interesting": "UNLOCALIZED: More birbs = More interesting", - "create.ponder.brass_hand.scene_6.poi": "UNLOCALIZED: Point of Interest", - "create.ponder.brass_hand.scene_6.title": "UNLOCALIZED: Birbs", - "create.ponder.brass_hand.scene_7.seamless": "UNLOCALIZED: Seamless substitution of blocks", - "create.ponder.brass_hand.scene_7.blast_off": "UNLOCALIZED: Up, up and away.", - "create.ponder.brass_hand.scene_7.independent": "UNLOCALIZED: This Section renders independently.", - "create.ponder.brass_hand.scene_7.merged": "UNLOCALIZED: This Section got merged to base.", - "create.ponder.brass_hand.scene_7.title": "UNLOCALIZED: Sections", - "create.ponder.brass_hand.scene_8.stalling": "UNLOCALIZED: Belt Items can only be force-stalled on the belt they were created on.", - "create.ponder.brass_hand.scene_8.title": "UNLOCALIZED: Manipulating Items", - "create.ponder.andesite_funnel.scene_0.funnels_transfer": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.andesite_funnel.scene_0.title": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_1.regular_place": "UNLOCALIZED: Placed normally, it pull items from the inventory.", - "create.ponder.andesite_funnel.scene_1.same_for_other": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.wrench_reverse": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.belt_funnel": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.andesite_funnel.scene_1.title": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.sneak_place": "UNLOCALIZED: Placed while sneaking, it will put items into the inventory.", - "create.ponder.andesite_funnel.scene_2.title": "UNLOCALIZED: Funnel compatibility", + + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", + "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", + "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", + "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", + "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", + "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + + "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + + "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", + "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", + "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", + "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", + "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", + + "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", + "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + + "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", + "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", + "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + + "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", + "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", + "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", + "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + + "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", + + "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", + + "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", "_": "Thank you for translating Create!" diff --git a/src/generated/resources/assets/create/models/item/gantry_carriage.json b/src/generated/resources/assets/create/models/item/gantry_carriage.json new file mode 100644 index 000000000..7421b9883 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/gantry_carriage.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/gantry_carriage/item" +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/gantry_pinion.json b/src/generated/resources/assets/create/models/item/gantry_pinion.json deleted file mode 100644 index 55924eb15..000000000 --- a/src/generated/resources/assets/create/models/item/gantry_pinion.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "parent": "create:block/gantry_pinion/item" -} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_carriage.json similarity index 81% rename from src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json rename to src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_carriage.json index b0d383da3..736ef1b67 100644 --- a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_pinion.json +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/gantry_carriage.json @@ -2,7 +2,7 @@ "parent": "minecraft:recipes/root", "rewards": { "recipes": [ - "create:crafting/kinetics/gantry_pinion" + "create:crafting/kinetics/gantry_carriage" ] }, "criteria": { @@ -19,7 +19,7 @@ "has_the_recipe": { "trigger": "minecraft:recipe_unlocked", "conditions": { - "recipe": "create:crafting/kinetics/gantry_pinion" + "recipe": "create:crafting/kinetics/gantry_carriage" } } }, diff --git a/src/generated/resources/data/create/loot_tables/blocks/gantry_pinion.json b/src/generated/resources/data/create/loot_tables/blocks/gantry_carriage.json similarity index 86% rename from src/generated/resources/data/create/loot_tables/blocks/gantry_pinion.json rename to src/generated/resources/data/create/loot_tables/blocks/gantry_carriage.json index 9631215af..cf1d1630a 100644 --- a/src/generated/resources/data/create/loot_tables/blocks/gantry_pinion.json +++ b/src/generated/resources/data/create/loot_tables/blocks/gantry_carriage.json @@ -6,7 +6,7 @@ "entries": [ { "type": "minecraft:item", - "name": "create:gantry_pinion" + "name": "create:gantry_carriage" } ], "conditions": [ diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_pinion.json b/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_carriage.json similarity index 89% rename from src/generated/resources/data/create/recipes/crafting/kinetics/gantry_pinion.json rename to src/generated/resources/data/create/recipes/crafting/kinetics/gantry_carriage.json index 9bb723b76..e4bccc262 100644 --- a/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_pinion.json +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/gantry_carriage.json @@ -20,6 +20,6 @@ } }, "result": { - "item": "create:gantry_pinion" + "item": "create:gantry_carriage" } } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index 52641d2a9..4051fcbcc 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -77,7 +77,7 @@ public class AllBlockPartials { CUCKOO_RIGHT_DOOR = get("cuckoo_clock/right_door"), CUCKOO_PIG = get("cuckoo_clock/pig"), CUCKOO_CREEPER = get("cuckoo_clock/creeper"), - GANTRY_COGS = get("gantry_pinion/wheels"), + GANTRY_COGS = get("gantry_carriage/wheels"), ROPE_COIL = get("rope_pulley/rope_coil"), ROPE_HALF = get("rope_pulley/rope_half"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 9634be56c..27c66b628 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -54,7 +54,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock.ChassisCTBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlockItem; @@ -692,8 +692,8 @@ public class AllBlocks { .getName() + "/head")))) .register(); - public static final BlockEntry GANTRY_PINION = - REGISTRATE.block("gantry_pinion", GantryPinionBlock::new) + public static final BlockEntry GANTRY_CARRIAGE = + REGISTRATE.block("gantry_carriage", GantryCarriageBlock::new) .initialProperties(SharedProperties::stone) .properties(Block.Properties::nonOpaque) .blockstate(BlockStateGen.directionalAxisBlockProvider()) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 1abb73271..1e68f2012 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -51,8 +51,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionRenderer; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonTileEntity; @@ -242,10 +242,10 @@ public class AllTileEntities { .onRegister(SingleRotatingInstance::register) .register(); - public static final TileEntityEntry GANTRY_PINION = Create.registrate() - .tileEntity("gantry_pinion", GantryPinionTileEntity::new) - .validBlocks(AllBlocks.GANTRY_PINION) - .renderer(() -> GantryPinionRenderer::new) + public static final TileEntityEntry GANTRY_PINION = Create.registrate() + .tileEntity("gantry_pinion", GantryCarriageTileEntity::new) + .validBlocks(AllBlocks.GANTRY_CARRIAGE) + .renderer(() -> GantryCarriageRenderer::new) .onRegister(ShaftInstance::register) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java index e783d6436..4efa20fb9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/Contraption.java @@ -34,7 +34,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.bea import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedContraption; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.ChassisTileEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; @@ -291,7 +291,7 @@ public abstract class Contraption { if (AllBlocks.BELT.has(state)) moveBelt(pos, frontier, visited, state); - if (AllBlocks.GANTRY_PINION.has(state)) + if (AllBlocks.GANTRY_CARRIAGE.has(state)) moveGantryPinion(world, pos, frontier, visited, state); if (AllBlocks.GANTRY_SHAFT.has(state)) @@ -423,7 +423,7 @@ public abstract class Contraption { protected void moveGantryPinion(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) { - BlockPos offset = pos.offset(state.get(GantryPinionBlock.FACING)); + BlockPos offset = pos.offset(state.get(GantryCarriageBlock.FACING)); if (!visited.contains(offset)) frontier.add(offset); Axis rotationAxis = ((IRotate) state.getBlock()).getRotationAxis(state); @@ -447,7 +447,7 @@ public abstract class Contraption { if (d.getAxis() == facing.getAxis() && AllBlocks.GANTRY_SHAFT.has(offsetState) && offsetState.get(GantryShaftBlock.FACING) == facing) frontier.add(offset); - else if (AllBlocks.GANTRY_PINION.has(offsetState) && offsetState.get(GantryPinionBlock.FACING) == d) + else if (AllBlocks.GANTRY_CARRIAGE.has(offsetState) && offsetState.get(GantryCarriageBlock.FACING) == d) frontier.add(offset); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java similarity index 91% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionBlock.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java index 85c41d0af..744c803fc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageBlock.java @@ -24,9 +24,9 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class GantryPinionBlock extends DirectionalAxisKineticBlock implements ITE { +public class GantryCarriageBlock extends DirectionalAxisKineticBlock implements ITE { - public GantryPinionBlock(Properties properties) { + public GantryCarriageBlock(Properties properties) { super(properties); } @@ -41,7 +41,7 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT @Override public void updateNeighbors(BlockState stateIn, IWorld worldIn, BlockPos pos, int flags) { super.updateNeighbors(stateIn, worldIn, pos, flags); - withTileEntityDo(worldIn, pos, GantryPinionTileEntity::checkValidGantryShaft); + withTileEntityDo(worldIn, pos, GantryCarriageTileEntity::checkValidGantryShaft); } @Override @@ -113,7 +113,7 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT } public static Axis getValidGantryShaftAxis(BlockState state) { - if (!(state.getBlock() instanceof GantryPinionBlock)) + if (!(state.getBlock() instanceof GantryCarriageBlock)) return Axis.Y; IRotate block = (IRotate) state.getBlock(); Axis rotationAxis = block.getRotationAxis(state); @@ -135,8 +135,8 @@ public class GantryPinionBlock extends DirectionalAxisKineticBlock implements IT } @Override - public Class getTileEntityClass() { - return GantryPinionTileEntity.class; + public Class getTileEntityClass() { + return GantryCarriageTileEntity.class; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java similarity index 90% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java index 7772d70de..eb19867d5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java @@ -19,9 +19,9 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; -public class GantryPinionRenderer extends KineticTileEntityRenderer { +public class GantryCarriageRenderer extends KineticTileEntityRenderer { - public GantryPinionRenderer(TileEntityRendererDispatcher dispatcher) { + public GantryCarriageRenderer(TileEntityRendererDispatcher dispatcher) { super(dispatcher); } @@ -30,8 +30,8 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState state = te.getBlockState(); - Direction facing = state.get(GantryPinionBlock.FACING); - Boolean alongFirst = state.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE); + Direction facing = state.get(GantryCarriageBlock.FACING); + Boolean alongFirst = state.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); Axis rotationAxis = getRotationAxisOf(te); BlockPos visualPos = facing.getAxisDirection() == AxisDirection.POSITIVE ? te.getPos() : te.getPos() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java similarity index 91% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java index 582b7d749..a3d59c9fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageTileEntity.java @@ -18,12 +18,12 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; -public class GantryPinionTileEntity extends KineticTileEntity implements IDisplayAssemblyExceptions { +public class GantryCarriageTileEntity extends KineticTileEntity implements IDisplayAssemblyExceptions { boolean assembleNextTick; protected AssemblyException lastException; - public GantryPinionTileEntity(TileEntityType typeIn) { + public GantryCarriageTileEntity(TileEntityType typeIn) { super(typeIn); } @@ -61,7 +61,7 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla private void tryAssemble() { BlockState blockState = getBlockState(); - if (!(blockState.getBlock() instanceof GantryPinionBlock)) + if (!(blockState.getBlock() instanceof GantryCarriageBlock)) return; Direction direction = blockState.get(FACING); @@ -129,9 +129,9 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla return defaultModifier; Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - if (stateFrom.get(GantryPinionBlock.FACING) != direction.getOpposite()) + if (stateFrom.get(GantryCarriageBlock.FACING) != direction.getOpposite()) return defaultModifier; - return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryPinionBlock.FACING)); + return getGantryPinionModifier(stateTo.get(GantryShaftBlock.FACING), stateFrom.get(GantryCarriageBlock.FACING)); } public static float getGantryPinionModifier(Direction shaft, Direction pinionDirection) { @@ -152,9 +152,9 @@ public class GantryPinionTileEntity extends KineticTileEntity implements IDispla private boolean shouldAssemble() { BlockState blockState = getBlockState(); - if (!(blockState.getBlock() instanceof GantryPinionBlock)) + if (!(blockState.getBlock() instanceof GantryCarriageBlock)) return false; - Direction facing = blockState.get(GantryPinionBlock.FACING) + Direction facing = blockState.get(GantryCarriageBlock.FACING) .getOpposite(); BlockState shaftState = world.getBlockState(pos.offset(facing)); if (!(shaftState.getBlock() instanceof GantryShaftBlock)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java index 0db74075e..df6366c73 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryContraption.java @@ -60,7 +60,7 @@ public class GantryContraption extends TranslatingContraption { @Override protected boolean shouldUpdateAfterMovement(BlockInfo info) { - return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_PINION.has(info.state); + return super.shouldUpdateAfterMovement(info) && !AllBlocks.GANTRY_CARRIAGE.has(info.state); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index 3e9b5633c..d17aa39b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -69,6 +69,8 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { public void move(double x, double y, double z) { float time = AnimationTickHolder.getTicks(); float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / maxAge)); + if (speed < 0) + angle += 180; Vec3d position = VecHelper.rotate(this.offset.scale(radius), angle, axis).add(origin); posX = position.x; posY = position.y; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java index db9ae172b..645905b59 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftBlock.java @@ -259,6 +259,16 @@ public class GantryShaftBlock extends DirectionalKineticBlock { return super.areStatesKineticallyEquivalent(oldState, newState) && oldState.get(POWERED) == newState.get(POWERED); } + + @Override + public float getParticleTargetRadius() { + return .35f; + } + + @Override + public float getParticleInitialRadius() { + return .25f; + } public static class PlacementHelper extends PoleHelper { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java index 338123dc8..dbdeeb073 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/GantryShaftTileEntity.java @@ -2,8 +2,8 @@ package com.simibubi.create.content.contraptions.relays.advanced; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.base.KineticTileEntity; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageTileEntity; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; @@ -31,13 +31,13 @@ public class GantryShaftTileEntity extends KineticTileEntity { continue; BlockPos offset = pos.offset(d); BlockState pinionState = world.getBlockState(offset); - if (!AllBlocks.GANTRY_PINION.has(pinionState)) + if (!AllBlocks.GANTRY_CARRIAGE.has(pinionState)) continue; - if (pinionState.get(GantryPinionBlock.FACING) != d) + if (pinionState.get(GantryCarriageBlock.FACING) != d) continue; TileEntity tileEntity = world.getTileEntity(offset); - if (tileEntity instanceof GantryPinionTileEntity) - ((GantryPinionTileEntity) tileEntity).queueAssembly(); + if (tileEntity instanceof GantryCarriageTileEntity) + ((GantryCarriageTileEntity) tileEntity).queueAssembly(); } } @@ -52,24 +52,24 @@ public class GantryShaftTileEntity extends KineticTileEntity { return defaultModifier; if (!stateFrom.get(GantryShaftBlock.POWERED)) return defaultModifier; - if (!AllBlocks.GANTRY_PINION.has(stateTo)) + if (!AllBlocks.GANTRY_CARRIAGE.has(stateTo)) return defaultModifier; Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - if (stateTo.get(GantryPinionBlock.FACING) != direction) + if (stateTo.get(GantryCarriageBlock.FACING) != direction) return defaultModifier; - return GantryPinionTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING), - stateTo.get(GantryPinionBlock.FACING)); + return GantryCarriageTileEntity.getGantryPinionModifier(stateFrom.get(GantryShaftBlock.FACING), + stateTo.get(GantryCarriageBlock.FACING)); } @Override public boolean isCustomConnection(KineticTileEntity other, BlockState state, BlockState otherState) { - if (!AllBlocks.GANTRY_PINION.has(otherState)) + if (!AllBlocks.GANTRY_CARRIAGE.has(otherState)) return false; final BlockPos diff = other.getPos() .subtract(pos); Direction direction = Direction.getFacingFromVector(diff.getX(), diff.getY(), diff.getZ()); - return otherState.get(GantryPinionBlock.FACING) == direction; + return otherState.get(GantryCarriageBlock.FACING) == direction; } public boolean canAssembleOn() { diff --git a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java index eddac4b90..6c71f4d97 100644 --- a/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java +++ b/src/main/java/com/simibubi/create/foundation/data/AllLangPartials.java @@ -12,7 +12,7 @@ public enum AllLangPartials { ADVANCEMENTS("Advancements"), MESSAGES("UI & Messages"), TOOLTIPS("Item Descriptions"), - METADOC("MetaDoc Text", PonderRegistry::provideLangEntries), + PONDER("Ponder Content", PonderRegistry::provideLangEntries), ; diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java index 9c9b9f9d9..f9a8a8049 100644 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java @@ -23,6 +23,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; +import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.utility.FilesHelper; import net.minecraft.data.DataGenerator; @@ -44,12 +45,28 @@ public class LangMerger implements IDataProvider { private Map> allLocalizedEntries; private Map missingTranslationTally; + private List langIgnore; + public LangMerger(DataGenerator gen) { this.gen = gen; this.mergedLangData = new ArrayList<>(); + this.langIgnore = new ArrayList<>(); this.allLocalizedEntries = new HashMap<>(); this.populatedLangData = new HashMap<>(); this.missingTranslationTally = new HashMap<>(); + populateLangIgnore(); + } + + private void populateLangIgnore() { + // Key prefixes added here will NOT be transferred to lang templates + langIgnore.add("create.ponder.brass_hand."); // Ponder debug scene text + } + + private boolean shouldIgnore(String key) { + for (String string : langIgnore) + if (key.startsWith(string)) + return true; + return false; } @Override @@ -127,6 +144,8 @@ public class LangMerger implements IDataProvider { .stream() .forEachOrdered(entry -> { String key = entry.getKey(); + if (shouldIgnore(key)) + return; String value = entry.getValue() .getAsString(); if (!previousKey.getValue() @@ -157,9 +176,11 @@ public class LangMerger implements IDataProvider { } protected boolean shouldAddLineBreak(String key, String previousKey) { - // Always put tooltips in their own paragraphs + // Always put tooltips and ponder scenes in their own paragraphs if (key.endsWith(".tooltip")) return true; + if (key.startsWith("create.ponder") && key.endsWith(PonderScene.TITLE_KEY)) + return true; key = key.replaceFirst("\\.", ""); previousKey = previousKey.replaceFirst("\\.", ""); diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java index 0463ca346..e543fdc09 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/StandardRecipeGen.java @@ -318,7 +318,7 @@ public class StandardRecipeGen extends CreateRecipeProvider { .patternLine("A") .patternLine("P")), - GANTRY_PINION = create(AllBlocks.GANTRY_PINION).unlockedBy(I::andesiteCasing) + GANTRY_PINION = create(AllBlocks.GANTRY_CARRIAGE).unlockedBy(I::andesiteCasing) .viaShaped(b -> b.key('B', ItemTags.PLANKS) .key('S', I.cog()) .key('C', I.andesiteCasing()) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index 217137336..2c284cfe3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -32,7 +32,7 @@ public class PonderLocalization { public static String getShared(String key) { if (PonderIndex.EDITOR_MODE) - return shared.get(key); + return shared.containsKey(key) ? shared.get(key) : ("unregistered shared entry:" + key); return Lang.translate(langKeyForShared(key)); } @@ -62,13 +62,16 @@ public class PonderLocalization { for (int i = 0; i < map.size(); i++) { final int scene = i; Map sceneMap = map.get(i); - sceneMap.forEach( - (k, v) -> object.addProperty(Create.ID + "." + langKeyForSpecific(component, scene, k), v)); + sceneMap.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> object.addProperty(Create.ID + "." + langKeyForSpecific(component, scene, e.getKey()), + e.getValue())); } }); return object; } - + private static void addGeneral(JsonObject json, String key, String enUS) { json.addProperty(Create.ID + "." + key, enUS); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 02052a610..8806eac71 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -50,8 +50,11 @@ import net.minecraft.util.math.Vec3i; public class PonderScene { + public static final String TITLE_KEY = "header"; + boolean finished; int sceneIndex; + int textIndex; List schedule, activeSchedule; Map linkedElements; @@ -78,6 +81,7 @@ public class PonderScene { public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { pointOfInterest = Vec3d.ZERO; + textIndex = 1; this.world = world; this.component = component; @@ -94,7 +98,7 @@ public class PonderScene { baseWorldSection = new WorldSectionElement(); renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); - PonderLocalization.registerSpecific(component, sceneIndex, "title", "Untitled Scene"); + PonderLocalization.registerSpecific(component, sceneIndex, TITLE_KEY, "Untitled Scene"); setPointOfInterest(new Vec3d(0, 4, 0)); } @@ -152,7 +156,7 @@ public class PonderScene { } public String getTitle() { - return getString("title"); + return getString(TITLE_KEY); } public String getString(String key) { @@ -320,6 +324,14 @@ public class PonderScene { return world == null ? new MutableBoundingBox() : world.getBounds(); } + public Supplier registerText(String defaultText) { + final String key = "text_" + textIndex; + PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); + Supplier supplier = () -> PonderLocalization.getSpecific(component, sceneIndex, key); + textIndex++; + return supplier; + } + public SceneBuilder builder() { return new SceneBuilder(this); } @@ -328,10 +340,6 @@ public class PonderScene { return new SceneBuildingUtil(getBounds()); } - Supplier textGetter(String key) { - return () -> PonderLocalization.getSpecific(component, sceneIndex, key); - } - public SceneTransform getTransform() { return transform; } 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 4197cd7fd..609e79525 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -37,6 +37,8 @@ import net.minecraft.util.math.MutableBoundingBox; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; +import net.minecraft.world.gen.feature.template.PlacementSettings; +import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.registries.ForgeRegistries; @@ -171,8 +173,21 @@ public class PonderUI extends AbstractSimiScreen { protected void replay() { identifyMode = false; - scenes.get(index) - .begin(); + PonderScene scene = scenes.get(index); + + if (hasShiftDown()) { + List list = PonderRegistry.all.get(scene.component); + PonderStoryBoardEntry sb = list.get(index); + Template activeTemplate = PonderRegistry.loadSchematic(sb.getSchematicName()); + PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); + activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); + world.createBackup(); + scene = PonderRegistry.compileScene(scene.component, index, sb, world); + scene.begin(); + scenes.set(index, scene); + } + + scene.begin(); } protected boolean scroll(boolean forward) { 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 36a2b9e94..a2e165133 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.ponder; +import java.util.Optional; import java.util.UUID; import java.util.function.Consumer; import java.util.function.Function; @@ -8,6 +9,7 @@ import java.util.function.UnaryOperator; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.base.KineticBlock; import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; @@ -17,6 +19,7 @@ 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.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; @@ -47,6 +50,7 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.particles.RedstoneParticleData; +import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -108,7 +112,7 @@ public class SceneBuilder { * @param title */ public void title(String title) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, "title", title); + PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, PonderScene.TITLE_KEY, title); } /** @@ -190,6 +194,10 @@ public class SceneBuilder { addInstruction(new EmitParticlesInstruction(location, emitter, amountPerCycle, cycles)); } + public void superGlue(BlockPos pos, Direction side, boolean fullBlock) { + addInstruction(scene -> SuperGlueItem.spawnParticles(scene.world, pos, side, fullBlock)); + } + private void rotationIndicator(BlockPos pos, boolean direction) { addInstruction(scene -> { BlockState blockState = scene.world.getBlockState(pos); @@ -205,12 +213,13 @@ public class SceneBuilder { Axis rotationAxis = kb.getRotationAxis(blockState); float speed = kte.getTheoreticalSpeed(); - int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 - : SpeedLevel.of(speed) - .getColor(); + SpeedLevel speedLevel = SpeedLevel.of(speed); + int color = direction ? speed > 0 ? 0xeb5e0b : 0x1687a7 : speedLevel.getColor(); + int particleSpeed = speedLevel.getParticleSpeed(); + particleSpeed *= Math.signum(speed); Vec3d location = VecHelper.getCenterOf(pos); - RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, speed, + RotationIndicatorParticleData particleData = new RotationIndicatorParticleData(color, particleSpeed, kb.getParticleInitialRadius(), kb.getParticleTargetRadius(), 20, rotationAxis.name() .charAt(0)); @@ -245,37 +254,16 @@ public class SceneBuilder { public class OverlayInstructions { - public void showTargetedText(PonderPalette color, Vec3d position, String key, String defaultText, - int duration) { - registerText(key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, false)); + public TextWindowElement.Builder showText(int duration) { + TextWindowElement textWindowElement = new TextWindowElement(); + addInstruction(new TextInstruction(textWindowElement, duration)); + return textWindowElement.new Builder(scene); } - public void showTargetedTextNearScene(PonderPalette color, Vec3d position, String key, String defaultText, - int duration) { - registerText(key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, position, true)); - } - - public void showSelectionWithText(PonderPalette color, Selection selection, String key, String defaultText, - int duration) { - registerText(key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection, false)); - } - - public void showSelectionWithTextNearScene(PonderPalette color, Selection selection, String key, - String defaultText, int duration) { - registerText(key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, selection, true)); - } - - public void showText(PonderPalette color, int y, String key, String defaultText, int duration) { - registerText(key, defaultText); - addInstruction(new TextInstruction(color.getColor(), scene.textGetter(key), duration, y)); - } - - private void registerText(String key, String defaultText) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, key, defaultText); + public TextWindowElement.Builder showSelectionWithText(Selection selection, int duration) { + TextWindowElement textWindowElement = new TextWindowElement(); + addInstruction(new TextInstruction(textWindowElement, duration, selection)); + return textWindowElement.new Builder(scene).pointAt(selection.getCenter()); } public void showControls(InputWindowElement element, int duration) { @@ -326,12 +314,19 @@ public class SceneBuilder { public class WorldInstructions { public void showSection(Selection selection, Direction fadeInDirection) { - addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, true)); + addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, + Optional.of(scene::getBaseWorldSection))); + } + + public void showSectionAndMerge(Selection selection, Direction fadeInDirection, + ElementLink link) { + addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, + Optional.of(() -> scene.resolve(link)))); } public ElementLink showIndependentSection(Selection selection, Direction fadeInDirection) { DisplayWorldSectionInstruction instruction = - new DisplayWorldSectionInstruction(15, fadeInDirection, selection, false); + new DisplayWorldSectionInstruction(15, fadeInDirection, selection, Optional.empty()); addInstruction(instruction); return instruction.createLink(scene); } @@ -402,6 +397,16 @@ public class SceneBuilder { addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles)); } + public void toggleRedstonePower(Selection selection) { + modifyBlocks(selection, s -> { + if (s.has(BlockStateProperties.POWER_0_15)) + s = s.with(BlockStateProperties.POWER_0_15, s.get(BlockStateProperties.POWER_0_15) == 0 ? 15 : 0); + if (s.has(BlockStateProperties.POWERED)) + s = s.cycle(BlockStateProperties.POWERED); + return s; + }, false); + } + public void modifyEntities(Class entityClass, Consumer entityCallBack) { addInstruction(scene -> scene.forEachWorldEntity(entityClass, entityCallBack)); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 7aaadea6f..714fde22f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -1,7 +1,5 @@ package com.simibubi.create.foundation.ponder.content; -import static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; @@ -59,17 +57,23 @@ public class DebugScenes { scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - + Selection xAxis = util.select.fromTo(2, 1, 1, 4, 1, 1); Selection yAxis = util.select.fromTo(1, 2, 1, 1, 4, 1); Selection zAxis = util.select.fromTo(1, 1, 2, 1, 1, 4); scene.idle(10); - scene.overlay.showSelectionWithText(PonderPalette.RED, xAxis, "x", "Das X axis", 20); + scene.overlay.showSelectionWithText(xAxis, 20) + .colored(PonderPalette.RED) + .text("Das X axis"); scene.idle(20); - scene.overlay.showSelectionWithText(PonderPalette.GREEN, yAxis, "y", "Das Y axis", 20); + scene.overlay.showSelectionWithText(yAxis, 20) + .colored(PonderPalette.GREEN) + .text("Das Y axis"); scene.idle(20); - scene.overlay.showSelectionWithText(PonderPalette.BLUE, zAxis, "z", "Das Z axis", 20); + scene.overlay.showSelectionWithText(zAxis, 20) + .colored(PonderPalette.BLUE) + .text("Das Z axis"); scene.idle(10); } @@ -79,7 +83,9 @@ public class DebugScenes { scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); scene.idle(10); - scene.overlay.showText(WHITE, 10, "change_blocks", "Blocks can be modified", 1000); + scene.overlay.showText(1000) + .independent(10) + .text("Blocks can be modified"); scene.idle(20); scene.world.replaceBlocks(util.select.fromTo(1, 1, 3, 2, 2, 4), AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), true); @@ -96,7 +102,9 @@ public class DebugScenes { Vec3d parrotPos = util.vector.topOf(1, 0, 1); scene.special.birbLookingAtPOI(parrotPos); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - scene.overlay.showTargetedText(WHITE, new Vec3d(1, 2.5, 4.5), "fluids", "Fluid rendering test.", 1000); + scene.overlay.showText(1000) + .text("Fluid rendering test.") + .pointAt(new Vec3d(1, 2.5, 4.5)); scene.markAsFinished(); Object outlineSlot = new Object(); @@ -120,7 +128,10 @@ public class DebugScenes { scene.idle(12); scene.special.movePointOfInterest(util.grid.at(-4, 5, 4)); - scene.overlay.showTargetedText(PonderPalette.RED, parrotPos.add(-.25f, 0.25f, .25f), "wut", "wut?", 40); + scene.overlay.showText(40) + .colored(PonderPalette.RED) + .text("wut?") + .pointAt(parrotPos.add(-.25f, 0.25f, .25f)); } @@ -139,10 +150,12 @@ public class DebugScenes { scene.world.showSection(blocksExceptBasePlate, Direction.DOWN); scene.idle(10); - scene.overlay.showSelectionWithText(PonderPalette.BLACK, out1, "outofbounds", - "Blocks outside of the base plate do not affect scaling", 100); - scene.overlay.showSelectionWithText(PonderPalette.BLACK, out2, "thanks_to_configureBasePlate", - "configureBasePlate() makes sure of that.", 100); + scene.overlay.showSelectionWithText(out1, 100) + .colored(PonderPalette.BLACK) + .text("Blocks outside of the base plate do not affect scaling"); + scene.overlay.showSelectionWithText(out2, 100) + .colored(PonderPalette.BLACK) + .text("configureBasePlate() makes sure of that."); scene.markAsFinished(); } @@ -159,7 +172,9 @@ public class DebugScenes { Emitter.simple(new RotationIndicatorParticleData(SpeedLevel.MEDIUM.getColor(), 12, 1, 1, 20, 'Y'), util.vector.of(0, .1, 0)); - scene.overlay.showTargetedText(WHITE, emitterPos, "incoming", "Incoming...", 20); + scene.overlay.showText(20) + .text("Incoming...") + .pointAt(emitterPos); scene.idle(30); scene.effects.emitParticles(emitterPos, emitter, 1, 60); scene.effects.emitParticles(emitterPos, rotation, 20, 1); @@ -261,8 +276,10 @@ public class DebugScenes { BlockPos pos = new BlockPos(1, 2, 3); scene.special.birbOnSpinnyShaft(pos); - scene.overlay.showTargetedText(PonderPalette.GREEN, util.vector.topOf(pos), "birbs_interesting", - "More birbs = More interesting", 100); + scene.overlay.showText(100) + .colored(PonderPalette.GREEN) + .text("More birbs = More interesting") + .pointAt(util.vector.topOf(pos)); scene.idle(10); scene.special.birbPartying(util.vector.topOf(0, 1, 2)); @@ -281,7 +298,9 @@ public class DebugScenes { scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState()); scene.special.movePointOfInterest(poi2); - scene.overlay.showTargetedText(PonderPalette.FAST, util.vector.centerOf(poi2), "poi", "Point of Interest", 20); + scene.overlay.showText(20) + .text("Point of Interest") + .pointAt(util.vector.centerOf(poi2)); scene.idle(20); scene.world.setBlock(poi1, Blocks.AIR.getDefaultState()); @@ -314,11 +333,15 @@ public class DebugScenes { scene.idle(20); - scene.overlay.showTargetedText(PonderPalette.GREEN, util.vector.topOf(mergePos), "merged", - "This Section got merged to base.", 40); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .text("This Section got merged to base.") + .pointAt(util.vector.topOf(mergePos)); scene.idle(10); - scene.overlay.showTargetedText(PonderPalette.RED, util.vector.topOf(independentPos), "independent", - "This Section renders independently.", 40); + scene.overlay.showText(40) + .colored(PonderPalette.RED) + .text("This Section renders independently.") + .pointAt(util.vector.topOf(independentPos)); scene.idle(40); @@ -336,15 +359,19 @@ public class DebugScenes { scene.world.setBlocks(hiddenReplaceArea, AllBlocks.REFINED_RADIANCE_CASING.getDefaultState(), false); scene.world.showSection(hiddenReplaceArea, Direction.DOWN); scene.idle(20); - scene.overlay.showSelectionWithText(PonderPalette.BLUE, hiddenReplaceArea, "seamless", - "Seamless substitution of blocks", 30); + scene.overlay.showSelectionWithText(hiddenReplaceArea, 30) + .colored(PonderPalette.BLUE) + .text("Seamless substitution of blocks"); scene.idle(40); ElementLink helicopter = scene.world.makeSectionIndependent(hiddenReplaceArea); scene.world.rotateSection(helicopter, 50, 5 * 360, 0, 60); scene.world.moveSection(helicopter, util.vector.of(0, 4, 5), 50); - scene.overlay.showText(PonderPalette.BLUE, 30, "blast_off", "Up, up and away.", 30); + scene.overlay.showText(30) + .colored(PonderPalette.BLUE) + .text("Up, up and away.") + .independent(30); scene.idle(40); scene.world.hideIndependentSection(helicopter, Direction.UP); @@ -373,8 +400,10 @@ public class DebugScenes { scene.idle(10); scene.world.stallBeltItem(itemOnBelt, true); scene.idle(5); - scene.overlay.showTargetedText(PonderPalette.FAST, util.vector.topOf(2, 1, 2), "stalling", - "Belt Items can only be force-stalled on the belt they were created on.", 40); + scene.overlay.showText(40) + .colored(PonderPalette.FAST) + .text("Belt Items can only be force-stalled on the belt they were created on.") + .pointAt(util.vector.topOf(2, 1, 2)); scene.idle(45); scene.world.stallBeltItem(itemOnBelt, false); scene.idle(20); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java index 1ca756fda..eeb6c80c7 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -99,8 +99,9 @@ public class FunnelScenes { } scene.idle(8); - scene.overlay.showText(PonderPalette.WHITE, 0, "funnels_transfer", - "Funnels are ideal for transferring items from and to inventories.", 360); + scene.overlay.showText(360) + .text("Funnels are ideal for transferring items from and to inventories.") + .independent(); scene.markAsFinished(); } @@ -128,8 +129,10 @@ public class FunnelScenes { // Placing funnels without sneak scene.world.showSection(topFunnelSelection, Direction.DOWN); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "regular_place", - "Placed normally, it pulls items from the inventory.", 80); + scene.overlay.showText(80) + .text("Placed normally, it pulls items from the inventory.") + .pointAt(topCenter) + .placeNearTarget(); scene.idle(45); ElementLink itemLink = @@ -146,8 +149,10 @@ public class FunnelScenes { scene.world.showSection(topFunnelSelection, Direction.DOWN); scene.overlay.showControls(controlsSneak, 35); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "sneak_place", - "Placed while sneaking, it puts items into the inventory.", 80); + scene.overlay.showText(80) + .text("Placed while sneaking, it puts items into the inventory.") + .pointAt(topCenter) + .placeNearTarget(); scene.idle(45); itemLink = scene.world.createItemEntity(topCenter.add(0, 3, 0), util.vector.of(0, -0.2, 0), itemStack); @@ -163,8 +168,10 @@ public class FunnelScenes { scene.idle(10); scene.world.modifyBlock(topFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), true); scene.idle(10); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, topCenter, "wrench_reverse", - "Using a wrench, the funnel can be flipped after placement.", 80); + scene.overlay.showText(80) + .text("Using a wrench, the funnel can be flipped after placement.") + .pointAt(topCenter) + .placeNearTarget(); itemLink = scene.world.createItemEntity(topCenter, util.vector.of(0, 4 / 16f, 0), itemStack); scene.idle(30); @@ -184,8 +191,10 @@ public class FunnelScenes { scene.world.modifyBlock(sideFunnel, s -> s.cycle(FunnelBlock.EXTRACTING), false); scene.world.showSection(sideFunnelSelection, Direction.DOWN); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, sideCenter, "same_for_other", - "Same rules will apply for most orientations.", 70); + scene.overlay.showText(70) + .text("Same rules will apply for most orientations.") + .pointAt(sideCenter) + .placeNearTarget(); scene.idle(20); @@ -206,8 +215,10 @@ public class FunnelScenes { BlockPos cogPos = util.grid.at(1, 1, 3); scene.world.showSection(beltFunnelSetup, Direction.DOWN); - scene.overlay.showTargetedText(PonderPalette.WHITE, topOfBeltFunnel, "belt_funnel_direction", - "Funnels on belts will extract/insert depending on its movement direction.", 140); + scene.overlay.showText(140) + .text("Funnels on belts will extract/insert depending on its movement direction.") + .pointAt(topOfBeltFunnel); + scene.idle(15); for (int i = 0; i < 2; i++) { @@ -251,27 +262,37 @@ public class FunnelScenes { scene.world.showSection(firstShow, Direction.DOWN); scene.idle(8); - scene.overlay.showText(PonderPalette.WHITE, 0, "funnels_compat", - "Funnels should also interact nicely with a handful of other components.", 360); + scene.overlay.showText(360) + .text("Funnels should also interact nicely with a handful of other components.") + .independent(0); scene.idle(40); scene.world.showSection(util.select.position(sawFunnel), Direction.DOWN); - scene.overlay.showTargetedTextNearScene(PonderPalette.BLUE, util.vector.centerOf(sawFunnel.down()), "saws", - "Vertical Saws", 40); + scene.overlay.showText(40) + .text("Vertical Saws") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector.centerOf(sawFunnel.down())); scene.idle(8); scene.world.createItemOnBeltLike(sawFunnel.down(), Direction.SOUTH, new ItemStack(Blocks.OAK_LOG)); scene.idle(40); scene.world.showSection(util.select.position(depotFunnel), Direction.DOWN); - scene.overlay.showTargetedTextNearScene(PonderPalette.BLUE, util.vector.centerOf(depotFunnel.down()), "depots", - "Depots", 40); + scene.overlay.showText(40) + .text("Depots") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector.centerOf(depotFunnel.down())); scene.idle(8); scene.world.createItemOnBeltLike(depotFunnel.down(), Direction.SOUTH, new ItemStack(Items.GOLDEN_PICKAXE)); scene.idle(40); scene.world.showSection(util.select.position(drainFunnel), Direction.DOWN); - scene.overlay.showTargetedTextNearScene(PonderPalette.BLUE, util.vector.centerOf(drainFunnel.down()), "drains", - "Item Drains", 40); + scene.overlay.showText(40) + .text("Item Drains") + .colored(PonderPalette.BLUE) + .placeNearTarget() + .pointAt(util.vector.centerOf(drainFunnel.down())); scene.idle(8); scene.world.createItemOnBeltLike(drainFunnel.down(), Direction.SOUTH, new ItemStack(Items.WATER_BUCKET)); scene.idle(40); @@ -310,8 +331,10 @@ public class FunnelScenes { scene.effects.indicateRedstone(lever); scene.idle(4); scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, funnel, redstoneBB, 80); - scene.overlay.showTargetedText(PonderPalette.RED, util.vector.blockSurface(funnel, Direction.DOWN), - "redstone_prevents", "Redstone power will prevent any funnel from acting.", 80); + scene.overlay.showText(80) + .colored(PonderPalette.RED) + .text("Redstone power will prevent any funnel from acting.") + .pointAt(util.vector.blockSurface(funnel, Direction.DOWN)); } else { scene.idle(4); } @@ -344,16 +367,20 @@ public class FunnelScenes { ItemStack itemStack = AllItems.BRASS_INGOT.asStack(); scene.idle(10); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, util.vector.topOf(andesiteFunnel), "andesite", - "Andesite Funnels can only ever extract single items.", 60); + scene.overlay.showText(60) + .text("Andesite Funnels can only ever extract single items.") + .pointAt(util.vector.topOf(andesiteFunnel)) + .placeNearTarget(); scene.idle(10); scene.world.createItemOnBeltLike(andesiteFunnel.down() .north(), Direction.SOUTH, itemStack); scene.world.flapFunnels(util.select.position(andesiteFunnel), true); scene.idle(60); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, util.vector.topOf(brassFunnel), "brass", - "Brass Funnels can extract up to a full stack.", 60); + scene.overlay.showText(60) + .text("Brass Funnels can extract up to a full stack.") + .pointAt(util.vector.topOf(brassFunnel)) + .placeNearTarget(); scene.idle(10); scene.world.createItemOnBeltLike(brassFunnel.down() .north(), Direction.SOUTH, ItemHandlerHelper.copyStackWithSize(itemStack, 64)); @@ -365,8 +392,10 @@ public class FunnelScenes { scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, filterSlot, filterSlot, 80); scene.overlay.showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).scroll(), 60); scene.idle(10); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, filterSlot.getCenter(), "scroll_filter", - "Scrolling on the filter slot allows for precise control over the extracted stack size.", 80); + scene.overlay.showText(80) + .text("Scrolling on the filter slot allows for precise control over the extracted stack size.") + .pointAt(filterSlot.getCenter()) + .placeNearTarget(); scene.idle(90); // belt @@ -406,8 +435,10 @@ public class FunnelScenes { .showControls(new InputWindowElement(util.vector.topOf(brassFunnel), Pointing.DOWN).rightClick() .withItem(emerald), 60); scene.idle(10); - scene.overlay.showTargetedTextNearScene(PonderPalette.WHITE, filterSlot.getCenter(), "item_filter", - "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", 80); + scene.overlay.showText(80) + .text("Using items on the filter slot will restrict the funnel to only transfer matching stacks.") + .pointAt(filterSlot.getCenter()) + .placeNearTarget(); scene.world.setFilterData(util.select.position(brassFunnel), FunnelTileEntity.class, emerald); } else scene.idle(10); @@ -437,8 +468,10 @@ public class FunnelScenes { scene.world.showSection(funnelSelect, Direction.DOWN); scene.idle(20); - scene.overlay.showSelectionWithTextNearScene(PonderPalette.RED, funnelSelect, "cant_transpose", - "Funnels cannot ever transfer between closed inventories directly.", 40); + scene.overlay.showSelectionWithText(funnelSelect, 40) + .colored(PonderPalette.RED) + .text("Funnels cannot ever transfer between closed inventories directly.") + .placeNearTarget(); scene.idle(50); scene.world.hideSection(funnelSelect, Direction.SOUTH); @@ -448,8 +481,11 @@ public class FunnelScenes { scene.world.showSection(funnelSelect, Direction.NORTH); scene.idle(10); - scene.overlay.showTargetedTextNearScene(PonderPalette.GREEN, util.vector.centerOf(funnelPos), "chute_is_better", - "Chutes or Smart chutes might be more suitable for such purposes.", 40); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .text("Chutes or Smart chutes might be more suitable for such purposes.") + .pointAt(util.vector.centerOf(funnelPos)) + .placeNearTarget(); scene.idle(50); scene.world.hideSection(funnelSelect, Direction.UP); @@ -461,8 +497,11 @@ public class FunnelScenes { scene.world.setBlocks(funnelSelect, Blocks.AIR.getDefaultState(), false); scene.world.showSection(belt, Direction.DOWN); scene.world.showSection(util.select.fromTo(0, 2, 2, 4, 2, 2), Direction.DOWN); - scene.overlay.showTargetedTextNearScene(PonderPalette.GREEN, util.vector.topOf(1, 2, 2), "belt_is_better", - "Same applies for horizontal movement.\nA mechanical belt should help here.", 120); + scene.overlay.showText(120) + .colored(PonderPalette.GREEN) + .text("Same applies for horizontal movement.\nA mechanical belt should help here.") + .pointAt(util.vector.topOf(1, 2, 2)) + .placeNearTarget(); scene.markAsFinished(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java new file mode 100644 index 000000000..4616347a5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java @@ -0,0 +1,292 @@ +package com.simibubi.create.foundation.ponder.content; + +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.WorldSectionElement; +import com.simibubi.create.foundation.utility.Iterate; + +import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class GantryScenes { + + public static void introForPinion(SceneBuilder scene, SceneBuildingUtil util) { + intro(scene, util, true); + } + + public static void introForShaft(SceneBuilder scene, SceneBuildingUtil util) { + intro(scene, util, false); + } + + private static void intro(SceneBuilder scene, SceneBuildingUtil util, boolean pinion) { + scene.title("Using Gantry " + (pinion ? "Carriages" : "Shafts")); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.idle(10); + ElementLink gantry = + scene.world.showIndependentSection(util.select.layer(2), Direction.DOWN); + scene.idle(10); + + BlockPos centralShaft = util.grid.at(2, 1, 2); + + scene.world.moveSection(gantry, util.vector.of(-4, 0, 0), 60); + + String text = pinion ? "Gantry Carriages can mount to and slide along a Gantry Shaft." + : "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them."; + + scene.overlay.showText(80) + .text(text) + .pointAt(util.vector.centerOf(centralShaft)); + scene.idle(80); + + scene.world.hideIndependentSection(gantry, Direction.UP); + scene.idle(10); + gantry = scene.world.showIndependentSection(util.select.layer(2), Direction.DOWN); + Vec3d gantryTop = util.vector.topOf(4, 2, 2); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 0f); + scene.overlay.showText(40) + .text("Gantry setups can move attached Blocks.") + .pointAt(gantryTop) + .placeNearTarget(); + scene.idle(30); + + Selection planks = util.select.position(5, 3, 1); + + scene.world.showSectionAndMerge(util.select.layersFrom(3) + .substract(planks), Direction.DOWN, gantry); + scene.idle(10); + scene.world.showSectionAndMerge(planks, Direction.SOUTH, gantry); + scene.idle(10); + scene.effects.superGlue(util.grid.at(5, 3, 1), Direction.SOUTH, true); + + scene.idle(20); + scene.overlay.showText(80) + .sharedText("movement_anchors") + .pointAt(gantryTop) + .placeNearTarget(); + scene.idle(80); + + scene.world.modifyKineticSpeed(util.select.layer(0), f -> 32f); + scene.world.modifyKineticSpeed(util.select.layer(1), f -> -64f); + + scene.world.moveSection(gantry, util.vector.of(-4, 0, 0), 60); + scene.idle(20); + scene.markAsFinished(); + } + + public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Gantry Power Propagation"); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + + Selection leverRedstone = util.select.fromTo(3, 1, 0, 3, 1, 1); + Selection shaft = util.select.fromTo(0, 1, 2, 4, 1, 2); + Selection shaftAndCog = util.select.fromTo(0, 1, 2, 5, 1, 2); + + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0) + .add(leverRedstone), Direction.UP); + + scene.idle(10); + scene.world.showSection(shaftAndCog, Direction.DOWN); + scene.idle(10); + + BlockPos gantryPos = util.grid.at(4, 2, 2); + ElementLink gantry = + scene.world.showIndependentSection(util.select.position(gantryPos), Direction.DOWN); + scene.idle(15); + scene.world.moveSection(gantry, util.vector.of(-3, 0, 0), 40); + scene.idle(40); + + scene.world.toggleRedstonePower(shaft); + scene.world.toggleRedstonePower(util.select.position(3, 1, 0)); + scene.world.toggleRedstonePower(util.select.position(3, 1, 1)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 0)); + scene.world.modifyKineticSpeed(util.select.position(gantryPos), f -> 32f); + scene.idle(40); + + BlockPos cogPos = util.grid.at(1, 2, 1); + scene.overlay.showText(60) + .colored(PonderPalette.RED) + .pointAt(util.vector.centerOf(cogPos.down() + .south())) + .text("Redstone-powered gantry shafts stop moving their carriages") + .placeNearTarget(); + scene.idle(70); + + Selection cogSelection = util.select.position(cogPos); + scene.world.showSection(cogSelection, Direction.SOUTH); + scene.world.modifyKineticSpeed(cogSelection, f -> 32f); + scene.overlay.showText(180) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(cogPos, Direction.NORTH)) + .text("Instead, its rotational force is relayed to the carriages' output shaft") + .placeNearTarget(); + scene.idle(10); + + scene.effects.rotationSpeedIndicator(cogPos); + scene.markAsFinished(); + } + + public static void direction(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Gantry Movement Direction"); + scene.configureBasePlate(0, 0, 5); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(10); + + Selection shaftAndGearshiftAndLever = util.select.fromTo(0, 1, 2, 5, 2, 2); + Selection shafts = util.select.fromTo(0, 1, 2, 3, 1, 2); + + scene.world.showSection(shaftAndGearshiftAndLever, Direction.DOWN); + scene.overlay.showText(60) + .text("Gantry Shafts can have opposite orientations") + .pointAt(util.vector.of(2, 1.5, 2.5)) + .placeNearTarget(); + scene.idle(60); + + ElementLink gantry1 = + scene.world.showIndependentSection(util.select.position(0, 1, 3), Direction.NORTH); + ElementLink gantry2 = + scene.world.showIndependentSection(util.select.position(3, 1, 3), Direction.NORTH); + scene.idle(10); + + scene.world.moveSection(gantry1, util.vector.of(1, 0, 0), 20); + scene.world.moveSection(gantry2, util.vector.of(-1, 0, 0), 20); + + scene.overlay.showText(80) + .text("The movement direction of carriages depend on their shafts' orientation") + .pointAt(util.vector.topOf(1, 1, 3)) + .placeNearTarget(); + scene.idle(80); + + BlockPos lastShaft = util.grid.at(0, 1, 2); + boolean flip = true; + + for (int i = 0; i < 3; i++) { + scene.world.modifyBlocks(util.select.fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED), + false); + scene.effects.indicateRedstone(util.grid.at(4, 2, 2)); + scene.world.moveSection(gantry1, util.vector.of(flip ? -1 : 1, 0, 0), 20); + scene.world.moveSection(gantry2, util.vector.of(flip ? 1 : -1, 0, 0), 20); + scene.world.modifyKineticSpeed(shafts, f -> -f); + scene.effects.rotationDirectionIndicator(lastShaft.east(flip ? 1 : 0)); + scene.idle(20); + + if (i == 0) { + scene.overlay.showText(80) + .text("...as well as the rotation direction of the shaft") + .pointAt(util.vector.blockSurface(lastShaft, Direction.WEST)) + .placeNearTarget(); + } + + scene.idle(30); + flip = !flip; + } + + Selection kinetics = util.select.fromTo(0, 2, 3, 3, 3, 3); + Selection gears1 = util.select.fromTo(0, 1, 3, 0, 3, 3); + Selection gears2 = util.select.fromTo(3, 1, 3, 3, 3, 3); + + scene.world.showSection(kinetics, Direction.DOWN); + scene.world.showSection(util.select.fromTo(0, 1, 0, 4, 1, 1), Direction.SOUTH); + scene.idle(20); + + BlockPos leverPos = util.grid.at(4, 1, 0); + scene.world.modifyBlocks(util.select.fromTo(1, 1, 0, 3, 1, 1), + s -> s.has(RedstoneWireBlock.POWER) ? s.with(RedstoneWireBlock.POWER, 15) : s, false); + scene.world.toggleRedstonePower(util.select.position(leverPos)); + scene.world.toggleRedstonePower(shafts); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(gears1, f -> -32f); + scene.world.modifyKineticSpeed(gears2, f -> 32f); + + scene.idle(20); + scene.overlay.showText(120) + .text("Same rules apply for the propagated rotation") + .pointAt(util.vector.topOf(0, 3, 3)) + .placeNearTarget(); + scene.idle(20); + + for (boolean flip2 : Iterate.trueAndFalse) { + scene.effects.rotationDirectionIndicator(util.grid.at(0, 3, 3)); + scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 3)); + + scene.idle(60); + scene.world.modifyBlocks(util.select.fromTo(4, 1, 2, 4, 2, 2), s -> s.cycle(BlockStateProperties.POWERED), + false); + scene.effects.indicateRedstone(util.grid.at(4, 2, 2)); + scene.world.modifyKineticSpeed(gears1, f -> -f); + scene.world.modifyKineticSpeed(gears2, f -> -f); + + if (!flip2) { + scene.effects.rotationDirectionIndicator(util.grid.at(0, 3, 3)); + scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 3)); + scene.markAsFinished(); + } + } + + } + + public static void subgantry(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Cascaded Gantries"); + scene.configureBasePlate(0, 0, 5); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.showSection(util.select.layer(0) + .add(util.select.column(5, 3)) + .add(util.select.fromTo(2, 1, 3, 4, 1, 3)), Direction.UP); + scene.idle(10); + + BlockPos gantryPos = util.grid.at(5, 1, 2); + BlockPos gantryPos2 = util.grid.at(3, 2, 2); + ElementLink gantry = + scene.world.showIndependentSection(util.select.position(gantryPos), Direction.SOUTH); + scene.idle(5); + + scene.world.showSectionAndMerge(util.select.fromTo(0, 1, 2, 4, 1, 2), Direction.EAST, gantry); + scene.idle(15); + + scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); + scene.overlay.showText(60) + .text("Gantry shafts attach to a carriage without the need of super glue") + .independent(20); + scene.idle(40); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(gantry, util.vector.of(0, -2, 0), 40); + scene.idle(40); + + ElementLink secondGantry = + scene.world.showIndependentSection(util.select.position(gantryPos2), Direction.DOWN); + scene.idle(15); + scene.overlay.showText(60) + .text("Same applies for carriages on moved Gantry Shafts") + .independent(20); + scene.idle(15); + + scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); + scene.world.moveSection(secondGantry, util.vector.of(0, 2, 0), 40); + + scene.idle(40); + BlockPos leverPos = util.grid.at(2, 1, 3); + scene.world.toggleRedstonePower(util.select.position(leverPos)); + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 3, 4, 1, 3)); + scene.world.toggleRedstonePower(util.select.fromTo(5, 1, 3, 5, 4, 3)); + scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 5, 1, 2), f -> -32f); + scene.effects.indicateRedstone(leverPos); + scene.world.moveSection(secondGantry, util.vector.of(-3, 0, 0), 60); + + scene.idle(20); + scene.overlay.showText(120) + .text("Thus, a gantry system can be cascaded to cover multiple axes of movement") + .independent(20); + } + +} 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 d186e6a4e..97351eb01 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 static com.simibubi.create.foundation.ponder.content.PonderPalette.WHITE; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; import com.simibubi.create.foundation.ponder.SceneBuilder; @@ -52,8 +50,9 @@ public class KineticsScenes { scene.world.setKineticSpeed(gauge, 64); scene.effects.indicateSuccess(gaugePos); scene.idle(10); - scene.overlay.showTargetedText(WHITE, util.vector.of(3, 1.5, 2.5), "shaft_relay", - "Shafts will relay rotation in a straight line.", 1000); + scene.overlay.showText(1000) + .text("Shafts will relay rotation in a straight line.") + .pointAt(util.vector.of(3, 1.5, 2.5)); scene.idle(20); scene.markAsFinished(); @@ -92,8 +91,9 @@ public class KineticsScenes { scene.world.setKineticSpeed(shaft, -112); scene.idle(10); - scene.overlay.showTargetedText(WHITE, util.vector.of(1.5, 2, 2.5), "shaft_can_be_encased", - "Andesite or Brass Casing can be used to encase them.", 1000); + scene.overlay.showText(1000) + .text("Andesite or Brass Casing can be used to encase them.") + .pointAt(util.vector.topOf(1, 1, 2)); } } 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 1dd3ee9a0..f635b1e40 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 @@ -25,6 +25,14 @@ public class PonderIndex { .addStoryBoard("funnels/redstone", FunnelScenes::redstone) .addStoryBoard("funnels/transposer", FunnelScenes::transposer); PonderRegistry.addStoryBoard(AllBlocks.ANDESITE_FUNNEL, "funnels/brass", FunnelScenes::brass); + + // Gantries + PonderRegistry.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft); + PonderRegistry.addStoryBoard(AllBlocks.GANTRY_CARRIAGE, "gantry/intro", GantryScenes::introForPinion); + PonderRegistry.forComponents(AllBlocks.GANTRY_SHAFT, AllBlocks.GANTRY_CARRIAGE) + .addStoryBoard("gantry/redstone", GantryScenes::redstone) + .addStoryBoard("gantry/direction", GantryScenes::direction) + .addStoryBoard("gantry/subgantry", GantryScenes::subgantry); // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java index 84b615ad1..ed37b8ea6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -9,6 +9,8 @@ public class SharedText { add("sneak_and", "Sneak +"); add("ctrl_and", "Ctrl +"); + + add("movement_anchors", "With the help of Chassis or Super Glue, larger structures can be moved."); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java index 087190cf8..44773221a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/OutlinerElement.java @@ -1,16 +1,19 @@ package com.simibubi.create.foundation.ponder.elements; -import java.util.function.Consumer; +import java.util.function.Function; import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.utility.outliner.Outline.OutlineParams; import com.simibubi.create.foundation.utility.outliner.Outliner; public class OutlinerElement extends AnimatedSceneElement { - private Consumer outlinerCall; + private Function outlinerCall; + private int overrideColor; - public OutlinerElement(Consumer outlinerCall) { + public OutlinerElement(Function outlinerCall) { this.outlinerCall = outlinerCall; + this.overrideColor = -1; } @Override @@ -20,7 +23,13 @@ public class OutlinerElement extends AnimatedSceneElement { return; if (fade.getValue(0) > fade.getValue(1)) return; - outlinerCall.accept(scene.getOutliner()); + OutlineParams params = outlinerCall.apply(scene.getOutliner()); + if (overrideColor != -1) + params.colored(overrideColor); + } + + public void setColor(int overrideColor) { + this.overrideColor = overrideColor; } } 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 b9e03a520..0afd83aee 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 @@ -5,8 +5,10 @@ import java.util.function.Supplier; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.ponder.PonderLocalization; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.ponder.content.PonderPalette; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.util.math.MathHelper; @@ -16,37 +18,59 @@ import net.minecraftforge.fml.client.gui.GuiUtils; public class TextWindowElement extends AnimatedOverlayElement { - Supplier textGetter; + Supplier textGetter = () -> "(?) No text was provided"; String bakedText; // from 0 to 200 int y; - - Vec3d vec; - boolean nearScene; - int color; - - public TextWindowElement(Supplier textGetter) { - this.textGetter = textGetter; - } - - public void colored(int color) { - this.color = color; - } - - public TextWindowElement pointAt(Vec3d vec) { - this.vec = vec; - return this; - } - - public TextWindowElement setY(int y) { - this.y = y; - return this; - } - public TextWindowElement placeNearTarget() { - this.nearScene = true; - return this; + Vec3d vec; + + boolean nearScene = false; + int color = PonderPalette.WHITE.getColor(); + + public class Builder { + + private PonderScene scene; + + public Builder(PonderScene scene) { + this.scene = scene; + } + + public Builder colored(PonderPalette color) { + TextWindowElement.this.color = color.getColor(); + return this; + } + + public Builder pointAt(Vec3d vec) { + TextWindowElement.this.vec = vec; + return this; + } + + public Builder independent(int y) { + TextWindowElement.this.y = y; + return this; + } + + public Builder independent() { + return independent(0); + } + + public Builder text(String defaultText) { + textGetter = scene.registerText(defaultText); + return this; + } + + public Builder sharedText(String key) { + textGetter = () -> PonderLocalization.getShared(key); + return this; + } + + public Builder placeNearTarget() { + TextWindowElement.this.nearScene = true; + return this; + } + } @Override @@ -60,10 +84,10 @@ public class TextWindowElement extends AnimatedOverlayElement { float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); - + if (nearScene) targetX = (int) Math.min(targetX, sceneToScreen.x + 50); - + int textWidth = Math.min(screen.width - targetX, 180); List list = screen.getFontRenderer() @@ -96,4 +120,8 @@ public class TextWindowElement extends AnimatedOverlayElement { RenderSystem.popMatrix(); } + public int getColor() { + return color; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index 6ad6a0e68..308b8dfc0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -291,8 +291,10 @@ public class WorldSectionElement extends AnimatedSceneElement { renderedTileEntities = new ArrayList<>(); section.forEach(pos -> { TileEntity tileEntity = world.getTileEntity(pos); - if (tileEntity != null) - renderedTileEntities.add(tileEntity); + if (tileEntity == null) + return; + renderedTileEntities.add(tileEntity); + tileEntity.updateContainingBlockInfo(); }); } else renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java index 07cd403c8..e180ac92a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/DisplayWorldSectionInstruction.java @@ -1,5 +1,8 @@ package com.simibubi.create.foundation.ponder.instructions; +import java.util.Optional; +import java.util.function.Supplier; + import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; @@ -9,34 +12,33 @@ import net.minecraft.util.Direction; public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction { private Selection initialSelection; - private boolean mergeToBase; + private Optional> mergeOnto; - public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, boolean mergeToBase) { + public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, + Optional> mergeOnto) { super(fadeInTicks, fadeInFrom, new WorldSectionElement(selection)); initialSelection = selection; - this.mergeToBase = mergeToBase; + this.mergeOnto = mergeOnto; } - + @Override protected void firstTick(PonderScene scene) { super.firstTick(scene); element.set(initialSelection); element.setVisible(true); } - + @Override public void tick(PonderScene scene) { super.tick(scene); if (remainingTicks > 0) return; - if (!mergeToBase) - return; - element.mergeOnto(scene.getBaseWorldSection()); + mergeOnto.ifPresent(c -> element.mergeOnto(c.get())); } @Override protected Class getElementClass() { return WorldSectionElement.class; } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java index ebcc0329a..d0380cc81 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/TextInstruction.java @@ -1,46 +1,31 @@ package com.simibubi.create.foundation.ponder.instructions; -import java.util.function.Supplier; - import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.OutlinerElement; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; -import net.minecraft.util.math.Vec3d; - public class TextInstruction extends FadeInOutInstruction { private TextWindowElement element; private OutlinerElement outline; - protected TextInstruction(int color, Supplier text, int duration) { + public TextInstruction(TextWindowElement element, int duration) { super(duration); + this.element = element; } - public TextInstruction(int color, Supplier text, int duration, Selection selection, boolean near) { - this(color, text, duration); - element = new TextWindowElement(text).pointAt(selection.getCenter()); - element.colored(color); + public TextInstruction(TextWindowElement element, int duration, Selection selection) { + this(element, duration); outline = new OutlinerElement(o -> selection.makeOutline(o) - .lineWidth(1 / 16f) - .colored(color)); - if (near) - element.placeNearTarget(); + .lineWidth(1 / 16f)); } - public TextInstruction(int color, Supplier text, int duration, Vec3d position, boolean near) { - this(color, text, duration); - element = new TextWindowElement(text).pointAt(position); - element.colored(color); - if (near) - element.placeNearTarget(); - } - - public TextInstruction(int color, Supplier text, int duration, int y) { - this(color, text, duration); - element = new TextWindowElement(text).setY(y); - element.colored(color); + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (outline != null) + outline.setColor(element.getColor()); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java index 7e387de05..583514b67 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/WorldModifyInstruction.java @@ -21,7 +21,7 @@ public abstract class WorldModifyInstruction extends PonderInstruction { @Override public void tick(PonderScene scene) { runModification(selection, scene); - if (needsRedraw()) + if (needsRedraw()) scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/horizontal.json b/src/main/resources/assets/create/models/block/gantry_carriage/horizontal.json similarity index 100% rename from src/main/resources/assets/create/models/block/gantry_pinion/horizontal.json rename to src/main/resources/assets/create/models/block/gantry_carriage/horizontal.json diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/item.json b/src/main/resources/assets/create/models/block/gantry_carriage/item.json similarity index 100% rename from src/main/resources/assets/create/models/block/gantry_pinion/item.json rename to src/main/resources/assets/create/models/block/gantry_carriage/item.json diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/vertical.json b/src/main/resources/assets/create/models/block/gantry_carriage/vertical.json similarity index 100% rename from src/main/resources/assets/create/models/block/gantry_pinion/vertical.json rename to src/main/resources/assets/create/models/block/gantry_carriage/vertical.json diff --git a/src/main/resources/assets/create/models/block/gantry_pinion/wheels.json b/src/main/resources/assets/create/models/block/gantry_carriage/wheels.json similarity index 100% rename from src/main/resources/assets/create/models/block/gantry_pinion/wheels.json rename to src/main/resources/assets/create/models/block/gantry_carriage/wheels.json diff --git a/src/main/resources/ponder/gantry/direction.nbt b/src/main/resources/ponder/gantry/direction.nbt new file mode 100644 index 0000000000000000000000000000000000000000..689314cd047f8a203d0a591d7150983793249cd7 GIT binary patch literal 819 zcmV-31I+v%iwFP!000000KJ#rZqqOn#!nKbO}oJg`^PhYkhtA0feW~qkR}jtQ+cVI zTFc_d_Q=N79)+ji8s3bPHc7M8Y0Z|+Qj}#n{yzWCId+;MzyOHiKbZ#r`PIXV;N=e> zV2S3MGX?n=K<_LT;kg>(!|MTfsZiylYIxu)O*JcK)MFe&jMIp5Ep$8!9b%zV4rh&y zV~A<$xE4B|g$}XMDTiy3XV)Un>vTK|9b%zVmBJ#=o<*M5>39}8#6qVW#3IkcBG2n| zJPRFS)ER=8oM|8Y)0DBv-j*~mrYi`;HdYw+u(Q$56H1wa6~lG@_MXhbgG*a&kKs7Tr+nZK7}u6n=NL@H?T{-$daVD0+{%FGeK=qf*WI zD#F1g1Y$twKPH0R5p`g5L^U~r1_!ioEEckNyCYJbaFMheA@!HgpmP`R-Y({(8erUp z&9HkL?{RFPw5!={Jq*pNjroYK|BT&kIRNW1Pg?q*9`m$i|JGx6TGms4eUDna*2R!w z-EPCHpVF9V&GIjdX918Cdcoku1?Df5c&r|0Gp^Y<6bU96CzTO<%LtW-Y&`!=$y?)- z6e*MW7fb+K8T!arL=l$HpVC+{oKLT~0_UodDoYnr8RbqIAAdD(qNt<32mckxOCJ!&0v2J8n($Il$vra4TtGktZr;uqYbcx_Aaj9nk zjBxJ?&QDLIYU|E%u165B4%5mS!rBsKvqdWk4L!PyJS>M0R2 ze@aA>E6?n6<^i?^-1fw%$`szc8utUl9=ehJXCsOa~eg006|9k68c! literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/gantry/intro.nbt b/src/main/resources/ponder/gantry/intro.nbt new file mode 100644 index 0000000000000000000000000000000000000000..20f0b8c2d26b0d653e07e7bad65fdd1bb9078a9a GIT binary patch literal 708 zcmV;#0z3U5iwFP!000000M(Y?Z__Xk$1kzdrk#LE41~mwO(5|$Hnc$ttYCg3IV z5;wK##*ytR+n)AU@y>t7c}+?ever@=+AKv*o4b$i>pP!31Q-A{;*t{pa8D1P$UOsy zd0~YW+<+Sc=$%QGPR$U1ydMB5m1&%ogFs{~v%L0LwFx?Gf|gC_!66cMG7u!a+K z*t9vJ2ZwlYs0Sx%;##o@Z_yQccMFS_1I_X zvCr!`#DhaSIYS`DnT;SCm7Hh4uAJZQ3BH=^Kfab3S_VVtpKx0#J&hp#z)F@1d-3VY zf$0dF1A<}-;pYrzjQHR%g5Jn#ZWgT}hEQbiEY%!gM@Gy_$&;xlxE1LTE!AA7*kFQh zXnTP3cbpG#{(~B&*J5==krwYF=weQoV+B*6z9dL_| zMId`Ox3d(5P({aXg{@WMdKCgYqf{#?Pnn!we^_uI*W7f%j1i`zib#t%*osL1IWg)W z4!2fK|B7({{gO#;Eq7Piofzl|n{jwC!7 zeN}9ll#&%w;{<%ss^r>TsAJfvFbXYIo@1RvV>Ed+{KYs6V7Fu z)h|`W^(v=i+5+K47DI20$E3)CR@~Snxa%x?VtX@@Ws=_k*`-F?ZNPrJ`lP9qTlTYA zKb)5_>^kp+Nmb;@SZEAr!Clgx-;66|S__u*HuRCfHZ#3Q&Xl!k)(-9xPjzizRoPx* qSq4~GOeal^uU~;$J>PNxJZvACWv5&l*P9^z3BLhM#=&th4gdgg4|YVF|Gy2v*0ibPSczX9H%Fy z%W*9@o&|?laGK^?`0QHvyouvkaF_+BT?z}IJqw>VaXbqSv*0w1S@_H>eBQ+IEI6!} z6M>hX8z20$0x|i0TaDYB&`(|e@wrGS(urU+K~qX~;Y0Y27d#f``onDnW@l9R1PU3r z9}}wiU*Ntt@gX=f3iVythv13?4r7G`JJn)QWH`MLIT{g16e%xNOoxZ_m12*n|3>`@ z_1~#~+12VVb*%1jx1*!}-lJpFM0%FS?WFNKY2L0$Gl*UL%UPy8H|lz-=X_?mW<6V) zb-Fa`RbS!MN>)^`;Z%$UQL(>Gh0~+LA5KLuh>C-4D%_z})F;ruDh{`)@Sax1Fm-XX zO$F;w5&X~UwmS@uY!1V&j?tqI!-I!*79tli?{UlRWC_>oi`DDWcumaenHo{dsNfkI zgVn8YCj>U(3xwwj@+4NYx~Jt_7@Wp3r@7LgCgR{eLg%ua)>lgcMxT@{P*u0i5Ozw+ zqcWMM)L+pWzuKb!pSWf8(&HG0Z3nWxj4P&A=C zZc96QIIoy1C3uQmC?hD+*i1^*<3Ot!`HJS<`wf}l4^)3a>u8qCoDja2muB9+}?~7wQ0vG@_;twYPP(D3;g7O(a z$fXrla06uJ;rN^@ftC{1BWFE<7=K`q!)rOQh1zbj-%r-lUAR{X2M3c#kALWnf|Ut zycQ9%YZ3o0M95u;&=wJTEs?`bkz7cjWJ4urQ3-agQoWgVm0m;T{YAS<1pO0k3#HEj z2tTl#CBmM6x+tM^h^H5#`V{=nIL-bg_?Jfk^oCY*vpBmJlYFwAq!H6R4`>9$Hhcg9w$noVN9wb4p$LIsv@3WbaC?07p-!x%R6w0Y*lcLJ7F+lncMytTN yI(V;Zoo6c@oRzVd6Bj~XSqw|PrNS-f5!n04Ec?c_DK9_}{)K<6Kq@t34*&o^T2`t6 literal 0 HcmV?d00001 From d590b23aa731f919d06eb49bf9368ed62d0017c2 Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 4 Mar 2021 12:53:24 +0100 Subject: [PATCH 16/23] tagging along - added tags and chapters to the ponder registry - slightly changed how scenes are registered - added a back stack to the screen opener and some animations to go along with it - added a interface for icons drawn into screens --- .../com/simibubi/create/CreateClient.java | 15 +- .../simibubi/create/events/ClientEvents.java | 10 +- .../foundation/command/AllCommands.java | 1 + .../command/ConfigureConfigPacket.java | 7 + .../foundation/command/PonderCommand.java | 25 ++ .../foundation/gui/AbstractSimiScreen.java | 144 ++++++++++- .../create/foundation/gui/AllGuiTextures.java | 12 +- .../create/foundation/gui/AllIcons.java | 11 +- .../foundation/gui/IScreenRenderable.java | 18 ++ .../create/foundation/gui/ScreenOpener.java | 76 ++++-- .../create/foundation/gui/UIRenderHelper.java | 174 +++++++++++++ .../foundation/ponder/PonderRegistry.java | 123 +++++++--- .../create/foundation/ponder/PonderScene.java | 41 +--- .../ponder/PonderStoryBoardEntry.java | 26 +- .../ponder/PonderTooltipHandler.java | 16 +- .../create/foundation/ponder/PonderUI.java | 154 ++++++++++-- .../ponder/content/DebugScenes.java | 17 +- .../ponder/content/PonderChapter.java | 52 ++++ .../ponder/content/PonderChapterRegistry.java | 49 ++++ .../ponder/content/PonderIndex.java | 33 ++- .../ponder/content/PonderIndexScreen.java | 170 +++++++++++++ .../foundation/ponder/content/PonderTag.java | 88 +++++++ .../ponder/content/PonderTagRegistry.java | 94 +++++++ .../ponder/content/PonderTagScreen.java | 231 ++++++++++++++++++ .../foundation/ponder/ui/ChapterLabel.java | 39 +++ .../foundation/ponder/ui/LayoutHelper.java | 126 ++++++++++ .../foundation/ponder/ui/PonderButton.java | 34 ++- .../foundation/utility/LerpedFloat.java | 4 + .../ponder/chapter/basic_kinetics.png | Bin 0 -> 7389 bytes .../textures/ponder/tag/item_transfer.png | Bin 0 -> 7389 bytes 30 files changed, 1619 insertions(+), 171 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/command/PonderCommand.java create mode 100644 src/main/java/com/simibubi/create/foundation/gui/IScreenRenderable.java create mode 100644 src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapterRegistry.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java create mode 100644 src/main/resources/assets/create/textures/ponder/chapter/basic_kinetics.png create mode 100644 src/main/resources/assets/create/textures/ponder/tag/item_transfer.png diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index 482cf089b..c411a9e26 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -1,10 +1,5 @@ package com.simibubi.create; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; - import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; @@ -14,6 +9,7 @@ import com.simibubi.create.content.schematics.client.SchematicHandler; import com.simibubi.create.foundation.ResourceReloadHandler; import com.simibubi.create.foundation.block.render.CustomBlockModels; import com.simibubi.create.foundation.block.render.SpriteShifter; +import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.ponder.content.PonderIndex; @@ -24,7 +20,6 @@ import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.OptifineHandler; import com.simibubi.create.foundation.utility.ghost.GhostBlocks; import com.simibubi.create.foundation.utility.outliner.Outliner; - import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BlockModelShapes; @@ -42,6 +37,11 @@ import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + public class CreateClient { public static ClientSchematicLoader schematicSender; @@ -90,6 +90,9 @@ public class CreateClient { getColorHandler().init(); AllFluids.assignRenderLayers(); PonderIndex.register(); + PonderIndex.registerTags(); + + UIRenderHelper.init(); IResourceManager resourceManager = Minecraft.getInstance() .getResourceManager(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 9a2811ab0..f03338c00 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -1,8 +1,5 @@ package com.simibubi.create.events; -import java.util.ArrayList; -import java.util.List; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllFluids; @@ -25,7 +22,6 @@ import com.simibubi.create.content.curiosities.zapper.blockzapper.BlockzapperRen import com.simibubi.create.content.curiosities.zapper.terrainzapper.WorldshaperRenderHandler; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionPointHandler; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; @@ -40,7 +36,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; - import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -68,6 +63,9 @@ import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import java.util.ArrayList; +import java.util.List; + @EventBusSubscriber(value = Dist.CLIENT) public class ClientEvents { @@ -95,7 +93,7 @@ public class ClientEvents { CouplingPhysics.tick(world); PonderTooltipHandler.tick(); - ScreenOpener.tick(); + //ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); FilteringRenderer.tick(); diff --git a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java index 760fe23c3..66d1ea8e8 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -28,6 +28,7 @@ public class AllCommands { .then(FixLightingCommand.register()) .then(HighlightCommand.register()) .then(CouplingCommand.register()) + .then(PonderCommand.register()) //utility .then(util) diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java index 692933155..bb54b2db4 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -4,6 +4,7 @@ import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.ponder.content.PonderIndexScreen; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -65,6 +66,7 @@ public class ConfigureConfigPacket extends SimplePacketBase { fixLighting(() -> Actions::experimentalLighting), overlayReset(() -> Actions::overlayReset), experimentalRendering(() -> Actions::experimentalRendering), + ponderIndex(() -> Actions::ponderIndex), ; @@ -130,6 +132,11 @@ public class ConfigureConfigPacket extends SimplePacketBase { Minecraft.getInstance().worldRenderer.loadRenderers(); } + @OnlyIn(Dist.CLIENT) + private static void ponderIndex(String value) { + ScreenOpener.transitionTo(new PonderIndexScreen()); + } + private static ITextComponent boolToText(boolean b) { return b ? new StringTextComponent("enabled").applyTextStyle(TextFormatting.DARK_GREEN) diff --git a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java new file mode 100644 index 000000000..b69b5664b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.simibubi.create.foundation.networking.AllPackets; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraftforge.fml.network.PacketDistributor; + +public class PonderCommand { + + static ArgumentBuilder register() { + return Commands.literal("ponder") + .requires(cs -> cs.hasPermissionLevel(0)) + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().asPlayer(); + + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> player), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.ponderIndex.name(), "")); + + return 1; + }); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index 2b1902376..25ebdcac4 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -1,16 +1,23 @@ package com.simibubi.create.foundation.gui; -import java.util.ArrayList; -import java.util.List; - +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; - +import com.simibubi.create.foundation.utility.LerpedFloat; +import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.Widget; import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; +import org.apache.logging.log4j.LogManager; +import org.lwjgl.glfw.GLFW; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; @OnlyIn(Dist.CLIENT) public abstract class AbstractSimiScreen extends Screen { @@ -18,6 +25,7 @@ public abstract class AbstractSimiScreen extends Screen { protected int sWidth, sHeight; protected int guiLeft, guiTop; protected List widgets; + public final LerpedFloat transition = LerpedFloat.linear().startWithValue(0).chase(0, .1f, LerpedFloat.Chaser.LINEAR); protected AbstractSimiScreen() { super(new StringTextComponent("")); @@ -31,17 +39,86 @@ public abstract class AbstractSimiScreen extends Screen { guiTop = (this.height - sHeight) / 2; } + @Override + public void tick() { + super.tick(); + + transition.tickChaser(); + + if (transition.getValue() < -0.9995f) { + transition.updateChaseTarget(0); + transition.setValue(0); + ScreenOpener.openLastScreen(); + } else if (transition.getValue() > 0.9995f) { + transition.updateChaseTarget(0); + transition.setValue(0); + } + } + @Override public void render(int mouseX, int mouseY, float partialTicks) { + + RenderSystem.pushMatrix(); + renderTransition(mouseX, mouseY, partialTicks); + partialTicks = Minecraft.getInstance() .getRenderPartialTicks(); renderBackground(); renderWindow(mouseX, mouseY, partialTicks); for (Widget widget : widgets) widget.render(mouseX, mouseY, partialTicks); + + renderBreadcrumbs(mouseX, mouseY, partialTicks); + renderWindowForeground(mouseX, mouseY, partialTicks); for (Widget widget : widgets) widget.renderToolTip(mouseX, mouseY); + + RenderSystem.popMatrix(); + } + + private void renderTransition(int mouseX, int mouseY, float partialTicks) { + if (transition.getChaseTarget() != 0) { + if (ScreenOpener.getLastScreen() == null) { + return; + } else if (ScreenOpener.getLastScreen() == this) { + LogManager.getLogger().warn("Tired to render last screen recursively during transition"); + return; + } + //draw last screen into buffer + RenderSystem.pushMatrix();//1 + UIRenderHelper.framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC); + UIRenderHelper.prepFramebufferSize(); + RenderSystem.pushMatrix();//2 + RenderSystem.translated(0, 0, -1000); + UIRenderHelper.framebuffer.bindFramebuffer(true); + ScreenOpener.getLastScreen().render(mouseX, mouseY, partialTicks); + RenderSystem.popMatrix();//2 + Minecraft.getInstance().getFramebuffer().bindFramebuffer(true); + + //use the buffer texture + float transitionValue = transition.getValue(partialTicks); + if (transition.getChaseTarget() < 0) + transitionValue += 1; + //transitionV is ~1 when the older screen is hidden + //transitionV is ~0 when the older screen is still fully visible + double scale = 1 - 0.25 * transitionValue; + MainWindow window = Minecraft.getInstance().getWindow(); + int sw = window.getScaledWidth(); + int sh = window.getScaledHeight(); + RenderSystem.translated(sw * 0.5, sh * 0.5, -10); + RenderSystem.scaled(scale, scale, 1); + RenderSystem.translated(sw * -0.5, sh * -0.5, 0); + + UIRenderHelper.drawFramebuffer(sw, sh, 1f - transitionValue); + RenderSystem.popMatrix();//1 + + //modify current screen as well + scale = 1 + 0.02 * (1 - transitionValue); + RenderSystem.translated(sw * 0.5, sh * 0.5, 0); + RenderSystem.scaled(scale, scale, 1); + RenderSystem.translated(sw * -0.5, sh * -0.5, 0); + } } @Override @@ -60,6 +137,12 @@ public abstract class AbstractSimiScreen extends Screen { if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_)) return true; } + + if (code == GLFW.GLFW_KEY_BACKSPACE) { + ScreenOpener.transitionToLast(); + return true; + } + return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } @@ -98,6 +181,12 @@ public abstract class AbstractSimiScreen extends Screen { return true; } + @Override + public void onClose() { + ScreenOpener.clearStack(); + super.onClose(); + } + @Override public boolean isPauseScreen() { return false; @@ -105,6 +194,53 @@ public abstract class AbstractSimiScreen extends Screen { protected abstract void renderWindow(int mouseX, int mouseY, float partialTicks); + protected void renderBreadcrumbs(int mouseX, int mouseY, float partialTicks) { + List history = ScreenOpener.getScreenHistory(); + if (history.isEmpty()) + return; + + history.add(0, Minecraft.getInstance().currentScreen); + int spacing = 20; + + List names = history + .stream() + .map(AbstractSimiScreen::screenTitle) + .collect(Collectors.toList()); + + int bWidth = names + .stream() + .mapToInt(s -> font.getStringWidth(s) + spacing) + .sum(); + + MutableInt x = new MutableInt(width - bWidth); + MutableInt y = new MutableInt(height - 18); + MutableBoolean first = new MutableBoolean(true); + + if (x.getValue() < 25) + x.setValue(25); + + names.forEach(s -> { + int sWidth = font.getStringWidth(s); + //UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, 14, spacing/2, 0xbbababab, 0x22ababab); + UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, 14, spacing/2, 0xdd101010, 0x44101010); + drawString(font, s, x.getValue() + 5, y.getValue() + 3, first.getValue() ? 0xffeeffee : 0xffddeeff); + first.setFalse(); + + x.add(sWidth + spacing); + }); + } + + private static String screenTitle(Screen screen) { + if (screen instanceof AbstractSimiScreen) + return ((AbstractSimiScreen) screen).getBreadcrumbTitle(); + + return screen.getClass().getSimpleName(); + } + + protected String getBreadcrumbTitle() { + return this.getClass().getSimpleName(); + } + protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) { for (Widget widget : widgets) { if (!widget.isHovered()) diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java index efe59e30a..b69069be6 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllGuiTextures.java @@ -1,15 +1,13 @@ package com.simibubi.create.foundation.gui; import com.simibubi.create.Create; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public enum AllGuiTextures { +public enum AllGuiTextures implements IScreenRenderable { // Inventories PLAYER_INVENTORY("player_inventory.png", 176, 108), @@ -117,16 +115,10 @@ public enum AllGuiTextures { .bindTexture(location); } + @Override @OnlyIn(Dist.CLIENT) public void draw(AbstractGui screen, int x, int y) { bind(); screen.blit(x, y, startX, startY, width, height); } - - @OnlyIn(Dist.CLIENT) - public void draw(int x, int y) { - draw(new Screen(null) { - }, x, y); - } - } diff --git a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java index 7d85393c7..17806fb70 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AllIcons.java @@ -5,10 +5,8 @@ import com.mojang.blaze3d.matrix.MatrixStack.Entry; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.ColorHelper; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; -import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; import net.minecraft.util.ResourceLocation; @@ -16,7 +14,7 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public class AllIcons { +public class AllIcons implements IScreenRenderable { public static final ResourceLocation ICON_ATLAS = Create.asResource("textures/gui/icons.png"); private static int x = 0, y = -1; @@ -146,18 +144,13 @@ public class AllIcons { .bindTexture(ICON_ATLAS); } + @Override @OnlyIn(Dist.CLIENT) public void draw(AbstractGui screen, int x, int y) { bind(); screen.blit(x, y, iconX, iconY, 16, 16); } - @OnlyIn(Dist.CLIENT) - public void draw(int x, int y) { - draw(new Screen(null) { - }, x, y); - } - @OnlyIn(Dist.CLIENT) public void draw(MatrixStack ms, IRenderTypeBuffer buffer, int color) { IVertexBuilder builder = buffer.getBuffer(RenderType.getTextSeeThrough(ICON_ATLAS)); diff --git a/src/main/java/com/simibubi/create/foundation/gui/IScreenRenderable.java b/src/main/java/com/simibubi/create/foundation/gui/IScreenRenderable.java new file mode 100644 index 000000000..d4e16c6aa --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/IScreenRenderable.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.gui; + +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public interface IScreenRenderable { + + @OnlyIn(Dist.CLIENT) + void draw(AbstractGui screen, int x, int y); + + @OnlyIn(Dist.CLIENT) + default void draw(int x, int y) { + draw(new Screen(new StringTextComponent("")) {}, x, y); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java index bef5042de..59a08da3a 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -2,28 +2,72 @@ package com.simibubi.create.foundation.gui; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.fml.DistExecutor; + +import javax.annotation.Nullable; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; public class ScreenOpener { - @OnlyIn(Dist.CLIENT) - private static Screen openedGuiNextTick; + private static final Deque backStack = new ArrayDeque<>(); - public static void tick() { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - if (openedGuiNextTick != null) { - Minecraft.getInstance().displayGuiScreen(openedGuiNextTick); - openedGuiNextTick = null; - } - }); + public static void open(Screen screen) { + open(Minecraft.getInstance().currentScreen, screen); } - public static void open(Screen gui) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> { - openedGuiNextTick = gui; - }); + public static void open(@Nullable Screen current, Screen toOpen) { + if (current != null) { + if (backStack.size() >= 15) //don't go deeper than 15 steps + backStack.pollLast(); + + backStack.push(current); + } else + backStack.clear(); + + openScreen(toOpen); + } + + public static void openLastScreen() { + if (backStack.isEmpty()) + return; + + openScreen(backStack.pop()); + } + + //transitions are only supported in simiScreens atm. they take care of all the rendering for it + public static void transitionTo(AbstractSimiScreen screen) { + screen.transition.updateChaseTarget(1); + open(screen); + } + + public static void transitionToLast() { + if (backStack.isEmpty()) + return; + + Screen currentScreen = Minecraft.getInstance().currentScreen; + if (currentScreen instanceof AbstractSimiScreen) + ((AbstractSimiScreen) currentScreen).transition.updateChaseTarget(-1); + else + openLastScreen(); + } + + public static void clearStack() { + backStack.clear(); + } + + public static List getScreenHistory() { + return new ArrayList<>(backStack); + } + + @Nullable + public static Screen getLastScreen() { + return backStack.peek(); + } + + private static void openScreen(Screen screen) { + Minecraft.getInstance().enqueue(() -> Minecraft.getInstance().displayGuiScreen(screen)); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java new file mode 100644 index 000000000..87816728e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java @@ -0,0 +1,174 @@ +package com.simibubi.create.foundation.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.utility.ColorHelper; +import net.minecraft.client.MainWindow; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.BufferBuilder; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.client.shader.Framebuffer; +import net.minecraftforge.fml.client.gui.GuiUtils; +import org.lwjgl.opengl.GL11; + +public class UIRenderHelper { + + public static Framebuffer framebuffer; + + public static void init() { + RenderSystem.recordRenderCall(() -> { + MainWindow mainWindow = Minecraft.getInstance().getWindow(); + framebuffer = new Framebuffer(mainWindow.getFramebufferWidth(), mainWindow.getFramebufferHeight(), true, Minecraft.IS_RUNNING_ON_MAC); + framebuffer.deleteFramebuffer(); + }); + } + + public static void prepFramebufferSize() { + MainWindow window = Minecraft.getInstance().getWindow(); + if (framebuffer.framebufferWidth != window.getFramebufferWidth() || framebuffer.framebufferHeight != window.getFramebufferHeight()) { + framebuffer.func_216491_a(window.getFramebufferWidth(), window.getFramebufferHeight(), Minecraft.IS_RUNNING_ON_MAC); + } + } + + public static void drawFramebuffer(int width, int height, float alpha) { + float vx = (float) width; + float vy = (float) height; + float tx = (float) framebuffer.framebufferWidth / (float) framebuffer.framebufferTextureWidth; + float ty = (float) framebuffer.framebufferHeight / (float) framebuffer.framebufferTextureHeight; + + + RenderSystem.enableTexture(); + RenderSystem.enableBlend(); + RenderSystem.disableLighting(); + RenderSystem.disableAlphaTest(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + framebuffer.bindFramebufferTexture(); + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuffer(); + bufferbuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR_TEXTURE); + + bufferbuilder.vertex(0, vy, 0).color(1, 1, 1, alpha).texture(0,0).endVertex(); + bufferbuilder.vertex(vx, vy, 0).color(1, 1, 1, alpha).texture(tx,0).endVertex(); + bufferbuilder.vertex(vx, 0, 0).color(1, 1, 1, alpha).texture(tx, ty).endVertex(); + bufferbuilder.vertex(0, 0, 0).color(1, 1, 1, alpha).texture(0, ty).endVertex(); + + tessellator.draw(); + framebuffer.unbindFramebufferTexture(); + RenderSystem.disableBlend(); + RenderSystem.enableAlphaTest(); + } + + //angle in degrees; 0° -> fading to the right + //x and y specify the middle point of the starting edge + //width is the total width of the streak + public static void streak(float angle, int x, int y, int width, int length, int color) { + int a1 = 0xa0 << 24; + int a2 = 0x80 << 24; + int a3 = 0x10 << 24; + int a4 = 0x00 << 24; + + color = color & 0x00FFFFFF; + int c1 = a1 | color; + int c2 = a2 | color; + int c3 = a3 | color; + int c4 = a4 | color; + + RenderSystem.pushMatrix(); + RenderSystem.translated(x, y, 0); + RenderSystem.rotatef(angle - 90, 0, 0, 1); + + streak(width/2, length, c1, c2, c3, c4); + + RenderSystem.popMatrix(); + } + + private static void streak(int width, int height, int c1, int c2, int c3, int c4) { + double split1 = .5; + double split2 = .75; + GuiUtils.drawGradientRect(0, -width, 0, width, (int) (split1 * height), c1, c2); + GuiUtils.drawGradientRect(0, -width, (int) (split1 * height), width, (int) (split2 * height), c2, c3); + GuiUtils.drawGradientRect(0, -width, (int) (split2 * height), width, height, c3, c4); + } + + //draws a wide chevron-style breadcrumb arrow pointing left + public static void breadcrumbArrow(int x, int y, int width, int height, int indent, int startColor, int endColor) { + RenderSystem.pushMatrix(); + RenderSystem.translated(x - indent, y, 0); + + breadcrumbArrow(width, height, indent, startColor, endColor); + + RenderSystem.popMatrix(); + } + + private static void breadcrumbArrow(int width, int height, int indent, int c1, int c2) { + + /* + * 0,0 x1,y1 ********************* x4,y4 ***** x7,y7 + * **** **** + * **** **** + * x0,y0 x2,y2 x5,y5 + * **** **** + * **** **** + * x3,y3 ********************* x6,y6 ***** x8,y8 + * + * */ + + double x0 = 0, y0 = height / 2d; + double x1 = indent, y1 = 0; + double x2 = indent, y2 = height / 2d; + double x3 = indent, y3 = height; + double x4 = width, y4 = 0; + double x5 = width, y5 = height / 2d; + double x6 = width, y6 = height; + double x7 = indent + width, y7 = 0; + double x8 = indent + width, y8 = height; + + int fc1 = ColorHelper.mixAlphaColors(c1, c2, 0); + int fc2 = ColorHelper.mixAlphaColors(c1, c2, (indent)/(width + 2f * indent)); + int fc3 = ColorHelper.mixAlphaColors(c1, c2, (indent + width)/(width + 2f * indent)); + int fc4 = ColorHelper.mixAlphaColors(c1, c2, 1); + + RenderSystem.disableTexture(); + RenderSystem.enableBlend(); + RenderSystem.disableAlphaTest(); + RenderSystem.defaultBlendFunc(); + RenderSystem.shadeModel(GL11.GL_SMOOTH); + + Tessellator tessellator = Tessellator.getInstance(); + BufferBuilder bufferbuilder = tessellator.getBuffer(); + bufferbuilder.begin(GL11.GL_TRIANGLES, DefaultVertexFormats.POSITION_COLOR); + + bufferbuilder.vertex(x0, y0, 0).color(fc1 >> 16 & 0xFF, fc1 >> 8 & 0xFF, fc1 & 0xFF, fc1 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x1, y1, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x2, y2, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + + bufferbuilder.vertex(x0, y0, 0).color(fc1 >> 16 & 0xFF, fc1 >> 8 & 0xFF, fc1 & 0xFF, fc1 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x2, y2, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x3, y3, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + + bufferbuilder.vertex(x3, y3, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x1, y1, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x4, y4, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + + bufferbuilder.vertex(x3, y3, 0).color(fc2 >> 16 & 0xFF, fc2 >> 8 & 0xFF, fc2 & 0xFF, fc2 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x4, y4, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x6, y6, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + + bufferbuilder.vertex(x5, y5, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x4, y4, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x7, y7, 0).color(fc4 >> 16 & 0xFF, fc4 >> 8 & 0xFF, fc4 & 0xFF, fc4 >> 24 & 0xFF).endVertex(); + + bufferbuilder.vertex(x6, y6, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x5, y5, 0).color(fc3 >> 16 & 0xFF, fc3 >> 8 & 0xFF, fc3 & 0xFF, fc3 >> 24 & 0xFF).endVertex(); + bufferbuilder.vertex(x8, y8, 0).color(fc4 >> 16 & 0xFF, fc4 >> 8 & 0xFF, fc4 & 0xFF, fc4 >> 24 & 0xFF).endVertex(); + + tessellator.draw(); + RenderSystem.shadeModel(GL11.GL_FLAT); + RenderSystem.disableBlend(); + RenderSystem.enableAlphaTest(); + RenderSystem.enableTexture(); + } +} 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 39a69fa25..0b93608c9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -1,22 +1,10 @@ package com.simibubi.create.foundation.ponder; -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.zip.GZIPInputStream; - import com.google.gson.JsonElement; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.content.PonderIndex; -import com.simibubi.create.foundation.ponder.content.SharedText; +import com.simibubi.create.foundation.ponder.content.*; import com.tterrag.registrate.util.entry.ItemProviderEntry; - import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompressedStreamTools; @@ -26,38 +14,66 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.function.Consumer; +import java.util.zip.GZIPInputStream; + public class PonderRegistry { - static Map> all = new HashMap<>(); + public static final PonderTagRegistry tags = new PonderTagRegistry(); + public static final PonderChapterRegistry chapters = new PonderChapterRegistry(); + public static Map> all = new HashMap<>(); - public static void addStoryBoard(ItemProviderEntry component, String schematic, PonderStoryBoard storyBoard) { + public static PonderSceneBuilder addStoryBoard(ItemProviderEntry component, String schematic, PonderStoryBoard storyBoard) { ResourceLocation id = component.getId(); - all.computeIfAbsent(id, $ -> new ArrayList<>()) - .add(new PonderStoryBoardEntry(storyBoard, schematic)); + PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, id); + PonderSceneBuilder builder = new PonderSceneBuilder(entry); + all.computeIfAbsent(id, _$ -> new ArrayList<>()).add(entry); + return builder; } - public static MultiSceneBuilder forComponents(ItemProviderEntry component, ItemProviderEntry... additional) { - return new MultiSceneBuilder(component, additional); + public static PonderSceneBuilder addStoryBoard(PonderChapter chapter, ResourceLocation component, String schematic, PonderStoryBoard storyBoard) { + if (component == null) + component = new ResourceLocation("minecraft", "stick"); + + PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, component); + PonderSceneBuilder builder = new PonderSceneBuilder(entry); + chapters.addStoriesToChapter(chapter, entry); + return builder; + } + + public static MultiSceneBuilder forComponents(ItemProviderEntry... components) { + return new MultiSceneBuilder(Arrays.asList(components)); } public static List compile(ResourceLocation id) { + return compile(all.get(id)); + } + public static List compile(PonderChapter chapter) { + return compile(chapters.getStories(chapter)); + } + + public static List compile(List entries) { if (PonderIndex.EDITOR_MODE) { - PonderLocalization.shared.clear(); - PonderLocalization.specific.clear(); - SharedText.gatherText(); + //PonderLocalization.shared.clear(); + //PonderLocalization.specific.clear(); + //SharedText.gatherText(); } - List list = all.get(id); List scenes = new ArrayList<>(); - for (int i = 0; i < list.size(); i++) { - PonderStoryBoardEntry sb = list.get(i); + for (int i = 0; i < entries.size(); i++) { + PonderStoryBoardEntry sb = entries.get(i); Template activeTemplate = loadSchematic(sb.getSchematicName()); PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); world.createBackup(); - PonderScene scene = compileScene(id, i, sb, world); + PonderScene scene = compileScene(i, sb, world); scene.begin(); scenes.add(scene); } @@ -65,11 +81,10 @@ public class PonderRegistry { return scenes; } - public static PonderScene compileScene(ResourceLocation id, int i, PonderStoryBoardEntry sb, PonderWorld world) { - PonderScene scene = new PonderScene(world, id, i); + public static PonderScene compileScene(int i, PonderStoryBoardEntry sb, PonderWorld world) { + PonderScene scene = new PonderScene(world, sb.getComponent(), i, sb.getTags()); SceneBuilder builder = scene.builder(); - sb.getBoard() - .program(builder, scene.getSceneBuildingUtil()); + sb.getBoard().program(builder, scene.getSceneBuildingUtil()); return scene; } @@ -95,28 +110,58 @@ public class PonderRegistry { SharedText.gatherText(); all.forEach((id, list) -> { for (int i = 0; i < list.size(); i++) - compileScene(id, i, list.get(i), null); + compileScene(i, list.get(i), null); }); return PonderLocalization.record(); } public static class MultiSceneBuilder { - private ItemProviderEntry component; - private ItemProviderEntry[] additional; + private final Collection> components; - MultiSceneBuilder(ItemProviderEntry component, ItemProviderEntry[] additional) { - this.component = component; - this.additional = additional; + MultiSceneBuilder(Collection> components) { + this.components = components; } public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) { - PonderRegistry.addStoryBoard(component, schematicPath, storyBoard); - for (ItemProviderEntry itemProviderEntry : additional) - PonderRegistry.addStoryBoard(itemProviderEntry, schematicPath, storyBoard); + return addStoryBoard(schematicPath, storyBoard, PonderSceneBuilder::highlightAllTags); + } + + public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, Consumer extras) { + components.forEach(c -> extras.accept(PonderRegistry.addStoryBoard(c, schematicPath, storyBoard))); return this; } } + public static class PonderSceneBuilder { + + private final PonderStoryBoardEntry entry; + + PonderSceneBuilder(PonderStoryBoardEntry entry) { + this.entry = entry; + } + + public PonderSceneBuilder highlightAllTags() { + entry.getTags().add(PonderTag.Highlight.ALL); + return this; + } + + public PonderSceneBuilder highlightTags(PonderTag... tags) { + entry.getTags().addAll(Arrays.asList(tags)); + return this; + } + + public PonderSceneBuilder chapter(PonderChapter chapter) { + PonderRegistry.chapters.addStoriesToChapter(chapter, entry); + return this; + } + + public PonderSceneBuilder chapters(PonderChapter... chapters) { + for (PonderChapter c : chapters) + chapter(c); + return this; + } + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 8806eac71..6578ab8b6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -1,34 +1,15 @@ package com.simibubi.create.foundation.ponder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -import org.apache.commons.lang3.mutable.MutableDouble; -import org.apache.commons.lang3.mutable.MutableObject; - import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.PonderTag; import com.simibubi.create.foundation.ponder.elements.PonderOverlayElement; import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.MatrixStacker; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.*; import com.simibubi.create.foundation.utility.outliner.Outliner; - import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; @@ -41,12 +22,14 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MutableBoundingBox; -import net.minecraft.util.math.Vec2f; -import net.minecraft.util.math.Vec3d; -import net.minecraft.util.math.Vec3i; +import net.minecraft.util.math.*; +import org.apache.commons.lang3.mutable.MutableDouble; +import org.apache.commons.lang3.mutable.MutableObject; + +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; public class PonderScene { @@ -59,6 +42,7 @@ public class PonderScene { List schedule, activeSchedule; Map linkedElements; Set elements; + List tags; PonderWorld world; ResourceLocation component; @@ -79,7 +63,7 @@ public class PonderScene { int totalTime; int currentTime; - public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex) { + public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex, Collection tags) { pointOfInterest = Vec3d.ZERO; textIndex = 1; @@ -90,6 +74,7 @@ public class PonderScene { outliner = new Outliner(); elements = new HashSet<>(); linkedElements = new HashMap<>(); + this.tags = new ArrayList<>(tags); schedule = new ArrayList<>(); activeSchedule = new ArrayList<>(); transform = new SceneTransform(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java index aa397e763..7de4ccf5e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderStoryBoardEntry.java @@ -1,17 +1,27 @@ package com.simibubi.create.foundation.ponder; +import com.simibubi.create.foundation.ponder.content.PonderTag; +import net.minecraft.util.ResourceLocation; + +import java.util.ArrayList; +import java.util.List; + public class PonderStoryBoardEntry { - private String schematicName; - private PonderStoryBoard board; + private final String schematicName; + private final PonderStoryBoard board; + private final List tags; + private final ResourceLocation component; - public PonderStoryBoardEntry(PonderStoryBoard board, String schematicName) { + public PonderStoryBoardEntry(PonderStoryBoard board, String schematicName, ResourceLocation component) { this.board = board; this.schematicName = schematicName; + this.tags = new ArrayList<>(); + this.component = component; } public interface PonderStoryBoard { - public abstract void program(SceneBuilder scene, SceneBuildingUtil util); + void program(SceneBuilder scene, SceneBuildingUtil util); } public String getSchematicName() { @@ -22,4 +32,12 @@ public class PonderStoryBoardEntry { return board; } + public List getTags() { + return tags; + } + + public ResourceLocation getComponent() { + return component; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java index 6bf190ba3..8421df99e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -1,14 +1,13 @@ package com.simibubi.create.foundation.ponder; -import java.util.List; - import com.google.common.base.Strings; import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.ponder.content.PonderIndexScreen; +import com.simibubi.create.foundation.ponder.content.PonderTagScreen; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; - import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; @@ -22,6 +21,8 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.RenderTooltipEvent; +import java.util.List; + public class PonderTooltipHandler { static LerpedFloat holdWProgress = LerpedFloat.linear() @@ -51,6 +52,12 @@ public class PonderTooltipHandler { stack = ponderUI.getHoveredTooltipItem(); if (stack.isItemEqual(ponderUI.getSubject())) subject = true; + } else if (currentScreen instanceof PonderTagScreen) { + PonderTagScreen tagScreen = (PonderTagScreen) currentScreen; + stack = tagScreen.getHoveredTooltipItem(); + } else if (currentScreen instanceof PonderIndexScreen) { + PonderIndexScreen indexScreen = (PonderIndexScreen) currentScreen; + stack = indexScreen.getHoveredTooltipItem(); } else return; @@ -71,8 +78,7 @@ public class PonderTooltipHandler { if (!subject && InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) { - ScreenOpener.open(new PonderUI(PonderRegistry.compile(stack.getItem() - .getRegistryName()))); + ScreenOpener.transitionTo(PonderUI.of(stack)); holdWProgress.startWithValue(0); return; } 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 609e79525..6b30e3cfc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -1,27 +1,14 @@ package com.simibubi.create.foundation.ponder; -import java.util.List; - -import org.apache.commons.lang3.mutable.MutableBoolean; - import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.foundation.gui.AbstractSimiScreen; -import com.simibubi.create.foundation.gui.AllGuiTextures; -import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.*; import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; -import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.*; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.*; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; -import com.simibubi.create.foundation.utility.Pair; -import com.simibubi.create.foundation.utility.Pointing; - import net.minecraft.client.ClipboardHelper; import net.minecraft.client.GameSettings; import net.minecraft.client.MainWindow; @@ -41,16 +28,28 @@ import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.registries.ForgeRegistries; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.IntStream; public class PonderUI extends AbstractSimiScreen { public static final String PONDERING = PonderLocalization.LANG_PREFIX + "pondering"; public static final String IDENTIFY_MODE = PonderLocalization.LANG_PREFIX + "identify_mode"; + public static final String IN_CHAPTER = PonderLocalization.LANG_PREFIX + "in_chapter"; private List scenes; + private List tags; + private List tagButtons; + private List tagFades; private LerpedFloat fadeIn; private LerpedFloat sceneProgress; ItemStack stack; + PonderChapter chapter = null; private boolean identifyMode; private ItemStack hoveredTooltipItem; @@ -62,10 +61,24 @@ public class PonderUI extends AbstractSimiScreen { private LerpedFloat lazyIndex; private int index = 0; - private PonderButton left, right, icon, scan; + private PonderButton left, right, icon, scan, chap; + + public static PonderUI of(ItemStack item) { + return new PonderUI(PonderRegistry.compile(item.getItem().getRegistryName())); + } + + public static PonderUI of(PonderChapter chapter) { + PonderUI ui = new PonderUI(PonderRegistry.compile(chapter)); + ui.chapter = chapter; + return ui; + } public PonderUI(List scenes) { this.scenes = scenes; + if (scenes.isEmpty()) { + List l = Collections.singletonList(new PonderStoryBoardEntry(DebugScenes::empty, "debug/scene_1", new ResourceLocation("minecraft", "stick"))); + scenes.addAll(PonderRegistry.compile(l)); + } lazyIndex = LerpedFloat.linear() .startWithValue(index); sceneProgress = LerpedFloat.linear() @@ -87,14 +100,43 @@ public class PonderUI extends AbstractSimiScreen { else stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); - int bY = height - 20 - 31; + tags = new ArrayList<>(PonderRegistry.tags.getTags(component)); + tagButtons = new ArrayList<>(); + tagFades = new ArrayList<>(); + + + tags.forEach(t -> { + int i = tagButtons.size(); + int x = 31; + int y = 91 + i * 40; + PonderButton b = new PonderButton(x, y, () -> { + ScreenOpener.transitionTo(new PonderTagScreen(t)); + }) + .showing(t) + .fade(0, -1); + + widgets.add(b); + tagButtons.add(b); + + LerpedFloat chase = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .05f, Chaser.exp(.1)); + tagFades.add(chase); + + }); + widgets.add(icon = new PonderButton(31, 31, () -> { - }).showing(stack) - .fade(0, -1)); + }).showing(stack).fade(0, -1)); + + if (chapter != null) { + widgets.add(chap = new PonderButton(width - 31 - 24, 31, () -> { + }).showing(chapter).fade(0, -1)); + } GameSettings bindings = minecraft.gameSettings; int spacing = 8; int bX = (width - 20) / 2 - (70 + 2 * spacing); + int bY = height - 20 - 31; widgets.add(scan = new PonderButton(bX, bY, () -> { identifyMode = !identifyMode; @@ -129,6 +171,7 @@ public class PonderUI extends AbstractSimiScreen { @Override public void tick() { + super.tick(); PonderScene activeScene = scenes.get(index); if (!identifyMode) activeScene.tick(); @@ -182,7 +225,7 @@ public class PonderUI extends AbstractSimiScreen { PonderWorld world = new PonderWorld(BlockPos.ZERO, Minecraft.getInstance().world); activeTemplate.addBlocksToWorld(world, BlockPos.ZERO, new PlacementSettings()); world.createBackup(); - scene = PonderRegistry.compileScene(scene.component, index, sb, world); + scene = PonderRegistry.compileScene(index, sb, world); scene.begin(); scenes.set(index, scene); } @@ -309,13 +352,30 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.translated(0, 0, 800); int x = icon.x + icon.getWidth() + 8; int y = icon.y; + + UIRenderHelper.streak(0, x - 4, y + 10, 26, (int) (150 * fade), 0x101010); + drawString(font, Lang.translate(PONDERING), x, y, 0xffa3a3a3); y += 12; x += 0; - RenderSystem.translated(0, 3 * (indexDiff), 0); - font.drawSplitString(activeScene.getTitle(), x, y, left.x - x, - ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + //RenderSystem.translated(0, 3 * (indexDiff), 0); + RenderSystem.translated(x, y, 0); + RenderSystem.rotatef(indexDiff * -75, 1, 0, 0); + RenderSystem.translated(0, 0, 5); + font.drawSplitString(activeScene.getTitle(), 0, 0, left.x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); RenderSystem.popMatrix(); + + if (chapter != null) { + RenderSystem.pushMatrix(); + + RenderSystem.translated(chap.x - 4 - 4, chap.y, 0); + UIRenderHelper.streak(180, 4, 10, 26, (int) (150 * fade), 0x101010); + + drawRightAlignedString(font, Lang.translate(IN_CHAPTER), 0, 0, 0xffa3a3a3); + drawRightAlignedString(font, Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()), 0, 12, 0xffeeeeee); + + RenderSystem.popMatrix(); + } } if (identifyMode) { @@ -387,6 +447,44 @@ public class PonderUI extends AbstractSimiScreen { GuiUtils.drawGradientRect(200, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd); RenderSystem.popMatrix(); } + + //Tags + List sceneTags = activeScene.tags; + boolean highlightAll = sceneTags.contains(PonderTag.Highlight.ALL); + double s = Minecraft.getInstance().getWindow().getGuiScaleFactor(); + IntStream.range(0, tagButtons.size()).forEach(i -> { + RenderSystem.pushMatrix(); + LerpedFloat chase = tagFades.get(i); + PonderButton button = tagButtons.get(i); + if (button.isMouseOver(mouseX, mouseY)) { + chase.updateChaseTarget(1); + } else + chase.updateChaseTarget(0); + + chase.tickChaser(); + + if (highlightAll || sceneTags.contains(this.tags.get(i))) + button.flash(); + else + button.dim(); + + int x = button.x + button.getWidth() + 4; + int y = button.y - 2; + RenderSystem.translated(x, y + 5 * (1 - fade), 0); + + float fadedWidth = 200 * chase.getValue(partialTicks); + UIRenderHelper.streak(0, 0, 12, 26, (int) fadedWidth, 0x101010); + + GL11.glScissor((int) (x * s), 0, (int) (fadedWidth * s), (int) (height * s)); + GL11.glEnable(GL11.GL_SCISSOR_TEST); + + String tagName = Lang.translate("ponder.tag." + this.tags.get(i).getId()); + drawString(tagName, 3, 8, 0xffeedd); + + GL11.glDisable(GL11.GL_SCISSOR_TEST); + + RenderSystem.popMatrix(); + }); } protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { @@ -484,6 +582,14 @@ public class PonderUI extends AbstractSimiScreen { return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } + @Override + protected String getBreadcrumbTitle() { + if (chapter != null) + return Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()); + + return stack.getItem().getName().getFormattedText(); + } + public FontRenderer getFontRenderer() { return font; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 714fde22f..e0a254a4a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -4,19 +4,14 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; -import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.simibubi.create.foundation.ponder.*; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; -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.BeltItemElement; 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.ItemEntry; - import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; @@ -48,10 +43,18 @@ public class DebugScenes { private static void add(PonderStoryBoard sb) { ItemEntry item = AllItems.BRASS_HAND; String schematicPath = "debug/scene_" + index; - PonderRegistry.addStoryBoard(item, schematicPath, sb); + PonderRegistry.addStoryBoard(item, schematicPath, sb) + .highlightAllTags() + .chapter(PonderChapter.of("debug")); index++; } + public static void empty(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Missing Content"); + scene.showBasePlate(); + scene.idle(5); + } + public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) { scene.title("Coordinate Space"); scene.showBasePlate(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java new file mode 100644 index 000000000..a128c6bfb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapter.java @@ -0,0 +1,52 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.Create; +import com.simibubi.create.foundation.gui.IScreenRenderable; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.util.ResourceLocation; + +import javax.annotation.Nonnull; + +public class PonderChapter implements IScreenRenderable { + + private final String id; + private final ResourceLocation icon; + + private PonderChapter(String id) { + this.id = id; + icon = new ResourceLocation(Create.ID, "textures/ponder/chapter/" + id + ".png"); + } + + @Override + public void draw(AbstractGui screen, int x, int y) { + RenderSystem.pushMatrix(); + Minecraft.getInstance().getTextureManager().bindTexture(icon); + RenderSystem.scaled(0.25, 0.25, 1); + //x and y offset, blit z offset, tex x and y, tex width and height, entire tex sheet width and height + AbstractGui.blit(x, y, 0, 0, 0, 64, 64, 64, 64); + RenderSystem.popMatrix(); + } + + @Nonnull + public static PonderChapter of(String id) { + PonderChapter chapter = PonderRegistry.chapters.getChapter(id); + if (chapter == null) { + chapter = PonderRegistry.chapters.addChapter(new PonderChapter(id)); + } + + return chapter; + } + + public PonderChapter addTagsToChapter(PonderTag... tags) { + for (PonderTag t : tags) + PonderRegistry.tags.add(t, this); + return this; + } + + public String getId() { + return id; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapterRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapterRegistry.java new file mode 100644 index 000000000..66da66763 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderChapterRegistry.java @@ -0,0 +1,49 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry; +import com.simibubi.create.foundation.utility.Pair; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import java.util.*; +import java.util.stream.Collectors; + +public class PonderChapterRegistry { + + private final Map>> chapters; + + public PonderChapterRegistry() { + chapters = new HashMap<>(); + } + + public void addStoriesToChapter(@Nonnull PonderChapter chapter, PonderStoryBoardEntry... entries) { + chapters.get(chapter.getId()).getSecond().addAll(Arrays.asList(entries)); + } + + PonderChapter addChapter(@Nonnull PonderChapter chapter) { + chapters.put(chapter.getId(), Pair.of(chapter, new ArrayList<>())); + return chapter; + } + + @Nullable + PonderChapter getChapter(String id) { + Pair> pair = chapters.get(id); + if (pair == null) + return null; + + return pair.getFirst(); + } + + public List getAllChapters() { + return chapters + .values() + .stream() + .map(Pair::getFirst) + .collect(Collectors.toList()); + } + + public List getStories(PonderChapter chapter) { + return chapters.get(chapter.getId()).getSecond(); + } + +} 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 f635b1e40..0e6b00894 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 @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.PonderRegistry; +import net.minecraft.block.Blocks; +import net.minecraft.item.Items; public class PonderIndex { @@ -13,8 +16,8 @@ public class PonderIndex { // (!) Modifications inside storyboard methods only require re-opening the ui PonderRegistry.forComponents(AllBlocks.SHAFT) - .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) - .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, b -> b.highlightAllTags().chapter(PonderChapter.of("basic_kinetics"))) + .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased, b -> b.chapter(PonderChapter.of("encasing"))); // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); @@ -39,4 +42,30 @@ public class PonderIndex { DebugScenes.registerAll(); } + public static void registerTags() { + + PonderRegistry.tags.forItems(AllBlocks.SHAFT.getId()) + .add(PonderTag.Create.KINETICS); + + PonderRegistry.tags.forItems(AllBlocks.ANDESITE_FUNNEL.getId(), AllBlocks.BRASS_FUNNEL.getId()) + .add(PonderTag.Create.ARM_ACCESS) + .add(PonderTag.Vanilla.ITEM_TRANSFER) + .add(PonderTag.Vanilla.REDSTONE_CONTROL); + + PonderRegistry.tags.forTag(PonderTag.Vanilla.REDSTONE_CONTROL) + .add(Items.REDSTONE.getRegistryName()) + .add(Blocks.LEVER.getRegistryName()); + + PonderRegistry.tags.forTag(PonderTag.Create.KINETICS) + .add(AllBlocks.COGWHEEL.getId()) + .add(AllBlocks.LARGE_COGWHEEL.getId()) + .add(AllItems.BELT_CONNECTOR.getId()) + .add(AllBlocks.ENCASED_CHAIN_DRIVE.getId()); + + PonderChapter.of("basic_kinetics").addTagsToChapter( + PonderTag.Create.KINETICS + ); + + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java new file mode 100644 index 000000000..542148e96 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java @@ -0,0 +1,170 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.ponder.ui.ChapterLabel; +import com.simibubi.create.foundation.ponder.ui.LayoutHelper; +import com.simibubi.create.foundation.ponder.ui.PonderButton; +import net.minecraft.block.Block; +import net.minecraft.client.MainWindow; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.client.renderer.Rectangle2d; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class PonderIndexScreen extends AbstractSimiScreen { + + protected final List chapters; + private final double chapterXmult = 0.5; + private final double chapterYmult = 0.3; + protected Rectangle2d chapterArea; + + protected final List items; + private final double itemXmult = 0.5; + private final double itemYmult = 0.75; + protected Rectangle2d itemArea; + + private ItemStack hoveredItem = ItemStack.EMPTY; + + public PonderIndexScreen() { + chapters = new ArrayList<>(); + items = new ArrayList<>(); + } + + @Override + protected void init() { + super.init(); + + widgets.clear(); + + chapters.clear(); + chapters.addAll(PonderRegistry.chapters.getAllChapters()); + + LayoutHelper layout = LayoutHelper.centeredHorizontal( + chapters.size(), + MathHelper.clamp((int) Math.ceil(chapters.size() / 4f), 1, 4), + 200, + 38, + 16 + ); + chapterArea = layout.getArea(); + int chapterCenterX = (int) (width * chapterXmult); + int chapterCenterY = (int) (height * chapterYmult); + + //todo at some point pagination or horizontal scrolling may be needed for chapters/items + for (PonderChapter chapter : chapters) { + ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), chapterCenterY + layout.getY(), () -> { + ScreenOpener.transitionTo(PonderUI.of(chapter)); + }); + + widgets.add(label); + layout.next(); + } + + items.clear(); + PonderRegistry.all.keySet() + .stream() + .map(key -> { + Item item = ForgeRegistries.ITEMS.getValue(key); + if (item == null) { + Block b = ForgeRegistries.BLOCKS.getValue(key); + if (b != null) + item = b.asItem(); + } + return item; + }) + .filter(Objects::nonNull) + .forEach(items::add); + + layout = LayoutHelper.centeredHorizontal( + items.size(), + MathHelper.clamp((int) Math.ceil(items.size() / 11f), 1, 4), + 28, + 28, + 8 + ); + itemArea = layout.getArea(); + int itemCenterX = (int) (width * itemXmult); + int itemCenterY = (int) (height * itemYmult); + + for (Item item : items) { + PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, () -> {}) + .showing(new ItemStack(item)); + + button.fade(1); + widgets.add(button); + layout.next(); + } + + + } + + @Override + public void tick() { + super.tick(); + + hoveredItem = ItemStack.EMPTY; + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); + double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + for (Widget widget : widgets) { + if (widget instanceof PonderButton) + if (widget.isMouseOver(mouseX, mouseY)) { + hoveredItem = ((PonderButton) widget).getItem(); + } + } + } + + @Override + protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + int x = (int) (width * chapterXmult); + int y = (int) (height * chapterYmult); + + RenderSystem.pushMatrix(); + RenderSystem.translated(x, y, 0); + + UIRenderHelper.streak(0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220, 0x101010); + drawString(font, "Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, 0xffddeeff); + + RenderSystem.popMatrix(); + + + x = (int) (width * itemXmult); + y = (int) (height * itemYmult); + + RenderSystem.pushMatrix(); + RenderSystem.translated(x, y, 0); + + UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 220, 0x101010); + drawString(font, "Items to inspect", itemArea.getX() - 5, itemArea.getY() - 25, 0xffddeeff); + + RenderSystem.popMatrix(); + } + + @Override + protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) { + if (hoveredItem.isEmpty()) + return; + + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 200); + + renderTooltip(hoveredItem, mouseX, mouseY); + + RenderSystem.popMatrix(); + } + + public ItemStack getHoveredTooltipItem() { + return hoveredItem; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java new file mode 100644 index 000000000..c960b8f01 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java @@ -0,0 +1,88 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.IScreenRenderable; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.AbstractGui; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +public class PonderTag implements IScreenRenderable { + + private final String id; + private ResourceLocation icon; + private ItemStack itemIcon = ItemStack.EMPTY; + private ItemStack mainItem = ItemStack.EMPTY; + + public PonderTag(String id) { + this.id = id; + } + + public String getId() { + return id; + } + + public ItemStack getMainItem() { + return mainItem; + } + + public PonderTag idAsIcon() { + return icon(id); + } + + public PonderTag icon(String location) { + this.icon = new ResourceLocation(com.simibubi.create.Create.ID, "textures/ponder/tag/" + location + ".png"); + return this; + } + + public PonderTag item(Item item) { + return this.item(item, true, true); + } + + public PonderTag item(Item item, boolean useAsIcon, boolean useAsMainItem) { + if (useAsIcon) this.itemIcon = new ItemStack(item); + if (useAsMainItem) this.mainItem = new ItemStack(item); + return this; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void draw(AbstractGui screen, int x, int y) { + RenderSystem.pushMatrix(); + RenderSystem.translated(x, y, 0); + if (icon != null) { + Minecraft.getInstance().getTextureManager().bindTexture(icon); + RenderSystem.scaled(0.25, 0.25, 1); + //x and y offset, blit z offset, tex x and y, tex width and height, entire tex sheet width and height + AbstractGui.blit(0, 0, 0, 0, 0, 64, 64, 64, 64); + } else if (!itemIcon.isEmpty()) { + RenderSystem.translated(-4, -4, 0); + RenderSystem.scaled(1.5, 1.5, 1); + GuiGameElement.of(itemIcon).render(); + } + RenderSystem.popMatrix(); + } + + public static class Create { + public static final PonderTag KINETICS = new PonderTag("kinetics").item(AllBlocks.COGWHEEL.get().asItem(), true, false); + public static final PonderTag FLUID_TRANSFER = new PonderTag("fluid_transfer").idAsIcon(); + + public static final PonderTag OPEN_INVENTORY = new PonderTag("open_inventory").item(AllBlocks.BASIN.get().asItem()); + public static final PonderTag ARM_ACCESS = new PonderTag("arm_access").item(AllBlocks.MECHANICAL_ARM.get().asItem()); + } + + public static class Vanilla { + public static final PonderTag REDSTONE_CONTROL = new PonderTag("redstone_control").item(Items.REDSTONE, true, false); + public static final PonderTag ITEM_TRANSFER = new PonderTag("item_transfer").idAsIcon(); + } + + public static class Highlight { + public static final PonderTag ALL = new PonderTag("_all"); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java new file mode 100644 index 000000000..98f897a8c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java @@ -0,0 +1,94 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import net.minecraft.util.ResourceLocation; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Set; + +public class PonderTagRegistry { + + private final Multimap tags; + private final Multimap chapterTags; + + public PonderTagRegistry() { + tags = LinkedHashMultimap.create(); + chapterTags = LinkedHashMultimap.create(); + } + + public Set getTags(ResourceLocation item) { + return ImmutableSet.copyOf(tags.get(item)); + } + + public Set getTags(PonderChapter chapter) { + return ImmutableSet.copyOf(chapterTags.get(chapter)); + } + + public Set getItems(PonderTag tag) { + return tags + .entries() + .stream() + .filter(e -> e.getValue() == tag) + .map(Map.Entry::getKey) + .collect(ImmutableSet.toImmutableSet()); + } + + public Set getChapters(PonderTag tag) { + return chapterTags + .entries() + .stream() + .filter(e -> e.getValue() == tag) + .map(Map.Entry::getKey) + .collect(ImmutableSet.toImmutableSet()); + } + + public void add(PonderTag tag, ResourceLocation item) { + tags.put(item, tag); + } + + public void add(PonderTag tag, PonderChapter chapter) { + chapterTags.put(chapter, tag); + } + + public ItemBuilder forItems(ResourceLocation... items) { + return new ItemBuilder(items); + } + + public TagBuilder forTag(PonderTag tag) { + return new TagBuilder(tag); + } + + public static class ItemBuilder { + + private final Collection items; + + private ItemBuilder(ResourceLocation... items) { + this.items = Arrays.asList(items); + } + + public ItemBuilder add(PonderTag tag) { + items.forEach(i -> PonderRegistry.tags.add(tag, i)); + return this; + } + + } + + public static class TagBuilder { + + private final PonderTag tag; + + private TagBuilder(PonderTag tag) { + this.tag = tag; + } + + public TagBuilder add(ResourceLocation item) { + PonderRegistry.tags.add(tag, item); + return this; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java new file mode 100644 index 000000000..1281a1ba0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java @@ -0,0 +1,231 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.ponder.ui.ChapterLabel; +import com.simibubi.create.foundation.ponder.ui.LayoutHelper; +import com.simibubi.create.foundation.ponder.ui.PonderButton; +import com.simibubi.create.foundation.utility.Lang; +import net.minecraft.block.Block; +import net.minecraft.client.MainWindow; +import net.minecraft.client.gui.widget.Widget; +import net.minecraft.client.renderer.Rectangle2d; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class PonderTagScreen extends AbstractSimiScreen { + + protected final PonderTag tag; + protected final List items; + private final double itemXmult = 0.5; + private final double itemYmult = 0.4; + protected Rectangle2d itemArea; + protected final List chapters; + private final double chapterXmult = 0.5; + private final double chapterYmult = 0.75; + protected Rectangle2d chapterArea; + private final double mainXmult = 0.5; + private final double mainYmult = 0.15; + + private ItemStack hoveredItem = ItemStack.EMPTY; + + + public PonderTagScreen(PonderTag tag) { + this.tag = tag; + items = new ArrayList<>(); + chapters = new ArrayList<>(); + } + + @Override + protected void init() { + super.init(); + widgets.clear(); + + //items + items.clear(); + PonderRegistry.tags.getItems(tag) + .stream() + .map(key -> { + Item item = ForgeRegistries.ITEMS.getValue(key); + if (item == null) { + Block b = ForgeRegistries.BLOCKS.getValue(key); + if (b != null) + item = b.asItem(); + } + return item; + }) + .filter(Objects::nonNull) + .forEach(items::add); + + int rowCount = MathHelper.clamp((int) Math.ceil(items.size() / 11d), 1, 3); + LayoutHelper layout = LayoutHelper.centeredHorizontal(items.size(), rowCount, 28, 28, 8); + itemArea = layout.getArea(); + int itemCenterX = (int) (width * itemXmult); + int itemCenterY = (int) (height * itemYmult); + + for (Item i : items) { + PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, () -> {}) + .showing(new ItemStack(i)); + + button.fade(1); + widgets.add(button); + layout.next(); + } + + //chapters + chapters.clear(); + chapters.addAll(PonderRegistry.tags.getChapters(tag)); + + rowCount = MathHelper.clamp((int) Math.ceil(chapters.size() / 3f), 1, 3); + layout = LayoutHelper.centeredHorizontal(chapters.size(), rowCount, 200, 38, 16); + chapterArea = layout.getArea(); + int chapterCenterX = (int) (width * chapterXmult); + int chapterCenterY = (int) (height * chapterYmult); + + for (PonderChapter chapter : chapters) { + ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), chapterCenterY + layout.getY(), () -> { + ScreenOpener.transitionTo(PonderUI.of(chapter)); + }); + + widgets.add(label); + layout.next(); + } + + } + + @Override + public void tick() { + super.tick(); + + hoveredItem = ItemStack.EMPTY; + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); + double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + for (Widget widget : widgets) { + if (widget instanceof PonderButton) + if (widget.isMouseOver(mouseX, mouseY)) { + hoveredItem = ((PonderButton) widget).getItem(); + } + } + } + + @Override + protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + renderItems(mouseX, mouseY, partialTicks); + + renderChapters(mouseX, mouseY, partialTicks); + + // + int x = (int) (width * mainXmult); + int y = (int) (height * mainYmult); + + RenderSystem.pushMatrix(); + RenderSystem.translated(x, y, 0); + RenderSystem.translated(-150, 0, 0); + + if (!tag.getMainItem().isEmpty()) { + RenderSystem.translated(-25, 0, 0); + PonderUI.renderBox(0, -10, 20, 20, false); + RenderSystem.pushMatrix(); + RenderSystem.translated(-2, -12, 0); + RenderSystem.scaled(1.5, 1.5, 1); + GuiGameElement.of(tag.getMainItem()).render(); + + RenderSystem.popMatrix(); + + RenderSystem.translated(75, 0, 0); + + } + + RenderSystem.pushMatrix(); + RenderSystem.scaled(1.5, 1.5, 1); + + + //render icon & box + PonderUI.renderBox(0, -10, 20, 20, true); + RenderSystem.translated(2, 2 - 10, 100); + tag.draw(this, 0, 0); + + RenderSystem.popMatrix(); + + //tag name & description + UIRenderHelper.streak(0, 36, 0, 39, 350, 0x101010); + drawString(font, Lang.translate("ponder.tag." + tag.getId()), 41, -16, 0xffff_ffff); + drawString(font, Lang.translate("ponder.tag." + tag.getId() + ".desc"), 41, -4, 0xffff_ffff); + + RenderSystem.popMatrix(); + + } + + protected void renderItems(int mouseX, int mouseY, float partialTicks) { + if (items.isEmpty()) + return; + + int x = (int) (width * itemXmult); + int y = (int) (height * itemYmult); + + RenderSystem.pushMatrix(); + RenderSystem.translated(x, y, 0); + + UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); + drawString(font, "Related Items", itemArea.getX() - 5, itemArea.getY() - 25, 0xffddeeff); + + UIRenderHelper.streak(0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth()/2 + 75, 0x101010); + UIRenderHelper.streak(180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth()/2 + 75, 0x101010); + + RenderSystem.popMatrix(); + + } + + protected void renderChapters(int mouseX, int mouseY, float partialTicks) { + if (chapters.isEmpty()) + return; + + int chapterX = (int) (width * chapterXmult); + int chapterY = (int) (height * chapterYmult); + + RenderSystem.pushMatrix(); + RenderSystem.translated(chapterX, chapterY, 0); + + UIRenderHelper.streak(0, chapterArea.getX() - 10, chapterArea.getY() - 20, 20, 220, 0x101010); + drawString(font, "More Topics to Ponder about", chapterArea.getX() - 5, chapterArea.getY() - 25, 0xffddeeff); + + RenderSystem.popMatrix(); + } + + @Override + protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) { + RenderSystem.pushMatrix(); + RenderSystem.disableRescaleNormal(); + RenderSystem.disableDepthTest(); + + RenderSystem.translated(0, 0, 200); + if (!hoveredItem.isEmpty()) { + renderTooltip(hoveredItem, mouseX, mouseY); + } + RenderSystem.enableDepthTest(); + RenderSystem.enableRescaleNormal(); + RenderSystem.popMatrix(); + } + + @Override + protected String getBreadcrumbTitle() { + return Lang.translate("ponder.tag." + tag.getId()); + } + + public ItemStack getHoveredTooltipItem() { + return hoveredItem; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java new file mode 100644 index 000000000..a912f324a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java @@ -0,0 +1,39 @@ +package com.simibubi.create.foundation.ponder.ui; + +import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; +import com.simibubi.create.foundation.ponder.content.PonderChapter; +import com.simibubi.create.foundation.utility.Lang; +import net.minecraft.client.Minecraft; + +public class ChapterLabel extends AbstractSimiWidget { + + private final PonderChapter chapter; + private final PonderButton button; + + public ChapterLabel(PonderChapter chapter, int x, int y, Runnable onClick) { + super(x, y, 175, 38); + + this.button = new PonderButton(x + 4, y + 4, onClick, 30, 30).showing(chapter); + this.button.fade(1); + + this.chapter = chapter; + } + + @Override + public void render(int mouseX, int mouseY, float partialTicks) { + UIRenderHelper.streak(0, x, y + height/2, height - 2, width, 0x101010); + drawString(Minecraft.getInstance().fontRenderer, Lang.translate("ponder.chapter." + chapter.getId()), x + 50, y + 20, 0xffddeeff); + + button.renderButton(mouseX, mouseY, partialTicks); + super.render(mouseX, mouseY, partialTicks); + } + + @Override + public void onClick(double x, double y) { + if (!button.isMouseOver(x, y)) + return; + + button.runCallback(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java new file mode 100644 index 000000000..97c472072 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java @@ -0,0 +1,126 @@ +package com.simibubi.create.foundation.ponder.ui; + +import net.minecraft.client.renderer.Rectangle2d; + +public interface LayoutHelper { + + static LayoutHelper centeredHorizontal(int itemCount, int rows, int width, int height, int spacing) { + return new CenteredHorizontalLayoutHelper(itemCount, rows, width, height, spacing); + } + + int getX(); + + int getY(); + + void next(); + + int getTotalWidth(); + + int getTotalHeight(); + + default Rectangle2d getArea() { + int lWidth = getTotalWidth(); + int lHeight = getTotalHeight(); + return new Rectangle2d( + -lWidth/2, + -lHeight/2, + lWidth, + lHeight + ); + } + + class CenteredHorizontalLayoutHelper implements LayoutHelper { + + int itemCount; + int rows; + int width; + int height; + int spacing; + + int currentColumn = 0; + int currentRow = 0; + int[] rowCounts; + int x = 0, y = 0; + + CenteredHorizontalLayoutHelper(int itemCount, int rows, int width, int height, int spacing) { + this.itemCount = itemCount; + this.rows = rows; + this.width = width; + this.height = height; + this.spacing = spacing; + + rowCounts = new int[rows]; + int itemsPerRow = itemCount / rows; + int itemDiff = itemCount - itemsPerRow * rows; + for (int i = 0; i < rows; i++) { + rowCounts[i] = itemsPerRow; + if (itemDiff > 0) { + rowCounts[i]++; + itemDiff--; + } + } + + init(); + } + + @Override + public int getX() { + return x; + } + + @Override + public int getY() { + return y; + } + + @Override + public void next() { + currentColumn++; + if (currentColumn >= rowCounts[currentRow]) { + //nextRow + if (++currentRow >= rows) { + x = 0; + y = 0; + return; + } + + currentColumn = 0; + prepareX(); + y += height + spacing; + return; + } + + x += width + spacing; + } + + private void init() { + prepareX(); + prepareY(); + + } + + + private void prepareX() { + int rowWidth = rowCounts[currentRow] * width + (rowCounts[currentRow] - 1) * spacing; + x = -(rowWidth / 2); + } + + private void prepareY() { + int totalHeight = rows * height + (rows > 1 ? ((rows - 1) * spacing) : 0); + y = -(totalHeight / 2); + } + + @Override + public int getTotalWidth() { + return rowCounts[0] * width + (rowCounts[0] - 1) * spacing; + } + + @Override + public int getTotalHeight() { + return rows * height + (rows > 1 ? ((rows - 1) * spacing) : 0); + } + + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java index 9ff50f0e7..8ba55e22a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -1,21 +1,20 @@ package com.simibubi.create.foundation.ponder.ui; import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.foundation.gui.AllIcons; import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.IScreenRenderable; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.LerpedFloat; - import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; public class PonderButton extends AbstractSimiWidget { - private AllIcons icon; + private IScreenRenderable icon; private ItemStack item; protected boolean pressed; private Runnable onClick; @@ -27,14 +26,17 @@ public class PonderButton extends AbstractSimiWidget { public static final int SIZE = 20; - public PonderButton(int x, int y, Runnable onClick) { - super(x, y, SIZE, SIZE); + public PonderButton(int x, int y, Runnable onClick, int width, int height) { + super(x, y, width, height); this.onClick = onClick; - flash = LerpedFloat.linear() - .startWithValue(0); + flash = LerpedFloat.linear().startWithValue(0); } - public PonderButton showing(AllIcons icon) { + public PonderButton(int x, int y, Runnable onClick) { + this(x, y, onClick, SIZE, SIZE); + } + + public PonderButton showing(IScreenRenderable icon) { this.icon = icon; return this; } @@ -97,17 +99,24 @@ public class PonderButton extends AbstractSimiWidget { if (icon != null) { RenderSystem.enableBlend(); RenderSystem.color4f(1, 1, 1, fade); - icon.draw(this, x + 2, y + 2); + RenderSystem.pushMatrix(); + RenderSystem.translated(x + 2, y + 2, 0); + RenderSystem.scaled((width - 4) / 16d, (height - 4) / 16d, 1); + icon.draw(this, 0, 0); + RenderSystem.popMatrix(); } if (item != null) { + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, -800); GuiGameElement.of(item) .at(x - 2, y - 2) .scale(1.5f) .render(); + RenderSystem.popMatrix(); } if (shortcut != null) - drawCenteredString(Minecraft.getInstance().fontRenderer, shortcut.getLocalizedName(), x + SIZE / 2 + 8, - y + SIZE - 6, ColorHelper.applyAlpha(0xff606060, fade)); + drawCenteredString(Minecraft.getInstance().fontRenderer, shortcut.getLocalizedName(), x + width / 2 + 8, + y + height - 6, ColorHelper.applyAlpha(0xff606060, fade)); RenderSystem.popMatrix(); } @@ -133,4 +142,7 @@ public class PonderButton extends AbstractSimiWidget { toolTip.add(text); } + public ItemStack getItem() { + return item; + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java index 073f2fc07..4c7b4fec4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java @@ -46,6 +46,10 @@ public class LerpedFloat { return this; } + public void updateChaseTarget(float target) { + this.chaseTarget = target; + } + public boolean updateChaseSpeed(double speed) { float prevSpeed = this.chaseSpeed; this.chaseSpeed = (float) speed; diff --git a/src/main/resources/assets/create/textures/ponder/chapter/basic_kinetics.png b/src/main/resources/assets/create/textures/ponder/chapter/basic_kinetics.png new file mode 100644 index 0000000000000000000000000000000000000000..da70cc75afa6b78cb7d32483638205385ea81239 GIT binary patch literal 7389 zcmWkz1ymGW7+t!%yF*e+B$rr98l?rKq&oy*Y3T+@0SN&?x@$pcknUVUmhSF<{xfH0 z&Y3f3-n{SK?|%1wFG@>82@jhZ8w3L3sVGBqfV<59Cnh>@Ewgi51%Z&l?BwOOROICu zUEN(i+BsT-K%7a?Bq`-?8QNa6w?DYZBD@KS{%Ym$L`J`ULl*NPzn;v<>t)LYPL?q1 z3%>Xehu^;wddos%>MHRoLl|$6Hva7t?J%=F@xQ2#JY8#MI6jg(T1Ap8{PV8P0a;6A zSh?5I;#CtDx+xKaUyd@EQQ)m+5rxnRt=aX-=_TJ#UHjOh*xlFmK~SEuWWQ%O^D1NR zLcQnceUG_bGUWC>@=abacg11VtDptV z$$ckYcT`+Q6pA?~^;HzUPeH#qOaxh#&ZbDQ(bgVgVJ|SkoP%K^O--}X8Vo_WUJd>z zw6w^U3PYyXKA$vgT%L37F0WB!F5OdNc8AP>WkI)4Rf2$?|3AKWl%xPpuw0c5JwPBF z;{Q*i$(4Wy;30;min;>EKU^#l7L5LPmG3|x>O~cZ>^q;u!)#ywcQcRI@as_+TjoJx z80&!`OB-e+4q7kTvchyU=fK-(Jtw!hGuw)%W&4J&MidY((x2SXK?MgxTuWhe$)I3I zp}~Xwj_q4Zb`$|D)$%J})2i)u(_5BLqf*!3#%?R~j>U+ddlBxbWFWmROkoM`GW&od zF=g<1h#!b0NI-^xk>n*379(;Pl4vz~(X9-q6m2?9;2YW3^=BK9tJu(4a6p%CSBtU^ zMOZZ`;Jcw9WoYe$Em0Jtf*Lo7ha$hsNG8w7)9Fm}toW%3c}$#}OZ3qUD`;5z2!tN| z8pl=H$caIvWcVwtVrbvTluMH#)|AbI$e+*O3mb717lYeL5R4mM4PlLr?9I+`m`*Fd zSeKn4thBn_<_v_W_@VU-rRaLExw$$Yt5DY5Q=4{9C<)&N=>T7xv$7hxwK8wGP1~YE?Wktgw>>u6K&P!n$PW4&#x8j+-t+?aQ`2 zvY^z`z(i7WbC7VWMh?l9Ltplx=t|kdVx5ZcG|7Ul?8RCD^ZnI#bmW~j@9uxEY2=&e zZEFu~4;LaK$fRh49~jr2S!<^htgbbfF|L?sa5L@+{)lhL)%)J=9!E4f7VLJT*?*W3 zoe1mC0qKE+zLDt~2e^aY$Dhe|ITEfQ@g|dwwR<|Yf4D28Y7LPKfmif)T2NuR2!&6& z|3yJJcfXQvG+LsoI{HeH7{?x#ER&wCiP+LFzE|{a#cXLL`Z4aElFLD_dMhhd9bRo`rKNg-sy8FAP0A0Jz1f)%E|rfre8AC z^SCO}y!|)2-yvbPu#7>RyX@#O0SQ>KAE|IM4#{#+vnJ?<0e~O%L4DGN3S-xt~IfF^c9pt0}I% z_*vjvkV;w&+?6E!ND9mOCjPDy#`9;X5i_3^@tV8L`8f&txn+2ZQ?;4a`gE_210z*N z29pVLI6M}0H}}Nzlv9j~%v^7oU3&W{|EI~(?#z&r6Mscioz`zXfw|o#olp)_gqjRy zt*Wqe z--*zEUNF=ac?2VOZE*&o_G|`eo4q66x!Rq?U9c^TA_aYfb{A+ybd$`uh%GN>&z%B;A z`Gt5XlJJnW6AU%)-S6lJM%;%ZGg@O%%NSUvw6xrpm?8GWDeS1>0d!VWmSd}&>grbU z9c3eJ!42gnf1wonkvN0x8*hX&4WE;++4uHOpdG0v@lFGZBv<5c7{&>@!U!{u^tIb&{(2Gj{dr`*dVA}~HeyR}^44Q24 zea8H{yp`#z_>=ewtN6CoIMimFP8A@~*bF|T!{h4%ikpFsp;j?uQwxs+lp^R!ky9tv zox}@G82cyZ6JC321vN-mTJ5GU^h^{G)|)bz0E#H5wW>WoLZ{l()N>Zb{r#7(M2Zb)WtY_b(J+T$8+Si~bgsg7wQ#p>H5239o`;?xaay8#zE+>NLXh zgt)4Tt@<=Dm3z7 zLBV$aqdU7s-?B>(&#q^oNqj9lM+Xf^SH7;tt`jSAj{3#+hl-B0Dh5>7gG{PcFu4HGd(#PaRP&3MHfmYl0lEH zGy<20V>Kly^sEjCGXvx}i|ziB9`N4zI#DVXe#J@KF>kSvrdzYdOKOXt980w)m zDh1|XmtBhas%#mbbQ}Of#vOzUbunvwUZm23EIETBycsbq#~_~W(fh%uwB^B0IZo_V zesXqQtG`=2?l_oE@Q}%6$WhLxe17iqAay<^!_%K2$|MWh_|%TeT%p~ekCs$|snre= z?EMQBpR_Tvz(z7xc%mf?BK!}S@`j>+Q81nz9pC=$AQ*prKT>4fWc{6+t53^FW2*mI zE+ta|@x#)3!BGq+W047@Lc@q1Y%r@k=Y;BMFDz#}{85mfMyVY}e*WFV2-@tsu4Kmm zpR5;a0S}Mn&0kn=?Zl{_KwBt5Z#$oC4;CN<^jc&tLO?cr=jIef23B0qSc&)qlW|yY z|EK^A^KnvTw4@Qs0*LQ|?T2!0u~$g#p^iM852Bh<#Ez&fUC+_U829(~lP*5P2>Hj`rUM}_f6!M*QSti`~rS%7xj5XmL8gYfmAOiq2Tdiyf7GC z`8Sk+IeQUZ>TXi->^MiG?}xtD^Wt#x+sgfSBlG<#qeT*SrZ+_P!jtA;6E`eoB9}|G z?Cgk0MeVGtYFxVbSE8DrB|tAu{hR*NiE0mO8gy%0HkhabesjJ&)X!}2vOrBj$ z!3myJMk_vj6I^NdCX~9dZ6?c!t(5mUc3^d-1U-Mwa3|)CMwwjg?~KLeS@rC6&5JH+ zt3oWOuPEII53wO}KxGW6%1WYHA>k<}EB0(gLYQAXMU+jDrPoud**V*P`qW{@(=+}9 z7f??&q`lTAzP!1&&s{<;qjtMKKK+ev$0eQW{Gq=377^tsIy&=MUFe?90wD`QhOaW^ zL8nQEmn1jt}`x*&C-?j&xpg7Ca->uObmg})E; zJC@tz!~m7hSPI8wDFjwZ>Euk07x;{$MBkdwCu)=1$O;hQV2)s1yTmcOo^Rrwgv*c9 z!#OPfrtr1!W3306ux!~4)T!rvj|JrF=n5s-v5sgJ*3f`$wN2>qOS3F$W|sJy=VWdo zxoR>`R2o+-J2y`6reaFYie8?(`-Ig;;>CKT^ED=ws%ken1St!xK~q{-zxszmuCwAt zM7^vQ3z7eD8l!~(HbbWD!+`l8<5yD;yAhQ4ueA$_tU8d`cAoPyFtVh-RjE$T8E+^# zkS^V_h>XNY|DJAob_=SYQUM{El#J#Cy-u7!mcdnK98?4mVKW&!ahmc|w{@%xel!)w zhwH}(T+##;O%YXyXW&N}L(Jm78L~+-aO?RBhod}5|Kj6kj^NJ+}`NUSMX zB9zK^Z(A%^h3|`_dg5sdc0+Fs(DCd<*8eH#LL|NKxCrroco|!QD?iKWY7C_#6A?ub zO1z7+63ibQfMlnr0wrPN9x?ona{Xm8UrT2+ys8*i!aZm#`Y?W{#mWZy?a^q zX`;knOseWqlK9P#muO)Pt3!OvUg%S5e<@giN*wbdmVUk*upLtX(qsE9*e2#d9i#RH zAO{?>G>Kb%tJszYpZU+jtg#)Vf5rIS_!>4KggrSN0f!o!?bt+u>=occ!T(fyleupwM%%Ldp@?PDp;T*(Y)wY~3q&M3?^ zdkhek%oVg{fW=Ojvh9*J;D9qNzgx4c`-;Zp_xY1wSflfi!MX@F?uy?B8ZWGtCQY{5 zPohaH5}NB|$drCp&R;|8n`eAXoVd9(CihPtHtF_E{n3XL^F4D<)fQdv^!YWDMa$j* zBqU0RJUC0wHVcYe3-@XTDg*O=*?v*@oLR5;L}|*DmPuO*Am=A;5NbeCv@-EBxzAi~ z*(O?TL?eo0-p6w?DAtQ1KnJJ_AAVn6^k&BsumQboH$sAnrgA&?adwMR0LeV*!aulQ z6}sLPI)!le?)Of+fYfmiy(ILX*w>tX#@GjF;nHDFYK4`Nt-BTiTC*alqfL2wu3<6C z`!P|9W;oFtb@o?J(~Sp&XOW%vRqChi>ltDIn7fjjnch>g?9;PcAU#dM}~d&P)wJ_ASM31zfB1ghp8G%*xZkTo&0y z*2d6((r3J?%NM)qUR=xRQX`a`+$(Dhg#E%vwzBo#6u}O-R*rz(^kmR5015bFJV5Z`@*2TKo{N$1}AKITke5h4qn+W zlD8J#UvE71^N53Q!N9~wBaSk4IEb;Nl;INGT>Q>+6m7Iyt3}x)c#SwpEp6>rX>|a< zu}a4MQ+M+7c~NgIq?^K?2px7JmA-k68SJ;(7O6#fA16w(SRV|SGDtZ=!QfvxGoyG| z>1(<@uGNngUoo)S8Vh+j87(h<7>rWAxvXN>zL@r~J;wpGUKp%dl}4u+F|q5Jxp1nI zvAF#dbQzLl5D~XFzLK)}^cBv@*c)7uL-uv7$xnK%(!UL-nX0;{jQdAy5`~f@#nYby z<66uGD><|2vU3eoZ18je#wqexh_(9E@(?4)fCE`11)D7afIfPT?HWN?pDd}S3% zy!&i1^R)+Gmu15ZAUkHihY_n-7%5a+;4;uR3Sx;e!oV++of6SPx0}S8*|oP-(GE%e zdWUP7V0x1lAp2*N{XRS!aBWmo&r96qVTrPL_&4W&!x4S)8ea?mtHqvP_})!yXyd*w z{!S5-D2l#}Sa-^q;tgkpbdl%9ERY(t9DE6nUQEw*y5wn}Vp~2QA+O0|Dfqld$BR)$OorkIJ$6s+ z1x5|!Q@XuKAy)#zCA;?JT`i*$Hvz8On6F<6tcdh}MpWxL9n6+w`aqTMWX$>PiL+r$ z`b+*VNxCjt-!;?r81h^_%%!xMR6wEsS!zlSyng(r(OL)Hdz>N|r1iUWgH}lf1&+J{ znhN>rBXa|p!f0{4p_ZD@Fj+|9Xwm*A-CDz2-3T|mchV^Spk$Dm7eCkr=y~Z|zjvov zd_bmty5a(a55tBVmrFr%mL9YnFaz?uaBxWcusa!i0g8qzxtjE2{FXXL zeCIz(zEV3~v;?5a>aZ-*42R-)bOsxQ<92siWS;P3WPh#qnvCfB#jq;+dWPwzzN{LG zm5F%?o>V&20ps&b=NWVDNVxBsSfnfEaP@g<;3XR}yiyVCW`fL{x!z3*+IT2o2`VdD z(KzaPL8q6FQm(&d*6~dvK|1s5^;1t=0@F!UvZiK(<$lRA_4Kf=Yth$#ny%&#>U;1jDZG0`ovTpS6rPxuIgP2B+&r%WbU536 z+EQ}b&25Rcd_FlsQRUHV{_Gf*hZqC1pB(Nr#+cO+!_#91I}SC%%2+LfMrdlxz(`}u zpC-~hnYJ5Wa7yz>9JR6}oiyXgkhm)O#ejdH78P}29%#@d=~|T^HrZ4xJyFOw`|rE- z>^lIul6Qn&iQs5^hlF6t8e!~%7|B1)5q)`eB#)RcAKyZ}z21vSZ9k!SDA&hy@@`D^ zy1W#IU5Yc4vmICZO<4+efGO&Y1pD6yzv=`XZ;VAAEhszz{-Hn{=zZpMb3z2E0dQp> zU^Q9Lh*9@0{d)Iwc6VpH6^zV?Jo(Z_Ve4vYbWj46|1wiDQjHNXs(uPh3FKyIYbLFc zYfa^Y&HvngZJWpdHBZy(_{h=YIhd9*knIZrSay^*MN6Iue?=to+YnW`~n1BaMQ5`oeCN4>RtmL3!QBjx`?_pzak#P5o;DF__?fTu1UV19@ z(n9y#0HfPzk*eWX(;a~c?Ih~mR!Ff{I(7A{nBR` zsFZEpAJDB1m=DB!O2XT-InnXOx}`@At1&)+B8VmYl>x6=+DJq(NR=Mztr%l~p7)pzTD)<=C4hqW)ZztSj{M$82+t)H0}Yb zBfx4oouRSY)4QbRQxa3{Koiv}K5ff7h-JXTh$^QoqiZ~Gmd}3_;@kD%g;$iEw!G|2 zo2~hB=R>)c?fx|o>V_ZWtEiJ4Kga&M>b+|n^Lzpib;za{@}OiOFJq=6X{!{9Sx|k> zWja6O_A`jcbD2PFHARa-n1iXYSeTeH)hosr6#j&nETIIGna$nk^IrGw?_IXmZM2(!6Lji~H*fghV=z@Cc!qk+fMVC85lt#u2lW==fn zHyNT27(74i<9kjee!G_$P$B!juy+Pm6B*!5GTA6tcWVlaBKG35 qiIn+7M3B9W!q@C)ctGw|AZXJ^E72Kd#RP18fm9SUAeC|-LjD7Aig(Qb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/ponder/tag/item_transfer.png b/src/main/resources/assets/create/textures/ponder/tag/item_transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..da70cc75afa6b78cb7d32483638205385ea81239 GIT binary patch literal 7389 zcmWkz1ymGW7+t!%yF*e+B$rr98l?rKq&oy*Y3T+@0SN&?x@$pcknUVUmhSF<{xfH0 z&Y3f3-n{SK?|%1wFG@>82@jhZ8w3L3sVGBqfV<59Cnh>@Ewgi51%Z&l?BwOOROICu zUEN(i+BsT-K%7a?Bq`-?8QNa6w?DYZBD@KS{%Ym$L`J`ULl*NPzn;v<>t)LYPL?q1 z3%>Xehu^;wddos%>MHRoLl|$6Hva7t?J%=F@xQ2#JY8#MI6jg(T1Ap8{PV8P0a;6A zSh?5I;#CtDx+xKaUyd@EQQ)m+5rxnRt=aX-=_TJ#UHjOh*xlFmK~SEuWWQ%O^D1NR zLcQnceUG_bGUWC>@=abacg11VtDptV z$$ckYcT`+Q6pA?~^;HzUPeH#qOaxh#&ZbDQ(bgVgVJ|SkoP%K^O--}X8Vo_WUJd>z zw6w^U3PYyXKA$vgT%L37F0WB!F5OdNc8AP>WkI)4Rf2$?|3AKWl%xPpuw0c5JwPBF z;{Q*i$(4Wy;30;min;>EKU^#l7L5LPmG3|x>O~cZ>^q;u!)#ywcQcRI@as_+TjoJx z80&!`OB-e+4q7kTvchyU=fK-(Jtw!hGuw)%W&4J&MidY((x2SXK?MgxTuWhe$)I3I zp}~Xwj_q4Zb`$|D)$%J})2i)u(_5BLqf*!3#%?R~j>U+ddlBxbWFWmROkoM`GW&od zF=g<1h#!b0NI-^xk>n*379(;Pl4vz~(X9-q6m2?9;2YW3^=BK9tJu(4a6p%CSBtU^ zMOZZ`;Jcw9WoYe$Em0Jtf*Lo7ha$hsNG8w7)9Fm}toW%3c}$#}OZ3qUD`;5z2!tN| z8pl=H$caIvWcVwtVrbvTluMH#)|AbI$e+*O3mb717lYeL5R4mM4PlLr?9I+`m`*Fd zSeKn4thBn_<_v_W_@VU-rRaLExw$$Yt5DY5Q=4{9C<)&N=>T7xv$7hxwK8wGP1~YE?Wktgw>>u6K&P!n$PW4&#x8j+-t+?aQ`2 zvY^z`z(i7WbC7VWMh?l9Ltplx=t|kdVx5ZcG|7Ul?8RCD^ZnI#bmW~j@9uxEY2=&e zZEFu~4;LaK$fRh49~jr2S!<^htgbbfF|L?sa5L@+{)lhL)%)J=9!E4f7VLJT*?*W3 zoe1mC0qKE+zLDt~2e^aY$Dhe|ITEfQ@g|dwwR<|Yf4D28Y7LPKfmif)T2NuR2!&6& z|3yJJcfXQvG+LsoI{HeH7{?x#ER&wCiP+LFzE|{a#cXLL`Z4aElFLD_dMhhd9bRo`rKNg-sy8FAP0A0Jz1f)%E|rfre8AC z^SCO}y!|)2-yvbPu#7>RyX@#O0SQ>KAE|IM4#{#+vnJ?<0e~O%L4DGN3S-xt~IfF^c9pt0}I% z_*vjvkV;w&+?6E!ND9mOCjPDy#`9;X5i_3^@tV8L`8f&txn+2ZQ?;4a`gE_210z*N z29pVLI6M}0H}}Nzlv9j~%v^7oU3&W{|EI~(?#z&r6Mscioz`zXfw|o#olp)_gqjRy zt*Wqe z--*zEUNF=ac?2VOZE*&o_G|`eo4q66x!Rq?U9c^TA_aYfb{A+ybd$`uh%GN>&z%B;A z`Gt5XlJJnW6AU%)-S6lJM%;%ZGg@O%%NSUvw6xrpm?8GWDeS1>0d!VWmSd}&>grbU z9c3eJ!42gnf1wonkvN0x8*hX&4WE;++4uHOpdG0v@lFGZBv<5c7{&>@!U!{u^tIb&{(2Gj{dr`*dVA}~HeyR}^44Q24 zea8H{yp`#z_>=ewtN6CoIMimFP8A@~*bF|T!{h4%ikpFsp;j?uQwxs+lp^R!ky9tv zox}@G82cyZ6JC321vN-mTJ5GU^h^{G)|)bz0E#H5wW>WoLZ{l()N>Zb{r#7(M2Zb)WtY_b(J+T$8+Si~bgsg7wQ#p>H5239o`;?xaay8#zE+>NLXh zgt)4Tt@<=Dm3z7 zLBV$aqdU7s-?B>(&#q^oNqj9lM+Xf^SH7;tt`jSAj{3#+hl-B0Dh5>7gG{PcFu4HGd(#PaRP&3MHfmYl0lEH zGy<20V>Kly^sEjCGXvx}i|ziB9`N4zI#DVXe#J@KF>kSvrdzYdOKOXt980w)m zDh1|XmtBhas%#mbbQ}Of#vOzUbunvwUZm23EIETBycsbq#~_~W(fh%uwB^B0IZo_V zesXqQtG`=2?l_oE@Q}%6$WhLxe17iqAay<^!_%K2$|MWh_|%TeT%p~ekCs$|snre= z?EMQBpR_Tvz(z7xc%mf?BK!}S@`j>+Q81nz9pC=$AQ*prKT>4fWc{6+t53^FW2*mI zE+ta|@x#)3!BGq+W047@Lc@q1Y%r@k=Y;BMFDz#}{85mfMyVY}e*WFV2-@tsu4Kmm zpR5;a0S}Mn&0kn=?Zl{_KwBt5Z#$oC4;CN<^jc&tLO?cr=jIef23B0qSc&)qlW|yY z|EK^A^KnvTw4@Qs0*LQ|?T2!0u~$g#p^iM852Bh<#Ez&fUC+_U829(~lP*5P2>Hj`rUM}_f6!M*QSti`~rS%7xj5XmL8gYfmAOiq2Tdiyf7GC z`8Sk+IeQUZ>TXi->^MiG?}xtD^Wt#x+sgfSBlG<#qeT*SrZ+_P!jtA;6E`eoB9}|G z?Cgk0MeVGtYFxVbSE8DrB|tAu{hR*NiE0mO8gy%0HkhabesjJ&)X!}2vOrBj$ z!3myJMk_vj6I^NdCX~9dZ6?c!t(5mUc3^d-1U-Mwa3|)CMwwjg?~KLeS@rC6&5JH+ zt3oWOuPEII53wO}KxGW6%1WYHA>k<}EB0(gLYQAXMU+jDrPoud**V*P`qW{@(=+}9 z7f??&q`lTAzP!1&&s{<;qjtMKKK+ev$0eQW{Gq=377^tsIy&=MUFe?90wD`QhOaW^ zL8nQEmn1jt}`x*&C-?j&xpg7Ca->uObmg})E; zJC@tz!~m7hSPI8wDFjwZ>Euk07x;{$MBkdwCu)=1$O;hQV2)s1yTmcOo^Rrwgv*c9 z!#OPfrtr1!W3306ux!~4)T!rvj|JrF=n5s-v5sgJ*3f`$wN2>qOS3F$W|sJy=VWdo zxoR>`R2o+-J2y`6reaFYie8?(`-Ig;;>CKT^ED=ws%ken1St!xK~q{-zxszmuCwAt zM7^vQ3z7eD8l!~(HbbWD!+`l8<5yD;yAhQ4ueA$_tU8d`cAoPyFtVh-RjE$T8E+^# zkS^V_h>XNY|DJAob_=SYQUM{El#J#Cy-u7!mcdnK98?4mVKW&!ahmc|w{@%xel!)w zhwH}(T+##;O%YXyXW&N}L(Jm78L~+-aO?RBhod}5|Kj6kj^NJ+}`NUSMX zB9zK^Z(A%^h3|`_dg5sdc0+Fs(DCd<*8eH#LL|NKxCrroco|!QD?iKWY7C_#6A?ub zO1z7+63ibQfMlnr0wrPN9x?ona{Xm8UrT2+ys8*i!aZm#`Y?W{#mWZy?a^q zX`;knOseWqlK9P#muO)Pt3!OvUg%S5e<@giN*wbdmVUk*upLtX(qsE9*e2#d9i#RH zAO{?>G>Kb%tJszYpZU+jtg#)Vf5rIS_!>4KggrSN0f!o!?bt+u>=occ!T(fyleupwM%%Ldp@?PDp;T*(Y)wY~3q&M3?^ zdkhek%oVg{fW=Ojvh9*J;D9qNzgx4c`-;Zp_xY1wSflfi!MX@F?uy?B8ZWGtCQY{5 zPohaH5}NB|$drCp&R;|8n`eAXoVd9(CihPtHtF_E{n3XL^F4D<)fQdv^!YWDMa$j* zBqU0RJUC0wHVcYe3-@XTDg*O=*?v*@oLR5;L}|*DmPuO*Am=A;5NbeCv@-EBxzAi~ z*(O?TL?eo0-p6w?DAtQ1KnJJ_AAVn6^k&BsumQboH$sAnrgA&?adwMR0LeV*!aulQ z6}sLPI)!le?)Of+fYfmiy(ILX*w>tX#@GjF;nHDFYK4`Nt-BTiTC*alqfL2wu3<6C z`!P|9W;oFtb@o?J(~Sp&XOW%vRqChi>ltDIn7fjjnch>g?9;PcAU#dM}~d&P)wJ_ASM31zfB1ghp8G%*xZkTo&0y z*2d6((r3J?%NM)qUR=xRQX`a`+$(Dhg#E%vwzBo#6u}O-R*rz(^kmR5015bFJV5Z`@*2TKo{N$1}AKITke5h4qn+W zlD8J#UvE71^N53Q!N9~wBaSk4IEb;Nl;INGT>Q>+6m7Iyt3}x)c#SwpEp6>rX>|a< zu}a4MQ+M+7c~NgIq?^K?2px7JmA-k68SJ;(7O6#fA16w(SRV|SGDtZ=!QfvxGoyG| z>1(<@uGNngUoo)S8Vh+j87(h<7>rWAxvXN>zL@r~J;wpGUKp%dl}4u+F|q5Jxp1nI zvAF#dbQzLl5D~XFzLK)}^cBv@*c)7uL-uv7$xnK%(!UL-nX0;{jQdAy5`~f@#nYby z<66uGD><|2vU3eoZ18je#wqexh_(9E@(?4)fCE`11)D7afIfPT?HWN?pDd}S3% zy!&i1^R)+Gmu15ZAUkHihY_n-7%5a+;4;uR3Sx;e!oV++of6SPx0}S8*|oP-(GE%e zdWUP7V0x1lAp2*N{XRS!aBWmo&r96qVTrPL_&4W&!x4S)8ea?mtHqvP_})!yXyd*w z{!S5-D2l#}Sa-^q;tgkpbdl%9ERY(t9DE6nUQEw*y5wn}Vp~2QA+O0|Dfqld$BR)$OorkIJ$6s+ z1x5|!Q@XuKAy)#zCA;?JT`i*$Hvz8On6F<6tcdh}MpWxL9n6+w`aqTMWX$>PiL+r$ z`b+*VNxCjt-!;?r81h^_%%!xMR6wEsS!zlSyng(r(OL)Hdz>N|r1iUWgH}lf1&+J{ znhN>rBXa|p!f0{4p_ZD@Fj+|9Xwm*A-CDz2-3T|mchV^Spk$Dm7eCkr=y~Z|zjvov zd_bmty5a(a55tBVmrFr%mL9YnFaz?uaBxWcusa!i0g8qzxtjE2{FXXL zeCIz(zEV3~v;?5a>aZ-*42R-)bOsxQ<92siWS;P3WPh#qnvCfB#jq;+dWPwzzN{LG zm5F%?o>V&20ps&b=NWVDNVxBsSfnfEaP@g<;3XR}yiyVCW`fL{x!z3*+IT2o2`VdD z(KzaPL8q6FQm(&d*6~dvK|1s5^;1t=0@F!UvZiK(<$lRA_4Kf=Yth$#ny%&#>U;1jDZG0`ovTpS6rPxuIgP2B+&r%WbU536 z+EQ}b&25Rcd_FlsQRUHV{_Gf*hZqC1pB(Nr#+cO+!_#91I}SC%%2+LfMrdlxz(`}u zpC-~hnYJ5Wa7yz>9JR6}oiyXgkhm)O#ejdH78P}29%#@d=~|T^HrZ4xJyFOw`|rE- z>^lIul6Qn&iQs5^hlF6t8e!~%7|B1)5q)`eB#)RcAKyZ}z21vSZ9k!SDA&hy@@`D^ zy1W#IU5Yc4vmICZO<4+efGO&Y1pD6yzv=`XZ;VAAEhszz{-Hn{=zZpMb3z2E0dQp> zU^Q9Lh*9@0{d)Iwc6VpH6^zV?Jo(Z_Ve4vYbWj46|1wiDQjHNXs(uPh3FKyIYbLFc zYfa^Y&HvngZJWpdHBZy(_{h=YIhd9*knIZrSay^*MN6Iue?=to+YnW`~n1BaMQ5`oeCN4>RtmL3!QBjx`?_pzak#P5o;DF__?fTu1UV19@ z(n9y#0HfPzk*eWX(;a~c?Ih~mR!Ff{I(7A{nBR` zsFZEpAJDB1m=DB!O2XT-InnXOx}`@At1&)+B8VmYl>x6=+DJq(NR=Mztr%l~p7)pzTD)<=C4hqW)ZztSj{M$82+t)H0}Yb zBfx4oouRSY)4QbRQxa3{Koiv}K5ff7h-JXTh$^QoqiZ~Gmd}3_;@kD%g;$iEw!G|2 zo2~hB=R>)c?fx|o>V_ZWtEiJ4Kga&M>b+|n^Lzpib;za{@}OiOFJq=6X{!{9Sx|k> zWja6O_A`jcbD2PFHARa-n1iXYSeTeH)hosr6#j&nETIIGna$nk^IrGw?_IXmZM2(!6Lji~H*fghV=z@Cc!qk+fMVC85lt#u2lW==fn zHyNT27(74i<9kjee!G_$P$B!juy+Pm6B*!5GTA6tcWVlaBKG35 qiIn+7M3B9W!q@C)ctGw|AZXJ^E72Kd#RP18fm9SUAeC|-LjD7Aig(Qb literal 0 HcmV?d00001 From e2c50663a5f32c27cbc0aa6b9f20323e4fd089a4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 5 Mar 2021 01:36:41 +0100 Subject: [PATCH 17/23] UI and tag enhancements - Fixed partial ticks on transitions - Transitions center on clicked components - Added auto-lang for tags - Moved some other ui stuff around --- src/generated/resources/.cache/cache | 26 +-- .../resources/assets/create/lang/en_us.json | 9 + .../assets/create/lang/unfinished/de_de.json | 11 +- .../assets/create/lang/unfinished/es_es.json | 11 +- .../assets/create/lang/unfinished/es_mx.json | 11 +- .../assets/create/lang/unfinished/fr_fr.json | 11 +- .../assets/create/lang/unfinished/it_it.json | 11 +- .../assets/create/lang/unfinished/ja_jp.json | 11 +- .../assets/create/lang/unfinished/ko_kr.json | 11 +- .../assets/create/lang/unfinished/nl_nl.json | 11 +- .../assets/create/lang/unfinished/pt_br.json | 11 +- .../assets/create/lang/unfinished/ru_ru.json | 11 +- .../assets/create/lang/unfinished/zh_cn.json | 11 +- .../assets/create/lang/unfinished/zh_tw.json | 11 +- .../foundation/gui/AbstractSimiScreen.java | 173 ++++++++------- .../create/foundation/gui/ScreenOpener.java | 64 +++--- .../create/foundation/gui/UIRenderHelper.java | 14 +- .../foundation/ponder/PonderLocalization.java | 37 +++- .../foundation/ponder/PonderRegistry.java | 1 + .../ponder/PonderTooltipHandler.java | 9 +- .../create/foundation/ponder/PonderUI.java | 170 +++++++++------ .../ponder/content/MovementActorScenes.java | 27 +++ .../ponder/content/PonderIndex.java | 42 ++-- .../ponder/content/PonderIndexScreen.java | 10 +- .../foundation/ponder/content/PonderTag.java | 75 +++++-- .../ponder/content/PonderTagScreen.java | 201 ++++++++++++------ .../foundation/ponder/ui/ChapterLabel.java | 13 +- .../foundation/ponder/ui/PonderButton.java | 20 +- .../ponder/portable_interface/redstone.nbt | Bin 0 -> 667 bytes .../ponder/portable_interface/transfer.nbt | Bin 0 -> 1085 bytes 30 files changed, 708 insertions(+), 315 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java create mode 100644 src/main/resources/ponder/portable_interface/redstone.nbt create mode 100644 src/main/resources/ponder/portable_interface/transfer.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 22ff97d25..1f3450836 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2384c6457ecf24c7b38358179b8fa6eb93b9627a assets/create/lang/en_ud.json -569b3aaadf1e5c5849692c4e918dc762edd9a316 assets/create/lang/en_us.json -70a747f3639180da9cba1b8747fb19dacb1e9619 assets/create/lang/unfinished/de_de.json -610b1e766bc338d38906a160908cdb79e0d3bc54 assets/create/lang/unfinished/es_es.json -8eff0c23695d3e8c26d1265a82324242a9762226 assets/create/lang/unfinished/es_mx.json -fb150f105517632023265602cfc3c948be932917 assets/create/lang/unfinished/fr_fr.json -09111dedc02d6803134a8276ec481abcaa0e00c7 assets/create/lang/unfinished/it_it.json -c1f6faed7efb6f224aec7563b0ac6b891bc780d4 assets/create/lang/unfinished/ja_jp.json -c6139e7280236adcd136d40a94cd1cb708d402c6 assets/create/lang/unfinished/ko_kr.json -bb3fda881575df3ae26921edc3f4a3e2ecbc6ccd assets/create/lang/unfinished/nl_nl.json -8915f0902e59c1bbfb2c16e43e2ce62b3d616e0d assets/create/lang/unfinished/pt_br.json -ad8d2b7c8c7f3ac584218c33f86ba67c1873b7fc assets/create/lang/unfinished/ru_ru.json -e549baab96828524fc4694355546c685859956d6 assets/create/lang/unfinished/zh_cn.json -2506abb1c796aad920e803a8e1427908c5b115c1 assets/create/lang/unfinished/zh_tw.json +52fd28525a66b08652bac2d1a4a5543956b47091 assets/create/lang/en_us.json +00751ce98f978b4568723ebeaa0350d77a380cd8 assets/create/lang/unfinished/de_de.json +2d8c801b475cabc33c7d0f8f318ef9068a4b8cea assets/create/lang/unfinished/es_es.json +1b18ac809eda5655000a56190bd8be467062beab assets/create/lang/unfinished/es_mx.json +93340db6d63864fa23bf663954221b68d345a37f assets/create/lang/unfinished/fr_fr.json +299731bb461adb0c55393fa9c1d814861b002ebd assets/create/lang/unfinished/it_it.json +947363f4bcec709f398904ece57a5d66294dd6f8 assets/create/lang/unfinished/ja_jp.json +11798cdf3c66152fc736cdba465b795c0abac0b4 assets/create/lang/unfinished/ko_kr.json +b30301ea195e3c08dc8d1fecfd9a546255ac75b8 assets/create/lang/unfinished/nl_nl.json +feb0ab7a4c616447dd74e4cf808a003447cfdfe1 assets/create/lang/unfinished/pt_br.json +d12dde0c45bbf29613ade488619b57949ee7068c assets/create/lang/unfinished/ru_ru.json +b904d41c0cda0d56b1aa519a45a35800589445d5 assets/create/lang/unfinished/zh_cn.json +47e89b425362abb4241b4ffe73bfaa22fef0b6f0 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 b3690cb9c..d4d95363b 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1807,9 +1807,14 @@ "create.ponder.subject": "Subject of this scene", "create.ponder.pondering": "Pondering about...", "create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "Associated Entries", "create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.tag.arm_access": "Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "Kinetic Blocks", + "create.ponder.tag.kinetics.description": "Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "Andesite Funnels can only ever extract single items.", @@ -1866,6 +1871,10 @@ "create.ponder.shaft.scene_1.header": "Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "Funnels are ideal for transferring items from and to inventories.", 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 01610abd3..b1d288aac 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: 1059", + "_": "Missing Localizations: 1066", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 b99910daf..539839eb7 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: 102", + "_": "Missing Localizations: 109", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 6611145d1..fff507aad 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: 989", + "_": "Missing Localizations: 996", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 249958a19..693fe889c 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: 771", + "_": "Missing Localizations: 778", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 593c35df1..685be1ccf 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: 107", + "_": "Missing Localizations: 114", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 e46f52ebf..d2422e9a2 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: 114", + "_": "Missing Localizations: 121", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 e6ab8c399..6f40bbe56 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: 160", + "_": "Missing Localizations: 167", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 dd0cc915d..8e529378e 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: 1258", + "_": "Missing Localizations: 1265", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 0dd6b00bf..77c539d59 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: 1324", + "_": "Missing Localizations: 1331", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 e9c2d527f..af1d88bd4 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: 110", + "_": "Missing Localizations: 117", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 6bd1e6840..3e91b0982 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: 108", + "_": "Missing Localizations: 115", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 0fdf50b31..d6e1b1599 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: 113", + "_": "Missing Localizations: 120", "_": "->------------------------] Game Elements [------------------------<-", @@ -1808,9 +1808,14 @@ "create.ponder.subject": "UNLOCALIZED: Subject of this scene", "create.ponder.pondering": "UNLOCALIZED: Pondering about...", "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", + "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1867,6 +1872,10 @@ "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index 25ebdcac4..fcfba6f34 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -1,8 +1,17 @@ package com.simibubi.create.foundation.gui; +import java.util.ArrayList; +import java.util.List; +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.widgets.AbstractSimiWidget; import com.simibubi.create.foundation.utility.LerpedFloat; + import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; @@ -10,26 +19,25 @@ import net.minecraft.client.gui.widget.Widget; import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableInt; -import org.apache.logging.log4j.LogManager; -import org.lwjgl.glfw.GLFW; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; @OnlyIn(Dist.CLIENT) public abstract class AbstractSimiScreen extends Screen { protected int sWidth, sHeight; protected int guiLeft, guiTop; + protected int depthPointX, depthPointY; protected List widgets; - public final LerpedFloat transition = LerpedFloat.linear().startWithValue(0).chase(0, .1f, LerpedFloat.Chaser.LINEAR); + public final LerpedFloat transition = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .1f, LerpedFloat.Chaser.LINEAR); protected AbstractSimiScreen() { super(new StringTextComponent("")); widgets = new ArrayList<>(); + MainWindow window = Minecraft.getInstance() + .getWindow(); + depthPointX = window.getScaledWidth() / 2; + depthPointY = window.getScaledHeight() / 2; } protected void setWindowSize(int width, int height) { @@ -42,104 +50,102 @@ public abstract class AbstractSimiScreen extends Screen { @Override public void tick() { super.tick(); - transition.tickChaser(); - - if (transition.getValue() < -0.9995f) { - transition.updateChaseTarget(0); - transition.setValue(0); - ScreenOpener.openLastScreen(); - } else if (transition.getValue() > 0.9995f) { - transition.updateChaseTarget(0); - transition.setValue(0); - } } @Override public void render(int mouseX, int mouseY, float partialTicks) { + partialTicks = partialTicks == 10 ? 0 + : Minecraft.getInstance() + .getRenderPartialTicks(); RenderSystem.pushMatrix(); + renderTransition(mouseX, mouseY, partialTicks); - partialTicks = Minecraft.getInstance() - .getRenderPartialTicks(); - renderBackground(); renderWindow(mouseX, mouseY, partialTicks); for (Widget widget : widgets) widget.render(mouseX, mouseY, partialTicks); - renderBreadcrumbs(mouseX, mouseY, partialTicks); - renderWindowForeground(mouseX, mouseY, partialTicks); for (Widget widget : widgets) widget.renderToolTip(mouseX, mouseY); RenderSystem.popMatrix(); + + renderBreadcrumbs(mouseX, mouseY, partialTicks); } private void renderTransition(int mouseX, int mouseY, float partialTicks) { - if (transition.getChaseTarget() != 0) { - if (ScreenOpener.getLastScreen() == null) { - return; - } else if (ScreenOpener.getLastScreen() == this) { - LogManager.getLogger().warn("Tired to render last screen recursively during transition"); - return; - } - //draw last screen into buffer - RenderSystem.pushMatrix();//1 + if (transition.getChaseTarget() == 0) { + renderBackground(); + return; + } + + renderBackground(); + + Screen lastScreen = ScreenOpener.getPreviouslyRenderedScreen(); + float transitionValue = transition.getValue(partialTicks); + double scale = 1 + 0.5 * transitionValue; + + // draw last screen into buffer + if (lastScreen != null && lastScreen != this) { + RenderSystem.pushMatrix();// 1 UIRenderHelper.framebuffer.framebufferClear(Minecraft.IS_RUNNING_ON_MAC); UIRenderHelper.prepFramebufferSize(); - RenderSystem.pushMatrix();//2 + RenderSystem.pushMatrix();// 2 RenderSystem.translated(0, 0, -1000); UIRenderHelper.framebuffer.bindFramebuffer(true); - ScreenOpener.getLastScreen().render(mouseX, mouseY, partialTicks); - RenderSystem.popMatrix();//2 - Minecraft.getInstance().getFramebuffer().bindFramebuffer(true); + lastScreen.render(mouseX, mouseY, 10); + RenderSystem.popMatrix();// 2 - //use the buffer texture - float transitionValue = transition.getValue(partialTicks); - if (transition.getChaseTarget() < 0) - transitionValue += 1; - //transitionV is ~1 when the older screen is hidden - //transitionV is ~0 when the older screen is still fully visible - double scale = 1 - 0.25 * transitionValue; - MainWindow window = Minecraft.getInstance().getWindow(); - int sw = window.getScaledWidth(); - int sh = window.getScaledHeight(); - RenderSystem.translated(sw * 0.5, sh * 0.5, -10); + // use the buffer texture + Minecraft.getInstance() + .getFramebuffer() + .bindFramebuffer(true); + + MainWindow window = Minecraft.getInstance() + .getWindow(); + int dpx = window.getScaledWidth() / 2; + int dpy = window.getScaledHeight() / 2; + if (lastScreen instanceof AbstractSimiScreen) { + dpx = ((AbstractSimiScreen) lastScreen).depthPointX; + dpy = ((AbstractSimiScreen) lastScreen).depthPointY; + } + + // transitionV is 1/-1 when the older screen is hidden + // transitionV is 0 when the older screen is still fully visible + RenderSystem.translated(dpx, dpy, 0); RenderSystem.scaled(scale, scale, 1); - RenderSystem.translated(sw * -0.5, sh * -0.5, 0); - - UIRenderHelper.drawFramebuffer(sw, sh, 1f - transitionValue); - RenderSystem.popMatrix();//1 - - //modify current screen as well - scale = 1 + 0.02 * (1 - transitionValue); - RenderSystem.translated(sw * 0.5, sh * 0.5, 0); - RenderSystem.scaled(scale, scale, 1); - RenderSystem.translated(sw * -0.5, sh * -0.5, 0); + RenderSystem.translated(-dpx, -dpy, 0); + UIRenderHelper.drawFramebuffer(1f - Math.abs(transitionValue)); + RenderSystem.popMatrix();// 1 } + + // modify current screen as well + scale = transitionValue > 0 ? 1 - 0.5 * (1 - transitionValue) : 1 + .5 * (1 + transitionValue); + RenderSystem.translated(depthPointX, depthPointY, 0); + RenderSystem.scaled(scale, scale, 1); + RenderSystem.translated(-depthPointX, -depthPointY, 0); } @Override public boolean mouseClicked(double x, double y, int button) { boolean result = false; - for (Widget widget : widgets) { + for (Widget widget : widgets) if (widget.mouseClicked(x, y, button)) result = true; - } return result; } @Override public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { - for (Widget widget : widgets) { + for (Widget widget : widgets) if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_)) return true; - } if (code == GLFW.GLFW_KEY_BACKSPACE) { - ScreenOpener.transitionToLast(); + ScreenOpener.openPreviousScreen(this); return true; } @@ -202,15 +208,13 @@ public abstract class AbstractSimiScreen extends Screen { history.add(0, Minecraft.getInstance().currentScreen); int spacing = 20; - List names = history - .stream() - .map(AbstractSimiScreen::screenTitle) - .collect(Collectors.toList()); + List names = history.stream() + .map(AbstractSimiScreen::screenTitle) + .collect(Collectors.toList()); - int bWidth = names - .stream() - .mapToInt(s -> font.getStringWidth(s) + spacing) - .sum(); + int bWidth = names.stream() + .mapToInt(s -> font.getStringWidth(s) + spacing) + .sum(); MutableInt x = new MutableInt(width - bWidth); MutableInt y = new MutableInt(height - 18); @@ -219,26 +223,33 @@ public abstract class AbstractSimiScreen extends Screen { if (x.getValue() < 25) x.setValue(25); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 600); names.forEach(s -> { int sWidth = font.getStringWidth(s); - //UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, 14, spacing/2, 0xbbababab, 0x22ababab); - UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, 14, spacing/2, 0xdd101010, 0x44101010); + // UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, + // 14, spacing/2, 0xbbababab, 0x22ababab); + UIRenderHelper.breadcrumbArrow(x.getValue(), y.getValue(), sWidth + spacing, 14, spacing / 2, 0xdd101010, + 0x44101010); drawString(font, s, x.getValue() + 5, y.getValue() + 3, first.getValue() ? 0xffeeffee : 0xffddeeff); first.setFalse(); x.add(sWidth + spacing); }); + RenderSystem.popMatrix(); } private static String screenTitle(Screen screen) { if (screen instanceof AbstractSimiScreen) return ((AbstractSimiScreen) screen).getBreadcrumbTitle(); - return screen.getClass().getSimpleName(); + return screen.getClass() + .getSimpleName(); } protected String getBreadcrumbTitle() { - return this.getClass().getSimpleName(); + return this.getClass() + .getSimpleName(); } protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) { @@ -253,4 +264,16 @@ public abstract class AbstractSimiScreen extends Screen { } } + public void centerScalingOn(int x, int y) { + depthPointX = x; + depthPointY = y; + } + + public void centerScalingOnMouse() { + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); + double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + centerScalingOn((int) mouseX, (int) mouseY); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java index 59a08da3a..0a3f77489 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -1,25 +1,31 @@ package com.simibubi.create.foundation.gui; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screen.Screen; - -import javax.annotation.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; +import javax.annotation.Nullable; + +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.utility.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; + public class ScreenOpener { private static final Deque backStack = new ArrayDeque<>(); + private static Screen backSteppedFrom = null; public static void open(Screen screen) { open(Minecraft.getInstance().currentScreen, screen); } public static void open(@Nullable Screen current, Screen toOpen) { + backSteppedFrom = null; if (current != null) { - if (backStack.size() >= 15) //don't go deeper than 15 steps + if (backStack.size() >= 15) // don't go deeper than 15 steps backStack.pollLast(); backStack.push(current); @@ -29,30 +35,38 @@ public class ScreenOpener { openScreen(toOpen); } - public static void openLastScreen() { + public static void openPreviousScreen(Screen current) { if (backStack.isEmpty()) return; - - openScreen(backStack.pop()); + backSteppedFrom = current; + Screen previousScreen = backStack.pop(); + if (previousScreen instanceof AbstractSimiScreen) + ((AbstractSimiScreen) previousScreen).transition.startWithValue(-0.1) + .chase(-1, .4f, LerpedFloat.Chaser.EXP); + openScreen(previousScreen); } - //transitions are only supported in simiScreens atm. they take care of all the rendering for it + // transitions are only supported in simiScreens atm. they take care of all the + // rendering for it public static void transitionTo(AbstractSimiScreen screen) { - screen.transition.updateChaseTarget(1); + + List screenHistory = getScreenHistory(); + if (!screenHistory.isEmpty()) { + Screen previouslyRenderedScreen = screenHistory.get(0); + if (screen instanceof PonderUI && previouslyRenderedScreen instanceof PonderUI) { + if (((PonderUI) screen).getSubject() + .isItemEqual(((PonderUI) previouslyRenderedScreen).getSubject())) { + openPreviousScreen(Minecraft.getInstance().currentScreen); + return; + } + } + } + + screen.transition.startWithValue(0.1) + .chase(1, .4f, LerpedFloat.Chaser.EXP); open(screen); } - public static void transitionToLast() { - if (backStack.isEmpty()) - return; - - Screen currentScreen = Minecraft.getInstance().currentScreen; - if (currentScreen instanceof AbstractSimiScreen) - ((AbstractSimiScreen) currentScreen).transition.updateChaseTarget(-1); - else - openLastScreen(); - } - public static void clearStack() { backStack.clear(); } @@ -62,12 +76,14 @@ public class ScreenOpener { } @Nullable - public static Screen getLastScreen() { - return backStack.peek(); + public static Screen getPreviouslyRenderedScreen() { + return backSteppedFrom != null ? backSteppedFrom : backStack.peek(); } private static void openScreen(Screen screen) { - Minecraft.getInstance().enqueue(() -> Minecraft.getInstance().displayGuiScreen(screen)); + Minecraft.getInstance() + .enqueue(() -> Minecraft.getInstance() + .displayGuiScreen(screen)); } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java index 87816728e..a4b4a22f5 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java @@ -1,7 +1,10 @@ package com.simibubi.create.foundation.gui; +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.utility.ColorHelper; + import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.BufferBuilder; @@ -9,7 +12,6 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.shader.Framebuffer; import net.minecraftforge.fml.client.gui.GuiUtils; -import org.lwjgl.opengl.GL11; public class UIRenderHelper { @@ -30,13 +32,15 @@ public class UIRenderHelper { } } - public static void drawFramebuffer(int width, int height, float alpha) { - float vx = (float) width; - float vy = (float) height; + public static void drawFramebuffer(float alpha) { + MainWindow window = Minecraft.getInstance() + .getWindow(); + + float vx = (float) window.getScaledWidth(); + float vy = (float) window.getScaledHeight(); float tx = (float) framebuffer.framebufferWidth / (float) framebuffer.framebufferTextureWidth; float ty = (float) framebuffer.framebufferHeight / (float) framebuffer.framebufferTextureHeight; - RenderSystem.enableTexture(); RenderSystem.enableBlend(); RenderSystem.disableLighting(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index 2c284cfe3..f99647b3d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -7,6 +7,8 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.PonderTagScreen; +import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.util.ResourceLocation; @@ -14,10 +16,15 @@ import net.minecraft.util.ResourceLocation; public class PonderLocalization { static Map shared = new HashMap<>(); + static Map> tag = new HashMap<>(); static Map>> specific = new HashMap<>(); // + public static void registerTag(String key, String enUS, String description) { + tag.put(key, Couple.create(enUS, description)); + } + public static void registerShared(String key, String enUS) { shared.put(key, enUS); } @@ -44,9 +51,23 @@ public class PonderLocalization { return Lang.translate(langKeyForSpecific(component.getPath(), scene, k)); } + public static String getTag(String key) { + if (PonderIndex.EDITOR_MODE) + return tag.containsKey(key) ? tag.get(key) + .getFirst() : ("unregistered tag entry:" + key); + return Lang.translate(langKeyForTag(key)); + } + + public static String getTagDescription(String key) { + if (PonderIndex.EDITOR_MODE) + return tag.containsKey(key) ? tag.get(key) + .getSecond() : ("unregistered tag entry:" + key); + return Lang.translate(langKeyForTagDescription(key)); + } + // - static final String LANG_PREFIX = "ponder."; + public static final String LANG_PREFIX = "ponder."; public static JsonElement record() { JsonObject object = new JsonObject(); @@ -55,8 +76,14 @@ public class PonderLocalization { addGeneral(object, PonderTooltipHandler.SUBJECT, "Subject of this scene"); addGeneral(object, PonderUI.PONDERING, "Pondering about..."); addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]"); + addGeneral(object, PonderTagScreen.ASSOCIATED, "Associated Entries"); shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); + tag.forEach((k, v) -> { + object.addProperty(Create.ID + "." + langKeyForTag(k), v.getFirst()); + object.addProperty(Create.ID + "." + langKeyForTagDescription(k), v.getSecond()); + }); + specific.forEach((rl, map) -> { String component = rl.getPath(); for (int i = 0; i < map.size(); i++) { @@ -84,4 +111,12 @@ public class PonderLocalization { return LANG_PREFIX + "shared." + k; } + protected static String langKeyForTag(String k) { + return LANG_PREFIX + "tag." + k; + } + + protected static String langKeyForTagDescription(String k) { + return LANG_PREFIX + "tag." + k + ".description"; + } + } 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 0b93608c9..fe804fc53 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -107,6 +107,7 @@ public class PonderRegistry { public static JsonElement provideLangEntries() { PonderIndex.register(); + PonderTag.register(); SharedText.gatherText(); all.forEach((id, list) -> { for (int i = 0; i < list.size(); i++) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java index 8421df99e..87c56e7f0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -1,6 +1,9 @@ package com.simibubi.create.foundation.ponder; +import java.util.List; + import com.google.common.base.Strings; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.ponder.content.PonderIndexScreen; import com.simibubi.create.foundation.ponder.content.PonderTagScreen; @@ -8,6 +11,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.LerpedFloat; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.screen.Screen; @@ -21,8 +25,6 @@ import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.client.event.RenderTooltipEvent; -import java.util.List; - public class PonderTooltipHandler { static LerpedFloat holdWProgress = LerpedFloat.linear() @@ -78,6 +80,9 @@ public class PonderTooltipHandler { if (!subject && InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) { + if (currentScreen instanceof AbstractSimiScreen) + ((AbstractSimiScreen) currentScreen).centerScalingOnMouse(); + ScreenOpener.transitionTo(PonderUI.of(stack)); holdWProgress.startWithValue(0); return; 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 6b30e3cfc..6118475b1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -1,14 +1,38 @@ package com.simibubi.create.foundation.ponder; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.stream.IntStream; + +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.lwjgl.opengl.GL11; + import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; -import com.simibubi.create.foundation.gui.*; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.AllGuiTextures; +import com.simibubi.create.foundation.gui.AllIcons; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; -import com.simibubi.create.foundation.ponder.content.*; +import com.simibubi.create.foundation.ponder.content.DebugScenes; +import com.simibubi.create.foundation.ponder.content.PonderChapter; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.PonderTag; +import com.simibubi.create.foundation.ponder.content.PonderTagScreen; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.Pointing; + import net.minecraft.client.ClipboardHelper; import net.minecraft.client.GameSettings; import net.minecraft.client.MainWindow; @@ -28,13 +52,6 @@ import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.registries.ForgeRegistries; -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.lwjgl.opengl.GL11; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.stream.IntStream; public class PonderUI extends AbstractSimiScreen { @@ -61,10 +78,11 @@ public class PonderUI extends AbstractSimiScreen { private LerpedFloat lazyIndex; private int index = 0; - private PonderButton left, right, icon, scan, chap; + private PonderButton left, right, scan, chap; public static PonderUI of(ItemStack item) { - return new PonderUI(PonderRegistry.compile(item.getItem().getRegistryName())); + return new PonderUI(PonderRegistry.compile(item.getItem() + .getRegistryName())); } public static PonderUI of(PonderChapter chapter) { @@ -74,9 +92,17 @@ public class PonderUI extends AbstractSimiScreen { } public PonderUI(List scenes) { + ResourceLocation component = scenes.get(0).component; + if (ForgeRegistries.ITEMS.containsKey(component)) + stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); + else + stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); + + tags = new ArrayList<>(PonderRegistry.tags.getTags(component)); this.scenes = scenes; if (scenes.isEmpty()) { - List l = Collections.singletonList(new PonderStoryBoardEntry(DebugScenes::empty, "debug/scene_1", new ResourceLocation("minecraft", "stick"))); + List l = Collections.singletonList(new PonderStoryBoardEntry(DebugScenes::empty, + "debug/scene_1", new ResourceLocation("minecraft", "stick"))); scenes.addAll(PonderRegistry.compile(l)); } lazyIndex = LerpedFloat.linear() @@ -94,43 +120,31 @@ public class PonderUI extends AbstractSimiScreen { super.init(); widgets.clear(); - ResourceLocation component = scenes.get(0).component; - if (ForgeRegistries.ITEMS.containsKey(component)) - stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); - else - stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); - - tags = new ArrayList<>(PonderRegistry.tags.getTags(component)); tagButtons = new ArrayList<>(); tagFades = new ArrayList<>(); - tags.forEach(t -> { int i = tagButtons.size(); int x = 31; - int y = 91 + i * 40; - PonderButton b = new PonderButton(x, y, () -> { + int y = 71 + i * 30; + PonderButton b = new PonderButton(x, y, (mouseX, mouseY) -> { + centerScalingOn(mouseX, mouseY); ScreenOpener.transitionTo(new PonderTagScreen(t)); - }) - .showing(t) - .fade(0, -1); + }).showing(t); widgets.add(b); tagButtons.add(b); LerpedFloat chase = LerpedFloat.linear() - .startWithValue(0) - .chase(0, .05f, Chaser.exp(.1)); + .startWithValue(0) + .chase(0, .05f, Chaser.exp(.1)); tagFades.add(chase); }); - widgets.add(icon = new PonderButton(31, 31, () -> { - }).showing(stack).fade(0, -1)); - if (chapter != null) { widgets.add(chap = new PonderButton(width - 31 - 24, 31, () -> { - }).showing(chapter).fade(0, -1)); + }).showing(chapter)); } GameSettings bindings = minecraft.gameSettings; @@ -350,19 +364,30 @@ public class PonderUI extends AbstractSimiScreen { // Chapter title RenderSystem.pushMatrix(); RenderSystem.translated(0, 0, 800); - int x = icon.x + icon.getWidth() + 8; - int y = icon.y; + int x = 31 + 20 + 8; + int y = 31; - UIRenderHelper.streak(0, x - 4, y + 10, 26, (int) (150 * fade), 0x101010); + String title = activeScene.getTitle(); + int wordWrappedHeight = font.getWordWrappedHeight(title, left.x); - drawString(font, Lang.translate(PONDERING), x, y, 0xffa3a3a3); - y += 12; + int streakHeight = 35 - 9 + wordWrappedHeight; + UIRenderHelper.streak(0, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (150 * fade), 0x101010); + UIRenderHelper.streak(180, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (30 * fade), 0x101010); + renderBox(21, 21, 30, 30, false); + + GuiGameElement.of(stack) + .at(x - 39, y - 11) + .scale(2) + .render(); + + drawString(font, Lang.translate(PONDERING), x, y - 6, 0xffa3a3a3); + y += 8; x += 0; - //RenderSystem.translated(0, 3 * (indexDiff), 0); + // RenderSystem.translated(0, 3 * (indexDiff), 0); RenderSystem.translated(x, y, 0); RenderSystem.rotatef(indexDiff * -75, 1, 0, 0); RenderSystem.translated(0, 0, 5); - font.drawSplitString(activeScene.getTitle(), 0, 0, left.x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + font.drawSplitString(title, 0, 0, left.x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); RenderSystem.popMatrix(); if (chapter != null) { @@ -372,7 +397,8 @@ public class PonderUI extends AbstractSimiScreen { UIRenderHelper.streak(180, 4, 10, 26, (int) (150 * fade), 0x101010); drawRightAlignedString(font, Lang.translate(IN_CHAPTER), 0, 0, 0xffa3a3a3); - drawRightAlignedString(font, Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()), 0, 12, 0xffeeeeee); + drawRightAlignedString(font, + Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()), 0, 12, 0xffeeeeee); RenderSystem.popMatrix(); } @@ -448,43 +474,47 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.popMatrix(); } - //Tags + // Tags List sceneTags = activeScene.tags; boolean highlightAll = sceneTags.contains(PonderTag.Highlight.ALL); - double s = Minecraft.getInstance().getWindow().getGuiScaleFactor(); - IntStream.range(0, tagButtons.size()).forEach(i -> { - RenderSystem.pushMatrix(); - LerpedFloat chase = tagFades.get(i); - PonderButton button = tagButtons.get(i); - if (button.isMouseOver(mouseX, mouseY)) { - chase.updateChaseTarget(1); - } else - chase.updateChaseTarget(0); + double s = Minecraft.getInstance() + .getWindow() + .getGuiScaleFactor(); + IntStream.range(0, tagButtons.size()) + .forEach(i -> { + RenderSystem.pushMatrix(); + LerpedFloat chase = tagFades.get(i); + PonderButton button = tagButtons.get(i); + if (button.isMouseOver(mouseX, mouseY)) { + chase.updateChaseTarget(1); + } else + chase.updateChaseTarget(0); - chase.tickChaser(); + chase.tickChaser(); - if (highlightAll || sceneTags.contains(this.tags.get(i))) - button.flash(); - else - button.dim(); + if (highlightAll || sceneTags.contains(this.tags.get(i))) + button.flash(); + else + button.dim(); - int x = button.x + button.getWidth() + 4; - int y = button.y - 2; - RenderSystem.translated(x, y + 5 * (1 - fade), 0); + int x = button.x + button.getWidth() + 4; + int y = button.y - 2; + RenderSystem.translated(x, y + 5 * (1 - fade), 800); - float fadedWidth = 200 * chase.getValue(partialTicks); - UIRenderHelper.streak(0, 0, 12, 26, (int) fadedWidth, 0x101010); + float fadedWidth = 200 * chase.getValue(partialTicks); + UIRenderHelper.streak(0, 0, 12, 26, (int) fadedWidth, 0x101010); - GL11.glScissor((int) (x * s), 0, (int) (fadedWidth * s), (int) (height * s)); - GL11.glEnable(GL11.GL_SCISSOR_TEST); + GL11.glScissor((int) (x * s), 0, (int) (fadedWidth * s), (int) (height * s)); + GL11.glEnable(GL11.GL_SCISSOR_TEST); - String tagName = Lang.translate("ponder.tag." + this.tags.get(i).getId()); - drawString(tagName, 3, 8, 0xffeedd); + String tagName = this.tags.get(i) + .getTitle(); + drawString(tagName, 3, 8, 0xffeedd); - GL11.glDisable(GL11.GL_SCISSOR_TEST); + GL11.glDisable(GL11.GL_SCISSOR_TEST); - RenderSystem.popMatrix(); - }); + RenderSystem.popMatrix(); + }); } protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { @@ -523,7 +553,7 @@ public class PonderUI extends AbstractSimiScreen { return; if (w instanceof PonderButton) { PonderButton mtdButton = (PonderButton) w; - mtdButton.runCallback(); + mtdButton.runCallback(x, y); handled.setTrue(); return; } @@ -587,7 +617,9 @@ public class PonderUI extends AbstractSimiScreen { if (chapter != null) return Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()); - return stack.getItem().getName().getFormattedText(); + return stack.getItem() + .getName() + .getFormattedText(); } public FontRenderer getFontRenderer() { 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 new file mode 100644 index 000000000..855b80413 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -0,0 +1,27 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; + +import net.minecraft.util.Direction; + +public class MovementActorScenes { + + public static void psiTransfer(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Contraption Storage Exchange"); + scene.configureBasePlate(0, 0, 6); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + + } + + public static void psiRedstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Redstone Control"); + scene.configureBasePlate(0, 0, 6); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + } + +} 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 0e6b00894..ad9371231 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 @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.PonderRegistry; + import net.minecraft.block.Blocks; import net.minecraft.item.Items; @@ -16,8 +17,10 @@ public class PonderIndex { // (!) Modifications inside storyboard methods only require re-opening the ui PonderRegistry.forComponents(AllBlocks.SHAFT) - .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, b -> b.highlightAllTags().chapter(PonderChapter.of("basic_kinetics"))) - .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased, b -> b.chapter(PonderChapter.of("encasing"))); + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, b -> b.highlightAllTags() + .chapter(PonderChapter.of("basic_kinetics"))) + .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased, + b -> b.chapter(PonderChapter.of("encasing"))); // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); @@ -28,7 +31,7 @@ public class PonderIndex { .addStoryBoard("funnels/redstone", FunnelScenes::redstone) .addStoryBoard("funnels/transposer", FunnelScenes::transposer); PonderRegistry.addStoryBoard(AllBlocks.ANDESITE_FUNNEL, "funnels/brass", FunnelScenes::brass); - + // Gantries PonderRegistry.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft); PonderRegistry.addStoryBoard(AllBlocks.GANTRY_CARRIAGE, "gantry/intro", GantryScenes::introForPinion); @@ -37,6 +40,11 @@ public class PonderIndex { .addStoryBoard("gantry/direction", GantryScenes::direction) .addStoryBoard("gantry/subgantry", GantryScenes::subgantry); + // Movement Actors + PonderRegistry.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) + .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer) + .addStoryBoard("portable_interface/redstone", MovementActorScenes::psiRedstone); + // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) DebugScenes.registerAll(); @@ -45,26 +53,22 @@ public class PonderIndex { public static void registerTags() { PonderRegistry.tags.forItems(AllBlocks.SHAFT.getId()) - .add(PonderTag.Create.KINETICS); + .add(PonderTag.KINETICS); PonderRegistry.tags.forItems(AllBlocks.ANDESITE_FUNNEL.getId(), AllBlocks.BRASS_FUNNEL.getId()) - .add(PonderTag.Create.ARM_ACCESS) - .add(PonderTag.Vanilla.ITEM_TRANSFER) - .add(PonderTag.Vanilla.REDSTONE_CONTROL); + .add(PonderTag.ARM_ACCESS) + .add(PonderTag.ITEM_TRANSFER) + .add(PonderTag.REDSTONE_CONTROL); - PonderRegistry.tags.forTag(PonderTag.Vanilla.REDSTONE_CONTROL) - .add(Items.REDSTONE.getRegistryName()) - .add(Blocks.LEVER.getRegistryName()); + PonderRegistry.tags.forTag(PonderTag.REDSTONE_CONTROL) + .add(Items.REDSTONE.getRegistryName()) + .add(Blocks.LEVER.getRegistryName()); - PonderRegistry.tags.forTag(PonderTag.Create.KINETICS) - .add(AllBlocks.COGWHEEL.getId()) - .add(AllBlocks.LARGE_COGWHEEL.getId()) - .add(AllItems.BELT_CONNECTOR.getId()) - .add(AllBlocks.ENCASED_CHAIN_DRIVE.getId()); - - PonderChapter.of("basic_kinetics").addTagsToChapter( - PonderTag.Create.KINETICS - ); + PonderRegistry.tags.forTag(PonderTag.KINETICS) + .add(AllBlocks.COGWHEEL.getId()) + .add(AllBlocks.LARGE_COGWHEEL.getId()) + .add(AllItems.BELT_CONNECTOR.getId()) + .add(AllBlocks.ENCASED_CHAIN_DRIVE.getId()); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java index 542148e96..a8176db77 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndexScreen.java @@ -63,9 +63,11 @@ public class PonderIndexScreen extends AbstractSimiScreen { //todo at some point pagination or horizontal scrolling may be needed for chapters/items for (PonderChapter chapter : chapters) { - ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), chapterCenterY + layout.getY(), () -> { - ScreenOpener.transitionTo(PonderUI.of(chapter)); - }); + ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), + chapterCenterY + layout.getY(), (mouseX, mouseY) -> { + centerScalingOn(mouseX, mouseY); + ScreenOpener.transitionTo(PonderUI.of(chapter)); + }); widgets.add(label); layout.next(); @@ -98,7 +100,7 @@ public class PonderIndexScreen extends AbstractSimiScreen { int itemCenterY = (int) (height * itemYmult); for (Item item : items) { - PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, () -> {}) + PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, (x, y) -> {}) .showing(new ItemStack(item)); button.fade(1); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java index c960b8f01..6e4679494 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java @@ -4,6 +4,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.IScreenRenderable; +import com.simibubi.create.foundation.ponder.PonderLocalization; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; import net.minecraft.item.Item; @@ -15,11 +17,44 @@ import net.minecraftforge.api.distmarker.OnlyIn; public class PonderTag implements IScreenRenderable { + // + + public static final PonderTag + + KINETICS = new PonderTag("kinetics").item(AllBlocks.COGWHEEL.get() + .asItem(), true, false) + .defaultLang("Kinetic Blocks", "Components which help generating, relaying and making use of Rotational Force"), + FLUID_TRANSFER = new PonderTag("fluid_transfer").idAsIcon(), + OPEN_INVENTORY = new PonderTag("open_inventory").item(AllBlocks.BASIN.get() + .asItem()), + ARM_ACCESS = new PonderTag("arm_access").item(AllBlocks.MECHANICAL_ARM.get() + .asItem()) + .defaultLang("Targets for Mechanical Arms", + "Components which can be selected as inputs or outputs to the Mechanical Arm"), + REDSTONE_CONTROL = new PonderTag("redstone_control").item(Items.REDSTONE, true, false), + ITEM_TRANSFER = new PonderTag("item_transfer").idAsIcon(); + + public static class Highlight { + public static final PonderTag ALL = new PonderTag("_all"); + } + + // + private final String id; private ResourceLocation icon; private ItemStack itemIcon = ItemStack.EMPTY; private ItemStack mainItem = ItemStack.EMPTY; + public String getTitle() { + return PonderLocalization.getTag(id); + } + + public String getDescription() { + return PonderLocalization.getTagDescription(id); + } + + // Builder + public PonderTag(String id) { this.id = id; } @@ -28,6 +63,11 @@ public class PonderTag implements IScreenRenderable { return id; } + public PonderTag defaultLang(String title, String description) { + PonderLocalization.registerTag(id, title, description); + return this; + } + public ItemStack getMainItem() { return mainItem; } @@ -46,8 +86,10 @@ public class PonderTag implements IScreenRenderable { } public PonderTag item(Item item, boolean useAsIcon, boolean useAsMainItem) { - if (useAsIcon) this.itemIcon = new ItemStack(item); - if (useAsMainItem) this.mainItem = new ItemStack(item); + if (useAsIcon) + this.itemIcon = new ItemStack(item); + if (useAsMainItem) + this.mainItem = new ItemStack(item); return this; } @@ -57,32 +99,23 @@ public class PonderTag implements IScreenRenderable { RenderSystem.pushMatrix(); RenderSystem.translated(x, y, 0); if (icon != null) { - Minecraft.getInstance().getTextureManager().bindTexture(icon); + Minecraft.getInstance() + .getTextureManager() + .bindTexture(icon); RenderSystem.scaled(0.25, 0.25, 1); - //x and y offset, blit z offset, tex x and y, tex width and height, entire tex sheet width and height + // x and y offset, blit z offset, tex x and y, tex width and height, entire tex + // sheet width and height AbstractGui.blit(0, 0, 0, 0, 0, 64, 64, 64, 64); } else if (!itemIcon.isEmpty()) { RenderSystem.translated(-4, -4, 0); - RenderSystem.scaled(1.5, 1.5, 1); - GuiGameElement.of(itemIcon).render(); + RenderSystem.scaled(1.5, 1.5, 1.5); + GuiGameElement.of(itemIcon) + .render(); } RenderSystem.popMatrix(); } - public static class Create { - public static final PonderTag KINETICS = new PonderTag("kinetics").item(AllBlocks.COGWHEEL.get().asItem(), true, false); - public static final PonderTag FLUID_TRANSFER = new PonderTag("fluid_transfer").idAsIcon(); + // Load class + public static void register() {} - public static final PonderTag OPEN_INVENTORY = new PonderTag("open_inventory").item(AllBlocks.BASIN.get().asItem()); - public static final PonderTag ARM_ACCESS = new PonderTag("arm_access").item(AllBlocks.MECHANICAL_ARM.get().asItem()); - } - - public static class Vanilla { - public static final PonderTag REDSTONE_CONTROL = new PonderTag("redstone_control").item(Items.REDSTONE, true, false); - public static final PonderTag ITEM_TRANSFER = new PonderTag("item_transfer").idAsIcon(); - } - - public static class Highlight { - public static final PonderTag ALL = new PonderTag("_all"); - } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java index 1281a1ba0..0fef32306 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java @@ -1,16 +1,23 @@ package com.simibubi.create.foundation.ponder.content; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.apache.commons.lang3.mutable.MutableBoolean; + import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; -import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.ponder.PonderLocalization; import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.ponder.ui.ChapterLabel; import com.simibubi.create.foundation.ponder.ui.LayoutHelper; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.utility.Lang; + import net.minecraft.block.Block; import net.minecraft.client.MainWindow; import net.minecraft.client.gui.widget.Widget; @@ -20,12 +27,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; import net.minecraftforge.registries.ForgeRegistries; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - public class PonderTagScreen extends AbstractSimiScreen { + public static final String ASSOCIATED = PonderLocalization.LANG_PREFIX + "associated"; + protected final PonderTag tag; protected final List items; private final double itemXmult = 0.5; @@ -35,12 +40,11 @@ public class PonderTagScreen extends AbstractSimiScreen { private final double chapterXmult = 0.5; private final double chapterYmult = 0.75; protected Rectangle2d chapterArea; - private final double mainXmult = 0.5; +// private final double mainXmult = 0.5; private final double mainYmult = 0.15; private ItemStack hoveredItem = ItemStack.EMPTY; - public PonderTagScreen(PonderTag tag) { this.tag = tag; items = new ArrayList<>(); @@ -52,21 +56,21 @@ public class PonderTagScreen extends AbstractSimiScreen { super.init(); widgets.clear(); - //items + // items items.clear(); PonderRegistry.tags.getItems(tag) - .stream() - .map(key -> { - Item item = ForgeRegistries.ITEMS.getValue(key); - if (item == null) { - Block b = ForgeRegistries.BLOCKS.getValue(key); - if (b != null) - item = b.asItem(); - } - return item; - }) - .filter(Objects::nonNull) - .forEach(items::add); + .stream() + .map(key -> { + Item item = ForgeRegistries.ITEMS.getValue(key); + if (item == null) { + Block b = ForgeRegistries.BLOCKS.getValue(key); + if (b != null) + item = b.asItem(); + } + return item; + }) + .filter(Objects::nonNull) + .forEach(items::add); int rowCount = MathHelper.clamp((int) Math.ceil(items.size() / 11d), 1, 3); LayoutHelper layout = LayoutHelper.centeredHorizontal(items.size(), rowCount, 28, 28, 8); @@ -75,15 +79,20 @@ public class PonderTagScreen extends AbstractSimiScreen { int itemCenterY = (int) (height * itemYmult); for (Item i : items) { - PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, () -> {}) - .showing(new ItemStack(i)); + PonderButton button = + new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, (mouseX, mouseY) -> { + if (!PonderRegistry.all.containsKey(i.getRegistryName())) + return; + centerScalingOn(mouseX, mouseY); + ScreenOpener.transitionTo(PonderUI.of(new ItemStack(i))); + }).showing(new ItemStack(i)); button.fade(1); widgets.add(button); layout.next(); } - //chapters + // chapters chapters.clear(); chapters.addAll(PonderRegistry.tags.getChapters(tag)); @@ -94,9 +103,11 @@ public class PonderTagScreen extends AbstractSimiScreen { int chapterCenterY = (int) (height * chapterYmult); for (PonderChapter chapter : chapters) { - ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), chapterCenterY + layout.getY(), () -> { - ScreenOpener.transitionTo(PonderUI.of(chapter)); - }); + ChapterLabel label = new ChapterLabel(chapter, chapterCenterX + layout.getX(), + chapterCenterY + layout.getY(), (mouseX, mouseY) -> { + centerScalingOn(mouseX, mouseY); + ScreenOpener.transitionTo(PonderUI.of(chapter)); + }); widgets.add(label); layout.next(); @@ -127,45 +138,89 @@ public class PonderTagScreen extends AbstractSimiScreen { renderChapters(mouseX, mouseY, partialTicks); // - int x = (int) (width * mainXmult); - int y = (int) (height * mainYmult); +// int x = (int) (width * mainXmult); +// int y = (int) (height * mainYmult); +// +// RenderSystem.pushMatrix(); +// RenderSystem.translated(x, y, 0); +// RenderSystem.translated(-150, 0, 0); +// +// if (!tag.getMainItem() +// .isEmpty()) { +// RenderSystem.translated(-25, 0, 0); +// PonderUI.renderBox(0, -10, 20, 20, false); +// RenderSystem.pushMatrix(); +// RenderSystem.translated(-2, -12, 0); +// RenderSystem.scaled(1.5, 1.5, 1); +// GuiGameElement.of(tag.getMainItem()) +// .render(); +// +// RenderSystem.popMatrix(); +// +// RenderSystem.translated(75, 0, 0); +// +// } +// +// RenderSystem.pushMatrix(); +//// RenderSystem.scaled(1.5, 1.5, 1); +// +// // render icon & box +// PonderUI.renderBox(-8, -20, 40, 40, false); +// RenderSystem.translated(0, -10, 100); +// RenderSystem.scaled(1.5, 1.5, 1); +// tag.draw(this, 0, 0); +// +// RenderSystem.popMatrix(); +// +// // tag name & description +// UIRenderHelper.streak(0, 36, 0, 39, 350, 0x101010); +// drawString(font, Lang.translate("ponder.tag." + tag.getId()), 41, -16, 0xffff_ffff); +// drawString(font, Lang.translate("ponder.tag." + tag.getId() + ".desc"), 41, -4, 0xffff_ffff); +// +// RenderSystem.popMatrix(); RenderSystem.pushMatrix(); + RenderSystem.translated(width / 2 - 120, height * mainYmult - 40, 0); + + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 800); + int x = 31 + 20 + 8; + int y = 31; + + String title = tag.getTitle(); + + int streakHeight = 35; + UIRenderHelper.streak(0, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (240), 0x101010); + PonderUI.renderBox(21, 21, 30, 30, false); + + drawString(font, Lang.translate(PonderUI.PONDERING), x, y - 6, 0xffa3a3a3); + y += 8; + x += 0; + // RenderSystem.translated(0, 3 * (indexDiff), 0); RenderSystem.translated(x, y, 0); - RenderSystem.translated(-150, 0, 0); - - if (!tag.getMainItem().isEmpty()) { - RenderSystem.translated(-25, 0, 0); - PonderUI.renderBox(0, -10, 20, 20, false); - RenderSystem.pushMatrix(); - RenderSystem.translated(-2, -12, 0); - RenderSystem.scaled(1.5, 1.5, 1); - GuiGameElement.of(tag.getMainItem()).render(); - - RenderSystem.popMatrix(); - - RenderSystem.translated(75, 0, 0); - - } + RenderSystem.translated(0, 0, 5); + font.drawString(title, 0, 0, 0xeeeeee); + RenderSystem.popMatrix(); RenderSystem.pushMatrix(); - RenderSystem.scaled(1.5, 1.5, 1); - - - //render icon & box - PonderUI.renderBox(0, -10, 20, 20, true); - RenderSystem.translated(2, 2 - 10, 100); + RenderSystem.translated(23, 23, 0); + RenderSystem.scaled(1.66, 1.66, 1.66); tag.draw(this, 0, 0); - + RenderSystem.popMatrix(); RenderSystem.popMatrix(); - //tag name & description - UIRenderHelper.streak(0, 36, 0, 39, 350, 0x101010); - drawString(font, Lang.translate("ponder.tag." + tag.getId()), 41, -16, 0xffff_ffff); - drawString(font, Lang.translate("ponder.tag." + tag.getId() + ".desc"), 41, -4, 0xffff_ffff); + RenderSystem.pushMatrix(); + int w = (int) (width * .45); + x = (width - w) / 2; + y = (int) (height * itemYmult + itemArea.getHeight() + 20); + String desc = tag.getDescription(); + int h = font.getWordWrappedHeight(desc, w); + + PonderUI.renderBox(x - 3, y - 3, w + 6, h + 6, false); + RenderSystem.translated(0, 0, 100); + font.drawSplitString(desc, x, y, w, 0xeeeeee); RenderSystem.popMatrix(); - } protected void renderItems(int mouseX, int mouseY, float partialTicks) { @@ -175,14 +230,19 @@ public class PonderTagScreen extends AbstractSimiScreen { int x = (int) (width * itemXmult); int y = (int) (height * itemYmult); + String relatedTitle = Lang.translate(ASSOCIATED); + int stringWidth = font.getStringWidth(relatedTitle); + RenderSystem.pushMatrix(); RenderSystem.translated(x, y, 0); + PonderUI.renderBox((sWidth - stringWidth) / 2 - 5, itemArea.getY() - 21, stringWidth + 10, 10, false); + RenderSystem.translated(0, 0, 200); - UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); - drawString(font, "Related Items", itemArea.getX() - 5, itemArea.getY() - 25, 0xffddeeff); +// UIRenderHelper.streak(0, itemArea.getX() - 10, itemArea.getY() - 20, 20, 180, 0x101010); + drawCenteredString(font, relatedTitle, sWidth / 2, itemArea.getY() - 20, 0xeeeeee); - UIRenderHelper.streak(0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth()/2 + 75, 0x101010); - UIRenderHelper.streak(180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth()/2 + 75, 0x101010); + UIRenderHelper.streak(0, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75, 0x101010); + UIRenderHelper.streak(180, 0, 0, itemArea.getHeight() + 10, itemArea.getWidth() / 2 + 75, 0x101010); RenderSystem.popMatrix(); @@ -221,11 +281,32 @@ public class PonderTagScreen extends AbstractSimiScreen { @Override protected String getBreadcrumbTitle() { - return Lang.translate("ponder.tag." + tag.getId()); + return tag.getTitle(); } public ItemStack getHoveredTooltipItem() { return hoveredItem; } + @Override + public boolean mouseClicked(double x, double y, int button) { + MutableBoolean handled = new MutableBoolean(false); + widgets.forEach(w -> { + if (handled.booleanValue()) + return; + if (!w.isMouseOver(x, y)) + return; + if (w instanceof PonderButton) { + PonderButton mtdButton = (PonderButton) w; + mtdButton.runCallback(x, y); + handled.setTrue(); + return; + } + }); + + if (handled.booleanValue()) + return true; + return super.mouseClicked(x, y, button); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java index a912f324a..62f680df6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/ChapterLabel.java @@ -1,9 +1,13 @@ package com.simibubi.create.foundation.ponder.ui; +import java.util.function.BiConsumer; + +import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.UIRenderHelper; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; import com.simibubi.create.foundation.ponder.content.PonderChapter; import com.simibubi.create.foundation.utility.Lang; + import net.minecraft.client.Minecraft; public class ChapterLabel extends AbstractSimiWidget { @@ -11,7 +15,7 @@ public class ChapterLabel extends AbstractSimiWidget { private final PonderChapter chapter; private final PonderButton button; - public ChapterLabel(PonderChapter chapter, int x, int y, Runnable onClick) { + public ChapterLabel(PonderChapter chapter, int x, int y, BiConsumer onClick) { super(x, y, 175, 38); this.button = new PonderButton(x + 4, y + 4, onClick, 30, 30).showing(chapter); @@ -22,8 +26,9 @@ public class ChapterLabel extends AbstractSimiWidget { @Override public void render(int mouseX, int mouseY, float partialTicks) { - UIRenderHelper.streak(0, x, y + height/2, height - 2, width, 0x101010); - drawString(Minecraft.getInstance().fontRenderer, Lang.translate("ponder.chapter." + chapter.getId()), x + 50, y + 20, 0xffddeeff); + UIRenderHelper.streak(0, x, y + height / 2, height - 2, width, 0x101010); + drawString(Minecraft.getInstance().fontRenderer, Lang.translate("ponder.chapter." + chapter.getId()), x + 50, + y + 20, 0xffddeeff); button.renderButton(mouseX, mouseY, partialTicks); super.render(mouseX, mouseY, partialTicks); @@ -34,6 +39,6 @@ public class ChapterLabel extends AbstractSimiWidget { if (!button.isMouseOver(x, y)) return; - button.runCallback(); + button.runCallback(x, y); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java index 8ba55e22a..9e3e4cb1a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.ponder.ui; +import java.util.function.BiConsumer; + import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.IScreenRenderable; @@ -8,6 +10,7 @@ import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.LerpedFloat; + import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; @@ -17,7 +20,7 @@ public class PonderButton extends AbstractSimiWidget { private IScreenRenderable icon; private ItemStack item; protected boolean pressed; - private Runnable onClick; + private BiConsumer onClick; private int xFadeModifier; private int yFadeModifier; private float fade; @@ -26,14 +29,19 @@ public class PonderButton extends AbstractSimiWidget { public static final int SIZE = 20; - public PonderButton(int x, int y, Runnable onClick, int width, int height) { + public PonderButton(int x, int y, BiConsumer onClick, int width, int height) { super(x, y, width, height); this.onClick = onClick; - flash = LerpedFloat.linear().startWithValue(0); + flash = LerpedFloat.linear() + .startWithValue(0); + } + + public PonderButton(int x, int y, BiConsumer onClick) { + this(x, y, onClick, SIZE, SIZE); } public PonderButton(int x, int y, Runnable onClick) { - this(x, y, onClick, SIZE, SIZE); + this(x, y, ($, $$) -> onClick.run()); } public PonderButton showing(IScreenRenderable icon) { @@ -121,8 +129,8 @@ public class PonderButton extends AbstractSimiWidget { RenderSystem.popMatrix(); } - public void runCallback() { - onClick.run(); + public void runCallback(double mouseX, double mouseY) { + onClick.accept((int) mouseX, (int) mouseY); } @Override diff --git a/src/main/resources/ponder/portable_interface/redstone.nbt b/src/main/resources/ponder/portable_interface/redstone.nbt new file mode 100644 index 0000000000000000000000000000000000000000..799754288d00df99b8f78f1fe8848f7de6812711 GIT binary patch literal 667 zcmV;M0%ZLkiwFP!000000KJyaj?*v@#wW4Urd{#p00NGP7vRhdX)jz>D|XpyjbilZCvs+ zqHUh!kjf=|EG?4eOJ%GV3x$RA#)>r-QhT&3QDOqqYg41eCGGY6QW8^_r;1Dhv(heb z2H8!8glILdujr?1AN;76q)h1jSG`uae?R@c(^~2^VJ~h|0=|+fYK;-|+UKRw-o?S{voOHw)WZyh)_s97j z_G&9NmR77h@zD8^z6)v76D@LlZsjL5$LGXsBv!Zx^O5}&=F@1Vl~CwCHlL=89Qc*k zBD_D;R&S)oqBNSkqe;Eu%|YR`sf+geM!@;CH5JeQS^+u)FV9^$+^#G#~U z9W)lTv`-db)StZ{tTBCX`>6FRyDMpJl~^=~^QG|O4y}_$(?Zre5#$7xHHZ8>gp(E;1t_71ygZno6vumD3EEM2kf z#-OERi-=4LBwg3J+N1O-dcP;z4y`XomK>)0>I4`{O!9X={v^+FNXUrzn%{v(2(h05 zeyDwq$Pk3#hJz;d8IfR~%IH>y_|MlP;$>2oi>k*XR2ycXSg}8+*D|NqnA3OQcn%!j zfkPcQ<#zP}|y5=@!q zVoCg~S644X65PnOilB2rkDOfU8jLOnKY&=8#HJ}EgDWr_sctD5PFcnxZnodQw}JUL zSOjp+&?o)NI9KlaIYoO$fz~!6bf(W^GL95rFlTc}O^cpZul+OHe|&DpKa!jCW^Q_q z&CP(4@p&9Woaf}5-|UWgM7BaQx)g7*s!FvTVYmiXy2#n&T57DdZ{d}S(X+P0-At_4 zNNf%|Oe~I{i)9M=_~6I25H@EX8Q(-U5pP(!-VNpse^EHRf+%5vM=YJqfhoJ>@E|mO z@(Z6la{5{^p%=(6f zlft(J#sFzcj`|IMXyp%m%~yCFD%4j6DwE2vc?vU)s<0)@xIn`T76In!T5dpLW^qSc zaAb<8>-K3H4*m_pev9EjWw;^lFgO3CFpuJD&2@{WP2%t`5rd<|gI!|J?Y*Os+c>Rv zN+Poi^LZ$N*RV1wthC^s*0?AE-Mq$V3oZO;T5yE+(52{dDLr@veO3sh`6|Qxc8lH` z9zAqjzUaDx_8XP)rys|(D-Qqv6~{$a9P~&WzrX));~+a zw8YV=$9^0WoHNK+3dVr_-TY*Ty$V|ac~;*UTFA|8_tTn`qo3EKn}i#fMN*)Xh{TKI zT1mVB?eB7IfTFwsq6?O4z~vcJhIk-i9K%|&YmPQ}Ck@f36xWe3k&54855&^S+`W#@ z$$||~nZM0OLFuovYW|Tnq_KLCmBq4fk?Mq@7b8rVVv&JnF6uOwJ}InRGwa!`=qx%M z^nvXyf4Gu&a_+hDc+N!Q2EESV8SYL|?MrOrmWv$%pDQ+>QW@Xjx z^3)b(%rOY-SxkJR)-~&}EH^OY4VqG^TrT(YDcMwDzzMR<7Uc@;HcM;vK~;4@7a6## zC@1CFP7w5Qh$>-BE$vBMZW1`$B5tgwWv^6Hu&KIWhP?r$xx^lM_<{ThQ%CvZloJ2| DNM#~= literal 0 HcmV?d00001 From 83a641c3b8039372fbe385fa051fa14f7758e612 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 5 Mar 2021 20:54:41 +0100 Subject: [PATCH 18/23] go teach them - Ponder scenes for portable storage interface - More work on tags - Fixed tag screen on small resolution --- src/generated/resources/.cache/cache | 26 +-- .../resources/assets/create/lang/en_us.json | 29 ++- .../assets/create/lang/unfinished/de_de.json | 31 +++- .../assets/create/lang/unfinished/es_es.json | 31 +++- .../assets/create/lang/unfinished/es_mx.json | 31 +++- .../assets/create/lang/unfinished/fr_fr.json | 31 +++- .../assets/create/lang/unfinished/it_it.json | 31 +++- .../assets/create/lang/unfinished/ja_jp.json | 31 +++- .../assets/create/lang/unfinished/ko_kr.json | 31 +++- .../assets/create/lang/unfinished/nl_nl.json | 31 +++- .../assets/create/lang/unfinished/pt_br.json | 31 +++- .../assets/create/lang/unfinished/ru_ru.json | 31 +++- .../assets/create/lang/unfinished/zh_cn.json | 31 +++- .../assets/create/lang/unfinished/zh_tw.json | 31 +++- .../PortableStorageInterfaceTileEntity.java | 7 +- .../bearing/MechanicalBearingTileEntity.java | 17 +- .../foundation/ponder/PonderRegistry.java | 34 ++-- .../foundation/ponder/SceneBuilder.java | 14 ++ .../ponder/content/MovementActorScenes.java | 174 +++++++++++++++++- .../ponder/content/PonderIndex.java | 113 ++++++++++-- .../foundation/ponder/content/PonderTag.java | 53 ++++-- .../ponder/content/PonderTagRegistry.java | 46 +++-- .../ponder/content/PonderTagScreen.java | 72 +++----- .../ponder/elements/InputWindowElement.java | 4 +- .../ponder/elements/WorldSectionElement.java | 12 +- .../AnimateTileEntityInstruction.java | 70 +++++++ .../foundation/ponder/ui/LayoutHelper.java | 12 +- 27 files changed, 840 insertions(+), 215 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1f3450836..17f3b565d 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2384c6457ecf24c7b38358179b8fa6eb93b9627a assets/create/lang/en_ud.json -52fd28525a66b08652bac2d1a4a5543956b47091 assets/create/lang/en_us.json -00751ce98f978b4568723ebeaa0350d77a380cd8 assets/create/lang/unfinished/de_de.json -2d8c801b475cabc33c7d0f8f318ef9068a4b8cea assets/create/lang/unfinished/es_es.json -1b18ac809eda5655000a56190bd8be467062beab assets/create/lang/unfinished/es_mx.json -93340db6d63864fa23bf663954221b68d345a37f assets/create/lang/unfinished/fr_fr.json -299731bb461adb0c55393fa9c1d814861b002ebd assets/create/lang/unfinished/it_it.json -947363f4bcec709f398904ece57a5d66294dd6f8 assets/create/lang/unfinished/ja_jp.json -11798cdf3c66152fc736cdba465b795c0abac0b4 assets/create/lang/unfinished/ko_kr.json -b30301ea195e3c08dc8d1fecfd9a546255ac75b8 assets/create/lang/unfinished/nl_nl.json -feb0ab7a4c616447dd74e4cf808a003447cfdfe1 assets/create/lang/unfinished/pt_br.json -d12dde0c45bbf29613ade488619b57949ee7068c assets/create/lang/unfinished/ru_ru.json -b904d41c0cda0d56b1aa519a45a35800589445d5 assets/create/lang/unfinished/zh_cn.json -47e89b425362abb4241b4ffe73bfaa22fef0b6f0 assets/create/lang/unfinished/zh_tw.json +3df303c4115c5ebac291b8c62f844812706fc1a2 assets/create/lang/en_us.json +7e3384a3417e42c6af669a1de71520f91917c173 assets/create/lang/unfinished/de_de.json +1b96fec34e10b77750ff9df5ab8ba7d70a781f8a assets/create/lang/unfinished/es_es.json +500288690ba8d9541f49f0e97e6e5d0fe03c5878 assets/create/lang/unfinished/es_mx.json +71f5958650b1300534cb03a602449620d8cede48 assets/create/lang/unfinished/fr_fr.json +305e0f563cf8548ab671a0468dbf98b5b429b7be assets/create/lang/unfinished/it_it.json +0476653ed29767f05370c56415224f6adf711cea assets/create/lang/unfinished/ja_jp.json +284cc716b6ecb3be8b9686cea842dc1f80377104 assets/create/lang/unfinished/ko_kr.json +2113c093bddcda9161bdb7993545115097267c96 assets/create/lang/unfinished/nl_nl.json +d4418c9eab8786dc3167661896910093f1ec36ff assets/create/lang/unfinished/pt_br.json +7d8050786296c33dc5b05f0a8bae7fe1e5f03d46 assets/create/lang/unfinished/ru_ru.json +87aae73838184ee67353f57e1468c3d28f834172 assets/create/lang/unfinished/zh_cn.json +755792dde83c565808b5ade4c48db1cbb4792d49 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 d4d95363b..16a3c01d3 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1811,10 +1811,22 @@ "create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.ctrl_and": "Ctrl +", - "create.ponder.tag.arm_access": "Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "Kinetic Blocks", - "create.ponder.tag.kinetics.description": "Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "Contraption Actors", + "create.ponder.tag.contraption_actor.description": "Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "Item Transportation", + "create.ponder.tag.logistics.description": "Components which help moving items around", + "create.ponder.tag.movement_anchor": "Movement Anchors", + "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "Fluid Manipulators", + "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "Andesite Funnels can only ever extract single items.", @@ -1872,8 +1884,17 @@ "create.ponder.shaft.scene_1.text_1": "Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "Funnels are ideal for transferring items from and to inventories.", 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 b1d288aac..89482bf57 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: 1066", + "_": "Missing Localizations: 1087", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 539839eb7..8b7db4b71 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: 109", + "_": "Missing Localizations: 130", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 fff507aad..c27b19cb8 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: 996", + "_": "Missing Localizations: 1017", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 693fe889c..406cf0985 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: 778", + "_": "Missing Localizations: 799", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 685be1ccf..2653a490a 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: 114", + "_": "Missing Localizations: 135", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 d2422e9a2..1571d0fc4 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: 121", + "_": "Missing Localizations: 142", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 6f40bbe56..1ab559b35 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: 167", + "_": "Missing Localizations: 188", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 8e529378e..c6280279d 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: 1265", + "_": "Missing Localizations: 1286", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 77c539d59..35409db99 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: 1331", + "_": "Missing Localizations: 1352", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 af1d88bd4..a34ba2f18 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: 117", + "_": "Missing Localizations: 138", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 3e91b0982..b8dbe1f27 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: 115", + "_": "Missing Localizations: 136", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", 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 d6e1b1599..d18975b6b 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: 120", + "_": "Missing Localizations: 141", "_": "->------------------------] Game Elements [------------------------<-", @@ -1812,10 +1812,22 @@ "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", - "create.ponder.tag.arm_access": "UNLOCALIZED: Targets for Mechanical Arms", - "create.ponder.tag.arm_access.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", - "create.ponder.tag.kinetics": "UNLOCALIZED: Kinetic Blocks", - "create.ponder.tag.kinetics.description": "UNLOCALIZED: Components which help generating, relaying and making use of Rotational Force", + "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", + "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", + "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", + "create.ponder.tag.contraption_actor.description": "UNLOCALIZED: Components which expose special behaviour when attached to a moving contraption", + "create.ponder.tag.arm_targets": "UNLOCALIZED: Targets for Mechanical Arms", + "create.ponder.tag.arm_targets.description": "UNLOCALIZED: Components which can be selected as inputs or outputs to the Mechanical Arm", + "create.ponder.tag.logistics": "UNLOCALIZED: Item Transportation", + "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", + "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", + "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", + "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", + "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", + "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", + "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1873,8 +1885,17 @@ "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java index d304af537..9ea1408a7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PortableStorageInterfaceTileEntity.java @@ -55,8 +55,9 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity public void tick() { super.tick(); boolean wasConnected = isConnected(); + int timeUnit = getTransferTimeout() / 2; - if (transferTimer > 0) { + if (transferTimer > 0 && (!isVirtual() || transferTimer != timeUnit)) { transferTimer--; if (transferTimer == 0 || powered) stopTransferring(); @@ -67,7 +68,6 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity markDirty(); float progress = 0; - int timeUnit = getTransferTimeout() / 2; if (isConnected) progress = 1; else if (transferTimer >= timeUnit * 3) @@ -106,12 +106,13 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity powered = isBlockPowered; sendData(); } - + public boolean isPowered() { return powered; } protected AxisAlignedBB cachedBoundingBox; + @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java index 42460217a..e92e9ff22 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/MechanicalBearingTileEntity.java @@ -25,7 +25,8 @@ import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity implements IBearingTileEntity, IDisplayAssemblyExceptions { +public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity + implements IBearingTileEntity, IDisplayAssemblyExceptions { protected ScrollOptionBehaviour movementMode; protected ControlledContraptionEntity movedContraption; @@ -35,6 +36,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp protected float clientAngleDiff; protected AssemblyException lastException; + private float prevAngle; + public MechanicalBearingTileEntity(TileEntityType type) { super(type); setLazyTickRate(3); @@ -87,6 +90,8 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp @Override public float getInterpolatedAngle(float partialTicks) { + if (isVirtual()) + return MathHelper.lerp(partialTicks + .5f, prevAngle, angle); if (movedContraption == null || movedContraption.isStalled() || !running) partialTicks = 0; return MathHelper.lerp(partialTicks, angle, angle + getAngularSpeed()); @@ -145,7 +150,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp AllTriggers.triggerForNearbyPlayers(AllTriggers.WINDMILL, world, pos, 5); if (contraption.getSailBlocks() >= 16 * 8) AllTriggers.triggerForNearbyPlayers(AllTriggers.MAXED_WINDMILL, world, pos, 5); - + contraption.removeBlocksFromWorld(world, BlockPos.ZERO); movedContraption = ControlledContraptionEntity.create(world, this, contraption); BlockPos anchor = pos.offset(direction); @@ -179,6 +184,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp public void tick() { super.tick(); + prevAngle = angle; if (world.isRemote) clientAngleDiff /= 2; @@ -291,7 +297,7 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp BlockState state = getBlockState(); if (!(state.getBlock() instanceof BearingBlock)) return false; - + BlockState attachedState = world.getBlockState(pos.offset(state.get(BearingBlock.FACING))); if (attachedState.getMaterial() .isReplaceable()) @@ -304,4 +310,9 @@ public class MechanicalBearingTileEntity extends GeneratingKineticTileEntity imp public boolean shouldRenderAsTE() { return true; } + + public void setAngle(float forcedAngle) { + angle = forcedAngle; + } + } 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 fe804fc53..e45f184b7 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -1,10 +1,29 @@ package com.simibubi.create.foundation.ponder; +import java.io.BufferedInputStream; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.zip.GZIPInputStream; + import com.google.gson.JsonElement; import com.simibubi.create.Create; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; -import com.simibubi.create.foundation.ponder.content.*; +import com.simibubi.create.foundation.ponder.content.PonderChapter; +import com.simibubi.create.foundation.ponder.content.PonderChapterRegistry; +import com.simibubi.create.foundation.ponder.content.PonderIndex; +import com.simibubi.create.foundation.ponder.content.PonderTag; +import com.simibubi.create.foundation.ponder.content.PonderTagRegistry; +import com.simibubi.create.foundation.ponder.content.SharedText; import com.tterrag.registrate.util.entry.ItemProviderEntry; + import net.minecraft.client.Minecraft; import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompressedStreamTools; @@ -14,14 +33,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.gen.feature.template.PlacementSettings; import net.minecraft.world.gen.feature.template.Template; -import java.io.BufferedInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; -import java.util.function.Consumer; -import java.util.zip.GZIPInputStream; - public class PonderRegistry { public static final PonderTagRegistry tags = new PonderTagRegistry(); @@ -60,9 +71,8 @@ public class PonderRegistry { public static List compile(List entries) { if (PonderIndex.EDITOR_MODE) { - //PonderLocalization.shared.clear(); - //PonderLocalization.specific.clear(); - //SharedText.gatherText(); + PonderLocalization.shared.clear(); + SharedText.gatherText(); } List scenes = new ArrayList<>(); 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 a2e165133..a27eb31a8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -21,6 +21,7 @@ import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +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.CreateParrotInstruction; @@ -373,10 +374,23 @@ public class SceneBuilder { AnimateWorldSectionInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration)); } + public void configureCenterOfRotation(ElementLink link, Vec3d anchor) { + addInstruction(scene -> scene.resolve(link) + .setCenterOfRotation(anchor)); + } + public void moveSection(ElementLink link, Vec3d offset, int duration) { addInstruction(AnimateWorldSectionInstruction.move(link, offset, duration)); } + public void rotateBearing(BlockPos pos, float angle, int duration) { + addInstruction(AnimateTileEntityInstruction.bearing(pos, angle, duration)); + } + + public void movePulley(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.pulley(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/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index 855b80413..e4d7aeb4a 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,27 +1,189 @@ package com.simibubi.create.foundation.ponder.content; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; +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.utility.Pointing; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; public class MovementActorScenes { - + public static void psiTransfer(SceneBuilder scene, SceneBuildingUtil util) { scene.title("Contraption Storage Exchange"); - scene.configureBasePlate(0, 0, 6); + scene.configureBasePlate(0, 0, 8); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - + + BlockPos bearing = util.grid.at(5, 1, 2); + scene.world.showSection(util.select.position(bearing), Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(5, 2, 2, 6, 3, 2), Direction.DOWN); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearing)); + scene.idle(10); + scene.world.rotateBearing(bearing, 360, 70); + scene.world.rotateSection(contraption, 0, 360, 0, 70); + scene.overlay.showText(60) + .pointAt(util.vector.topOf(bearing.up(2))) + .colored(PonderPalette.RED) + .placeNearTarget() + .text("Inventories on moving contraptions cannot be accessed by players."); + + scene.idle(70); + BlockPos psi = util.grid.at(4, 2, 2); + scene.world.showSectionAndMerge(util.select.position(psi), Direction.EAST, contraption); + scene.idle(13); + scene.effects.superGlue(psi, Direction.EAST, true); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(psi)) + .colored(PonderPalette.GREEN) + .placeNearTarget() + .text("This component can interact with storage without the need to stop the contraption."); + scene.idle(90); + + BlockPos psi2 = psi.west(2); + scene.world.showSection(util.select.position(psi2), Direction.DOWN); + scene.overlay.showSelectionWithText(util.select.position(psi.west()), 50) + .colored(PonderPalette.RED) + .placeNearTarget() + .text("Place a second one with a gap of 1 or 2 blocks inbetween"); + scene.idle(55); + + scene.world.rotateBearing(bearing, 360, 60); + scene.world.rotateSection(contraption, 0, 360, 0, 60); + scene.idle(20); + + scene.overlay.showText(40) + .placeNearTarget() + .pointAt(util.vector.of(3, 3, 2.5)) + .text("Whenever they pass by each other, they will engage in a connection"); + scene.idle(35); + + Selection both = util.select.fromTo(2, 2, 2, 4, 2, 2); + Class psiClass = PortableItemInterfaceTileEntity.class; + + scene.world.modifyTileNBT(both, psiClass, nbt -> { + nbt.putFloat("Distance", 1); + nbt.putFloat("Timer", 40); + }); + + scene.idle(20); + scene.overlay.showOutline(PonderPalette.GREEN, psi, util.select.fromTo(5, 3, 2, 6, 3, 2), 80); + scene.idle(10); + + scene.overlay.showSelectionWithText(util.select.position(psi2), 70) + .placeNearTarget() + .colored(PonderPalette.GREEN) + .text("While engaged, the stationary interface will represent ALL inventories on the contraption"); + + scene.idle(80); + + BlockPos hopper = util.grid.at(2, 3, 2); + scene.world.showSection(util.select.position(hopper), Direction.DOWN); + scene.overlay.showText(70) + .placeNearTarget() + .pointAt(util.vector.topOf(hopper)) + .text("Items can now be inserted..."); + + ItemStack itemStack = AllItems.COPPER_INGOT.asStack(); + Vec3d entitySpawn = util.vector.topOf(hopper.up(3)); + + ElementLink entity1 = + scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); + scene.idle(10); + ElementLink entity2 = + scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), itemStack); + scene.idle(10); + scene.world.modifyEntity(entity1, Entity::remove); + scene.idle(10); + scene.world.modifyEntity(entity2, Entity::remove); + + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(6, 3, 2), Pointing.DOWN).withItem(itemStack), 40); + + scene.idle(30); + scene.world.hideSection(util.select.position(hopper), Direction.UP); + scene.idle(15); + + BlockPos beltPos = util.grid.at(1, 1, 2); + scene.world.showSection(util.select.fromTo(0, 1, 0, 1, 2, 6), Direction.DOWN); + scene.idle(10); + scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack.copy()); + scene.overlay.showText(40) + .placeNearTarget() + .pointAt(util.vector.topOf(beltPos.up())) + .text("...or extracted from the contraption"); + scene.idle(15); + scene.world.createItemOnBelt(beltPos, Direction.EAST, itemStack); + + scene.idle(20); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.idle(15); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + + scene.overlay.showText(120) + .placeNearTarget() + .pointAt(util.vector.topOf(psi2)) + .text("After no items have been exchanged for a while, the contraption will continue on its way"); + scene.world.modifyTileNBT(both, psiClass, nbt -> nbt.putFloat("Timer", 9)); + + scene.idle(15); + scene.markAsFinished(); + scene.world.rotateBearing(bearing, 270, 120); + scene.world.rotateSection(contraption, 0, 270, 0, 120); } - + public static void psiRedstone(SceneBuilder scene, SceneBuildingUtil util) { scene.title("Redstone Control"); scene.configureBasePlate(0, 0, 6); + + Class psiClass = PortableItemInterfaceTileEntity.class; + Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3); + scene.world.modifyTileNBT(psis, psiClass, nbt -> { + nbt.putFloat("Distance", 1); + nbt.putFloat("Timer", 40); + }); + scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.idle(5); + + ElementLink contraption = + scene.world.showIndependentSection(util.select.layersFrom(2), Direction.DOWN); + BlockPos bearing = util.grid.at(3, 1, 3); + scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearing)); + scene.idle(20); + scene.world.modifyTileNBT(psis, psiClass, nbt -> nbt.putFloat("Timer", 9)); + scene.idle(20); + scene.world.rotateBearing(bearing, 360 * 3 + 270, 240 + 60); + scene.world.rotateSection(contraption, 0, 360 * 3 + 270, 0, 240 + 60); + scene.idle(20); + + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 1, 1, 1, 2)); + scene.effects.indicateRedstone(util.grid.at(1, 1, 1)); + + scene.idle(10); + + scene.overlay.showSelectionWithText(util.select.position(1, 1, 3), 120) + .colored(PonderPalette.RED) + .text("Redstone power will prevent the stationary interface from engaging"); + + scene.idle(20); + scene.markAsFinished(); } } 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 ad9371231..5e9e35588 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 @@ -5,7 +5,6 @@ import com.simibubi.create.AllItems; import com.simibubi.create.foundation.ponder.PonderRegistry; import net.minecraft.block.Blocks; -import net.minecraft.item.Items; public class PonderIndex { @@ -17,10 +16,8 @@ public class PonderIndex { // (!) Modifications inside storyboard methods only require re-opening the ui PonderRegistry.forComponents(AllBlocks.SHAFT) - .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay, b -> b.highlightAllTags() - .chapter(PonderChapter.of("basic_kinetics"))) - .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased, - b -> b.chapter(PonderChapter.of("encasing"))); + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) + .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); @@ -51,24 +48,102 @@ public class PonderIndex { } public static void registerTags() { + // Add items to tags here - PonderRegistry.tags.forItems(AllBlocks.SHAFT.getId()) - .add(PonderTag.KINETICS); + PonderRegistry.tags.forTag(PonderTag.KINETIC_RELAYS) + .add(AllBlocks.SHAFT) + .add(AllBlocks.COGWHEEL) + .add(AllBlocks.LARGE_COGWHEEL) + .add(AllItems.BELT_CONNECTOR) + .add(AllBlocks.ENCASED_CHAIN_DRIVE); - PonderRegistry.tags.forItems(AllBlocks.ANDESITE_FUNNEL.getId(), AllBlocks.BRASS_FUNNEL.getId()) - .add(PonderTag.ARM_ACCESS) - .add(PonderTag.ITEM_TRANSFER) - .add(PonderTag.REDSTONE_CONTROL); + PonderRegistry.tags.forTag(PonderTag.KINETIC_SOURCES) + .add(AllBlocks.HAND_CRANK) + .add(AllBlocks.COPPER_VALVE_HANDLE) + .add(AllBlocks.WATER_WHEEL) + .add(AllBlocks.ENCASED_FAN) + .add(AllBlocks.WINDMILL_BEARING) + .add(AllBlocks.FURNACE_ENGINE); - PonderRegistry.tags.forTag(PonderTag.REDSTONE_CONTROL) - .add(Items.REDSTONE.getRegistryName()) - .add(Blocks.LEVER.getRegistryName()); + PonderRegistry.tags.forTag(PonderTag.KINETIC_APPLIANCES) + .add(AllBlocks.MILLSTONE) + .add(AllBlocks.TURNTABLE) + .add(AllBlocks.MECHANICAL_PRESS) + .add(AllBlocks.MECHANICAL_MIXER) + .add(AllBlocks.MECHANICAL_CRAFTER) + .add(AllBlocks.MECHANICAL_DRILL) + .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.MECHANICAL_PUMP) + .add(AllBlocks.MECHANICAL_ARM) + .add(AllBlocks.MECHANICAL_PISTON) + .add(AllBlocks.ROPE_PULLEY) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.GANTRY_SHAFT) + .add(AllBlocks.GANTRY_CARRIAGE) + .add(AllBlocks.CLOCKWORK_BEARING) + .add(AllBlocks.CRUSHING_WHEEL); - PonderRegistry.tags.forTag(PonderTag.KINETICS) - .add(AllBlocks.COGWHEEL.getId()) - .add(AllBlocks.LARGE_COGWHEEL.getId()) - .add(AllItems.BELT_CONNECTOR.getId()) - .add(AllBlocks.ENCASED_CHAIN_DRIVE.getId()); + PonderRegistry.tags.forTag(PonderTag.FLUIDS) + .add(AllBlocks.FLUID_PIPE) + .add(AllBlocks.MECHANICAL_PUMP) + .add(AllBlocks.FLUID_VALVE) + .add(AllBlocks.SMART_FLUID_PIPE) + .add(AllBlocks.FLUID_TANK) + .add(AllBlocks.ITEM_DRAIN) + .add(AllBlocks.HOSE_PULLEY); + + PonderRegistry.tags.forTag(PonderTag.ARM_TARGETS) + .add(AllItems.BELT_CONNECTOR) + .add(AllBlocks.CHUTE) + .add(AllBlocks.DEPOT) + .add(AllBlocks.BASIN) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.MECHANICAL_CRAFTER) + .add(AllBlocks.MILLSTONE) + .add(AllBlocks.DEPLOYER) + .add(AllBlocks.MECHANICAL_SAW) + .add(Blocks.COMPOSTER) + .add(AllBlocks.BLAZE_BURNER) + .add(Blocks.JUKEBOX) + .add(AllBlocks.CRUSHING_WHEEL); + + PonderRegistry.tags.forTag(PonderTag.LOGISTICS) + .add(AllItems.BELT_CONNECTOR) + .add(AllBlocks.CHUTE) + .add(AllBlocks.SMART_CHUTE) + .add(AllBlocks.DEPOT) + .add(AllBlocks.MECHANICAL_ARM) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.ANDESITE_TUNNEL) + .add(AllBlocks.BRASS_TUNNEL); + + PonderRegistry.tags.forTag(PonderTag.MOVEMENT_ANCHOR) + .add(AllBlocks.MECHANICAL_PISTON) + .add(AllBlocks.WINDMILL_BEARING) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.CLOCKWORK_BEARING) + .add(AllBlocks.ROPE_PULLEY) + .add(AllBlocks.GANTRY_CARRIAGE) + .add(AllBlocks.CART_ASSEMBLER); + + PonderRegistry.tags.forTag(PonderTag.CONTRAPTION_ACTOR) + .add(AllBlocks.MECHANICAL_HARVESTER) + .add(AllBlocks.MECHANICAL_PLOUGH) + .add(AllBlocks.MECHANICAL_DRILL) + .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) + .add(AllBlocks.PORTABLE_STORAGE_INTERFACE) + .add(AllBlocks.PORTABLE_FLUID_INTERFACE) + .add(AllBlocks.MECHANICAL_BEARING) + .add(AllBlocks.ANDESITE_FUNNEL) + .add(AllBlocks.BRASS_FUNNEL) + .add(AllBlocks.SEATS[0]) + .add(AllBlocks.REDSTONE_CONTACT) + .add(Blocks.BELL) + .add(Blocks.DISPENSER) + .add(Blocks.DROPPER); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java index 6e4679494..12357a5a6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java @@ -6,11 +6,11 @@ import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.IScreenRenderable; import com.simibubi.create.foundation.ponder.PonderLocalization; +import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.Items; +import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -21,18 +21,41 @@ public class PonderTag implements IScreenRenderable { public static final PonderTag - KINETICS = new PonderTag("kinetics").item(AllBlocks.COGWHEEL.get() - .asItem(), true, false) - .defaultLang("Kinetic Blocks", "Components which help generating, relaying and making use of Rotational Force"), - FLUID_TRANSFER = new PonderTag("fluid_transfer").idAsIcon(), - OPEN_INVENTORY = new PonderTag("open_inventory").item(AllBlocks.BASIN.get() - .asItem()), - ARM_ACCESS = new PonderTag("arm_access").item(AllBlocks.MECHANICAL_ARM.get() - .asItem()) + KINETIC_RELAYS = new PonderTag("kinetic_relays").item(AllBlocks.COGWHEEL.get(), true, false) + .defaultLang("Kinetic Blocks", "Components which help relaying Rotational Force elsewhere"), + + KINETIC_SOURCES = new PonderTag("kinetic_sources").item(AllBlocks.WATER_WHEEL.get(), true, false) + .defaultLang("Kinetic Sources", "Components which generate Rotational Force"), + + KINETIC_APPLIANCES = new PonderTag("kinetic_appliances").item(AllBlocks.MECHANICAL_PRESS.get(), true, false) + .defaultLang("Kinetic Appliances", "Components which make use of Rotational Force"), + + FLUIDS = new PonderTag("fluids").item(AllBlocks.FLUID_PIPE.get(), true, false) + .defaultLang("Fluid Manipulators", "Components which help relaying and making use of Fluids"), + + LOGISTICS = new PonderTag("logistics").item(Blocks.CHEST, true, false) + .defaultLang("Item Transportation", "Components which help moving items around"), + + MOVEMENT_ANCHOR = new PonderTag("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get(), true, false) + .defaultLang("Movement Anchors", + "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways"), + + CONTRAPTION_ACTOR = new PonderTag("contraption_actor").item(AllBlocks.MECHANICAL_HARVESTER.get(), true, false) + .defaultLang("Contraption Actors", + "Components which expose special behaviour when attached to a moving contraption"), + +// FLUID_TRANSFER = new PonderTag("fluid_transfer").idAsIcon(), +// +// OPEN_INVENTORY = new PonderTag("open_inventory").item(AllBlocks.BASIN.get() +// .asItem()), +// +// REDSTONE_CONTROL = new PonderTag("redstone_control").item(Items.REDSTONE, true, false), +// +// ITEM_TRANSFER = new PonderTag("item_transfer").idAsIcon(), + + ARM_TARGETS = new PonderTag("arm_targets").item(AllBlocks.MECHANICAL_ARM.get()) .defaultLang("Targets for Mechanical Arms", - "Components which can be selected as inputs or outputs to the Mechanical Arm"), - REDSTONE_CONTROL = new PonderTag("redstone_control").item(Items.REDSTONE, true, false), - ITEM_TRANSFER = new PonderTag("item_transfer").idAsIcon(); + "Components which can be selected as inputs or outputs to the Mechanical Arm"); public static class Highlight { public static final PonderTag ALL = new PonderTag("_all"); @@ -81,11 +104,11 @@ public class PonderTag implements IScreenRenderable { return this; } - public PonderTag item(Item item) { + public PonderTag item(IItemProvider item) { return this.item(item, true, true); } - public PonderTag item(Item item, boolean useAsIcon, boolean useAsMainItem) { + public PonderTag item(IItemProvider item, boolean useAsIcon, boolean useAsMainItem) { if (useAsIcon) this.itemIcon = new ItemStack(item); if (useAsMainItem) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java index 98f897a8c..9ff0a6763 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagRegistry.java @@ -1,16 +1,19 @@ package com.simibubi.create.foundation.ponder.content; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import net.minecraft.util.ResourceLocation; - import java.util.Arrays; import java.util.Collection; import java.util.Map; import java.util.Set; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.tterrag.registrate.util.entry.ItemProviderEntry; + +import net.minecraft.util.IItemProvider; +import net.minecraft.util.ResourceLocation; + public class PonderTagRegistry { private final Multimap tags; @@ -30,21 +33,19 @@ public class PonderTagRegistry { } public Set getItems(PonderTag tag) { - return tags - .entries() - .stream() - .filter(e -> e.getValue() == tag) - .map(Map.Entry::getKey) - .collect(ImmutableSet.toImmutableSet()); + return tags.entries() + .stream() + .filter(e -> e.getValue() == tag) + .map(Map.Entry::getKey) + .collect(ImmutableSet.toImmutableSet()); } public Set getChapters(PonderTag tag) { - return chapterTags - .entries() - .stream() - .filter(e -> e.getValue() == tag) - .map(Map.Entry::getKey) - .collect(ImmutableSet.toImmutableSet()); + return chapterTags.entries() + .stream() + .filter(e -> e.getValue() == tag) + .map(Map.Entry::getKey) + .collect(ImmutableSet.toImmutableSet()); } public void add(PonderTag tag, ResourceLocation item) { @@ -90,5 +91,14 @@ public class PonderTagRegistry { PonderRegistry.tags.add(tag, item); return this; } + + public TagBuilder add(IItemProvider item) { + return add(item.asItem() + .getRegistryName()); + } + + public TagBuilder add(ItemProviderEntry entry) { + return add(entry.get()); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java index 0fef32306..7d78287f2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java @@ -34,13 +34,11 @@ public class PonderTagScreen extends AbstractSimiScreen { protected final PonderTag tag; protected final List items; private final double itemXmult = 0.5; - private final double itemYmult = 0.4; protected Rectangle2d itemArea; protected final List chapters; private final double chapterXmult = 0.5; private final double chapterYmult = 0.75; protected Rectangle2d chapterArea; -// private final double mainXmult = 0.5; private final double mainYmult = 0.15; private ItemStack hoveredItem = ItemStack.EMPTY; @@ -76,7 +74,7 @@ public class PonderTagScreen extends AbstractSimiScreen { LayoutHelper layout = LayoutHelper.centeredHorizontal(items.size(), rowCount, 28, 28, 8); itemArea = layout.getArea(); int itemCenterX = (int) (width * itemXmult); - int itemCenterY = (int) (height * itemYmult); + int itemCenterY = getItemsY(); for (Item i : items) { PonderButton button = @@ -92,6 +90,23 @@ public class PonderTagScreen extends AbstractSimiScreen { layout.next(); } + if (!tag.getMainItem() + .isEmpty()) { + PonderButton button = + new PonderButton(itemCenterX - layout.getTotalWidth() / 2 - 42, itemCenterY - 10, (mouseX, mouseY) -> { + if (!PonderRegistry.all.containsKey(tag.getMainItem() + .getItem() + .getRegistryName())) + return; + centerScalingOn(mouseX, mouseY); + ScreenOpener.transitionTo(PonderUI.of(tag.getMainItem())); + }).showing(tag.getMainItem()); + + button.fade(1); +// button.flash(); + widgets.add(button); + } + // chapters chapters.clear(); chapters.addAll(PonderRegistry.tags.getChapters(tag)); @@ -137,48 +152,6 @@ public class PonderTagScreen extends AbstractSimiScreen { renderChapters(mouseX, mouseY, partialTicks); - // -// int x = (int) (width * mainXmult); -// int y = (int) (height * mainYmult); -// -// RenderSystem.pushMatrix(); -// RenderSystem.translated(x, y, 0); -// RenderSystem.translated(-150, 0, 0); -// -// if (!tag.getMainItem() -// .isEmpty()) { -// RenderSystem.translated(-25, 0, 0); -// PonderUI.renderBox(0, -10, 20, 20, false); -// RenderSystem.pushMatrix(); -// RenderSystem.translated(-2, -12, 0); -// RenderSystem.scaled(1.5, 1.5, 1); -// GuiGameElement.of(tag.getMainItem()) -// .render(); -// -// RenderSystem.popMatrix(); -// -// RenderSystem.translated(75, 0, 0); -// -// } -// -// RenderSystem.pushMatrix(); -//// RenderSystem.scaled(1.5, 1.5, 1); -// -// // render icon & box -// PonderUI.renderBox(-8, -20, 40, 40, false); -// RenderSystem.translated(0, -10, 100); -// RenderSystem.scaled(1.5, 1.5, 1); -// tag.draw(this, 0, 0); -// -// RenderSystem.popMatrix(); -// -// // tag name & description -// UIRenderHelper.streak(0, 36, 0, 39, 350, 0x101010); -// drawString(font, Lang.translate("ponder.tag." + tag.getId()), 41, -16, 0xffff_ffff); -// drawString(font, Lang.translate("ponder.tag." + tag.getId() + ".desc"), 41, -4, 0xffff_ffff); -// -// RenderSystem.popMatrix(); - RenderSystem.pushMatrix(); RenderSystem.translated(width / 2 - 120, height * mainYmult - 40, 0); @@ -196,7 +169,6 @@ public class PonderTagScreen extends AbstractSimiScreen { drawString(font, Lang.translate(PonderUI.PONDERING), x, y - 6, 0xffa3a3a3); y += 8; x += 0; - // RenderSystem.translated(0, 3 * (indexDiff), 0); RenderSystem.translated(x, y, 0); RenderSystem.translated(0, 0, 5); font.drawString(title, 0, 0, 0xeeeeee); @@ -212,7 +184,7 @@ public class PonderTagScreen extends AbstractSimiScreen { RenderSystem.pushMatrix(); int w = (int) (width * .45); x = (width - w) / 2; - y = (int) (height * itemYmult + itemArea.getHeight() + 20); + y = getItemsY() - 10 + Math.max(itemArea.getHeight(), 48); String desc = tag.getDescription(); int h = font.getWordWrappedHeight(desc, w); @@ -228,7 +200,7 @@ public class PonderTagScreen extends AbstractSimiScreen { return; int x = (int) (width * itemXmult); - int y = (int) (height * itemYmult); + int y = getItemsY(); String relatedTitle = Lang.translate(ASSOCIATED); int stringWidth = font.getStringWidth(relatedTitle); @@ -248,6 +220,10 @@ public class PonderTagScreen extends AbstractSimiScreen { } + public int getItemsY() { + return (int) (mainYmult * height + 85); + } + protected void renderChapters(int mouseX, int mouseY, float partialTicks) { if (chapters.isEmpty()) return; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java index 2de36010f..0932b7443 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/InputWindowElement.java @@ -24,7 +24,7 @@ public class InputWindowElement extends AnimatedOverlayElement { AllIcons icon; ItemStack item = ItemStack.EMPTY; private Vec3d sceneSpace; - + public InputWindowElement clone() { InputWindowElement inputWindowElement = new InputWindowElement(sceneSpace, direction); inputWindowElement.key = key; @@ -129,7 +129,7 @@ public class InputWindowElement extends AnimatedOverlayElement { if (hasItem) { GuiGameElement.of(item) - .at(keyWidth + 24, 0) + .at(keyWidth + (hasIcon ? 24 : 0), 0) .scale(1.5) .render(); RenderSystem.disableDepthTest(); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index 308b8dfc0..d1c169c3b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -96,10 +96,13 @@ public class WorldSectionElement extends AnimatedSceneElement { private void applyNewSelection(Selection selection) { this.section = selection; - centerOfRotation = this.section.getCenter(); queueRedraw(); } + public void setCenterOfRotation(Vec3d center) { + centerOfRotation = center; + } + @Override public void reset(PonderScene scene) { super.reset(scene); @@ -189,6 +192,8 @@ public class WorldSectionElement extends AnimatedSceneElement { float pt = AnimationTickHolder.getPartialTicks(); in = in.subtract(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) { + if (centerOfRotation == null) + centerOfRotation = section.getCenter(); in = in.subtract(centerOfRotation); in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x), Axis.X); in = VecHelper.rotate(in, -MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z), Axis.Z); @@ -201,13 +206,16 @@ public class WorldSectionElement extends AnimatedSceneElement { public void transformMS(MatrixStack ms, float pt) { MatrixStacker.of(ms) .translate(VecHelper.lerp(pt, prevAnimatedOffset, animatedOffset)); - if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) + if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) { + if (centerOfRotation == null) + centerOfRotation = section.getCenter(); MatrixStacker.of(ms) .translate(centerOfRotation) .rotateX(MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x)) .rotateZ(MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z)) .rotateY(MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y)) .translateBack(centerOfRotation); + } } public void tick(PonderScene scene) { 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 new file mode 100644 index 000000000..99e1e8f2b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -0,0 +1,70 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Function; + +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; + +public class AnimateTileEntityInstruction extends TickingInstruction { + + protected double deltaPerTick; + protected double totalDelta; + protected double target; + protected final BlockPos location; + + private BiConsumer setter; + private Function getter; + + public static AnimateTileEntityInstruction bearing(BlockPos location, float totalDelta, int ticks) { + return new AnimateTileEntityInstruction(location, totalDelta, ticks, + (w, f) -> castIfPresent(w, location, MechanicalBearingTileEntity.class).ifPresent(bte -> bte.setAngle(f)), + (w) -> castIfPresent(w, location, MechanicalBearingTileEntity.class).map(bte -> bte.getInterpolatedAngle(0)) + .orElse(0f)); + } + + public static AnimateTileEntityInstruction pulley(BlockPos location, float totalDelta, int ticks) { + return new AnimateTileEntityInstruction(location, totalDelta, ticks, + (w, f) -> castIfPresent(w, location, PulleyTileEntity.class).ifPresent(pulley -> pulley.offset = f), + (w) -> castIfPresent(w, location, PulleyTileEntity.class).map(pulley -> pulley.offset) + .orElse(0f)); + } + + protected AnimateTileEntityInstruction(BlockPos location, float totalDelta, int ticks, + BiConsumer setter, Function getter) { + super(false, ticks); + this.location = location; + this.setter = setter; + this.getter = getter; + this.deltaPerTick = totalDelta * (1d / ticks); + this.totalDelta = totalDelta; + this.target = totalDelta; + } + + @Override + protected final void firstTick(PonderScene scene) { + super.firstTick(scene); + target = getter.apply(scene.getWorld()) + totalDelta; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + PonderWorld world = scene.getWorld(); + setter.accept(world, (float) (remainingTicks == 0 ? target : getter.apply(world) + deltaPerTick)); + } + + private static Optional castIfPresent(PonderWorld world, BlockPos pos, Class teType) { + TileEntity tileEntity = world.getTileEntity(pos); + if (teType.isInstance(tileEntity)) + return Optional.of(teType.cast(tileEntity)); + return Optional.empty(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java index 97c472072..32ca1df1d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/ui/LayoutHelper.java @@ -21,12 +21,7 @@ public interface LayoutHelper { default Rectangle2d getArea() { int lWidth = getTotalWidth(); int lHeight = getTotalHeight(); - return new Rectangle2d( - -lWidth/2, - -lHeight/2, - lWidth, - lHeight - ); + return new Rectangle2d(-lWidth / 2, -lHeight / 2, lWidth, lHeight); } class CenteredHorizontalLayoutHelper implements LayoutHelper { @@ -77,7 +72,7 @@ public interface LayoutHelper { public void next() { currentColumn++; if (currentColumn >= rowCounts[currentRow]) { - //nextRow + // nextRow if (++currentRow >= rows) { x = 0; y = 0; @@ -96,10 +91,8 @@ public interface LayoutHelper { private void init() { prepareX(); prepareY(); - } - private void prepareX() { int rowWidth = rowCounts[currentRow] * width + (rowCounts[currentRow] - 1) * spacing; x = -(rowWidth / 2); @@ -120,7 +113,6 @@ public interface LayoutHelper { return rows * height + (rows > 1 ? ((rows - 1) * spacing) : 0); } - } } From aa0a58b0dadb4359bd395e502aa242a27058b02a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 6 Mar 2021 04:06:49 +0100 Subject: [PATCH 19/23] Tooltips except it takes one hour per block - Added and assigned more ponder tags - Ponder Scenes for cog, large cog, gearbox, clutch, gearshift, and casings - Fixed TE model data not queried on schematics and ponder scenes --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 105 ++++- .../assets/create/lang/unfinished/de_de.json | 107 ++++- .../assets/create/lang/unfinished/es_es.json | 107 ++++- .../assets/create/lang/unfinished/es_mx.json | 107 ++++- .../assets/create/lang/unfinished/fr_fr.json | 107 ++++- .../assets/create/lang/unfinished/it_it.json | 107 ++++- .../assets/create/lang/unfinished/ja_jp.json | 107 ++++- .../assets/create/lang/unfinished/ko_kr.json | 107 ++++- .../assets/create/lang/unfinished/nl_nl.json | 107 ++++- .../assets/create/lang/unfinished/pt_br.json | 107 ++++- .../assets/create/lang/unfinished/ru_ru.json | 107 ++++- .../assets/create/lang/unfinished/zh_cn.json | 107 ++++- .../assets/create/lang/unfinished/zh_tw.json | 107 ++++- .../data/create/advancements/aesthetics.json | 4 +- .../particle/RotationIndicatorParticle.java | 13 +- .../relays/elementary/ShaftBlock.java | 4 +- .../relays/gauge/SpeedGaugeTileEntity.java | 1 + .../schematics/client/SchematicRenderer.java | 7 +- .../foundation/ponder/SceneBuilder.java | 10 +- .../foundation/ponder/content/BeltScenes.java | 104 +++++ .../ponder/content/DebugScenes.java | 15 +- .../ponder/content/KineticsScenes.java | 369 +++++++++++++++++- .../ponder/content/PonderIndex.java | 75 +++- .../foundation/ponder/content/PonderTag.java | 10 + .../foundation/ponder/content/SharedText.java | 8 +- .../ponder/elements/WorldSectionElement.java | 7 +- src/main/resources/ponder/belt/encasing.nbt | Bin 0 -> 1021 bytes src/main/resources/ponder/clutch.nbt | Bin 0 -> 681 bytes src/main/resources/ponder/cog/large.nbt | Bin 0 -> 577 bytes src/main/resources/ponder/cog/small.nbt | Bin 0 -> 630 bytes src/main/resources/ponder/cog/speedup.nbt | Bin 0 -> 655 bytes src/main/resources/ponder/gearbox.nbt | Bin 0 -> 747 bytes src/main/resources/ponder/gearshift.nbt | Bin 0 -> 610 bytes src/main/resources/ponder/shaft/encasing.nbt | Bin 497 -> 535 bytes 35 files changed, 1739 insertions(+), 305 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java create mode 100644 src/main/resources/ponder/belt/encasing.nbt create mode 100644 src/main/resources/ponder/clutch.nbt create mode 100644 src/main/resources/ponder/cog/large.nbt create mode 100644 src/main/resources/ponder/cog/small.nbt create mode 100644 src/main/resources/ponder/cog/speedup.nbt create mode 100644 src/main/resources/ponder/gearbox.nbt create mode 100644 src/main/resources/ponder/gearshift.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 17f3b565d..7fa2e3345 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2384c6457ecf24c7b38358179b8fa6eb93b9627a assets/create/lang/en_ud.json -3df303c4115c5ebac291b8c62f844812706fc1a2 assets/create/lang/en_us.json -7e3384a3417e42c6af669a1de71520f91917c173 assets/create/lang/unfinished/de_de.json -1b96fec34e10b77750ff9df5ab8ba7d70a781f8a assets/create/lang/unfinished/es_es.json -500288690ba8d9541f49f0e97e6e5d0fe03c5878 assets/create/lang/unfinished/es_mx.json -71f5958650b1300534cb03a602449620d8cede48 assets/create/lang/unfinished/fr_fr.json -305e0f563cf8548ab671a0468dbf98b5b429b7be assets/create/lang/unfinished/it_it.json -0476653ed29767f05370c56415224f6adf711cea assets/create/lang/unfinished/ja_jp.json -284cc716b6ecb3be8b9686cea842dc1f80377104 assets/create/lang/unfinished/ko_kr.json -2113c093bddcda9161bdb7993545115097267c96 assets/create/lang/unfinished/nl_nl.json -d4418c9eab8786dc3167661896910093f1ec36ff assets/create/lang/unfinished/pt_br.json -7d8050786296c33dc5b05f0a8bae7fe1e5f03d46 assets/create/lang/unfinished/ru_ru.json -87aae73838184ee67353f57e1468c3d28f834172 assets/create/lang/unfinished/zh_cn.json -755792dde83c565808b5ade4c48db1cbb4792d49 assets/create/lang/unfinished/zh_tw.json +6fecfcf70c69f6bcd2b022ccb937d08f6d30e7a4 assets/create/lang/en_us.json +0aa63a461f5c0d1e1727e6541d4afcd88ced88d5 assets/create/lang/unfinished/de_de.json +0a9a823d56111c8dd65b4399b93c09debbde0663 assets/create/lang/unfinished/es_es.json +d4e527b487903069ac9c6757a94e26d25b7e8291 assets/create/lang/unfinished/es_mx.json +d5c2910d54ebfd1bac8eb3ea3c96f1667c53c7d1 assets/create/lang/unfinished/fr_fr.json +86d8897c3cf17559ce9de35ae76f872f9ba3e377 assets/create/lang/unfinished/it_it.json +341be60e0484e9969ed44353f182e6f7a9c50a69 assets/create/lang/unfinished/ja_jp.json +f16072a1a02e4a1d360cd9997cf7684afe6d9212 assets/create/lang/unfinished/ko_kr.json +055e490a9fc8c56fc6f4fad1c10e64fafb894ee8 assets/create/lang/unfinished/nl_nl.json +395131eab03df87203d2bd4e25bb5f3a212c2edd assets/create/lang/unfinished/pt_br.json +9661c315bba7bef0c9f93594fa997728b1ae1434 assets/create/lang/unfinished/ru_ru.json +e0f3db89425ec11186c95ad2829327bd48b90c51 assets/create/lang/unfinished/zh_cn.json +80104284eee5640e9e5027311010b9cf659bb93d 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 @@ -1579,7 +1579,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 16a3c01d3..81d6671f5 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1809,8 +1809,11 @@ "create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "Associated Entries", "create.ponder.shared.movement_anchors": "With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "32 RPM", "create.ponder.shared.sneak_and": "Sneak +", + "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16": "16 RPM", "create.ponder.tag.kinetic_sources": "Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "Contraption Actors", @@ -1821,13 +1824,37 @@ "create.ponder.tag.logistics.description": "Components which help moving items around", "create.ponder.tag.movement_anchor": "Movement Anchors", "create.ponder.tag.movement_anchor.description": "Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "Aesthetics", + "create.ponder.tag.decoration.description": "Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "Components which make use of Rotational Force", + "create.ponder.tag.redstone": "Logic Components", + "create.ponder.tag.redstone.description": "Components which help with redstone engineering", + "create.ponder.tag.creative": "Creative Mode", + "create.ponder.tag.creative.description": "Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "Brass Funnels can extract up to a full stack.", @@ -1858,6 +1885,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "Gantry setups can move attached Blocks.", @@ -1877,25 +1956,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "Funnels are ideal for transferring items from and to inventories.", @@ -1926,6 +1986,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "Gantry setups can move attached Blocks.", 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 89482bf57..bd855a695 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: 1087", + "_": "Missing Localizations: 1140", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 8b7db4b71..8e85400fd 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: 130", + "_": "Missing Localizations: 183", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 c27b19cb8..edd6c0978 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: 1017", + "_": "Missing Localizations: 1070", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 406cf0985..7c49e20a9 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: 799", + "_": "Missing Localizations: 852", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 2653a490a..61e5c0b7a 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: 135", + "_": "Missing Localizations: 188", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 1571d0fc4..b46be01fa 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: 142", + "_": "Missing Localizations: 195", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 1ab559b35..3649903a1 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: 188", + "_": "Missing Localizations: 241", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 c6280279d..337a28d1f 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: 1286", + "_": "Missing Localizations: 1339", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 35409db99..78b3f600c 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: 1352", + "_": "Missing Localizations: 1405", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 a34ba2f18..dea4d4577 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: 138", + "_": "Missing Localizations: 191", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 b8dbe1f27..5864dce4a 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: 136", + "_": "Missing Localizations: 189", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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 d18975b6b..6e0d3a7ce 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: 141", + "_": "Missing Localizations: 194", "_": "->------------------------] Game Elements [------------------------<-", @@ -1810,8 +1810,11 @@ "create.ponder.identify_mode": "UNLOCALIZED: Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "UNLOCALIZED: Associated Entries", "create.ponder.shared.movement_anchors": "UNLOCALIZED: With the help of Chassis or Super Glue, larger structures can be moved.", + "create.ponder.shared.rpm32": "UNLOCALIZED: 32 RPM", "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", + "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", "create.ponder.tag.contraption_actor": "UNLOCALIZED: Contraption Actors", @@ -1822,13 +1825,37 @@ "create.ponder.tag.logistics.description": "UNLOCALIZED: Components which help moving items around", "create.ponder.tag.movement_anchor": "UNLOCALIZED: Movement Anchors", "create.ponder.tag.movement_anchor.description": "UNLOCALIZED: Components which allow the creation of moving contraptions, animating an attached structure in a variety of ways", + "create.ponder.tag.decoration": "UNLOCALIZED: Aesthetics", + "create.ponder.tag.decoration.description": "UNLOCALIZED: Components used mostly for decorative purposes", "create.ponder.tag.kinetic_appliances": "UNLOCALIZED: Kinetic Appliances", "create.ponder.tag.kinetic_appliances.description": "UNLOCALIZED: Components which make use of Rotational Force", + "create.ponder.tag.redstone": "UNLOCALIZED: Logic Components", + "create.ponder.tag.redstone.description": "UNLOCALIZED: Components which help with redstone engineering", + "create.ponder.tag.creative": "UNLOCALIZED: Creative Mode", + "create.ponder.tag.creative.description": "UNLOCALIZED: Components not usually available for Survival Mode", "create.ponder.tag.kinetic_relays": "UNLOCALIZED: Kinetic Blocks", "create.ponder.tag.kinetic_relays.description": "UNLOCALIZED: Components which help relaying Rotational Force elsewhere", "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", @@ -1859,6 +1886,58 @@ "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + + "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + + "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + + "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + + "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + + "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + + "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + + "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + + "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -1878,25 +1957,6 @@ "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Andesite or Brass Casing can be used to encase them.", - - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", @@ -1927,6 +1987,13 @@ "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + + "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", 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/particle/RotationIndicatorParticle.java b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java index d17aa39b1..f9b754484 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java +++ b/src/main/java/com/simibubi/create/content/contraptions/particle/RotationIndicatorParticle.java @@ -29,7 +29,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { protected boolean isVisible; private RotationIndicatorParticle(World world, double x, double y, double z, int color, float radius1, - float radius2, float speed, Axis axis, int lifeSpan, boolean isVisible, IAnimatedSprite sprite) { + float radius2, float speed, Axis axis, int lifeSpan, boolean isVisible, IAnimatedSprite sprite) { super(world, x, y, z, sprite, 0); this.motionX = 0; this.motionY = 0; @@ -58,7 +58,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { super.tick(); radius += (radius2 - radius) * .1f; } - + @Override public void buildGeometry(IVertexBuilder buffer, ActiveRenderInfo renderInfo, float partialTicks) { if (!isVisible) @@ -69,9 +69,10 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { public void move(double x, double y, double z) { float time = AnimationTickHolder.getTicks(); float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / maxAge)); - if (speed < 0) + if (speed < 0 && axis.isVertical()) angle += 180; - Vec3d position = VecHelper.rotate(this.offset.scale(radius), angle, axis).add(origin); + Vec3d position = VecHelper.rotate(this.offset.scale(radius), angle, axis) + .add(origin); posX = position.x; posY = position.y; posZ = position.z; @@ -85,12 +86,12 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { } public Particle makeParticle(RotationIndicatorParticleData data, World worldIn, double x, double y, double z, - double xSpeed, double ySpeed, double zSpeed) { + double xSpeed, double ySpeed, double zSpeed) { Minecraft mc = Minecraft.getInstance(); ClientPlayerEntity player = mc.player; boolean visible = worldIn != mc.world || player != null && GogglesItem.canSeeParticles(player); return new RotationIndicatorParticle(worldIn, x, y, z, data.color, data.radius1, data.radius2, data.speed, - data.getAxis(), data.lifeSpan, visible, this.spriteSet); + data.getAxis(), data.lifeSpan, visible, this.spriteSet); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java index 3b0bb2e8d..16dfa60c3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/ShaftBlock.java @@ -45,12 +45,12 @@ public class ShaftBlock extends AbstractShaftBlock { @Override public float getParticleTargetRadius() { - return .25f; + return .35f; } @Override public float getParticleInitialRadius() { - return 0f; + return .125f; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java index 9d64fbe32..e3cc2c1b5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/SpeedGaugeTileEntity.java @@ -35,6 +35,7 @@ public class SpeedGaugeTileEntity extends GaugeTileEntity { } public static float getDialTarget(float speed) { + speed = Math.abs(speed); float medium = AllConfigs.SERVER.kinetics.mediumSpeed.get() .floatValue(); float fast = AllConfigs.SERVER.kinetics.fastSpeed.get() diff --git a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java index c7c346182..e5ff4732c 100644 --- a/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/client/SchematicRenderer.java @@ -23,6 +23,7 @@ import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.model.data.EmptyModelData; @@ -110,8 +111,12 @@ public class SchematicRenderer { BufferBuilder bufferBuilder = buffers.get(blockRenderLayer); if (startedBufferBuilders.add(blockRenderLayer)) bufferBuilder.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK); + + TileEntity tileEntity = blockAccess.getTileEntity(localPos); + if (blockRendererDispatcher.renderModel(state, pos, blockAccess, ms, bufferBuilder, true, - minecraft.world.rand, EmptyModelData.INSTANCE)) { + minecraft.world.rand, + tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE)) { usedBlockRenderLayers.add(blockRenderLayer); } blockstates.add(state); 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 a27eb31a8..f9d6674a3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -46,6 +46,7 @@ import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; @@ -360,6 +361,7 @@ public class SceneBuilder { .erase(selection); scene.linkElement(worldSectionElement, elementLink); scene.addElement(worldSectionElement); + worldSectionElement.queueRedraw(); worldSectionElement.resetAnimatedTransform(); worldSectionElement.setVisible(true); worldSectionElement.forceApplyFade(1); @@ -395,8 +397,12 @@ public class SceneBuilder { addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); } - public void setBlock(BlockPos pos, BlockState state) { - setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, true); + public void destroyBlock(BlockPos pos) { + setBlock(pos, Blocks.AIR.getDefaultState(), true); + } + + public void setBlock(BlockPos pos, BlockState state, boolean spawnParticles) { + setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, spawnParticles); } public void replaceBlocks(Selection selection, BlockState state, boolean spawnParticles) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java new file mode 100644 index 000000000..3df881334 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java @@ -0,0 +1,104 @@ +package com.simibubi.create.foundation.ponder.content; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +public class BeltScenes { + + public static void beltsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Encasing Belts"); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + scene.idle(5); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.idle(20); + + ItemStack brassCasingItem = AllBlocks.BRASS_CASING.asStack(); + ItemStack andesiteCasingItem = AllBlocks.ANDESITE_CASING.asStack(); + + BlockPos beltPos = util.grid.at(3, 1, 0); + BlockPos beltPos2 = util.grid.at(0, 2, 3); + BlockPos beltPos3 = util.grid.at(1, 4, 4); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos), Pointing.DOWN).rightClick() + .withItem(brassCasingItem), 20); + scene.idle(7); + scene.world.modifyBlock(beltPos, s -> s.with(BeltBlock.CASING, true), true); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(beltPos2), Pointing.DOWN).rightClick() + .withItem(andesiteCasingItem), 20); + scene.idle(7); + scene.world.modifyBlock(beltPos2, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyTileNBT(util.select.position(beltPos2), BeltTileEntity.class, nbt -> { + NBTHelper.writeEnum(nbt, "Casing", BeltTileEntity.CasingType.ANDESITE); + }); + scene.idle(20); + + scene.overlay.showControls( + new InputWindowElement(util.vector.blockSurface(beltPos3, Direction.EAST), Pointing.RIGHT).rightClick() + .withItem(brassCasingItem), + 20); + scene.idle(7); + scene.world.modifyBlock(beltPos3, s -> s.with(BeltBlock.CASING, true), true); + scene.idle(20); + + scene.overlay.showText(80) + .text("Brass or Andesite Casing can be used to decorate Mechanical Belts") + .pointAt(util.vector.centerOf(beltPos2)); + + scene.idle(40); + + List brassBelts = new ArrayList<>(); + List andesiteBelts = new ArrayList<>(); + + for (int z = 1; z <= 3; z++) + brassBelts.add(beltPos.south(z)); + for (int x = 1; x <= 3; x++) + brassBelts.add(beltPos3.east(x) + .down(x)); + for (int x = 1; x <= 3; x++) + andesiteBelts.add(beltPos2.east(x)); + + Collections.shuffle(andesiteBelts); + Collections.shuffle(brassBelts); + + for (BlockPos pos : andesiteBelts) { + scene.idle(4); + scene.world.modifyBlock(pos, s -> s.with(BeltBlock.CASING, true), true); + scene.world.modifyTileNBT(util.select.position(pos), BeltTileEntity.class, nbt -> { + NBTHelper.writeEnum(nbt, "Casing", BeltTileEntity.CasingType.ANDESITE); + }); + } + for (BlockPos pos : brassBelts) { + scene.idle(4); + scene.world.modifyBlock(pos, s -> s.with(BeltBlock.CASING, true), true); + } + scene.idle(30); + + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(beltPos.south()), Pointing.DOWN).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.world.modifyBlock(beltPos.south(), s -> s.with(BeltBlock.CASING, false), true); + scene.overlay.showText(80) + .text("A wrench can be used to remove it again") + .placeNearTarget() + .pointAt(util.vector.blockSurface(beltPos.south(), Direction.WEST)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index e0a254a4a..9b77055b5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -4,14 +4,19 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; import com.simibubi.create.content.contraptions.particle.RotationIndicatorParticleData; -import com.simibubi.create.foundation.ponder.*; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.PonderStoryBoardEntry.PonderStoryBoard; +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.BeltItemElement; 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.ItemEntry; + import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; @@ -295,22 +300,22 @@ public class DebugScenes { BlockPos poi1 = util.grid.at(4, 1, 0); BlockPos poi2 = util.grid.at(0, 1, 4); - scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.getDefaultState()); + scene.world.setBlock(poi1, Blocks.GOLD_BLOCK.getDefaultState(), true); scene.special.movePointOfInterest(poi1); scene.idle(20); - scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState()); + scene.world.setBlock(poi2, Blocks.GOLD_BLOCK.getDefaultState(), true); scene.special.movePointOfInterest(poi2); scene.overlay.showText(20) .text("Point of Interest") .pointAt(util.vector.centerOf(poi2)); scene.idle(20); - scene.world.setBlock(poi1, Blocks.AIR.getDefaultState()); + scene.world.destroyBlock(poi1); scene.special.movePointOfInterest(poi1); scene.idle(20); - scene.world.setBlock(poi2, Blocks.AIR.getDefaultState()); + scene.world.destroyBlock(poi2); scene.special.movePointOfInterest(poi2); } 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 97351eb01..957d5cd4c 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,14 +1,19 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllBlocks; +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.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.utility.Pointing; import com.tterrag.registrate.util.entry.BlockEntry; +import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; @@ -60,9 +65,10 @@ public class KineticsScenes { public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { scene.title("Encasing Shafts"); + scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); - Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(4, 0, 2)); + Selection shaft = util.select.cuboid(new BlockPos(0, 1, 2), new Vec3i(5, 0, 2)); Selection andesite = util.select.position(3, 1, 2); Selection brass = util.select.position(1, 1, 2); @@ -77,7 +83,7 @@ public class KineticsScenes { scene.idle(7); scene.world.setBlocks(andesite, andesiteEncased.getDefaultState() .with(EncasedShaftBlock.AXIS, Axis.X), true); - scene.world.setKineticSpeed(shaft, -112); + scene.world.setKineticSpeed(shaft, 32); scene.idle(10); BlockEntry brassEncased = AllBlocks.BRASS_ENCASED_SHAFT; @@ -88,12 +94,367 @@ public class KineticsScenes { scene.idle(7); scene.world.setBlocks(brass, brassEncased.getDefaultState() .with(EncasedShaftBlock.AXIS, Axis.X), true); - scene.world.setKineticSpeed(shaft, -112); + scene.world.setKineticSpeed(shaft, 32); scene.idle(10); scene.overlay.showText(1000) - .text("Andesite or Brass Casing can be used to encase them.") + .text("Brass or Andesite Casing can be used to decorate Shafts") .pointAt(util.vector.topOf(1, 1, 2)); } + public static void cogAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Relaying rotational force using Cogwheels"); + scene.configureBasePlate(0, 0, 5); + BlockPos gauge = util.grid.at(4, 1, 1); + Selection gaugeSelect = util.select.position(gauge); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.showSection(gaugeSelect, Direction.UP); + scene.world.setKineticSpeed(gaugeSelect, 0); + scene.idle(5); + scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 1, 5), Direction.DOWN); + scene.idle(10); + + for (int i = 1; i <= 4; i++) { + scene.idle(5); + if (i == 2) + scene.world.showSection(util.select.position(0, 1, 2), Direction.DOWN); + scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + } + + scene.world.setKineticSpeed(gaugeSelect, 64); + scene.effects.indicateSuccess(gauge); + scene.idle(10); + scene.overlay.showText(60) + .text("Cogwheels will relay rotation to other adjacent cogwheels") + .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.EAST)); + + scene.idle(60); + scene.world.showSection(util.select.fromTo(1, 1, 1, 2, 1, 1), Direction.SOUTH); + scene.idle(10); + scene.effects.rotationDirectionIndicator(util.grid.at(1, 1, 1)); + scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 1)); + scene.idle(20); + scene.overlay.showText(100) + .text("Neighbouring shafts connected like this will rotate in opposite directions") + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.NORTH)); + + } + + public static void largeCogAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Relaying rotational force using Large Cogwheels"); + scene.configureBasePlate(1, 1, 5); + scene.world.setBlock(util.grid.at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState() + .with(CogWheelBlock.AXIS, Axis.X), false); + + scene.showBasePlate(); + scene.idle(5); + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.idle(5); + scene.world.showSection(util.select.position(3, 2, 4), Direction.NORTH); + + for (int i = 3; i >= 1; i--) { + scene.idle(5); + if (i == 3) + scene.world.showSection(util.select.position(3, 2, 5), Direction.DOWN); + scene.world.showSection(util.select.position(3, 2, i), Direction.DOWN); + } + + scene.overlay.showText(70) + .text("Large cogwheels can connect to each other at right angles") + .placeNearTarget() + .pointAt(util.vector.centerOf(3, 1, 4)); + scene.idle(70); + scene.world.hideSection(util.select.fromTo(3, 2, 1, 3, 2, 5), Direction.SOUTH); + + scene.idle(15); + scene.world.modifyBlock(util.grid.at(3, 2, 3), s -> s.with(ShaftBlock.AXIS, Axis.X), false); + scene.world.setKineticSpeed(util.select.fromTo(1, 2, 3, 5, 2, 3), 16); + scene.world.showSection(util.select.position(4, 2, 3), Direction.WEST); + + for (int i = 3; i >= 1; i--) { + scene.idle(5); + if (i == 3) + scene.world.showSection(util.select.position(5, 2, 3), Direction.DOWN); + scene.world.showSection(util.select.position(i, 2, 3), Direction.DOWN); + } + + scene.idle(5); + scene.overlay.showText(90) + .text("It will help relaying conveyed speed to other axes of rotation") + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.WEST)); + scene.effects.rotationSpeedIndicator(util.grid.at(3, 1, 3)); + scene.effects.rotationSpeedIndicator(util.grid.at(4, 2, 3)); + + } + + public static void cogsSpeedUp(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Gearshifting with Cogs"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN); + scene.idle(10); + + BlockPos lowerCog = util.grid.at(3, 1, 2); + BlockPos upperCog = util.grid.at(3, 2, 3); + BlockState largeCogState = AllBlocks.LARGE_COGWHEEL.getDefaultState() + .with(CogWheelBlock.AXIS, Axis.X); + BlockState smallCogState = AllBlocks.COGWHEEL.getDefaultState() + .with(CogWheelBlock.AXIS, Axis.X); + + scene.world.setBlock(lowerCog, largeCogState, false); + scene.world.setBlock(upperCog, smallCogState, false); + BlockPos upperShaftEnd = upperCog.west(3); + BlockPos lowerShaftEnd = lowerCog.west(3); + + scene.world.setKineticSpeed(util.select.fromTo(upperCog, upperShaftEnd), -64); + scene.world.showSection(util.select.fromTo(lowerCog, upperCog), Direction.EAST); + scene.overlay.showText(60) + .text("Large and Small cogs can be connected diagonally") + .placeNearTarget() + .pointAt(util.vector.blockSurface(upperCog, Direction.WEST)); + scene.idle(80); + + Selection gaugesSelect = util.select.fromTo(0, 1, 2, 2, 2, 3); + scene.world.showSection(gaugesSelect, Direction.DOWN); + scene.overlay.showText(60) + .text("Shifting from large to small cogs, the conveyed speed will be doubled") + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)); + scene.idle(10); + scene.effects.rotationSpeedIndicator(upperCog); + scene.idle(60); + + scene.overlay.showText(30) + .sharedText("rpm32") + .colored(PonderPalette.FAST) + .placeNearTarget() + .pointAt(util.vector.blockSurface(upperShaftEnd, Direction.WEST)); + scene.idle(5); + scene.overlay.showText(30) + .sharedText("rpm16") + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .pointAt(util.vector.blockSurface(lowerShaftEnd, Direction.WEST)); + scene.idle(45); + + scene.world.setKineticSpeed(util.select.fromTo(lowerCog, upperShaftEnd), 0); + ElementLink cogs = + scene.world.makeSectionIndependent(util.select.fromTo(lowerCog, upperCog)); + scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 5); + scene.idle(5); + scene.world.rotateSection(cogs, 180, 0, 0, 10); + scene.idle(10); + scene.world.setBlock(lowerCog, smallCogState, false); + scene.world.setBlock(upperCog, largeCogState, false); + scene.world.rotateSection(cogs, 180, 0, 0, 0); + scene.world.moveSection(cogs, util.vector.of(0, -1, 0), 5); + scene.idle(5); + + scene.world.setKineticSpeed(util.select.fromTo(lowerCog, lowerShaftEnd), 32); + scene.world.setKineticSpeed(util.select.fromTo(upperCog, upperShaftEnd), -16); + + scene.overlay.showText(80) + .text("Shifting the opposite way, the conveyed speed will be halved") + .colored(PonderPalette.RED) + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 3), Direction.NORTH)); + scene.idle(10); + scene.effects.rotationSpeedIndicator(upperCog); + scene.idle(80); + + scene.overlay.showText(60) + .sharedText("rpm8") + .colored(PonderPalette.SLOW) + .placeNearTarget() + .pointAt(util.vector.blockSurface(upperShaftEnd, Direction.WEST)); + scene.idle(5); + scene.overlay.showText(60) + .sharedText("rpm16") + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .pointAt(util.vector.blockSurface(lowerShaftEnd, Direction.WEST)); + scene.idle(40); + } + + public static void gearbox(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Relaying rotational force using Gearboxes"); + scene.configureBasePlate(1, 1, 5); + 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); + + BlockPos largeCogBack = util.grid.at(3, 2, 4); + BlockPos largeCogLeft = util.grid.at(4, 2, 3); + BlockPos largeCogFront = util.grid.at(3, 2, 2); + BlockPos largeCogRight = util.grid.at(2, 2, 3); + + scene.world.showSection(util.select.position(largeCogBack), Direction.SOUTH); + scene.idle(5); + scene.world.showSection(util.select.position(largeCogLeft), Direction.WEST); + scene.world.showSection(util.select.position(largeCogLeft.east()), Direction.WEST); + scene.world.showSection(util.select.position(largeCogRight), Direction.EAST); + scene.world.showSection(util.select.position(largeCogRight.west()), Direction.EAST); + scene.idle(5); + scene.world.showSection(util.select.position(largeCogFront), Direction.SOUTH); + scene.world.showSection(util.select.position(largeCogFront.north()), Direction.SOUTH); + + scene.idle(10); + + scene.overlay.showText(80) + .colored(PonderPalette.RED) + .pointAt(util.vector.blockSurface(largeCogRight.west(), Direction.WEST)) + .placeNearTarget() + .text("Jumping between axes of rotation can get bulky quickly"); + scene.idle(80); + Selection gearbox = util.select.position(3, 2, 3); + scene.world.hideSection(util.select.fromTo(4, 2, 2, 2, 2, 4) + .substract(gearbox), Direction.UP); + scene.idle(20); + + BlockState defaultState = AllBlocks.SHAFT.getDefaultState(); + BlockState cogState = AllBlocks.COGWHEEL.getDefaultState(); + scene.world.setBlock(largeCogBack, defaultState.with(CogWheelBlock.AXIS, Axis.Z), false); + scene.world.setBlock(largeCogFront, defaultState.with(CogWheelBlock.AXIS, Axis.Z), false); + scene.world.setBlock(largeCogRight, defaultState.with(CogWheelBlock.AXIS, Axis.X), false); + scene.world.setBlock(largeCogLeft, defaultState.with(CogWheelBlock.AXIS, Axis.X), false); + scene.world.showSection(util.select.fromTo(4, 2, 2, 2, 2, 4), Direction.DOWN); + + scene.idle(20); + scene.overlay.showText(80) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.topOf(3, 2, 3)) + .placeNearTarget() + .text("A gearbox is the more compact equivalent of this setup"); + + scene.idle(90); + scene.world.setBlock(largeCogFront.north(), cogState.with(CogWheelBlock.AXIS, Axis.Z), true); + scene.world.setBlock(largeCogRight.west(), cogState.with(CogWheelBlock.AXIS, Axis.X), true); + scene.idle(10); + scene.effects.rotationDirectionIndicator(largeCogFront.north()); + scene.effects.rotationDirectionIndicator(largeCogRight.west()); + scene.idle(15); + scene.overlay.showText(60) + .pointAt(util.vector.of(3, 2.5, 3)) + .placeNearTarget() + .text("Shafts around corners rotate in mirrored directions"); + + scene.idle(70); + + scene.world.hideSection(util.select.fromTo(1, 2, 3, 2, 2, 3), Direction.WEST); + scene.world.hideSection(util.select.fromTo(4, 2, 3, 5, 2, 3), Direction.EAST); + scene.world.setBlock(largeCogBack.south(), cogState.with(CogWheelBlock.AXIS, Axis.Z), true); + scene.idle(10); + + scene.effects.rotationDirectionIndicator(largeCogFront.north()); + scene.effects.rotationDirectionIndicator(largeCogBack.south()); + scene.idle(15); + scene.overlay.showText(60) + .pointAt(util.vector.centerOf(3, 2, 5)) + .placeNearTarget() + .text("Straight connections will be reversed"); + + } + + public static void clutch(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Controlling rotational force using a Clutch"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + BlockPos leverPos = util.grid.at(3, 1, 0); + scene.world.showSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); + + BlockPos gaugePos = util.grid.at(0, 1, 2); + Selection gauge = util.select.position(gaugePos); + scene.world.showSection(gauge, Direction.UP); + scene.world.setKineticSpeed(gauge, 0); + + scene.idle(5); + scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN); + scene.idle(10); + + for (int i = 4; i >= 1; i--) { + scene.idle(5); + scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + } + + BlockPos clutch = util.grid.at(3, 1, 2); + + scene.world.setKineticSpeed(gauge, 32); + scene.effects.indicateSuccess(gaugePos); + scene.idle(10); + scene.overlay.showText(50) + .text("Clutches will relay rotation in a straight line") + .placeNearTarget() + .pointAt(util.vector.topOf(clutch)); + + scene.idle(60); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + scene.effects.indicateRedstone(leverPos); + scene.world.setKineticSpeed(util.select.fromTo(0, 1, 2, 2, 1, 2), 0); + scene.idle(10); + + scene.idle(10); + scene.overlay.showText(50) + .colored(PonderPalette.RED) + .text("When powered by Redstone, it breaks the connection") + .placeNearTarget() + .pointAt(util.vector.topOf(clutch)); + + scene.idle(70); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + scene.effects.indicateRedstone(leverPos); + scene.world.setKineticSpeed(util.select.fromTo(0, 1, 2, 2, 1, 2), 32); + scene.effects.indicateSuccess(gaugePos); + } + + public static void gearshift(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("Controlling rotational force using a Gearshift"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + BlockPos leverPos = util.grid.at(3, 1, 0); + scene.world.showSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); + + scene.idle(5); + scene.world.showSection(util.select.position(5, 1, 2), Direction.DOWN); + scene.idle(10); + + for (int i = 4; i >= 1; i--) { + scene.idle(5); + scene.world.showSection(util.select.position(i, 1, 2), Direction.DOWN); + } + + BlockPos gearshift = util.grid.at(3, 1, 2); + scene.idle(10); + scene.overlay.showText(50) + .placeNearTarget() + .text("Gearshifts will relay rotation in a straight line") + .pointAt(util.vector.topOf(gearshift)); + + scene.idle(60); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 2, 2, 2), f -> -f); + scene.effects.rotationDirectionIndicator(gearshift.east(2)); + scene.effects.rotationDirectionIndicator(gearshift.west(2)); + scene.idle(30); + + scene.overlay.showText(50) + .colored(PonderPalette.RED) + .placeNearTarget() + .text("When powered by Redstone, it reverses the transmission") + .pointAt(util.vector.topOf(gearshift)); + + for (int i = 0; i < 3; i++) { + scene.idle(60); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(util.select.fromTo(0, 1, 2, 2, 2, 2), f -> -f); + scene.effects.rotationDirectionIndicator(gearshift.east(2)); + scene.effects.rotationDirectionIndicator(gearshift.west(2)); + } + } + } 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 5e9e35588..9999385fa 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 @@ -16,9 +16,26 @@ public class PonderIndex { // (!) Modifications inside storyboard methods only require re-opening the ui PonderRegistry.forComponents(AllBlocks.SHAFT) - .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay) + .addStoryBoard("shaft/relay", KineticsScenes::shaftAsRelay); + PonderRegistry.forComponents(AllBlocks.SHAFT, AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased); + PonderRegistry.forComponents(AllBlocks.COGWHEEL) + .addStoryBoard("cog/small", KineticsScenes::cogAsRelay) + .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp); + PonderRegistry.forComponents(AllBlocks.LARGE_COGWHEEL) + .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) + .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay); + + PonderRegistry.forComponents(AllBlocks.ANDESITE_CASING, AllBlocks.BRASS_CASING) + .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased) + .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); + + PonderRegistry.forComponents(AllBlocks.GEARBOX, AllItems.VERTICAL_GEARBOX) + .addStoryBoard("gearbox", KineticsScenes::gearbox); + PonderRegistry.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch); + PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift); + // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) @@ -55,7 +72,13 @@ public class PonderIndex { .add(AllBlocks.COGWHEEL) .add(AllBlocks.LARGE_COGWHEEL) .add(AllItems.BELT_CONNECTOR) - .add(AllBlocks.ENCASED_CHAIN_DRIVE); + .add(AllBlocks.GEARBOX) + .add(AllBlocks.CLUTCH) + .add(AllBlocks.GEARSHIFT) + .add(AllBlocks.ENCASED_CHAIN_DRIVE) + .add(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) + .add(AllBlocks.SEQUENCED_GEARSHIFT) + .add(AllBlocks.ROTATION_SPEED_CONTROLLER); PonderRegistry.tags.forTag(PonderTag.KINETIC_SOURCES) .add(AllBlocks.HAND_CRANK) @@ -63,11 +86,15 @@ public class PonderIndex { .add(AllBlocks.WATER_WHEEL) .add(AllBlocks.ENCASED_FAN) .add(AllBlocks.WINDMILL_BEARING) - .add(AllBlocks.FURNACE_ENGINE); + .add(AllBlocks.FURNACE_ENGINE) + .add(AllBlocks.FLYWHEEL) + .add(AllBlocks.CREATIVE_MOTOR); PonderRegistry.tags.forTag(PonderTag.KINETIC_APPLIANCES) .add(AllBlocks.MILLSTONE) .add(AllBlocks.TURNTABLE) + .add(AllBlocks.ENCASED_FAN) + .add(AllBlocks.CUCKOO_CLOCK) .add(AllBlocks.MECHANICAL_PRESS) .add(AllBlocks.MECHANICAL_MIXER) .add(AllBlocks.MECHANICAL_CRAFTER) @@ -88,9 +115,12 @@ public class PonderIndex { .add(AllBlocks.MECHANICAL_PUMP) .add(AllBlocks.FLUID_VALVE) .add(AllBlocks.SMART_FLUID_PIPE) - .add(AllBlocks.FLUID_TANK) + .add(AllBlocks.HOSE_PULLEY) .add(AllBlocks.ITEM_DRAIN) - .add(AllBlocks.HOSE_PULLEY); + .add(AllBlocks.SPOUT) + .add(AllBlocks.PORTABLE_FLUID_INTERFACE) + .add(AllBlocks.FLUID_TANK) + .add(AllBlocks.CREATIVE_FLUID_TANK); PonderRegistry.tags.forTag(PonderTag.ARM_TARGETS) .add(AllItems.BELT_CONNECTOR) @@ -110,6 +140,8 @@ public class PonderIndex { PonderRegistry.tags.forTag(PonderTag.LOGISTICS) .add(AllItems.BELT_CONNECTOR) + .add(AllItems.FILTER) + .add(AllItems.ATTRIBUTE_FILTER) .add(AllBlocks.CHUTE) .add(AllBlocks.SMART_CHUTE) .add(AllBlocks.DEPOT) @@ -117,7 +149,37 @@ public class PonderIndex { .add(AllBlocks.ANDESITE_FUNNEL) .add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.ANDESITE_TUNNEL) - .add(AllBlocks.BRASS_TUNNEL); + .add(AllBlocks.BRASS_TUNNEL) + .add(AllBlocks.CONTENT_OBSERVER) + .add(AllBlocks.STOCKPILE_SWITCH) + .add(AllBlocks.ADJUSTABLE_CRATE) + .add(AllBlocks.CREATIVE_CRATE) + .add(AllBlocks.PORTABLE_STORAGE_INTERFACE); + + PonderRegistry.tags.forTag(PonderTag.DECORATION) + .add(AllBlocks.NIXIE_TUBE) + .add(AllBlocks.CUCKOO_CLOCK) + .add(AllBlocks.WOODEN_BRACKET) + .add(AllBlocks.METAL_BRACKET) + .add(AllBlocks.ANDESITE_CASING) + .add(AllBlocks.BRASS_CASING) + .add(AllBlocks.COPPER_CASING); + + PonderRegistry.tags.forTag(PonderTag.CREATIVE) + .add(AllBlocks.CREATIVE_CRATE) + .add(AllBlocks.CREATIVE_FLUID_TANK) + .add(AllBlocks.CREATIVE_MOTOR); + + PonderRegistry.tags.forTag(PonderTag.REDSTONE) + .add(AllBlocks.NIXIE_TUBE) + .add(AllBlocks.REDSTONE_CONTACT) + .add(AllBlocks.ANALOG_LEVER) + .add(AllBlocks.REDSTONE_LINK) + .add(AllBlocks.ADJUSTABLE_REPEATER) + .add(AllBlocks.PULSE_REPEATER) + .add(AllBlocks.ADJUSTABLE_PULSE_REPEATER) + .add(AllBlocks.POWERED_LATCH) + .add(AllBlocks.POWERED_TOGGLE_LATCH); PonderRegistry.tags.forTag(PonderTag.MOVEMENT_ANCHOR) .add(AllBlocks.MECHANICAL_PISTON) @@ -141,6 +203,7 @@ 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/content/PonderTag.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java index 12357a5a6..b0b7ba26c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTag.java @@ -10,6 +10,7 @@ import net.minecraft.block.Blocks; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.AbstractGui; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; import net.minecraftforge.api.distmarker.Dist; @@ -35,6 +36,15 @@ public class PonderTag implements IScreenRenderable { LOGISTICS = new PonderTag("logistics").item(Blocks.CHEST, true, false) .defaultLang("Item Transportation", "Components which help moving items around"), + + REDSTONE = new PonderTag("redstone").item(Items.REDSTONE, true, false) + .defaultLang("Logic Components", "Components which help with redstone engineering"), + + DECORATION = new PonderTag("decoration").item(Items.ROSE_BUSH, true, false) + .defaultLang("Aesthetics", "Components used mostly for decorative purposes"), + + CREATIVE = new PonderTag("creative").item(AllBlocks.CREATIVE_CRATE.get(), true, false) + .defaultLang("Creative Mode", "Components not usually available for Survival Mode"), MOVEMENT_ANCHOR = new PonderTag("movement_anchor").item(AllBlocks.MECHANICAL_PISTON.get(), true, false) .defaultLang("Movement Anchors", diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java index ed37b8ea6..aaa9bf6af 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -9,11 +9,15 @@ public class SharedText { add("sneak_and", "Sneak +"); add("ctrl_and", "Ctrl +"); - + + add("rpm8", "8 RPM"); + add("rpm16", "16 RPM"); + add("rpm32", "32 RPM"); + add("movement_anchors", "With the help of Chassis or Super Glue, larger structures can be moved."); } - + public static String get(String key) { return PonderLocalization.getShared(key); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java index d1c169c3b..aa53b9f60 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/WorldSectionElement.java @@ -328,9 +328,12 @@ public class WorldSectionElement extends AnimatedSceneElement { ms.translate(pos.getX(), pos.getY(), pos.getZ()); if (state.getRenderType() != BlockRenderType.ENTITYBLOCK_ANIMATED && state.getBlock() != Blocks.AIR - && RenderTypeLookup.canRenderInLayer(state, layer)) + && RenderTypeLookup.canRenderInLayer(state, layer)) { + TileEntity tileEntity = world.getTileEntity(pos); blockRenderer.renderModel(world, dispatcher.getModelForState(state), state, pos, ms, builder, true, - random, 42, OverlayTexture.DEFAULT_UV, EmptyModelData.INSTANCE); + random, 42, OverlayTexture.DEFAULT_UV, + tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE); + } if (!ifluidstate.isEmpty() && RenderTypeLookup.canRenderInLayer(ifluidstate, layer)) dispatcher.renderFluid(pos, world, builder, ifluidstate); diff --git a/src/main/resources/ponder/belt/encasing.nbt b/src/main/resources/ponder/belt/encasing.nbt new file mode 100644 index 0000000000000000000000000000000000000000..1ce0d762dfdb1d85bae984231a746ef2ca0b68fd GIT binary patch literal 1021 zcmV$a6?3B&0`tkz9gD2vJuD zuRvWr(uGVWG66wU>5bMpbbJe)viKI9 zeGATYI-Z4&Z`28imz~If1V=eQym!^^(INgRt{!~OW2~u`(?J%)g^~(MIAEFNEKPxX z#Q75+zQFrmc;ChQ-*|sdx}-CpBFTotKm2&OACk@yJLeG;4SvxYyu)s{55%=F4!QFI zvY{NQA%|q^5afjMvw(C5G^bG_r@zmXG5-h?57z1W#65`dj@4hj3a~%PK?vmtpSej) z`Vj{-vwH%mH1NBciwYapl8wdKdMn5FLoqgyjPn$Z&yoye66w@_U7%)|W8H^$e|@|v zeC+8y0)r1<^YPE@&V9VJ@u5mJ9|z52&TS>;^al4N=BjKu&Dl6N!e(z{Hd}45sqTqe z?ZxrVlCjO^W7{dlHU!E~*u^SbgJp@RYM`qb_;-B+PnQ_@)-Zs7EPTA4uM@*2u6$HC z`d)hzvD!z&iC8e;8VrQZqm0~0lnwMKa~fx$fb`$RF~r}&y`8D0*C6gf(mTk$;5!QA z(;nKDFc!t6KlsE1zPWsXk37csHyycju>IQ%QM(ncAGDT6YSqWKWu&g!qJCZouN4dA zr-cS}Y1nHe!fMhmDFUd<=0S5d#x1Hbo5coq%EmFU*=f$km{`_kv%8Fq)0mBQVlmTN zKe4z5un$|x*m^eDZ~C5A57s7Q?^uJKZ3fm^mg%Z5z>iuwaBd8Cf8zt^>K$Xnfz#F4 zJZ|Ylr7@cqTKL~F8@F6Po3Sx|IBCqL%ye(=2OFn|t16o(SZ6DzDM$(GJMYsjTA^bg z&&PO1i8wu#yOU8O;W%O$N@Jt4#>GO_elRemGlqbB4HVB6ko}I9q9I;2OIzZAP4`U literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/clutch.nbt b/src/main/resources/ponder/clutch.nbt new file mode 100644 index 0000000000000000000000000000000000000000..351af5afb9501930ac7d53e11ccb35248a3d662f GIT binary patch literal 681 zcmV;a0#^MWiwFP!000000L_-oj?*v@$0v!?rd<##1cEaXpQpX<9u|q^0GA4>umUcX zH=VXt-8iycvT*9N@DSWN@)X>837E7^TSA(eMPk>I<))hX&HQI<%WZ%bFe5%;008-H z(DZ4BEr>9&!U{Byj}|n}q>9I;O&|AK5Twc!POA|>Xe_t5^w_lVDr~%xjqkt-95~E@ zQw*<$<5k#{IlcoYaNsZpPBDCkI{OZFuHys_9Ol4TwZfs!fkU0^IDrF)IdF=>9O}#* z>RiVO95}3!(}o~9vmu1t6tVwxmiz5@=%<B59j%A7zNfWY)*3E#Z0>Qtq~jS>>mZjCC6$J!pMU^)U3MS-PDkzKRo2ni(zDHnM{|qK<|P=BO*7>Zt;PI()rx?1 z_ypnZgtCn_AK0U8BrNt~m5>~ADlBfTEli@a-u#h9>RD3s)Sm`56BBScwdH3rm$WC;E=jbJ}#^te>Xus0CeSYTF9*V$EE ztQX7eS^*l7(lVl%stk3V`|oG*Vkz7x7+VU%s4z(GQYl@LQ&BgDoXWIo@JbIVUr8=(@~ PieKOtIIVr(77PFYZT(RO literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cog/large.nbt b/src/main/resources/ponder/cog/large.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3f55bd447b210708b929e6280a2a5784e1438b52 GIT binary patch literal 577 zcmV-H0>1qpiwFP!000000L@mxZqq;z9eZ~j+vR{nk+^W;2M};5;e_B&E)h}$0xr?k zo+hg}w&h*qwx@m-XFiSDHf~ePcDKSoSc*1@-oANnW@o%HKm=T?3uFLbKS8rb5MpkW zQK-Q_5dIIBZE+<`}Q z^2EUM6C*&(OT_g3rQP>hHe zxhm89M%V7^FZlmoCB3Ih+&NtlOiG!dF=%g~lMwh!ZV;YrC`wY%jGWdhWpI%cImw_+ z4dU%p%Wq9A?4c7Mx;mi#&6S zJlAoU1&3F10$|CR@xbe)h=b>gb%$O0sTU{Sqyvg{0%&&8%%z%m;Gc+8gpv99@*)HC z9yLBKyT-wNH2`SR$@IvBM$ahJmu>HZ8x7!AsE}YC9Zl01`;#a^6NLdq%9#r3;o-cc z*gG`8qq#%#dzv3sT%Du&#!nr%J!PDm zSFavrkG1vi{^*YuG*c0yF_?V^HGJS*F-5pNrCmZLhNd$gM+W<$Oz1LbQ4w+TcZ5#l zyubLEqO=6Bl}u4(-&sDi=d_QC&}@W1^K2jUgp18G$=X zeK^dP_C+j{QGXaIZF1-mRq?{G-8Eg$L7^PY$B6NEl%jO8P@^n|Ig3I2g)rh2m5yXW Qb^Z*$0M>pI@VX8F0Jr)ry8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cog/speedup.nbt b/src/main/resources/ponder/cog/speedup.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2a5687aeed198c59d5a79fa1eca8fa5d8f04659f GIT binary patch literal 655 zcmV;A0&x8wiwFP!000000M(Ywj?*v@$0xSardcFb2oMsVH=bb^1QN>uE)`P63b<6> z)J?6Xab&yd!fBs{hu{oHo`O3s0h4ahR*^R~yF~~~mHY9Z|M)kPOcMk2fEoEoPyi@j zooWwz5Q*GMD}{k_^`LW-sbp$m{P4I3v{0rFS}h8pvD}I(Vp9`1G(kf{Jbb8!5A*P; zSJ2`UI5bTk;^9L*e3*w%y@*GhiASB=e5i*H^YB@p=*efz`sCkC+IE9Ko$b3p6`4a#mzwIF-4u zGKo>C<~qSa6}&_3UEJT}eu(=A+@H9vyRvSZ*CzGkz>p)ADGkp*|MFn!wlHC;W1h{$ zv!CC8ob%nN`O1W9Calm+xO>~+0tX!1U6VRHYSR5}9OMd3^56(}#PMJo2mQMoySix} zZsTD87so-x@wCYiIyk}x$G5Y8&hf~HqgP*vvZoxBQttcO!yAiNHp9#1#LytuBu{~T&q!q(N z<(LG6YQ@d9!sKc(Tt0!Xe!X3ti030=mhs%kJVmPbjaG%w<->afdkYllOr$b6QmFy~muh2A z6RVEb+FhEoC%%d^;>#E(aT-jVYzl?oC|Wz2c{A_r%z8Hh2!ZMJ3OxWQzy5q|g%DtF zQj?;F@(RK4XEHw55j{K#!7HS$oE(^4jt5*DVQ}uTY~!x5acVZ61rD>o;TAYm&h8o< zcZE$I$Fsm;7C77jr^?y0(Al%lc^wY3z~L4+RnE*pXJ(=EIvi$!!!2;CoVkV0+(PGd zILrcvuf&PK%ln1{KPeECms7ucUAooNAKn!SSvnE4x@g8yopT5dMIqwUTz00w?1UPh z?(Q&fI|)Gh8%5gZ;GY2eN%a z<3}2w(fEnRH>>8b)NQ#h-QDML)Wl=CSG^jK@Bg01<4ruAIgjQ3WxK~?V_mr`c<{f; zTWx>T1T(KR@lZQ32Ub1XG&;xDkL z63VP;SLH7W+uB}O=T?O6)rEzvh22WV71}s8ZG!E!asQ|`2fL$#YY~N}N3JvSgy5p|jzzWz@>7XeMes*yl4N+BAw0~J d8{&J=ekF`}k4mR9r$+b+KLCu;1GXd)006l`Uv>Zh literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/gearshift.nbt b/src/main/resources/ponder/gearshift.nbt new file mode 100644 index 0000000000000000000000000000000000000000..957cec1837b5ec75c28ec9a162365a24266dfce2 GIT binary patch literal 610 zcmV-o0-gOIiwFP!000000L_+7kJB&^h9|MprdcHR0D>zQzD`_sk1Pies6whhz@_pg z)6{AjN49sfaOzLu#GQY}q)OT<4XJlo0hTN`?K_YC&e*9VfDv#bzaayFst>69)PoU( zm|JNj8mQU`2IrZI7bc>IM^S{mPh!yGu=fzvdvhvRi< z+8p13!yGu=fzveKA(3~6n$pe5UmGzjREfGT zeD4sp5qu_Mr1(rJ-2oiX&oWPeqcC=BZJY57FH!G7*J_@toDhLg7k0jR%9XC3j7+Na wmbfEaPY<%{&jb^U$JeO30%`Sk6adh)5jCG$5J8BA z(@vv>CL$QE@-o@jm~Ng&Aga=KllCDXuueH_XB=w00gczw_zaFAXrq0>8qXQa!!|a_uxa7lG2M|JV#fTW)nd8T2(61 z?%Ug&1|S!-5z(|zg8we1Coe(#mc3F`V(8m!d>nqi^8fP@o$}$GhmZJ_5C1%TOiuX_=i%exln;4c zKBldYY2QaM;3Mey_;vHoeLUd!XyWjnGa}8nQaL(@&CzTef}E=@!s9KyB{AyC&1_ND z%iZY>y3uF9N9(nAxJ=4|7D>oX@u*$%$|!4>iL$!L_JdE`K~05y z!O;v(*CeCPl2PYl9L3;h24{N|j5;euosV%8gQFQ7vFW=RdEi<58TB7`%{VX3IIm+I z#o%ZLr*qc~cm0=p2CAAy17_SH7WWTr=4wPA!|I2RO+iVK!NmyUvi5TW$vfNF+{N$L z4=q5C=|x1Sfd+Y95dJ5?+o6HMIC>20*H8k|74S0mNU&jWi>AcM+*KG|o>8*?=5u

4DO@zR#2B%?3YY}+$Sx3GEa)k@w>NPZs(LwD-4>vmef?*4dFvuh^17l; z60%D?-|TtnZ3vUx23O6tldm?Dwkj~JmapeC$UgYGLEqj}61ZGa$d~nOh6R`#TLvV8 ny>kJ?-4^z!tIjQLheR*m+h{+b53a7Lg1_K5UTxw;7YP6W*h%hs From 3bc2a9e30ff3bd296e40d415d8ab1c76c58f9abe Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 6 Mar 2021 18:08:03 +0100 Subject: [PATCH 20/23] Sanity for translators - Generated lang entries of re-used scenes now refer to the same set of keys - Scenes for Chain Drive and Chain Gearshift --- src/generated/resources/.cache/cache | 30 +- .../create/blockstates/radial_chassis.json | 24 +- .../resources/assets/create/lang/en_us.json | 244 +++++++---------- .../assets/create/lang/unfinished/de_de.json | 246 +++++++---------- .../assets/create/lang/unfinished/es_es.json | 246 +++++++---------- .../assets/create/lang/unfinished/es_mx.json | 246 +++++++---------- .../assets/create/lang/unfinished/fr_fr.json | 246 +++++++---------- .../assets/create/lang/unfinished/it_it.json | 246 +++++++---------- .../assets/create/lang/unfinished/ja_jp.json | 246 +++++++---------- .../assets/create/lang/unfinished/ko_kr.json | 246 +++++++---------- .../assets/create/lang/unfinished/nl_nl.json | 246 +++++++---------- .../assets/create/lang/unfinished/pt_br.json | 246 +++++++---------- .../assets/create/lang/unfinished/ru_ru.json | 246 +++++++---------- .../assets/create/lang/unfinished/zh_cn.json | 246 +++++++---------- .../assets/create/lang/unfinished/zh_tw.json | 246 +++++++---------- .../data/create/advancements/aesthetics.json | 4 +- .../encased/AdjustablePulleyTileEntity.java | 2 + .../create/foundation/data/LangMerger.java | 2 +- .../foundation/ponder/PonderLocalization.java | 41 ++- .../foundation/ponder/PonderRegistry.java | 2 +- .../create/foundation/ponder/PonderScene.java | 50 ++-- .../foundation/ponder/SceneBuilder.java | 13 +- .../foundation/ponder/content/BeltScenes.java | 2 +- .../ponder/content/ChainDriveScenes.java | 259 ++++++++++++++++++ .../ponder/content/DebugScenes.java | 20 +- .../ponder/content/FunnelScenes.java | 12 +- .../ponder/content/GantryScenes.java | 11 +- .../ponder/content/KineticsScenes.java | 25 +- .../ponder/content/MovementActorScenes.java | 4 +- .../ponder/content/PonderIndex.java | 5 + .../foundation/ponder/content/SharedText.java | 1 + .../ponder/chain_drive/gearshift.nbt | Bin 0 -> 985 bytes .../resources/ponder/chain_drive/relay.nbt | Bin 0 -> 768 bytes 33 files changed, 1613 insertions(+), 2090 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java create mode 100644 src/main/resources/ponder/chain_drive/gearshift.nbt create mode 100644 src/main/resources/ponder/chain_drive/relay.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 7fa2e3345..ea00f774d 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json +d2e6f19325be65457e94bea44fd52863c0f66be7 assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2384c6457ecf24c7b38358179b8fa6eb93b9627a assets/create/lang/en_ud.json -6fecfcf70c69f6bcd2b022ccb937d08f6d30e7a4 assets/create/lang/en_us.json -0aa63a461f5c0d1e1727e6541d4afcd88ced88d5 assets/create/lang/unfinished/de_de.json -0a9a823d56111c8dd65b4399b93c09debbde0663 assets/create/lang/unfinished/es_es.json -d4e527b487903069ac9c6757a94e26d25b7e8291 assets/create/lang/unfinished/es_mx.json -d5c2910d54ebfd1bac8eb3ea3c96f1667c53c7d1 assets/create/lang/unfinished/fr_fr.json -86d8897c3cf17559ce9de35ae76f872f9ba3e377 assets/create/lang/unfinished/it_it.json -341be60e0484e9969ed44353f182e6f7a9c50a69 assets/create/lang/unfinished/ja_jp.json -f16072a1a02e4a1d360cd9997cf7684afe6d9212 assets/create/lang/unfinished/ko_kr.json -055e490a9fc8c56fc6f4fad1c10e64fafb894ee8 assets/create/lang/unfinished/nl_nl.json -395131eab03df87203d2bd4e25bb5f3a212c2edd assets/create/lang/unfinished/pt_br.json -9661c315bba7bef0c9f93594fa997728b1ae1434 assets/create/lang/unfinished/ru_ru.json -e0f3db89425ec11186c95ad2829327bd48b90c51 assets/create/lang/unfinished/zh_cn.json -80104284eee5640e9e5027311010b9cf659bb93d assets/create/lang/unfinished/zh_tw.json +1c808ec167a735945a60fdef344aaec7a1fd68d0 assets/create/lang/en_us.json +ae1ea7ce8b825405e38ed0d87b26bbcf46de3742 assets/create/lang/unfinished/de_de.json +8522f80887d94e89a87d20188a3658342de7c757 assets/create/lang/unfinished/es_es.json +e7476bbfef6254a143d999f7f1220af80ce39c8b assets/create/lang/unfinished/es_mx.json +a6516993be60550fd45e55583e6040733f70dcef assets/create/lang/unfinished/fr_fr.json +d5b30386a7a0fdbf8bcd951baa4f6000d9c1501e assets/create/lang/unfinished/it_it.json +4e5101741f7565c4450f36a37da4b3ad92af4076 assets/create/lang/unfinished/ja_jp.json +d526a4dd43baefa89c7a42b2e236ccc7b9cdf678 assets/create/lang/unfinished/ko_kr.json +6dcd80f25ecdc7ead62f1f48a6162575e2a93257 assets/create/lang/unfinished/nl_nl.json +43ff570e703a25847830e99c12722bbc4a9fb2ab assets/create/lang/unfinished/pt_br.json +3312f083a22112e786726047129476710cec0242 assets/create/lang/unfinished/ru_ru.json +25b50c546bb8b40bb8c85e8b4914fbe1bca6bdce assets/create/lang/unfinished/zh_cn.json +bddbc961a8bd12e08a8aa2b0b2329568da1b27ef 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 @@ -1579,7 +1579,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/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index f97d8c8bc..49576633e 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "x" + "axis": "x", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "y" + "axis": "y", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "sticky_north": "true", - "axis": "z" + "axis": "z", + "sticky_north": "true" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "x" + "axis": "x", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "y" + "axis": "y", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "sticky_north": "false", - "axis": "z" + "axis": "z", + "sticky_north": "false" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 81d6671f5..f095aac38 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1813,6 +1813,7 @@ "create.ponder.shared.sneak_and": "Sneak +", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", + "create.ponder.shared.rpm16_source": "Source: 16 RPM", "create.ponder.shared.rpm16": "16 RPM", "create.ponder.tag.kinetic_sources": "Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "Components which generate Rotational Force", @@ -1837,180 +1838,121 @@ "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "Encasing Belts", + "create.ponder.belt_casing.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "Straight connections will be reversed", + "create.ponder.brass_funnel.header": "The Brass Funnel", + "create.ponder.brass_funnel.text_1": "Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "12 RPM", - "create.ponder.brass_funnel.scene_0.header": "The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "Depots", - "create.ponder.brass_funnel.scene_3.text_4": "Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "Depots", + "create.ponder.funnel_compat.text_4": "Item Drains", - "create.ponder.brass_funnel.scene_4.header": "Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "Direction of Transfer", + "create.ponder.funnel_direction.text_1": "Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "Using funnels", + "create.ponder.funnel_intro.text_1": "Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "Redstone control", + "create.ponder.funnel_redstone.text_1": "Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "Direct transfer", + "create.ponder.funnel_transfer.text_1": "Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "Encasing Shafts", + "create.ponder.shaft_casing.text_1": "Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 bd855a695..66f5d34e8 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: 1140", + "_": "Missing Localizations: 1096", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 8e85400fd..39edcad2e 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: 183", + "_": "Missing Localizations: 139", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 edd6c0978..8bbb010e8 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: 1070", + "_": "Missing Localizations: 1026", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 7c49e20a9..46592daeb 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: 852", + "_": "Missing Localizations: 808", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 61e5c0b7a..80b162de6 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: 188", + "_": "Missing Localizations: 144", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 b46be01fa..81d7d2353 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: 195", + "_": "Missing Localizations: 151", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 3649903a1..e374b6616 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: 241", + "_": "Missing Localizations: 197", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 337a28d1f..a4e2e3f9d 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: 1339", + "_": "Missing Localizations: 1295", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 78b3f600c..a685f91c6 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: 1405", + "_": "Missing Localizations: 1361", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 dea4d4577..b227eaf65 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: 191", + "_": "Missing Localizations: 147", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 5864dce4a..8adfbf42d 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: 189", + "_": "Missing Localizations: 145", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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 6e0d3a7ce..3db9f714c 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: 194", + "_": "Missing Localizations: 150", "_": "->------------------------] Game Elements [------------------------<-", @@ -1814,6 +1814,7 @@ "create.ponder.shared.sneak_and": "UNLOCALIZED: Sneak +", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", + "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", "create.ponder.shared.rpm16": "UNLOCALIZED: 16 RPM", "create.ponder.tag.kinetic_sources": "UNLOCALIZED: Kinetic Sources", "create.ponder.tag.kinetic_sources.description": "UNLOCALIZED: Components which generate Rotational Force", @@ -1838,180 +1839,121 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", - "create.ponder.andesite_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", + "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - "create.ponder.vertical_gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.vertical_gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.vertical_gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.vertical_gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.vertical_gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", + "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", + "create.ponder.brass_funnel.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", + "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.large_cogwheel.scene_0.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.large_cogwheel.scene_0.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.large_cogwheel.scene_0.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.large_cogwheel.scene_0.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "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", + "create.ponder.chain_drive.text_3": "UNLOCALIZED: Any part of the row can be rotated by 90 degrees", - "create.ponder.large_cogwheel.scene_1.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", - "create.ponder.large_cogwheel.scene_1.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", - "create.ponder.large_cogwheel.scene_1.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", + "create.ponder.chain_gearshift.header": "UNLOCALIZED: Controlling rotational speed with Chain Gearshifts", + "create.ponder.chain_gearshift.text_1": "UNLOCALIZED: Unpowered Chain Gearshifts behave exacly like Chain Drives", + "create.ponder.chain_gearshift.text_2": "UNLOCALIZED: When Powered, the speed transmitted to other Chain Drives in the row is doubled", + "create.ponder.chain_gearshift.text_3": "UNLOCALIZED: Whenever the Powered Gearshift is not at the source, its speed will be halved instead", + "create.ponder.chain_gearshift.text_4": "UNLOCALIZED: In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift", + "create.ponder.chain_gearshift.text_5": "UNLOCALIZED: Using analog signals, the ratio can be adjusted more precisely between 1 and 2", + "create.ponder.chain_gearshift.text_6": "UNLOCALIZED: 12 RPM", - "create.ponder.brass_funnel.scene_0.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.brass_funnel.scene_0.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.brass_funnel.scene_0.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.brass_funnel.scene_0.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.brass_funnel.scene_0.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.clutch.header": "UNLOCALIZED: Controlling rotational force using a Clutch", + "create.ponder.clutch.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", + "create.ponder.clutch.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", - "create.ponder.brass_funnel.scene_1.header": "UNLOCALIZED: Using funnels", - "create.ponder.brass_funnel.scene_1.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", + "create.ponder.cog_speedup.header": "UNLOCALIZED: Gearshifting with Cogs", + "create.ponder.cog_speedup.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", + "create.ponder.cog_speedup.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", + "create.ponder.cog_speedup.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", - "create.ponder.brass_funnel.scene_2.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.brass_funnel.scene_2.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.brass_funnel.scene_2.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.brass_funnel.scene_2.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.brass_funnel.scene_2.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.brass_funnel.scene_2.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", + "create.ponder.cogwheel.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", + "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", + "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", - "create.ponder.brass_funnel.scene_3.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.brass_funnel.scene_3.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.brass_funnel.scene_3.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.brass_funnel.scene_3.text_3": "UNLOCALIZED: Depots", - "create.ponder.brass_funnel.scene_3.text_4": "UNLOCALIZED: Item Drains", + "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", + "create.ponder.funnel_compat.text_3": "UNLOCALIZED: Depots", + "create.ponder.funnel_compat.text_4": "UNLOCALIZED: Item Drains", - "create.ponder.brass_funnel.scene_4.header": "UNLOCALIZED: Redstone control", - "create.ponder.brass_funnel.scene_4.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", + "create.ponder.funnel_direction.header": "UNLOCALIZED: Direction of Transfer", + "create.ponder.funnel_direction.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", + "create.ponder.funnel_direction.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", + "create.ponder.funnel_direction.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", + "create.ponder.funnel_direction.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", + "create.ponder.funnel_direction.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - "create.ponder.brass_funnel.scene_5.header": "UNLOCALIZED: Direct transfer", - "create.ponder.brass_funnel.scene_5.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.brass_funnel.scene_5.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.brass_funnel.scene_5.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.funnel_intro.header": "UNLOCALIZED: Using funnels", + "create.ponder.funnel_intro.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - "create.ponder.shaft.scene_0.header": "UNLOCALIZED: Relaying rotational force using Shafts", - "create.ponder.shaft.scene_0.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", + "create.ponder.funnel_redstone.header": "UNLOCALIZED: Redstone control", + "create.ponder.funnel_redstone.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - "create.ponder.shaft.scene_1.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.shaft.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.funnel_transfer.header": "UNLOCALIZED: Direct transfer", + "create.ponder.funnel_transfer.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", + "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.brass_encased_shaft.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_encased_shaft.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "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.", - "create.ponder.portable_storage_interface.scene_0.header": "UNLOCALIZED: Contraption Storage Exchange", - "create.ponder.portable_storage_interface.scene_0.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", - "create.ponder.portable_storage_interface.scene_0.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", - "create.ponder.portable_storage_interface.scene_0.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", - "create.ponder.portable_storage_interface.scene_0.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", - "create.ponder.portable_storage_interface.scene_0.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", - "create.ponder.portable_storage_interface.scene_0.text_6": "UNLOCALIZED: Items can now be inserted...", - "create.ponder.portable_storage_interface.scene_0.text_7": "UNLOCALIZED: ...or extracted from the contraption", - "create.ponder.portable_storage_interface.scene_0.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", + "create.ponder.gantry_cascaded.header": "UNLOCALIZED: Cascaded Gantries", + "create.ponder.gantry_cascaded.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", + "create.ponder.gantry_cascaded.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", + "create.ponder.gantry_cascaded.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - "create.ponder.portable_storage_interface.scene_1.header": "UNLOCALIZED: Redstone Control", - "create.ponder.portable_storage_interface.scene_1.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", + "create.ponder.gantry_direction.header": "UNLOCALIZED: Gantry Movement Direction", + "create.ponder.gantry_direction.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", + "create.ponder.gantry_direction.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", + "create.ponder.gantry_direction.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", + "create.ponder.gantry_direction.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - "create.ponder.gearshift.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", - "create.ponder.gearshift.scene_0.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", - "create.ponder.gearshift.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.gantry_redstone.header": "UNLOCALIZED: Gantry Power Propagation", + "create.ponder.gantry_redstone.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", + "create.ponder.gantry_redstone.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - "create.ponder.cogwheel.scene_0.header": "UNLOCALIZED: Relaying rotational force using Cogwheels", - "create.ponder.cogwheel.scene_0.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", - "create.ponder.cogwheel.scene_0.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.gantry_shaft.header": "UNLOCALIZED: Using Gantry Shafts", + "create.ponder.gantry_shaft.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", + "create.ponder.gantry_shaft.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - "create.ponder.cogwheel.scene_1.header": "UNLOCALIZED: Gearshifting with Cogs", - "create.ponder.cogwheel.scene_1.text_1": "UNLOCALIZED: Large and Small cogs can be connected diagonally", - "create.ponder.cogwheel.scene_1.text_2": "UNLOCALIZED: Shifting from large to small cogs, the conveyed speed will be doubled", - "create.ponder.cogwheel.scene_1.text_3": "UNLOCALIZED: Shifting the opposite way, the conveyed speed will be halved", + "create.ponder.gearbox.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", + "create.ponder.gearbox.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", + "create.ponder.gearbox.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", + "create.ponder.gearbox.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", + "create.ponder.gearbox.text_4": "UNLOCALIZED: Straight connections will be reversed", - "create.ponder.brass_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.brass_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.gearshift.header": "UNLOCALIZED: Controlling rotational force using a Gearshift", + "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", + "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", - "create.ponder.brass_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.brass_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.brass_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", + "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", + "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", - "create.ponder.gearbox.scene_0.header": "UNLOCALIZED: Relaying rotational force using Gearboxes", - "create.ponder.gearbox.scene_0.text_1": "UNLOCALIZED: Jumping between axes of rotation can get bulky quickly", - "create.ponder.gearbox.scene_0.text_2": "UNLOCALIZED: A gearbox is the more compact equivalent of this setup", - "create.ponder.gearbox.scene_0.text_3": "UNLOCALIZED: Shafts around corners rotate in mirrored directions", - "create.ponder.gearbox.scene_0.text_4": "UNLOCALIZED: Straight connections will be reversed", + "create.ponder.portable_storage_interface.header": "UNLOCALIZED: Contraption Storage Exchange", + "create.ponder.portable_storage_interface.text_1": "UNLOCALIZED: Inventories on moving contraptions cannot be accessed by players.", + "create.ponder.portable_storage_interface.text_2": "UNLOCALIZED: This component can interact with storage without the need to stop the contraption.", + "create.ponder.portable_storage_interface.text_3": "UNLOCALIZED: Place a second one with a gap of 1 or 2 blocks inbetween", + "create.ponder.portable_storage_interface.text_4": "UNLOCALIZED: Whenever they pass by each other, they will engage in a connection", + "create.ponder.portable_storage_interface.text_5": "UNLOCALIZED: While engaged, the stationary interface will represent ALL inventories on the contraption", + "create.ponder.portable_storage_interface.text_6": "UNLOCALIZED: Items can now be inserted...", + "create.ponder.portable_storage_interface.text_7": "UNLOCALIZED: ...or extracted from the contraption", + "create.ponder.portable_storage_interface.text_8": "UNLOCALIZED: After no items have been exchanged for a while, the contraption will continue on its way", - "create.ponder.clutch.scene_0.header": "UNLOCALIZED: Controlling rotational force using a Clutch", - "create.ponder.clutch.scene_0.text_1": "UNLOCALIZED: Clutches will relay rotation in a straight line", - "create.ponder.clutch.scene_0.text_2": "UNLOCALIZED: When powered by Redstone, it breaks the connection", + "create.ponder.portable_storage_interface_redstone.header": "UNLOCALIZED: Redstone Control", + "create.ponder.portable_storage_interface_redstone.text_1": "UNLOCALIZED: Redstone power will prevent the stationary interface from engaging", - "create.ponder.gantry_shaft.scene_0.header": "UNLOCALIZED: Using Gantry Shafts", - "create.ponder.gantry_shaft.scene_0.text_1": "UNLOCALIZED: Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them.", - "create.ponder.gantry_shaft.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", + "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", - "create.ponder.gantry_shaft.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_shaft.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_shaft.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_shaft.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_shaft.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_shaft.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_shaft.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_shaft.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_shaft.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_shaft.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_shaft.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_shaft.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", - - "create.ponder.andesite_funnel.scene_0.header": "UNLOCALIZED: Using funnels", - "create.ponder.andesite_funnel.scene_0.text_1": "UNLOCALIZED: Funnels are ideal for transferring items from and to inventories.", - - "create.ponder.andesite_funnel.scene_1.header": "UNLOCALIZED: Direction of Transfer", - "create.ponder.andesite_funnel.scene_1.text_1": "UNLOCALIZED: Placed normally, it pulls items from the inventory.", - "create.ponder.andesite_funnel.scene_1.text_2": "UNLOCALIZED: Placed while sneaking, it puts items into the inventory.", - "create.ponder.andesite_funnel.scene_1.text_3": "UNLOCALIZED: Using a wrench, the funnel can be flipped after placement.", - "create.ponder.andesite_funnel.scene_1.text_4": "UNLOCALIZED: Same rules will apply for most orientations.", - "create.ponder.andesite_funnel.scene_1.text_5": "UNLOCALIZED: Funnels on belts will extract/insert depending on its movement direction.", - - "create.ponder.andesite_funnel.scene_2.header": "UNLOCALIZED: Funnel compatibility", - "create.ponder.andesite_funnel.scene_2.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", - "create.ponder.andesite_funnel.scene_2.text_2": "UNLOCALIZED: Vertical Saws", - "create.ponder.andesite_funnel.scene_2.text_3": "UNLOCALIZED: Depots", - "create.ponder.andesite_funnel.scene_2.text_4": "UNLOCALIZED: Item Drains", - - "create.ponder.andesite_funnel.scene_3.header": "UNLOCALIZED: Redstone control", - "create.ponder.andesite_funnel.scene_3.text_1": "UNLOCALIZED: Redstone power will prevent any funnel from acting.", - - "create.ponder.andesite_funnel.scene_4.header": "UNLOCALIZED: Direct transfer", - "create.ponder.andesite_funnel.scene_4.text_1": "UNLOCALIZED: Funnels cannot ever transfer between closed inventories directly.", - "create.ponder.andesite_funnel.scene_4.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", - "create.ponder.andesite_funnel.scene_4.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", - - "create.ponder.andesite_funnel.scene_5.header": "UNLOCALIZED: The Brass Funnel", - "create.ponder.andesite_funnel.scene_5.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", - "create.ponder.andesite_funnel.scene_5.text_2": "UNLOCALIZED: Brass Funnels can extract up to a full stack.", - "create.ponder.andesite_funnel.scene_5.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", - "create.ponder.andesite_funnel.scene_5.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", - - "create.ponder.andesite_casing.scene_0.header": "UNLOCALIZED: Encasing Shafts", - "create.ponder.andesite_casing.scene_0.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", - - "create.ponder.andesite_casing.scene_1.header": "UNLOCALIZED: Encasing Belts", - "create.ponder.andesite_casing.scene_1.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.andesite_casing.scene_1.text_2": "UNLOCALIZED: A wrench can be used to remove it again", - - "create.ponder.gantry_carriage.scene_0.header": "UNLOCALIZED: Using Gantry Carriages", - "create.ponder.gantry_carriage.scene_0.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", - "create.ponder.gantry_carriage.scene_0.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", - - "create.ponder.gantry_carriage.scene_1.header": "UNLOCALIZED: Gantry Power Propagation", - "create.ponder.gantry_carriage.scene_1.text_1": "UNLOCALIZED: Redstone-powered gantry shafts stop moving their carriages", - "create.ponder.gantry_carriage.scene_1.text_2": "UNLOCALIZED: Instead, its rotational force is relayed to the carriages' output shaft", - - "create.ponder.gantry_carriage.scene_2.header": "UNLOCALIZED: Gantry Movement Direction", - "create.ponder.gantry_carriage.scene_2.text_1": "UNLOCALIZED: Gantry Shafts can have opposite orientations", - "create.ponder.gantry_carriage.scene_2.text_2": "UNLOCALIZED: The movement direction of carriages depend on their shafts' orientation", - "create.ponder.gantry_carriage.scene_2.text_3": "UNLOCALIZED: ...as well as the rotation direction of the shaft", - "create.ponder.gantry_carriage.scene_2.text_4": "UNLOCALIZED: Same rules apply for the propagated rotation", - - "create.ponder.gantry_carriage.scene_3.header": "UNLOCALIZED: Cascaded Gantries", - "create.ponder.gantry_carriage.scene_3.text_1": "UNLOCALIZED: Gantry shafts attach to a carriage without the need of super glue", - "create.ponder.gantry_carriage.scene_3.text_2": "UNLOCALIZED: Same applies for carriages on moved Gantry Shafts", - "create.ponder.gantry_carriage.scene_3.text_3": "UNLOCALIZED: Thus, a gantry system can be cascaded to cover multiple axes of movement", + "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", + "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", "_": "Thank you for translating Create!" 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/relays/encased/AdjustablePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java index 80d831b84..e243e50c4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/AdjustablePulleyTileEntity.java @@ -49,6 +49,8 @@ public class AdjustablePulleyTileEntity extends KineticTileEntity { @Override public void tick() { super.tick(); + if (world.isRemote) + return; if (signalChanged) { signalChanged = false; analogSignalChanged(world.getRedstonePowerFromNeighbors(pos)); diff --git a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java index f9a8a8049..a4426a706 100644 --- a/src/main/java/com/simibubi/create/foundation/data/LangMerger.java +++ b/src/main/java/com/simibubi/create/foundation/data/LangMerger.java @@ -59,7 +59,7 @@ public class LangMerger implements IDataProvider { private void populateLangIgnore() { // Key prefixes added here will NOT be transferred to lang templates - langIgnore.add("create.ponder.brass_hand."); // Ponder debug scene text + langIgnore.add("create.ponder.debug_"); // Ponder debug scene text } private boolean shouldIgnore(String key) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java index f99647b3d..b6e7eae6c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -11,13 +11,11 @@ import com.simibubi.create.foundation.ponder.content.PonderTagScreen; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Lang; -import net.minecraft.util.ResourceLocation; - public class PonderLocalization { static Map shared = new HashMap<>(); static Map> tag = new HashMap<>(); - static Map>> specific = new HashMap<>(); + static Map> specific = new HashMap<>(); // @@ -29,9 +27,8 @@ public class PonderLocalization { shared.put(key, enUS); } - public static void registerSpecific(ResourceLocation component, int scene, String key, String enUS) { - specific.computeIfAbsent(component, $ -> new HashMap<>()) - .computeIfAbsent(scene, $ -> new HashMap<>()) + public static void registerSpecific(String sceneId, String key, String enUS) { + specific.computeIfAbsent(sceneId, $ -> new HashMap<>()) .put(key, enUS); } @@ -43,12 +40,11 @@ public class PonderLocalization { return Lang.translate(langKeyForShared(key)); } - public static String getSpecific(ResourceLocation component, int scene, String k) { + public static String getSpecific(String sceneId, String k) { if (PonderIndex.EDITOR_MODE) - return specific.get(component) - .get(scene) + return specific.get(sceneId) .get(k); - return Lang.translate(langKeyForSpecific(component.getPath(), scene, k)); + return Lang.translate(langKeyForSpecific(sceneId, k)); } public static String getTag(String key) { @@ -83,19 +79,18 @@ public class PonderLocalization { object.addProperty(Create.ID + "." + langKeyForTag(k), v.getFirst()); object.addProperty(Create.ID + "." + langKeyForTagDescription(k), v.getSecond()); }); - - specific.forEach((rl, map) -> { - String component = rl.getPath(); - for (int i = 0; i < map.size(); i++) { - final int scene = i; - Map sceneMap = map.get(i); - sceneMap.entrySet() + + specific.entrySet() + .stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(entry -> { + entry.getValue() + .entrySet() .stream() .sorted(Map.Entry.comparingByKey()) - .forEach(e -> object.addProperty(Create.ID + "." + langKeyForSpecific(component, scene, e.getKey()), - e.getValue())); - } - }); + .forEach(subEntry -> object.addProperty(Create.ID + "." + langKeyForSpecific(entry.getKey(), subEntry.getKey()), + subEntry.getValue())); + }); return object; } @@ -103,8 +98,8 @@ public class PonderLocalization { json.addProperty(Create.ID + "." + key, enUS); } - protected static String langKeyForSpecific(String component, int scene, String k) { - return LANG_PREFIX + component + ".scene_" + scene + "." + k; + protected static String langKeyForSpecific(String sceneId, String k) { + return LANG_PREFIX + sceneId + "." + k; } protected static String langKeyForShared(String k) { 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 e45f184b7..74f7e7ec5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -92,7 +92,7 @@ public class PonderRegistry { } public static PonderScene compileScene(int i, PonderStoryBoardEntry sb, PonderWorld world) { - PonderScene scene = new PonderScene(world, sb.getComponent(), i, sb.getTags()); + PonderScene scene = new PonderScene(world, sb.getComponent(), sb.getTags()); SceneBuilder builder = scene.builder(); sb.getBoard().program(builder, scene.getSceneBuildingUtil()); return scene; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java index 6578ab8b6..1eee89b34 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -1,5 +1,21 @@ package com.simibubi.create.foundation.ponder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.apache.commons.lang3.mutable.MutableDouble; +import org.apache.commons.lang3.mutable.MutableObject; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.content.PonderTag; @@ -8,8 +24,13 @@ import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.HideAllInstruction; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.Pair; +import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.outliner.Outliner; + import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; @@ -22,22 +43,21 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.math.*; -import org.apache.commons.lang3.mutable.MutableDouble; -import org.apache.commons.lang3.mutable.MutableObject; - -import java.util.*; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.math.Vec2f; +import net.minecraft.util.math.Vec3d; +import net.minecraft.util.math.Vec3i; public class PonderScene { public static final String TITLE_KEY = "header"; - + boolean finished; int sceneIndex; int textIndex; + String sceneId; List schedule, activeSchedule; Map linkedElements; @@ -63,13 +83,12 @@ public class PonderScene { int totalTime; int currentTime; - public PonderScene(PonderWorld world, ResourceLocation component, int sceneIndex, Collection tags) { + public PonderScene(PonderWorld world, ResourceLocation component, Collection tags) { pointOfInterest = Vec3d.ZERO; textIndex = 1; this.world = world; this.component = component; - this.sceneIndex = sceneIndex; outliner = new Outliner(); elements = new HashSet<>(); @@ -83,7 +102,6 @@ public class PonderScene { baseWorldSection = new WorldSectionElement(); renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); - PonderLocalization.registerSpecific(component, sceneIndex, TITLE_KEY, "Untitled Scene"); setPointOfInterest(new Vec3d(0, 4, 0)); } @@ -145,7 +163,7 @@ public class PonderScene { } public String getString(String key) { - return PonderLocalization.getSpecific(component, sceneIndex, key); + return PonderLocalization.getSpecific(sceneId, key); } public void reset() { @@ -311,8 +329,8 @@ public class PonderScene { public Supplier registerText(String defaultText) { final String key = "text_" + textIndex; - PonderLocalization.registerSpecific(component, sceneIndex, key, defaultText); - Supplier supplier = () -> PonderLocalization.getSpecific(component, sceneIndex, key); + PonderLocalization.registerSpecific(sceneId, key, defaultText); + Supplier supplier = () -> PonderLocalization.getSpecific(sceneId, key); textIndex++; return supplier; } 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 f9d6674a3..dab1d0b4b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -108,13 +108,16 @@ public class SceneBuilder { // General /** - * Assign the standard english translation for this scene's title using this - * method, anywhere inside the program function. + * Assign a unique translation key, as well as the standard english translation + * for this scene's title using this method, anywhere inside the program + * function. * + * @param sceneId * @param title */ - public void title(String title) { - PonderLocalization.registerSpecific(scene.component, scene.sceneIndex, PonderScene.TITLE_KEY, title); + public void title(String sceneId, String title) { + scene.sceneId = sceneId; + PonderLocalization.registerSpecific(sceneId, PonderScene.TITLE_KEY, title); } /** @@ -400,7 +403,7 @@ public class SceneBuilder { public void destroyBlock(BlockPos pos) { setBlock(pos, Blocks.AIR.getDefaultState(), true); } - + public void setBlock(BlockPos pos, BlockState state, boolean spawnParticles) { setBlocks(scene.getSceneBuildingUtil().select.position(pos), state, spawnParticles); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java index 3df881334..7bdb8d506 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java @@ -20,7 +20,7 @@ import net.minecraft.util.math.BlockPos; public class BeltScenes { public static void beltsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Encasing Belts"); + scene.title("belt_casing", "Encasing Belts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); scene.idle(5); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java new file mode 100644 index 000000000..841646d57 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java @@ -0,0 +1,259 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; +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.TextWindowElement.Builder; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; + +public class ChainDriveScenes { + + public static void chainDriveAsRelay(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("chain_drive", "Relaying rotational force with Chain Drives"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + BlockPos gaugePos = util.grid.at(0, 1, 3); + Selection gauge = util.select.position(gaugePos); + scene.world.showSection(gauge, Direction.UP); + scene.world.setKineticSpeed(gauge, 0); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(5, 1, 2, 4, 1, 2), Direction.DOWN); + scene.idle(10); + + for (int i = 0; i < 3; i++) { + scene.idle(5); + scene.world.showSection(util.select.position(3, 1, 2 - i), Direction.DOWN); + if (i != 0) + scene.world.showSection(util.select.position(3, 1, 2 + i), Direction.DOWN); + } + + scene.idle(10); + scene.world.showSection(util.select.position(gaugePos.east(2)), Direction.DOWN); + scene.idle(5); + scene.world.showSection(util.select.position(gaugePos.east()), Direction.DOWN); + scene.idle(5); + + scene.world.setKineticSpeed(gauge, 64); + scene.effects.indicateSuccess(gaugePos); + scene.idle(20); + scene.overlay.showText(60) + .text("Chain Drives relay rotation to each other in a row") + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 4), Direction.WEST)); + scene.idle(60); + + Selection shafts = util.select.fromTo(2, 1, 0, 2, 1, 1); + BlockPos rotatedECD = util.grid.at(3, 1, 0); + Selection verticalShaft = util.select.fromTo(rotatedECD.up(), rotatedECD.up(2)); + + scene.world.showSection(shafts, Direction.EAST); + scene.idle(10); + scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 0)); + scene.effects.rotationDirectionIndicator(util.grid.at(2, 1, 1)); + scene.idle(20); + scene.overlay.showText(60) + .text("All shafts connected like this will rotate in the same direction") + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 1), Direction.WEST)); + scene.idle(50); + scene.world.hideSection(shafts, Direction.WEST); + scene.idle(25); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(rotatedECD), Pointing.DOWN).rightClick() + .withWrench(), 30); + scene.idle(7); + scene.world.modifyBlock(rotatedECD, s -> s.with(EncasedBeltBlock.AXIS, Axis.Y), true); + scene.idle(40); + + scene.world.showSection(verticalShaft, Direction.DOWN); + scene.idle(10); + + scene.effects.rotationDirectionIndicator(util.grid.at(3, 3, 0)); + scene.idle(10); + scene.overlay.showText(60) + .text("Any part of the row can be rotated by 90 degrees") + .placeNearTarget() + .pointAt(util.vector.centerOf(3, 2, 0)); + + scene.markAsFinished(); + } + + public static void adjustableChainGearshift(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("chain_gearshift", "Controlling rotational speed with Chain Gearshifts"); + scene.configureBasePlate(0, 0, 7); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos leverPos = util.grid.at(3, 1, 0); + BlockPos eastDrive = util.grid.at(3, 1, 2); + + BlockPos eastGauge = eastDrive.up(3); + BlockPos middleGauge = eastGauge.west() + .down(); + BlockPos westGauge = eastGauge.west(2) + .down(2); + + ElementLink lever = + scene.world.showIndependentSection(util.select.fromTo(leverPos, leverPos.south()), Direction.UP); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 2, 3), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.fromTo(eastDrive, eastDrive.west(2)) + .add(util.select.position(eastDrive.up())), Direction.DOWN); + scene.idle(10); + + scene.overlay.showText(60) + .text("Unpowered Chain Gearshifts behave exacly like Chain Drives") + .placeNearTarget() + .pointAt(util.vector.blockSurface(eastDrive, Direction.NORTH)); + scene.idle(60); + + scene.world.showSection(util.select.fromTo(eastGauge, eastGauge.down()), Direction.DOWN); + scene.idle(5); + scene.world.showSection(util.select.fromTo(middleGauge, middleGauge.down()), Direction.DOWN); + scene.idle(5); + scene.world.showSection(util.select.position(westGauge), Direction.DOWN); + scene.idle(5); + + for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { + scene.idle(5); + scene.overlay.showText(50) + .sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16") + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + } + + scene.idle(60); + + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.down(), middleGauge), f -> 2 * f); + + scene.idle(10); + + AxisAlignedBB bb = new AxisAlignedBB(eastDrive); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb, 160); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.FAST, eastDrive.west(), bb.offset(-2, 0, 0) + .expand(15 / 16f, 0, 0), 160); + scene.idle(20); + + scene.overlay.showText(80) + .text("When Powered, the speed transmitted to other Chain Drives in the row is doubled") + .placeNearTarget() + .colored(PonderPalette.FAST) + .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + scene.idle(80); + + for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { + scene.idle(5); + scene.overlay.showText(70) + .sharedText(gauge == eastGauge ? "rpm16_source" : "rpm32") + .colored(gauge == eastGauge ? PonderPalette.MEDIUM : PonderPalette.FAST) + .placeNearTarget() + .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + } + + scene.idle(80); + + scene.world.hideSection(util.select.fromTo(eastDrive, eastDrive.west(2)), Direction.SOUTH); + scene.idle(15); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + Selection newDriveSelect = util.select.fromTo(eastDrive.south(2), eastDrive.south(2) + .west(2)); + ElementLink drives = scene.world.showIndependentSection(newDriveSelect, Direction.NORTH); + scene.world.modifyKineticSpeed(util.select.fromTo(westGauge.down(), middleGauge), f -> .5f * f); + scene.world.setKineticSpeed(newDriveSelect, -32); + scene.world.moveSection(drives, util.vector.of(0, 0, -2), 0); + scene.world.moveSection(lever, util.vector.of(-2, 0, 0), 10); + + scene.idle(40); + + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(1))); + scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); + BlockPos analogPos = leverPos.west(2); + scene.effects.indicateRedstone(analogPos); + scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .5f * f); + + scene.idle(10); + + bb = new AxisAlignedBB(eastDrive); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, eastDrive, bb.expand(-15 / 16f, 0, 0), 160); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.SLOW, eastDrive.west(), bb.offset(-2, 0, 0), 160); + scene.idle(20); + + scene.overlay.showText(80) + .text("Whenever the Powered Gearshift is not at the source, its speed will be halved instead") + .placeNearTarget() + .colored(PonderPalette.SLOW) + .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + scene.idle(80); + + for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { + scene.idle(5); + scene.overlay.showText(180) + .sharedText(gauge == westGauge ? "rpm8" : gauge == eastGauge ? "rpm16_source" : "rpm16") + .colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM) + .placeNearTarget() + .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + } + + scene.idle(80); + + scene.overlay.showText(100) + .text("In both cases, Chain Drives in the row always run at 2x the speed of the Powered Gearshift") + .placeNearTarget() + .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + scene.idle(100); + + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.south(2))); + scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); + scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> 2f * f); + scene.world.hideIndependentSection(lever, Direction.UP); + scene.idle(15); + + scene.world.showSection(util.select.fromTo(analogPos, analogPos.south()), Direction.DOWN); + + scene.idle(15); + scene.world.modifyTileNBT(util.select.position(analogPos), AnalogLeverTileEntity.class, nbt -> { + nbt.putInt("State", 8); + }); + scene.world.modifyBlock(analogPos.south(), s -> s.with(RedstoneWireBlock.POWER, 8), false); + scene.world.toggleRedstonePower(util.select.position(1, 1, 4)); + scene.world.modifyKineticSpeed(util.select.position(westGauge), f -> .75f * f); + scene.effects.indicateRedstone(analogPos); + + scene.idle(20); + + scene.overlay.showText(100) + .text("Using analog signals, the ratio can be adjusted more precisely between 1 and 2") + .placeNearTarget() + .pointAt(util.vector.blockSurface(eastDrive.west(2), Direction.WEST)); + scene.idle(40); + + for (BlockPos gauge : new BlockPos[] { eastGauge, middleGauge, westGauge }) { + scene.idle(5); + Builder builder = scene.overlay.showText(180) + .colored(gauge == westGauge ? PonderPalette.SLOW : PonderPalette.MEDIUM) + .placeNearTarget() + .pointAt(util.vector.blockSurface(gauge, Direction.NORTH)); + if (gauge == westGauge) + builder.text("12 RPM"); + else + builder.sharedText(gauge == eastGauge ? "rpm16_source" : "rpm16"); + } + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java index 9b77055b5..da89236c3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DebugScenes.java @@ -55,13 +55,13 @@ public class DebugScenes { } public static void empty(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Missing Content"); + scene.title("debug_empty", "Missing Content"); scene.showBasePlate(); scene.idle(5); } public static void coordinateScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Coordinate Space"); + scene.title("debug_coords", "Coordinate Space"); scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); @@ -86,7 +86,7 @@ public class DebugScenes { } public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Changing Blocks"); + scene.title("debug_blocks", "Changing Blocks"); scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); @@ -104,7 +104,7 @@ public class DebugScenes { } public static void fluidsScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Showing Fluids"); + scene.title("debug_fluids", "Showing Fluids"); scene.showBasePlate(); scene.idle(10); Vec3d parrotPos = util.vector.topOf(1, 0, 1); @@ -144,7 +144,7 @@ public class DebugScenes { } public static void offScreenScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Out of bounds / configureBasePlate"); + scene.title("debug_baseplate", "Out of bounds / configureBasePlate"); scene.configureBasePlate(1, 0, 6); scene.showBasePlate(); @@ -168,7 +168,7 @@ public class DebugScenes { } public static void particleScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Emitting particles"); + scene.title("debug_particles", "Emitting particles"); scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); @@ -191,7 +191,7 @@ public class DebugScenes { } public static void controlsScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Basic player interaction"); + scene.title("debug_controls", "Basic player interaction"); scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layer(1), Direction.DOWN); @@ -276,7 +276,7 @@ public class DebugScenes { } public static void birbScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Birbs"); + scene.title("debug_birbs", "Birbs"); scene.showBasePlate(); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); @@ -320,7 +320,7 @@ public class DebugScenes { } public static void sectionsScene(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Sections"); + scene.title("debug_sections", "Sections"); scene.showBasePlate(); scene.idle(10); scene.rotateCameraY(95); @@ -387,8 +387,8 @@ public class DebugScenes { } public static void itemScene(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("debug_items", "Manipulating Items"); scene.configureBasePlate(0, 0, 6); - scene.title("Manipulating Items"); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(10); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java index eeb6c80c7..f6fee510c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FunnelScenes.java @@ -31,7 +31,7 @@ import net.minecraftforge.items.ItemHandlerHelper; public class FunnelScenes { public static void intro(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Using funnels"); + scene.title("funnel_intro", "Using funnels"); scene.configureBasePlate(0, 1, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); @@ -106,7 +106,7 @@ public class FunnelScenes { } public static void directionality(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Direction of Transfer"); + scene.title("funnel_direction", "Direction of Transfer"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> f / 2f); @@ -245,7 +245,7 @@ public class FunnelScenes { } public static void compat(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Funnel compatibility"); + scene.title("funnel_compat", "Funnel compatibility"); scene.configureBasePlate(0, 0, 5); BlockPos sawFunnel = util.grid.at(4, 2, 1); @@ -301,7 +301,7 @@ public class FunnelScenes { } public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Redstone control"); + scene.title("funnel_redstone", "Redstone control"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -343,7 +343,7 @@ public class FunnelScenes { } public static void brass(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("The Brass Funnel"); + scene.title("brass_funnel", "The Brass Funnel"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -449,7 +449,7 @@ public class FunnelScenes { } public static void transposer(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Direct transfer"); + scene.title("funnel_transfer", "Direct transfer"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java index 4616347a5..152d7c781 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java @@ -24,7 +24,10 @@ public class GantryScenes { } private static void intro(SceneBuilder scene, SceneBuildingUtil util, boolean pinion) { - scene.title("Using Gantry " + (pinion ? "Carriages" : "Shafts")); + String id = "gantry_" + (pinion ? "carriage" : "shaft"); + String title = "Using Gantry " + (pinion ? "Carriages" : "Shafts"); + scene.title(id, title); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -83,7 +86,7 @@ public class GantryScenes { } public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Gantry Power Propagation"); + scene.title("gantry_redstone", "Gantry Power Propagation"); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); Selection leverRedstone = util.select.fromTo(3, 1, 0, 3, 1, 1); @@ -136,7 +139,7 @@ public class GantryScenes { } public static void direction(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Gantry Movement Direction"); + scene.title("gantry_direction", "Gantry Movement Direction"); scene.configureBasePlate(0, 0, 5); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -236,7 +239,7 @@ public class GantryScenes { } public static void subgantry(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Cascaded Gantries"); + scene.title("gantry_cascaded", "Cascaded Gantries"); scene.configureBasePlate(0, 0, 5); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); scene.world.showSection(util.select.layer(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 957d5cd4c..b79949c81 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 @@ -22,17 +22,8 @@ import net.minecraft.util.math.Vec3i; public class KineticsScenes { - public static void template(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("This is a template"); - scene.showBasePlate(); - scene.idle(10); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); - } - - // - public static void shaftAsRelay(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Relaying rotational force using Shafts"); + scene.title("shaft", "Relaying rotational force using Shafts"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -64,7 +55,7 @@ public class KineticsScenes { } public static void shaftsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Encasing Shafts"); + scene.title("shaft_casing", "Encasing Shafts"); scene.configureBasePlate(0, 0, 5); scene.showBasePlate(); @@ -103,7 +94,7 @@ public class KineticsScenes { } public static void cogAsRelay(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Relaying rotational force using Cogwheels"); + scene.title("cogwheel", "Relaying rotational force using Cogwheels"); scene.configureBasePlate(0, 0, 5); BlockPos gauge = util.grid.at(4, 1, 1); Selection gaugeSelect = util.select.position(gauge); @@ -142,7 +133,7 @@ public class KineticsScenes { } public static void largeCogAsRelay(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Relaying rotational force using Large Cogwheels"); + scene.title("large_cogwheel", "Relaying rotational force using Large Cogwheels"); scene.configureBasePlate(1, 1, 5); scene.world.setBlock(util.grid.at(4, 2, 3), AllBlocks.LARGE_COGWHEEL.getDefaultState() .with(CogWheelBlock.AXIS, Axis.X), false); @@ -190,7 +181,7 @@ public class KineticsScenes { } public static void cogsSpeedUp(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Gearshifting with Cogs"); + scene.title("cog_speedup", "Gearshifting with Cogs"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -281,7 +272,7 @@ public class KineticsScenes { } public static void gearbox(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Relaying rotational force using Gearboxes"); + scene.title("gearbox", "Relaying rotational force using Gearboxes"); scene.configureBasePlate(1, 1, 5); scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP); @@ -360,7 +351,7 @@ public class KineticsScenes { } public static void clutch(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Controlling rotational force using a Clutch"); + scene.title("clutch", "Controlling rotational force using a Clutch"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); BlockPos leverPos = util.grid.at(3, 1, 0); @@ -411,7 +402,7 @@ public class KineticsScenes { } public static void gearshift(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Controlling rotational force using a Gearshift"); + scene.title("gearshift", "Controlling rotational force using a Gearshift"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); BlockPos leverPos = util.grid.at(3, 1, 0); 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 e4d7aeb4a..5203f0756 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 @@ -21,7 +21,7 @@ import net.minecraft.util.math.Vec3d; public class MovementActorScenes { public static void psiTransfer(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Contraption Storage Exchange"); + scene.title("portable_storage_interface", "Contraption Storage Exchange"); scene.configureBasePlate(0, 0, 8); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -147,7 +147,7 @@ public class MovementActorScenes { } public static void psiRedstone(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("Redstone Control"); + scene.title("portable_storage_interface_redstone", "Redstone Control"); scene.configureBasePlate(0, 0, 6); Class psiClass = PortableItemInterfaceTileEntity.class; 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 9999385fa..d6e096029 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 @@ -36,6 +36,11 @@ public class PonderIndex { PonderRegistry.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch); PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift); + PonderRegistry.addStoryBoard(AllBlocks.ENCASED_CHAIN_DRIVE, "chain_drive/relay", + ChainDriveScenes::chainDriveAsRelay); + PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) + .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); + // 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/ponder/content/SharedText.java b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java index aaa9bf6af..c7e2ed679 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/SharedText.java @@ -12,6 +12,7 @@ public class SharedText { add("rpm8", "8 RPM"); add("rpm16", "16 RPM"); + add("rpm16_source", "Source: 16 RPM"); add("rpm32", "32 RPM"); add("movement_anchors", "With the help of Chassis or Super Glue, larger structures can be moved."); diff --git a/src/main/resources/ponder/chain_drive/gearshift.nbt b/src/main/resources/ponder/chain_drive/gearshift.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f9176ac827268165f9eb1a3c839912bcbcd49813 GIT binary patch literal 985 zcmV;~119_*iwFP!000000L56rlH)WGl`T1wWM-KuSc)xf99TF}9G8KDqJ{%prl=a& z0xm{lcN{T}<&u;Q!)d>TkKhBi@fFV z0+bNa{1W>cks(w@7y+6zZA1pwrOa;h7;iop5n4-a2W=W9i8kE8dc?L(YZ6 z2H>y&9NVG}oXBJ2;=}9f z{{!}^FDsFwHrgMJQ9m@^+eIVx&|n@K6oEy7StW;a8t&xu#L6fCX^zocmyp);vV_|< zULUvdq8?sJV0v)Kg)F5apZ)rG0If$Iw9wUaUe4juzyA1hMe+4DMcp`*GccfBa_@#{ zFLuZc`qSQcXP(})B*d)79NmZtjL7z0L$Qa)QGYy=o_M_Pi0wz8*jygNhY{Ox-(q{Z zYbC|De;BdtuGe8n3aSV$k5IAw-xa}<`=pB;+mWQtUml#KxS!p~E~IB|3(3BIY`-#% z92#vKP)8gsTQ}|4x=F~Mw`0?4*=o1lj(aCZJzkFcQv&U|rhe2V1(%1rT>k|R)-#Xu zE*`PNd9rZD33#Z(wbGg%=Y9AqsX-&yENF4EJF309^}H3VE2rYtD>m}{#3L~)cyE>>^l$t}`yy3ZkEyJaA5`DPw^VXdo3`!d`OBX^xbK3L;H~cv$Eo6lo^l#)J5$P6O HEEWI&K0Mui literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/chain_drive/relay.nbt b/src/main/resources/ponder/chain_drive/relay.nbt new file mode 100644 index 0000000000000000000000000000000000000000..94eba9f2b4c048be969b27f468827ceecdc3bd7e GIT binary patch literal 768 zcmV+b1ONOViwFP!000000L_=(ZqqOn$4_FXOVa@p8WQ3OxZ?AQiGjqpU^f%e!~{qX zyyUdCmd26o(v7P<3lG6HTyn=7z%?%cPSVQIi#SixAr?BcRwn?G?rIOb?F=z~G4xy6GPi2@$D1rRmQDamTc`&@?s?#Eu#81q zAG|uuh3U3weB*YFg1Z?5EPn^@&l3+C+ghSJYI`4C9>c9jq7hqDyq6^y?(q~gj{;*U z`Z6+yhx69hJ}~n;Gq0KXy_rAMngRDXU_T zi(qU*8G{rU<`n+5e(`iXJuMyM5-oAi#pPI^#6cvL-J6C6dGJM(Gt>G?QUn}?^hc^PAA;V>TBVz^g@VOLd;rg6|3j!Uho zvvEx9@+yaK$zfbJL?R?S|N8HOOlGMamh|!2-=Dva_-+<_`GTT{8f6vkUL{GN>fZKp zxboXobMcaNe;S8V!?A$HRz1T`aJcj3XkPMBOy+Zj%?aZ~HVTaLdwgJQmNJ&0)|h`< zw|t;mtcP&BXL24%v(DO}%Qc3PNX;&cQ(>`sY@t#y2#4S2Mlg6SMTRo}boZe(Fzd)f zbUGM=*Jg=AnL!I9*^S$uOf2$*4T}< y>5H@jZa=Hr9@Vmcyt|qwMLjyfG@cnZf!0f=*$zs@MQS?p8~g_nEM!l>5&!^ Date: Sun, 7 Mar 2021 17:22:18 +0100 Subject: [PATCH 21/23] Ponder me this - auto-backtracking is now more generic and works for tag screens - Ponder entries for water wheel, motor, hand crank and valves --- .../foundation/gui/AbstractSimiScreen.java | 4 + .../create/foundation/gui/ScreenOpener.java | 30 ++- .../create/foundation/ponder/PonderUI.java | 9 +- .../ponder/content/KineticsScenes.java | 241 +++++++++++++++++- .../ponder/content/PonderIndex.java | 7 + .../ponder/content/PonderTagScreen.java | 7 + src/main/resources/ponder/creative_motor.nbt | Bin 0 -> 550 bytes src/main/resources/ponder/hand_crank.nbt | Bin 0 -> 470 bytes src/main/resources/ponder/valve_handle.nbt | Bin 0 -> 480 bytes src/main/resources/ponder/water_wheel.nbt | Bin 0 -> 734 bytes 10 files changed, 282 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/ponder/creative_motor.nbt create mode 100644 src/main/resources/ponder/hand_crank.nbt create mode 100644 src/main/resources/ponder/valve_handle.nbt create mode 100644 src/main/resources/ponder/water_wheel.nbt diff --git a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java index fcfba6f34..874bfeba7 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -275,5 +275,9 @@ public abstract class AbstractSimiScreen extends Screen { double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); centerScalingOn((int) mouseX, (int) mouseY); } + + public boolean isEquivalentTo(AbstractSimiScreen other) { + return false; + } } diff --git a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java index 0a3f77489..82f736791 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -7,7 +7,6 @@ import java.util.List; import javax.annotation.Nullable; -import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.utility.LerpedFloat; import net.minecraft.client.Minecraft; @@ -49,24 +48,27 @@ public class ScreenOpener { // transitions are only supported in simiScreens atm. they take care of all the // rendering for it public static void transitionTo(AbstractSimiScreen screen) { - - List screenHistory = getScreenHistory(); - if (!screenHistory.isEmpty()) { - Screen previouslyRenderedScreen = screenHistory.get(0); - if (screen instanceof PonderUI && previouslyRenderedScreen instanceof PonderUI) { - if (((PonderUI) screen).getSubject() - .isItemEqual(((PonderUI) previouslyRenderedScreen).getSubject())) { - openPreviousScreen(Minecraft.getInstance().currentScreen); - return; - } - } - } - + if (tryBackTracking(screen)) + return; screen.transition.startWithValue(0.1) .chase(1, .4f, LerpedFloat.Chaser.EXP); open(screen); } + private static boolean tryBackTracking(AbstractSimiScreen screen) { + List screenHistory = getScreenHistory(); + if (screenHistory.isEmpty()) + return false; + Screen previouslyRenderedScreen = screenHistory.get(0); + if (!(previouslyRenderedScreen instanceof AbstractSimiScreen)) + return false; + if (!screen.isEquivalentTo((AbstractSimiScreen) previouslyRenderedScreen)) + return false; + + openPreviousScreen(Minecraft.getInstance().currentScreen); + return true; + } + public static void clearStack() { backStack.clear(); } 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 6118475b1..5a41bc869 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -97,7 +97,7 @@ public class PonderUI extends AbstractSimiScreen { stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); else stack = new ItemStack(ForgeRegistries.BLOCKS.getValue(component)); - + tags = new ArrayList<>(PonderRegistry.tags.getTags(component)); this.scenes = scenes; if (scenes.isEmpty()) { @@ -727,4 +727,11 @@ public class PonderUI extends AbstractSimiScreen { return stack; } + @Override + public boolean isEquivalentTo(AbstractSimiScreen other) { + if (other instanceof PonderUI) + return stack.isItemEqual(((PonderUI) other).stack); + return super.isEquivalentTo(other); + } + } 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 b79949c81..28ff3e051 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,6 +1,8 @@ package com.simibubi.create.foundation.ponder.content; 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.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; @@ -15,9 +17,12 @@ import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.block.BlockState; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i; public class KineticsScenes { @@ -431,7 +436,7 @@ public class KineticsScenes { scene.effects.rotationDirectionIndicator(gearshift.east(2)); scene.effects.rotationDirectionIndicator(gearshift.west(2)); scene.idle(30); - + scene.overlay.showText(50) .colored(PonderPalette.RED) .placeNearTarget() @@ -448,4 +453,238 @@ public class KineticsScenes { } } + public static void creativeMotor(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("creative_motor", "Generating Rotational Force using Creative Motors"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos motor = util.grid.at(3, 1, 2); + + for (int i = 0; i < 3; i++) { + scene.idle(5); + scene.world.showSection(util.select.position(1 + i, 1, 2), Direction.DOWN); + } + + scene.idle(10); + scene.effects.rotationSpeedIndicator(motor); + scene.overlay.showText(50) + .text("Creative motors are a compact and configurable source of Rotational Force") + .placeNearTarget() + .pointAt(util.vector.topOf(motor)); + scene.idle(50); + + scene.rotateCameraY(90); + scene.idle(20); + + Vec3d blockSurface = util.vector.blockSurface(motor, Direction.EAST); + AxisAlignedBB point = new AxisAlignedBB(blockSurface, blockSurface); + AxisAlignedBB expanded = point.grow(1 / 16f, 1 / 5f, 1 / 5f); + + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, point, 1); + scene.idle(1); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, blockSurface, expanded, 60); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll(), 60); + scene.idle(20); + + scene.overlay.showText(50) + .text("Scrolling on the back panel changes the RPM of the motors' rotational output") + .placeNearTarget() + .pointAt(blockSurface); + scene.idle(10); + scene.world.modifyKineticSpeed(util.select.fromTo(1, 1, 2, 3, 1, 2), f -> 4 * f); + scene.idle(50); + + scene.effects.rotationSpeedIndicator(motor); + scene.rotateCameraY(-90); + } + + public static void waterWheel(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("water_wheel", "Generating Rotational Force using Water Wheels"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(4, 1, 1, 4, 3, 3) + .add(util.select.fromTo(3, 1, 3, 3, 2, 3)), Direction.DOWN); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + + BlockPos gaugePos = util.grid.at(0, 2, 2); + + for (int i = 0; i < 4; i++) { + scene.idle(5); + scene.world.showSection(util.select.fromTo(gaugePos.east(i) + .down(), gaugePos.east(i)), Direction.DOWN); + } + + scene.idle(10); + + for (int i = 0; i < 3; i++) { + scene.idle(5); + scene.world.showSection(util.select.position(3, 3, 3 - i), Direction.DOWN); + } + scene.world.setKineticSpeed(util.select.everywhere(), -12); + scene.effects.indicateSuccess(gaugePos); + for (int i = 0; i < 2; i++) { + scene.idle(5); + scene.world.showSection(util.select.position(3, 2 - i, 1), Direction.DOWN); + } + + BlockPos wheel = util.grid.at(3, 2, 2); + scene.effects.rotationSpeedIndicator(wheel); + scene.overlay.showText(50) + .text("Water Wheels draw force from adjacent Water Currents") + .placeNearTarget() + .pointAt(util.vector.topOf(wheel)); + scene.idle(50); + + AxisAlignedBB bb = new AxisAlignedBB(wheel).grow(.125f, 0, 0); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 1.2, 0) + .contract(0, .75, 0), 80); + scene.idle(5); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 0, 1.2) + .contract(0, 0, .75), 80); + scene.idle(5); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, -1.2, 0) + .contract(0, -.75, 0), 80); + scene.idle(5); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.MEDIUM, new Object(), bb.offset(0, 0, -1.2) + .contract(0, 0, -.75), 80); + scene.idle(5); + scene.overlay.showText(50) + .text("The more faces are powered, the faster the Water Wheel will rotate") + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .pointAt(util.vector.topOf(wheel)); + + scene.idle(80); + scene.rotateCameraY(-30); + scene.overlay.showText(70) + .text("The Wheels' blades should be oriented against the flow") + .placeNearTarget() + .pointAt(util.vector.topOf(wheel)); + scene.idle(80); + + ElementLink water = scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 1, 3, 3, 1) + .add(util.select.fromTo(3, 3, 2, 3, 3, 3))); + ElementLink wheelElement = scene.world.makeSectionIndependent(util.select.position(wheel)); + + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world.moveSection(water, util.vector.of(0, 2, -2), 10); + scene.world.moveSection(wheelElement, util.vector.of(0, 1, -1), 10); + scene.idle(10); + scene.world.rotateSection(wheelElement, 0, 180, 0, 5); + scene.idle(10); + scene.world.modifyBlock(wheel, s -> s.with(WaterWheelBlock.HORIZONTAL_FACING, Direction.WEST), false); + scene.world.rotateSection(wheelElement, 0, -180, 0, 0); + scene.idle(1); + scene.world.moveSection(water, util.vector.of(0, -2, 2), 10); + scene.world.moveSection(wheelElement, util.vector.of(0, -1, 1), 10); + scene.idle(10); + scene.world.setKineticSpeed(util.select.everywhere(), -8); + + scene.overlay.showText(70) + .colored(PonderPalette.RED) + .text("Facing the opposite way, they will not be as effective") + .placeNearTarget() + .pointAt(util.vector.topOf(wheel)); + scene.idle(80); + + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world.moveSection(water, util.vector.of(0, 2, -2), 10); + scene.world.moveSection(wheelElement, util.vector.of(0, 1, -1), 10); + scene.idle(10); + scene.rotateCameraY(30); + scene.world.rotateSection(wheelElement, 0, 180, 0, 5); + scene.idle(10); + scene.world.modifyBlock(wheel, s -> s.with(WaterWheelBlock.HORIZONTAL_FACING, Direction.EAST), false); + scene.world.rotateSection(wheelElement, 0, -180, 0, 0); + scene.idle(1); + scene.world.moveSection(water, util.vector.of(0, -2, 2), 10); + scene.world.moveSection(wheelElement, util.vector.of(0, -1, 1), 10); + scene.idle(10); + scene.world.setKineticSpeed(util.select.everywhere(), -12); + scene.effects.indicateSuccess(gaugePos); + } + + public static void handCrank(SceneBuilder scene, SceneBuildingUtil util) { + manualSource(scene, util, true); + } + + public static void valveHandle(SceneBuilder scene, SceneBuildingUtil util) { + manualSource(scene, util, false); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.idle(20); + Vec3d centerOf = util.vector.centerOf(2, 2, 2); + scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() + .withItem(new ItemStack(Items.BLUE_DYE)), 40); + scene.idle(7); + scene.world.modifyBlock(util.grid.at(2, 2, 2), s -> AllBlocks.DYED_VALVE_HANDLES[11].getDefaultState() + .with(ValveHandleBlock.FACING, Direction.UP), true); + scene.idle(10); + scene.overlay.showText(70) + .text("Valve handles can be dyed for aesthetic purposes") + .placeNearTarget() + .pointAt(centerOf); + } + + private static void manualSource(SceneBuilder scene, SceneBuildingUtil util, boolean handCrank) { + String name = handCrank ? "Hand Cranks" : "Valve Handles"; + scene.title(handCrank ? "hand_crank" : "valve_handle", "Generating Rotational Force using " + name); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos gaugePos = util.grid.at(1, 3, 3); + BlockPos handlePos = util.grid.at(2, 2, 2); + Selection handleSelect = util.select.position(handlePos); + + scene.world.showSection(util.select.layersFrom(1) + .substract(handleSelect), Direction.DOWN); + scene.idle(10); + scene.world.showSection(handleSelect, Direction.DOWN); + scene.idle(20); + + Vec3d centerOf = util.vector.centerOf(handlePos); + scene.overlay.showText(70) + .text(name + " can be used by players to apply rotational force manually") + .placeNearTarget() + .pointAt(centerOf); + scene.idle(80); + + scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.world.setKineticSpeed(util.select.everywhere(), handCrank ? 32 : 16); + scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2); + scene.effects.rotationDirectionIndicator(handlePos); + scene.effects.indicateSuccess(gaugePos); + scene.idle(10); + scene.overlay.showText(50) + .text("Hold Right-Click to rotate it Counter-Clockwise") + .placeNearTarget() + .pointAt(centerOf); + scene.idle(70); + scene.overlay.showText(50) + .colored(handCrank ? PonderPalette.MEDIUM : PonderPalette.SLOW) + .text("Its conveyed speed is " + (handCrank ? "relatively high" : "slow and precise")) + .placeNearTarget() + .pointAt(centerOf); + scene.idle(70); + + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.idle(10); + + scene.overlay.showControls(new InputWindowElement(centerOf, Pointing.DOWN).rightClick() + .whileSneaking(), 40); + scene.idle(7); + scene.world.setKineticSpeed(util.select.everywhere(), handCrank ? -32 : -16); + scene.world.modifyKineticSpeed(util.select.column(1, 3), f -> f * -2); + scene.effects.rotationDirectionIndicator(handlePos); + scene.effects.indicateSuccess(gaugePos); + scene.idle(10); + scene.overlay.showText(90) + .text("Sneak and Hold Right-Click to rotate it Clockwise") + .placeNearTarget() + .pointAt(centerOf); + scene.idle(90); + } + } 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 d6e096029..8b763c330 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 @@ -36,6 +36,13 @@ public class PonderIndex { PonderRegistry.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch); PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift); + PonderRegistry.addStoryBoard(AllBlocks.CREATIVE_MOTOR, "creative_motor", KineticsScenes::creativeMotor); + PonderRegistry.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel); + PonderRegistry.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank); + PonderRegistry.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle); + PonderRegistry.forComponents(AllBlocks.DYED_VALVE_HANDLES) + .addStoryBoard("valve_handle", KineticsScenes::valveHandle); + PonderRegistry.addStoryBoard(AllBlocks.ENCASED_CHAIN_DRIVE, "chain_drive/relay", ChainDriveScenes::chainDriveAsRelay); PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java index 7d78287f2..822f0e59b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderTagScreen.java @@ -285,4 +285,11 @@ public class PonderTagScreen extends AbstractSimiScreen { return super.mouseClicked(x, y, button); } + @Override + public boolean isEquivalentTo(AbstractSimiScreen other) { + if (other instanceof PonderTagScreen) + return tag == ((PonderTagScreen) other).tag; + return super.isEquivalentTo(other); + } + } diff --git a/src/main/resources/ponder/creative_motor.nbt b/src/main/resources/ponder/creative_motor.nbt new file mode 100644 index 0000000000000000000000000000000000000000..58a94c9d1c80beb7244526f282becf24d514f9da GIT binary patch literal 550 zcmV+>0@?i^iwFP!000000Iik5j?*v@h9|buO|u|X2qX@i;T?KFLW>YwDx``PwIZ7lmx`0ZY-O>C89&|BRdzU<|^l@5lkbUol^cohLY^8lZZad-en1aP_~0(=$$J|E-o0FD^s zq`>P77ehR65R03wuba&1*6tpBY6{Bq<8-D=ZD8?hk;2Ig-A0>r49S^nWUkz|_gmjY z%;^yD?F6t71#R*tjGAc-qq#F^_eTJ=I+taOuiM+}1ehw|Np6suOs#LID|Bd5D$%XU z=|qV>Q_)L`3yM>UUns7IjEs6i!~(?y2x3PB?L|E6M5wAMFc3 zpN=So$8U-Pi|+4tTR#{NYU6M^&y6n2-7BL9lfBwUcWNu`Xej=k#l8eVIVX)Q(K+-- zf1H4r$qM0lMMmXDF5Prw)=jNBk4z@8#MmYlE7$5YU&lR zwn<Yx{_{8c0ql`Z0{iX{8l=7j>alo(@gz<-=Zmhe^v(o02NdOhyVZp literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/hand_crank.nbt b/src/main/resources/ponder/hand_crank.nbt new file mode 100644 index 0000000000000000000000000000000000000000..2057ec7005da01003870d90dffe794d73db0c05d GIT binary patch literal 470 zcmV;{0V)0;iwFP!000000JW9RYTPgo#>bMp@ooxDLJK|hCH9tUd+8+Gsf=gk|L&DNxan@!>TiI)5mS=RR#^^*#6& zL-$K4;POB^!TP$UedSwiBT~KoX(D9LBWkeD>QHw|^`SwuQ`TauE8}VqPwiMa^ZEQ$ z2k(2%TiQIzyI}?mx$;)~x$_}41zdI2rMBMH<<^9ldhSS@o2Z1#uR7@m4AFQ;v;PIZ M0dbK5Tb>610HJ~Dp8x;= literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/valve_handle.nbt b/src/main/resources/ponder/valve_handle.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fe6af755d6d520bed8e4c7eda9b5eb2b5583938e GIT binary patch literal 480 zcmV<60U!P!iwFP!000000JW9DYTPgohR2q?@ooxDOADokK1i; z?&^kqhW^2Ax24Lggj{doeeIF%u7f^w2CKcc7^VINMY^?L!>66K!d<0xrL( WsP51Q?JT_nzu^z~#ma@J2LJ#~Q}6!( literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/water_wheel.nbt b/src/main/resources/ponder/water_wheel.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8c45937dd040b505a3f66cb5d481e743521bc9c4 GIT binary patch literal 734 zcmV<40wMh$iwFP!000000L@n2ZqqOnK8c++%|MJl2?=-yKwM0lggOl&aZ`aNCdN(W zCa0~nG>&YS46gQ6T*LG55a4Wa7osHf1Q%FJo!Z~|&iQ*Blj;Z3Kf^D&jL0nLjT_Kysn1(WVgylx7+$i#o<@!FUaf@4!PGc&HF3RuSXYkz}V(Hea2sZ`jt;r#!`NI9hg|gW*hU@p z1$EdLeLTd0hdS_B?X*Wbalp`4OavsG=>US`95MMZE@RxCm{)Z<@F7nOvOH>zL@Fel z{yL3dI6++qc@{u;#BvsM{pDy}lG9^z8I>+5_-_+{;TQ(vg8&A{TB5qTij1ohmag&D z-us^+_&kAou|(r!UzHBU3N^~en25EE&CTY0G)9k2e`@*z(|H#Bt=_m_gM zL_D-2_$p6vdd4%5X$uTGnXL zaS+!p`(X#qHVkQC!VXM5o>2#;e#k}!Gt60vT4VWrxf24Nuoc3im8qUsvbo+bmR#dB z7MWQ$V`LEzt`RB|#q{zcbu)YSdUnR76}ZGV5;T%I+B({sL8i;ne0?77MMUVXQ@JCUGjo=z9G70 ziIyhru8^*(u<5&2OijZe#m{Ec+uIo3sVy#RiPl=YxUt3a8(Tc Date: Sun, 7 Mar 2021 21:52:11 +0100 Subject: [PATCH 22/23] Belts - Ponder scenes for the belt --- src/generated/resources/.cache/cache | 28 +- .../create/blockstates/radial_chassis.json | 24 +- .../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 ++- .../create/foundation/ponder/PonderUI.java | 17 +- .../foundation/ponder/SceneBuilder.java | 51 ++- .../foundation/ponder/content/BeltScenes.java | 357 +++++++++++++++++- .../ponder/content/PonderIndex.java | 5 + .../ponder/elements/ParrotElement.java | 48 ++- .../AnimateElementInstruction.java | 57 +++ .../AnimateParrotInstruction.java | 28 ++ .../AnimateWorldSectionInstruction.java | 43 +-- .../ponder/instructions/LineInstruction.java | 30 ++ src/main/resources/ponder/belt/connect.nbt | Bin 0 -> 755 bytes src/main/resources/ponder/belt/directions.nbt | Bin 0 -> 751 bytes src/main/resources/ponder/belt/transport.nbt | Bin 0 -> 810 bytes 27 files changed, 1187 insertions(+), 110 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateParrotInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/LineInstruction.java create mode 100644 src/main/resources/ponder/belt/connect.nbt create mode 100644 src/main/resources/ponder/belt/directions.nbt create mode 100644 src/main/resources/ponder/belt/transport.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index ea00f774d..9e68afabc 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -337,7 +337,7 @@ e8b0a401c10d1ba67ed71ba31bd5f9bc28571b65 assets/create/blockstates/powered_toggl d06cd9a1101b18d306a786320aab12018b1325d6 assets/create/blockstates/purple_sail.json 92957119abd5fbcca36a113b2a80255fd70fc303 assets/create/blockstates/purple_seat.json 61035f8afe75ff7bbd291da5d8690bcbebe679eb assets/create/blockstates/purple_valve_handle.json -d2e6f19325be65457e94bea44fd52863c0f66be7 assets/create/blockstates/radial_chassis.json +6fa36883e76e9e403bb429c8f86b8c0d3bba0cff assets/create/blockstates/radial_chassis.json 45877c4d90a7185c2f304edbd67379d800920439 assets/create/blockstates/red_sail.json da1b08387af7afa0855ee8d040f620c01f20660a assets/create/blockstates/red_seat.json 722fc77bbf387af8a4016e42cbf9501d2b968881 assets/create/blockstates/red_valve_handle.json @@ -401,19 +401,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2384c6457ecf24c7b38358179b8fa6eb93b9627a assets/create/lang/en_ud.json -1c808ec167a735945a60fdef344aaec7a1fd68d0 assets/create/lang/en_us.json -ae1ea7ce8b825405e38ed0d87b26bbcf46de3742 assets/create/lang/unfinished/de_de.json -8522f80887d94e89a87d20188a3658342de7c757 assets/create/lang/unfinished/es_es.json -e7476bbfef6254a143d999f7f1220af80ce39c8b assets/create/lang/unfinished/es_mx.json -a6516993be60550fd45e55583e6040733f70dcef assets/create/lang/unfinished/fr_fr.json -d5b30386a7a0fdbf8bcd951baa4f6000d9c1501e assets/create/lang/unfinished/it_it.json -4e5101741f7565c4450f36a37da4b3ad92af4076 assets/create/lang/unfinished/ja_jp.json -d526a4dd43baefa89c7a42b2e236ccc7b9cdf678 assets/create/lang/unfinished/ko_kr.json -6dcd80f25ecdc7ead62f1f48a6162575e2a93257 assets/create/lang/unfinished/nl_nl.json -43ff570e703a25847830e99c12722bbc4a9fb2ab assets/create/lang/unfinished/pt_br.json -3312f083a22112e786726047129476710cec0242 assets/create/lang/unfinished/ru_ru.json -25b50c546bb8b40bb8c85e8b4914fbe1bca6bdce assets/create/lang/unfinished/zh_cn.json -bddbc961a8bd12e08a8aa2b0b2329568da1b27ef assets/create/lang/unfinished/zh_tw.json +3c5716831e32264eedbb4855c5381e0e8cbfb91e assets/create/lang/en_us.json +0ea72b7657580c63fa96b869d7c9c1f7fbc8d76c assets/create/lang/unfinished/de_de.json +f8877a94811cdcd095a79016d0eab10654c1d1a1 assets/create/lang/unfinished/es_es.json +b34477d41473ee2da522cda45013dd7fa2f6f47f assets/create/lang/unfinished/es_mx.json +a4dd182d9f14556fe1b3a9c94137c679f89130e2 assets/create/lang/unfinished/fr_fr.json +694df935fc02bc5125e5ddba0b6f65c412201914 assets/create/lang/unfinished/it_it.json +952e2a7d43846e35e815dd7f37c407ffee566634 assets/create/lang/unfinished/ja_jp.json +06cd02f64e33ce33fa18b7c89f7a4bea033d1f5d assets/create/lang/unfinished/ko_kr.json +68019d005300f91f23b66c7d153ad7e67729afa7 assets/create/lang/unfinished/nl_nl.json +638fb33291096e9d4eb1d5fcf04a5184f6d24ff9 assets/create/lang/unfinished/pt_br.json +a66de91e4c2597d12eafe32a332c5a3fdd502303 assets/create/lang/unfinished/ru_ru.json +1bb3efa9bd717110f06ba7fa9feb54786208c710 assets/create/lang/unfinished/zh_cn.json +35c52ca6c33f9419dfe6751910bb4837cb90b446 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/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 49576633e..f97d8c8bc 100644 --- a/src/generated/resources/assets/create/blockstates/radial_chassis.json +++ b/src/generated/resources/assets/create/blockstates/radial_chassis.json @@ -149,8 +149,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "true" + "sticky_north": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky" @@ -158,8 +158,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "true" + "sticky_north": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky", @@ -168,8 +168,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "true" + "sticky_north": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -178,8 +178,8 @@ }, { "when": { - "axis": "x", - "sticky_north": "false" + "sticky_north": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x" @@ -187,8 +187,8 @@ }, { "when": { - "axis": "y", - "sticky_north": "false" + "sticky_north": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y", @@ -197,8 +197,8 @@ }, { "when": { - "axis": "z", - "sticky_north": "false" + "sticky_north": "false", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f095aac38..89a2eec22 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1840,7 +1840,27 @@ "create.ponder.belt_casing.header": "Encasing Belts", "create.ponder.belt_casing.text_1": "Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "3. They can connect vertically", + "create.ponder.belt_directions.text_5": "4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "The Brass Funnel", "create.ponder.brass_funnel.text_1": "Andesite Funnels can only ever extract single items.", @@ -1874,6 +1894,10 @@ "create.ponder.cogwheel.text_1": "Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "Generating Rotational Force using Creative Motors", + "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.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", @@ -1931,6 +1955,12 @@ "create.ponder.gearshift.text_1": "Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "It will help relaying conveyed speed to other axes of rotation", @@ -1954,6 +1984,19 @@ "create.ponder.shaft_casing.header": "Encasing Shafts", "create.ponder.shaft_casing.text_1": "Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 66f5d34e8..a8532553f 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: 1096", + "_": "Missing Localizations: 1132", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 39edcad2e..1eb29dcc1 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: 139", + "_": "Missing Localizations: 175", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 8bbb010e8..c58c0954f 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: 1026", + "_": "Missing Localizations: 1062", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 46592daeb..ab6c6e4c0 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: 808", + "_": "Missing Localizations: 844", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 80b162de6..ca9cbfcb9 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: 144", + "_": "Missing Localizations: 180", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 81d7d2353..ab36bc5f9 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: 151", + "_": "Missing Localizations: 187", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 e374b6616..6a77372b2 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: 197", + "_": "Missing Localizations: 233", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 a4e2e3f9d..f538e4f06 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: 1295", + "_": "Missing Localizations: 1331", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 a685f91c6..8b693bf26 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: 1361", + "_": "Missing Localizations: 1397", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 b227eaf65..9a2eff166 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: 147", + "_": "Missing Localizations: 183", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 8adfbf42d..423be296e 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: 145", + "_": "Missing Localizations: 181", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 3db9f714c..9effd2d61 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: 150", + "_": "Missing Localizations: 186", "_": "->------------------------] Game Elements [------------------------<-", @@ -1841,7 +1841,27 @@ "create.ponder.belt_casing.header": "UNLOCALIZED: Encasing Belts", "create.ponder.belt_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Mechanical Belts", - "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove it again", + "create.ponder.belt_casing.text_2": "UNLOCALIZED: A wrench can be used to remove the casing", + + "create.ponder.belt_connector.header": "UNLOCALIZED: Using Mechanical Belts", + "create.ponder.belt_connector.text_1": "UNLOCALIZED: Right-Clicking two shafts with a belt item will connect them together", + "create.ponder.belt_connector.text_2": "UNLOCALIZED: Accidental selections can be canceled with Right-Click while Sneaking", + "create.ponder.belt_connector.text_3": "UNLOCALIZED: Additional Shafts can be added throughout the Belt", + "create.ponder.belt_connector.text_4": "UNLOCALIZED: Shafts connected via Belts will rotate with Identical Speed and Direction", + "create.ponder.belt_connector.text_5": "UNLOCALIZED: Added shafts can be removed using the wrench", + "create.ponder.belt_connector.text_6": "UNLOCALIZED: Mechanical Belts can be dyed for aesthetic purposes", + + "create.ponder.belt_directions.header": "UNLOCALIZED: Valid Orientations for Mechanical Belts", + "create.ponder.belt_directions.text_1": "UNLOCALIZED: Belts cannot connect in arbitrary directions", + "create.ponder.belt_directions.text_2": "UNLOCALIZED: 1. They can connect horizontally", + "create.ponder.belt_directions.text_3": "UNLOCALIZED: 2. They can connect diagonally", + "create.ponder.belt_directions.text_4": "UNLOCALIZED: 3. They can connect vertically", + "create.ponder.belt_directions.text_5": "UNLOCALIZED: 4. And they can connect vertical shafts horizontally", + "create.ponder.belt_directions.text_6": "UNLOCALIZED: These are all possible directions.\nBelts can span any Length between 2 and 20 blocks", + + "create.ponder.belt_transport.header": "UNLOCALIZED: Using Mechanical Belts for Logistics", + "create.ponder.belt_transport.text_1": "UNLOCALIZED: Moving belts will transport Items and other Entities", + "create.ponder.belt_transport.text_2": "UNLOCALIZED: Right-Click with an empty hand to take items off a belt", "create.ponder.brass_funnel.header": "UNLOCALIZED: The Brass Funnel", "create.ponder.brass_funnel.text_1": "UNLOCALIZED: Andesite Funnels can only ever extract single items.", @@ -1875,6 +1895,10 @@ "create.ponder.cogwheel.text_1": "UNLOCALIZED: Cogwheels will relay rotation to other adjacent cogwheels", "create.ponder.cogwheel.text_2": "UNLOCALIZED: Neighbouring shafts connected like this will rotate in opposite directions", + "create.ponder.creative_motor.header": "UNLOCALIZED: Generating Rotational Force using Creative Motors", + "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.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", @@ -1932,6 +1956,12 @@ "create.ponder.gearshift.text_1": "UNLOCALIZED: Gearshifts will relay rotation in a straight line", "create.ponder.gearshift.text_2": "UNLOCALIZED: When powered by Redstone, it reverses the transmission", + "create.ponder.hand_crank.header": "UNLOCALIZED: Generating Rotational Force using Hand Cranks", + "create.ponder.hand_crank.text_1": "UNLOCALIZED: Hand Cranks can be used by players to apply rotational force manually", + "create.ponder.hand_crank.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.hand_crank.text_3": "UNLOCALIZED: Its conveyed speed is relatively high", + "create.ponder.hand_crank.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.large_cogwheel.header": "UNLOCALIZED: Relaying rotational force using Large Cogwheels", "create.ponder.large_cogwheel.text_1": "UNLOCALIZED: Large cogwheels can connect to each other at right angles", "create.ponder.large_cogwheel.text_2": "UNLOCALIZED: It will help relaying conveyed speed to other axes of rotation", @@ -1955,6 +1985,19 @@ "create.ponder.shaft_casing.header": "UNLOCALIZED: Encasing Shafts", "create.ponder.shaft_casing.text_1": "UNLOCALIZED: Brass or Andesite Casing can be used to decorate Shafts", + "create.ponder.valve_handle.header": "UNLOCALIZED: Generating Rotational Force using Valve Handles", + "create.ponder.valve_handle.text_1": "UNLOCALIZED: Valve Handles can be used by players to apply rotational force manually", + "create.ponder.valve_handle.text_2": "UNLOCALIZED: Hold Right-Click to rotate it Counter-Clockwise", + "create.ponder.valve_handle.text_3": "UNLOCALIZED: Its conveyed speed is slow and precise", + "create.ponder.valve_handle.text_4": "UNLOCALIZED: Sneak and Hold Right-Click to rotate it Clockwise", + "create.ponder.valve_handle.text_5": "UNLOCALIZED: Valve handles can be dyed for aesthetic purposes", + + "create.ponder.water_wheel.header": "UNLOCALIZED: Generating Rotational Force using Water Wheels", + "create.ponder.water_wheel.text_1": "UNLOCALIZED: Water Wheels draw force from adjacent Water Currents", + "create.ponder.water_wheel.text_2": "UNLOCALIZED: The more faces are powered, the faster the Water Wheel will rotate", + "create.ponder.water_wheel.text_3": "UNLOCALIZED: The Wheels' blades should be oriented against the flow", + "create.ponder.water_wheel.text_4": "UNLOCALIZED: Facing the opposite way, they will not be as effective", + "_": "Thank you for translating Create!" } \ No newline at end of file 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 5a41bc869..1e5b8bca9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -563,10 +563,19 @@ public class PonderUI extends AbstractSimiScreen { return true; if (identifyMode && hoveredBlockPos != null && PonderIndex.EDITOR_MODE) { - clipboardHelper.setClipboardString(minecraft.getWindow() - .getHandle(), - "BlockPos copied = util.grid.at(" + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " - + hoveredBlockPos.getZ() + ");"); + long handle = minecraft.getWindow() + .getHandle(); + if (copiedBlockPos != null && button == 1) { + clipboardHelper.setClipboardString(handle, + "util.select.fromTo(" + copiedBlockPos.getX() + ", " + copiedBlockPos.getY() + ", " + + copiedBlockPos.getZ() + ", " + hoveredBlockPos.getX() + ", " + hoveredBlockPos.getY() + ", " + + hoveredBlockPos.getZ() + ")"); + copiedBlockPos = hoveredBlockPos; + return true; + } + + clipboardHelper.setClipboardString(handle, "util.grid.at(" + hoveredBlockPos.getX() + ", " + + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); copiedBlockPos = hoveredBlockPos; return true; } 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 dab1d0b4b..b8d55dead 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -21,6 +21,7 @@ import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +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; @@ -30,6 +31,7 @@ import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionIns import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.ponder.instructions.FadeOutOfSceneInstruction; +import com.simibubi.create.foundation.ponder.instructions.LineInstruction; import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction; import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; import com.simibubi.create.foundation.ponder.instructions.OutlineSelectionInstruction; @@ -279,6 +281,10 @@ public class SceneBuilder { addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration)); } + public void showLine(PonderPalette color, Vec3d start, Vec3d end, int duration) { + addInstruction(new LineInstruction(color, start, end, duration)); + } + public void showOutline(PonderPalette color, Object slot, Selection selection, int duration) { addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); } @@ -287,23 +293,37 @@ public class SceneBuilder { public class SpecialInstructions { - public void birbOnTurntable(BlockPos pos) { - addInstruction(new CreateParrotInstruction(10, Direction.DOWN, - ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos))); + public ElementLink birbOnTurntable(BlockPos pos) { + ElementLink link = new ElementLink<>(ParrotElement.class); + ParrotElement parrot = ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos), pos); + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); + addInstruction(scene -> scene.linkElement(parrot, link)); + return link; } - public void birbOnSpinnyShaft(BlockPos pos) { - addInstruction( - new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos) - .add(0, 0.5, 0), pos))); + public ElementLink birbOnSpinnyShaft(BlockPos pos) { + ElementLink link = new ElementLink<>(ParrotElement.class); + ParrotElement parrot = ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos) + .add(0, 0.5, 0), pos); + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); + addInstruction(scene -> scene.linkElement(parrot, link)); + return link; } - public void birbLookingAtPOI(Vec3d location) { - addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.lookAtPOI(location))); + public ElementLink birbLookingAtPOI(Vec3d location) { + ElementLink link = new ElementLink<>(ParrotElement.class); + ParrotElement parrot = ParrotElement.lookAtPOI(location); + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); + addInstruction(scene -> scene.linkElement(parrot, link)); + return link; } - public void birbPartying(Vec3d location) { - addInstruction(new CreateParrotInstruction(10, Direction.DOWN, ParrotElement.dance(location))); + public ElementLink birbPartying(Vec3d location) { + ElementLink link = new ElementLink<>(ParrotElement.class); + ParrotElement parrot = ParrotElement.dance(location); + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); + addInstruction(scene -> scene.linkElement(parrot, link)); + return link; } public void movePointOfInterest(Vec3d location) { @@ -314,6 +334,15 @@ public class SceneBuilder { movePointOfInterest(VecHelper.getCenterOf(location)); } + public void rotateParrot(ElementLink link, double xRotation, double yRotation, double zRotation, + int duration) { + addInstruction(AnimateParrotInstruction.rotate(link, new Vec3d(xRotation, yRotation, zRotation), duration)); + } + + public void moveParrot(ElementLink link, Vec3d offset, int duration) { + addInstruction(AnimateParrotInstruction.move(link, offset, duration)); + } + } public class WorldInstructions { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java index 7bdb8d506..09c5ff47b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BeltScenes.java @@ -5,20 +5,375 @@ import java.util.Collections; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; +import com.simibubi.create.content.contraptions.relays.belt.BeltPart; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; +import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; +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.WorldSectionElement; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.DyeColor; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; +import net.minecraft.util.Direction.Axis; +import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; public class BeltScenes { + public static void beltConnector(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("belt_connector", "Using Mechanical Belts"); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + scene.idle(5); + + scene.world.showSection(util.select.fromTo(4, 1, 3, 4, 1, 5), Direction.DOWN); + ElementLink shafts = + scene.world.showIndependentSection(util.select.fromTo(0, 1, 3, 4, 1, 3), Direction.DOWN); + scene.world.moveSection(shafts, util.vector.of(0, 0, -1), 0); + scene.world.setKineticSpeed(util.select.position(0, 1, 3), 0); + scene.idle(20); + + BlockPos backEnd = util.grid.at(4, 1, 2); + BlockPos frontEnd = util.grid.at(0, 1, 2); + ItemStack beltItem = AllItems.BELT_CONNECTOR.asStack(); + Vec3d backEndCenter = util.vector.centerOf(backEnd); + AxisAlignedBB connectBB = new AxisAlignedBB(backEndCenter, backEndCenter); + AxisAlignedBB shaftBB = AllBlocks.SHAFT.getDefaultState() + .with(ShaftBlock.AXIS, Axis.Z) + .getShape(null, null) + .getBoundingBox(); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(backEnd), Pointing.DOWN).rightClick() + .withItem(beltItem), 57); + scene.idle(7); + + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, backEnd, shaftBB.offset(backEnd), 42); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB, 50); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(frontEnd), Pointing.DOWN).rightClick() + .withItem(beltItem), 37); + scene.idle(7); + + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, frontEnd, shaftBB.offset(frontEnd), 17); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.BLACK, backEndCenter, connectBB.expand(-4, 0, 0), 20); + scene.idle(20); + + scene.world.moveSection(shafts, util.vector.of(0, -2, 0), 0); + scene.world.showSection(util.select.fromTo(0, 1, 2, 4, 1, 2), Direction.SOUTH); + scene.idle(20); + + scene.overlay.showText(80) + .text("Right-Clicking two shafts with a belt item will connect them together") + .placeNearTarget() + .pointAt(util.vector.topOf(2, 1, 2)); + scene.idle(90); + + Vec3d falseSelection = util.vector.topOf(backEnd.south(1)); + scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() + .withItem(beltItem), 37); + scene.idle(7); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, backEnd, shaftBB.offset(backEnd.south(1)), 50); + + scene.overlay.showText(80) + .colored(PonderPalette.RED) + .text("Accidental selections can be canceled with Right-Click while Sneaking") + .placeNearTarget() + .pointAt(util.vector.centerOf(backEnd.south(1))); + scene.idle(43); + + scene.overlay.showControls(new InputWindowElement(falseSelection, Pointing.DOWN).rightClick() + .withItem(beltItem) + .whileSneaking(), 20); + scene.idle(60); + + BlockPos shaftLocation = frontEnd.east(); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() + .withItem(AllBlocks.SHAFT.asStack()), 50); + scene.idle(7); + scene.world.modifyBlock(shaftLocation, s -> s.with(BeltBlock.PART, BeltPart.PULLEY), true); + scene.idle(10); + + scene.overlay.showText(43) + .text("Additional Shafts can be added throughout the Belt") + .placeNearTarget() + .pointAt(util.vector.blockSurface(shaftLocation, Direction.NORTH)); + scene.idle(50); + + Selection attachedShafts = util.select.fromTo(0, 1, 1, 1, 1, 1); + scene.world.showSection(attachedShafts, Direction.SOUTH); + scene.world.setKineticSpeed(attachedShafts, 32); + scene.idle(10); + scene.effects.rotationDirectionIndicator(util.grid.at(0, 1, 1)); + scene.effects.rotationDirectionIndicator(util.grid.at(1, 1, 1)); + scene.idle(20); + + scene.overlay.showText(50) + .text("Shafts connected via Belts will rotate with Identical Speed and Direction") + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 1), Direction.NORTH)); + scene.idle(60); + + scene.world.hideSection(attachedShafts, Direction.NORTH); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(shaftLocation), Pointing.DOWN).rightClick() + .withWrench(), 50); + scene.idle(7); + scene.world.modifyBlock(shaftLocation, s -> s.with(BeltBlock.PART, BeltPart.MIDDLE), true); + scene.idle(10); + scene.overlay.showText(50) + .text("Added shafts can be removed using the wrench") + .placeNearTarget() + .pointAt(util.vector.blockSurface(shaftLocation, Direction.NORTH)); + scene.idle(70); + + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(shaftLocation.east()), Pointing.DOWN).rightClick() + .withItem(new ItemStack(Items.BLUE_DYE)), 50); + scene.idle(7); + scene.world.modifyTileNBT(util.select.fromTo(0, 1, 2, 4, 1, 2), BeltTileEntity.class, + nbt -> NBTHelper.writeEnum(nbt, "Dye", DyeColor.BLUE)); + scene.idle(20); + scene.overlay.showText(80) + .colored(PonderPalette.BLUE) + .text("Mechanical Belts can be dyed for aesthetic purposes") + .placeNearTarget() + .pointAt(util.vector.topOf(shaftLocation.east())); + } + + public static void directions(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("belt_directions", "Valid Orientations for Mechanical Belts"); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + scene.idle(5); + + ElementLink leftShaft = + scene.world.showIndependentSection(util.select.position(4, 1, 0), Direction.DOWN); + ElementLink rightShaft = + scene.world.showIndependentSection(util.select.position(0, 1, 0), Direction.DOWN); + + scene.world.moveSection(leftShaft, util.vector.of(0, 0, 2), 0); + scene.world.moveSection(rightShaft, util.vector.of(0, 0, 2), 0); + scene.idle(1); + scene.world.moveSection(leftShaft, util.vector.of(-1, 0, 0), 10); + scene.world.moveSection(rightShaft, util.vector.of(1, 1, 0), 10); + + scene.idle(20); + + Vec3d from = util.vector.centerOf(3, 1, 2); + Vec3d to = util.vector.centerOf(1, 2, 2); + + scene.overlay.showLine(PonderPalette.RED, from, to, 70); + scene.idle(10); + scene.overlay.showLine(PonderPalette.GREEN, to.add(-1, -1, 0), from, 60); + scene.overlay.showLine(PonderPalette.GREEN, from.add(0, 3, 0), from, 60); + + scene.idle(20); + scene.overlay.showText(60) + .colored(PonderPalette.RED) + .placeNearTarget() + .pointAt(to) + .text("Belts cannot connect in arbitrary directions"); + scene.idle(70); + + from = util.vector.centerOf(4, 1, 2); + to = util.vector.centerOf(0, 1, 2); + + scene.world.moveSection(leftShaft, util.vector.of(1, 0, 0), 10); + scene.world.moveSection(rightShaft, util.vector.of(-1, -1, 0), 10); + scene.idle(10); + scene.overlay.showLine(PonderPalette.GREEN, from, to, 40); + scene.idle(10); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(to) + .text("1. They can connect horizontally"); + + scene.idle(20); + Selection firstBelt = util.select.fromTo(4, 1, 1, 0, 1, 1); + ElementLink belt = scene.world.showIndependentSection(firstBelt, Direction.SOUTH); + scene.world.moveSection(belt, util.vector.of(0, 0, 1), 0); + scene.idle(20); + scene.world.hideIndependentSection(belt, Direction.SOUTH); + scene.idle(15); + + from = util.vector.centerOf(3, 3, 2); + to = util.vector.centerOf(1, 1, 2); + + scene.world.moveSection(leftShaft, util.vector.of(-1, 2, 0), 10); + scene.world.moveSection(rightShaft, util.vector.of(1, 0, 0), 10); + scene.idle(10); + scene.world.rotateSection(leftShaft, 0, 0, 25, 5); + scene.world.rotateSection(rightShaft, 0, 0, 25, 5); + scene.overlay.showLine(PonderPalette.GREEN, from, to, 40); + scene.idle(10); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(to) + .text("2. They can connect diagonally"); + + scene.idle(20); + Selection secondBelt = util.select.fromTo(3, 3, 2, 1, 1, 2); + belt = scene.world.showIndependentSection(secondBelt, Direction.SOUTH); + scene.idle(20); + scene.world.hideIndependentSection(belt, Direction.SOUTH); + scene.idle(15); + + from = util.vector.centerOf(2, 4, 2); + to = util.vector.centerOf(2, 1, 2); + + scene.world.moveSection(leftShaft, util.vector.of(-1, 1, 0), 10); + scene.world.moveSection(rightShaft, util.vector.of(1, 0, 0), 10); + scene.idle(10); + scene.world.rotateSection(rightShaft, 0, 0, -25, 5); + scene.overlay.showLine(PonderPalette.GREEN, from, to, 40); + scene.idle(10); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(to) + .text("3. They can connect vertically"); + + scene.idle(20); + Selection thirdBelt = util.select.fromTo(2, 1, 3, 2, 4, 3); + belt = scene.world.showIndependentSection(thirdBelt, Direction.SOUTH); + scene.world.moveSection(belt, util.vector.of(0, 0, -1), 0); + scene.idle(20); + scene.world.hideIndependentSection(belt, Direction.SOUTH); + scene.idle(15); + + from = util.vector.centerOf(4, 1, 2); + to = util.vector.centerOf(0, 1, 2); + + scene.world.moveSection(leftShaft, util.vector.of(2, -3, 0), 10); + scene.world.moveSection(rightShaft, util.vector.of(-2, 0, 0), 10); + scene.idle(10); + scene.world.rotateSection(rightShaft, 90, 0, -25, 5); + scene.world.rotateSection(leftShaft, 90, 0, -50, 5); + scene.overlay.showLine(PonderPalette.GREEN, from, to, 60); + scene.idle(10); + scene.overlay.showText(60) + .colored(PonderPalette.GREEN) + .placeNearTarget() + .pointAt(to) + .text("4. And they can connect vertical shafts horizontally"); + + scene.idle(20); + Selection fourthBelt = util.select.fromTo(4, 1, 4, 0, 1, 4); + belt = scene.world.showIndependentSection(fourthBelt, Direction.DOWN); + scene.world.moveSection(belt, util.vector.of(0, 1 / 512f, -2), 0); + scene.idle(40); + scene.world.hideIndependentSection(belt, Direction.UP); + scene.idle(15); + scene.world.hideIndependentSection(leftShaft, Direction.UP); + scene.world.hideIndependentSection(rightShaft, Direction.UP); + scene.idle(15); + + scene.world.showSection(firstBelt, Direction.DOWN); + scene.idle(5); + scene.world.showSection(secondBelt, Direction.DOWN); + scene.idle(5); + scene.world.showSection(thirdBelt, Direction.DOWN); + scene.idle(5); + scene.world.showSection(fourthBelt, Direction.DOWN); + scene.idle(10); + + scene.overlay.showText(160) + .text("These are all possible directions.\nBelts can span any Length between 2 and 20 blocks"); + scene.markAsFinished(); + } + + public static void transport(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("belt_transport", "Using Mechanical Belts for Logistics"); + scene.configureBasePlate(0, 0, 5); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -.6f * f); + scene.showBasePlate(); + scene.idle(5); + scene.world.showSection(util.select.fromTo(1, 1, 3, 2, 1, 5), Direction.DOWN); + scene.idle(20); + scene.world.showSection(util.select.fromTo(2, 1, 2, 4, 3, 2), Direction.SOUTH); + scene.idle(5); + scene.world.showSection(util.select.fromTo(1, 1, 2, 0, 1, 2), Direction.SOUTH); + scene.idle(10); + scene.special.movePointOfInterest(util.grid.at(2, 2, 0)); + + ItemStack stack = AllBlocks.COPPER_BLOCK.asStack(); + ElementLink item = + scene.world.createItemEntity(util.vector.centerOf(0, 4, 2), util.vector.of(0, 0, 0), stack); + scene.idle(13); + scene.world.modifyEntity(item, Entity::remove); + BlockPos beltEnd = util.grid.at(0, 1, 2); + scene.world.createItemOnBelt(beltEnd, Direction.DOWN, stack); + + scene.idle(20); + + ElementLink parrot = scene.special.birbLookingAtPOI(util.vector.topOf(0, 1, 2) + .add(0, -3 / 16f, 0)); + scene.special.moveParrot(parrot, util.vector.of(1.78, 0, 0), 40); + scene.special.movePointOfInterest(util.grid.at(1, 1, 3)); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.topOf(beltEnd)) + .text("Moving belts will transport Items and other Entities"); + + scene.idle(20); + item = scene.world.createItemEntity(util.vector.centerOf(0, 4, 2), util.vector.of(0, 0, 0), stack); + scene.special.movePointOfInterest(util.grid.at(0, 3, 2)); + scene.idle(10); + scene.special.movePointOfInterest(beltEnd); + scene.idle(3); + scene.world.modifyEntity(item, Entity::remove); + scene.world.createItemOnBelt(beltEnd, Direction.DOWN, stack); + scene.idle(8); + + scene.special.movePointOfInterest(util.grid.at(3, 2, 1)); + scene.special.moveParrot(parrot, util.vector.of(2.1, 2.1, 0), 60); + scene.idle(20); + scene.special.movePointOfInterest(util.grid.at(5, 5, 2)); + scene.idle(30); + scene.special.movePointOfInterest(util.grid.at(2, 1, 5)); + scene.idle(10); + scene.special.moveParrot(parrot, util.vector.of(.23, 0, 0), 5); + scene.idle(5); + scene.world.setKineticSpeed(util.select.everywhere(), 0f); + scene.idle(10); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.special.movePointOfInterest(util.grid.at(2, 5, 4)); + + Vec3d topOf = util.vector.topOf(util.grid.at(3, 2, 2)) + .add(-0.1, 0.3, 0); + scene.overlay.showControls(new InputWindowElement(topOf, Pointing.DOWN).rightClick(), 60); + scene.idle(10); + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(topOf.subtract(0, 0.1, 0)) + .text("Right-Click with an empty hand to take items off a belt"); + scene.idle(20); + scene.world.removeItemsFromBelt(util.grid.at(3, 2, 2)); + scene.effects.indicateSuccess(util.grid.at(3, 2, 2)); + scene.idle(20); + + scene.special.movePointOfInterest(util.grid.at(2, 1, 5)); + } + public static void beltsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { scene.title("belt_casing", "Encasing Belts"); scene.configureBasePlate(0, 0, 5); @@ -96,7 +451,7 @@ public class BeltScenes { scene.idle(7); scene.world.modifyBlock(beltPos.south(), s -> s.with(BeltBlock.CASING, false), true); scene.overlay.showText(80) - .text("A wrench can be used to remove it again") + .text("A wrench can be used to remove the casing") .placeNearTarget() .pointAt(util.vector.blockSurface(beltPos.south(), Direction.WEST)); } 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 8b763c330..ffc35cb0c 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 @@ -26,6 +26,11 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.LARGE_COGWHEEL) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay); + PonderRegistry.forComponents(AllItems.BELT_CONNECTOR) + .addStoryBoard("belt/connect", BeltScenes::beltConnector) + .addStoryBoard("belt/directions", BeltScenes::directions) + .addStoryBoard("belt/transport", BeltScenes::transport) + .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); PonderRegistry.forComponents(AllBlocks.ANDESITE_CASING, AllBlocks.BRASS_CASING) .addStoryBoard("shaft/encasing", KineticsScenes::shaftsCanBeEncased) 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 b8cc26f85..38bc429ed 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 @@ -46,21 +46,65 @@ public class ParrotElement extends AnimatedSceneElement { this.location = location; } + @Override + public void reset(PonderScene scene) { + super.reset(scene); + entity.setPos(0, 0, 0); + entity.prevPosX = 0; + entity.prevPosY = 0; + entity.prevPosZ = 0; + } + @Override public void tick(PonderScene scene) { super.tick(scene); if (entity == null) return; + entity.prevPosX = entity.getX(); + entity.prevPosY = entity.getY(); + entity.prevPosZ = entity.getZ(); entity.ticksExisted++; entity.prevRotationYawHead = entity.rotationYawHead; entity.oFlapSpeed = entity.flapSpeed; entity.oFlap = entity.flap; entity.onGround = true; + entity.prevRotationYaw = entity.rotationYaw; + entity.prevRotationPitch = entity.rotationPitch; pose.tick(scene); } + 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(Vec3d eulers, boolean immediate) { + if (entity == null) + return; + entity.rotationPitch = (float) eulers.x; + entity.rotationYaw = (float) eulers.y; + if (!immediate) + return; + entity.prevRotationPitch = entity.rotationPitch; + entity.prevRotationYaw = entity.rotationYaw; + } + + public Vec3d getPositionOffset() { + return entity != null ? entity.getPositionVec() : Vec3d.ZERO; + } + + public Vec3d getRotation() { + return entity != null ? new Vec3d(entity.rotationPitch, entity.rotationYaw, 0) : Vec3d.ZERO; + } + @Override protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { EntityRendererManager entityrenderermanager = Minecraft.getInstance() @@ -71,6 +115,8 @@ public class ParrotElement extends AnimatedSceneElement { 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(AngleHelper.angleLerp(pt, entity.prevRotationYaw, entity.rotationYaw)); @@ -138,8 +184,6 @@ 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.prevRotationYaw = entity.rotationYaw; - entity.prevRotationPitch = entity.rotationPitch; entity.rotationPitch = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d1, d3) * (double) (180F / (float) Math.PI))); entity.rotationYaw = 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 new file mode 100644 index 000000000..629f31085 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java @@ -0,0 +1,57 @@ +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.PonderScene; +import com.simibubi.create.foundation.ponder.elements.PonderSceneElement; + +import net.minecraft.util.math.Vec3d; + +public class AnimateElementInstruction extends TickingInstruction { + + protected Vec3d deltaPerTick; + protected Vec3d totalDelta; + protected Vec3d target; + protected ElementLink link; + protected T element; + + private BiConsumer setter; + private Function getter; + + protected AnimateElementInstruction(ElementLink link, Vec3d totalDelta, int ticks, + BiConsumer setter, Function getter) { + super(false, ticks); + this.link = link; + this.setter = setter; + this.getter = getter; + this.deltaPerTick = totalDelta.scale(1d / ticks); + this.totalDelta = totalDelta; + this.target = totalDelta; + } + + @Override + protected final void firstTick(PonderScene scene) { + super.firstTick(scene); + element = scene.resolve(link); + if (element == null) + return; + target = getter.apply(element) + .add(totalDelta); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (element == null) + return; + if (remainingTicks == 0) { + setter.accept(element, target); + return; + } + setter.accept(element, getter.apply(element) + .add(deltaPerTick)); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateParrotInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateParrotInstruction.java new file mode 100644 index 000000000..69f44417a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateParrotInstruction.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.ParrotElement; + +import net.minecraft.util.math.Vec3d; + +public class AnimateParrotInstruction extends AnimateElementInstruction { + + public static AnimateParrotInstruction rotate(ElementLink link, Vec3d rotation, int ticks) { + return new AnimateParrotInstruction(link, rotation, ticks, (wse, v) -> wse.setRotation(v, ticks == 0), + ParrotElement::getRotation); + } + + public static AnimateParrotInstruction move(ElementLink link, Vec3d offset, int ticks) { + return new AnimateParrotInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0), + ParrotElement::getPositionOffset); + } + + protected AnimateParrotInstruction(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/AnimateWorldSectionInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java index 9fda1e459..c73f70dc4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateWorldSectionInstruction.java @@ -4,21 +4,11 @@ import java.util.function.BiConsumer; import java.util.function.Function; import com.simibubi.create.foundation.ponder.ElementLink; -import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import net.minecraft.util.math.Vec3d; -public class AnimateWorldSectionInstruction extends TickingInstruction { - - protected Vec3d deltaPerTick; - protected Vec3d totalDelta; - protected Vec3d target; - protected ElementLink link; - protected WorldSectionElement element; - - private BiConsumer setter; - private Function getter; +public class AnimateWorldSectionInstruction extends AnimateElementInstruction { public static AnimateWorldSectionInstruction rotate(ElementLink link, Vec3d rotation, int ticks) { @@ -33,36 +23,7 @@ public class AnimateWorldSectionInstruction extends TickingInstruction { protected AnimateWorldSectionInstruction(ElementLink link, Vec3d totalDelta, int ticks, BiConsumer setter, Function getter) { - super(false, ticks); - this.link = link; - this.setter = setter; - this.getter = getter; - this.deltaPerTick = totalDelta.scale(1d / ticks); - this.totalDelta = totalDelta; - this.target = totalDelta; - } - - @Override - protected final void firstTick(PonderScene scene) { - super.firstTick(scene); - element = scene.resolve(link); - if (element == null) - return; - target = getter.apply(element) - .add(totalDelta); - } - - @Override - public void tick(PonderScene scene) { - super.tick(scene); - if (element == null) - return; - if (remainingTicks == 0) { - setter.accept(element, target); - return; - } - setter.accept(element, getter.apply(element) - .add(deltaPerTick)); + super(link, totalDelta, ticks, setter, getter); } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/LineInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/LineInstruction.java new file mode 100644 index 000000000..2a18361b0 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/LineInstruction.java @@ -0,0 +1,30 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.content.PonderPalette; + +import net.minecraft.util.math.Vec3d; + +public class LineInstruction extends TickingInstruction { + + private PonderPalette color; + private Vec3d start; + private Vec3d end; + + public LineInstruction(PonderPalette color, Vec3d start, Vec3d end, int ticks) { + super(false, ticks); + this.color = color; + this.start = start; + this.end = end; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + scene.getOutliner() + .showLine(start, start, end) + .lineWidth(1 / 16f) + .colored(color.getColor()); + } + +} diff --git a/src/main/resources/ponder/belt/connect.nbt b/src/main/resources/ponder/belt/connect.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b1009a9ce2a9fb22ef02b14de8824c1d326998b1 GIT binary patch literal 755 zcmVyzIgztB8`LXQQ(PBwfB9qoj_B%&=i-3T`WcJ<($9${~gCpVt@!dEzXbuKzaFexpV~) zgqRy)1ZpT-1i^kLlS3WTmlqMRLh34M+8FrSaD$VK*%)U|j8ltoEp(WLj%T4$HD`g2 zGbg65<67u23mwlwr)sVRXV-%BA{}O-<5}oTOJTv8S#VyY!z^?>3!SQY7Mwi`&Wm)I zg^o8@CkB@98z21L0x^Aik$1mOAN9o#pNfJ$)riQw~02J}^W2*S9EFd}Fz~6H5D-nT8U~-m+|Y zHmnskPg`dbt-{8c!^T^ljoS*FXRWgdS7GC}!^UZa&Gm#;*{rX^hPA^6?u1QIXX7l* z#)s~kG{y9i$*c3y-4e87hPF-dSA->$i9A zt^Mh9kKN)xYGv`-`KT|Qqo#WNXFgPu4{w2wpXYzwM|A{jOnm63XGed=NAT~}qwb@z z9hn_DwBf&J#+d8Jkv<|{6uJQ&ZbgpmBAsY)g^-Davz>%7hD-&n5XpL z0Rb)d=rL*&lC6yLARbC3&S)#<*>s5C4i>8sf{{qm4DWW3vJlF&HHIDSYB^ l#zVyHc3Sr)T2mDU-FMvZJJIW4Fk@C$K4931};003>}bans$ literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/belt/directions.nbt b/src/main/resources/ponder/belt/directions.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fde59d365a7580782bfa26b458413882cce42b3b GIT binary patch literal 751 zcmVKCnrFw0p0#AF*H1uiZXWn%YX!rfpv;7p{p_ z0?hWBHa~2?Z$}zZgeWnQlUhQC@|8i^XJ7QyH` zE0S9s)5E6-SXt=WY26qE+6aRykEV^+VdJ%IdgM&}cpWxv9Nz+mS>SLB zoVxiII{Own_u()L9BzTL9tsPcnT5`MILrcvTj11Zn*f4u zC1MIozc=S}tCv4~FH^GgLhxk@$B9CEI?-}gW_Wcgb2KvPNPC%9BaH7p47Uz*c&1N_ z+^8bUP<4i7F#3x5#7xOPAiT3Y#rrD8BcJh#&oyQyhWH7Lf%lWlj;a4e{R#EIsm~#V z(W%ffp8!9lSyP@vyfx5RF>TEme-Vo~GhG zexV*Bf;TwRtBOCmEHoVj?(jmTBy883+Rid?kR=C%3-PKmT#5GSPk%Ix^!)t3}me15y zlX~o!x@B!`L!IrIy5)Ah4Rzk4K7N^vPIhg z-Wp2X-vf2aX)%;K+XHpWcZ;Fac?b1ZWOGo842{9+yUXj4T*VCG?M3gk%YBM5dAa#l6(vE!I$n z^;_MP(Ap5A9`p`H hauA|dq<(w`k}ayq#Dga1aSPp#V)004+Ya?}6- literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/belt/transport.nbt b/src/main/resources/ponder/belt/transport.nbt new file mode 100644 index 0000000000000000000000000000000000000000..784df024a621ed682d17bf3cb9121955178ea4d4 GIT binary patch literal 810 zcmV+_1J(Q=iwFP!000000L_=*PTMdP#!vpWY05M%m^AHnPXU{>4K`_&rhXTf=yj%T6cTj*5Hx8Uqsa9*b4 zS?KtUIuUr{$OI4^W{7W?UeMpxsB4OLZJT zxW_UUC+7U~Wns)eq{2fnT_4;Yr`SKxe!m@1KBG|UT?(SXxCw`DtdPv?9ARo2=E|w9 zL3edFuogDI>TH~q*#yx2z&Y}3Chsnb)vyAs2s%A+N|juy^A6cHIMF4uX9rSKeLuy0 z#c5N3aOc3bEWtj=q;HirP{d3lALua~n%j5kg1R#Q0B%2d8>;Dj zq;4bppEh2UHgqz{QXCv70!DSsrmSO`RG2Xjl5m@FpJ)!f;k`2)0>aF zkA?Fw@1sjG?Tn>p3>KeX8zEIYHbHnfp)9eY^}Cag6N7_T3K|A=sv@>#5n9N6aPnmXpfc;tvCKutWiE22_&xMnlZ5jW*O_8DrqwdsRP@*WA~Vpqo>mO66#Te1@vbG!@*a_G3}r?6EEa ovA0I~7%{z@*7H(ps^UTSBQxw9DxF9{RpdAP1AbkX(~l7V0MpWosQ>@~ literal 0 HcmV?d00001 From ca2cf9457965c7235ccf7fffbdd6792bacf17055 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 8 Mar 2021 02:59:43 +0100 Subject: [PATCH 23/23] Scene hacking getting out of control - New highly over-engineered scenes for Encased Fans - Potential Fix for GL errors with the framebuffer system --- .../components/fan/EncasedFanTileEntity.java | 4 +- .../create/foundation/gui/UIRenderHelper.java | 3 +- .../foundation/ponder/SceneBuilder.java | 16 + .../foundation/ponder/content/FanScenes.java | 297 ++++++++++++++++++ .../ponder/content/PonderIndex.java | 5 + .../ponder/elements/ParrotElement.java | 40 ++- src/main/resources/ponder/fan/direction.nbt | Bin 0 -> 657 bytes src/main/resources/ponder/fan/processing.nbt | Bin 0 -> 1098 bytes src/main/resources/ponder/fan/source.nbt | Bin 0 -> 533 bytes 9 files changed, 358 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java create mode 100644 src/main/resources/ponder/fan/direction.nbt create mode 100644 src/main/resources/ponder/fan/processing.nbt create mode 100644 src/main/resources/ponder/fan/source.nbt diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java index 132f9f65d..eb5bc626c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanTileEntity.java @@ -171,7 +171,9 @@ public class EncasedFanTileEntity extends GeneratingKineticTileEntity implements public void tick() { super.tick(); - if (!world.isRemote && airCurrentUpdateCooldown-- <= 0) { + boolean server = !world.isRemote || isVirtual(); + + if (server && airCurrentUpdateCooldown-- <= 0) { airCurrentUpdateCooldown = AllConfigs.SERVER.kinetics.fanBlockCheckRate.get(); updateAirFlow = true; } diff --git a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java index a4b4a22f5..f6db492b5 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/gui/UIRenderHelper.java @@ -21,7 +21,8 @@ public class UIRenderHelper { RenderSystem.recordRenderCall(() -> { MainWindow mainWindow = Minecraft.getInstance().getWindow(); framebuffer = new Framebuffer(mainWindow.getFramebufferWidth(), mainWindow.getFramebufferHeight(), true, Minecraft.IS_RUNNING_ON_MAC); - framebuffer.deleteFramebuffer(); + framebuffer.setFramebufferColor(0, 0, 0, 0); +// framebuffer.deleteFramebuffer(); }); } 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 b8d55dead..fe208b5ff 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -317,6 +317,14 @@ public class SceneBuilder { addInstruction(scene -> scene.linkElement(parrot, link)); return link; } + + public ElementLink flappyBirb(Vec3d location) { + ElementLink link = new ElementLink<>(ParrotElement.class); + ParrotElement parrot = ParrotElement.flappy(location); + addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); + addInstruction(scene -> scene.linkElement(parrot, link)); + return link; + } public ElementLink birbPartying(Vec3d location) { ElementLink link = new ElementLink<>(ParrotElement.class); @@ -566,6 +574,14 @@ public class SceneBuilder { resolve.ifPresent(tis -> tis.locked = stalled); }); } + + public void changeBeltItemTo(ElementLink link, ItemStack newStack) { + addInstruction(scene -> { + BeltItemElement resolve = scene.resolve(link); + if (resolve != null) + resolve.ifPresent(tis -> tis.stack = newStack); + }); + } public void setKineticSpeed(Selection selection, float speed) { modifyKineticSpeed(selection, f -> speed); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java new file mode 100644 index 000000000..8d52c8113 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java @@ -0,0 +1,297 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; +import com.simibubi.create.content.logistics.block.depot.DepotTileEntity; +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.BeltItemElement; +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.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class FanScenes { + + public static void direction(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("fan_direction", "Air flow of Encased Fans"); + scene.configureBasePlate(0, 1, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); +// scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 0, 3, 1, 5) + .add(util.select.position(3, 2, 4)), Direction.DOWN); + scene.world.showSection(util.select.fromTo(2, 1, 5, 1, 1, 5), Direction.DOWN); + scene.idle(10); + + BlockPos fanPos = util.grid.at(1, 1, 4); + scene.world.showSection(util.select.position(fanPos), Direction.SOUTH); + + scene.idle(40); + scene.effects.rotationDirectionIndicator(fanPos.south()); + + ElementLink flappyBirb = scene.special.flappyBirb(util.vector.topOf(1, 0, 3)); + scene.idle(2); + scene.special.rotateParrot(flappyBirb, 0, 235, 0, 30); + scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -2.5), 30); + scene.idle(20); + + scene.overlay.showText(80) + .text("Encased Fans use Rotational Force to create an Air Current") + .placeNearTarget() + .pointAt(util.vector.topOf(fanPos)); + scene.idle(90); + + BlockPos leverPos = util.grid.at(3, 2, 4); + Selection reverse = util.select.fromTo(3, 1, 5, 1, 1, 4); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reverse, f -> -f); + scene.effects.rotationDirectionIndicator(fanPos.south()); + scene.special.rotateParrot(flappyBirb, 0, 215 * 2, 0, 30); + scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, 2.5), 30); + scene.idle(31); + + scene.overlay.showText(60) + .text("Strength and Direction of Flow depends on the Rotational Input") + .placeNearTarget() + .pointAt(util.vector.topOf(fanPos)); + scene.markAsFinished(); + scene.idle(70); + + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reverse, f -> -f); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); + scene.effects.rotationSpeedIndicator(fanPos.south()); + scene.special.rotateParrot(flappyBirb, 0, 245 * 4, 0, 30); + scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -20), 30); + + } + + public static void processing(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("fan_processing", "Processing Items using Encased Fans"); + scene.configureBasePlate(1, 0, 5); + scene.world.showSection(util.select.layer(0) + .substract(util.select.position(0, 0, 4)), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(6, 1, 2, 5, 1, 2) + .add(util.select.position(1, 1, 2)), Direction.DOWN); + scene.idle(25); + + BlockPos blockPos = util.grid.at(4, 1, 2); + + // blasting start + + ElementLink blockInFront = + scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.SOUTH); + scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); + scene.world.setBlock(blockPos, Blocks.LAVA.getDefaultState(), false); + scene.idle(10); + + scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 80) + .colored(PonderPalette.RED) + .text("When passing through lava, the Air Flow becomes Heated"); + scene.idle(80); + + ItemStack stack = new ItemStack(Items.GOLD_ORE); + ItemStack smelted = new ItemStack(Items.GOLD_INGOT); + + ElementLink entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2) + .up(2)), util.vector.of(0, 0.1, 0), stack); + scene.idle(15); + scene.world.modifyEntity(entityLink, e -> e.setMotion(-0.2f, 0, 0)); + Vec3d itemVec = util.vector.blockSurface(util.grid.at(1, 1, 2), Direction.EAST) + .add(0.1, 0, 0); + scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); + scene.idle(20); + scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.LARGE_SMOKE, Vec3d.ZERO), 1, + 60); + + scene.overlay.showText(80) + .colored(PonderPalette.WHITE) + .pointAt(itemVec) + .placeNearTarget() + .text("Items caught in the area will be smelted"); + + scene.idle(60); + scene.world.modifyEntities(ItemEntity.class, ie -> ie.setItem(smelted)); + scene.idle(40); + scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(smelted), 20); + scene.idle(20); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.idle(20); + + scene.overlay.showText(80) + .colored(PonderPalette.RED) + .pointAt(itemVec) + .placeNearTarget() + .text("Food items thrown here would be incinerated"); + scene.idle(40); + + // smoking start + + BlockState campfire = Blocks.FIRE.getDefaultState(); + scene.world.hideIndependentSection(blockInFront, Direction.NORTH); + scene.idle(15); + scene.world.setBlock(util.grid.at(3, 1, 0), campfire, false); + scene.world.setBlock(blockPos, campfire, true); + blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.NORTH); + scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); + scene.idle(50); + + scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 60) + .colored(PonderPalette.BLACK) + .text("Instead, a setup for Smoking using Fire should be used for them"); + scene.idle(80); + + // washing start + + BlockState water = Blocks.WATER.getDefaultState(); + scene.world.hideIndependentSection(blockInFront, Direction.NORTH); + scene.idle(15); + scene.world.setBlock(util.grid.at(3, 1, 0), water, false); + scene.world.setBlock(blockPos, water, true); + blockInFront = scene.world.showIndependentSection(util.select.position(3, 1, 0), Direction.NORTH); + scene.world.moveSection(blockInFront, util.vector.of(1, 0, 2), 0); + scene.idle(20); + + scene.overlay.showSelectionWithText(util.select.fromTo(blockPos, blockPos.west(2)), 60) + .colored(PonderPalette.MEDIUM) + .text("Air Flows passing through water create a Washing Setup"); + scene.idle(70); + + stack = AllItems.CRUSHED_GOLD.asStack(); + ItemStack washed = new ItemStack(Items.GOLD_NUGGET, 16); + + entityLink = scene.world.createItemEntity(util.vector.centerOf(blockPos.west(2) + .up(2)), util.vector.of(0, 0.1, 0), stack); + scene.idle(15); + scene.world.modifyEntity(entityLink, e -> e.setMotion(-0.2f, 0, 0)); + scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(stack), 20); + scene.idle(20); + scene.effects.emitParticles(itemVec.add(0, 0.2f, 0), Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), 1, 60); + + scene.overlay.showText(50) + .colored(PonderPalette.WHITE) + .pointAt(itemVec) + .placeNearTarget() + .text("Some interesting new processing can be done with it"); + + scene.idle(60); + scene.world.modifyEntities(ItemEntity.class, ie -> ie.setItem(washed)); + scene.overlay.showControls(new InputWindowElement(itemVec, Pointing.DOWN).withItem(washed), 20); + scene.idle(20); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.idle(20); + + scene.overlay.showText(100) + .colored(PonderPalette.RED) + .pointAt(util.vector.topOf(blockPos.east())) + .placeNearTarget() + .text("The Speed of the Fan does NOT affect the processing speed, only its range"); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.idle(110); + + ElementLink cogs = scene.world.makeSectionIndependent(util.select.fromTo(6, 1, 2, 6, 0, 3) + .add(util.select.fromTo(4, 0, 2, 5, 0, 2))); + scene.world.modifyKineticSpeed(util.select.position(5, 2, 2), f -> f / 3f); + scene.world.moveSection(cogs, util.vector.of(0, 1, 0), 15); + scene.world.moveSection(blockInFront, util.vector.of(0, 1, 0), 15); + scene.world.destroyBlock(blockPos.east()); + scene.world.showSection(util.select.position(blockPos.east() + .up()), Direction.DOWN); + scene.world.setBlock(blockPos.up(), Blocks.WATER.getDefaultState(), false); + + ItemStack sand = new ItemStack(Items.SAND); + ItemStack clay = new ItemStack(Items.CLAY_BALL); + + scene.idle(20); + BlockPos depos = util.grid.at(3, 4, 2); + ElementLink depot = + scene.world.showIndependentSection(util.select.position(depos), Direction.DOWN); + scene.world.moveSection(depot, util.vector.of(-1, -3, 0), 0); + scene.world.createItemOnBeltLike(depos, Direction.NORTH, sand); + scene.idle(10); + Vec3d depotTop = util.vector.topOf(2, 1, 2) + .add(0, 0.25, 0); + scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 30); + scene.idle(30); + scene.world.modifyTileNBT(util.select.position(depos), DepotTileEntity.class, + nbt -> nbt.put("HeldItem", new TransportedItemStack(clay).serializeNBT())); + scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 30); + scene.overlay.showText(90) + .pointAt(depotTop) + .text("Fan Processing can also be applied to Items on Depots and Belts"); + + scene.idle(100); + scene.world.moveSection(depot, util.vector.of(-1, 0, 0), 15); + scene.idle(15); + ElementLink largeCog = + scene.world.showIndependentSection(util.select.position(1, 2, 4), Direction.UP); + ElementLink belt = + scene.world.showIndependentSection(util.select.fromTo(3, 3, 1, 1, 3, 3), Direction.DOWN); + scene.world.moveSection(largeCog, util.vector.of(-1, -2, 0), 0); + scene.world.moveSection(belt, util.vector.of(-1, -2, 0), 0); + ElementLink transported = + scene.world.createItemOnBelt(util.grid.at(3, 3, 3), Direction.SOUTH, sand); + scene.idle(60); + scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 25); + scene.idle(25); + scene.world.changeBeltItemTo(transported, new ItemStack(Items.CLAY_BALL)); + scene.effects.emitParticles(depotTop, Emitter.simple(ParticleTypes.SPIT, Vec3d.ZERO), .5f, 25); + scene.idle(60); + + scene.world.setKineticSpeed(util.select.position(1, 2, 4) + .add(util.select.fromTo(3, 3, 1, 1, 3, 3)), 0); + + } + + public static void source(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("fan_source", "Generating Rotational Force using Encased Fans"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.layersFrom(2), Direction.DOWN); + scene.idle(10); + BlockPos rightFan = util.grid.at(1, 2, 2); + scene.overlay.showText(80) + .text("Fans facing down into a source of heat can provide Rotational Force") + .placeNearTarget() + .pointAt(util.vector.blockSurface(rightFan, Direction.WEST)); + scene.idle(80); + + for (BlockPos pos : new BlockPos[] { rightFan, util.grid.at(3, 2, 2) }) { + scene.idle(10); + scene.world.toggleRedstonePower(util.select.position(pos.north())); + scene.effects.indicateRedstone(pos.north()); + scene.world.setKineticSpeed(util.select.fromTo(pos, pos.up()), 4); + scene.effects.rotationSpeedIndicator(pos.up()); + } + + scene.overlay.showText(90) + .text("When given a Redstone Signal, the Fans will start providing power") + .colored(PonderPalette.RED) + .placeNearTarget() + .pointAt(util.vector.blockSurface(rightFan, Direction.WEST)); + scene.markAsFinished(); + } + +} 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 ffc35cb0c..63ad820b8 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 @@ -41,6 +41,11 @@ public class PonderIndex { PonderRegistry.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch); PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift); + PonderRegistry.forComponents(AllBlocks.ENCASED_FAN) + .addStoryBoard("fan/direction", FanScenes::direction) + .addStoryBoard("fan/processing", FanScenes::processing) + .addStoryBoard("fan/source", FanScenes::source); + PonderRegistry.addStoryBoard(AllBlocks.CREATIVE_MOTOR, "creative_motor", KineticsScenes::creativeMotor); PonderRegistry.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel); PonderRegistry.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank); 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 38bc429ed..abcbfd691 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 @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; @@ -42,6 +43,12 @@ public class ParrotElement extends AnimatedSceneElement { return parrotElement; } + public static ParrotElement flappy(Vec3d location) { + ParrotElement parrotElement = new ParrotElement(location); + parrotElement.pose = parrotElement.new FlappyPose(); + return parrotElement; + } + protected ParrotElement(Vec3d location) { this.location = location; } @@ -61,18 +68,19 @@ public class ParrotElement extends AnimatedSceneElement { if (entity == null) return; - entity.prevPosX = entity.getX(); - entity.prevPosY = entity.getY(); - entity.prevPosZ = entity.getZ(); entity.ticksExisted++; entity.prevRotationYawHead = entity.rotationYawHead; entity.oFlapSpeed = entity.flapSpeed; entity.oFlap = entity.flap; entity.onGround = true; - entity.prevRotationYaw = entity.rotationYaw; - entity.prevRotationPitch = entity.rotationPitch; pose.tick(scene); + + entity.prevPosX = entity.getX(); + entity.prevPosY = entity.getY(); + entity.prevPosZ = entity.getZ(); + entity.prevRotationYaw = entity.rotationYaw; + entity.prevRotationPitch = entity.rotationPitch; } public void setPositionOffset(Vec3d position, boolean immediate) { @@ -153,6 +161,28 @@ public class ParrotElement extends AnimatedSceneElement { } + class FlappyPose extends ParrotPose { + + @Override + void create(PonderWorld world) { + super.create(world); + } + + @Override + void tick(PonderScene scene) { + double length = entity.getPositionVec() + .subtract(entity.prevPosX, entity.prevPosY, entity.prevPosZ) + .length(); + entity.onGround = false; + double phase = Math.min(length * 15, 8); + float f = (float) ((AnimationTickHolder.getTicks() % 100) * phase); + entity.flapSpeed = MathHelper.sin(f) + 1; + if (length == 0) + entity.flapSpeed = 0; + } + + } + class SpinOnComponentPose extends ParrotPose { private BlockPos componentPos; diff --git a/src/main/resources/ponder/fan/direction.nbt b/src/main/resources/ponder/fan/direction.nbt new file mode 100644 index 0000000000000000000000000000000000000000..08e9d02360fcc06c86c6e3dca379632cc8cd40ac GIT binary patch literal 657 zcmV;C0&e{uiwFP!000000M(b#ZqqOnhEHNUO|wZ%2qa#BhuE&zKmu+iqzMGvR9-#Zu+AI_I^0;{#{lDZKw5Y|bDZN_p;)DshVF>wHg1#ox(ryKDGPSg|Q zbK(FF3*hhoPB&OUomoJgH*r`1hX-)F!2{~d1M0kq!vZ)wfYS{TP-hWP=S>_Iz~Q}| z3|MvQ1c;Lwu{gYF^7fADt-bu>V_i^Wl)>N_-9nq0fb_MjWv<-McNYzqpU@AVK)W2` z_XVY2K=Nl_Kyu;?T6;u6kV32qc%B<1*nw5^y2Q~;Rp?ZnQKbHEa%vvY=d0~SUufQ^ z`76zOUF~5>N9^hN4UevadpfE<&mvC;+de;%yZjKX9m{=^Z=WBm)p2l_AImz#_Ul;j zqtg-pUpne_I@km05U_Jt6j)sC|JCKGU8^jD>@8Mkq*K+T)%mp5iB&Ew7NfDOe36kS z()K+7BDnn^N&cl-d##8GN@J&L?C$dE+d7|?B@DLjyv3nbhz@r=Lj$6w3FP(u{&5ymBUf4E7~e0brH{Q zB5b7>qszMrl`i{Wbd9FD#-y;bpmj{CClf3{jAdz&^5vPb5S?G6x+0X)Oq!J@iz#Ax zKh~3$bsx&vgY0Oxvv^9i@)60HjtzB5QEB6**Ev1y($5^!dVyxs!Yl2{M{rskDZkX( r^Z>iPag^5G6!^yX5`UnfbG7qEI{68WRhs@Oq`%-Vqi$0v<_-V={0u@n literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/fan/processing.nbt b/src/main/resources/ponder/fan/processing.nbt new file mode 100644 index 0000000000000000000000000000000000000000..00de4c3fe8b98d8e62f3142c03be41c846260545 GIT binary patch literal 1098 zcmV-Q1hxAgiwFP!000000L@t2Zrer>9o}@IIf)Y79JLk-t*(H5|F1RYXMF#-V zvrVU$o?Yl*tRo$vg7oM@>w=5mQu*}fhb}mYP{kk%^1}g7X{IqBQMR#bY^;inW8lX% z@Z%ZAV^wVIicQPFroe9Ph{vw6sm9|N_;C&Vcm{roxUC(yJOi5oyKRtn+aT||{I~{w zJOe*gewJ;V23(FoP91}s?(*Xr`0)(<6fwI7xo{0~vCEHZ;K!@=3|)D@XaiWF_3Jmj{-JJ#*xGx^any*M)BmgXqI)Mwf2jn2Zx1;(2O_Q)x=-bwVTK0 zfp?xDhJR-^&ra#5%5MCggk+h@VHk&aozm%pKM=8&f^(D(SbspK7wb>DzM$)0biE;f ztpQUMBesO2?dYVS;L;Dorjv|$ik2LnK>Pjkb+iM>65zkV7$wsweR-wiv11%Ch2dz-;wq(X zPU+E_(uU?%ZUU`6g4_XV1>(CLgoL_T!@qArN4GUBmNBdvl*eWEuIaxH% z@_4VwI^LBmd#}l=f;`AT7LQ*qcfxd_cOIn5e8>1ab#StR+RvfRgchXu@+GK*iyz^jG~{Ev$F zOcbA0VF^diu#)zYNdp`-{H`ME+q!L-Q^8T~Twf867ft!FYjE@*uWZaQ1p6vg=aFP$m#@JCH9~~?8#%g{yks~UB4dM zy{_**-1Q-^kMb7y$sQr>sm4E#EVH~x_^vl9whf15x z5We5M5G303 zre8Zc&|6S!l8ea%L-59oE2Nt$n#7Ec(l?X!O@~JsTrKDHyEUd9rOHI6^m?wE_nPW- ztzaeT!l|1uslmZG+&J}OA@#IFym1-`{#3~5mSoNNdZw)1n?#ZV7IlE#H4=8CfBP?yaKQqnVp;VEG Qsk42A&tS6wsqM3SOHq^hpYNaXIB^Y7f$-`HIRNxmNtftv)5FIKcx(MRC=L##4>I5>VyIyW4I62S3=YrWhz!nouo(_ZXvUl(gTpg8B9p^L znqs1^BBK{W4WFoMj>8k0sb0)+ic?O-OkE;F6WgBAQ=ZY&IS$X@h)fO}X{PED89fyl z@7ElMXK+N4Qv)~aP(t~wMclwK?#&(D`r{wp+YKohgZc{^bTTNjgC!Jd18*CLG5{2=RP5JL_c+w`l#>216Vq#V1 zGz?z8saF%beyCZJ=Bkw%L%{x!sg@w_c6+y30pvLaHJ)(Y*G}$AFPHMfRg|i*H0q&e!X{-zT3-nT$ z#>d1;p!6X^N^c)1I6gkJV#XZ~w8cXk@44I|uuswT)x~wI9F9%PJ{3I?pyi{a{c`SJu#8`3-*n`Tkptya)gQy}1Vu literal 0 HcmV?d00001