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 001/124] 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 002/124] 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 003/124] 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 004/124] 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 005/124] 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 006/124] 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 007/124] 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 5a1984eae4920cbb072c72c229a68e9ab99018ec Mon Sep 17 00:00:00 2001 From: Alepod Date: Fri, 19 Feb 2021 16:42:25 +0200 Subject: [PATCH 008/124] Update ru_ru.json Minor typo fixed --- src/main/resources/assets/create/lang/ru_ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index 87369b59b..349a9dd93 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -1671,7 +1671,7 @@ "block.create.redstone_link.tooltip": "REDSTONE LINK", "block.create.redstone_link.tooltip.summary": "_Беспроводной_ _передатчик_ сигнала красного камня. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", "block.create.redstone_link.tooltip.condition1": "Когда приведен в действие", - "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той-же _частоты_ выдаёт сигнал красного камня или наоборот.", + "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той же _частоты_ выдаёт сигнал красного камня или наоборот.", "block.create.redstone_link.tooltip.control1": "При ПКМ предметом", "block.create.redstone_link.tooltip.action1": "Устанавливает частоту для этого предмета. Всего _два_ разных предмета могут быть использованы в комбинации для определения частоты.", "block.create.redstone_link.tooltip.control2": "ПКМ крадясь", From 619045a505de1c7a050b4a92decf16fdafdb638c Mon Sep 17 00:00:00 2001 From: Alepod Date: Fri, 19 Feb 2021 16:44:49 +0200 Subject: [PATCH 009/124] Update ru_ru.json More mistakes fixed --- .../resources/assets/create/lang/ru_ru.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/assets/create/lang/ru_ru.json b/src/main/resources/assets/create/lang/ru_ru.json index 87369b59b..52a2505db 100644 --- a/src/main/resources/assets/create/lang/ru_ru.json +++ b/src/main/resources/assets/create/lang/ru_ru.json @@ -773,7 +773,7 @@ "create.gui.terrainzapper.tool.overlay": "Наложение", "create.gui.terrainzapper.tool.flatten": "Выравнивание", - "create.terrainzapper.shiftRightClickToSet": "ПКМ крадясь, чтобы выбрать форму", + "create.terrainzapper.shiftRightClickToSet": "ПКМ крадучись, чтобы выбрать форму", "create.blockzapper.usingBlock": "С помощью: %1$s", "create.blockzapper.componentUpgrades": "Обновления компонентов:", @@ -1304,7 +1304,7 @@ "item.create.wand_of_symmetry.tooltip.action1": "_Создаёт_ или _Перемещает_ зеркало", "item.create.wand_of_symmetry.tooltip.control2": "ПКМ в воздух", "item.create.wand_of_symmetry.tooltip.action2": "_Убирает_ зеркало", - "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадясь", + "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадучись", "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", @@ -1313,7 +1313,7 @@ "item.create.handheld_blockzapper.tooltip.action1": "Устанавливает выбранный блок как материал.", "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", - "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадучись", "item.create.handheld_blockzapper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", @@ -1322,7 +1322,7 @@ "item.create.handheld_worldshaper.tooltip.action1": "Устанавливает блоки, помещенные инструментом, в целевой блок.", "item.create.handheld_worldshaper.tooltip.control2": "ПКМ на блок", "item.create.handheld_worldshaper.tooltip.action2": "Применяет выбранную _кисть_ и _инструмент_ в выбранном месте.", - "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадучись", "item.create.handheld_worldshaper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", @@ -1359,7 +1359,7 @@ "item.create.schematic.tooltip.summary": "Содержит структуру, которая будет позиционироваться и помещаться в мир. Расположите голограмму по своему усмотрению и используйте _схематичную пушку_ для ее построения.", "item.create.schematic.tooltip.condition1": "При удерживании", "item.create.schematic.tooltip.behaviour1": "Может быть позиционирован с помощью инструментов на экране.", - "item.create.schematic.tooltip.control1": "ПКМ крадясь", + "item.create.schematic.tooltip.control1": "ПКМ крадучись", "item.create.schematic.tooltip.action1": "Открывает _интерфейс_ для ввода _точных_ _координат_.", "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", @@ -1372,7 +1372,7 @@ "item.create.schematic_and_quill.tooltip.action1": "Выберите угловые точки / подтвердите сохранение.", "item.create.schematic_and_quill.tooltip.control2": "Удержание Ctrl", "item.create.schematic_and_quill.tooltip.action2": "Выберите точки в воздухе. Прокрутка для настройки расстояния.", - "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадясь", + "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадучись", "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _удаляет_ выделение.", "block.create.schematicannon.tooltip": "SCHEMATICANNON", @@ -1424,7 +1424,7 @@ "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", "item.create.belt_connector.tooltip.control1": "ПКМ по валу", "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива конвейера. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению конвейера.", - "item.create.belt_connector.tooltip.control2": "ПКМ крадясь", + "item.create.belt_connector.tooltip.control2": "ПКМ крадучись", "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для конвейера.", "item.create.goggles.tooltip": "GOGGLES", @@ -1438,7 +1438,7 @@ "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", "item.create.wrench.tooltip.control1": "ПКМ по кинетическому блоку", "item.create.wrench.tooltip.action1": "_Поворачивает_ _компонент_ с которым вы взаимодействуете _к_ _лицу_ или _от_ _лица_.", - "item.create.wrench.tooltip.control2": "ПКМ крадясь", + "item.create.wrench.tooltip.control2": "ПКМ крадучись", "item.create.wrench.tooltip.action2": "Разбирает кинетические компоненты и помещает их обратно в ваш инвентарь.", "block.create.creative_motor.tooltip": "CREATIVE MOTOR", @@ -1674,7 +1674,7 @@ "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той-же _частоты_ выдаёт сигнал красного камня или наоборот.", "block.create.redstone_link.tooltip.control1": "При ПКМ предметом", "block.create.redstone_link.tooltip.action1": "Устанавливает частоту для этого предмета. Всего _два_ разных предмета могут быть использованы в комбинации для определения частоты.", - "block.create.redstone_link.tooltip.control2": "ПКМ крадясь", + "block.create.redstone_link.tooltip.control2": "ПКМ крадучись", "block.create.redstone_link.tooltip.action2": "Переключение между режимом _приемника_ и _передатчика_.", "block.create.nixie_tube.tooltip": "NIXIE TUBE", 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 010/124] 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: Fri, 19 Feb 2021 17:16:28 -0300 Subject: [PATCH 011/124] Update es_es.json (HOTFIX) -Translated unfinished strings -Some improvements and fixes --- .../resources/assets/create/lang/es_es.json | 61 +++++++++++-------- 1 file changed, 34 insertions(+), 27 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 787422bb8..989f4c08c 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -107,7 +107,7 @@ "block.create.dolomite_pillar": "Pilar de dolomita", "block.create.encased_chain_drive": "Cadena de transmisión revestida", "block.create.encased_fan": "Ventilador revestido", - "block.create.encased_fluid_pipe": "Tubería de fluidos de cobre revestida", + "block.create.encased_fluid_pipe": "Tubería de fluidos de cobre reforzada", "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", @@ -165,7 +165,7 @@ "block.create.gantry_shaft": "Eje de grúa", "block.create.gearbox": "Caja de transmisión", "block.create.gearshift": "Caja de cambios", - "block.create.glass_fluid_pipe": "Tubo de cristal para fluidos", + "block.create.glass_fluid_pipe": "Tubería de fluidos de cristal", "block.create.granite_bricks": "Ladrillos de granito", "block.create.granite_bricks_slab": "Losa de ladrillos de granito", "block.create.granite_bricks_stairs": "Escaleras de ladrillos de granito", @@ -349,7 +349,7 @@ "block.create.redstone_link": "Enlace de Redstone", "block.create.refined_radiance_casing": "Revestidor de radiante", "block.create.reinforced_rail": "Raíl reforzado", - "block.create.rope": "Soga", + "block.create.rope": "Cuerda", "block.create.rope_pulley": "Polea de cuerda", "block.create.rotation_speed_controller": "Controlador de velocidad de rotación", "block.create.sail_frame": "Marco de vela", @@ -506,7 +506,7 @@ "advancement.create.splitter_tunnel": "Divide y vencerás", "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de latón.", "advancement.create.chute": "Caída en picado", - "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la correa.", + "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la cinta.", "advancement.create.upward_chute": "Abducción aérea", "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", "advancement.create.belt_funnel": "Colgantes con forma de embudo", @@ -532,7 +532,7 @@ "advancement.create.aesthetics": "Boom, Estética!", "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", "advancement.create.reinforced": "Boom, Reforzado!", - "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una correa.", + "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una cinta.", "advancement.create.water_wheel": "Aprovechar la hidráulica", "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", "advancement.create.chocolate_wheel": "Potencia de buen gusto", @@ -684,6 +684,7 @@ "create.recipe.mechanical_crafting": "Elaboración mecánica", "create.recipe.automatic_shaped": "Elaboración automatizada de productos con forma", "create.recipe.block_cutting": "Corte de bloques", + "create.recipe.wood_cutting": "Corte de maderas", "create.recipe.blockzapper_upgrade": "Blockzapper", "create.recipe.sandpaper_polishing": "Pulido con papel de lija", "create.recipe.mystery_conversion": "Conversión misteriosa", @@ -844,13 +845,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "Pasar al carril superior en %1$s%%", "create.gui.sequenced_gearshift.title": "Cambio de marchas secuenciado", "create.gui.sequenced_gearshift.instruction": "Instrucción", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "Giro por ángulo", "create.gui.sequenced_gearshift.instruction.turn_angle": "Giro", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Ángulo", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "Giro para mover el pistón/polea/grúa", "create.gui.sequenced_gearshift.instruction.turn_distance": "Pistón", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distancia", - "create.gui.sequenced_gearshift.instruction.wait": "Espera", - "create.gui.sequenced_gearshift.instruction.wait.duration": "Duración", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "Tiempo de retraso", + "create.gui.sequenced_gearshift.instruction.delay": "Retraso", + "create.gui.sequenced_gearshift.instruction.delay.duration": "Duración", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "Fin", "create.gui.sequenced_gearshift.instruction.end": "Fin", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "En espera de un Pulso de Redstone", + "create.gui.sequenced_gearshift.instruction.await": "En espera", "create.gui.sequenced_gearshift.speed": "Velocidad, Dirección", "create.gui.sequenced_gearshift.speed.forward": "Velocidad de entrada, hacia adelante", "create.gui.sequenced_gearshift.speed.forward_fast": "Doble velocidad, hacia adelante", @@ -1159,19 +1166,19 @@ "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", "block.create.andesite_casing.tooltip": "REVESTIDOR DE ANDESITA", - "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _encastrar ejes_ y _correas._", + "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _revestir ejes_ y _cintas._", "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_.", "block.create.andesite_funnel.tooltip.condition1": "Comportamiento general", "block.create.andesite_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo", - "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", + "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en cintas, depósitos y similares", "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave.", "block.create.andesite_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.andesite_funnel.tooltip.behaviour3": "Transferirá los artículos hacia abajo, como una tolva sin búfer.", "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", - "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _correas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra correa o depósito al lado de la correa principal.", + "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _cintas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra cinta o depósito al lado de la cinta principal.", "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", @@ -1179,15 +1186,15 @@ "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", - "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", + "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en cintas, depósitos y similares", "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave Inglesa.", "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", "block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN", - "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _correas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", + "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _cintas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", - "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una correa a otra.", + "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una cinta a otra.", "block.create.brass_tunnel.tooltip.condition2": "Filtrado", "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de latón_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", @@ -1202,8 +1209,8 @@ "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluidos", "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluidos_ con _Revestimiento de cobre_. Las tuberías de fluidos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", - "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REVESTIDO", - "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos revestido con cobre.", + "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REFORZADO", + "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos reforzado con más cobre.", "block.create.copper_valve_handle.tooltip": "ASA DE VÁLVULA DE COBRE", "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. ¡Ten cuidado de no agotarte!", @@ -1218,12 +1225,12 @@ "block.create.chute.tooltip": "DUCTO", "block.create.chute.tooltip.summary": "_Recoge_ y _Transporta_ elementos en vertical o en diagonal. Puede tanto coger como colocar objetos en _contenedores de objetos_. También puede interactuar con los ductos desde el lateral utilizando _tolvas_ o _embudos montados_.", "block.create.chute.tooltip.condition1": "Cuando se alimenta con un ventilador", - "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _correas_.", + "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _cintas_.", "block.create.depot.tooltip": "DEPÓSITO", "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _elementos_. Proporciona un punto de interacción para varias máquinas", "block.create.depot.tooltip.condition1": "Click derecho en el depósito", - "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _Correa_ también funcionan en un _Depósito_.", + "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _cinta_ también funcionan en un _Depósito_.", "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", @@ -1285,7 +1292,7 @@ "block.create.spout.tooltip.condition1": "Transferencia de fluidos", "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", "block.create.spout.tooltip.condition2": "Automatización de fluidos", - "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _correa_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", + "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _cinta_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", @@ -1295,7 +1302,7 @@ "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", - "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Autoensambladores_", + "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Cintas_, _Depósitos_, _Embudos_ y _Autoensambladores_", "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", "block.create.mechanical_arm.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa", @@ -1410,7 +1417,7 @@ "block.create.gearshift.tooltip.condition1": "Cuando se alimenta", "block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida", - "bloque.crear.embrague.información.sobre.herramientas": "EMBRAGUE", + "block.create.clutch.tooltip": "Embrague", "block.create.clutch.tooltip.summary": "Un control para conectar/desconectar la rotación de los ejes conectados", "block.create.clutch.tooltip.condition1": "Cuando se acciona", "block.create.clutch.tooltip.behaviour1": "_Detiene_ el transporte de la rotación al otro lado", @@ -1493,8 +1500,8 @@ "block.create.mechanical_press.tooltip.summary": "Un pistón de fuerza para comprimir los objetos que tiene debajo. Requiere una _fuerza de rotación_ constante", "block.create.mechanical_press.tooltip.condition1": "Cuando es impulsado por Redstone", "block.create.mechanical_press.tooltip.behaviour1": "Comienza a _comprimir_ los objetos que caen debajo", - "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una correa", - "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la correa", + "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una cinta", + "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la cinta", "block.create.mechanical_press.tooltip.condition3": "Cuando está por encima de la Cuenca", "block.create.mechanical_press.tooltip.behaviour3": "Comienza a _compactar artículos_ en la cuenca siempre que estén presentes todos los ingredientes necesarios", @@ -1519,13 +1526,13 @@ "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", "block.create.mechanical_crafter.tooltip": "AUTOENSAMBLADOR MECÁNICO", - "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus correas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", + "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus cintas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", - "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", + "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las cintas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los autoensambladores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", @@ -1630,7 +1637,7 @@ "block.create.secondary_linear_chassis.tooltip": "CHASIS LINEAL SECUNDARIO", "block.create.secondary_linear_chassis.tooltip.summary": "Un segundo tipo de _Chasis lineal_ que no se conecta al otro", - "bloque.crear.chasis_radial.tooltip": "CHASIS DE ROTACIÓN", + "block.create.radial_chassis.tooltip": "CHASIS RADIAL", "block.create.radial_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", "block.create.radial_chassis.tooltip.condition1": "Cuando se mueve", "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl]).", @@ -1716,7 +1723,7 @@ "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", "block.create.brass_casing.tooltip": "REVESTIDOR DE LATÓN", - "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _correas._", + "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _cintas._", "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", @@ -1792,6 +1799,6 @@ "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", - "_": "Gracias por traducir Create!" + "_": "Thank you for translating Create!" } From a32cbe15a30f770ef87b934248b0db6e66e6ba56 Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Sat, 20 Feb 2021 15:08:58 +0100 Subject: [PATCH 012/124] Consistently Crushing Entities - Fix known issue with omnidirectional crushing wheels inconsistently moving crushed mob drops to the output location. --- .../CrushingWheelControllerTileEntity.java | 22 +++++++++++++++---- .../crusher/CrushingWheelTileEntity.java | 10 +-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java index 2fb13c6c0..858e8f5ce 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelControllerTileEntity.java @@ -20,6 +20,7 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; @@ -199,12 +200,25 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity { return; if (!(processingEntity instanceof ItemEntity)) { + Vec3d entityOutPos = outPos.add(facing.getAxis() == Axis.X ? .5f * offset : 0f + , facing.getAxis() == Axis.Y ? .5f * offset : 0f + , facing.getAxis() == Axis.Z ? .5f * offset : 0f); + int crusherDamage = AllConfigs.SERVER.kinetics.crushingDamage.get(); + + if (processingEntity instanceof LivingEntity) { + if ((((LivingEntity) processingEntity).getHealth() - crusherDamage <= 0) //Takes LivingEntity instances as exception, so it can move them before it would kill them. + && (((LivingEntity) processingEntity).hurtTime <= 0)) { //This way it can actually output the items to the right spot. + processingEntity.setPosition(entityOutPos.x + , entityOutPos.y + , entityOutPos.z); + } + } processingEntity.attackEntityFrom(CrushingWheelTileEntity.damageSource, - AllConfigs.SERVER.kinetics.crushingDamage.get()); + crusherDamage); if (!processingEntity.isAlive()) { - processingEntity.setPosition(outPos.x + (facing.getAxis() == Axis.X ? .75f * offset : 0f) //This is supposed to move the mobs to the output location - , outPos.y + (facing.getAxis() == Axis.Y ? .75f * offset : 0f) //So the item drops end up on the other end - , outPos.z + (facing.getAxis() == Axis.Z ? .75f * offset : 0f)); //This, however, does not currently work consistently for non-downwards crushers. + processingEntity.setPosition(entityOutPos.x + , entityOutPos.y + , entityOutPos.z); } return; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java index 8d94992d5..63aced587 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java @@ -7,7 +7,6 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LootingLevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -50,14 +49,7 @@ public class CrushingWheelTileEntity extends KineticTileEntity { public static void crushingIsFortunate(LootingLevelEvent event) { if (event.getDamageSource() != damageSource) return; - event.setLootingLevel(2); - } - - @SubscribeEvent - public static void crushingTeleportsEntities(LivingDeathEvent event) { - if (event.getSource() != damageSource) - return; - event.getEntity().setPos(event.getEntity().getX(), Math.floor(event.getEntity().getY()) - .5f, event.getEntity().getZ()); + event.setLootingLevel(2); //This does not currently increase mob drops. It seems like this only works for damage done by an entity. } } From 41cb2ad9374f55d22dbccc491147ec21b268ed8b Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Sat, 20 Feb 2021 18:50:40 +0100 Subject: [PATCH 013/124] Stop explody crusher drops - Remove the velocity of item entities dropped by crushed mobs so they fall neatly onto belts rather than exploding everywhere. --- .../components/crusher/CrushingWheelTileEntity.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java index 63aced587..fb6117988 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crusher/CrushingWheelTileEntity.java @@ -3,10 +3,13 @@ package com.simibubi.create.content.contraptions.components.crusher; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.utility.Iterate; +import net.minecraft.entity.item.ItemEntity; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.DamageSource; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; +import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.event.entity.living.LootingLevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; @@ -52,4 +55,14 @@ public class CrushingWheelTileEntity extends KineticTileEntity { event.setLootingLevel(2); //This does not currently increase mob drops. It seems like this only works for damage done by an entity. } + @SubscribeEvent + public static void handleCrushedMobDrops(LivingDropsEvent event) { + if (event.getSource() != CrushingWheelTileEntity.damageSource) + return; + Vec3d outSpeed = Vec3d.ZERO; + for (ItemEntity outputItem : event.getDrops()) { + outputItem.setMotion(outSpeed); + } + } + } From b5f9cbc4b39a69f8abf3ef442c38f1b635aa1c2d Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 20 Feb 2021 15:22:07 -0800 Subject: [PATCH 014/124] improve compatibility layer. --- .../foundation/render/backend/Backend.java | 47 ++-------- .../render/backend/gl/GlBuffer.java | 8 +- .../render/backend/gl/GlVertexArray.java | 9 +- .../backend/gl/versioned/DrawInstanced.java | 54 ++++++++++++ .../backend/gl/versioned/GlFunctions.java | 85 +++++++++++++++++++ .../backend/gl/versioned/GlVersioned.java | 10 ++- .../backend/gl/versioned/InstancedArrays.java | 43 ++++++++++ .../gl/versioned/VertexArrayObject.java | 77 +++++++++++++++++ .../backend/instancing/InstancedModel.java | 7 +- 9 files changed, 289 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 6a416b187..858d54572 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -11,6 +11,7 @@ import java.util.Map; import java.util.function.Consumer; import java.util.function.Predicate; +import com.simibubi.create.foundation.render.backend.gl.versioned.GlFunctions; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.GL; @@ -44,16 +45,12 @@ public class Backend { private static boolean enabled; public static GLCapabilities capabilities; - private static MapBuffer mapBuffer; + public static GlFunctions functions; public Backend() { throw new IllegalStateException(); } - public static void mapBuffer(int target, int offset, int length, Consumer upload) { - mapBuffer.mapBuffer(target, offset, length, upload); - } - /** * Register a shader program. TODO: replace with forge registry? */ @@ -71,47 +68,21 @@ public class Backend { return (P) programs.get(spec); } - /** - * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. - * - * @param clazz The class of the versioning enum. - * @param The type of the versioning enum. - * @return The first defined enum variant to return true. - */ - public static & GlVersioned> V getLatest(Class clazz) { - return getLatest(clazz, capabilities); - } - - /** - * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. - * - * @param clazz The class of the versioning enum. - * @param caps The current system's supported features. - * @param The type of the versioning enum. - * @return The first defined enum variant to return true. - */ - public static & GlVersioned> V getLatest(Class clazz, GLCapabilities caps) { - V[] constants = clazz.getEnumConstants(); - V last = constants[constants.length - 1]; - if (!last.supported(caps)) { - throw new IllegalStateException(""); - } - - return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().orElse(last); + public static boolean available() { + return canUseVBOs(); } public static boolean canUseInstancing() { - return enabled && gl33(); + return enabled && + functions.vertexArrayObjectsSupported() && + functions.drawInstancedSupported() && + functions.instancedArraysSupported(); } public static boolean canUseVBOs() { return enabled && gl20(); } - public static boolean available() { - return enabled && gl20(); - } - public static boolean gl33() { return capabilities.OpenGL33; } @@ -136,7 +107,7 @@ public class Backend { private static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { if (predicate.test(VanillaResourceType.SHADERS)) { capabilities = GL.createCapabilities(); - mapBuffer = getLatest(MapBuffer.class); + functions = new GlFunctions(capabilities); OptifineHandler.refresh(); refresh(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java index 42a72736b..8420dab87 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java @@ -3,9 +3,9 @@ package com.simibubi.create.foundation.render.backend.gl; import java.nio.ByteBuffer; import java.util.function.Consumer; -import org.lwjgl.opengl.GL20; - import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.versioned.GlFunctions; +import org.lwjgl.opengl.GL20; public class GlBuffer extends GlObject { @@ -35,11 +35,11 @@ public class GlBuffer extends GlObject { } public void map(int length, Consumer upload) { - Backend.mapBuffer(bufferType, 0, length, upload); + Backend.functions.mapBuffer(bufferType, 0, length, upload); } public void map(int offset, int length, Consumer upload) { - Backend.mapBuffer(bufferType, offset, length, upload); + Backend.functions.mapBuffer(bufferType, offset, length, upload); } protected void deleteInternal(int handle) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java index 33ff7461b..cf6229f6e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java @@ -2,19 +2,20 @@ package com.simibubi.create.foundation.render.backend.gl; import java.util.function.Consumer; +import com.simibubi.create.foundation.render.backend.Backend; import org.lwjgl.opengl.GL30; public class GlVertexArray extends GlObject { public GlVertexArray() { - setHandle(GL30.glGenVertexArrays()); + setHandle(Backend.functions.genVertexArrays()); } public void bind() { - GL30.glBindVertexArray(handle()); + Backend.functions.bindVertexArray(handle()); } public void unbind() { - GL30.glBindVertexArray(0); + Backend.functions.bindVertexArray(0); } public void with(Consumer action) { @@ -24,6 +25,6 @@ public class GlVertexArray extends GlObject { } protected void deleteInternal(int handle) { - GL30.glDeleteVertexArrays(handle); + Backend.functions.deleteVertexArrays(handle); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java new file mode 100644 index 000000000..4c206581d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/DrawInstanced.java @@ -0,0 +1,54 @@ +package com.simibubi.create.foundation.render.backend.gl.versioned; + +import org.lwjgl.opengl.*; + +public enum DrawInstanced implements GlVersioned { + GL31_DRAW_INSTANCED { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL31; + } + + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + GL31.glDrawArraysInstanced(mode, first, count, primcount); + } + }, + ARB_DRAW_INSTANCED { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_draw_instanced; + } + + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + ARBDrawInstanced.glDrawArraysInstancedARB(mode, first, count, primcount); + } + }, + EXT_DRAW_INSTANCED { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_EXT_draw_instanced; + } + + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + EXTDrawInstanced.glDrawArraysInstancedEXT(mode, first, count, primcount); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } + + @Override + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + throw new UnsupportedOperationException(); + } + } + + ; + + public abstract void drawArraysInstanced(int mode, int first, int count, int primcount); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java new file mode 100644 index 000000000..1345661fc --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java @@ -0,0 +1,85 @@ +package com.simibubi.create.foundation.render.backend.gl.versioned; + +import org.lwjgl.opengl.GLCapabilities; + +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.function.Consumer; + +/** + * An instance of this class stores information + * about what OpenGL features are available. + * + * Each field stores an enum variant that provides access to the + * most appropriate version of a feature for the current system. + */ +public class GlFunctions { + public final MapBuffer mapBuffer; + + public final VertexArrayObject vertexArrayObject; + public final InstancedArrays instancedArrays; + public final DrawInstanced drawInstanced; + + public GlFunctions(GLCapabilities caps) { + mapBuffer = getLatest(MapBuffer.class, caps); + + vertexArrayObject = getLatest(VertexArrayObject.class, caps); + instancedArrays = getLatest(InstancedArrays.class, caps); + drawInstanced = getLatest(DrawInstanced.class, caps); + } + + public void mapBuffer(int target, int offset, int length, Consumer upload) { + mapBuffer.mapBuffer(target, offset, length, upload); + } + + public void vertexAttribDivisor(int index, int divisor) { + instancedArrays.vertexAttribDivisor(index, divisor); + } + + public void drawArraysInstanced(int mode, int first, int count, int primcount) { + drawInstanced.drawArraysInstanced(mode, first, count, primcount); + } + + public int genVertexArrays() { + return vertexArrayObject.genVertexArrays(); + } + + public void deleteVertexArrays(int array) { + vertexArrayObject.deleteVertexArrays(array); + } + + public void bindVertexArray(int array) { + vertexArrayObject.bindVertexArray(array); + } + + public boolean vertexArrayObjectsSupported() { + return vertexArrayObject != VertexArrayObject.UNSUPPORTED; + } + + public boolean instancedArraysSupported() { + return instancedArrays != InstancedArrays.UNSUPPORTED; + } + + public boolean drawInstancedSupported() { + return drawInstanced != DrawInstanced.UNSUPPORTED; + } + + /** + * Get the most compatible version of a specific OpenGL feature by iterating over enum constants in order. + * + * @param clazz The class of the versioning enum. + * @param caps The current system's supported features. + * @param The type of the versioning enum. + * @return The first defined enum variant to return true. + */ + public static & GlVersioned> V getLatest(Class clazz, GLCapabilities caps) { + V[] constants = clazz.getEnumConstants(); + V last = constants[constants.length - 1]; + if (!last.supported(caps)) { + throw new IllegalStateException(""); + } + + return Arrays.stream(constants).filter(it -> it.supported(caps)).findFirst().get(); + } +} + diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java index 53d929ea0..6f456c802 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlVersioned.java @@ -2,7 +2,15 @@ package com.simibubi.create.foundation.render.backend.gl.versioned; import org.lwjgl.opengl.GLCapabilities; - +/** + * This interface should be implemented by enums such that the + * last defined variant always returns true. + */ public interface GlVersioned { + /** + * Queries whether this variant is supported by the current system. + * @param caps The {@link GLCapabilities} reported by the current system. + * @return true if this variant is supported, or if this is the last defined variant. + */ boolean supported(GLCapabilities caps); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java new file mode 100644 index 000000000..1c000a37d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/InstancedArrays.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.render.backend.gl.versioned; + +import org.lwjgl.opengl.*; + +public enum InstancedArrays implements GlVersioned { + GL33_INSTANCED_ARRAYS { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL33; + } + + @Override + public void vertexAttribDivisor(int index, int divisor) { + GL33.glVertexAttribDivisor(index, divisor); + } + }, + ARB_INSTANCED_ARRAYS { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_instanced_arrays; + } + + @Override + public void vertexAttribDivisor(int index, int divisor) { + ARBInstancedArrays.glVertexAttribDivisorARB(index, divisor); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } + + @Override + public void vertexAttribDivisor(int index, int divisor) { + throw new UnsupportedOperationException(); + } + } + + ; + + public abstract void vertexAttribDivisor(int index, int divisor); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java new file mode 100644 index 000000000..58b9f0fc8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/VertexArrayObject.java @@ -0,0 +1,77 @@ +package com.simibubi.create.foundation.render.backend.gl.versioned; + +import org.lwjgl.opengl.*; + +public enum VertexArrayObject implements GlVersioned { + GL30_VAO { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL30; + } + + @Override + public int genVertexArrays() { + return GL30.glGenVertexArrays(); + } + + @Override + public void bindVertexArray(int array) { + GL30.glBindVertexArray(array); + } + + @Override + public void deleteVertexArrays(int array) { + GL30.glDeleteVertexArrays(array); + } + }, + ARB_VAO { + @Override + public boolean supported(GLCapabilities caps) { + return caps.GL_ARB_vertex_array_object; + } + + @Override + public int genVertexArrays() { + return ARBVertexArrayObject.glGenVertexArrays(); + } + + @Override + public void bindVertexArray(int array) { + ARBVertexArrayObject.glBindVertexArray(array); + } + + @Override + public void deleteVertexArrays(int array) { + ARBVertexArrayObject.glDeleteVertexArrays(array); + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } + + @Override + public int genVertexArrays() { + throw new UnsupportedOperationException(); + } + + @Override + public void bindVertexArray(int array) { + throw new UnsupportedOperationException(); + } + + @Override + public void deleteVertexArrays(int array) { + throw new UnsupportedOperationException(); + } + } + + ; + + public abstract int genVertexArrays(); + + public abstract void bindVertexArray(int array); + + public abstract void deleteVertexArrays(int array); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index b18cffcc4..3b092c919 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -5,11 +5,10 @@ import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.function.Consumer; +import com.simibubi.create.foundation.render.backend.Backend; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL31; -import org.lwjgl.opengl.GL33; import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.backend.BufferedModel; @@ -116,7 +115,7 @@ public abstract class InstancedModel extends BufferedMod protected void doRender() { vao.with(vao -> { renderSetup(); - GL31.glDrawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); + Backend.functions.drawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); }); } @@ -163,7 +162,7 @@ public abstract class InstancedModel extends BufferedMod instanceFormat.vertexAttribPointers(staticAttributes); for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { - GL33.glVertexAttribDivisor(i + staticAttributes, 1); + Backend.functions.vertexAttribDivisor(i + staticAttributes, 1); } }); From c4e1f680c9cce2c9359a4a2e3888ecf5676efc7b Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 21 Feb 2021 03:18:04 +0100 Subject: [PATCH 015/124] 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 18:12:19 +0100 Subject: [PATCH 016/124] composting, but fancy - add the composter as a mechanical arm interaction point --- .../mechanicalArm/ArmInteractionPoint.java | 106 ++++++++++-------- 1 file changed, 57 insertions(+), 49 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java index 7b4643ef0..563bd51cc 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInteractionPoint.java @@ -1,9 +1,5 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; -import java.util.function.Supplier; - -import javax.annotation.Nullable; - import com.google.common.collect.ImmutableMap; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; @@ -25,10 +21,10 @@ import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBe import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.ComposterBlock; import net.minecraft.block.JukeboxBlock; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.MusicDiscItem; @@ -50,10 +46,14 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.InvWrapper; + +import javax.annotation.Nullable; +import java.util.function.Supplier; public abstract class ArmInteractionPoint { - static enum Mode { + enum Mode { DEPOSIT, TAKE } @@ -65,20 +65,21 @@ public abstract class ArmInteractionPoint { private ArmAngleTarget cachedAngles; private static ImmutableMap> POINTS = - ImmutableMap.>builder() - .put(new Saw(), Saw::new) - .put(new Belt(), Belt::new) - .put(new Depot(), Depot::new) - .put(new Chute(), Chute::new) - .put(new Basin(), Basin::new) - .put(new Funnel(), Funnel::new) - .put(new Jukebox(), Jukebox::new) - .put(new Crafter(), Crafter::new) - .put(new Deployer(), Deployer::new) - .put(new Millstone(), Millstone::new) - .put(new BlazeBurner(), BlazeBurner::new) - .put(new CrushingWheels(), CrushingWheels::new) - .build(); + ImmutableMap.>builder() + .put(new Saw(), Saw::new) + .put(new Belt(), Belt::new) + .put(new Depot(), Depot::new) + .put(new Chute(), Chute::new) + .put(new Basin(), Basin::new) + .put(new Funnel(), Funnel::new) + .put(new Jukebox(), Jukebox::new) + .put(new Crafter(), Crafter::new) + .put(new Deployer(), Deployer::new) + .put(new Composter(), Composter::new) + .put(new Millstone(), Millstone::new) + .put(new BlazeBurner(), BlazeBurner::new) + .put(new CrushingWheels(), CrushingWheels::new) + .build(); public ArmInteractionPoint() { cachedHandler = LazyOptional.empty(); @@ -118,8 +119,8 @@ public abstract class ArmInteractionPoint { ArmAngleTarget getTargetAngles(BlockPos armPos, boolean ceiling) { if (cachedAngles == null) - cachedAngles = - new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling); + cachedAngles = new ArmAngleTarget(armPos, getInteractionPositionVector(), getInteractionDirection(), ceiling); + return cachedAngles; } @@ -166,8 +167,7 @@ public abstract class ArmInteractionPoint { for (ArmInteractionPoint armInteractionPoint : POINTS.keySet()) if (armInteractionPoint.isValid(world, pos, state)) - point = POINTS.get(armInteractionPoint) - .get(); + point = POINTS.get(armInteractionPoint).get(); if (point != null) { point.state = state; @@ -222,7 +222,7 @@ public abstract class ArmInteractionPoint { @Override boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { return AllBlocks.MECHANICAL_SAW.has(state) && state.get(SawBlock.FACING) == Direction.UP - && ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0; + && ((KineticTileEntity) reader.getTileEntity(pos)).getSpeed() != 0; } } @@ -245,6 +245,25 @@ public abstract class ArmInteractionPoint { } + static class Composter extends TopFaceArmInteractionPoint { + + @Override + Vec3d getInteractionPositionVector() { + return new Vec3d(pos).add(.5f, 13 / 16f, .5f); + } + + @Override + boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { + return Blocks.COMPOSTER.equals(state.getBlock()); + } + + @Nullable + @Override + IItemHandler getHandler(World world) { + return new InvWrapper(((ComposterBlock) Blocks.COMPOSTER).createInventory(world.getBlockState(pos), world, pos)); + } + } + static class Deployer extends ArmInteractionPoint { @Override @@ -254,14 +273,12 @@ public abstract class ArmInteractionPoint { @Override Direction getInteractionDirection() { - return state.get(DeployerBlock.FACING) - .getOpposite(); + return state.get(DeployerBlock.FACING).getOpposite(); } @Override Vec3d getInteractionPositionVector() { - return super.getInteractionPositionVector() - .add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.65f)); + return super.getInteractionPositionVector().add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.65f)); } } @@ -281,15 +298,13 @@ public abstract class ArmInteractionPoint { @Override ItemStack insert(World world, ItemStack stack, boolean simulate) { ItemStack input = stack.copy(); - if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true) - .getResult() - .isEmpty()) { + if (!BlazeBurnerBlock.tryInsert(state, world, pos, input, false, true).getResult().isEmpty()) { return stack; } ActionResult res = BlazeBurnerBlock.tryInsert(state, world, pos, input, false, simulate); return res.getType() == ActionResultType.SUCCESS - ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) - : stack; + ? ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1) + : stack; } @Override @@ -306,8 +321,7 @@ public abstract class ArmInteractionPoint { @Override Direction getInteractionDirection() { - return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING) - .getOpposite(); + return state.get(MechanicalCrafterBlock.HORIZONTAL_FACING).getOpposite(); } @Override @@ -325,8 +339,7 @@ public abstract class ArmInteractionPoint { @Override Vec3d getInteractionPositionVector() { - return super.getInteractionPositionVector() - .add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.5f)); + return super.getInteractionPositionVector().add(new Vec3d(getInteractionDirection().getDirectionVec()).scale(.5f)); } } @@ -361,8 +374,7 @@ public abstract class ArmInteractionPoint { return stack; JukeboxBlock jukeboxBlock = (JukeboxBlock) state.getBlock(); JukeboxTileEntity jukeboxTE = (JukeboxTileEntity) tileEntity; - if (!jukeboxTE.getRecord() - .isEmpty()) + if (!jukeboxTE.getRecord().isEmpty()) return stack; if (!(stack.getItem() instanceof MusicDiscItem)) return stack; @@ -370,7 +382,7 @@ public abstract class ArmInteractionPoint { ItemStack toInsert = remainder.split(1); if (!simulate && !world.isRemote) { jukeboxBlock.insertRecord(world, pos, state, toInsert); - world.playEvent((PlayerEntity) null, 1010, pos, Item.getIdFromItem(toInsert.getItem())); + world.playEvent(null, 1010, pos, Item.getIdFromItem(toInsert.getItem())); AllTriggers.triggerForNearbyPlayers(AllTriggers.MUSICAL_ARM, world, pos, 10); } return remainder; @@ -401,8 +413,7 @@ public abstract class ArmInteractionPoint { @Override boolean isValid(IBlockReader reader, BlockPos pos, BlockState state) { - return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up()) - .getBlock() instanceof BeltTunnelBlock); + return AllBlocks.BELT.has(state) && !(reader.getBlockState(pos.up()).getBlock() instanceof BeltTunnelBlock); } } @@ -418,9 +429,7 @@ public abstract class ArmInteractionPoint { @Override Vec3d getInteractionPositionVector() { - return VecHelper.getCenterOf(pos) - .add(new Vec3d(FunnelBlock.getFunnelFacing(state) - .getDirectionVec()).scale(-.15f)); + return VecHelper.getCenterOf(pos).add(new Vec3d(FunnelBlock.getFunnelFacing(state).getDirectionVec()).scale(-.15f)); } @Override @@ -435,8 +444,7 @@ public abstract class ArmInteractionPoint { @Override Direction getInteractionDirection() { - return FunnelBlock.getFunnelFacing(state) - .getOpposite(); + return FunnelBlock.getFunnelFacing(state).getOpposite(); } @Override From 9d4e52092e77ae2937b94cdae89d73ce0d5df55f Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 21 Feb 2021 19:29:23 +0100 Subject: [PATCH 017/124] 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: Sun, 21 Feb 2021 22:29:46 +0100 Subject: [PATCH 018/124] Back to Directional - New vertical funnel models by @Kryppers --- src/generated/resources/.cache/cache | 46 ++-- .../create/blockstates/andesite_funnel.json | 196 +++++----------- .../create/blockstates/brass_funnel.json | 196 +++++----------- .../andesite_funnel_ceiling_pull_powered.json | 11 - .../block/andesite_funnel_ceiling_push.json | 11 - .../andesite_funnel_ceiling_push_powered.json | 11 - .../block/andesite_funnel_floor_pull.json | 11 - .../block/andesite_funnel_floor_push.json | 11 - .../andesite_funnel_floor_push_powered.json | 11 - ...n => andesite_funnel_horizontal_pull.json} | 6 +- ...esite_funnel_horizontal_pull_powered.json} | 6 +- ...n => andesite_funnel_horizontal_push.json} | 6 +- ...esite_funnel_horizontal_push_powered.json} | 6 +- .../block/andesite_funnel_vertical_pull.json | 13 ++ ...andesite_funnel_vertical_pull_powered.json | 13 ++ .../block/andesite_funnel_vertical_push.json | 13 ++ ...andesite_funnel_vertical_push_powered.json | 13 ++ .../block/andesite_funnel_wall_pull.json | 11 - .../andesite_funnel_wall_pull_powered.json | 11 - .../block/brass_funnel_ceiling_pull.json | 11 - .../brass_funnel_ceiling_pull_powered.json | 11 - .../brass_funnel_ceiling_push_powered.json | 11 - .../models/block/brass_funnel_floor_pull.json | 11 - .../models/block/brass_funnel_floor_push.json | 11 - .../brass_funnel_floor_push_powered.json | 11 - ...json => brass_funnel_horizontal_pull.json} | 6 +- ...brass_funnel_horizontal_pull_powered.json} | 6 +- ...json => brass_funnel_horizontal_push.json} | 6 +- ...brass_funnel_horizontal_push_powered.json} | 6 +- .../block/brass_funnel_vertical_pull.json | 13 ++ .../brass_funnel_vertical_pull_powered.json | 13 ++ .../block/brass_funnel_vertical_push.json | 13 ++ .../brass_funnel_vertical_push_powered.json | 13 ++ .../block/brass_funnel_wall_pull_powered.json | 11 - .../models/block/brass_funnel_wall_push.json | 11 - .../data/create/advancements/aesthetics.json | 4 +- .../java/com/simibubi/create/AllBlocks.java | 12 +- .../java/com/simibubi/create/AllShapes.java | 2 +- .../AbstractDirectionalFunnelBlock.java | 40 ++++ .../block/funnel/AbstractFunnelBlock.java | 16 +- .../funnel/AbstractHorizontalFunnelBlock.java | 40 ++++ .../block/funnel/AndesiteFunnelBlock.java | 2 +- .../block/funnel/BeltFunnelBlock.java | 4 +- .../block/funnel/BrassFunnelBlock.java | 2 +- .../logistics/block/funnel/FunnelBlock.java | 41 +--- .../funnel/FunnelFilterSlotPositioning.java | 65 ++---- .../block/funnel/FunnelGenerator.java | 80 +++++++ .../logistics/block/funnel/FunnelItem.java | 7 +- .../block/funnel/FunnelTileEntity.java | 3 +- .../foundation/data/BuilderTransformers.java | 39 ---- .../models/block/funnel/block_ceiling.json | 134 ----------- .../block/funnel/block_ceiling_old.json | 147 ------------ .../models/block/funnel/block_floor.json | 134 ----------- ...{block_wall.json => block_horizontal.json} | 0 .../models/block/funnel/block_vertical.json | 212 ++++++++++++++++++ 55 files changed, 689 insertions(+), 1061 deletions(-) delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json rename src/generated/resources/assets/create/models/block/{andesite_funnel_ceiling_pull.json => andesite_funnel_horizontal_pull.json} (60%) rename src/generated/resources/assets/create/models/block/{andesite_funnel_floor_pull_powered.json => andesite_funnel_horizontal_pull_powered.json} (60%) rename src/generated/resources/assets/create/models/block/{andesite_funnel_wall_push.json => andesite_funnel_horizontal_push.json} (60%) rename src/generated/resources/assets/create/models/block/{andesite_funnel_wall_push_powered.json => andesite_funnel_horizontal_push_powered.json} (60%) create mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull.json create mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull_powered.json create mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push.json create mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json delete mode 100644 src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json rename src/generated/resources/assets/create/models/block/{brass_funnel_wall_pull.json => brass_funnel_horizontal_pull.json} (60%) rename src/generated/resources/assets/create/models/block/{brass_funnel_floor_pull_powered.json => brass_funnel_horizontal_pull_powered.json} (60%) rename src/generated/resources/assets/create/models/block/{brass_funnel_ceiling_push.json => brass_funnel_horizontal_push.json} (60%) rename src/generated/resources/assets/create/models/block/{brass_funnel_wall_push_powered.json => brass_funnel_horizontal_push_powered.json} (60%) create mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull.json create mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull_powered.json create mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_vertical_push.json create mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_vertical_push_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json delete mode 100644 src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractHorizontalFunnelBlock.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java delete mode 100644 src/main/resources/assets/create/models/block/funnel/block_ceiling.json delete mode 100644 src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json delete mode 100644 src/main/resources/assets/create/models/block/funnel/block_floor.json rename src/main/resources/assets/create/models/block/funnel/{block_wall.json => block_horizontal.json} (100%) create mode 100644 src/main/resources/assets/create/models/block/funnel/block_vertical.json diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 046c32d3a..08899d979 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 -7187eba21a32e6954261cc71008ec1834a2e8af7 assets/create/blockstates/andesite_funnel.json +53cf4cfd94db1f44e9865b9fe5db383d01a12671 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 @@ -34,7 +34,7 @@ ee1299a15fca849eb42bf81507f85a54c167bbfe assets/create/blockstates/brass_belt_fu 8b1dd00adcc7e74c5a9feed069e2610b15a338cb assets/create/blockstates/brass_block.json b8dd6e505943e06706d0718ece620ab3cf943650 assets/create/blockstates/brass_casing.json 288bad07593a8a2c8efaf44bba0ffb0011d36cd3 assets/create/blockstates/brass_encased_shaft.json -8b5e88dea4e10ba3c74f0f161e49fed31a376ea1 assets/create/blockstates/brass_funnel.json +adfbd6cc5e44a0f431180aedbe65a19428299d8e assets/create/blockstates/brass_funnel.json 672eedcd3520c6d39603449165a23be9c612c620 assets/create/blockstates/brass_tunnel.json 11ebdd9bd0815833e62ec1bea03a4cdd86ce00f3 assets/create/blockstates/brown_sail.json e81608346d43406ee72cae0f78b8bcfb37ba2d75 assets/create/blockstates/brown_seat.json @@ -461,18 +461,14 @@ ad255a62a5f54b578db06e89fd7160001f905675 assets/create/models/block/andesite_cob a033fbac3129bba9211c6c4a0e16c905643afa39 assets/create/models/block/andesite_cobblestone_stairs_outer.json 1c574ee47aeb6fcb305bfc95dd131e153b795a0e assets/create/models/block/andesite_cobblestone_wall_post.json 0ed983628e8868f77301bea1111570d3631f24fb assets/create/models/block/andesite_cobblestone_wall_side.json -7d5faceb2a8d67acddd39625da6d5853f07ea8bd assets/create/models/block/andesite_funnel_ceiling_pull.json -82393ded7287660d16549e321317dfe4488cc81d assets/create/models/block/andesite_funnel_ceiling_pull_powered.json -40d7adae3b5eecd8ed08445b2d7f43d7a0684837 assets/create/models/block/andesite_funnel_ceiling_push.json -940cace1d38fef0d5d88a391b0ba8cf690b38a44 assets/create/models/block/andesite_funnel_ceiling_push_powered.json -c77c660ea142419e93754c9702445c269dbcd0cc assets/create/models/block/andesite_funnel_floor_pull.json -16d402c764364254a704a13736bd68455edc28ba assets/create/models/block/andesite_funnel_floor_pull_powered.json -6a809d0e0e53b845b587276444cb7b64a1e15e81 assets/create/models/block/andesite_funnel_floor_push.json -6eac3e4f593e4182f5c216a900136a62ea953fb5 assets/create/models/block/andesite_funnel_floor_push_powered.json -cc187c98c62b47f5bdb6e5187f52d3d927486376 assets/create/models/block/andesite_funnel_wall_pull.json -525cf080df53a428d1321d25c2021b5f3b80a4e6 assets/create/models/block/andesite_funnel_wall_pull_powered.json -78fcd6a91a84f5824e3e0006609b6f01760238d4 assets/create/models/block/andesite_funnel_wall_push.json -6c48d1a0b8cb007a6eddaa9b2f6cb8a98334d34e assets/create/models/block/andesite_funnel_wall_push_powered.json +8d4e4a7c6ad6d45c7aa7ca3105a025511571ff26 assets/create/models/block/andesite_funnel_horizontal_pull.json +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 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 @@ -513,18 +509,14 @@ dfc6250e28e12ff193a45891978ec50c406fc0c2 assets/create/models/block/brass_belt_f 97410a12b7c1461f88fb633f26ff566a0636b627 assets/create/models/block/brass_belt_funnel__retracted.json 71d0ad31d89d4ea3f243c6003b17f57fd168c933 assets/create/models/block/brass_block.json 166a5c053a81e6aadc24509ed24dc144a7255969 assets/create/models/block/brass_casing.json -f5f689dc8be53e560878d3dde7b6eda6b3bf28e3 assets/create/models/block/brass_funnel_ceiling_pull.json -142a56e522c74268d0b418985eb3fd285e371295 assets/create/models/block/brass_funnel_ceiling_pull_powered.json -e583d701961b68223778d28edc0e2686c1a5c5df assets/create/models/block/brass_funnel_ceiling_push.json -ccb2b596c3f190c26fdec06dd2b53ac3e59b1ff2 assets/create/models/block/brass_funnel_ceiling_push_powered.json -7f541d8235326fea3ecb370c4cf2913867f439ad assets/create/models/block/brass_funnel_floor_pull.json -5277d7c614991a5bce0e9234c4094f02c6d201c2 assets/create/models/block/brass_funnel_floor_pull_powered.json -1831d87b5a9784c12cecefbb9d3173c29f4ddc87 assets/create/models/block/brass_funnel_floor_push.json -6aee078641719086c9a98ebd1c0d0d61cd4d33a9 assets/create/models/block/brass_funnel_floor_push_powered.json -aa86ddeeb41aea5bd85dd488d932fbc913828b1f assets/create/models/block/brass_funnel_wall_pull.json -161b420ee4f41d436177e20314dcbe61ecec53a8 assets/create/models/block/brass_funnel_wall_pull_powered.json -24362e71ca3a6d0f2dbf129909eceb8b3937a66b assets/create/models/block/brass_funnel_wall_push.json -76cdebba3116be88926d9640917e579377ef3134 assets/create/models/block/brass_funnel_wall_push_powered.json +f7fd1f49857eca94e4135e65c85127510d666e4f assets/create/models/block/brass_funnel_horizontal_pull.json +45a23298ad03fd3b5dc2757dcd7edc18b8cce222 assets/create/models/block/brass_funnel_horizontal_pull_powered.json +a9fc7210d44b47202438668f11b31099e82c9ebd assets/create/models/block/brass_funnel_horizontal_push.json +4049bf503ec2ee22412c59e05299de20319b0dc6 assets/create/models/block/brass_funnel_horizontal_push_powered.json +320e377a4380ac637bff2e0535f229c52d886437 assets/create/models/block/brass_funnel_vertical_pull.json +28c2f8ca6403f98b82e3a0eadb608a41490cc96f assets/create/models/block/brass_funnel_vertical_pull_powered.json +c4c46d47854c9a6cf8f410006a35bbc8e599f0d5 assets/create/models/block/brass_funnel_vertical_push.json +fd6f6607a4742fa87dfe1768927a29dc4975ce7a assets/create/models/block/brass_funnel_vertical_push_powered.json 520087db8d479c66f85f3483af813fb668f27503 assets/create/models/block/brass_tunnel/cross.json 347ed67bf3426e323354e2d959fc9563dc7eeecd assets/create/models/block/brass_tunnel/straight.json a959e03ca339badb49fe58ba53d86a84352e91f3 assets/create/models/block/brass_tunnel/t_left.json @@ -1587,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 0161a1706..7330405c1 100644 --- a/src/generated/resources/assets/create/blockstates/andesite_funnel.json +++ b/src/generated/resources/assets/create/blockstates/andesite_funnel.json @@ -1,183 +1,99 @@ { "variants": { - "extracting=false,face=floor,facing=north,powered=false": { - "model": "create:block/andesite_funnel_floor_pull" - }, - "extracting=true,face=floor,facing=north,powered=false": { - "model": "create:block/andesite_funnel_floor_push" - }, - "extracting=false,face=wall,facing=north,powered=false": { - "model": "create:block/andesite_funnel_wall_pull" - }, - "extracting=true,face=wall,facing=north,powered=false": { - "model": "create:block/andesite_funnel_wall_push" - }, - "extracting=false,face=ceiling,facing=north,powered=false": { - "model": "create:block/andesite_funnel_ceiling_pull" - }, - "extracting=true,face=ceiling,facing=north,powered=false": { - "model": "create:block/andesite_funnel_ceiling_push" - }, - "extracting=false,face=floor,facing=south,powered=false": { - "model": "create:block/andesite_funnel_floor_pull", + "extracting=false,facing=down,powered=false": { + "model": "create:block/andesite_funnel_vertical_pull", + "x": 180, "y": 180 }, - "extracting=true,face=floor,facing=south,powered=false": { - "model": "create:block/andesite_funnel_floor_push", + "extracting=true,facing=down,powered=false": { + "model": "create:block/andesite_funnel_vertical_push", + "x": 180, "y": 180 }, - "extracting=false,face=wall,facing=south,powered=false": { - "model": "create:block/andesite_funnel_wall_pull", + "extracting=false,facing=up,powered=false": { + "model": "create:block/andesite_funnel_vertical_pull", "y": 180 }, - "extracting=true,face=wall,facing=south,powered=false": { - "model": "create:block/andesite_funnel_wall_push", + "extracting=true,facing=up,powered=false": { + "model": "create:block/andesite_funnel_vertical_push", "y": 180 }, - "extracting=false,face=ceiling,facing=south,powered=false": { - "model": "create:block/andesite_funnel_ceiling_pull", + "extracting=false,facing=north,powered=false": { + "model": "create:block/andesite_funnel_horizontal_pull" + }, + "extracting=true,facing=north,powered=false": { + "model": "create:block/andesite_funnel_horizontal_push" + }, + "extracting=false,facing=south,powered=false": { + "model": "create:block/andesite_funnel_horizontal_pull", "y": 180 }, - "extracting=true,face=ceiling,facing=south,powered=false": { - "model": "create:block/andesite_funnel_ceiling_push", + "extracting=true,facing=south,powered=false": { + "model": "create:block/andesite_funnel_horizontal_push", "y": 180 }, - "extracting=false,face=floor,facing=west,powered=false": { - "model": "create:block/andesite_funnel_floor_pull", + "extracting=false,facing=west,powered=false": { + "model": "create:block/andesite_funnel_horizontal_pull", "y": 270 }, - "extracting=true,face=floor,facing=west,powered=false": { - "model": "create:block/andesite_funnel_floor_push", + "extracting=true,facing=west,powered=false": { + "model": "create:block/andesite_funnel_horizontal_push", "y": 270 }, - "extracting=false,face=wall,facing=west,powered=false": { - "model": "create:block/andesite_funnel_wall_pull", - "y": 270 - }, - "extracting=true,face=wall,facing=west,powered=false": { - "model": "create:block/andesite_funnel_wall_push", - "y": 270 - }, - "extracting=false,face=ceiling,facing=west,powered=false": { - "model": "create:block/andesite_funnel_ceiling_pull", - "y": 270 - }, - "extracting=true,face=ceiling,facing=west,powered=false": { - "model": "create:block/andesite_funnel_ceiling_push", - "y": 270 - }, - "extracting=false,face=floor,facing=east,powered=false": { - "model": "create:block/andesite_funnel_floor_pull", + "extracting=false,facing=east,powered=false": { + "model": "create:block/andesite_funnel_horizontal_pull", "y": 90 }, - "extracting=true,face=floor,facing=east,powered=false": { - "model": "create:block/andesite_funnel_floor_push", + "extracting=true,facing=east,powered=false": { + "model": "create:block/andesite_funnel_horizontal_push", "y": 90 }, - "extracting=false,face=wall,facing=east,powered=false": { - "model": "create:block/andesite_funnel_wall_pull", - "y": 90 - }, - "extracting=true,face=wall,facing=east,powered=false": { - "model": "create:block/andesite_funnel_wall_push", - "y": 90 - }, - "extracting=false,face=ceiling,facing=east,powered=false": { - "model": "create:block/andesite_funnel_ceiling_pull", - "y": 90 - }, - "extracting=true,face=ceiling,facing=east,powered=false": { - "model": "create:block/andesite_funnel_ceiling_push", - "y": 90 - }, - "extracting=false,face=floor,facing=north,powered=true": { - "model": "create:block/andesite_funnel_floor_pull_powered" - }, - "extracting=true,face=floor,facing=north,powered=true": { - "model": "create:block/andesite_funnel_floor_push_powered" - }, - "extracting=false,face=wall,facing=north,powered=true": { - "model": "create:block/andesite_funnel_wall_pull_powered" - }, - "extracting=true,face=wall,facing=north,powered=true": { - "model": "create:block/andesite_funnel_wall_push_powered" - }, - "extracting=false,face=ceiling,facing=north,powered=true": { - "model": "create:block/andesite_funnel_ceiling_pull_powered" - }, - "extracting=true,face=ceiling,facing=north,powered=true": { - "model": "create:block/andesite_funnel_ceiling_push_powered" - }, - "extracting=false,face=floor,facing=south,powered=true": { - "model": "create:block/andesite_funnel_floor_pull_powered", + "extracting=false,facing=down,powered=true": { + "model": "create:block/andesite_funnel_vertical_pull_powered", + "x": 180, "y": 180 }, - "extracting=true,face=floor,facing=south,powered=true": { - "model": "create:block/andesite_funnel_floor_push_powered", + "extracting=true,facing=down,powered=true": { + "model": "create:block/andesite_funnel_vertical_push_powered", + "x": 180, "y": 180 }, - "extracting=false,face=wall,facing=south,powered=true": { - "model": "create:block/andesite_funnel_wall_pull_powered", + "extracting=false,facing=up,powered=true": { + "model": "create:block/andesite_funnel_vertical_pull_powered", "y": 180 }, - "extracting=true,face=wall,facing=south,powered=true": { - "model": "create:block/andesite_funnel_wall_push_powered", + "extracting=true,facing=up,powered=true": { + "model": "create:block/andesite_funnel_vertical_push_powered", "y": 180 }, - "extracting=false,face=ceiling,facing=south,powered=true": { - "model": "create:block/andesite_funnel_ceiling_pull_powered", + "extracting=false,facing=north,powered=true": { + "model": "create:block/andesite_funnel_horizontal_pull_powered" + }, + "extracting=true,facing=north,powered=true": { + "model": "create:block/andesite_funnel_horizontal_push_powered" + }, + "extracting=false,facing=south,powered=true": { + "model": "create:block/andesite_funnel_horizontal_pull_powered", "y": 180 }, - "extracting=true,face=ceiling,facing=south,powered=true": { - "model": "create:block/andesite_funnel_ceiling_push_powered", + "extracting=true,facing=south,powered=true": { + "model": "create:block/andesite_funnel_horizontal_push_powered", "y": 180 }, - "extracting=false,face=floor,facing=west,powered=true": { - "model": "create:block/andesite_funnel_floor_pull_powered", + "extracting=false,facing=west,powered=true": { + "model": "create:block/andesite_funnel_horizontal_pull_powered", "y": 270 }, - "extracting=true,face=floor,facing=west,powered=true": { - "model": "create:block/andesite_funnel_floor_push_powered", + "extracting=true,facing=west,powered=true": { + "model": "create:block/andesite_funnel_horizontal_push_powered", "y": 270 }, - "extracting=false,face=wall,facing=west,powered=true": { - "model": "create:block/andesite_funnel_wall_pull_powered", - "y": 270 - }, - "extracting=true,face=wall,facing=west,powered=true": { - "model": "create:block/andesite_funnel_wall_push_powered", - "y": 270 - }, - "extracting=false,face=ceiling,facing=west,powered=true": { - "model": "create:block/andesite_funnel_ceiling_pull_powered", - "y": 270 - }, - "extracting=true,face=ceiling,facing=west,powered=true": { - "model": "create:block/andesite_funnel_ceiling_push_powered", - "y": 270 - }, - "extracting=false,face=floor,facing=east,powered=true": { - "model": "create:block/andesite_funnel_floor_pull_powered", + "extracting=false,facing=east,powered=true": { + "model": "create:block/andesite_funnel_horizontal_pull_powered", "y": 90 }, - "extracting=true,face=floor,facing=east,powered=true": { - "model": "create:block/andesite_funnel_floor_push_powered", - "y": 90 - }, - "extracting=false,face=wall,facing=east,powered=true": { - "model": "create:block/andesite_funnel_wall_pull_powered", - "y": 90 - }, - "extracting=true,face=wall,facing=east,powered=true": { - "model": "create:block/andesite_funnel_wall_push_powered", - "y": 90 - }, - "extracting=false,face=ceiling,facing=east,powered=true": { - "model": "create:block/andesite_funnel_ceiling_pull_powered", - "y": 90 - }, - "extracting=true,face=ceiling,facing=east,powered=true": { - "model": "create:block/andesite_funnel_ceiling_push_powered", + "extracting=true,facing=east,powered=true": { + "model": "create:block/andesite_funnel_horizontal_push_powered", "y": 90 } } diff --git a/src/generated/resources/assets/create/blockstates/brass_funnel.json b/src/generated/resources/assets/create/blockstates/brass_funnel.json index 7458dae7c..19a543d73 100644 --- a/src/generated/resources/assets/create/blockstates/brass_funnel.json +++ b/src/generated/resources/assets/create/blockstates/brass_funnel.json @@ -1,183 +1,99 @@ { "variants": { - "extracting=false,face=floor,facing=north,powered=false": { - "model": "create:block/brass_funnel_floor_pull" - }, - "extracting=true,face=floor,facing=north,powered=false": { - "model": "create:block/brass_funnel_floor_push" - }, - "extracting=false,face=wall,facing=north,powered=false": { - "model": "create:block/brass_funnel_wall_pull" - }, - "extracting=true,face=wall,facing=north,powered=false": { - "model": "create:block/brass_funnel_wall_push" - }, - "extracting=false,face=ceiling,facing=north,powered=false": { - "model": "create:block/brass_funnel_ceiling_pull" - }, - "extracting=true,face=ceiling,facing=north,powered=false": { - "model": "create:block/brass_funnel_ceiling_push" - }, - "extracting=false,face=floor,facing=south,powered=false": { - "model": "create:block/brass_funnel_floor_pull", + "extracting=false,facing=down,powered=false": { + "model": "create:block/brass_funnel_vertical_pull", + "x": 180, "y": 180 }, - "extracting=true,face=floor,facing=south,powered=false": { - "model": "create:block/brass_funnel_floor_push", + "extracting=true,facing=down,powered=false": { + "model": "create:block/brass_funnel_vertical_push", + "x": 180, "y": 180 }, - "extracting=false,face=wall,facing=south,powered=false": { - "model": "create:block/brass_funnel_wall_pull", + "extracting=false,facing=up,powered=false": { + "model": "create:block/brass_funnel_vertical_pull", "y": 180 }, - "extracting=true,face=wall,facing=south,powered=false": { - "model": "create:block/brass_funnel_wall_push", + "extracting=true,facing=up,powered=false": { + "model": "create:block/brass_funnel_vertical_push", "y": 180 }, - "extracting=false,face=ceiling,facing=south,powered=false": { - "model": "create:block/brass_funnel_ceiling_pull", + "extracting=false,facing=north,powered=false": { + "model": "create:block/brass_funnel_horizontal_pull" + }, + "extracting=true,facing=north,powered=false": { + "model": "create:block/brass_funnel_horizontal_push" + }, + "extracting=false,facing=south,powered=false": { + "model": "create:block/brass_funnel_horizontal_pull", "y": 180 }, - "extracting=true,face=ceiling,facing=south,powered=false": { - "model": "create:block/brass_funnel_ceiling_push", + "extracting=true,facing=south,powered=false": { + "model": "create:block/brass_funnel_horizontal_push", "y": 180 }, - "extracting=false,face=floor,facing=west,powered=false": { - "model": "create:block/brass_funnel_floor_pull", + "extracting=false,facing=west,powered=false": { + "model": "create:block/brass_funnel_horizontal_pull", "y": 270 }, - "extracting=true,face=floor,facing=west,powered=false": { - "model": "create:block/brass_funnel_floor_push", + "extracting=true,facing=west,powered=false": { + "model": "create:block/brass_funnel_horizontal_push", "y": 270 }, - "extracting=false,face=wall,facing=west,powered=false": { - "model": "create:block/brass_funnel_wall_pull", - "y": 270 - }, - "extracting=true,face=wall,facing=west,powered=false": { - "model": "create:block/brass_funnel_wall_push", - "y": 270 - }, - "extracting=false,face=ceiling,facing=west,powered=false": { - "model": "create:block/brass_funnel_ceiling_pull", - "y": 270 - }, - "extracting=true,face=ceiling,facing=west,powered=false": { - "model": "create:block/brass_funnel_ceiling_push", - "y": 270 - }, - "extracting=false,face=floor,facing=east,powered=false": { - "model": "create:block/brass_funnel_floor_pull", + "extracting=false,facing=east,powered=false": { + "model": "create:block/brass_funnel_horizontal_pull", "y": 90 }, - "extracting=true,face=floor,facing=east,powered=false": { - "model": "create:block/brass_funnel_floor_push", + "extracting=true,facing=east,powered=false": { + "model": "create:block/brass_funnel_horizontal_push", "y": 90 }, - "extracting=false,face=wall,facing=east,powered=false": { - "model": "create:block/brass_funnel_wall_pull", - "y": 90 - }, - "extracting=true,face=wall,facing=east,powered=false": { - "model": "create:block/brass_funnel_wall_push", - "y": 90 - }, - "extracting=false,face=ceiling,facing=east,powered=false": { - "model": "create:block/brass_funnel_ceiling_pull", - "y": 90 - }, - "extracting=true,face=ceiling,facing=east,powered=false": { - "model": "create:block/brass_funnel_ceiling_push", - "y": 90 - }, - "extracting=false,face=floor,facing=north,powered=true": { - "model": "create:block/brass_funnel_floor_pull_powered" - }, - "extracting=true,face=floor,facing=north,powered=true": { - "model": "create:block/brass_funnel_floor_push_powered" - }, - "extracting=false,face=wall,facing=north,powered=true": { - "model": "create:block/brass_funnel_wall_pull_powered" - }, - "extracting=true,face=wall,facing=north,powered=true": { - "model": "create:block/brass_funnel_wall_push_powered" - }, - "extracting=false,face=ceiling,facing=north,powered=true": { - "model": "create:block/brass_funnel_ceiling_pull_powered" - }, - "extracting=true,face=ceiling,facing=north,powered=true": { - "model": "create:block/brass_funnel_ceiling_push_powered" - }, - "extracting=false,face=floor,facing=south,powered=true": { - "model": "create:block/brass_funnel_floor_pull_powered", + "extracting=false,facing=down,powered=true": { + "model": "create:block/brass_funnel_vertical_pull_powered", + "x": 180, "y": 180 }, - "extracting=true,face=floor,facing=south,powered=true": { - "model": "create:block/brass_funnel_floor_push_powered", + "extracting=true,facing=down,powered=true": { + "model": "create:block/brass_funnel_vertical_push_powered", + "x": 180, "y": 180 }, - "extracting=false,face=wall,facing=south,powered=true": { - "model": "create:block/brass_funnel_wall_pull_powered", + "extracting=false,facing=up,powered=true": { + "model": "create:block/brass_funnel_vertical_pull_powered", "y": 180 }, - "extracting=true,face=wall,facing=south,powered=true": { - "model": "create:block/brass_funnel_wall_push_powered", + "extracting=true,facing=up,powered=true": { + "model": "create:block/brass_funnel_vertical_push_powered", "y": 180 }, - "extracting=false,face=ceiling,facing=south,powered=true": { - "model": "create:block/brass_funnel_ceiling_pull_powered", + "extracting=false,facing=north,powered=true": { + "model": "create:block/brass_funnel_horizontal_pull_powered" + }, + "extracting=true,facing=north,powered=true": { + "model": "create:block/brass_funnel_horizontal_push_powered" + }, + "extracting=false,facing=south,powered=true": { + "model": "create:block/brass_funnel_horizontal_pull_powered", "y": 180 }, - "extracting=true,face=ceiling,facing=south,powered=true": { - "model": "create:block/brass_funnel_ceiling_push_powered", + "extracting=true,facing=south,powered=true": { + "model": "create:block/brass_funnel_horizontal_push_powered", "y": 180 }, - "extracting=false,face=floor,facing=west,powered=true": { - "model": "create:block/brass_funnel_floor_pull_powered", + "extracting=false,facing=west,powered=true": { + "model": "create:block/brass_funnel_horizontal_pull_powered", "y": 270 }, - "extracting=true,face=floor,facing=west,powered=true": { - "model": "create:block/brass_funnel_floor_push_powered", + "extracting=true,facing=west,powered=true": { + "model": "create:block/brass_funnel_horizontal_push_powered", "y": 270 }, - "extracting=false,face=wall,facing=west,powered=true": { - "model": "create:block/brass_funnel_wall_pull_powered", - "y": 270 - }, - "extracting=true,face=wall,facing=west,powered=true": { - "model": "create:block/brass_funnel_wall_push_powered", - "y": 270 - }, - "extracting=false,face=ceiling,facing=west,powered=true": { - "model": "create:block/brass_funnel_ceiling_pull_powered", - "y": 270 - }, - "extracting=true,face=ceiling,facing=west,powered=true": { - "model": "create:block/brass_funnel_ceiling_push_powered", - "y": 270 - }, - "extracting=false,face=floor,facing=east,powered=true": { - "model": "create:block/brass_funnel_floor_pull_powered", + "extracting=false,facing=east,powered=true": { + "model": "create:block/brass_funnel_horizontal_pull_powered", "y": 90 }, - "extracting=true,face=floor,facing=east,powered=true": { - "model": "create:block/brass_funnel_floor_push_powered", - "y": 90 - }, - "extracting=false,face=wall,facing=east,powered=true": { - "model": "create:block/brass_funnel_wall_pull_powered", - "y": 90 - }, - "extracting=true,face=wall,facing=east,powered=true": { - "model": "create:block/brass_funnel_wall_push_powered", - "y": 90 - }, - "extracting=false,face=ceiling,facing=east,powered=true": { - "model": "create:block/brass_funnel_ceiling_pull_powered", - "y": 90 - }, - "extracting=true,face=ceiling,facing=east,powered=true": { - "model": "create:block/brass_funnel_ceiling_push_powered", + "extracting=true,facing=east,powered=true": { + "model": "create:block/brass_funnel_horizontal_push_powered", "y": 90 } } diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json deleted file mode 100644 index f66c6e8f3..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_ceiling", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel_powered", - "5": "create:block/andesite_funnel_tall_powered", - "2_2": "create:block/andesite_funnel_pull", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json deleted file mode 100644 index 8217c6b7a..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_ceiling", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel", - "5": "create:block/andesite_funnel_tall", - "2_2": "create:block/andesite_funnel_push", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json deleted file mode 100644 index ff4df0493..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_push_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_ceiling", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel_powered", - "5": "create:block/andesite_funnel_tall_powered", - "2_2": "create:block/andesite_funnel_push", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json deleted file mode 100644 index 6079531b3..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_floor", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel", - "5": "create:block/andesite_funnel_tall", - "2_2": "create:block/andesite_funnel_pull", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json deleted file mode 100644 index 21b19aa78..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_floor", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel", - "5": "create:block/andesite_funnel_tall", - "2_2": "create:block/andesite_funnel_push", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json deleted file mode 100644 index 8a8f6a8de..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_push_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_floor", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel_powered", - "5": "create:block/andesite_funnel_tall_powered", - "2_2": "create:block/andesite_funnel_push", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_pull.json similarity index 60% rename from src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_pull.json index bdbb2623f..4ca78f3ab 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_ceiling_pull.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_pull.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_ceiling", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel", "5": "create:block/andesite_funnel_tall", "2_2": "create:block/andesite_funnel_pull", - "3": "create:block/andesite_funnel_back" + "3": "create:block/andesite_funnel_back", + "6": "create:block/andesite_funnel" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_pull_powered.json similarity index 60% rename from src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull_powered.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_pull_powered.json index 5ac3f88c7..f30214bd6 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_floor_pull_powered.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_pull_powered.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_floor", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel_powered", "5": "create:block/andesite_funnel_tall_powered", "2_2": "create:block/andesite_funnel_pull", - "3": "create:block/andesite_funnel_back" + "3": "create:block/andesite_funnel_back", + "6": "create:block/andesite_funnel_powered" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push.json b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_push.json similarity index 60% rename from src/generated/resources/assets/create/models/block/andesite_funnel_wall_push.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_push.json index 4b56f936a..090a3e964 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_push.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_wall", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel", "5": "create:block/andesite_funnel_tall", "2_2": "create:block/andesite_funnel_push", - "3": "create:block/andesite_funnel_back" + "3": "create:block/andesite_funnel_back", + "6": "create:block/andesite_funnel" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_push_powered.json similarity index 60% rename from src/generated/resources/assets/create/models/block/andesite_funnel_wall_push_powered.json rename to src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_push_powered.json index b9f6af0dc..3907df971 100644 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_push_powered.json +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_horizontal_push_powered.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_wall", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/andesite_casing", "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel_powered", "5": "create:block/andesite_funnel_tall_powered", "2_2": "create:block/andesite_funnel_push", - "3": "create:block/andesite_funnel_back" + "3": "create:block/andesite_funnel_back", + "6": "create:block/andesite_funnel_powered" } } \ No newline at end of file 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_pull.json new file mode 100644 index 000000000..02736f668 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back", + "8": "create:block/andesite_casing", + "9": "create:block/andesite_funnel_slope", + "10": "create:block/funnel_open" + } +} \ No newline at end of file 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_pull_powered.json new file mode 100644 index 000000000..7752f5d86 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_pull_powered.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_pull", + "3": "create:block/andesite_funnel_back", + "8": "create:block/andesite_casing", + "9": "create:block/andesite_funnel_slope", + "10": "create:block/funnel_closed" + } +} \ No newline at end of file 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_push.json new file mode 100644 index 000000000..acbd75ff3 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "5": "create:block/andesite_funnel_tall", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back", + "8": "create:block/andesite_casing", + "9": "create:block/andesite_funnel_slope", + "10": "create:block/funnel_open" + } +} \ No newline at end of file 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_push_powered.json new file mode 100644 index 000000000..6bbc397da --- /dev/null +++ b/src/generated/resources/assets/create/models/block/andesite_funnel_vertical_push_powered.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/andesite_casing", + "7": "create:block/andesite_funnel_plating", + "5": "create:block/andesite_funnel_tall_powered", + "2_2": "create:block/andesite_funnel_push", + "3": "create:block/andesite_funnel_back", + "8": "create:block/andesite_casing", + "9": "create:block/andesite_funnel_slope", + "10": "create:block/funnel_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json deleted file mode 100644 index e8343d682..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_wall", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel", - "5": "create:block/andesite_funnel_tall", - "2_2": "create:block/andesite_funnel_pull", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json b/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json deleted file mode 100644 index e71c4c17c..000000000 --- a/src/generated/resources/assets/create/models/block/andesite_funnel_wall_pull_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_wall", - "textures": { - "particle": "create:block/andesite_casing", - "7": "create:block/andesite_funnel_plating", - "6": "create:block/andesite_funnel_powered", - "5": "create:block/andesite_funnel_tall_powered", - "2_2": "create:block/andesite_funnel_pull", - "3": "create:block/andesite_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json deleted file mode 100644 index 04fb853ba..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_ceiling", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel", - "5": "create:block/brass_funnel_tall", - "2_2": "create:block/brass_funnel_pull", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json deleted file mode 100644 index 4a0c7c1d2..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_pull_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_ceiling", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel_powered", - "5": "create:block/brass_funnel_tall_powered", - "2_2": "create:block/brass_funnel_pull", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json deleted file mode 100644 index e4b8a8e16..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_ceiling", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel_powered", - "5": "create:block/brass_funnel_tall_powered", - "2_2": "create:block/brass_funnel_push", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json deleted file mode 100644 index 02c4f8743..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_floor", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel", - "5": "create:block/brass_funnel_tall", - "2_2": "create:block/brass_funnel_pull", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json deleted file mode 100644 index 642f3480b..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_floor_push.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_floor", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel", - "5": "create:block/brass_funnel_tall", - "2_2": "create:block/brass_funnel_push", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json deleted file mode 100644 index 1e1c45148..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_floor_push_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_floor", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel_powered", - "5": "create:block/brass_funnel_tall_powered", - "2_2": "create:block/brass_funnel_push", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_pull.json similarity index 60% rename from src/generated/resources/assets/create/models/block/brass_funnel_wall_pull.json rename to src/generated/resources/assets/create/models/block/brass_funnel_horizontal_pull.json index 9b0bae0f1..a971472b4 100644 --- a/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull.json +++ b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_pull.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_wall", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/brass_casing", "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel", "5": "create:block/brass_funnel_tall", "2_2": "create:block/brass_funnel_pull", - "3": "create:block/brass_funnel_back" + "3": "create:block/brass_funnel_back", + "6": "create:block/brass_funnel" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_pull_powered.json similarity index 60% rename from src/generated/resources/assets/create/models/block/brass_funnel_floor_pull_powered.json rename to src/generated/resources/assets/create/models/block/brass_funnel_horizontal_pull_powered.json index c16f1f997..38c8a7e7a 100644 --- a/src/generated/resources/assets/create/models/block/brass_funnel_floor_pull_powered.json +++ b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_pull_powered.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_floor", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/brass_casing", "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel_powered", "5": "create:block/brass_funnel_tall_powered", "2_2": "create:block/brass_funnel_pull", - "3": "create:block/brass_funnel_back" + "3": "create:block/brass_funnel_back", + "6": "create:block/brass_funnel_powered" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_push.json similarity index 60% rename from src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push.json rename to src/generated/resources/assets/create/models/block/brass_funnel_horizontal_push.json index c1595bbd8..85321b031 100644 --- a/src/generated/resources/assets/create/models/block/brass_funnel_ceiling_push.json +++ b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_push.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_ceiling", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/brass_casing", "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel", "5": "create:block/brass_funnel_tall", "2_2": "create:block/brass_funnel_push", - "3": "create:block/brass_funnel_back" + "3": "create:block/brass_funnel_back", + "6": "create:block/brass_funnel" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_push_powered.json similarity index 60% rename from src/generated/resources/assets/create/models/block/brass_funnel_wall_push_powered.json rename to src/generated/resources/assets/create/models/block/brass_funnel_horizontal_push_powered.json index 1a27b7333..83a796536 100644 --- a/src/generated/resources/assets/create/models/block/brass_funnel_wall_push_powered.json +++ b/src/generated/resources/assets/create/models/block/brass_funnel_horizontal_push_powered.json @@ -1,11 +1,11 @@ { - "parent": "create:block/funnel/block_wall", + "parent": "create:block/funnel/block_horizontal", "textures": { "particle": "create:block/brass_casing", "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel_powered", "5": "create:block/brass_funnel_tall_powered", "2_2": "create:block/brass_funnel_push", - "3": "create:block/brass_funnel_back" + "3": "create:block/brass_funnel_back", + "6": "create:block/brass_funnel_powered" } } \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull.json b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull.json new file mode 100644 index 000000000..d2a1c6159 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back", + "8": "create:block/brass_casing", + "9": "create:block/brass_funnel_slope", + "10": "create:block/funnel_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull_powered.json new file mode 100644 index 000000000..e319cf39d --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_pull_powered.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_pull", + "3": "create:block/brass_funnel_back", + "8": "create:block/brass_casing", + "9": "create:block/brass_funnel_slope", + "10": "create:block/funnel_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_vertical_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_push.json new file mode 100644 index 000000000..f95cdf391 --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_push.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "5": "create:block/brass_funnel_tall", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back", + "8": "create:block/brass_casing", + "9": "create:block/brass_funnel_slope", + "10": "create:block/funnel_open" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_vertical_push_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_push_powered.json new file mode 100644 index 000000000..45ac7f48f --- /dev/null +++ b/src/generated/resources/assets/create/models/block/brass_funnel_vertical_push_powered.json @@ -0,0 +1,13 @@ +{ + "parent": "create:block/funnel/block_vertical", + "textures": { + "particle": "create:block/brass_casing", + "7": "create:block/brass_funnel_plating", + "5": "create:block/brass_funnel_tall_powered", + "2_2": "create:block/brass_funnel_push", + "3": "create:block/brass_funnel_back", + "8": "create:block/brass_casing", + "9": "create:block/brass_funnel_slope", + "10": "create:block/funnel_closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json b/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json deleted file mode 100644 index 03dc68716..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_wall_pull_powered.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_wall", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel_powered", - "5": "create:block/brass_funnel_tall_powered", - "2_2": "create:block/brass_funnel_pull", - "3": "create:block/brass_funnel_back" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json b/src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json deleted file mode 100644 index f2f3bd158..000000000 --- a/src/generated/resources/assets/create/models/block/brass_funnel_wall_push.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "parent": "create:block/funnel/block_wall", - "textures": { - "particle": "create:block/brass_casing", - "7": "create:block/brass_funnel_plating", - "6": "create:block/brass_funnel", - "5": "create:block/brass_funnel_tall", - "2_2": "create:block/brass_funnel_push", - "3": "create:block/brass_funnel_back" - } -} \ 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/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 1c89a813d..aea45c42e 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -133,6 +133,8 @@ import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelGenerator; import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; +import com.simibubi.create.content.logistics.block.funnel.FunnelGenerator; +import com.simibubi.create.content.logistics.block.funnel.FunnelItem; import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviour; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock; @@ -1081,7 +1083,10 @@ public class AllBlocks { .initialProperties(SharedProperties::stone) .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(FunnelMovementBehaviour.andesite())) - .transform(BuilderTransformers.funnel("andesite", Create.asResource("block/andesite_casing"))) + .blockstate(new FunnelGenerator("andesite")::generate) + .item(FunnelItem::new) + .model(FunnelGenerator.itemModel("andesite")) + .build() .register(); public static final BlockEntry ANDESITE_BELT_FUNNEL = @@ -1097,7 +1102,10 @@ public class AllBlocks { .initialProperties(SharedProperties::softMetal) .tag(AllBlockTags.SAFE_NBT.tag) .onRegister(addMovementBehaviour(FunnelMovementBehaviour.brass())) - .transform(BuilderTransformers.funnel("brass", Create.asResource("block/brass_casing"))) + .blockstate(new FunnelGenerator("brass")::generate) + .item(FunnelItem::new) + .model(FunnelGenerator.itemModel("brass")) + .build() .register(); public static final BlockEntry BRASS_BELT_FUNNEL = diff --git a/src/main/java/com/simibubi/create/AllShapes.java b/src/main/java/com/simibubi/create/AllShapes.java index 44322d22c..e7442c5b8 100644 --- a/src/main/java/com/simibubi/create/AllShapes.java +++ b/src/main/java/com/simibubi/create/AllShapes.java @@ -78,7 +78,7 @@ public class AllShapes { .add(0.1, 1, 10, 15.9, 5, 14) .add(0.1, -3, 11, 15.9, 1, 15) .forHorizontal(NORTH), - FUNNEL = shape(2, 2, 14, 14, 14, 18).add(1, 8, 12, 15, 15, 14) + FUNNEL_WALL = shape(2, 2, 14, 14, 14, 18).add(1, 8, 12, 15, 15, 14) .add(0.1, 13, 7, 15.9, 15, 11) .add(0.1, 9, 8, 15.9, 13, 12) .add(0.1, 5, 9, 15.9, 9, 13) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java new file mode 100644 index 000000000..43dd71869 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractDirectionalFunnelBlock.java @@ -0,0 +1,40 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; + +public class AbstractDirectionalFunnelBlock extends AbstractFunnelBlock { + + public static final DirectionProperty FACING = BlockStateProperties.FACING; + + protected AbstractDirectionalFunnelBlock(Properties p_i48377_1_) { + super(p_i48377_1_); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(FACING)); + } + + @Override + protected Direction getFacing(BlockState state) { + return state.get(FACING); + } + + @Override + public BlockState rotate(BlockState state, Rotation rot) { + return state.with(FACING, rot.rotate(state.get(FACING))); + } + + @Override + public BlockState mirror(BlockState state, Mirror mirrorIn) { + return state.rotate(mirrorIn.toRotation(state.get(FACING))); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java index 758ee2417..1b7ec9b39 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java @@ -12,7 +12,6 @@ import com.simibubi.create.foundation.utility.BlockHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; -import net.minecraft.block.HorizontalBlock; import net.minecraft.client.particle.ParticleManager; import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; @@ -28,7 +27,7 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE, IWrenchable { +public abstract class AbstractFunnelBlock extends Block implements ITE, IWrenchable { public static final BooleanProperty POWERED = BlockStateProperties.POWERED; @@ -39,16 +38,13 @@ public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE @Override public BlockState getStateForPlacement(BlockItemUseContext context) { - Direction facing = context.getPlacementHorizontalFacing() - .getOpposite(); - return getDefaultState().with(HORIZONTAL_FACING, facing) - .with(POWERED, context.getWorld() - .isBlockPowered(context.getPos())); + return getDefaultState().with(POWERED, context.getWorld() + .isBlockPowered(context.getPos())); } @Override protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(POWERED, HORIZONTAL_FACING)); + super.fillStateContainer(builder.add(POWERED)); } @Override @@ -120,9 +116,7 @@ public abstract class AbstractFunnelBlock extends HorizontalBlock implements ITE return ((AbstractFunnelBlock) state.getBlock()).getFacing(state); } - protected Direction getFacing(BlockState state) { - return state.get(BlockStateProperties.HORIZONTAL_FACING); - } + protected abstract Direction getFacing(BlockState state); @Override public void onReplaced(BlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, BlockState p_196243_4_, diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractHorizontalFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractHorizontalFunnelBlock.java new file mode 100644 index 000000000..87b2f1321 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractHorizontalFunnelBlock.java @@ -0,0 +1,40 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.state.DirectionProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.util.Direction; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; + +public abstract class AbstractHorizontalFunnelBlock extends AbstractFunnelBlock { + + public static final DirectionProperty HORIZONTAL_FACING = BlockStateProperties.HORIZONTAL_FACING; + + protected AbstractHorizontalFunnelBlock(Properties p_i48377_1_) { + super(p_i48377_1_); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(HORIZONTAL_FACING)); + } + + @Override + protected Direction getFacing(BlockState state) { + return state.get(HORIZONTAL_FACING); + } + + @Override + public BlockState rotate(BlockState p_185499_1_, Rotation p_185499_2_) { + return p_185499_1_.with(HORIZONTAL_FACING, p_185499_2_.rotate(p_185499_1_.get(HORIZONTAL_FACING))); + } + + @Override + public BlockState mirror(BlockState p_185471_1_, Mirror p_185471_2_) { + return p_185471_1_.rotate(p_185471_2_.toRotation(p_185471_1_.get(HORIZONTAL_FACING))); + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java index 6db0b2b2f..2dc92c421 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AndesiteFunnelBlock.java @@ -15,7 +15,7 @@ public class AndesiteFunnelBlock extends FunnelBlock { @Override public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { - Direction facing = state.get(HORIZONTAL_FACING); + Direction facing = getFunnelFacing(state); return AllBlocks.ANDESITE_BELT_FUNNEL.getDefaultState() .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) .with(POWERED, state.get(POWERED)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java index 40c6de55a..e387d64ba 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BeltFunnelBlock.java @@ -35,7 +35,7 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; -public class BeltFunnelBlock extends AbstractFunnelBlock implements ISpecialBlockItemRequirement { +public class BeltFunnelBlock extends AbstractHorizontalFunnelBlock implements ISpecialBlockItemRequirement { private BlockEntry parent; public static final IProperty SHAPE = EnumProperty.create("shape", Shape.class); @@ -124,7 +124,7 @@ public class BeltFunnelBlock extends AbstractFunnelBlock implements ISpecialBloc parentState = parentState.with(POWERED, true); if (state.get(SHAPE) == Shape.PUSHING) parentState = parentState.with(FunnelBlock.EXTRACTING, true); - return parentState.with(FunnelBlock.HORIZONTAL_FACING, state.get(HORIZONTAL_FACING)); + return parentState.with(FunnelBlock.FACING, state.get(HORIZONTAL_FACING)); } Shape updatedShape = getShapeForPosition(world, pos, state.get(HORIZONTAL_FACING), state.get(SHAPE) == Shape.PUSHING); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java index 290c44154..e44c2aa4d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/BrassFunnelBlock.java @@ -15,7 +15,7 @@ public class BrassFunnelBlock extends FunnelBlock { @Override public BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state) { - Direction facing = state.get(HORIZONTAL_FACING); + Direction facing = getFacing(state); return AllBlocks.BRASS_BELT_FUNNEL.getDefaultState() .with(BeltFunnelBlock.HORIZONTAL_FACING, facing) .with(POWERED, state.get(POWERED)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java index 6f7da7985..c7cc47dab 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelBlock.java @@ -14,10 +14,7 @@ import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.ItemStack; import net.minecraft.item.ItemUseContext; import net.minecraft.state.BooleanProperty; -import net.minecraft.state.EnumProperty; import net.minecraft.state.StateContainer.Builder; -import net.minecraft.state.properties.AttachFace; -import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.AxisDirection; @@ -31,15 +28,13 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; -public abstract class FunnelBlock extends AbstractFunnelBlock { +public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock { - public static final EnumProperty FACE = BlockStateProperties.FACE; public static final BooleanProperty EXTRACTING = BooleanProperty.create("extracting"); public FunnelBlock(Properties p_i48415_1_) { super(p_i48415_1_); - setDefaultState(getDefaultState().with(FACE, AttachFace.WALL) - .with(EXTRACTING, false)); + setDefaultState(getDefaultState().with(EXTRACTING, false)); } public abstract BlockState getEquivalentBeltFunnel(IBlockReader world, BlockPos pos, BlockState state); @@ -53,13 +48,7 @@ public abstract class FunnelBlock extends AbstractFunnelBlock { state = state.with(EXTRACTING, !sneak); for (Direction direction : context.getNearestLookingDirections()) { - BlockState blockstate; - if (direction.getAxis() == Direction.Axis.Y) - blockstate = state.with(FACE, direction == Direction.UP ? AttachFace.CEILING : AttachFace.FLOOR) - .with(HORIZONTAL_FACING, context.getPlacementHorizontalFacing()); - else - blockstate = state.with(FACE, AttachFace.WALL) - .with(HORIZONTAL_FACING, direction.getOpposite()); + BlockState blockstate = state.with(FACING, direction.getOpposite()); if (blockstate.isValidPosition(context.getWorld(), context.getPos())) return blockstate.with(POWERED, state.get(POWERED)); } @@ -69,7 +58,7 @@ public abstract class FunnelBlock extends AbstractFunnelBlock { @Override protected void fillStateContainer(Builder builder) { - super.fillStateContainer(builder.add(FACE, EXTRACTING)); + super.fillStateContainer(builder.add(EXTRACTING)); } @Override @@ -137,26 +126,17 @@ public abstract class FunnelBlock extends AbstractFunnelBlock { return !state.get(POWERED) && !state.get(EXTRACTING); } - @Override - protected Direction getFacing(BlockState state) { - if (state.get(FACE) == AttachFace.CEILING) - return Direction.DOWN; - if (state.get(FACE) == AttachFace.FLOOR) - return Direction.UP; - return super.getFacing(state); - } - @Override public VoxelShape getShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { - AttachFace attachFace = state.get(FACE); - return attachFace == AttachFace.CEILING ? AllShapes.FUNNEL_CEILING - : attachFace == AttachFace.FLOOR ? AllShapes.FUNNEL_FLOOR - : AllShapes.FUNNEL.get(state.get(HORIZONTAL_FACING)); + Direction facing = state.get(FACING); + return facing == Direction.DOWN ? AllShapes.FUNNEL_CEILING + : facing == Direction.UP ? AllShapes.FUNNEL_FLOOR : AllShapes.FUNNEL_WALL.get(facing); } @Override public VoxelShape getCollisionShape(BlockState state, IBlockReader world, BlockPos pos, ISelectionContext context) { - if (context.getEntity() instanceof ItemEntity && state.get(FACE) == AttachFace.WALL) + if (context.getEntity() instanceof ItemEntity && getFacing(state).getAxis() + .isHorizontal()) return AllShapes.FUNNEL_COLLISION.get(getFacing(state)); return getShape(state, world, pos, context); } @@ -164,7 +144,8 @@ public abstract class FunnelBlock extends AbstractFunnelBlock { @Override public BlockState updatePostPlacement(BlockState state, Direction direction, BlockState p_196271_3_, IWorld world, BlockPos pos, BlockPos p_196271_6_) { - if (state.get(FACE) != AttachFace.WALL || direction != Direction.DOWN) + if (getFacing(state).getAxis() + .isVertical() || direction != Direction.DOWN) return state; BlockState equivalentFunnel = getEquivalentBeltFunnel(null, null, state); if (BeltFunnelBlock.isOnValidBelt(equivalentFunnel, world, pos)) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java index 450de2cc3..2a74b63e2 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelFilterSlotPositioning.java @@ -8,7 +8,6 @@ import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; -import net.minecraft.state.properties.AttachFace; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.Vec3d; @@ -36,50 +35,24 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } } - if (state.getBlock() instanceof FunnelBlock) { - if (state.get(FunnelBlock.FACE) == AttachFace.WALL) - return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12.1, 8.7f), horizontalAngle, Axis.Y); - Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 6.5f : 9.5f, 13f); - return VecHelper.rotateCentered(southLocation, - AngleHelper.horizontalAngle(state.get(AbstractFunnelBlock.HORIZONTAL_FACING)), Axis.Y); + if (!funnelFacing.getAxis() + .isHorizontal()) { + Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 14 : 2, 15.5f); + return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); } - - return Vec3d.ZERO; - -// if (!funnelFacing.getAxis() -// .isHorizontal()) { -// Vec3d southLocation = VecHelper.voxelSpace(8, funnelFacing == Direction.DOWN ? 3 : 13, 15.5f); -// return VecHelper.rotateCentered(southLocation, horizontalAngle, Axis.Y); -// } -// -// Direction verticalDirection = DirectionHelper.rotateAround(getSide(), funnelFacing.rotateY() -// .getAxis()); -// if (funnelFacing.getAxis() == Axis.Z) -// verticalDirection = verticalDirection.getOpposite(); -// float yRot = -AngleHelper.horizontalAngle(verticalDirection) + 180; -// float xRot = -90; -// boolean alongX = funnelFacing.getAxis() == Axis.X; -// float zRotLast = alongX ^ funnelFacing.getAxisDirection() == AxisDirection.POSITIVE ? 180 : 0; -// -// Vec3d vec = VecHelper.voxelSpace(8, 13, .5f); -// vec = vec.subtract(.5, .5, .5); -// vec = VecHelper.rotate(vec, zRotLast, Axis.Z); -// vec = VecHelper.rotate(vec, yRot, Axis.Y); -// vec = VecHelper.rotate(vec, alongX ? 0 : xRot, Axis.X); -// vec = VecHelper.rotate(vec, alongX ? xRot : 0, Axis.Z); -// vec = vec.add(.5, .5, .5); -// return vec; + + return VecHelper.rotateCentered(VecHelper.voxelSpace(8, 12.1, 8.7f), horizontalAngle, Axis.Y); } @Override protected void rotate(BlockState state, MatrixStack ms) { Direction facing = FunnelBlock.getFunnelFacing(state); -// if (facing.getAxis() -// .isVertical()) { -// super.rotate(state, ms); -// return; -// } + if (facing.getAxis() + .isVertical()) { + super.rotate(state, ms); + return; + } boolean isBeltFunnel = state.getBlock() instanceof BeltFunnelBlock; if (isBeltFunnel && state.get(BeltFunnelBlock.SHAPE) != Shape.EXTENDED) { @@ -92,15 +65,13 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { } if (state.getBlock() instanceof FunnelBlock) { - if (state.get(FunnelBlock.FACE) == AttachFace.WALL) { - super.rotate(state, ms); - MatrixStacker.of(ms) - .rotateX(-22.5f); - return; - } + super.rotate(state, ms); + MatrixStacker.of(ms) + .rotateX(-22.5f); + return; } - float yRot = AngleHelper.horizontalAngle(state.get(AbstractFunnelBlock.HORIZONTAL_FACING)) + float yRot = AngleHelper.horizontalAngle(AbstractFunnelBlock.getFunnelFacing(state)) + (facing == Direction.DOWN ? 180 : 0); MatrixStacker.of(ms) .rotateY(yRot) @@ -113,6 +84,10 @@ public class FunnelFilterSlotPositioning extends ValueBoxTransform.Sided { if (facing == null) return false; + if (facing.getAxis() + .isVertical()) + return direction.getAxis() + .isHorizontal(); if (state.getBlock() instanceof BeltFunnelBlock && state.get(BeltFunnelBlock.SHAPE) == Shape.EXTENDED) return direction == Direction.UP; return direction == facing; 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 new file mode 100644 index 000000000..5c5fc8bd1 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelGenerator.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.data.SpecialBlockStateGen; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import com.tterrag.registrate.providers.RegistrateItemModelProvider; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.item.Item; +import net.minecraft.util.Direction; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.generators.BlockModelBuilder; +import net.minecraftforge.client.model.generators.ModelFile; + +public class FunnelGenerator extends SpecialBlockStateGen { + + private String type; + private ResourceLocation particleTexture; + + public FunnelGenerator(String type) { + this.type = type; + this.particleTexture = Create.asResource("block/" + type + "_casing"); + } + + @Override + protected int getXRotation(BlockState state) { + return state.get(FunnelBlock.FACING) == Direction.DOWN ? 180 : 0; + } + + @Override + protected int getYRotation(BlockState state) { + return horizontalAngle(state.get(FunnelBlock.FACING)) + 180; + } + + @Override + public ModelFile getModel(DataGenContext c, RegistrateBlockstateProvider p, + BlockState s) { + String powered = s.get(FunnelBlock.POWERED) ? "_powered" : ""; + String closed = s.get(FunnelBlock.POWERED) ? "_closed" : "_open"; + String extracting = s.get(FunnelBlock.EXTRACTING) ? "_push" : "_pull"; + Direction facing = s.get(FunnelBlock.FACING); + boolean horizontal = facing.getAxis() + .isHorizontal(); + String parent = horizontal ? "horizontal" : "vertical"; + + BlockModelBuilder model = p.models() + .withExistingParent("block/" + type + "_funnel_" + parent + extracting + powered, + p.modLoc("block/funnel/block_" + parent)) + .texture("particle", particleTexture) + .texture("7", p.modLoc("block/" + type + "_funnel_plating")) + .texture("5", p.modLoc("block/" + type + "_funnel_tall" + powered)) + .texture("2_2", p.modLoc("block/" + type + "_funnel" + extracting)) + .texture("3", p.modLoc("block/" + type + "_funnel_back")); + + if (horizontal) + return model.texture("6", p.modLoc("block/" + type + "_funnel" + powered)); + + return model.texture("8", particleTexture) + .texture("9", p.modLoc("block/" + type + "_funnel_slope")) + .texture("10", p.modLoc("block/funnel" + closed)); + } + + public static NonNullBiConsumer, RegistrateItemModelProvider> itemModel( + String type) { + ResourceLocation particleTexture = Create.asResource("block/" + type + "_casing"); + return (c, p) -> { + p.withExistingParent("item/" + type + "_funnel", p.modLoc("block/funnel/item")) + .texture("particle", particleTexture) + .texture("7", p.modLoc("block/" + type + "_funnel_plating")) + .texture("2", p.modLoc("block/" + type + "_funnel_neutral")) + .texture("6", p.modLoc("block/" + type + "_funnel")) + .texture("5", p.modLoc("block/" + type + "_funnel_tall")) + .texture("3", p.modLoc("block/" + type + "_funnel_back")); + }; + } + +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java index c7a0a6357..f127a2b3c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelItem.java @@ -6,7 +6,6 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.item.BlockItem; import net.minecraft.item.BlockItemUseContext; -import net.minecraft.state.properties.AttachFace; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -38,10 +37,12 @@ public class FunnelItem extends BlockItem { return state; if (!(state.getBlock() instanceof FunnelBlock)) return state; - if (state.get(FunnelBlock.FACE) != AttachFace.WALL) + if (state.get(FunnelBlock.FACING) + .getAxis() + .isVertical()) return state; - Direction direction = state.get(FunnelBlock.HORIZONTAL_FACING); + Direction direction = state.get(FunnelBlock.FACING); FunnelBlock block = (FunnelBlock) getBlock(); Block beltFunnelBlock = block.getEquivalentBeltFunnel(world, pos, state) .getBlock(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 0a820f5eb..a25b196cb 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -26,7 +26,6 @@ import net.minecraft.block.BlockState; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; -import net.minecraft.state.properties.AttachFace; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; @@ -259,7 +258,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn return false; if (!(blockState.getBlock() instanceof FunnelBlock)) return false; - return blockState.get(FunnelBlock.FACE) == AttachFace.FLOOR; + return FunnelBlock.getFunnelFacing(blockState) == Direction.UP; } private boolean supportsFiltering() { diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 1947517c1..3eec801c2 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -6,7 +6,6 @@ import static com.simibubi.create.foundation.data.CreateRegistrate.connectedText import java.util.HashMap; import java.util.Map; -import java.util.function.Function; import javax.annotation.Nullable; @@ -22,8 +21,6 @@ import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem; -import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.FunnelItem; import com.simibubi.create.content.logistics.block.inventories.CrateBlock; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.config.StressConfigDefaults; @@ -32,7 +29,6 @@ import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; import net.minecraft.block.Block; -import net.minecraft.block.BlockState; import net.minecraft.client.renderer.RenderType; import net.minecraft.item.DyeColor; import net.minecraft.item.Item; @@ -99,41 +95,6 @@ public class BuilderTransformers { .simpleItem(); } - public static NonNullUnaryOperator> funnel(String type, - ResourceLocation particleTexture) { - return b -> { - return b.blockstate((c, p) -> { - Function model = s -> { - String powered = s.get(FunnelBlock.POWERED) ? "_powered" : ""; - String extracting = s.get(FunnelBlock.EXTRACTING) ? "_push" : "_pull"; - String face = s.get(FunnelBlock.FACE) - .getName(); - return p.models() - .withExistingParent("block/" + type + "_funnel_" + face + extracting + powered, - p.modLoc("block/funnel/block_" + face)) - .texture("particle", particleTexture) - .texture("7", p.modLoc("block/" + type + "_funnel_plating")) - .texture("6", p.modLoc("block/" + type + "_funnel" + powered)) - .texture("5", p.modLoc("block/" + type + "_funnel_tall" + powered)) - .texture("2_2", p.modLoc("block/" + type + "_funnel" + extracting)) - .texture("3", p.modLoc("block/" + type + "_funnel_back")); - }; - p.horizontalFaceBlock(c.get(), model); - }) - .item(FunnelItem::new) - .model((c, p) -> { - p.withExistingParent("item/" + type + "_funnel", p.modLoc("block/funnel/item")) - .texture("particle", particleTexture) - .texture("7", p.modLoc("block/" + type + "_funnel_plating")) - .texture("2", p.modLoc("block/" + type + "_funnel_neutral")) - .texture("6", p.modLoc("block/" + type + "_funnel")) - .texture("5", p.modLoc("block/" + type + "_funnel_tall")) - .texture("3", p.modLoc("block/" + type + "_funnel_back")); - }) - .build(); - }; - } - public static NonNullUnaryOperator> beltTunnel( String type, ResourceLocation particleTexture) { return b -> b.initialProperties(SharedProperties::stone) diff --git a/src/main/resources/assets/create/models/block/funnel/block_ceiling.json b/src/main/resources/assets/create/models/block/funnel/block_ceiling.json deleted file mode 100644 index 5a70211b5..000000000 --- a/src/main/resources/assets/create/models/block/funnel/block_ceiling.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "3": "create:block/brass_funnel_back", - "5": "create:block/brass_funnel_tall", - "6": "create:block/brass_funnel", - "7": "create:block/brass_funnel_plating", - "2_2": "create:block/brass_funnel_pull" - }, - "elements": [ - { - "name": "LeftWall", - "from": [14, 6, 0], - "to": [16.05, 12, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, - "faces": { - "north": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, - "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, - "south": {"uv": [0, 0, 2, 6], "rotation": 180, "texture": "#2_2"}, - "west": {"uv": [0, 12, 16, 6], "texture": "#2_2"}, - "up": {"uv": [15, 0, 16, 8], "texture": "#7"}, - "down": {"uv": [0, 0, 1, 8], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "LeftWall", - "from": [-0.05, 6, 0], - "to": [2, 12, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, - "faces": { - "north": {"uv": [2, 0, 0, 6], "texture": "#2_2"}, - "east": {"uv": [0, 6, 16, 12], "rotation": 180, "texture": "#2_2"}, - "south": {"uv": [14, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, - "west": {"uv": [0, 6, 16, 0], "texture": "#2_2"}, - "up": {"uv": [8, 0, 9, 8], "texture": "#7"}, - "down": {"uv": [7, 0, 8, 8], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 6, 0], - "to": [14, 12, 6], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, - "faces": { - "north": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"}, - "south": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"}, - "up": {"uv": [9, 0, 15, 3], "texture": "#7"}, - "down": {"uv": [1, 0, 7, 3], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 6, 14], - "to": [14, 12, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 18]}, - "faces": { - "north": {"uv": [15, 13, 9, 16], "rotation": 180, "texture": "#7"}, - "south": {"uv": [14, 0, 2, 6], "rotation": 180, "texture": "#2_2"}, - "up": {"uv": [9, 3, 15, 0], "texture": "#7"}, - "down": {"uv": [0.5, 12.5, 7.5, 11.5], "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 7, 6], - "to": [14, 8, 15], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 12, 2]}, - "faces": { - "down": {"uv": [0, 9, 6, 13.5], "rotation": 180, "texture": "#3"} - } - }, - { - "from": [1, 11, 1], - "to": [15, 14, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 21, 10]}, - "faces": { - "north": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, - "east": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, - "south": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, - "west": {"uv": [9, 6.5, 16, 8], "rotation": 180, "texture": "#3"}, - "up": {"uv": [0, 0, 6, 6], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "Back", - "from": [2.1, 14, 2.05], - "to": [13.9, 18.1, 14.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 24.1]}, - "faces": { - "north": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "east": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "south": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "west": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "up": {"uv": [6, 8, 12, 14], "texture": "#3"} - } - }, - { - "name": "Back", - "from": [2.1, 11.9, 2.05], - "to": [13.9, 14, 13.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 24.1]}, - "faces": { - "north": {"uv": [0, 1.5, 6, 0.5], "rotation": 180, "texture": "#6"}, - "east": {"uv": [2.5, 0.5, 8, 1.5], "texture": "#5"}, - "west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 180, "texture": "#5"} - } - } - ], - "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] - }, - { - "name": "Base", - "origin": [9, -4, 8], - "children": [6, 7] - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json b/src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json deleted file mode 100644 index d5fd6b599..000000000 --- a/src/main/resources/assets/create/models/block/funnel/block_ceiling_old.json +++ /dev/null @@ -1,147 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "3": "create:block/brass_funnel_back", - "5": "create:block/brass_funnel_tall", - "6": "create:block/brass_funnel", - "7": "create:block/brass_funnel_plating", - "2_2": "create:block/brass_funnel_pull" - }, - "elements": [ - { - "name": "LeftWall", - "from": [14, 6, -2], - "to": [16.05, 12, 14], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, - "faces": { - "north": {"uv": [0, 0, 2, 6], "texture": "#2_2"}, - "east": {"uv": [0, 0, 16, 6], "rotation": 180, "texture": "#2_2"}, - "south": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, - "west": {"uv": [0, 12, 16, 6], "texture": "#2_2"}, - "up": {"uv": [15, 0, 16, 8], "texture": "#7"}, - "down": {"uv": [0, 0, 1, 8], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "LeftWall", - "from": [-0.05, 6, -2], - "to": [2, 12, 14], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, - "faces": { - "north": {"uv": [16, 0, 14, 6], "rotation": 180, "texture": "#2_2"}, - "east": {"uv": [0, 6, 16, 12], "rotation": 180, "texture": "#2_2"}, - "south": {"uv": [0, 0, 2, 6], "texture": "#2_2"}, - "west": {"uv": [0, 6, 16, 0], "texture": "#2_2"}, - "up": {"uv": [8, 0, 9, 8], "texture": "#7"}, - "down": {"uv": [7, 0, 8, 8], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 6, -2], - "to": [14, 12, 4], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, - "faces": { - "north": {"uv": [2, 0, 14, 6], "rotation": 180, "texture": "#2_2"}, - "south": {"uv": [9, 13, 15, 16], "rotation": 180, "texture": "#7"}, - "up": {"uv": [9, 0, 15, 3], "texture": "#7"}, - "down": {"uv": [1, 0, 7, 3], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 7, 4], - "to": [14, 8, 13], - "rotation": {"angle": -22.5, "axis": "x", "origin": [8, 12, 0]}, - "faces": { - "down": {"uv": [0, 9, 6, 13.5], "rotation": 180, "texture": "#3"} - } - }, - { - "name": "Top", - "from": [0.05, 12, 14], - "to": [15.95, 15.95, 16], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 2]}, - "faces": { - "north": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"}, - "east": {"uv": [16, 11, 15, 13], "texture": "#7"}, - "south": {"uv": [8, 11, 16, 13], "rotation": 180, "texture": "#7"}, - "west": {"uv": [9, 11, 8, 13], "texture": "#7"}, - "up": {"uv": [0, 13.5, 8, 14.5], "texture": "#7"}, - "down": {"uv": [0, 11.5, 8, 12.5], "texture": "#7"} - } - }, - { - "name": "Top", - "from": [0, 14, 13.1], - "to": [16, 16, 14], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 17, 1.1]}, - "faces": { - "east": {"uv": [6, 13, 5, 13.5], "rotation": 270, "texture": "#7"}, - "south": {"uv": [0, 13.5, 8, 14.5], "rotation": 180, "texture": "#7"}, - "west": {"uv": [7, 13, 6, 13.5], "rotation": 270, "texture": "#7"}, - "up": {"uv": [0, 13, 8, 13.5], "texture": "#7"} - } - }, - { - "from": [1, 11, 0], - "to": [15, 14, 7], - "rotation": {"angle": 0, "axis": "y", "origin": [9, 21, 9]}, - "faces": { - "north": {"uv": [6.5, 0, 8, 6], "rotation": 270, "texture": "#3"}, - "east": {"uv": [1, 6.5, 4.5, 8], "rotation": 180, "texture": "#3"}, - "west": {"uv": [1, 6, 4.5, 7.5], "texture": "#3"}, - "up": {"uv": [8, 0, 11.5, 6], "rotation": 90, "texture": "#3"} - } - }, - { - "name": "Back", - "from": [2.1, 14, 1.05], - "to": [13.9, 18.1, 13.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 6, 23.1]}, - "faces": { - "north": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "east": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "south": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "west": {"uv": [0, 0, 12, 4], "rotation": 180, "texture": "#6"}, - "up": {"uv": [6, 8, 12, 14], "texture": "#3"} - } - }, - { - "name": "Back", - "from": [2.1, 11.9, 1.05], - "to": [13.9, 14, 12.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 22, 23.1]}, - "faces": { - "north": {"uv": [0, 1.5, 6, 0.5], "rotation": 180, "texture": "#6"}, - "east": {"uv": [2.5, 0.5, 8, 1.5], "texture": "#5"}, - "west": {"uv": [2.5, 1.5, 8, 0.5], "rotation": 180, "texture": "#5"} - } - } - ], - "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] - }, - { - "name": "Base", - "origin": [9, -4, 8], - "children": [7, 8] - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_floor.json b/src/main/resources/assets/create/models/block/funnel/block_floor.json deleted file mode 100644 index ecd156783..000000000 --- a/src/main/resources/assets/create/models/block/funnel/block_floor.json +++ /dev/null @@ -1,134 +0,0 @@ -{ - "credit": "Made with Blockbench", - "parent": "block/block", - "textures": { - "3": "create:block/brass_funnel_back", - "5": "create:block/brass_funnel_tall", - "6": "create:block/brass_funnel", - "7": "create:block/brass_funnel_plating", - "2_2": "create:block/brass_funnel_pull" - }, - "elements": [ - { - "name": "LeftWall", - "from": [-0.05, 4, 0], - "to": [2, 10, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, - "faces": { - "north": {"uv": [14, 0, 16, 6], "texture": "#2_2"}, - "east": {"uv": [0, 12, 16, 6], "rotation": 180, "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, 1, 8], "texture": "#7"}, - "down": {"uv": [15, 0, 16, 8], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "LeftWall", - "from": [14, 4, 0], - "to": [16.05, 10, 16], - "rotation": {"angle": 0, "axis": "x", "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"}, - "west": {"uv": [0, 6, 16, 12], "texture": "#2_2"}, - "up": {"uv": [7, 0, 8, 8], "texture": "#7"}, - "down": {"uv": [8, 0, 9, 8], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 4, 0], - "to": [14, 10, 6], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, - "faces": { - "north": {"uv": [2, 0, 14, 6], "texture": "#2_2"}, - "south": {"uv": [9, 13, 15, 16], "texture": "#7"}, - "up": {"uv": [1, 0, 7, 3], "texture": "#7"}, - "down": {"uv": [9, 0, 15, 3], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 4, 14], - "to": [14, 10, 16], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 18]}, - "faces": { - "north": {"uv": [15, 13, 9, 16], "texture": "#7"}, - "south": {"uv": [14, 0, 2, 6], "texture": "#2_2"}, - "up": {"uv": [0.5, 12.5, 7.5, 11.5], "rotation": 180, "texture": "#7"}, - "down": {"uv": [9, 3, 15, 0], "rotation": 180, "texture": "#7"} - } - }, - { - "name": "Top", - "from": [2, 8, 6], - "to": [14, 9, 15], - "rotation": {"angle": 0, "axis": "x", "origin": [8, 4, 2]}, - "faces": { - "up": {"uv": [0, 9, 6, 13.5], "texture": "#3"} - } - }, - { - "from": [1, 2, 1], - "to": [15, 5, 15], - "rotation": {"angle": 0, "axis": "y", "origin": [7, -5, 10]}, - "faces": { - "north": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, - "east": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, - "south": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, - "west": {"uv": [9, 6.5, 16, 8], "texture": "#3"}, - "down": {"uv": [0, 0, 6, 6], "rotation": 270, "texture": "#3"} - } - }, - { - "name": "Back", - "from": [2.1, -2.1, 2.05], - "to": [13.9, 2, 14.1], - "rotation": {"angle": 0, "axis": "y", "origin": [8, 10, 24.1]}, - "faces": { - "north": {"uv": [0, 0, 12, 4], "texture": "#6"}, - "east": {"uv": [0, 0, 12, 4], "texture": "#6"}, - "south": {"uv": [0, 0, 12, 4], "texture": "#6"}, - "west": {"uv": [0, 0, 12, 4], "texture": "#6"}, - "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": { - "north": {"uv": [0, 1.5, 6, 0.5], "texture": "#6"}, - "east": {"uv": [2.5, 1.5, 8, 0.5], "texture": "#5"}, - "west": {"uv": [2.5, 0.5, 8, 1.5], "rotation": 180, "texture": "#5"} - } - } - ], - "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] - }, - { - "name": "Base", - "origin": [9, -4, 8], - "children": [6, 7] - } - ] - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/funnel/block_wall.json b/src/main/resources/assets/create/models/block/funnel/block_horizontal.json similarity index 100% rename from src/main/resources/assets/create/models/block/funnel/block_wall.json rename to src/main/resources/assets/create/models/block/funnel/block_horizontal.json diff --git a/src/main/resources/assets/create/models/block/funnel/block_vertical.json b/src/main/resources/assets/create/models/block/funnel/block_vertical.json new file mode 100644 index 000000000..9af30934a --- /dev/null +++ b/src/main/resources/assets/create/models/block/funnel/block_vertical.json @@ -0,0 +1,212 @@ +{ + "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"} + } + }, + { + "from": [5.05, -0.95, 0.05], + "to": [10.95, 4, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"}, + "east": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"}, + "west": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"}, + "down": {"uv": [2.5, 11.5, 5.5, 12.5], "texture": "#7"} + } + }, + { + "from": [5.05, -0.95, 14], + "to": [10.95, 4, 15.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "east": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"}, + "south": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"}, + "west": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"}, + "down": {"uv": [2.5, 11.5, 5.5, 12.5], "rotation": 180, "texture": "#7"} + } + }, + { + "from": [14, -0.95, 5.05], + "to": [15.95, 4, 10.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"}, + "east": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"}, + "south": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"}, + "down": {"uv": [2.5, 11.5, 5.5, 12.5], "rotation": 270, "texture": "#7"} + } + }, + { + "from": [0.05, -0.95, 5.05], + "to": [2, 4, 10.95], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 0, 8]}, + "faces": { + "north": {"uv": [4.5, 0.5, 5.5, 3], "texture": "#7"}, + "south": {"uv": [2.5, 0.5, 3.5, 3], "texture": "#7"}, + "west": {"uv": [2.5, 0.5, 5.5, 3], "texture": "#7"}, + "down": {"uv": [2.5, 11.5, 5.5, 12.5], "rotation": 90, "texture": "#7"} + } + } + ], + "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 From fe1c32de053acd9d4db694e4500980e21e2c4cc0 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 21 Feb 2021 23:01:57 +0100 Subject: [PATCH 019/124] Cheese control - Windmill bearings now have a configurable minimum of sail blocks --- src/generated/resources/.cache/cache | 28 +++++++++---------- .../resources/assets/create/lang/en_us.json | 5 ++-- .../assets/create/lang/unfinished/de_de.json | 7 +++-- .../assets/create/lang/unfinished/es_es.json | 3 +- .../assets/create/lang/unfinished/es_mx.json | 7 +++-- .../assets/create/lang/unfinished/fr_fr.json | 7 +++-- .../assets/create/lang/unfinished/it_it.json | 7 +++-- .../assets/create/lang/unfinished/ja_jp.json | 7 +++-- .../assets/create/lang/unfinished/ko_kr.json | 7 +++-- .../assets/create/lang/unfinished/nl_nl.json | 7 +++-- .../assets/create/lang/unfinished/pt_br.json | 7 +++-- .../assets/create/lang/unfinished/ru_ru.json | 7 +++-- .../assets/create/lang/unfinished/zh_cn.json | 7 +++-- .../assets/create/lang/unfinished/zh_tw.json | 7 +++-- .../data/create/advancements/aesthetics.json | 4 +-- .../structureMovement/AssemblyException.java | 28 +++++++++---------- .../IDisplayAssemblyExceptions.java | 14 ++++++++-- .../bearing/BearingContraption.java | 7 +++-- .../piston/MechanicalPistonTileEntity.java | 2 -- .../create/foundation/config/CKinetics.java | 2 ++ .../assets/create/lang/default/messages.json | 5 ++-- 21 files changed, 99 insertions(+), 76 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 08899d979..463f09ef7 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 -d4de8202db6564f9721a2e474887c68f7c5068da assets/create/lang/en_us.json -754261b27332b6b86beb7dd74d198135258d2df5 assets/create/lang/unfinished/de_de.json -7ba1c8441fe5a7e3f7fb0d65e11cd3110240de63 assets/create/lang/unfinished/es_es.json -7df992f108dc7d8edb9441b34f345ae9efe43034 assets/create/lang/unfinished/es_mx.json -fbd9288a92b89426756125efce282574df429e62 assets/create/lang/unfinished/fr_fr.json -b22f28b5870c04ff9f88734f5b7a4011dc0e7ece assets/create/lang/unfinished/it_it.json -da01154bb27017c21e996aecb262802fd2c8e0b8 assets/create/lang/unfinished/ja_jp.json -ddaf68fe2fdfd6036760c6fa27d84ede6873394e assets/create/lang/unfinished/ko_kr.json -a1b57248fe1704b9814d1913396c27de33c369c5 assets/create/lang/unfinished/nl_nl.json -9c7d6adae21bb1ba8151c6715acf9e041873d5e4 assets/create/lang/unfinished/pt_br.json -a8f552e8b0fd2742182d478fc72351aa631d5dfd assets/create/lang/unfinished/ru_ru.json -795111b16a8ebb3833c91c984480338bd8cfc9c5 assets/create/lang/unfinished/zh_cn.json -e7ecf88ea70d47bac0739710a728cb7cc210c8bd assets/create/lang/unfinished/zh_tw.json +c562d23527d2f3ac9fa0be10c7fa1bc58f632abc assets/create/lang/en_us.json +8766f1728b3ba4542104e8f87c8b9d1f1741fdeb assets/create/lang/unfinished/de_de.json +3e1f0a8effb4b8541849d5b51576a7531219e914 assets/create/lang/unfinished/es_es.json +cee3455d04453c86d0709ccdc9d347f430edb08e assets/create/lang/unfinished/es_mx.json +1e9d2907c968ab5afb55d72fb934a7d7ed3407b5 assets/create/lang/unfinished/fr_fr.json +eefeacfbd97714d845b78f75cb003d2fb1e3c260 assets/create/lang/unfinished/it_it.json +677008605916984e2063dc6f5d8f7528f2b0b44a assets/create/lang/unfinished/ja_jp.json +397b88e9ad3500d78c08b27f6f11df8b094571fa assets/create/lang/unfinished/ko_kr.json +767605e14edabd5df33a2ef1afbdb84ddd804418 assets/create/lang/unfinished/nl_nl.json +8f0dcab1ffe40d31a1f5823e619648fb01127507 assets/create/lang/unfinished/pt_br.json +c4836701cc764a49529b923c8ab390f1b292e7c2 assets/create/lang/unfinished/ru_ru.json +a179807fb6a649bc9ce4214bbf5192931117bb3c assets/create/lang/unfinished/zh_cn.json +be64b2635e5599b43b4615e333a26d09cfa3baec 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 b3003acb5..018ae8c5a 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -824,11 +824,12 @@ "create.gui.goggles.at_current_speed": "at current speed", "create.gui.goggles.pole_length": "Pole Length:", "create.gui.assembly.exception": "This Contraption was unable to assemble:", - "create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s %2$s %3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk", "create.gui.assembly.exception.structureTooLarge": "There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", "create.gui.assembly.exception.noPistonPoles": "The Piston is missing some extension Poles", + "create.gui.assembly.exception.not_enough_sails": "Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "Gauge Information:", "create.gui.speedometer.title": "Rotation Speed", "create.gui.stressometer.title": "Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 7f34e79e5..7c7c5d275 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: 969", + "_": "Missing Localizations: 970", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 86d845459..eda73db1d 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: 12", "_": "->------------------------] Game Elements [------------------------<-", @@ -830,6 +830,7 @@ "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", + "create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "Información sobre el medidor:", "create.gui.speedometer.title": "Velocidad de rotación", "create.gui.stressometer.title": "Estrés de la red", 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 009a7b1cf..dcf01e843 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: 899", + "_": "Missing Localizations: 900", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 2116543a7..4b55b1452 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: 681", + "_": "Missing Localizations: 682", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "Informations sur la jauge:", "create.gui.speedometer.title": "Vitesse de rotation", "create.gui.stressometer.title": "Stress du réseau", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 6df82e369..26691dd55 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: 16", + "_": "Missing Localizations: 17", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "Informazioni sul calibro:", "create.gui.speedometer.title": "Velocità di rotazione", "create.gui.stressometer.title": "Stress della rete", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 6ee30f977..944c6577c 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: 23", + "_": "Missing Localizations: 24", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "計器の情報:", "create.gui.speedometer.title": "回転速度", "create.gui.stressometer.title": "ネットワークの応力", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 9b1cd4c97..a85e949d8 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: 70", + "_": "Missing Localizations: 71", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "게이지 정보:", "create.gui.speedometer.title": "회전 속도", "create.gui.stressometer.title": "네트워크 부하", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 7a8f2be49..81bdb6aec 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: 1168", + "_": "Missing Localizations: 1169", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 07b2008c1..05dab7dd4 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: 1234", + "_": "Missing Localizations: 1235", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "UNLOCALIZED: Gauge Information:", "create.gui.speedometer.title": "UNLOCALIZED: Rotation Speed", "create.gui.stressometer.title": "UNLOCALIZED: Network Stress", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 8b9dca7e1..11847d2f5 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: 20", + "_": "Missing Localizations: 21", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "Калибровочная информация:", "create.gui.speedometer.title": "Скорость вращения", "create.gui.stressometer.title": "Сетевой момент", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index f93e00348..f43795167 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: 18", + "_": "Missing Localizations: 19", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "仪表信息:", "create.gui.speedometer.title": "旋转速度", "create.gui.stressometer.title": "网络应力", 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 c113fca25..525b6b7e0 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: 23", + "_": "Missing Localizations: 24", "_": "->------------------------] Game Elements [------------------------<-", @@ -825,11 +825,12 @@ "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.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.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "儀表訊息:", "create.gui.speedometer.title": "旋轉速度", "create.gui.stressometer.title": "網路動能", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java index d4f38a469..bfd3d66c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AssemblyException.java @@ -9,7 +9,7 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TranslationTextComponent; public class AssemblyException extends Exception { - + private static final long serialVersionUID = 1L; public final ITextComponent component; private BlockPos position = null; @@ -21,7 +21,8 @@ public class AssemblyException extends Exception { CompoundNBT nbt = new CompoundNBT(); nbt.putString("Component", ITextComponent.Serializer.toJson(exception.component)); if (exception.hasPosition()) - nbt.putLong("Position", exception.getPosition().toLong()); + nbt.putLong("Position", exception.getPosition() + .toLong()); compound.put("LastException", nbt); } @@ -48,38 +49,35 @@ public class AssemblyException extends Exception { } public static AssemblyException unmovableBlock(BlockPos pos, BlockState state) { - AssemblyException e = new AssemblyException("unmovableBlock", - pos.getX(), - pos.getY(), - pos.getZ(), - new TranslationTextComponent(state.getBlock().getTranslationKey())); + AssemblyException e = new AssemblyException("unmovableBlock", pos.getX(), pos.getY(), pos.getZ(), + new TranslationTextComponent(state.getBlock() + .getTranslationKey())); e.position = pos; return e; } public static AssemblyException unloadedChunk(BlockPos pos) { - AssemblyException e = new AssemblyException("chunkNotLoaded", - pos.getX(), - pos.getY(), - pos.getZ()); + AssemblyException e = new AssemblyException("chunkNotLoaded", pos.getX(), pos.getY(), pos.getZ()); e.position = pos; return e; } public static AssemblyException structureTooLarge() { - return new AssemblyException("structureTooLarge", - AllConfigs.SERVER.kinetics.maxBlocksMoved.get()); + return new AssemblyException("structureTooLarge", AllConfigs.SERVER.kinetics.maxBlocksMoved.get()); } public static AssemblyException tooManyPistonPoles() { - return new AssemblyException("tooManyPistonPoles", - AllConfigs.SERVER.kinetics.maxPistonPoles.get()); + return new AssemblyException("tooManyPistonPoles", AllConfigs.SERVER.kinetics.maxPistonPoles.get()); } public static AssemblyException noPistonPoles() { return new AssemblyException("noPistonPoles"); } + public static AssemblyException notEnoughSails(int sails) { + return new AssemblyException("not_enough_sails", sails, AllConfigs.SERVER.kinetics.minimumWindmillSails.get()); + } + public String getFormattedText() { return component.getFormattedText(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java index 1a34952ef..ad4b711a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/IDisplayAssemblyExceptions.java @@ -1,9 +1,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement; +import static net.minecraft.util.text.TextFormatting.GRAY; + import java.util.Arrays; import java.util.List; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.util.text.TextFormatting; @@ -18,9 +21,16 @@ public interface IDisplayAssemblyExceptions { if (!tooltip.isEmpty()) tooltip.add(""); + String spacing = IHaveGoggleInformation.spacing; tooltip.add(IHaveGoggleInformation.spacing + TextFormatting.GOLD + Lang.translate("gui.assembly.exception")); - String text = e.getFormattedText(); - Arrays.stream(text.split("\n")).forEach(l -> tooltip.add(IHaveGoggleInformation.spacing + TextFormatting.GRAY + l)); + + Arrays.stream(e.getFormattedText() + .split("\n")) + .forEach(l -> { + List cutString = TooltipHelper.cutString(spacing + l, GRAY, TextFormatting.WHITE); + for (int i = 0; i < cutString.size(); i++) + tooltip.add((i == 0 ? "" : spacing) + cutString.get(i)); + }); return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 7b1fc465f..3c2edd2d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Ass import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionType; +import com.simibubi.create.foundation.config.AllConfigs; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; @@ -21,7 +22,7 @@ public class BearingContraption extends Contraption { protected int sailBlocks; protected Direction facing; - + private boolean isWindmill; public BearingContraption() {} @@ -38,8 +39,8 @@ public class BearingContraption extends Contraption { return false; startMoving(world); expandBoundsAroundAxis(facing.getAxis()); - if (isWindmill && sailBlocks == 0) - return false; + if (isWindmill && sailBlocks < AllConfigs.SERVER.kinetics.minimumWindmillSails.get()) + throw AssemblyException.notEnoughSails(sailBlocks); if (blocks.isEmpty()) return false; return true; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java index e64ed67e8..bb8c2ff7e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/MechanicalPistonTileEntity.java @@ -46,8 +46,6 @@ public class MechanicalPistonTileEntity extends LinearActuatorTileEntity { if (!(world.getBlockState(pos) .getBlock() instanceof MechanicalPistonBlock)) return; - if (getMovementSpeed() == 0) - return; Direction direction = getBlockState().get(BlockStateProperties.FACING); diff --git a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java index c218f4006..a38e7945c 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CKinetics.java +++ b/src/main/java/com/simibubi/create/foundation/config/CKinetics.java @@ -14,6 +14,7 @@ public class CKinetics extends ConfigBase { e(DeployerAggroSetting.CREEPERS, "ignoreDeployerAttacks", Comments.ignoreDeployerAttacks); public ConfigInt kineticValidationFrequency = i(60, 5, "kineticValidationFrequency", Comments.kineticValidationFrequency); public ConfigFloat crankHungerMultiplier = f(.01f, 0, 1, "crankHungerMultiplier", Comments.crankHungerMultiplier); + public ConfigInt minimumWindmillSails = i(8, 0, "minimumWindmillSails", Comments.minimumWindmillSails); public ConfigGroup fan = group(1, "encasedFan", "Encased Fan"); public ConfigInt fanPushDistance = i(20, 5, "fanPushDistance", Comments.fanPushDistance); @@ -79,6 +80,7 @@ public class CKinetics extends ConfigBase { static String furnaceEngineSpeed = "Base rotation speed for the furnace engine generator"; static String disableStress = "Disable the Stress mechanic altogether."; static String kineticValidationFrequency = "Game ticks between Kinetic Blocks checking whether their source is still valid."; + static String minimumWindmillSails = "Amount of sail-type blocks required for a windmill to assemble successfully."; } public static enum DeployerAggroSetting { diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index deb8aed43..c4dbf9458 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -174,11 +174,12 @@ "create.gui.goggles.pole_length": "Pole Length:", "create.gui.assembly.exception": "This Contraption was unable to assemble:", - "create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s %2$s %3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s %2$s %3$s] was not in a loaded chunk", + "create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk", "create.gui.assembly.exception.structureTooLarge": "There are too many Blocks included in the contraption.\nThe configured maximum is: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "There are too many extension Poles attached to this Piston.\nThe configured maximum is: %1$s", "create.gui.assembly.exception.noPistonPoles": "The Piston is missing some extension Poles", + "create.gui.assembly.exception.not_enough_sails": "Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", "create.gui.gauge.info_header": "Gauge Information:", "create.gui.speedometer.title": "Rotation Speed", From 5da1a6462254a717434c7f8cd5fb14f0f11f9594 Mon Sep 17 00:00:00 2001 From: zelophed Date: Mon, 22 Feb 2021 03:20:09 +0100 Subject: [PATCH 020/124] utility commands --- .../foundation/command/AllCommands.java | 83 ++++++++--- .../command/ConfigureConfigCommand.java | 45 ++++++ .../command/ConfigureConfigPacket.java | 49 +++++-- .../foundation/command/CouplingCommand.java | 136 ++++++++++++++++++ .../foundation/command/FlySpeedCommand.java | 64 +++++++++ .../command/ToggleDebugCommand.java | 38 ++--- .../ToggleExperimentalRenderingCommand.java | 36 ++--- 7 files changed, 367 insertions(+), 84 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java create mode 100644 src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java create mode 100644 src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java 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 657535b79..760fe23c3 100644 --- a/src/main/java/com/simibubi/create/foundation/command/AllCommands.java +++ b/src/main/java/com/simibubi/create/foundation/command/AllCommands.java @@ -1,44 +1,87 @@ package com.simibubi.create.foundation.command; -import java.util.Collections; -import java.util.function.Predicate; - import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.LiteralCommandNode; - import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; import net.minecraft.entity.player.PlayerEntity; +import java.util.Collections; +import java.util.function.Predicate; + public class AllCommands { public static Predicate sourceIsPlayer = (cs) -> cs.getEntity() instanceof PlayerEntity; public static void register(CommandDispatcher dispatcher) { - LiteralCommandNode createRoot = dispatcher.register(Commands.literal("create") - //general purpose - .then(ToggleDebugCommand.register()) - .then(OverlayConfigCommand.register()) - .then(FixLightingCommand.register()) - .then(ReplaceInCommandBlocksCommand.register()) - .then(HighlightCommand.register()) - .then(ToggleExperimentalRenderingCommand.register()) + LiteralCommandNode util = buildUtilityCommands(); - //dev-util - //Comment out for release - .then(ClearBufferCacheCommand.register()) - .then(ChunkUtilCommand.register()) - //.then(KillTPSCommand.register()) + LiteralCommandNode createRoot = dispatcher.register(Commands.literal("create") + .requires(cs -> cs.hasPermissionLevel(0)) + //general purpose + .then(new ToggleExperimentalRenderingCommand().register()) + .then(new ToggleDebugCommand().register()) + .then(OverlayConfigCommand.register()) + .then(FixLightingCommand.register()) + .then(HighlightCommand.register()) + .then(CouplingCommand.register()) + + //utility + .then(util) ); + createRoot.addChild(buildRedirect("u", util)); + CommandNode c = dispatcher.findNode(Collections.singleton("c")); if (c != null) return; - dispatcher.register(Commands.literal("c") - .redirect(createRoot) - ); + dispatcher.getRoot().addChild(buildRedirect("c", createRoot)); + + } + + + private static LiteralCommandNode buildUtilityCommands() { + + return Commands.literal("util") + .then(FlySpeedCommand.register()) + .then(ReplaceInCommandBlocksCommand.register()) + .then(ClearBufferCacheCommand.register()) + .then(ChunkUtilCommand.register()) + //.then(KillTPSCommand.register()) + .build(); + + } + + /** + * ***** + * https://github.com/VelocityPowered/Velocity/blob/8abc9c80a69158ebae0121fda78b55c865c0abad/proxy/src/main/java/com/velocitypowered/proxy/util/BrigadierUtils.java#L38 + * ***** + *

+ * Returns a literal node that redirects its execution to + * the given destination node. + * + * @param alias the command alias + * @param destination the destination node + * + * @return the built node + */ + public static LiteralCommandNode buildRedirect(final String alias, final LiteralCommandNode destination) { + // Redirects only work for nodes with children, but break the top argument-less command. + // Manually adding the root command after setting the redirect doesn't fix it. + // See https://github.com/Mojang/brigadier/issues/46). Manually clone the node instead. + LiteralArgumentBuilder builder = LiteralArgumentBuilder + .literal(alias) + .requires(destination.getRequirement()) + .forward( + destination.getRedirect(), destination.getRedirectModifier(), destination.isFork()) + .executes(destination.getCommand()); + for (CommandNode child : destination.getChildren()) { + builder.then(child); + } + return builder.build(); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java new file mode 100644 index 000000000..7937764cb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigCommand.java @@ -0,0 +1,45 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.ArgumentBuilder; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.entity.player.ServerPlayerEntity; + +public abstract class ConfigureConfigCommand { + + protected final String commandLiteral; + + ConfigureConfigCommand(String commandLiteral) { + this.commandLiteral = commandLiteral; + } + + ArgumentBuilder register() { + return Commands.literal(this.commandLiteral) + .requires(cs -> cs.hasPermissionLevel(0)) + .then(Commands.literal("on") + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().asPlayer(); + sendPacket(player, String.valueOf(true)); + + return Command.SINGLE_SUCCESS; + }) + ) + .then(Commands.literal("off") + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().asPlayer(); + sendPacket(player, String.valueOf(false)); + + return Command.SINGLE_SUCCESS; + }) + ) + .executes(ctx -> { + ServerPlayerEntity player = ctx.getSource().asPlayer(); + sendPacket(player, "info"); + + return Command.SINGLE_SUCCESS; + }); + } + + protected abstract void sendPacket(ServerPlayerEntity player, String option); +} 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 a8d174725..692933155 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -1,23 +1,25 @@ package com.simibubi.create.foundation.command; -import java.util.function.Consumer; -import java.util.function.Supplier; - -import org.apache.logging.log4j.LogManager; - 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.render.backend.FastRenderDispatcher; - import net.minecraft.client.Minecraft; +import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.network.PacketBuffer; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ForgeConfig; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.NetworkEvent; +import org.apache.logging.log4j.LogManager; + +import java.util.function.Consumer; +import java.util.function.Supplier; public class ConfigureConfigPacket extends SimplePacketBase { @@ -79,23 +81,44 @@ public class ConfigureConfigPacket extends SimplePacketBase { @OnlyIn(Dist.CLIENT) private static void rainbowDebug(String value) { + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null || "".equals(value)) return; + + if (value.equals("info")) { + ITextComponent text = new StringTextComponent("Rainbow Debug Utility is currently: ").appendSibling(boolToText(AllConfigs.CLIENT.rainbowDebug.get())); + player.sendStatusMessage(text, false); + return; + } + AllConfigs.CLIENT.rainbowDebug.set(Boolean.parseBoolean(value)); + ITextComponent text = boolToText(AllConfigs.CLIENT.rainbowDebug.get()).appendSibling(new StringTextComponent(" Rainbow Debug Utility").applyTextStyle(TextFormatting.WHITE)); + player.sendStatusMessage(text, false); } @OnlyIn(Dist.CLIENT) private static void experimentalRendering(String value) { - if (!"".equals(value)) { - AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); + ClientPlayerEntity player = Minecraft.getInstance().player; + if (player == null || "".equals(value)) return; + + if (value.equals("info")) { + ITextComponent text = new StringTextComponent("Experimental Rendering is currently: ").appendSibling(boolToText(AllConfigs.CLIENT.experimentalRendering.get())); + player.sendStatusMessage(text, false); + return; } + + AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); + ITextComponent text = boolToText(AllConfigs.CLIENT.experimentalRendering.get()).appendSibling(new StringTextComponent(" Experimental Rendering").applyTextStyle(TextFormatting.WHITE)); + player.sendStatusMessage(text, false); + FastRenderDispatcher.refresh(); } - + @OnlyIn(Dist.CLIENT) private static void overlayReset(String value) { AllConfigs.CLIENT.overlayOffsetX.set(0); AllConfigs.CLIENT.overlayOffsetY.set(0); } - + @OnlyIn(Dist.CLIENT) private static void overlayScreen(String value) { ScreenOpener.open(new GoggleConfigScreen()); @@ -106,5 +129,11 @@ public class ConfigureConfigPacket extends SimplePacketBase { ForgeConfig.CLIENT.experimentalForgeLightPipelineEnabled.set(true); Minecraft.getInstance().worldRenderer.loadRenderers(); } + + private static ITextComponent boolToText(boolean b) { + return b + ? new StringTextComponent("enabled").applyTextStyle(TextFormatting.DARK_GREEN) + : new StringTextComponent("disabled").applyTextStyle(TextFormatting.RED); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java new file mode 100644 index 000000000..8e4512956 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java @@ -0,0 +1,136 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; +import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; +import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartController; +import com.simibubi.create.foundation.utility.Iterate; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.EntityArgument; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.util.text.StringTextComponent; +import net.minecraftforge.common.util.LazyOptional; + +import java.util.UUID; + +public class CouplingCommand { + + public static final SimpleCommandExceptionType ONLY_MINECARTS_ALLOWED = new SimpleCommandExceptionType(new StringTextComponent("Only Minecarts can be coupled")); + public static final SimpleCommandExceptionType SAME_DIMENSION = new SimpleCommandExceptionType(new StringTextComponent("Minecarts have to be in the same Dimension")); + + public static ArgumentBuilder register() { + + return Commands.literal("coupling") + .requires(cs -> cs.hasPermissionLevel(2)) + .then(Commands.literal("add") + .then(Commands.argument("cart1", EntityArgument.entity()) + .then(Commands.argument("cart2", EntityArgument.entity()) + .executes(ctx -> { + Entity cart1 = EntityArgument.getEntity(ctx, "cart1"); + if (!(cart1 instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + Entity cart2 = EntityArgument.getEntity(ctx, "cart2"); + if (!(cart2 instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + if (!cart1.getEntityWorld().equals(cart2.getEntityWorld())) + throw SAME_DIMENSION.create(); + + Entity source = ctx.getSource().getEntity(); + + CouplingHandler.tryToCoupleCarts(source instanceof PlayerEntity ? (PlayerEntity) source : null, cart1.getEntityWorld(), cart1.getEntityId(), cart2.getEntityId()); + + return Command.SINGLE_SUCCESS; + }) + ) + ) + ) + .then(Commands.literal("remove") + .then(Commands.argument("cart1", EntityArgument.entity()) + .then(Commands.argument("cart2", EntityArgument.entity()) + .executes(ctx -> { + Entity cart1 = EntityArgument.getEntity(ctx, "cart1"); + if (!(cart1 instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + Entity cart2 = EntityArgument.getEntity(ctx, "cart2"); + if (!(cart2 instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + LazyOptional cart1Capability = cart1.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); + if (!cart1Capability.isPresent()) { + ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + return 0; + } + + MinecartController cart1Controller = cart1Capability.orElse(null); + + int cart1Couplings = (cart1Controller.isConnectedToCoupling() ? 1 : 0) + (cart1Controller.isLeadingCoupling() ? 1 : 0); + if (cart1Couplings == 0) { + ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + return 0; + } + + for (boolean bool : Iterate.trueAndFalse) { + UUID coupledCart = cart1Controller.getCoupledCart(bool); + if (coupledCart == null) + continue; + + if (coupledCart != cart2.getUniqueID()) + continue; + + MinecartController cart2Controller = CapabilityMinecartController.getIfPresent(cart1.getEntityWorld(), coupledCart); + if (cart2Controller == null) + return 0; + + cart1Controller.removeConnection(bool); + cart2Controller.removeConnection(!bool); + return Command.SINGLE_SUCCESS; + } + + ctx.getSource().sendFeedback(new StringTextComponent("The specified Carts are not coupled"), true); + + return 0; + }) + ) + ) + ) + .then(Commands.literal("removeAll") + .then(Commands.argument("cart", EntityArgument.entity()) + .executes(ctx -> { + Entity cart = EntityArgument.getEntity(ctx, "cart"); + if (!(cart instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + LazyOptional capability = cart.getCapability(CapabilityMinecartController.MINECART_CONTROLLER_CAPABILITY); + if (!capability.isPresent()) { + ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + return 0; + } + + MinecartController controller = capability.orElse(null); + + int couplings = (controller.isConnectedToCoupling() ? 1 : 0) + (controller.isLeadingCoupling() ? 1 : 0); + if (couplings == 0) { + ctx.getSource().sendFeedback(new StringTextComponent("Minecart has no Couplings Attached"), true); + return 0; + } + + controller.decouple(); + + ctx.getSource().sendFeedback(new StringTextComponent("Removed " + couplings + " couplings from the Minecart"), true); + + return couplings; + }) + ) + ); + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java b/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java new file mode 100644 index 000000000..f34c689d2 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/FlySpeedCommand.java @@ -0,0 +1,64 @@ +package com.simibubi.create.foundation.command; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.FloatArgumentType; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.EntityArgument; +import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.network.play.server.SPlayerAbilitiesPacket; +import net.minecraft.util.text.StringTextComponent; + +public class FlySpeedCommand { + + public static ArgumentBuilder register() { + return Commands.literal("flySpeed") + .requires(cs -> cs.hasPermissionLevel(2)) + .then(Commands.argument("speed", FloatArgumentType.floatArg(0)) + .then(Commands.argument("target", EntityArgument.player()) + .executes(ctx -> sendFlySpeedUpdate( + ctx, + EntityArgument.getPlayer(ctx, "target"), + FloatArgumentType.getFloat(ctx, "speed") + ) + ) + ) + .executes(ctx -> sendFlySpeedUpdate( + ctx, + ctx.getSource().asPlayer(), + FloatArgumentType.getFloat(ctx, "speed") + ) + ) + ) + .then(Commands.literal("reset") + .then(Commands.argument("target", EntityArgument.player()) + .executes(ctx -> sendFlySpeedUpdate( + ctx, + EntityArgument.getPlayer(ctx, "target"), + 0.05f + ) + ) + ) + .executes(ctx -> sendFlySpeedUpdate( + ctx, + ctx.getSource().asPlayer(), + 0.05f + ) + ) + + ); + } + + private static int sendFlySpeedUpdate(CommandContext ctx, ServerPlayerEntity player, float speed) { + SPlayerAbilitiesPacket packet = new SPlayerAbilitiesPacket(player.abilities); + packet.setFlySpeed(speed); + player.connection.sendPacket(packet); + + ctx.getSource().sendFeedback(new StringTextComponent("Temporarily set " + player.getName().getFormattedText() + "'s Flying Speed to: " + speed), true); + + return Command.SINGLE_SUCCESS; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java index 918d3dc7c..d8953c8f1 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleDebugCommand.java @@ -1,38 +1,20 @@ package com.simibubi.create.foundation.command; -import com.mojang.brigadier.Command; -import com.mojang.brigadier.arguments.BoolArgumentType; -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.minecraft.util.text.StringTextComponent; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.PacketDistributor; -public class ToggleDebugCommand { +public class ToggleDebugCommand extends ConfigureConfigCommand { - static ArgumentBuilder register() { - return Commands.literal("toggleDebug") - .requires(cs -> cs.hasPermissionLevel(0)) - .then(Commands.argument("value", BoolArgumentType.bool()) - .executes(ctx -> { - boolean value = BoolArgumentType.getBool(ctx, "value"); - //DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.rainbowDebug.performAction(String.valueOf(value))); + public ToggleDebugCommand() { + super("rainbowDebug"); + } - DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), - new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), String.valueOf(value)))); - - ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " rainbow debug"), true); - - return Command.SINGLE_SUCCESS; - }) - ); + @Override + protected void sendPacket(ServerPlayerEntity player, String option) { + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> player), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.rainbowDebug.name(), option) + ); } } diff --git a/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java b/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java index 25970ac7a..e80862f33 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/ToggleExperimentalRenderingCommand.java @@ -1,36 +1,20 @@ package com.simibubi.create.foundation.command; -import com.mojang.brigadier.arguments.BoolArgumentType; -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.minecraft.util.text.StringTextComponent; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.PacketDistributor; -public class ToggleExperimentalRenderingCommand { +public class ToggleExperimentalRenderingCommand extends ConfigureConfigCommand { - static ArgumentBuilder register() { - return Commands.literal("experimentalRendering") - .requires(cs -> cs.hasPermissionLevel(0)) - .then(Commands.argument("value", BoolArgumentType.bool()) - .executes(ctx -> { - boolean value = BoolArgumentType.getBool(ctx, "value"); - //DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> AllConfigs.CLIENT.rainbowDebug.set(value)); - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ConfigureConfigPacket.Actions.experimentalRendering.performAction(String.valueOf(value))); + public ToggleExperimentalRenderingCommand() { + super("experimentalRendering"); + } - DistExecutor.unsafeRunWhenOn(Dist.DEDICATED_SERVER, () -> () -> - AllPackets.channel.send( - PacketDistributor.PLAYER.with(() -> (ServerPlayerEntity) ctx.getSource().getEntity()), - new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), String.valueOf(value)))); - - ctx.getSource().sendFeedback(new StringTextComponent((value ? "enabled" : "disabled") + " experimental rendering"), true); - - return 1; - })); + @Override + protected void sendPacket(ServerPlayerEntity player, String option) { + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> player), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.experimentalRendering.name(), option) + ); } } From 38d406e85d36f463fab8ea8b4da7275ad8e940a9 Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Mon, 22 Feb 2021 03:07:02 -0300 Subject: [PATCH 021/124] Update es_es.json Updated --- src/main/resources/assets/create/lang/es_es.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 989f4c08c..564829459 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -829,6 +829,7 @@ "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", + "create.gui.assembly.exception.not_enough_sails": "La estructura adjunta no incluye suficientes bloques tipo vela: %1$s\nSe requiere un mínimo de %2$s", "create.gui.gauge.info_header": "Información sobre el medidor:", "create.gui.speedometer.title": "Velocidad de rotación", "create.gui.stressometer.title": "Estrés de la red", From d8beae6ee9a9a1b76b2e517ac56f717d2008b56f Mon Sep 17 00:00:00 2001 From: Franco Paladini <76663897+FrannDzs@users.noreply.github.com> Date: Mon, 22 Feb 2021 03:12:41 -0300 Subject: [PATCH 022/124] Update es_es.json --- src/main/resources/assets/create/lang/es_es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/create/lang/es_es.json b/src/main/resources/assets/create/lang/es_es.json index 564829459..c8e41ac46 100644 --- a/src/main/resources/assets/create/lang/es_es.json +++ b/src/main/resources/assets/create/lang/es_es.json @@ -824,8 +824,8 @@ "create.gui.goggles.at_current_speed": "con la velocidad actual", "create.gui.goggles.pole_length": "Longitud del poste:", "create.gui.assembly.exception": "Este artilugio no se pudo montar:", - "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s %2$s %3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s %2$s %3$s] no estaba en un chunk cargado", + "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s,%2$s,%3$s] no estaba en un chunk cargado", "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", From bac4be17286e2eb03b154b8fafa713aa7101e911 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 22 Feb 2021 11:25:38 -0800 Subject: [PATCH 023/124] Superglue no longer gums up spawn packets --- .../components/structureMovement/Contraption.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) 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 3e363d2d3..e783d6436 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 @@ -712,16 +712,15 @@ public abstract class Contraption { } ListNBT superglueNBT = new ListNBT(); - for (Pair glueEntry : superglue) { - CompoundNBT c = new CompoundNBT(); - c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); - c.putByte("Direction", (byte) glueEntry.getValue() - .getIndex()); - superglueNBT.add(c); - } - ListNBT storageNBT = new ListNBT(); if (!spawnPacket) { + for (Pair glueEntry : superglue) { + CompoundNBT c = new CompoundNBT(); + c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); + c.putByte("Direction", (byte) glueEntry.getValue().getIndex()); + superglueNBT.add(c); + } + for (BlockPos pos : storage.keySet()) { CompoundNBT c = new CompoundNBT(); MountedStorage mountedStorage = storage.get(pos); From cad71e58431b30e9b41da31ea74d6803fae052a6 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 23 Feb 2021 16:20:46 -0800 Subject: [PATCH 024/124] Even more compatibility. --- .../foundation/render/backend/Backend.java | 17 ++--- .../render/backend/gl/GlBuffer.java | 5 +- .../render/backend/gl/GlVertexArray.java | 9 +-- ...{GlFunctions.java => GlFeatureCompat.java} | 8 +- .../backend/gl/versioned/RGPixelFormat.java | 75 +++++++++++++++++++ .../backend/instancing/InstancedModel.java | 4 +- .../render/backend/light/LightVolume.java | 25 ++++--- 7 files changed, 110 insertions(+), 33 deletions(-) rename src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/{GlFunctions.java => GlFeatureCompat.java} (93%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 858d54572..5f53ee500 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -3,15 +3,12 @@ package com.simibubi.create.foundation.render.backend; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; -import java.nio.ByteBuffer; import java.nio.FloatBuffer; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.function.Consumer; import java.util.function.Predicate; -import com.simibubi.create.foundation.render.backend.gl.versioned.GlFunctions; +import com.simibubi.create.foundation.render.backend.gl.versioned.GlFeatureCompat; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.GL; @@ -23,8 +20,6 @@ import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderType; -import com.simibubi.create.foundation.render.backend.gl.versioned.GlVersioned; -import com.simibubi.create.foundation.render.backend.gl.versioned.MapBuffer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureUtil; @@ -45,7 +40,7 @@ public class Backend { private static boolean enabled; public static GLCapabilities capabilities; - public static GlFunctions functions; + public static GlFeatureCompat compat; public Backend() { throw new IllegalStateException(); @@ -74,9 +69,9 @@ public class Backend { public static boolean canUseInstancing() { return enabled && - functions.vertexArrayObjectsSupported() && - functions.drawInstancedSupported() && - functions.instancedArraysSupported(); + compat.vertexArrayObjectsSupported() && + compat.drawInstancedSupported() && + compat.instancedArraysSupported(); } public static boolean canUseVBOs() { @@ -107,7 +102,7 @@ public class Backend { private static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { if (predicate.test(VanillaResourceType.SHADERS)) { capabilities = GL.createCapabilities(); - functions = new GlFunctions(capabilities); + compat = new GlFeatureCompat(capabilities); OptifineHandler.refresh(); refresh(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java index 8420dab87..1dbd256e5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlBuffer.java @@ -4,7 +4,6 @@ import java.nio.ByteBuffer; import java.util.function.Consumer; import com.simibubi.create.foundation.render.backend.Backend; -import com.simibubi.create.foundation.render.backend.gl.versioned.GlFunctions; import org.lwjgl.opengl.GL20; public class GlBuffer extends GlObject { @@ -35,11 +34,11 @@ public class GlBuffer extends GlObject { } public void map(int length, Consumer upload) { - Backend.functions.mapBuffer(bufferType, 0, length, upload); + Backend.compat.mapBuffer(bufferType, 0, length, upload); } public void map(int offset, int length, Consumer upload) { - Backend.functions.mapBuffer(bufferType, offset, length, upload); + Backend.compat.mapBuffer(bufferType, offset, length, upload); } protected void deleteInternal(int handle) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java index cf6229f6e..e4854990e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlVertexArray.java @@ -3,19 +3,18 @@ package com.simibubi.create.foundation.render.backend.gl; import java.util.function.Consumer; import com.simibubi.create.foundation.render.backend.Backend; -import org.lwjgl.opengl.GL30; public class GlVertexArray extends GlObject { public GlVertexArray() { - setHandle(Backend.functions.genVertexArrays()); + setHandle(Backend.compat.genVertexArrays()); } public void bind() { - Backend.functions.bindVertexArray(handle()); + Backend.compat.bindVertexArray(handle()); } public void unbind() { - Backend.functions.bindVertexArray(0); + Backend.compat.bindVertexArray(0); } public void with(Consumer action) { @@ -25,6 +24,6 @@ public class GlVertexArray extends GlObject { } protected void deleteInternal(int handle) { - Backend.functions.deleteVertexArrays(handle); + Backend.compat.deleteVertexArrays(handle); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFeatureCompat.java similarity index 93% rename from src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java rename to src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFeatureCompat.java index 1345661fc..b2eba08e1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFunctions.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/GlFeatureCompat.java @@ -13,19 +13,23 @@ import java.util.function.Consumer; * Each field stores an enum variant that provides access to the * most appropriate version of a feature for the current system. */ -public class GlFunctions { +public class GlFeatureCompat { public final MapBuffer mapBuffer; public final VertexArrayObject vertexArrayObject; public final InstancedArrays instancedArrays; public final DrawInstanced drawInstanced; - public GlFunctions(GLCapabilities caps) { + public final RGPixelFormat pixelFormat; + + public GlFeatureCompat(GLCapabilities caps) { mapBuffer = getLatest(MapBuffer.class, caps); vertexArrayObject = getLatest(VertexArrayObject.class, caps); instancedArrays = getLatest(InstancedArrays.class, caps); drawInstanced = getLatest(DrawInstanced.class, caps); + + pixelFormat = getLatest(RGPixelFormat.class, caps); } public void mapBuffer(int target, int offset, int length, Consumer upload) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java new file mode 100644 index 000000000..9cf035535 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/versioned/RGPixelFormat.java @@ -0,0 +1,75 @@ +package com.simibubi.create.foundation.render.backend.gl.versioned; + +import org.lwjgl.opengl.*; + +public enum RGPixelFormat implements GlVersioned { + GL30_RG { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL30; + } + + @Override + public int internalFormat() { + return GL30.GL_RG8; + } + + @Override + public int format() { + return GL30.GL_RG; + } + + @Override + public int byteCount() { + return 2; + } + }, + GL11_RGB { + @Override + public boolean supported(GLCapabilities caps) { + return caps.OpenGL11; + } + + @Override + public int internalFormat() { + return GL11.GL_RGB8; + } + + @Override + public int format() { + return GL11.GL_RGB; + } + + @Override + public int byteCount() { + return 3; + } + }, + UNSUPPORTED { + @Override + public boolean supported(GLCapabilities caps) { + return true; + } + + @Override + public int internalFormat() { + throw new UnsupportedOperationException(); + } + + @Override + public int format() { + throw new UnsupportedOperationException(); + } + + @Override + public int byteCount() { + throw new UnsupportedOperationException(); + } + } + + ; + + public abstract int internalFormat(); + public abstract int format(); + public abstract int byteCount(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index 3b092c919..5903ae496 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -115,7 +115,7 @@ public abstract class InstancedModel extends BufferedMod protected void doRender() { vao.with(vao -> { renderSetup(); - Backend.functions.drawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); + Backend.compat.drawArraysInstanced(GL11.GL_QUADS, 0, vertexCount, glInstanceCount); }); } @@ -162,7 +162,7 @@ public abstract class InstancedModel extends BufferedMod instanceFormat.vertexAttribPointers(staticAttributes); for (int i = 0; i < instanceFormat.getShaderAttributeCount(); i++) { - Backend.functions.vertexAttribDivisor(i + staticAttributes, 1); + Backend.compat.vertexAttribDivisor(i + staticAttributes, 1); } }); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index 143964ba5..cada1ecad 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -2,11 +2,12 @@ package com.simibubi.create.foundation.render.backend.light; import java.nio.ByteBuffer; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.gl.versioned.RGPixelFormat; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL20; -import org.lwjgl.opengl.GL40; import org.lwjgl.system.MemoryUtil; import com.simibubi.create.foundation.render.backend.RenderWork; @@ -28,11 +29,15 @@ public class LightVolume { private final GlTexture glTexture; + private final RGPixelFormat pixelFormat; + public LightVolume(GridAlignedBB sampleVolume) { setSampleVolume(sampleVolume); + pixelFormat = Backend.compat.pixelFormat; + this.glTexture = new GlTexture(GL20.GL_TEXTURE_3D); - this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * 2); // TODO: reduce this to span only sampleVolume + this.lightData = MemoryUtil.memAlloc(this.textureVolume.volume() * pixelFormat.byteCount()); // allocate space for the texture GL20.glActiveTexture(GL20.GL_TEXTURE4); @@ -41,7 +46,7 @@ public class LightVolume { int sizeX = textureVolume.sizeX(); int sizeY = textureVolume.sizeY(); int sizeZ = textureVolume.sizeZ(); - GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, GL40.GL_RG8, sizeX, sizeY, sizeZ, 0, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, 0); + GL12.glTexImage3D(GL12.GL_TEXTURE_3D, 0, pixelFormat.internalFormat(), sizeX, sizeY, sizeZ, 0, pixelFormat.format(), GL20.GL_UNSIGNED_BYTE, 0); glTexture.unbind(); GL20.glActiveTexture(GL20.GL_TEXTURE0); @@ -222,7 +227,7 @@ public class LightVolume { // just in case something goes wrong or we accidentally call this before this volume is properly disposed of. if (lightData == null || removed) return; - GL13.glActiveTexture(GL40.GL_TEXTURE4); + GL13.glActiveTexture(GL20.GL_TEXTURE4); glTexture.bind(); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MIN_FILTER, GL13.GL_LINEAR); GL11.glTexParameteri(GL13.GL_TEXTURE_3D, GL13.GL_TEXTURE_MAG_FILTER, GL13.GL_LINEAR); @@ -245,7 +250,7 @@ public class LightVolume { int sizeY = textureVolume.sizeY(); int sizeZ = textureVolume.sizeZ(); - GL12.glTexSubImage3D(GL12.GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, GL40.GL_RG, GL40.GL_UNSIGNED_BYTE, lightData); + GL12.glTexSubImage3D(GL12.GL_TEXTURE_3D, 0, 0, 0, 0, sizeX, sizeY, sizeZ, pixelFormat.format(), GL20.GL_UNSIGNED_BYTE, lightData); GL20.glPixelStorei(GL20.GL_UNPACK_ALIGNMENT, 4); // 4 is the default bufferDirty = false; @@ -269,7 +274,7 @@ public class LightVolume { byte b = (byte) ((block & 0xF) << 4); byte s = (byte) ((sky & 0xF) << 4); - int i = index(x, y, z); + int i = posToIndex(x, y, z); lightData.put(i, b); lightData.put(i + 1, s); } @@ -277,16 +282,16 @@ public class LightVolume { private void writeBlock(int x, int y, int z, int block) { byte b = (byte) ((block & 0xF) << 4); - lightData.put(index(x, y, z), b); + lightData.put(posToIndex(x, y, z), b); } private void writeSky(int x, int y, int z, int sky) { byte b = (byte) ((sky & 0xF) << 4); - lightData.put(index(x, y, z) + 1, b); + lightData.put(posToIndex(x, y, z) + 1, b); } - private int index(int x, int y, int z) { - return (x + textureVolume.sizeX() * (y + z * textureVolume.sizeY())) * 2; + private int posToIndex(int x, int y, int z) { + return (x + textureVolume.sizeX() * (y + z * textureVolume.sizeY())) * pixelFormat.byteCount(); } } From 051a32557fc69a738985ca8c36e74580080bc695 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 24 Feb 2021 17:48:45 +0100 Subject: [PATCH 025/124] 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 2f12326203f8a1794c9f99c6ef2c7cf41f1633d2 Mon Sep 17 00:00:00 2001 From: zelophed Date: Wed, 24 Feb 2021 22:06:40 +0100 Subject: [PATCH 026/124] cloning glue --- .../foundation/command/AllCommands.java | 3 +- .../foundation/command/CloneCommand.java | 154 ++++++++++++++++++ 2 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/foundation/command/CloneCommand.java 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..2f9471abb 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(CloneCommand.register()) //utility .then(util) @@ -47,10 +48,10 @@ public class AllCommands { private static LiteralCommandNode buildUtilityCommands() { return Commands.literal("util") - .then(FlySpeedCommand.register()) .then(ReplaceInCommandBlocksCommand.register()) .then(ClearBufferCacheCommand.register()) .then(ChunkUtilCommand.register()) + .then(FlySpeedCommand.register()) //.then(KillTPSCommand.register()) .build(); diff --git a/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java b/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java new file mode 100644 index 000000000..83bc8b4a8 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java @@ -0,0 +1,154 @@ +package com.simibubi.create.foundation.command; + +import com.google.common.collect.Lists; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.Dynamic2CommandExceptionType; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; +import com.simibubi.create.foundation.utility.Pair; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.command.CommandSource; +import net.minecraft.command.Commands; +import net.minecraft.command.arguments.BlockPosArgument; +import net.minecraft.inventory.IClearable; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.CachedBlockInfo; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MutableBoundingBox; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraft.world.gen.feature.template.Template; +import net.minecraft.world.server.ServerWorld; + +import java.util.List; + +public class CloneCommand { + + private static final Dynamic2CommandExceptionType CLONE_TOO_BIG_EXCEPTION = new Dynamic2CommandExceptionType((arg1, arg2) -> new TranslationTextComponent("commands.clone.toobig", arg1, arg2)); + + public static ArgumentBuilder register() { + return Commands.literal("clone") + .requires(cs -> cs.hasPermissionLevel(2)) + .then(Commands.argument("begin", BlockPosArgument.blockPos()) + .then(Commands.argument("end", BlockPosArgument.blockPos()) + .then(Commands.argument("destination", BlockPosArgument.blockPos()) + .executes(ctx -> doClone(ctx.getSource(), BlockPosArgument.getLoadedBlockPos(ctx, "begin"), BlockPosArgument.getLoadedBlockPos(ctx, "end"), BlockPosArgument.getLoadedBlockPos(ctx, "destination"))) + ) + ) + ) + .executes(ctx -> { + ctx.getSource().sendFeedback(new StringTextComponent("Clones all blocks as well as super glue from the specified area to the target destination"), true); + + return Command.SINGLE_SUCCESS; + }); + + + } + + private static int doClone(CommandSource source, BlockPos begin, BlockPos end, BlockPos destination) throws CommandSyntaxException { + MutableBoundingBox sourceArea = new MutableBoundingBox(begin, end); + BlockPos destinationEnd = destination.add(sourceArea.getLength()); + MutableBoundingBox destinationArea = new MutableBoundingBox(destination, destinationEnd); + + int i = sourceArea.getXSize() * sourceArea.getYSize() * sourceArea.getZSize(); + if (i > 32768) + throw CLONE_TOO_BIG_EXCEPTION.create(32768, i); + + ServerWorld world = source.getWorld(); + + if (!world.isAreaLoaded(begin, end) || !world.isAreaLoaded(destination, destinationEnd)) + throw BlockPosArgument.POS_UNLOADED.create(); + + List blocks = Lists.newArrayList(); + List tileBlocks = Lists.newArrayList(); + BlockPos diffToTarget = new BlockPos(destinationArea.minX - sourceArea.minX, destinationArea.minY - sourceArea.minY, destinationArea.minZ - sourceArea.minZ); + + + //gather info + for (int z = sourceArea.minZ; z <= sourceArea.maxZ; ++z) { + for (int y = sourceArea.minY; y <= sourceArea.maxY; ++y) { + for (int x = sourceArea.minX; x <= sourceArea.maxX; ++x) { + BlockPos currentPos = new BlockPos(x, y, z); + BlockPos newPos = currentPos.add(diffToTarget); + CachedBlockInfo cached = new CachedBlockInfo(world, currentPos, false); + BlockState state = cached.getBlockState(); + TileEntity te = world.getTileEntity(currentPos); + if (te != null) { + CompoundNBT nbt = te.write(new CompoundNBT()); + tileBlocks.add(new Template.BlockInfo(newPos, state, nbt)); + } else { + blocks.add(new Template.BlockInfo(newPos, state, null)); + } + } + } + } + + List glue = world.getEntitiesWithinAABB(SuperGlueEntity.class, AxisAlignedBB.func_216363_a(sourceArea)); + List> newGlue = Lists.newArrayList(); + + for (SuperGlueEntity g : glue) { + BlockPos pos = g.getHangingPosition(); + Direction direction = g.getFacingDirection(); + newGlue.add(Pair.of(pos.add(diffToTarget), direction)); + } + + //paste + List allBlocks = Lists.newArrayList(); + allBlocks.addAll(blocks); + allBlocks.addAll(tileBlocks); + + List reverse = Lists.reverse(allBlocks); + + for (Template.BlockInfo info : reverse) { + TileEntity te = world.getTileEntity(info.pos); + IClearable.clearObj(te); + world.setBlockState(info.pos, Blocks.BARRIER.getDefaultState(), 2); + } + + int blockPastes = 0; + int gluePastes = 0; + + for (Template.BlockInfo info : allBlocks) { + if (world.setBlockState(info.pos, info.state, 2)) + blockPastes++; + } + + for (Template.BlockInfo info : tileBlocks) { + TileEntity te = world.getTileEntity(info.pos); + if (te != null && info.nbt != null) { + info.nbt.putInt("x", info.pos.getX()); + info.nbt.putInt("y", info.pos.getY()); + info.nbt.putInt("z", info.pos.getZ()); + te.read(info.nbt); + te.markDirty(); + } + + //idk why the state is set twice for a te, but its done like this in the original clone command + world.setBlockState(info.pos, info.state, 2); + } + + for (Template.BlockInfo info : reverse) { + world.notifyNeighbors(info.pos, info.state.getBlock()); + } + + for (Pair p : newGlue) { + SuperGlueEntity g = new SuperGlueEntity(world, p.getFirst(), p.getSecond()); + if (g.onValidSurface()){ + world.addEntity(g); + gluePastes++; + } + } + + world.getPendingBlockTicks().copyTicks(sourceArea, diffToTarget); + + source.sendFeedback(new StringTextComponent("Successfully cloned " + blockPastes + " Blocks and applied Glue " + gluePastes + " times"), true); + return blockPastes + gluePastes; + + } + +} From e62d89b21cd6504faf3868603a181816ed4d7328 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 24 Feb 2021 16:52:49 -0800 Subject: [PATCH 027/124] Everything is lit, hopefully all the time now. --- build.gradle | 4 +- .../contraptions/base/KineticTileEntity.java | 10 ++--- .../structureMovement/Contraption.java | 2 +- .../render/ContraptionRenderDispatcher.java | 6 +++ .../mixin/NetworkLightUpdateMixin.java | 43 +++++++++++++++++++ .../foundation/mixin/RenderHooksMixin.java | 8 ++++ .../instancing/InstancedTileRenderer.java | 18 -------- .../render/backend/light/GridAlignedBB.java | 11 +++++ .../render/backend/light/LightVolume.java | 9 ++++ src/main/resources/create.mixins.json | 3 +- 10 files changed, 85 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/mixin/NetworkLightUpdateMixin.java diff --git a/build.gradle b/build.gradle index 7477d5da9..0d4a0c6eb 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ minecraft { workingDirectory project.file('run') // property 'mixin.env.disableRefMap', 'true' arg '-mixin.config=create.mixins.json' -// jvmArgs '-XX:+UnlockCommercialFeatures' + jvmArgs '-XX:+UnlockCommercialFeatures' property 'forge.logging.console.level', 'info' property 'fml.earlyprogresswindow', 'false' mods { @@ -132,7 +132,7 @@ dependencies { //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") - annotationProcessor 'org.spongepowered:mixin:0.8:processor' + //annotationProcessor 'org.spongepowered:mixin:0.8:processor' } jar { 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 088ce8618..d0ca45720 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 @@ -81,6 +81,9 @@ public abstract class KineticTileEntity extends SmartTileEntity } super.initialize(); + + if (world != null && world.isRemote) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); } @Override @@ -534,13 +537,6 @@ public abstract class KineticTileEntity extends SmartTileEntity return block.hasIntegratedCogwheel(world, pos, state); } - @Override - public void onLoad() { - super.onLoad(); - if (world != null && world.isRemote) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); - } - @Override public void onChunkUnloaded() { if (world != null && world.isRemote) 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..fb5c044d4 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 @@ -901,7 +901,7 @@ public abstract class Contraption { world.getWorld() .removeTileEntity(add); int flags = BlockFlags.IS_MOVING | BlockFlags.NO_NEIGHBOR_DROPS | BlockFlags.UPDATE_NEIGHBORS - | BlockFlags.BLOCK_UPDATE; + | BlockFlags.BLOCK_UPDATE | BlockFlags.RERENDER_MAIN_THREAD; if (blockIn instanceof IWaterLoggable && oldState.has(BlockStateProperties.WATERLOGGED) && oldState.get(BlockStateProperties.WATERLOGGED) .booleanValue()) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index f26e5174b..b35305eed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -64,6 +64,12 @@ public class ContraptionRenderDispatcher { } } + public static void notifyLightPacket(ILightReader world, int chunkX, int chunkZ) { + for (RenderedContraption renderer : renderers.values()) { + renderer.getLighter().lightVolume.notifyLightPacket(world, chunkX, chunkZ); + } + } + public static void renderTick() { firstLayer = true; } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/NetworkLightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/NetworkLightUpdateMixin.java new file mode 100644 index 000000000..a40c2c088 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/mixin/NetworkLightUpdateMixin.java @@ -0,0 +1,43 @@ +package com.simibubi.create.foundation.mixin; + +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; +import com.simibubi.create.foundation.render.backend.RenderWork; +import com.simibubi.create.foundation.render.backend.light.ILightListener; +import net.minecraft.client.Minecraft; +import net.minecraft.client.network.play.ClientPlayNetHandler; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.play.server.SUpdateLightPacket; +import net.minecraft.world.chunk.Chunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(ClientPlayNetHandler.class) +public class NetworkLightUpdateMixin { + + @Inject(at = @At("TAIL"), method = "handleUpdateLight") + private void onLightPacket(SUpdateLightPacket packet, CallbackInfo ci) { + RenderWork.enqueue(() -> { + ClientWorld world = Minecraft.getInstance().world; + + if (world == null) return; + + int chunkX = packet.getChunkX(); + int chunkZ = packet.getChunkZ(); + + Chunk chunk = world.getChunkProvider().getChunk(chunkX, chunkZ, false); + + if (chunk != null) { + chunk.getTileEntityMap() + .values() + .stream() + .filter(tile -> tile instanceof ILightListener) + .map(tile -> (ILightListener) tile) + .forEach(ILightListener::onChunkLightUpdate); + } + + ContraptionRenderDispatcher.notifyLightPacket(world, chunkX, chunkZ); + }); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index 27f8173ce..eb02006e8 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -1,5 +1,11 @@ package com.simibubi.create.foundation.mixin; +import com.simibubi.create.foundation.render.backend.light.ILightListener; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientChunkProvider; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.ILightReader; +import net.minecraft.world.chunk.Chunk; import org.lwjgl.opengl.GL20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -21,6 +27,8 @@ import net.minecraft.client.world.ClientWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import java.util.Map; + @OnlyIn(Dist.CLIENT) @Mixin(WorldRenderer.class) public class RenderHooksMixin { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 4f22c016f..9c3c1ced0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -20,8 +20,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; public abstract class InstancedTileRenderer

{ - public static WorldAttached> addedLastTick = new WorldAttached<>(ConcurrentHashMap::new); - protected Map> instances = new HashMap<>(); protected Map, RenderMaterial> materials = new HashMap<>(); @@ -35,23 +33,8 @@ public abstract class InstancedTileRenderer

{ public abstract void registerMaterials(); public void tick() { - ClientWorld world = Minecraft.getInstance().world; - int ticks = AnimationTickHolder.getTicks(); - ConcurrentHashMap map = addedLastTick.get(world); - map - .entrySet() - .stream() - .filter(it -> ticks - it.getValue() > 10) - .map(Map.Entry::getKey) - .forEach(te -> { - map.remove(te); - - onLightUpdate(te); - }); - - // Clean up twice a second. This doesn't have to happen every tick, // but this does need to be run to ensure we don't miss anything. if (ticks % 10 == 0) { @@ -82,7 +65,6 @@ public abstract class InstancedTileRenderer

{ TileEntityInstance renderer = InstancedTileRenderRegistry.instance.create(this, tile); if (renderer != null) { - addedLastTick.get(tile.getWorld()).put(tile, AnimationTickHolder.getTicks()); instances.put(tile, renderer); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java index 707efc0bd..e25fe1924 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java @@ -53,6 +53,17 @@ public class GridAlignedBB { pos.getWorldEndZ() + 1); } + public static GridAlignedBB fromChunk(int sectionX, int sectionZ) { + int startX = sectionX << 4; + int startZ = sectionZ << 4; + return new GridAlignedBB(startX, + 0, + startZ, + startX + 16, + 256, + startZ + 16); + } + public static AxisAlignedBB toAABB(GridAlignedBB bb) { return new AxisAlignedBB(bb.minX, bb.minY, bb.minZ, bb.maxX, bb.maxY, bb.maxZ); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java index cada1ecad..5f9290974 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/LightVolume.java @@ -133,6 +133,15 @@ public class LightVolume { else if (type == LightType.SKY) copySky(world, changedVolume); } + public void notifyLightPacket(ILightReader world, int chunkX, int chunkZ) { + GridAlignedBB changedVolume = GridAlignedBB.fromChunk(chunkX, chunkZ); + if (!changedVolume.intersects(sampleVolume)) + return; + changedVolume.intersectAssign(sampleVolume); // compute the region contained by us that has dirty lighting data. + + copyLight(world, changedVolume); + } + /** * Completely (re)populate this volume with block and sky lighting data. * This is expensive and should be avoided. diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index e9d682678..6956226de 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -9,7 +9,8 @@ "CancelTileEntityRenderMixin", "LightUpdateMixin", "RenderHooksMixin", - "FogColorTrackerMixin" + "FogColorTrackerMixin", + "NetworkLightUpdateMixin" ], "injectors": { "defaultRequire": 1 From 36e81857a338b62cb68e3cd3a9cdfe2d9064b304 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 24 Feb 2021 16:57:26 -0800 Subject: [PATCH 028/124] Unmeddle the build script, but profiling is good. --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0d4a0c6eb..0bd3d4bb2 100644 --- a/build.gradle +++ b/build.gradle @@ -132,7 +132,7 @@ dependencies { //runtimeOnly fg.deobf("vazkii.arl:AutoRegLib:1.4-35.69") //runtimeOnly fg.deobf("vazkii.quark:Quark:r2.0-212.984") - //annotationProcessor 'org.spongepowered:mixin:0.8:processor' + annotationProcessor 'org.spongepowered:mixin:0.8:processor' } jar { From 46bbdc70c9bb9f61e1ba822660c8e38f66c6d2aa Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 25 Feb 2021 19:03:07 +0100 Subject: [PATCH 029/124] small command adjustments --- .../foundation/command/CloneCommand.java | 72 +++++++++++-------- .../foundation/command/CouplingCommand.java | 30 ++++++++ 2 files changed, 74 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java b/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java index 83bc8b4a8..d5a07c8fc 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CloneCommand.java @@ -37,7 +37,10 @@ public class CloneCommand { .then(Commands.argument("begin", BlockPosArgument.blockPos()) .then(Commands.argument("end", BlockPosArgument.blockPos()) .then(Commands.argument("destination", BlockPosArgument.blockPos()) - .executes(ctx -> doClone(ctx.getSource(), BlockPosArgument.getLoadedBlockPos(ctx, "begin"), BlockPosArgument.getLoadedBlockPos(ctx, "end"), BlockPosArgument.getLoadedBlockPos(ctx, "destination"))) + .then(Commands.literal("skipBlocks") + .executes(ctx -> doClone(ctx.getSource(), BlockPosArgument.getLoadedBlockPos(ctx, "begin"), BlockPosArgument.getLoadedBlockPos(ctx, "end"), BlockPosArgument.getLoadedBlockPos(ctx, "destination"), false)) + ) + .executes(ctx -> doClone(ctx.getSource(), BlockPosArgument.getLoadedBlockPos(ctx, "begin"), BlockPosArgument.getLoadedBlockPos(ctx, "end"), BlockPosArgument.getLoadedBlockPos(ctx, "destination"), true)) ) ) ) @@ -50,7 +53,7 @@ public class CloneCommand { } - private static int doClone(CommandSource source, BlockPos begin, BlockPos end, BlockPos destination) throws CommandSyntaxException { + private static int doClone(CommandSource source, BlockPos begin, BlockPos end, BlockPos destination, boolean cloneBlocks) throws CommandSyntaxException { MutableBoundingBox sourceArea = new MutableBoundingBox(begin, end); BlockPos destinationEnd = destination.add(sourceArea.getLength()); MutableBoundingBox destinationArea = new MutableBoundingBox(destination, destinationEnd); @@ -64,12 +67,47 @@ public class CloneCommand { if (!world.isAreaLoaded(begin, end) || !world.isAreaLoaded(destination, destinationEnd)) throw BlockPosArgument.POS_UNLOADED.create(); - List blocks = Lists.newArrayList(); - List tileBlocks = Lists.newArrayList(); BlockPos diffToTarget = new BlockPos(destinationArea.minX - sourceArea.minX, destinationArea.minY - sourceArea.minY, destinationArea.minZ - sourceArea.minZ); + int blockPastes = cloneBlocks ? cloneBlocks(sourceArea, world, diffToTarget) : 0; + int gluePastes = cloneGlue(sourceArea, world, diffToTarget); + + if (cloneBlocks) + source.sendFeedback(new StringTextComponent("Successfully cloned " + blockPastes + " Blocks"), true); + + source.sendFeedback(new StringTextComponent("Successfully applied glue " + gluePastes + " times"), true); + return blockPastes + gluePastes; + + } + + private static int cloneGlue(MutableBoundingBox sourceArea, ServerWorld world, BlockPos diffToTarget) { + int gluePastes = 0; + + List glue = world.getEntitiesWithinAABB(SuperGlueEntity.class, AxisAlignedBB.func_216363_a(sourceArea)); + List> newGlue = Lists.newArrayList(); + + for (SuperGlueEntity g : glue) { + BlockPos pos = g.getHangingPosition(); + Direction direction = g.getFacingDirection(); + newGlue.add(Pair.of(pos.add(diffToTarget), direction)); + } + + for (Pair p : newGlue) { + SuperGlueEntity g = new SuperGlueEntity(world, p.getFirst(), p.getSecond()); + if (g.onValidSurface()){ + world.addEntity(g); + gluePastes++; + } + } + return gluePastes; + } + + private static int cloneBlocks(MutableBoundingBox sourceArea, ServerWorld world, BlockPos diffToTarget) { + int blockPastes = 0; + + List blocks = Lists.newArrayList(); + List tileBlocks = Lists.newArrayList(); - //gather info for (int z = sourceArea.minZ; z <= sourceArea.maxZ; ++z) { for (int y = sourceArea.minY; y <= sourceArea.maxY; ++y) { for (int x = sourceArea.minX; x <= sourceArea.maxX; ++x) { @@ -88,16 +126,6 @@ public class CloneCommand { } } - List glue = world.getEntitiesWithinAABB(SuperGlueEntity.class, AxisAlignedBB.func_216363_a(sourceArea)); - List> newGlue = Lists.newArrayList(); - - for (SuperGlueEntity g : glue) { - BlockPos pos = g.getHangingPosition(); - Direction direction = g.getFacingDirection(); - newGlue.add(Pair.of(pos.add(diffToTarget), direction)); - } - - //paste List allBlocks = Lists.newArrayList(); allBlocks.addAll(blocks); allBlocks.addAll(tileBlocks); @@ -110,9 +138,6 @@ public class CloneCommand { world.setBlockState(info.pos, Blocks.BARRIER.getDefaultState(), 2); } - int blockPastes = 0; - int gluePastes = 0; - for (Template.BlockInfo info : allBlocks) { if (world.setBlockState(info.pos, info.state, 2)) blockPastes++; @@ -136,19 +161,10 @@ public class CloneCommand { world.notifyNeighbors(info.pos, info.state.getBlock()); } - for (Pair p : newGlue) { - SuperGlueEntity g = new SuperGlueEntity(world, p.getFirst(), p.getSecond()); - if (g.onValidSurface()){ - world.addEntity(g); - gluePastes++; - } - } world.getPendingBlockTicks().copyTicks(sourceArea, diffToTarget); - source.sendFeedback(new StringTextComponent("Successfully cloned " + blockPastes + " Blocks and applied Glue " + gluePastes + " times"), true); - return blockPastes + gluePastes; - + return blockPastes; } } diff --git a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java index 8e4512956..62cb360f1 100644 --- a/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/CouplingCommand.java @@ -1,7 +1,9 @@ package com.simibubi.create.foundation.command; +import com.google.common.collect.Lists; import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingHandler; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; @@ -16,12 +18,15 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.util.text.StringTextComponent; import net.minecraftforge.common.util.LazyOptional; +import java.util.ArrayList; +import java.util.Collection; import java.util.UUID; public class CouplingCommand { public static final SimpleCommandExceptionType ONLY_MINECARTS_ALLOWED = new SimpleCommandExceptionType(new StringTextComponent("Only Minecarts can be coupled")); public static final SimpleCommandExceptionType SAME_DIMENSION = new SimpleCommandExceptionType(new StringTextComponent("Minecarts have to be in the same Dimension")); + public static final DynamicCommandExceptionType TWO_CARTS = new DynamicCommandExceptionType(a -> new StringTextComponent("Your selector targeted " + a + " entities. You can only couple 2 Minecarts at a time.")); public static ArgumentBuilder register() { @@ -50,6 +55,31 @@ public class CouplingCommand { }) ) ) + .then(Commands.argument("carts", EntityArgument.entities()) + .executes(ctx -> { + Collection entities = EntityArgument.getEntities(ctx, "carts"); + if (entities.size() != 2) + throw TWO_CARTS.create(entities.size()); + + ArrayList eList = Lists.newArrayList(entities); + Entity cart1 = eList.get(0); + if (!(cart1 instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + Entity cart2 = eList.get(1); + if (!(cart2 instanceof AbstractMinecartEntity)) + throw ONLY_MINECARTS_ALLOWED.create(); + + if (!cart1.getEntityWorld().equals(cart2.getEntityWorld())) + throw SAME_DIMENSION.create(); + + Entity source = ctx.getSource().getEntity(); + + CouplingHandler.tryToCoupleCarts(source instanceof PlayerEntity ? (PlayerEntity) source : null, cart1.getEntityWorld(), cart1.getEntityId(), cart2.getEntityId()); + + return Command.SINGLE_SUCCESS; + }) + ) ) .then(Commands.literal("remove") .then(Commands.argument("cart1", EntityArgument.entity()) From 6dc4a18ed34e5f4c6a69318ee73634fb0e74ac8e Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 25 Feb 2021 17:16:22 -0800 Subject: [PATCH 030/124] Extra safety checks. --- .../instancing/InstancedTileRenderer.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 9c3c1ced0..524d36a91 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -2,7 +2,6 @@ package com.simibubi.create.foundation.render.backend.instancing; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nullable; @@ -10,14 +9,13 @@ import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.WorldAttached; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.world.ClientWorld; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; public abstract class InstancedTileRenderer

{ protected Map> instances = new HashMap<>(); @@ -42,6 +40,17 @@ public abstract class InstancedTileRenderer

{ } } + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { + render(layer, viewProjection, camX, camY, camZ, null); + } + + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

callback) { + for (RenderMaterial material : materials.values()) { + if (material.canRenderInLayer(layer)) + material.render(layer, viewProjection, camX, camY, camZ, callback); + } + } + @SuppressWarnings("unchecked") public > RenderMaterial getMaterial(MaterialType materialType) { return (RenderMaterial) materials.get(materialType); @@ -55,7 +64,7 @@ public abstract class InstancedTileRenderer

{ @SuppressWarnings("unchecked") @Nullable public TileEntityInstance getInstance(T tile, boolean create) { - if (!Backend.canUseInstancing()) return null; + if (!Backend.canUseInstancing() || isTileUnloaded(tile)) return null; TileEntityInstance instance = instances.get(tile); @@ -128,14 +137,17 @@ public abstract class InstancedTileRenderer

{ instances.clear(); } - public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { - render(layer, viewProjection, camX, camY, camZ, null); - } + public boolean isTileUnloaded(TileEntity tile) { + if (tile.isRemoved()) return true; - public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ, ShaderCallback

callback) { - for (RenderMaterial material : materials.values()) { - if (material.canRenderInLayer(layer)) - material.render(layer, viewProjection, camX, camY, camZ, callback); - } + World world = tile.getWorld(); + + if (world == null) return true; + + BlockPos pos = tile.getPos(); + + IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4); + + return existingChunk == null; } } 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 031/124] 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 8e5b5582f36868a51d3a893d33e96df3577bf515 Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Sat, 27 Feb 2021 17:08:35 +0100 Subject: [PATCH 032/124] Fluid Overlays and Comparator Compat -Add comparator compat to fluid tanks, spouts, and item drains. -Add goggle overlays to fluid tanks, spouts, item drains, and basins. -Update goggle item tooltip slightly. --- .../resources/assets/create/lang/en_us.json | 15 ++++ .../fluids/FluidFullnessOverlay.java | 73 ++++++++++++++++++ .../fluids/actors/ItemDrainBlock.java | 15 ++++ .../fluids/actors/ItemDrainTileEntity.java | 59 ++++++++++++++- .../fluids/actors/SpoutBlock.java | 16 ++++ .../fluids/actors/SpoutTileEntity.java | 57 +++++++++++++- .../fluids/tank/FluidTankBlock.java | 18 +++++ .../fluids/tank/FluidTankTileEntity.java | 60 ++++++++++++++- .../processing/BasinTileEntity.java | 75 +++++++++++++++++-- 9 files changed, 377 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 018ae8c5a..8676059a8 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -836,6 +836,15 @@ "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.overstressed": "Overstressed", "create.gui.stressometer.no_rotation": "No Rotation", + "create.gui.stores_fluid.title": "Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "Potion Effects", + "create.gui.stores_fluid.empty": "Empty", + "create.gui.input_tanks.title": "Input Tanks", + "create.gui.output_tanks.title": "Output Tanks", + "create.gui.tank.info_header": "Tank Information:", + "create.gui.spout.info_header": "Spout Information:", + "create.gui.drain.info_header": "Drain Information:", + "create.gui.basin.info_header": "Basin Information:", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.adjustable_crate.title": "Adjustable Crate", @@ -1064,6 +1073,10 @@ "create.tooltip.stressImpact.medium": "Moderate", "create.tooltip.stressImpact.high": "High", "create.tooltip.stressImpact.overstressed": "Overstressed", + "create.tooltip.fluidFullness.low": "Low", + "create.tooltip.fluidFullness.medium": "Moderate", + "create.tooltip.fluidFullness.high": "High", + "create.tooltip.fluidFullness.full": "Full", "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Small", "create.tooltip.capacityProvided.medium": "Medium", @@ -1446,6 +1459,8 @@ "item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.condition2": "When looking at gauge", "item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + "item.create.goggles.tooltip.condition3": "When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java new file mode 100644 index 000000000..a1604e4c6 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java @@ -0,0 +1,73 @@ +package com.simibubi.create.content.contraptions.fluids; + +import com.simibubi.create.AllFluids; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; +import com.simibubi.create.foundation.item.ItemDescription; +import com.simibubi.create.foundation.utility.Lang; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fluids.FluidStack; + + +//Currently only used for Tank/Drain/Spout/Basin goggle tooltips, as fullness-based replacement for the stress-based tooltips in IRotate +public enum FluidFullnessOverlay { + LOW, + MEDIUM, + HIGH, + FULL; + + public TextFormatting getAbsoluteColor() { + return this == LOW ? TextFormatting.YELLOW : this == MEDIUM ? TextFormatting.GOLD : TextFormatting.RED; + } + + public TextFormatting getRelativeColor() { + return this == LOW ? TextFormatting.GREEN : this == MEDIUM ? TextFormatting.YELLOW : this == HIGH ? TextFormatting.GOLD : TextFormatting.RED; + } + + public static FluidFullnessOverlay of(double fullnessPercent){ + if (fullnessPercent >= 1) return FluidFullnessOverlay.FULL; + else if (fullnessPercent > .75d) return FluidFullnessOverlay.HIGH; + else if (fullnessPercent > .5d) return FluidFullnessOverlay.MEDIUM; + else return FluidFullnessOverlay.LOW; + } + + public static String getFormattedFullnessText(double fullnessPercent){ + FluidFullnessOverlay fullnessLevel = of(fullnessPercent); + TextFormatting color = fullnessLevel.getRelativeColor(); + if (fullnessPercent == 0) + return TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) + + Lang.translate("gui.stores_fluid.empty"); + + String level = color + ItemDescription.makeProgressBar(3, Math.min(fullnessLevel.ordinal(), 2)); + level += Lang.translate("tooltip.fluidFullness."+Lang.asId(fullnessLevel.name())); + + level += String.format(" (%s%%) ", (int) (fullnessPercent * 100)); + + return level; + } + + public static String getFormattedCapacityText(int amount, int capacity){ + FluidFullnessOverlay fullnessLevel = of((double) amount / capacity); + TextFormatting color = fullnessLevel.getRelativeColor(); + + String mb = Lang.translate("generic.unit.millibuckets"); + String capacityString = color + "%s" + mb + TextFormatting.GRAY + " / " + TextFormatting.DARK_GRAY + "%s" + mb; + + if (amount == 0) + return TextFormatting.DARK_GRAY + IHaveGoggleInformation.format(capacity) + mb; + + return String.format(capacityString, IHaveGoggleInformation.format(amount), IHaveGoggleInformation.format(capacity)); + } + + public static String getFormattedFluidTypeText(FluidStack fluid, double fullnessPercent){ + FluidFullnessOverlay fullnessLevel = of(fullnessPercent); + TextFormatting color = fullnessLevel.getRelativeColor(); + + if (AllFluids.POTION.get().getFluid().isEquivalentTo(fluid.getFluid())) { + return color + PotionFluidHandler.getPotionName(fluid).getFormattedText(); + } else { + return color + fluid.getDisplayName().getFormattedText(); + } + } + } + diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java index 16f2a9470..2d12c3fc9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -99,4 +99,19 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE> itemHandlers; public ItemDrainTileEntity(TileEntityType tileEntityTypeIn) { @@ -90,6 +101,13 @@ public class ItemDrainTileEntity extends SmartTileEntity { @Override public void tick() { super.tick(); + + if (lastRedstoneLevel != getComparatorOutput()) { + lastRedstoneLevel = getComparatorOutput(); + if (world != null) + world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock()); + } + if (heldItem == null) { processingTicks = 0; return; @@ -278,4 +296,43 @@ public class ItemDrainTileEntity extends SmartTileEntity { return super.getCapability(cap, side); } + public int getComparatorOutput() { + ItemDrainTileEntity te = this; + double fillFraction = (double) te.internalTank.getPrimaryHandler().getFluidAmount() / te.internalTank.getPrimaryHandler().getCapacity(); + return MathHelper.floor(MathHelper.clamp(fillFraction * 14 + (fillFraction > 0 ? 1 : 0), 0, 15)); + } + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + ItemDrainTileEntity te = this; + + int fluidAmount = te.internalTank.getPrimaryHandler().getFluidAmount(); + int fluidCapacity = te.internalTank.getPrimaryHandler().getCapacity(); + double fillFraction = (double) fluidAmount / fluidCapacity; + FluidStack fluidType = te.internalTank.getPrimaryHandler().getFluid(); + + tooltip.add(spacing + Lang.translate("gui.drain.info_header")); + + if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) { + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle")); + + ArrayList potionTooltip = new ArrayList<>(); + PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1); + tooltip.addAll(2, potionTooltip.stream() + .map(c -> spacing + " " + c.getFormattedText()) + .collect(Collectors.toList())); + return true; + } + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title")); + + if (fluidAmount != 0) + tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction)); + + tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction)); + tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity)); + + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java index f7436a0a7..bb97ddac8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java @@ -11,6 +11,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; +import net.minecraft.world.World; public class SpoutBlock extends Block implements IWrenchable { @@ -34,4 +35,19 @@ public class SpoutBlock extends Block implements IWrenchable { return AllTileEntities.SPOUT.create(); } + @Override + public boolean hasComparatorInputOverride(BlockState state) { + return true; + } + + @Override + public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { + TileEntity te = worldIn.getTileEntity(pos); + if (te == null) + return 0; + if (te instanceof SpoutTileEntity) + return ((SpoutTileEntity) te).getComparatorOutput(); + return 0; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index 33c31cc95..e7ede91af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -5,8 +5,13 @@ import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProce import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import com.simibubi.create.AllFluids; +import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; import com.simibubi.create.content.contraptions.fluids.FluidFX; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -16,6 +21,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBe import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; +import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.item.ItemStack; @@ -26,7 +32,10 @@ import net.minecraft.potion.PotionUtils; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; @@ -34,13 +43,14 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -public class SpoutTileEntity extends SmartTileEntity { +public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInformation { public static final int FILLING_TIME = 20; protected BeltProcessingBehaviour beltProcessing; protected int processingTicks; protected boolean sendSplash; + protected int lastRedstoneLevel; SmartFluidTankBehaviour tank; @@ -168,6 +178,12 @@ public class SpoutTileEntity extends SmartTileEntity { if (processingTicks >= 8 && world.isRemote) spawnProcessingParticles(tank.getPrimaryTank() .getRenderedFluid()); + + if (lastRedstoneLevel != getComparatorOutput()) { + lastRedstoneLevel = getComparatorOutput(); + if (world != null) + world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock()); + } } protected void spawnProcessingParticles(FluidStack fluid) { @@ -190,4 +206,43 @@ public class SpoutTileEntity extends SmartTileEntity { } } + public int getComparatorOutput() { + SpoutTileEntity te = this; + double fillFraction = (double) te.getCurrentFluidInTank().getAmount() / te.tank.getPrimaryHandler().getCapacity(); + return MathHelper.floor(MathHelper.clamp(fillFraction * 14 + (fillFraction > 0 ? 1 : 0), 0, 15)); + } + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + SpoutTileEntity te = this; + + int fluidAmount = te.tank.getPrimaryHandler().getFluidAmount(); + int fluidCapacity = te.tank.getPrimaryHandler().getCapacity(); + double fillFraction = (double) fluidAmount / fluidCapacity; + FluidStack fluidType = te.tank.getPrimaryHandler().getFluid(); + + tooltip.add(spacing + Lang.translate("gui.spout.info_header")); + + if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) { + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle")); + + ArrayList potionTooltip = new ArrayList<>(); + PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1); + tooltip.addAll(2, potionTooltip.stream() + .map(c -> spacing + " " + c.getFormattedText()) + .collect(Collectors.toList())); + return true; + } + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title")); + + if (fluidAmount != 0) + tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction)); + + tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction)); + tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity)); + + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index 7a8346118..959272e27 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -310,4 +310,22 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE 0 ? 1 : 0), 0, 15)); + } + + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + FluidTankTileEntity controllerTE = getControllerTE(); + if (controllerTE == null) + return false; + int fluidAmount = controllerTE.getTankInventory().getFluidAmount(); + int fluidCapacity = controllerTE.getTankInventory().getCapacity(); + double fillFraction = controllerTE.getFillState(); + FluidStack fluidType = controllerTE.getTankInventory().getFluid(); + + tooltip.add(spacing + Lang.translate("gui.tank.info_header")); + + if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) { + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle")); + + ArrayList potionTooltip = new ArrayList<>(); + PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1); + tooltip.addAll(2, potionTooltip.stream() + .map(c -> spacing + " " + c.getFormattedText()) + .collect(Collectors.toList())); + return true; + } + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title")); + + if (fluidAmount != 0) + tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction)); + + tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction)); + tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity)); + + return true; + } + @Override protected void read(CompoundNBT compound, boolean clientPacket) { super.read(compound, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 60117276f..e1afa75c0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -9,11 +9,15 @@ import java.util.Random; import javax.annotation.Nonnull; +import com.simibubi.create.AllFluids; import com.simibubi.create.AllParticleTypes; import com.simibubi.create.AllTags; +import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; +import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; @@ -25,14 +29,8 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; -import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.Couple; -import com.simibubi.create.foundation.utility.IntAttached; -import com.simibubi.create.foundation.utility.Iterate; -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.NBTHelper; -import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -48,6 +46,7 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; @@ -63,7 +62,7 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.CombinedInvWrapper; -public class BasinTileEntity extends SmartTileEntity { +public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInformation { private boolean areFluidsMoving; LerpedFloat ingredientRotationSpeed; @@ -600,6 +599,66 @@ public class BasinTileEntity extends SmartTileEntity { return areFluidsMoving; } + @Override + public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { + + tooltip.add(spacing + Lang.translate("gui.basin.info_header")); + + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.input_tanks.title")); + + String mb = Lang.translate("generic.unit.millibuckets"); + + LazyOptional capability = this.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); + IFluidHandler tank = capability.orElse(null); + + if (tank == null) + return false; + + for (int i = 0; i < tank.getTanks(); i += 2) { + Couple fluids = Couple.create(tank.getFluidInTank(i), tank.getFluidInTank(i + 1)); + + if (i > 1) + tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.output_tanks.title")); + + if (fluids.getFirst().getAmount() == 0 && fluids.getSecond().getAmount() == 0) { + tooltip.add(spacing + " " + TextFormatting.DARK_GRAY + "2x0" + mb); + continue; + } + + for (FluidStack fluid : fluids) { + String fluidName; + + if (fluid.getAmount() == 0) { + tooltip.add(spacing + " " + TextFormatting.DARK_GRAY + IHaveGoggleInformation.format(0) + mb); + } else { + if (AllFluids.POTION.get().getFluid().isEquivalentTo(fluid.getFluid())) { + fluidName = PotionFluidHandler.getPotionName(fluid).getFormattedText(); + } else { + fluidName = fluid.getDisplayName().getFormattedText(); + } + double fillFraction = (double) fluid.getAmount() / (double) this.inputTank.getPrimaryHandler().getCapacity(); + if (fluidName.length() > 15) { + tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor() + + fluidName); + tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor() + + IHaveGoggleInformation.format(fluid.getAmount()) + mb); + continue; + } + + tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor() + + fluidName + " " + + IHaveGoggleInformation.format(fluid.getAmount()) + mb); + + } + } + + + + + } + return true; + } + class BasinValueBox extends ValueBoxTransform.Sided { @Override From 23d7d65bb26f787eb4750e5f37742b1e213c15fe Mon Sep 17 00:00:00 2001 From: _0Steven <42909981+SuicidalSteve@users.noreply.github.com> Date: Sat, 27 Feb 2021 17:24:49 +0100 Subject: [PATCH 033/124] ...Right, language datagen is a thing - Actually put the lang stuff in the right files, and generate the other localization files... --- src/generated/resources/.cache/cache | 30 ++-- .../assets/create/blockstates/fluid_pipe.json | 168 +++++++++--------- .../create/blockstates/radial_chassis.json | 48 ++--- .../resources/assets/create/lang/en_us.json | 4 +- .../assets/create/lang/unfinished/de_de.json | 17 +- .../assets/create/lang/unfinished/es_es.json | 17 +- .../assets/create/lang/unfinished/es_mx.json | 17 +- .../assets/create/lang/unfinished/fr_fr.json | 17 +- .../assets/create/lang/unfinished/it_it.json | 17 +- .../assets/create/lang/unfinished/ja_jp.json | 17 +- .../assets/create/lang/unfinished/ko_kr.json | 17 +- .../assets/create/lang/unfinished/nl_nl.json | 17 +- .../assets/create/lang/unfinished/pt_br.json | 17 +- .../assets/create/lang/unfinished/ru_ru.json | 17 +- .../assets/create/lang/unfinished/zh_cn.json | 17 +- .../assets/create/lang/unfinished/zh_tw.json | 17 +- .../assets/create/lang/default/messages.json | 15 ++ .../assets/create/lang/default/tooltips.json | 2 + 18 files changed, 334 insertions(+), 137 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 463f09ef7..1a3f42840 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 -48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json +cedc68a9c3ab47a94bd8200889316a708c25950a 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 -4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json +ab2a1bf8f37f1c64d00538867f4c3a97195bd3c4 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 -c562d23527d2f3ac9fa0be10c7fa1bc58f632abc assets/create/lang/en_us.json -8766f1728b3ba4542104e8f87c8b9d1f1741fdeb assets/create/lang/unfinished/de_de.json -3e1f0a8effb4b8541849d5b51576a7531219e914 assets/create/lang/unfinished/es_es.json -cee3455d04453c86d0709ccdc9d347f430edb08e assets/create/lang/unfinished/es_mx.json -1e9d2907c968ab5afb55d72fb934a7d7ed3407b5 assets/create/lang/unfinished/fr_fr.json -eefeacfbd97714d845b78f75cb003d2fb1e3c260 assets/create/lang/unfinished/it_it.json -677008605916984e2063dc6f5d8f7528f2b0b44a assets/create/lang/unfinished/ja_jp.json -397b88e9ad3500d78c08b27f6f11df8b094571fa assets/create/lang/unfinished/ko_kr.json -767605e14edabd5df33a2ef1afbdb84ddd804418 assets/create/lang/unfinished/nl_nl.json -8f0dcab1ffe40d31a1f5823e619648fb01127507 assets/create/lang/unfinished/pt_br.json -c4836701cc764a49529b923c8ab390f1b292e7c2 assets/create/lang/unfinished/ru_ru.json -a179807fb6a649bc9ce4214bbf5192931117bb3c assets/create/lang/unfinished/zh_cn.json -be64b2635e5599b43b4615e333a26d09cfa3baec assets/create/lang/unfinished/zh_tw.json +3c37fa4654a24869c15a12e01d60b5bf38ed260b assets/create/lang/en_us.json +72f2d5e2d235338091671ff89f1225c427174eba assets/create/lang/unfinished/de_de.json +2c4140f942ca2c799a899d8aaa2cbc2fdbca780e assets/create/lang/unfinished/es_es.json +c42b6dda6a1f90763d7ef82c5fbce962febeb8db assets/create/lang/unfinished/es_mx.json +ca09de2a4554a79b1ed4e25538dc441c9aed68e2 assets/create/lang/unfinished/fr_fr.json +b599e283914c9b07f8c4fd5f875af8438065148d assets/create/lang/unfinished/it_it.json +7482b319553c7ae226fcea8c8e4908ce3fc01e6b assets/create/lang/unfinished/ja_jp.json +36b2f77f5365f99734bbb1565a478a5bb86300a1 assets/create/lang/unfinished/ko_kr.json +4981e34cecbe98823ac39fd1743647218c88b679 assets/create/lang/unfinished/nl_nl.json +2202c60512efb9de3c53ef47af98c78d0f26f012 assets/create/lang/unfinished/pt_br.json +209f7d43d6f0ea161881eeb9aaae9b909c75f2a7 assets/create/lang/unfinished/ru_ru.json +b330bf998d525c025c0f44063963be3b99158156 assets/create/lang/unfinished/zh_cn.json +dfb0014541a6953406195b51286e4c69e192a336 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 80a25280c..d4179b0cb 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { + "north": "true", "down": "false", - "up": "true", "south": "false", - "north": "true" + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { + "north": "false", "down": "false", - "up": "true", "south": "true", - "north": "false" + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { + "north": "true", "down": "true", - "up": "false", "south": "false", - "north": "true" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { + "north": "false", "down": "true", - "up": "false", "south": "true", - "north": "false" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,10 +104,10 @@ }, { "when": { + "north": "false", "down": "true", - "up": "true", "south": "false", - "north": "false" + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -115,10 +115,10 @@ }, { "when": { + "north": "false", "down": "false", - "up": "true", "south": "false", - "north": "false" + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { + "north": "false", "down": "true", - "up": "false", "south": "false", - "north": "false" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { + "north": "true", "down": "false", - "up": "false", "south": "true", - "north": "true" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { + "north": "true", "down": "false", - "up": "false", "south": "false", - "north": "true" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { + "north": "false", "down": "false", - "up": "false", "south": "true", - "north": "false" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { + "north": "false", "down": "false", - "up": "false", "south": "false", - "north": "false" + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", - "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true", + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", - "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true", + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", - "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false", + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", - "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false", + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,21 +225,10 @@ }, { "when": { - "south": "true", - "west": "false", + "east": "false", "north": "true", - "east": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_y" - } - }, - { - "when": { "south": "true", - "west": "false", - "north": "false", - "east": "false" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +236,21 @@ }, { "when": { - "south": "false", - "west": "false", + "east": "false", + "north": "false", + "south": "true", + "west": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_y" + } + }, + { + "when": { + "east": "false", "north": "true", - "east": "false" + "south": "false", + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", - "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false", + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", - "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false", + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", - "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false", + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", - "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false", + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { + "east": "true", "down": "false", "up": "true", - "west": "false", - "east": "true" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { + "east": "false", "down": "false", "up": "true", - "west": "true", - "east": "false" + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { + "east": "true", "down": "true", "up": "false", - "west": "false", - "east": "true" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { + "east": "false", "down": "true", "up": "false", - "west": "true", - "east": "false" + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { + "east": "false", "down": "true", "up": "true", - "west": "false", - "east": "false" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { + "east": "false", "down": "false", "up": "true", - "west": "false", - "east": "false" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { + "east": "false", "down": "true", "up": "false", - "west": "false", - "east": "false" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { + "east": "true", "down": "false", "up": "false", - "west": "true", - "east": "true" + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { + "east": "true", "down": "false", "up": "false", - "west": "false", - "east": "true" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { + "east": "false", "down": "false", "up": "false", - "west": "true", - "east": "false" + "west": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { + "east": "false", "down": "false", "up": "false", - "west": "false", - "east": "false" + "west": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 2e2d16cf1..410cb13c7 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": { - "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 8676059a8..73b8a7182 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -836,6 +836,8 @@ "create.gui.stressometer.capacity": "Remaining Capacity", "create.gui.stressometer.overstressed": "Overstressed", "create.gui.stressometer.no_rotation": "No Rotation", + "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", + "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.stores_fluid.title": "Fluid Contained", "create.gui.stores_fluid.effectsTitle": "Potion Effects", "create.gui.stores_fluid.empty": "Empty", @@ -845,8 +847,6 @@ "create.gui.spout.info_header": "Spout Information:", "create.gui.drain.info_header": "Drain Information:", "create.gui.basin.info_header": "Basin Information:", - "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", - "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", "create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Storage Space", "create.gui.stockpile_switch.title": "Stockpile Switch", 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 7c7c5d275..755fde66b 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: 970", + "_": "Missing Localizations: 985", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "UNLOCALIZED: Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Lagerraum", "create.gui.stockpile_switch.title": "Vorratssensor", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", "create.tooltip.stressImpact.high": "UNLOCALIZED: High", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "UNLOCALIZED: Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", 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 eda73db1d..ec6906b05 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: 12", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "Sin rotación", "create.gui.contraptions.not_fast_enough": "Parece que este %1$s no está girando con _suficiente_ velocidad_.", "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Caja ajustable", "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", "create.gui.stockpile_switch.title": "Interruptor de acopio", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "Moderado", "create.tooltip.stressImpact.high": "Alto", "create.tooltip.stressImpact.overstressed": "Sobrecargado", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Capacidad de estrés: %1$s", "create.tooltip.capacityProvided.low": "Pequeña", "create.tooltip.capacityProvided.medium": "Media", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores de color_ correspondientes al _Nivel de velocidad_ de un componente cinético colocado, así como el _Impacto de estrés_ y la _Capacidad_ de los componentes individuales.", "item.create.goggles.tooltip.condition2": "Al mirar el medidor", "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre _Velocidad_ o _Estrés_ de la red a la que está conectado el medidor", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "LLAVE INGLESA", "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artilugios cinéticos. Se puede utilizar para _Rotar_, _Desmantelar_ y para _Configurar_ componentes", 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 dcf01e843..84997734d 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: 900", + "_": "Missing Localizations: 915", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "UNLOCALIZED: Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "UNLOCALIZED: Storage Space", "create.gui.stockpile_switch.title": "UNLOCALIZED: Stockpile Switch", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", "create.tooltip.stressImpact.high": "UNLOCALIZED: High", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "Muestra _indicadores_ _con_ _colores_ correspondientes al _Nivel_ _de_ _Velocidad_ de un componente cinético colocado, así como _Impacto_ _de_ _Estrés_ y _Capacidad_ de los componentes individuales.", "item.create.goggles.tooltip.condition2": "Al mirar el medidor", "item.create.goggles.tooltip.behaviour2": "Muestra información detallada sobre la _velocidad_ o el _estrés_ de la red a la que está conectado el medidor.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip.summary": "Una herramienta útil para trabajar en artefactos cinéticos. Se puede utilizar para _Rotar,_ _Desmantelar_ y _Configurar_ componentes.", 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 4b55b1452..f995e8539 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: 682", + "_": "Missing Localizations: 697", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "Pas de rotation", "create.gui.contraptions.not_fast_enough": "Il semblerais que ce.t.te %1$s ne tourne _pas_ à la _vitesse_ _suffisante_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Caisse réglable", "create.gui.adjustable_crate.storageSpace": "Espace de stockage", "create.gui.stockpile_switch.title": "Commutateur de stockage", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "Modéré", "create.tooltip.stressImpact.high": "Elevé", "create.tooltip.stressImpact.overstressed": "Surmené", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Capacité de stress: %1$s", "create.tooltip.capacityProvided.low": "Petite", "create.tooltip.capacityProvided.medium": "Moyenne", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "Affiche des _indicateurs_ _colorés_ correspondants au _niveau_ _de_ _vitesse_ d'un composant cinétique placé ainsi que _l'impact_ du _stress_ et la _capacité_ des composants individuels.", "item.create.goggles.tooltip.condition2": "Quand vision portée sur une jauge", "item.create.goggles.tooltip.behaviour2": "Affiche des informations détaillées sur la _vitesse_ ou le _stress_ du réseau auquel la jauge est connectée.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "CLÉ", "item.create.wrench.tooltip.summary": "Un outil utile pour travailler sur les engins cinétiques. Peut être utilisé pour _tourner_, _démonter_ et _configurer_ les composants.", 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 26691dd55..0969a4ee6 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: 17", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "Nessuna rotazione", "create.gui.contraptions.not_fast_enough": "Sembra che questo %1$s _non_ stia girando con una _velocità_ _sufficiente_.", "create.gui.contraptions.network_overstressed": "Sembra che questo marchingegno sia _sovraccarico_. Aggiungi più fonti o _rallenta_ i componenti con un forte _impatto_ _di_ _stress_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Baule regolabile", "create.gui.adjustable_crate.storageSpace": "Spazio di immagazzinamento", "create.gui.stockpile_switch.title": "Interruttore accumulatore", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "Moderato", "create.tooltip.stressImpact.high": "Alto", "create.tooltip.stressImpact.overstressed": "Sovrastressato", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Capacità dello stress: %1$s", "create.tooltip.capacityProvided.low": "Piccola", "create.tooltip.capacityProvided.medium": "Media", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "Mostra gli _indicatori_ _colorati_ corrispondenti al _livello_ _di_ _velocità_ di un componente cinetico posizionato, nonché all'_impatto_ _dello_ _stress_ e la capacità dei singoli componenti.", "item.create.goggles.tooltip.condition2": "Quando si guarda il calibro", "item.create.goggles.tooltip.behaviour2": "Mostra informazioni dettagliate sulla _velocità_ o lo _stress_ della rete a cui è collegato il misuratore.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "CHIAVE INGLESE", "item.create.wrench.tooltip.summary": "Uno strumento utile per lavorare su congegni cinetici. Può essere usato per _ruotare_, _smontare_ e _configurare_ i componenti.", 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 944c6577c..19dad246e 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: 39", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "回転なし", "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械の速度を_下げて_ください。", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "可変クレート", "create.gui.adjustable_crate.storageSpace": "収納スペース", "create.gui.stockpile_switch.title": "在庫スイッチ", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "超過応力", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "応力の容量: %1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "設置された機械の_速度レベル_および、_機械_の_応力の影響_と_容量_を_色付きのインジケーター_で表示します。", "item.create.goggles.tooltip.condition2": "計器を見たとき", "item.create.goggles.tooltip.behaviour2": "計器が接続されているネットワークの_速度_または_応力_に関する詳細情報を表示します。", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "レンチ", "item.create.wrench.tooltip.summary": "動的からくりに取り組むための便利なツール。コンポーネントの_回転_、_解体_、_設定_に使用できます。", 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 a85e949d8..e23ad6d39 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: 71", + "_": "Missing Localizations: 86", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "회전없음", "create.gui.contraptions.not_fast_enough": "이 %1$s은(는) 작동하기에 _회전 속도_가 _부족합니다_", "create.gui.contraptions.network_overstressed": "_과부하!_ _높은 피로도_ _용량_을 가진 발전기를 추가로 설치하거나 _장치 속도_를 _늦추세요_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "가변 창고 ", "create.gui.adjustable_crate.storageSpace": "저장 공간", "create.gui.stockpile_switch.title": "수량 스위치", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "보통", "create.tooltip.stressImpact.high": "높음", "create.tooltip.stressImpact.overstressed": "과부하됨", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "피로도 용량: %1$s", "create.tooltip.capacityProvided.low": "적음", "create.tooltip.capacityProvided.medium": "보통", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "해당 장치의 _속도_, _피로도_, _용량_을 레벨에 따라 에 따라 색상 UI를 보여줍니다.", "item.create.goggles.tooltip.condition2": "계측기를 바라볼 때", "item.create.goggles.tooltip.behaviour2": "계측기가 연결된 네트워크의 _속도_나 _스트레스_의 자세한 정보를 보여줍니다.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip.summary": "장치 구성에 유용한 도구입니다. 장치를 _회전_, _설정_, _해체_하는 데 쓰입니다.", 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 81bdb6aec..5cfefc828 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: 1169", + "_": "Missing Localizations: 1184", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "FlexKrat", "create.gui.adjustable_crate.storageSpace": "Opslagruimte", "create.gui.stockpile_switch.title": "Voorraad Schakelaar", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "Gemiddeld", "create.tooltip.stressImpact.high": "Hoog", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Klein", "create.tooltip.capacityProvided.medium": "Gemiddeld", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "Laat _gekleurde_ _indicaties_ zien die corresponderen met de _Snelheid_ van een geplaatst kinetisch onderdeel.", "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", 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 05dab7dd4..63acab574 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: 1235", + "_": "Missing Localizations: 1250", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "adjustable_crate", "create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento", "create.gui.stockpile_switch.title": "Disjuntor de Armazenamento", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", "create.tooltip.stressImpact.high": "UNLOCALIZED: High", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "UNLOCALIZED: Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.condition2": "UNLOCALIZED: When looking at gauge", "item.create.goggles.tooltip.behaviour2": "UNLOCALIZED: Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "UNLOCALIZED: WRENCH", "item.create.wrench.tooltip.summary": "UNLOCALIZED: A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", 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 11847d2f5..e18e740a9 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: 21", + "_": "Missing Localizations: 36", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "Нет вращения", "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с_достаточной_ _скоростью_.", "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _замедлите_ _скорость_ компонентов с высоким _влиянием_ на _момент_.", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Регулируемый ящик", "create.gui.adjustable_crate.storageSpace": "Ёмкость", "create.gui.stockpile_switch.title": "Настраиваемый компаратор", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "Средний", "create.tooltip.stressImpact.high": "Высокий", "create.tooltip.stressImpact.overstressed": "Перегрузка", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Ёмкостный крутящий момент: %1$s", "create.tooltip.capacityProvided.low": "Маленький", "create.tooltip.capacityProvided.medium": "Средний", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "Показывает _цветные_ _индикаторы_, соответствующие _уровню_ _скорости_ размещённого кинетического компонента, а также воздействию момента и мощности отдельных компонентов.", "item.create.goggles.tooltip.condition2": "При взгляде на датчик", "item.create.goggles.tooltip.behaviour2": "Показывает подробную информацию о скорости или моменте сети, к которой подключён датчик.", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", 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 f43795167..1fd05123d 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: 19", + "_": "Missing Localizations: 34", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "无旋转", "create.gui.contraptions.not_fast_enough": "显然%1$s没有达到足够的工作转速。", "create.gui.contraptions.network_overstressed": "显然装置过载,减速网络中的高应力消耗装置或者添加更多的应力发生装置", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "板条箱", "create.gui.adjustable_crate.storageSpace": "储存空间", "create.gui.stockpile_switch.title": "储存开关", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "过载", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "应力量:%1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "根据对应动力组件的_转速等级_,显示它的_颜色指示器_,也会显示这个组件的_应力影响_以及_应力量_。", "item.create.goggles.tooltip.condition2": "当看向仪表时", "item.create.goggles.tooltip.behaviour2": "将会显示与仪表相连的网络的_转速_、_应力_等详细信息。", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "扳手", "item.create.wrench.tooltip.summary": "操控动力组件的使用工具。可用于_旋转_,_拆除_以及_配置_组件。", 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 525b6b7e0..e5ec1a2c3 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: 24", + "_": "Missing Localizations: 39", "_": "->------------------------] Game Elements [------------------------<-", @@ -839,6 +839,15 @@ "create.gui.stressometer.no_rotation": "無旋轉", "create.gui.contraptions.not_fast_enough": "看起來%1$s 沒有達到足夠的工作轉速。", "create.gui.contraptions.network_overstressed": "裝置似乎過載,減少高動能消耗的裝置或者增加更多更多動能", + "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", + "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", + "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", + "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", + "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", + "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", + "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", + "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "板條箱", "create.gui.adjustable_crate.storageSpace": "儲存空間", "create.gui.stockpile_switch.title": "儲存開關", @@ -1065,6 +1074,10 @@ "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "過載", + "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", + "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", + "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", + "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "動能生產量:%1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", @@ -1447,6 +1460,8 @@ "item.create.goggles.tooltip.behaviour1": "將會展示該機械元件的_速度_、_動能_等數值", "item.create.goggles.tooltip.condition2": "當裝備後看向儀表時", "item.create.goggles.tooltip.behaviour2": "將會展示該儀表所連接網路的_速度_、_動能_等數值。", + "item.create.goggles.tooltip.condition3": "UNLOCALIZED: When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "UNLOCALIZED: Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "板手", "item.create.wrench.tooltip.summary": "一種常用的工具,能夠調整_動能_的_方向_、_配置_等。", diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index c4dbf9458..22a2e1cf6 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -191,6 +191,16 @@ "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", + "create.gui.stores_fluid.title": "Fluid Contained", + "create.gui.stores_fluid.effectsTitle": "Potion Effects", + "create.gui.stores_fluid.empty": "Empty", + "create.gui.input_tanks.title": "Input Tanks", + "create.gui.output_tanks.title": "Output Tanks", + "create.gui.tank.info_header": "Tank Information:", + "create.gui.spout.info_header": "Spout Information:", + "create.gui.drain.info_header": "Drain Information:", + "create.gui.basin.info_header": "Basin Information:", + "create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Storage Space", @@ -428,6 +438,11 @@ "create.tooltip.stressImpact.high": "High", "create.tooltip.stressImpact.overstressed": "Overstressed", + "create.tooltip.fluidFullness.low": "Low", + "create.tooltip.fluidFullness.medium": "Moderate", + "create.tooltip.fluidFullness.high": "High", + "create.tooltip.fluidFullness.full": "Full", + "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Small", "create.tooltip.capacityProvided.medium": "Medium", diff --git a/src/main/resources/assets/create/lang/default/tooltips.json b/src/main/resources/assets/create/lang/default/tooltips.json index b4baad170..b674155b4 100644 --- a/src/main/resources/assets/create/lang/default/tooltips.json +++ b/src/main/resources/assets/create/lang/default/tooltips.json @@ -301,6 +301,8 @@ "item.create.goggles.tooltip.behaviour1": "Shows _colored indicators_ corresponding to the _Speed Level_ of a placed kinetic component as well as _Stress Impact_ and _Capacity_ of individual components.", "item.create.goggles.tooltip.condition2": "When looking at gauge", "item.create.goggles.tooltip.behaviour2": "Shows detailed information about _Speed_ or _Stress_ of the network to which the gauge is connected.", + "item.create.goggles.tooltip.condition3": "When looking at fluid containers", + "item.create.goggles.tooltip.behaviour3": "Shows detailed information about the _Capacity_ of the block and any _Fluids_ stored within.", "item.create.wrench.tooltip": "WRENCH", "item.create.wrench.tooltip.summary": "A useful tool for working on kinetic contraptions. Can be used to _Rotate_, _Dismantle_ and to _Configure_ components.", 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 034/124] 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 3a2771c5c0823fdd53cb972c638b7933a6c8a21d Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 27 Feb 2021 18:24:48 -0800 Subject: [PATCH 035/124] Fix issue restricting the maximum size of contraptions. --- .../structureMovement/Contraption.java | 8 +- .../foundation/utility/UniqueLinkedList.java | 89 +++++++++++++++++++ 2 files changed, 91 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java 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 fb5c044d4..09fbc01f4 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 @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; +import com.simibubi.create.foundation.utility.*; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -53,11 +54,6 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.render.backend.light.EmptyLighter; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.NBTProcessors; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.AbstractButtonBlock; @@ -178,7 +174,7 @@ public abstract class Contraption { public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) throws AssemblyException { initialPassengers.clear(); - Queue frontier = new LinkedList<>(); + Queue frontier = new UniqueLinkedList<>(); Set visited = new HashSet<>(); anchor = pos; diff --git a/src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java b/src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java new file mode 100644 index 000000000..d30c3badb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/UniqueLinkedList.java @@ -0,0 +1,89 @@ +package com.simibubi.create.foundation.utility; + +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +public class UniqueLinkedList extends LinkedList { + private final HashSet contained = new HashSet<>(); + + @Override + public boolean contains(Object o) { + return contained.contains(o); + } + + @Override + public E poll() { + E e = super.poll(); + contained.remove(e); + return e; + } + + @Override + public boolean add(E e) { + if (contained.add(e)) return super.add(e); + else return false; + } + + @Override + public void add(int index, E element) { + if (contained.add(element)) super.add(index, element); + } + + @Override + public void addFirst(E e) { + if (contained.add(e)) super.addFirst(e); + } + + @Override + public void addLast(E e) { + if (contained.add(e)) super.addLast(e); + } + + @Override + public boolean addAll(Collection c) { + List filtered = c.stream().filter(it -> !contained.contains(it)).collect(Collectors.toList()); + return super.addAll(filtered); + } + + @Override + public boolean addAll(int index, Collection c) { + List filtered = c.stream().filter(it -> !contained.contains(it)).collect(Collectors.toList()); + return super.addAll(index, filtered); + } + + @Override + public boolean remove(Object o) { + contained.remove(o); + return super.remove(o); + } + + @Override + public E remove(int index) { + E e = super.remove(index); + contained.remove(e); + return e; + } + + @Override + public E removeFirst() { + E e = super.removeFirst(); + contained.remove(e); + return e; + } + + @Override + public E removeLast() { + E e = super.removeLast(); + contained.remove(e); + return e; + } + + @Override + public void clear() { + super.clear(); + contained.clear(); + } +} From 884f19d518a682617e26bea15e9f1fc7e3462b27 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 27 Feb 2021 18:29:35 -0800 Subject: [PATCH 036/124] Fix issue when rendering very large contraptions. --- .../create/foundation/render/backend/BufferedModel.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java index 79e4e4d2f..400d1d2cb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java @@ -50,14 +50,14 @@ public abstract class BufferedModel extends TemplateBuffer { protected final GlBuffer createEBO() { GlBuffer ebo = new GlBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); - int indicesSize = vertexCount * GlPrimitiveType.USHORT.getSize(); + int indicesSize = vertexCount * GlPrimitiveType.UINT.getSize(); ebo.bind(); GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); ebo.map(indicesSize, indices -> { for (int i = 0; i < vertexCount; i++) { - indices.putShort((short) i); + indices.putInt(i); } }); @@ -91,7 +91,7 @@ public abstract class BufferedModel extends TemplateBuffer { ebo.bind(); setupAttributes(); - GL20.glDrawElements(GL20.GL_QUADS, vertexCount, GlPrimitiveType.USHORT.getGlConstant(), 0); + GL20.glDrawElements(GL20.GL_QUADS, vertexCount, GlPrimitiveType.UINT.getGlConstant(), 0); int numAttributes = getTotalShaderAttributeCount(); for (int i = 0; i <= numAttributes; i++) { From 55f1b538b571a1d6b776224b9a74bab17807d9ac Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 27 Feb 2021 21:35:45 -0800 Subject: [PATCH 037/124] Only contraptions use EBOs now. Tight light bounds for bearing contraptions. --- .../bearing/BearingLighter.java | 54 ++++++++++++------ .../render/ContraptionModel.java | 55 +++++++++++++++++++ .../render/backend/BufferedModel.java | 46 ++-------------- .../render/backend/gl/GlPrimitiveType.java | 24 ++++---- 4 files changed, 110 insertions(+), 69 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index f2b3e5eec..ef4ab3bf4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -19,25 +19,13 @@ public class BearingLighter extends ContraptionLighter { Set blocks = contraption.getBlocks().keySet(); Direction orientation = contraption.facing; - - float maxDistanceSq = -1; - for (BlockPos pos : blocks) { - float x = pos.getX(); - float y = pos.getY(); - float z = pos.getZ(); - - float distSq = x * x + y * y + z * z; - - if (distSq > maxDistanceSq) maxDistanceSq = distSq; - } - - int radius = (int) (Math.ceil(Math.sqrt(maxDistanceSq))); - - GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius); - GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(contraption.bounds); - Direction.Axis axis = orientation.getAxis(); + int radius = (int) (Math.ceil(Math.sqrt(getRadius(blocks, axis)))); + + GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius); + + GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(contraption.bounds); if (axis == Direction.Axis.X) { betterBounds.maxX = contraptionBounds.maxX; betterBounds.minX = contraptionBounds.minX; @@ -52,4 +40,36 @@ public class BearingLighter extends ContraptionLighter { betterBounds.translate(contraption.anchor); return betterBounds; } + + private static float getRadius(Set blocks, Direction.Axis axis) { + switch (axis) { + case X: + return getMaxDistSqr(blocks, BlockPos::getY, BlockPos::getZ); + case Y: + return getMaxDistSqr(blocks, BlockPos::getX, BlockPos::getZ); + case Z: + return getMaxDistSqr(blocks, BlockPos::getX, BlockPos::getY); + } + + throw new IllegalStateException("Impossible axis"); + } + + private static float getMaxDistSqr(Set blocks, Coordinate one, Coordinate other) { + float maxDistSq = -1; + for (BlockPos pos : blocks) { + float a = one.get(pos); + float b = other.get(pos); + + float distSq = a * a + b * b; + + + if (distSq > maxDistSq) maxDistSq = distSq; + } + + return maxDistSq; + } + + private interface Coordinate { + float get(BlockPos from); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java index c5bb45e7b..27d097aeb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionModel.java @@ -3,20 +3,69 @@ package com.simibubi.create.content.contraptions.components.structureMovement.re import java.nio.ByteBuffer; import com.simibubi.create.foundation.render.backend.BufferedModel; +import com.simibubi.create.foundation.render.backend.gl.GlBuffer; +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.LightTexture; +import org.lwjgl.opengl.GL15; +import org.lwjgl.opengl.GL20; public class ContraptionModel extends BufferedModel { public static final VertexFormat FORMAT = VertexFormat.builder() .addAttributes(ContraptionVertexAttributes.class) .build(); + protected GlPrimitiveType eboIndexType; + protected GlBuffer ebo; + public ContraptionModel(BufferBuilder buf) { super(buf); } + @Override + protected void init() { + super.init(); + + createEBO(); + } + + @Override + protected void doRender() { + modelVBO.bind(); + ebo.bind(); + + setupAttributes(); + GL20.glDrawElements(GL20.GL_QUADS, vertexCount, eboIndexType.getGlConstant(), 0); + + int numAttributes = getTotalShaderAttributeCount(); + for (int i = 0; i <= numAttributes; i++) { + GL20.glDisableVertexAttribArray(i); + } + + ebo.unbind(); + modelVBO.unbind(); + } + + protected final void createEBO() { + ebo = new GlBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); + eboIndexType = GlPrimitiveType.UINT; // TODO: choose this based on the number of vertices + + int indicesSize = vertexCount * eboIndexType.getSize(); + + ebo.bind(); + + GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); + ebo.map(indicesSize, indices -> { + for (int i = 0; i < vertexCount; i++) { + indices.putInt(i); + } + }); + + ebo.unbind(); + } + @Override protected void copyVertex(ByteBuffer to, int vertex) { to.putFloat(getX(template, vertex)); @@ -48,4 +97,10 @@ public class ContraptionModel extends BufferedModel { protected VertexFormat getModelFormat() { return FORMAT; } + + @Override + protected void deleteInternal() { + super.deleteInternal(); + ebo.delete(); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java index 400d1d2cb..1050da53c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/BufferedModel.java @@ -14,11 +14,10 @@ import net.minecraft.client.renderer.BufferBuilder; public abstract class BufferedModel extends TemplateBuffer { - protected GlBuffer ebo; protected GlBuffer modelVBO; protected boolean removed; - public BufferedModel(BufferBuilder buf) { + protected BufferedModel(BufferBuilder buf) { super(buf); if (vertexCount > 0) init(); } @@ -28,8 +27,6 @@ public abstract class BufferedModel extends TemplateBuffer { modelVBO = new GlBuffer(GL20.GL_ARRAY_BUFFER); modelVBO.with(vbo -> initModel()); - - ebo = createEBO(); } protected void initModel() { @@ -47,25 +44,6 @@ public abstract class BufferedModel extends TemplateBuffer { }); } - protected final GlBuffer createEBO() { - GlBuffer ebo = new GlBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER); - - int indicesSize = vertexCount * GlPrimitiveType.UINT.getSize(); - - ebo.bind(); - - GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, indicesSize, GL15.GL_STATIC_DRAW); - ebo.map(indicesSize, indices -> { - for (int i = 0; i < vertexCount; i++) { - indices.putInt(i); - } - }); - - ebo.unbind(); - - return ebo; - } - protected abstract void copyVertex(ByteBuffer to, int index); protected abstract VertexFormat getModelFormat(); @@ -75,7 +53,7 @@ public abstract class BufferedModel extends TemplateBuffer { } /** - * Renders this model, checking first if it should actually be rendered. + * Renders this model, checking first if there is anything to render. */ public final void render() { if (vertexCount == 0 || removed) return; @@ -84,23 +62,9 @@ public abstract class BufferedModel extends TemplateBuffer { } /** - * Override this. + * Set up any state and make the draw calls. */ - protected void doRender() { - modelVBO.bind(); - ebo.bind(); - - setupAttributes(); - GL20.glDrawElements(GL20.GL_QUADS, vertexCount, GlPrimitiveType.UINT.getGlConstant(), 0); - - int numAttributes = getTotalShaderAttributeCount(); - for (int i = 0; i <= numAttributes; i++) { - GL20.glDisableVertexAttribArray(i); - } - - ebo.unbind(); - modelVBO.unbind(); - } + protected abstract void doRender(); protected void setupAttributes() { int numAttributes = getTotalShaderAttributeCount(); @@ -111,7 +75,7 @@ public abstract class BufferedModel extends TemplateBuffer { getModelFormat().vertexAttribPointers(0); } - public void delete() { + public final void delete() { removed = true; if (vertexCount > 0) { RenderWork.enqueue(this::deleteInternal); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java index 5e069fabf..c82b02a00 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlPrimitiveType.java @@ -2,25 +2,27 @@ package com.simibubi.create.foundation.render.backend.gl; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; @OnlyIn(Dist.CLIENT) public enum GlPrimitiveType { - FLOAT(4, "float", 5126), - UBYTE(1, "ubyte", 5121), - BYTE(1, "byte", 5120), - USHORT(2, "ushort", 5123), - SHORT(2, "short", 5122), - UINT(4, "uint", 5125), - INT(4, "int", 5124); + FLOAT(4, "float", GL11.GL_FLOAT), + UBYTE(1, "ubyte", GL11.GL_UNSIGNED_BYTE), + BYTE(1, "byte", GL11.GL_BYTE), + USHORT(2, "ushort", GL11.GL_UNSIGNED_SHORT), + SHORT(2, "short", GL11.GL_SHORT), + UINT(4, "uint", GL11.GL_UNSIGNED_INT), + INT(4, "int", GL11.GL_INT); private final int size; private final String displayName; private final int glConstant; - GlPrimitiveType(int p_i46095_3_, String p_i46095_4_, int p_i46095_5_) { - this.size = p_i46095_3_; - this.displayName = p_i46095_4_; - this.glConstant = p_i46095_5_; + GlPrimitiveType(int bytes, String name, int glEnum) { + this.size = bytes; + this.displayName = name; + this.glConstant = glEnum; } public int getSize() { 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 038/124] 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 1e28bc998afc656d86a82c984d33c84152768125 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Mon, 1 Mar 2021 10:37:49 +0100 Subject: [PATCH 039/124] Make contraptions not take that stupid amount of cpu time when in water --- src/generated/resources/.cache/cache | 4 +- .../assets/create/blockstates/fluid_pipe.json | 154 +++++++++--------- .../create/blockstates/radial_chassis.json | 72 ++++---- .../com/simibubi/create/AllEntityTypes.java | 12 +- .../AbstractContraptionEntity.java | 21 +++ .../processing/ProcessingInventory.java | 2 + .../foundation/advancement/AllTriggers.java | 6 +- .../resources/META-INF/accesstransformer.cfg | 4 +- 8 files changed, 152 insertions(+), 123 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 463f09ef7..f0ea2779e 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 -48086bf71a824faf14841b698050cc8544b09a9b assets/create/blockstates/fluid_pipe.json +3d97226b5e8d8f70ed08e45e78db1faf78d5e28b 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 -4439fc83a8c7370ab44b211a3fd48abde20a4728 assets/create/blockstates/radial_chassis.json +8d7e653bfd9846e684a0d3725595714a19201017 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 diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index 80a25280c..a4cffcde7 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -61,9 +61,9 @@ { "when": { "down": "false", + "north": "true", "up": "true", - "south": "false", - "north": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -72,9 +72,9 @@ { "when": { "down": "false", + "north": "false", "up": "true", - "south": "true", - "north": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -83,9 +83,9 @@ { "when": { "down": "true", + "north": "true", "up": "false", - "south": "false", - "north": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -94,9 +94,9 @@ { "when": { "down": "true", + "north": "false", "up": "false", - "south": "true", - "north": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -105,9 +105,9 @@ { "when": { "down": "true", + "north": "false", "up": "true", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -116,9 +116,9 @@ { "when": { "down": "false", + "north": "false", "up": "true", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -127,9 +127,9 @@ { "when": { "down": "true", + "north": "false", "up": "false", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -138,9 +138,9 @@ { "when": { "down": "false", + "north": "true", "up": "false", - "south": "true", - "north": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -149,9 +149,9 @@ { "when": { "down": "false", + "north": "true", "up": "false", - "south": "false", - "north": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -160,9 +160,9 @@ { "when": { "down": "false", + "north": "false", "up": "false", - "south": "true", - "north": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -171,9 +171,9 @@ { "when": { "down": "false", + "north": "false", "up": "false", - "south": "false", - "north": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "south": "true", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "true", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { - "south": "true", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "true", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "south": "false", "west": "true", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "true", "north": "false", - "east": "true" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "south": "false", "west": "false", + "east": "false", "north": "false", - "east": "false" + "south": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "down": "false", - "up": "true", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "down": "false", - "up": "true", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "down": "true", - "up": "false", "west": "false", - "east": "true" + "down": "true", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "down": "true", - "up": "false", "west": "true", - "east": "false" + "down": "true", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { + "west": "false", "down": "true", - "up": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { + "west": "false", "down": "false", - "up": "true", - "west": "false", - "east": "false" + "east": "false", + "up": "true" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { + "west": "false", "down": "true", - "up": "false", - "west": "false", - "east": "false" + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "true", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "false", - "east": "true" + "down": "false", + "east": "true", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "true", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "down": "false", - "up": "false", "west": "false", - "east": "false" + "down": "false", + "east": "false", + "up": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 2e2d16cf1..9d00ea8b1 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": { - "axis": "x", - "sticky_south": "true" + "sticky_south": "true", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -39,8 +39,8 @@ }, { "when": { - "axis": "y", - "sticky_south": "true" + "sticky_south": "true", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y_sticky" @@ -48,8 +48,8 @@ }, { "when": { - "axis": "z", - "sticky_south": "true" + "sticky_south": "true", + "axis": "z" }, "apply": { "model": "create:block/radial_chassis_side_x_sticky", @@ -59,8 +59,8 @@ }, { "when": { - "axis": "x", - "sticky_south": "false" + "sticky_south": "false", + "axis": "x" }, "apply": { "model": "create:block/radial_chassis_side_x", @@ -69,8 +69,8 @@ }, { "when": { - "axis": "y", - "sticky_south": "false" + "sticky_south": "false", + "axis": "y" }, "apply": { "model": "create:block/radial_chassis_side_y" @@ -78,8 +78,8 @@ }, { "when": { - "axis": "z", - "sticky_south": "false" + "sticky_south": "false", + "axis": "z" }, "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", @@ -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/main/java/com/simibubi/create/AllEntityTypes.java b/src/main/java/com/simibubi/create/AllEntityTypes.java index d811fba0e..c92797f23 100644 --- a/src/main/java/com/simibubi/create/AllEntityTypes.java +++ b/src/main/java/com/simibubi/create/AllEntityTypes.java @@ -31,9 +31,9 @@ public class AllEntityTypes { contraption("gantry_contraption", GantryContraptionEntity::new, 10, 40, false); public static final RegistryEntry> SUPER_GLUE = register("super_glue", - SuperGlueEntity::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, SuperGlueEntity::build); + SuperGlueEntity::new, EntityClassification.MISC, 10, Integer.MAX_VALUE, false, true, SuperGlueEntity::build); public static final RegistryEntry> SEAT = - register("seat", SeatEntity::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, SeatEntity::build); + register("seat", SeatEntity::new, EntityClassification.MISC, 0, Integer.MAX_VALUE, false, true, SeatEntity::build); // @@ -41,12 +41,12 @@ public class AllEntityTypes { private static RegistryEntry> contraption(String name, IFactory factory, int range, int updateFrequency, boolean sendVelocity) { - return register(name, factory, EntityClassification.MISC, range, updateFrequency, sendVelocity, + return register(name, factory, EntityClassification.MISC, range, updateFrequency, sendVelocity, true, AbstractContraptionEntity::build); } private static RegistryEntry> register(String name, IFactory factory, - EntityClassification group, int range, int updateFrequency, boolean sendVelocity, + EntityClassification group, int range, int updateFrequency, boolean sendVelocity, boolean immuneToFire, NonNullConsumer> propertyBuilder) { String id = Lang.asId(name); return Create.registrate() @@ -55,6 +55,10 @@ public class AllEntityTypes { .setUpdateInterval(updateFrequency) .setShouldReceiveVelocityUpdates(sendVelocity)) .properties(propertyBuilder) + .properties(b -> { + if (immuneToFire) + b.immuneToFire(); + }) .register(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index acd2b1625..5b8c56e0b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -649,4 +649,25 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit } + @Override + public void updateAquatics() { + /* + Override this with an empty method to reduce enormous calculation time when contraptions are in water + WARNING: THIS HAS A BUNCH OF SIDE EFFECTS! + - Fluids will not try to change contraption movement direction + - this.inWater and this.isInWater() will return unreliable data + - entities riding a contraption will not cause water splashes (seats are their own entity so this should be fine) + - fall distance is not reset when the contraption is in water + - this.eyesInWater and this.canSwim() will always be false + - swimming state will never be updated + */ + extinguish(); + } + + @Override + public void setFire(int p_70015_1_) { + // Contraptions no longer catch fire + } + + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java index 4e2a4d77f..45cb0927b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingInventory.java @@ -55,6 +55,8 @@ public class ProcessingInventory extends ItemStackHandler { recipeDuration = nbt.getFloat("RecipeTime"); appliedRecipe = nbt.getBoolean("AppliedRecipe"); super.deserializeNBT(nbt); + if(isEmpty()) + appliedRecipe = false; } @Override diff --git a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java index 4f16caa6e..88084d2a4 100644 --- a/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java +++ b/src/main/java/com/simibubi/create/foundation/advancement/AllTriggers.java @@ -19,9 +19,9 @@ public class AllTriggers { private static final List> triggers = new LinkedList<>(); - public static final RegistryTrigger INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", ForgeRegistries.FLUIDS)); - public static final RegistryTrigger BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", ForgeRegistries.BLOCKS)); - public static final EnumTrigger FAN_PROCESSING = add(new EnumTrigger<>("fan_processing", InWorldProcessing.Type.class)); + public static final StringSerializableTrigger INFINITE_FLUID = add(new RegistryTrigger<>("infinite_fluid", ForgeRegistries.FLUIDS)); + public static final StringSerializableTrigger BRACKET_APPLY_TRIGGER = add(new RegistryTrigger<>("bracket_apply", ForgeRegistries.BLOCKS)); + public static final StringSerializableTrigger FAN_PROCESSING = add(new EnumTrigger<>("fan_processing", InWorldProcessing.Type.class)); public static final SimpleTrigger ROTATION = simple("rotation"), diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index d70fcdb5c..17a263235 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -44,4 +44,6 @@ public com.mojang.blaze3d.platform.GlStateManager$BooleanState field_179201_b #f public net.minecraft.client.renderer.GameRenderer func_215311_a(Lnet/minecraft/client/renderer/ActiveRenderInfo;FZ)D #getFOVModifier # IResizeCallback -public net.minecraft.util.palette.IResizeCallback \ No newline at end of file +public net.minecraft.util.palette.IResizeCallback + +public net.minecraft.entity.Entity func_205011_p()V # updateAquatics \ No newline at end of file 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 040/124] 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 5499fdbad0691d464140812addcb2d7f6d60b5bc Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 2 Mar 2021 15:54:31 -0800 Subject: [PATCH 041/124] The flappening. Tunnel and funnel flaps are now rendered with the new engine. --- .../com/simibubi/create/AllTileEntities.java | 5 + .../base/KineticRenderMaterials.java | 3 + .../render/ContraptionKineticRenderer.java | 2 + .../render/ContraptionRenderDispatcher.java | 15 +-- .../relays/belt/BeltTileEntity.java | 2 +- .../content/logistics/block/FlapData.java | 122 ++++++++++++++++++ .../logistics/block/FlapInstancedModel.java | 22 ++++ .../logistics/block/FlapVertexAttributes.java | 45 +++++++ .../belts/tunnel/BeltTunnelInstance.java | 106 +++++++++++++++ .../belts/tunnel/BeltTunnelRenderer.java | 5 + .../belts/tunnel/BeltTunnelTileEntity.java | 24 ++-- .../block/funnel/FunnelInstance.java | 93 +++++++++++++ .../block/funnel/FunnelRenderer.java | 3 +- .../block/funnel/FunnelTileEntity.java | 17 ++- .../foundation/mixin/RenderHooksMixin.java | 28 ++-- .../foundation/render/AllProgramSpecs.java | 18 +++ .../foundation/render/KineticRenderer.java | 2 + .../instancing/InstancedTileRenderer.java | 4 + .../instancing/TileEntityInstance.java | 7 +- .../resources/assets/create/shader/flap.vert | 104 +++++++++++++++ 20 files changed, 592 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/FlapData.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/FlapInstancedModel.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java create mode 100644 src/main/resources/assets/create/shader/flap.vert diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 1abb73271..7e24832ab 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -104,6 +104,7 @@ import com.simibubi.create.content.contraptions.relays.gearbox.GearboxInstance; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxRenderer; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxTileEntity; import com.simibubi.create.content.contraptions.relays.gearbox.GearshiftTileEntity; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelInstance; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelRenderer; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; @@ -116,6 +117,7 @@ import com.simibubi.create.content.logistics.block.depot.DepotTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterRenderer; import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterTileEntity; +import com.simibubi.create.content.logistics.block.funnel.FunnelInstance; import com.simibubi.create.content.logistics.block.funnel.FunnelRenderer; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateTileEntity; @@ -339,12 +341,14 @@ public class AllTileEntities { .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) .validBlocks(AllBlocks.ANDESITE_TUNNEL) .renderer(() -> BeltTunnelRenderer::new) + .onRegister(BeltTunnelInstance::register) .register(); public static final TileEntityEntry BRASS_TUNNEL = Create.registrate() .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) .validBlocks(AllBlocks.BRASS_TUNNEL) .renderer(() -> BeltTunnelRenderer::new) + .onRegister(BeltTunnelInstance::register) .register(); public static final TileEntityEntry MECHANICAL_ARM = Create.registrate() @@ -591,6 +595,7 @@ public class AllTileEntities { .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL) .renderer(() -> FunnelRenderer::new) + .onRegister(FunnelInstance::register) .register(); public static final TileEntityEntry CONTENT_OBSERVER = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java index 49223a3cb..8d3d32d31 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticRenderMaterials.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.relays.belt.BeltData; +import com.simibubi.create.content.logistics.block.FlapData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.MaterialType; @@ -10,4 +11,6 @@ public class KineticRenderMaterials { public static final MaterialType> BELTS = new MaterialType<>(); public static final MaterialType> ACTORS = new MaterialType<>(); + + public static final MaterialType> FLAPS = new MaterialType<>(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index 6733cd22a..f5fe4a9b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -4,6 +4,7 @@ import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; +import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.foundation.render.AllProgramSpecs; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; @@ -16,6 +17,7 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer(this, AllProgramSpecs.CONTRAPTION_BELT, BeltInstancedModel::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_ROTATING, RotatingInstancedModel::new)); + materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_FLAPS, FlapInstancedModel::new)); materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index b35305eed..346c3e244 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -104,20 +104,17 @@ public class ContraptionRenderDispatcher { return contraption; } + public static void beginFrame(double camX, double camY, double camZ) { + for (RenderedContraption renderer : renderers.values()) { + renderer.beginFrame(camX, camY, camZ); + } + } + public static void renderLayer(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { removeDeadContraptions(); if (renderers.isEmpty()) return; - if (firstLayer) { - - for (RenderedContraption renderer : renderers.values()) { - renderer.beginFrame(camX, camY, camZ); - } - - firstLayer = false; - } - layer.startDrawing(); GL11.glEnable(GL13.GL_TEXTURE_3D); GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index a55c23825..f26ebceed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -521,7 +521,7 @@ public class BeltTileEntity extends KineticTileEntity { @Override public boolean shouldRenderAsTE() { - return isController(); + return BeltBlock.canTransportObjects(getBlockState()); } private void updateLight() { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java b/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java new file mode 100644 index 000000000..a42d8af3b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/FlapData.java @@ -0,0 +1,122 @@ +package com.simibubi.create.content.logistics.block; + +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstanceData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.math.BlockPos; + +import java.nio.ByteBuffer; + +public class FlapData extends InstanceData { + + public static VertexFormat FORMAT = VertexFormat.builder() + .addAttributes(FlapVertexAttributes.class) + .build(); + + private float x; + private float y; + private float z; + private byte blockLight; + private byte skyLight; + + private float segmentOffsetX; + private float segmentOffsetY; + private float segmentOffsetZ; + + private float pivotX; + private float pivotY; + private float pivotZ; + + private float horizontalAngle; + private float intensity; + private float flapScale; + + private float flapness; + + public FlapData(InstancedModel owner) { + super(owner); + } + + public FlapData setPosition(BlockPos pos) { + return setPosition(pos.getX(), pos.getY(), pos.getZ()); + } + + public FlapData setPosition(Vector3f pos) { + return setPosition(pos.getX(), pos.getY(), pos.getZ()); + } + + public FlapData setPosition(int x, int y, int z) { + BlockPos origin = owner.renderer.getOriginCoordinate(); + + return setPosition((float) (x - origin.getX()), + (float) (y - origin.getY()), + (float) (z - origin.getZ())); + } + + public FlapData setPosition(float x, float y, float z) { + this.x = x; + this.y = y; + this.z = z; + return this; + } + + public FlapData setBlockLight(int blockLight) { + this.blockLight = (byte) ((blockLight & 0xF) << 4); + return this; + } + + public FlapData setSkyLight(int skyLight) { + this.skyLight = (byte) ((skyLight & 0xF) << 4); + return this; + } + + public FlapData setSegmentOffset(float x, float y, float z) { + this.segmentOffsetX = x; + this.segmentOffsetY = y; + this.segmentOffsetZ = z; + return this; + } + + public FlapData setIntensity(float intensity) { + this.intensity = intensity; + return this; + } + + public FlapData setHorizontalAngle(float horizontalAngle) { + this.horizontalAngle = horizontalAngle; + return this; + } + + public FlapData setFlapScale(float flapScale) { + this.flapScale = flapScale; + return this; + } + + public FlapData setFlapness(float flapness) { + this.flapness = flapness; + return this; + } + + public FlapData setPivotVoxelSpace(float x, float y, float z) { + pivotX = x / 16f; + pivotY = y / 16f; + pivotZ = z / 16f; + return this; + } + + @Override + public void write(ByteBuffer buf) { + putVec3(buf, x, y, z); + putVec2(buf, blockLight, skyLight); + + putVec3(buf, segmentOffsetX, segmentOffsetY, segmentOffsetZ); + putVec3(buf, pivotX, pivotY, pivotZ); + + put(buf, horizontalAngle); + put(buf, intensity); + put(buf, flapScale); + + put(buf, flapness); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/FlapInstancedModel.java b/src/main/java/com/simibubi/create/content/logistics/block/FlapInstancedModel.java new file mode 100644 index 000000000..d9502bb4d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/FlapInstancedModel.java @@ -0,0 +1,22 @@ +package com.simibubi.create.content.logistics.block; + +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import net.minecraft.client.renderer.BufferBuilder; + +public class FlapInstancedModel extends InstancedModel { + public FlapInstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); + } + + @Override + protected FlapData newInstance() { + return new FlapData(this); + } + + @Override + protected VertexFormat getInstanceFormat() { + return FlapData.FORMAT; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java b/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java new file mode 100644 index 000000000..d32768a3f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java @@ -0,0 +1,45 @@ +package com.simibubi.create.content.logistics.block; + +import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; + +public enum FlapVertexAttributes implements IVertexAttrib { + INSTANCE_POSITION("aInstancePos",CommonAttributes.VEC3), + LIGHT("aLight", CommonAttributes.LIGHT), + SEGMENT_OFFSET("aSegmentOffset", CommonAttributes.VEC3), + PIVOT("aPivot", CommonAttributes.VEC3), + HORIZONTAL_ANGLE("aHorizontalAngle", CommonAttributes.FLOAT), + INTENSITY("aIntensity", CommonAttributes.FLOAT), + FLAP_SCALE("aFlapScale", CommonAttributes.FLOAT), + FLAPNESS("aFlapness", CommonAttributes.FLOAT), + ; + + private final String name; + private final VertexAttribSpec spec; + + FlapVertexAttributes(String name, VertexAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public VertexAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 1; + } + + @Override + public int getBufferIndex() { + return 1; + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java new file mode 100644 index 000000000..5b38ee07f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -0,0 +1,106 @@ +package com.simibubi.create.content.logistics.block.belts.tunnel; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; +import com.simibubi.create.content.logistics.block.FlapData; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.EnumMap; +import java.util.Map; + +public class BeltTunnelInstance extends TileEntityInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, BeltTunnelInstance::new)); + } + + private Map>> tunnelFlaps; + + public BeltTunnelInstance(InstancedTileRenderer modelManager, BeltTunnelTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + tunnelFlaps = new EnumMap<>(Direction.class); + + InstancedModel model = modelManager.getMaterial(KineticRenderMaterials.FLAPS) + .getModel(AllBlockPartials.BELT_TUNNEL_FLAP, lastState); + + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + tile.flaps.forEach((direction, flapValue) -> { + + float flapness = flapValue.get(AnimationTickHolder.getPartialTicks()); + + float horizontalAngle = direction.getOpposite().getHorizontalAngle(); + + float flapScale = direction.getAxis() == Direction.Axis.X ? 1 : -1; + + ArrayList> flaps = new ArrayList<>(4); + + for (int segment = 0; segment <= 3; segment++) { + float intensity = segment == 3 ? 1.5f : segment + 1; + float segmentOffset = -3 / 16f * segment; + + flaps.add(model.setupInstance(flapData -> { + flapData.setPosition(pos) + .setSegmentOffset(segmentOffset, 0, 0) + .setBlockLight(blockLight) + .setSkyLight(skyLight) + .setHorizontalAngle(horizontalAngle) + .setFlapness(flapness) + .setFlapScale(flapScale) + .setPivotVoxelSpace(0, 10, 1) + .setIntensity(intensity); + })); + } + + tunnelFlaps.put(direction, flaps); + }); + } + + @Override + public void tick() { + tunnelFlaps.forEach((direction, keys) -> { + + float flapness = tile.flaps.get(direction).get(AnimationTickHolder.getPartialTicks()); + for (InstanceKey key : keys) { + key.modifyInstance(data -> data.setFlapness(flapness)); + } + }); + } + + @Override + protected void onUpdate() { } + + @Override + public void updateLight() { + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + for (ArrayList> instanceKeys : tunnelFlaps.values()) { + for (InstanceKey it : instanceKeys) { + it.modifyInstance(data -> data.setBlockLight(blockLight) + .setSkyLight(skyLight)); + } + } + } + + @Override + public void remove() { + tunnelFlaps.values() + .stream() + .flatMap(Collection::stream) + .forEach(InstanceKey::delete); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java index 8751cf110..b605298bf 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelRenderer.java @@ -4,6 +4,8 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -28,6 +30,9 @@ public class BeltTunnelRenderer extends SmartTileEntityRenderer flaps; + public Map flaps; public Set sides; protected LazyOptional cap = LazyOptional.empty(); @@ -43,7 +43,7 @@ public class BeltTunnelTileEntity extends SmartTileEntity { public BeltTunnelTileEntity(TileEntityType type) { super(type); - flaps = new HashMap<>(); + flaps = new EnumMap<>(Direction.class); sides = new HashSet<>(); flapsToSend = new LinkedList<>(); } @@ -174,7 +174,9 @@ public class BeltTunnelTileEntity extends SmartTileEntity { @Override public void initialize() { super.initialize(); -// updateTunnelConnections(); + updateTunnelConnections(); + if (world != null && world.isRemote) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); } @Override @@ -212,4 +214,8 @@ public class BeltTunnelTileEntity extends SmartTileEntity { return this.cap.cast(); } + @Override + public void onChunkLightUpdate() { + CreateClient.kineticRenderer.onLightUpdate(this); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java new file mode 100644 index 000000000..21d838502 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -0,0 +1,93 @@ +package com.simibubi.create.content.logistics.block.funnel; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; +import com.simibubi.create.content.logistics.block.FlapData; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +import java.util.ArrayList; + +public class FunnelInstance extends TileEntityInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, FunnelInstance::new)); + } + + private ArrayList> flaps; + + public FunnelInstance(InstancedTileRenderer modelManager, FunnelTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + flaps = new ArrayList<>(4); + + if (!tile.hasFlap()) return; + + AllBlockPartials flapPartial = (lastState.getBlock() instanceof FunnelBlock ? AllBlockPartials.FUNNEL_FLAP + : AllBlockPartials.BELT_FUNNEL_FLAP); + InstancedModel model = modelManager.getMaterial(KineticRenderMaterials.FLAPS) + .getModel(flapPartial, lastState); + + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + Direction direction = FunnelBlock.getFunnelFacing(lastState); + + float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks()); + float horizontalAngle = direction.getOpposite().getHorizontalAngle(); + + for (int segment = 0; segment <= 3; segment++) { + float intensity = segment == 3 ? 1.5f : segment + 1; + float segmentOffset = -3 / 16f * segment; + + flaps.add(model.setupInstance(flapData -> flapData.setPosition(pos) + .setSegmentOffset(segmentOffset, 0, -tile.getFlapOffset()) + .setBlockLight(blockLight) + .setSkyLight(skyLight) + .setHorizontalAngle(horizontalAngle) + .setFlapness(flapness) + .setFlapScale(-1) + .setPivotVoxelSpace(0, 10, 9.5f) + .setIntensity(intensity))); + } + } + + @Override + public void tick() { + if (flaps == null) return; + + float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks()); + + for (InstanceKey key : flaps) { + key.modifyInstance(data -> data.setFlapness(flapness)); + } + } + + @Override + public void updateLight() { + if (flaps == null) return; + + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + for (InstanceKey it : flaps) { + it.modifyInstance(data -> data.setBlockLight(blockLight) + .setSkyLight(skyLight)); + } + } + + @Override + public void remove() { + if (flaps == null) return; + + flaps.forEach(InstanceKey::delete); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java index c8cb12583..0f2ea623a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -27,7 +28,7 @@ public class FunnelRenderer extends SmartTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); - if (!te.hasFlap()) + if (!te.hasFlap() || FastRenderDispatcher.available(te.getWorld())) return; BlockState blockState = te.getBlockState(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index a25b196cb..c2d8f3893 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -4,6 +4,7 @@ import java.lang.ref.WeakReference; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; @@ -14,6 +15,7 @@ import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; @@ -33,11 +35,13 @@ 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.api.distmarker.Dist; import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringInformation { +public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringInformation, IInstanceRendered { private FilteringBehaviour filtering; private InvManipulationBehaviour invManipulation; @@ -381,4 +385,15 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn return true; } + @Override + public void initialize() { + super.initialize(); + if (world != null && world.isRemote) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); + } + + @Override + public void onChunkLightUpdate() { + CreateClient.kineticRenderer.onLightUpdate(this); + } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index eb02006e8..d44d476b0 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -1,11 +1,7 @@ package com.simibubi.create.foundation.mixin; -import com.simibubi.create.foundation.render.backend.light.ILightListener; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientChunkProvider; -import net.minecraft.util.math.SectionPos; -import net.minecraft.world.ILightReader; -import net.minecraft.world.chunk.Chunk; +import net.minecraft.client.renderer.*; +import net.minecraft.util.math.Vec3d; import org.lwjgl.opengl.GL20; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -20,15 +16,10 @@ import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.OptifineHandler; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.world.ClientWorld; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; -import java.util.Map; - @OnlyIn(Dist.CLIENT) @Mixin(WorldRenderer.class) public class RenderHooksMixin { @@ -40,7 +31,7 @@ public class RenderHooksMixin { * layer-correct custom rendering. RenderWorldLast is not refined enough for rendering world objects. * This should probably be a forge event. */ - @Inject(at = @At(value = "TAIL"), method = "renderLayer") + @Inject(at = @At("TAIL"), method = "renderLayer") private void renderLayer(RenderType type, MatrixStack stack, double camX, double camY, double camZ, CallbackInfo ci) { if (!Backend.available()) return; @@ -54,7 +45,18 @@ public class RenderHooksMixin { GL20.glUseProgram(0); } - @Inject(at = @At(value = "TAIL"), method = "loadRenderers") + @Inject(at = @At(value = "INVOKE", target = "updateChunks(J)V"), method = "render") + private void setupFrame(MatrixStack p_228426_1_, float p_228426_2_, long p_228426_3_, boolean p_228426_5_, ActiveRenderInfo info, GameRenderer p_228426_7_, LightTexture p_228426_8_, Matrix4f p_228426_9_, CallbackInfo ci) { + Vec3d cameraPos = info.getProjectedView(); + double camX = cameraPos.getX(); + double camY = cameraPos.getY(); + double camZ = cameraPos.getZ(); + + CreateClient.kineticRenderer.beginFrame(camX, camY, camZ); + ContraptionRenderDispatcher.beginFrame(camX, camY, camZ); + } + + @Inject(at = @At("TAIL"), method = "loadRenderers") private void refresh(CallbackInfo ci) { CreateClient.kineticRenderer.invalidate(); ContraptionRenderDispatcher.invalidateAll(); diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index b5d5e991a..d943724d0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.components.actors.ActorVertexAtt import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionProgram; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionVertexAttributes; import com.simibubi.create.content.contraptions.relays.belt.BeltVertexAttributes; +import com.simibubi.create.content.logistics.block.FlapVertexAttributes; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; @@ -33,6 +34,13 @@ public class AllProgramSpecs { .setFrag(Locations.INSTANCED) .createProgramSpec()); + public static final ProgramSpec FLAPS = register(ProgramSpec.builder("flap", BasicProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(FlapVertexAttributes.class) + .setVert(Locations.FLAP) + .setFrag(Locations.INSTANCED) + .createProgramSpec()); + public static final ProgramSpec CONTRAPTION_STRUCTURE = register(ProgramSpec.builder("contraption_structure", ContraptionProgram::new) .addAttributes(ContraptionVertexAttributes.class) .setVert(Locations.CONTRAPTION_STRUCTURE) @@ -57,6 +65,14 @@ public class AllProgramSpecs { .setDefines(ShaderConstants.define("CONTRAPTION")) .createProgramSpec()); + public static final ProgramSpec CONTRAPTION_FLAPS = register(ProgramSpec.builder("contraption_flap", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(FlapVertexAttributes.class) + .setVert(Locations.FLAP) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + public static final ProgramSpec CONTRAPTION_ACTOR = register(ProgramSpec.builder("contraption_actor", ContraptionProgram::new) .addAttributes(ModelVertexAttributes.class) .addAttributes(ActorVertexAttributes.class) @@ -64,12 +80,14 @@ public class AllProgramSpecs { .setFrag(Locations.CONTRAPTION) .createProgramSpec()); + public static class Locations { public static final ResourceLocation INSTANCED = loc("instanced.frag"); public static final ResourceLocation CONTRAPTION = loc("contraption.frag"); public static final ResourceLocation ROTATING = loc("rotating.vert"); public static final ResourceLocation BELT = loc("belt.vert"); + public static final ResourceLocation FLAP = loc("flap.vert"); public static final ResourceLocation CONTRAPTION_STRUCTURE = loc("contraption_structure.vert"); public static final ResourceLocation CONTRAPTION_ACTOR = loc("contraption_actor.vert"); diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index 8517b7d03..68cb7367e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; +import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; @@ -26,6 +27,7 @@ public class KineticRenderer extends InstancedTileRenderer { public void registerMaterials() { materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.BELT, BeltInstancedModel::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.ROTATING, RotatingInstancedModel::new)); + materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.FLAPS, FlapInstancedModel::new)); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 524d36a91..2f7c37288 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -40,6 +40,10 @@ public abstract class InstancedTileRenderer

{ } } + public void beginFrame(double cameraX, double cameraY, double cameraZ) { + instances.values().forEach(TileEntityInstance::tick); + } + public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { render(layer, viewProjection, camX, camY, camZ, null); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index ed4b1f162..fd77e7fd3 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -33,6 +33,11 @@ public abstract class TileEntityInstance { } } + /** + * Called every frame, this can be used to make more dynamic animations. + */ + public void tick() { } + /** * Acquire all {@link InstanceKey}s and initialize any data you may need to calculate the instance properties. */ @@ -42,7 +47,7 @@ public abstract class TileEntityInstance { * Update changed instance data using the {@link InstanceKey}s you got in {@link #init()}. * You don't have to update light data. That should be done in {@link #updateLight()} */ - protected abstract void onUpdate(); + protected void onUpdate() { } /** * Called when a light update occurs in the world. If your model needs it, update light here. diff --git a/src/main/resources/assets/create/shader/flap.vert b/src/main/resources/assets/create/shader/flap.vert new file mode 100644 index 000000000..bd982595d --- /dev/null +++ b/src/main/resources/assets/create/shader/flap.vert @@ -0,0 +1,104 @@ +#version 110 +#define PI 3.1415926538 + +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; + +attribute vec3 aInstancePos; +attribute vec2 aLight; + +attribute vec3 aSegmentOffset; +attribute vec3 aPivot; +attribute float aHorizontalAngle; +attribute float aIntensity; +attribute float aFlapScale; + +attribute float aFlapness; + +// outputs +varying vec2 TexCoords; +varying vec4 Color; +varying float Diffuse; +varying vec2 Light; + +#if defined(CONTRAPTION) +varying vec3 BoxCoord; + +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; +#endif + +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; + +uniform vec3 uCameraPos; +varying float FragDistance; + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); +} + +mat4 rotate(vec3 axis, float angle) { + float s = sin(angle); + float c = cos(angle); + float oc = 1. - c; + + return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., + oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., + oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., + 0., 0., 0., 1.); +} + +float toRad(float degrees) { + return fract(degrees / 360.) * PI * 2.; +} + +float getFlapAngle() { + float absFlap = abs(aFlapness); + + float angle = sin((1. - absFlap) * PI * aIntensity) * 30. * aFlapness * aFlapScale; + + float halfAngle = angle * 0.5; + + float which = step(0., aFlapness); + float degrees = which * halfAngle + (1. - which) * angle; // branchless conditional multiply + + return -toRad(degrees); +} + +void main() { + float flapAngle = getFlapAngle(); + + mat4 orientation = rotate(vec3(0., 1., 0.), toRad(aHorizontalAngle)); + mat4 flapRotation = rotate(vec3(1., 0., 0.), flapAngle); + + vec4 worldPos = flapRotation * vec4(aPos - aPivot, 1.) + vec4(aPivot + aSegmentOffset, 0.); + worldPos = orientation * vec4(worldPos.xyz - .5, 1.) + vec4(aInstancePos + .5, 0.); + + #ifdef CONTRAPTION + worldPos = uModel * worldPos; + mat4 normalMat = uModel * orientation * flapRotation; + + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + FragDistance = length(worldPos.xyz); + #else + mat4 normalMat = orientation * flapRotation; + + FragDistance = length(worldPos.xyz - uCameraPos); + #endif + + vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; + + Diffuse = diffuse(norm); + TexCoords = aTexCoords; + Light = aLight; + gl_Position = uViewProjection * worldPos; + + Color = vec4(1.); +} From e87849decacbd2ba5cca6674d9fd459dd15a159a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 Mar 2021 02:30:21 +0100 Subject: [PATCH 042/124] Vector's food expansion - Added honeyed apples - Added sweet rolls - Added chocolate glazed berries - New goggles item model - Other texture tweaks --- src/generated/resources/.cache/cache | 39 +++-- .../assets/create/blockstates/fluid_pipe.json | 154 +++++++++--------- .../create/blockstates/radial_chassis.json | 96 +++++------ .../resources/assets/create/lang/en_ud.json | 3 + .../resources/assets/create/lang/en_us.json | 3 + .../assets/create/lang/unfinished/de_de.json | 5 +- .../assets/create/lang/unfinished/es_es.json | 5 +- .../assets/create/lang/unfinished/es_mx.json | 5 +- .../assets/create/lang/unfinished/fr_fr.json | 5 +- .../assets/create/lang/unfinished/it_it.json | 5 +- .../assets/create/lang/unfinished/ja_jp.json | 5 +- .../assets/create/lang/unfinished/ko_kr.json | 5 +- .../assets/create/lang/unfinished/nl_nl.json | 5 +- .../assets/create/lang/unfinished/pt_br.json | 5 +- .../assets/create/lang/unfinished/ru_ru.json | 5 +- .../assets/create/lang/unfinished/zh_cn.json | 5 +- .../assets/create/lang/unfinished/zh_tw.json | 5 +- .../models/item/chocolate_glazed_berries.json | 6 + .../assets/create/models/item/goggles.json | 6 + .../create/models/item/honeyed_apple.json | 6 + .../assets/create/models/item/sweet_roll.json | 6 + .../filling/chocolate_glazed_berries.json | 18 ++ .../create/recipes/filling/honeyed_apple.json | 17 ++ .../create/recipes/filling/sweet_roll.json | 17 ++ .../com/simibubi/create/AllBlockPartials.java | 2 + .../java/com/simibubi/create/AllItems.java | 21 ++- .../contraptions/goggles/GogglesModel.java | 24 +++ .../data/recipe/FillingRecipeGen.java | 12 ++ .../models/{item => block}/goggles.json | 25 +-- .../create/textures/item/builders_tea.png | Bin 280 -> 388 bytes .../item/chocolate_glazed_berries.png | Bin 0 -> 427 bytes .../create/textures/item/cinder_flour.png | Bin 389 -> 391 bytes .../assets/create/textures/item/goggles.png | Bin 361 -> 352 bytes .../create/textures/item/goggles_model.png | Bin 0 -> 361 bytes .../create/textures/item/honeyed_apple.png | Bin 0 -> 526 bytes .../create/textures/item/sweet_roll.png | Bin 0 -> 417 bytes 36 files changed, 349 insertions(+), 166 deletions(-) create mode 100644 src/generated/resources/assets/create/models/item/chocolate_glazed_berries.json create mode 100644 src/generated/resources/assets/create/models/item/goggles.json create mode 100644 src/generated/resources/assets/create/models/item/honeyed_apple.json create mode 100644 src/generated/resources/assets/create/models/item/sweet_roll.json create mode 100644 src/generated/resources/data/create/recipes/filling/chocolate_glazed_berries.json create mode 100644 src/generated/resources/data/create/recipes/filling/honeyed_apple.json create mode 100644 src/generated/resources/data/create/recipes/filling/sweet_roll.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java rename src/main/resources/assets/create/models/{item => block}/goggles.json (86%) create mode 100644 src/main/resources/assets/create/textures/item/chocolate_glazed_berries.png create mode 100644 src/main/resources/assets/create/textures/item/goggles_model.png create mode 100644 src/main/resources/assets/create/textures/item/honeyed_apple.png create mode 100644 src/main/resources/assets/create/textures/item/sweet_roll.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index f0ea2779e..c4027857d 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 -3d97226b5e8d8f70ed08e45e78db1faf78d5e28b 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 -8d7e653bfd9846e684a0d3725595714a19201017 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 @@ -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 -c562d23527d2f3ac9fa0be10c7fa1bc58f632abc assets/create/lang/en_us.json -8766f1728b3ba4542104e8f87c8b9d1f1741fdeb assets/create/lang/unfinished/de_de.json -3e1f0a8effb4b8541849d5b51576a7531219e914 assets/create/lang/unfinished/es_es.json -cee3455d04453c86d0709ccdc9d347f430edb08e assets/create/lang/unfinished/es_mx.json -1e9d2907c968ab5afb55d72fb934a7d7ed3407b5 assets/create/lang/unfinished/fr_fr.json -eefeacfbd97714d845b78f75cb003d2fb1e3c260 assets/create/lang/unfinished/it_it.json -677008605916984e2063dc6f5d8f7528f2b0b44a assets/create/lang/unfinished/ja_jp.json -397b88e9ad3500d78c08b27f6f11df8b094571fa assets/create/lang/unfinished/ko_kr.json -767605e14edabd5df33a2ef1afbdb84ddd804418 assets/create/lang/unfinished/nl_nl.json -8f0dcab1ffe40d31a1f5823e619648fb01127507 assets/create/lang/unfinished/pt_br.json -c4836701cc764a49529b923c8ab390f1b292e7c2 assets/create/lang/unfinished/ru_ru.json -a179807fb6a649bc9ce4214bbf5192931117bb3c assets/create/lang/unfinished/zh_cn.json -be64b2635e5599b43b4615e333a26d09cfa3baec assets/create/lang/unfinished/zh_tw.json +00e2b77dcc86224cd5a33aefaac01f20c90bcb40 assets/create/lang/en_ud.json +55638abca6ffa48e1059f2578ea6d76b8327f496 assets/create/lang/en_us.json +374dd193cb26eb590a4a66bf5c8e13f9743ddbdb assets/create/lang/unfinished/de_de.json +84b205e2a8c9539ab6da68aa8f7c91f1dbec0702 assets/create/lang/unfinished/es_es.json +3397c2fed7517a4c9b3b41ee081abb120ddf9b3b assets/create/lang/unfinished/es_mx.json +e61eb3ca3d279c438275fb50333b135560574e62 assets/create/lang/unfinished/fr_fr.json +eaa202ec1821372b5f26d724e7c58d710fda7f5b assets/create/lang/unfinished/it_it.json +d1627e59cf6cf5ac2382397a7db416e75072ac31 assets/create/lang/unfinished/ja_jp.json +39f4258b8d9d56c5d7e5761065081d69ab07d4d8 assets/create/lang/unfinished/ko_kr.json +402c16cffdd530dfde3e016691720145cc66c7a1 assets/create/lang/unfinished/nl_nl.json +73f22223f6d30068ac2bc3f9be02e43f7fe4cae0 assets/create/lang/unfinished/pt_br.json +015a444814ec9982c35d08a3705df3861ce2545e assets/create/lang/unfinished/ru_ru.json +38ed221082ce3ce7b4f6c93ec28b7e89a95cab06 assets/create/lang/unfinished/zh_cn.json +e51b6bd8cd9696858a417d3d9472a263e9268dd8 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 @@ -1192,6 +1192,7 @@ afd697168c9786eb80e54eccdc6a23afa6c7fb0e assets/create/models/item/chiseled_gabb a47fbe5f2da79080d99ef0975bfa8da4d08f8be4 assets/create/models/item/chiseled_scoria.json 70232ce9b88119fb383717e2c1ad113f7aad6a99 assets/create/models/item/chiseled_weathered_limestone.json eabf1870127d78c920305228eb51ddf36c44d016 assets/create/models/item/chocolate_bucket.json +473c8fcc3c53a7680b2f1c6505517c79fd07153a assets/create/models/item/chocolate_glazed_berries.json fe67c3f380d17735a9436a4579a8be1a02b8e4a0 assets/create/models/item/chute.json d418205c83d3e57c830755ee8c09e2962353e493 assets/create/models/item/cinder_flour.json c1da21be9f1af4f7a2ef4ec9cd92195d65ada316 assets/create/models/item/clockwork_bearing.json @@ -1329,6 +1330,7 @@ b10f1b188f2bf380628377bd42af2b8f8ffe5611 assets/create/models/item/gantry_pinion b4bfd5041b62f3a0a955fa4872d178b590614f22 assets/create/models/item/gantry_shaft.json 6ab0d17f3d02678ed992e188ff09f6b2c00b5b03 assets/create/models/item/gearbox.json 2fe29893d74c176ea35aed73a169c13dd4ddb2a8 assets/create/models/item/gearshift.json +21c3dc6a734be582c149b9d1d7da209e178ed58a assets/create/models/item/goggles.json 52108a61865dab38133b9f916496ca680ae364ea assets/create/models/item/golden_sheet.json 46d813bcb6676078347383295bb7dbda1d9dd060 assets/create/models/item/granite_bricks.json 032a31c66d3de63595d478165d54b4f562e9831d assets/create/models/item/granite_bricks_slab.json @@ -1347,6 +1349,7 @@ ecb9f32f62d3fa43fb226ab85adc2eb229fdfb77 assets/create/models/item/green_valve_h cfab82a2cf7495d21778c1de9730a26afbdd523d assets/create/models/item/handheld_blockzapper.json dee43bf1a9c211a752fac2c07aeba123f7f0c914 assets/create/models/item/handheld_worldshaper.json 967695ab65edb8cb19e9759425f2d12d75406122 assets/create/models/item/honey_bucket.json +31809415a3119aeda37cff6f16d2cf47f71e097f assets/create/models/item/honeyed_apple.json e7ec65ad5be13cae5f7d60836b8df9e4a5baad56 assets/create/models/item/horizontal_framed_glass.json f0e3b2b8a553b6e61746c922c27302dabfff71b6 assets/create/models/item/horizontal_framed_glass_pane.json ff92f6a9dfb73a6ee1eaaed3279c89390ff04a80 assets/create/models/item/hose_pulley.json @@ -1545,6 +1548,7 @@ b305e81f1dc5272634745b6e822af40955a2ef28 assets/create/models/item/spruce_window bbb5773adc23128c70174bfc531af936e6e063e3 assets/create/models/item/stockpile_switch.json bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer.json 29d571a061e3addf92ee51bfc55d96edc3a517a5 assets/create/models/item/super_glue.json +9be61d209d2219ca00d35de7cd57c2c87b297379 assets/create/models/item/sweet_roll.json b1d3d00ff05908feacad06a86800da96cc9bc65d assets/create/models/item/tiled_glass.json 8a2a81a8cbc52b6021e57107d79a32f73b82d8fe assets/create/models/item/tiled_glass_pane.json c081317f106a2b04700aafde12c57445844c20ab assets/create/models/item/tree_fertilizer.json @@ -3113,12 +3117,15 @@ d2ab9ce73636773165564506580f2ec13bd1fc50 data/create/recipes/fancy_weathered_lim 1d0e41ca98e48073c72adf4077610c96e592f9a5 data/create/recipes/fancy_weathered_limestone_bricks_wall_from_fancy_weathered_limestone_bricks_stonecutting.json 133e79f78a7f2c2f63ac7695d2be57d56e8955f4 data/create/recipes/filling/blaze_cake.json 642e96ce5dd2f31e7a33c6ef4060eecb0bf2aa86 data/create/recipes/filling/builders_tea.json +1367357fc36adc4b67467d90589ef91e657380a4 data/create/recipes/filling/chocolate_glazed_berries.json 5bec6c2068a3c1005810d18bd45ce916389b5423 data/create/recipes/filling/glowstone.json 5eb6227ccb6fa940b662d3ec029c3bd61fe61c8d data/create/recipes/filling/grass_block.json 244f27eadefefbc966ac384ac087c57d19484321 data/create/recipes/filling/gunpowder.json c8ca74a6cd071308a1750a2ad1153e79422598a0 data/create/recipes/filling/honey_bottle.json +d20703b67dd5e4c9b75718db02d575b1c7415c12 data/create/recipes/filling/honeyed_apple.json c83e77a9799b6ca34dd73aa76b56159f2103c48c data/create/recipes/filling/milk_bucket.json 08ce1420d1551ecfef5988977436c087123851a6 data/create/recipes/filling/redstone.json +fb8e4378cd2240644a4b5c0d06e27ad772ec7695 data/create/recipes/filling/sweet_roll.json 5b8bbde7f8b270ab75fac18d6858f2fadbc0efa3 data/create/recipes/framed_glass_from_glass_colorless_stonecutting.json d697de0c9b706ca4e18da7a2d769e7e5fe8d769d data/create/recipes/framed_glass_pane.json a0dae50faaa1b7142bb4309675e3084c68daa547 data/create/recipes/gabbro_bricks_from_gabbro_stonecutting.json diff --git a/src/generated/resources/assets/create/blockstates/fluid_pipe.json b/src/generated/resources/assets/create/blockstates/fluid_pipe.json index a4cffcde7..80a25280c 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -61,9 +61,9 @@ { "when": { "down": "false", - "north": "true", "up": "true", - "south": "false" + "south": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -72,9 +72,9 @@ { "when": { "down": "false", - "north": "false", "up": "true", - "south": "true" + "south": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -83,9 +83,9 @@ { "when": { "down": "true", - "north": "true", "up": "false", - "south": "false" + "south": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -94,9 +94,9 @@ { "when": { "down": "true", - "north": "false", "up": "false", - "south": "true" + "south": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -105,9 +105,9 @@ { "when": { "down": "true", - "north": "false", "up": "true", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -116,9 +116,9 @@ { "when": { "down": "false", - "north": "false", "up": "true", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -127,9 +127,9 @@ { "when": { "down": "true", - "north": "false", "up": "false", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -138,9 +138,9 @@ { "when": { "down": "false", - "north": "true", "up": "false", - "south": "true" + "south": "true", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -149,9 +149,9 @@ { "when": { "down": "false", - "north": "true", "up": "false", - "south": "false" + "south": "false", + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -160,9 +160,9 @@ { "when": { "down": "false", - "north": "false", "up": "false", - "south": "true" + "south": "true", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -171,9 +171,9 @@ { "when": { "down": "false", - "north": "false", "up": "false", - "south": "false" + "south": "false", + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { + "south": "true", "west": "true", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "true", "north": "false", - "south": "true" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "true", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,10 +225,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "true", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -236,10 +236,10 @@ }, { "when": { + "south": "true", "west": "false", - "east": "false", "north": "false", - "south": "true" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -247,10 +247,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "true", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +258,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { + "south": "false", "west": "true", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "true", "north": "false", - "south": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { + "south": "false", "west": "false", - "east": "false", "north": "false", - "south": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "west": "false", "down": "false", - "east": "true", - "up": "true" + "up": "true", + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "west": "true", "down": "false", - "east": "false", - "up": "true" + "up": "true", + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "west": "false", "down": "true", - "east": "true", - "up": "false" + "up": "false", + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "west": "true", "down": "true", - "east": "false", - "up": "false" + "up": "false", + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "west": "false", "down": "true", - "east": "false", - "up": "true" + "up": "true", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "west": "false", "down": "false", - "east": "false", - "up": "true" + "up": "true", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "west": "false", "down": "true", - "east": "false", - "up": "false" + "up": "false", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { + "down": "false", + "up": "false", "west": "true", - "down": "false", - "east": "true", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { + "down": "false", + "up": "false", "west": "false", - "down": "false", - "east": "true", - "up": "false" + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { + "down": "false", + "up": "false", "west": "true", - "down": "false", - "east": "false", - "up": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "west": "false", "down": "false", - "east": "false", - "up": "false" + "up": "false", + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 9d00ea8b1..8bd829ffc 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": { - "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_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index 65c0554be..b9de24d4a 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -422,6 +422,7 @@ "item.create.builders_tea": "\u0250\u01DD\u27D8 s,\u0279\u01DDp\u05DF\u0131n\u15FA", "item.create.chest_minecart_contraption": "uo\u0131\u0287d\u0250\u0279\u0287uo\u0186 \u0287\u0279\u0250\u0254\u01DDu\u0131W \u0287s\u01DD\u0265\u0186", "item.create.chocolate_bucket": "\u0287\u01DD\u029E\u0254n\u15FA \u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", + "item.create.chocolate_glazed_berries": "s\u01DD\u0131\u0279\u0279\u01DD\u15FA p\u01DDz\u0250\u05DF\u2141 \u01DD\u0287\u0250\u05DFo\u0254o\u0265\u0186", "item.create.chromatic_compound": "punod\u026Fo\u0186 \u0254\u0131\u0287\u0250\u026Fo\u0279\u0265\u0186", "item.create.cinder_flour": "\u0279no\u05DF\u2132 \u0279\u01DDpu\u0131\u0186", "item.create.copper_ingot": "\u0287obuI \u0279\u01DDddo\u0186", @@ -455,6 +456,7 @@ "item.create.handheld_blockzapper": "\u0279\u01DDdd\u0250z\u029E\u0254o\u05DF\u15FA p\u05DF\u01DD\u0265pu\u0250H", "item.create.handheld_worldshaper": "\u0279\u01DDd\u0250\u0265sp\u05DF\u0279oM p\u05DF\u01DD\u0265pu\u0250H", "item.create.honey_bucket": "\u0287\u01DD\u029E\u0254n\u15FA \u028E\u01DDuoH", + "item.create.honeyed_apple": "\u01DD\u05DFdd\u2C6F p\u01DD\u028E\u01DDuoH", "item.create.integrated_circuit": "\u0287\u0131n\u0254\u0279\u0131\u0186 p\u01DD\u0287\u0250\u0279b\u01DD\u0287uI", "item.create.iron_sheet": "\u0287\u01DD\u01DD\u0265S uo\u0279I", "item.create.lapis_sheet": "\u0287\u01DD\u01DD\u0265S s\u0131d\u0250\uA780", @@ -471,6 +473,7 @@ "item.create.schematic_and_quill": "\u05DF\u05DF\u0131n\u1F49 pu\u2C6F \u0254\u0131\u0287\u0250\u026F\u01DD\u0265\u0254S", "item.create.shadow_steel": "\u05DF\u01DD\u01DD\u0287S \u028Dop\u0250\u0265S", "item.create.super_glue": "\u01DDn\u05DF\u2141 \u0279\u01DDdnS", + "item.create.sweet_roll": "\u05DF\u05DFo\u1D1A \u0287\u01DD\u01DD\u028DS", "item.create.tree_fertilizer": "\u0279\u01DDz\u0131\u05DF\u0131\u0287\u0279\u01DD\u2132 \u01DD\u01DD\u0279\u27D8", "item.create.vertical_gearbox": "xoq\u0279\u0250\u01DD\u2141 \u05DF\u0250\u0254\u0131\u0287\u0279\u01DD\u039B", "item.create.wand_of_symmetry": "\u028E\u0279\u0287\u01DD\u026F\u026F\u028ES \u025FO pu\u0250M", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 018ae8c5a..50fec28fc 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -428,6 +428,7 @@ "item.create.builders_tea": "Builder's Tea", "item.create.chest_minecart_contraption": "Chest Minecart Contraption", "item.create.chocolate_bucket": "Chocolate Bucket", + "item.create.chocolate_glazed_berries": "Chocolate Glazed Berries", "item.create.chromatic_compound": "Chromatic Compound", "item.create.cinder_flour": "Cinder Flour", "item.create.copper_ingot": "Copper Ingot", @@ -461,6 +462,7 @@ "item.create.handheld_blockzapper": "Handheld Blockzapper", "item.create.handheld_worldshaper": "Handheld Worldshaper", "item.create.honey_bucket": "Honey Bucket", + "item.create.honeyed_apple": "Honeyed Apple", "item.create.integrated_circuit": "Integrated Circuit", "item.create.iron_sheet": "Iron Sheet", "item.create.lapis_sheet": "Lapis Sheet", @@ -477,6 +479,7 @@ "item.create.schematic_and_quill": "Schematic And Quill", "item.create.shadow_steel": "Shadow Steel", "item.create.super_glue": "Super Glue", + "item.create.sweet_roll": "Sweet Roll", "item.create.tree_fertilizer": "Tree Fertilizer", "item.create.vertical_gearbox": "Vertical Gearbox", "item.create.wand_of_symmetry": "Wand Of Symmetry", 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 7c7c5d275..97b496027 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: 970", + "_": "Missing Localizations: 973", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "UNLOCALIZED: Builder's Tea", "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Blockpistole", "item.create.handheld_worldshaper": "Geländeformer", "item.create.honey_bucket": "Honigeimer", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.iron_sheet": "Eisenblech", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Bauplan und Feder", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", "item.create.super_glue": "Superkleber", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Baumdünger", "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", "item.create.wand_of_symmetry": "Symmetriestab", 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 eda73db1d..c2b82e6a5 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: 12", + "_": "Missing Localizations: 15", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "Té del Constructor", "item.create.chest_minecart_contraption": "Artilugio de vagoneta con cofre", "item.create.chocolate_bucket": "Cubo de chocolate", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Compuesto cromático", "item.create.cinder_flour": "Harina de ceniza", "item.create.copper_ingot": "Lingote de cobre", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Blockzapper", "item.create.handheld_worldshaper": "Worldshaper", "item.create.honey_bucket": "Cubo de miel", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "Chip de circuito integrado", "item.create.iron_sheet": "Lámina de hierro", "item.create.lapis_sheet": "Lámina de lapislázuli", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Esquema y Pluma", "item.create.shadow_steel": "Acero sombrío", "item.create.super_glue": "Super Pegamento", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Fertilizador de árboles", "item.create.vertical_gearbox": "Caja de transmisión vertical", "item.create.wand_of_symmetry": "Varita de simetría", 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 dcf01e843..6ba4f32e8 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: 900", + "_": "Missing Localizations: 903", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "Té del Constructor", "item.create.chest_minecart_contraption": "Artefacto de Vagón con Cofre", "item.create.chocolate_bucket": "Cubeta de Chocolate", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Compuesto Cromático", "item.create.cinder_flour": "Ceniza Molida", "item.create.copper_ingot": "Lingote de Cobre", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Pistola de Manipulación de Bloques", "item.create.handheld_worldshaper": "Pistola de Manipulación de Mundo", "item.create.honey_bucket": "Cubeta de Miel", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "Circuito Integrado", "item.create.iron_sheet": "Lámina de Hierro", "item.create.lapis_sheet": "Lámina de Lapislázuli", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Esquema y Pluma", "item.create.shadow_steel": "Acero Sombrío", "item.create.super_glue": "Super Pegamento", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Fertilizador de Árboles", "item.create.vertical_gearbox": "Transmisión Vertical", "item.create.wand_of_symmetry": "Vara de la Simetria", 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 4b55b1452..6ad32e75f 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: 682", + "_": "Missing Localizations: 685", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "Thé du constructeur", "item.create.chest_minecart_contraption": "Engin de wagonnet avec coffre", "item.create.chocolate_bucket": "Seau de chocolat", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Composé chromatique", "item.create.cinder_flour": "Farine de braise", "item.create.copper_ingot": "Lingot de cuivre", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Blockzappeur portable", "item.create.handheld_worldshaper": "Térraformeur portable", "item.create.honey_bucket": "Seau de miel", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "Circuit intégré", "item.create.iron_sheet": "Plaque de Fer", "item.create.lapis_sheet": "Feuille de lapis", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Schéma et plume", "item.create.shadow_steel": "Acier sombre", "item.create.super_glue": "Colle extra-forte", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Engrais pour arbres", "item.create.vertical_gearbox": "Boîte de transfert verticale", "item.create.wand_of_symmetry": "Bâton de symétrie", 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 26691dd55..d13863bd4 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: 17", + "_": "Missing Localizations: 20", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "Tè del costruttore", "item.create.chest_minecart_contraption": "Contrazione per carrello da miniera con baule", "item.create.chocolate_bucket": "Secchio di cioccolata", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Composto cromatico", "item.create.cinder_flour": "Cenere farinosa", "item.create.copper_ingot": "Lingotto di rame", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Zapper di blocchi portatile", "item.create.handheld_worldshaper": "Plasmatore del mondo portatile", "item.create.honey_bucket": "Secchio di miele", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "Circuito integrato", "item.create.iron_sheet": "Lamiera di ferro", "item.create.lapis_sheet": "Lamiera di lapislazzuli", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Schematica e penna d'oca", "item.create.shadow_steel": "Acciaio oscuro", "item.create.super_glue": "Super colla", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Fertilizzante per alberi", "item.create.vertical_gearbox": "Riduttore verticale", "item.create.wand_of_symmetry": "Asta di simmetria", 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 944c6577c..1a3e51cc8 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: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "建築家のお茶", "item.create.chest_minecart_contraption": "からくりチェストトロッコ", "item.create.chocolate_bucket": "チョコレート入りバケツ", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "色彩の化合物", "item.create.cinder_flour": "ネザーラックの粉", "item.create.copper_ingot": "銅インゴット", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "携帯ブロックザッパー", "item.create.handheld_worldshaper": "携帯ワールドシェーパー", "item.create.honey_bucket": "ハチミツ入りバケツ", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "集積回路", "item.create.iron_sheet": "鉄板", "item.create.lapis_sheet": "ラピスラズリ板", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "概略図と羽根ペン", "item.create.shadow_steel": "シャドウスチール", "item.create.super_glue": "接着剤", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "樹木の肥料", "item.create.vertical_gearbox": "垂直ギアボックス", "item.create.wand_of_symmetry": "対称の杖", 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 a85e949d8..141d5a8fc 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: 71", + "_": "Missing Localizations: 74", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "건축가의 차", "item.create.chest_minecart_contraption": "상자가 실린 광산 수레 장치", "item.create.chocolate_bucket": "초콜릿 양동이", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "색채 혼합물", "item.create.cinder_flour": "잿가루", "item.create.copper_ingot": "구리 주괴", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "휴대용 블록발사기", "item.create.handheld_worldshaper": "휴대용 세계편집기", "item.create.honey_bucket": "꿀 양동이", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "집적 회로", "item.create.iron_sheet": "철 판", "item.create.lapis_sheet": "청금석 판", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "청사진과 깃펜", "item.create.shadow_steel": "그림자 강철", "item.create.super_glue": "강력 접착제", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "나무 비료", "item.create.vertical_gearbox": "수직 기어박스", "item.create.wand_of_symmetry": "대칭의 지팡이", 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 81bdb6aec..3703e1c17 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: 1169", + "_": "Missing Localizations: 1172", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "UNLOCALIZED: Builder's Tea", "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", "item.create.copper_ingot": "Koperstaaf", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Blokzapper", "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.iron_sheet": "IJzeren Platen", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Bouwtekening en Veer", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Boom mest", "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", "item.create.wand_of_symmetry": "Symmetrie Staf", 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 05dab7dd4..4af028159 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: 1235", + "_": "Missing Localizations: 1238", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "UNLOCALIZED: Builder's Tea", "item.create.chest_minecart_contraption": "UNLOCALIZED: Chest Minecart Contraption", "item.create.chocolate_bucket": "UNLOCALIZED: Chocolate Bucket", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "UNLOCALIZED: Chromatic Compound", "item.create.cinder_flour": "UNLOCALIZED: Cinder Flour", "item.create.copper_ingot": "UNLOCALIZED: Copper Ingot", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Blockzapper Portátil", "item.create.handheld_worldshaper": "UNLOCALIZED: Handheld Worldshaper", "item.create.honey_bucket": "UNLOCALIZED: Honey Bucket", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "UNLOCALIZED: Integrated Circuit", "item.create.iron_sheet": "Placas de Ferro", "item.create.lapis_sheet": "UNLOCALIZED: Lapis Sheet", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Esquema e pena", "item.create.shadow_steel": "UNLOCALIZED: Shadow Steel", "item.create.super_glue": "UNLOCALIZED: Super Glue", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Fertilizante de Árvore", "item.create.vertical_gearbox": "UNLOCALIZED: Vertical Gearbox", "item.create.wand_of_symmetry": "Varinha de Simetria", 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 11847d2f5..90d8c8487 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: 21", + "_": "Missing Localizations: 24", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "Чай Строителя", "item.create.chest_minecart_contraption": "Сундуко-вагонеточная штуковина", "item.create.chocolate_bucket": "Ведро шоколада", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "Хроматический компаунд", "item.create.cinder_flour": "Незераковая пыль", "item.create.copper_ingot": "Медный слиток", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "Ручная блоковая пушка", "item.create.handheld_worldshaper": "Ручной редактор мира", "item.create.honey_bucket": "Ведро мёда", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "Интегральная схема", "item.create.iron_sheet": "Железный лист", "item.create.lapis_sheet": "Лазуритовый лист", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "Схематика и перо", "item.create.shadow_steel": "Призрачная сталь", "item.create.super_glue": "Супер-клей", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "Удобрение для деревьев", "item.create.vertical_gearbox": "Вертикальная коробка передач", "item.create.wand_of_symmetry": "Жезл симметрии", 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 f43795167..82f3fbf24 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: 19", + "_": "Missing Localizations: 22", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "建造工茶饮", "item.create.chest_minecart_contraption": "装配过的动力矿车", "item.create.chocolate_bucket": "巧克力桶", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "异彩化合物", "item.create.cinder_flour": "下界面粉", "item.create.copper_ingot": "铜锭", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "手持式方块放置器", "item.create.handheld_worldshaper": "手持式环境塑形器", "item.create.honey_bucket": "蜂蜜桶", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "集成电路板", "item.create.iron_sheet": "铁板", "item.create.lapis_sheet": "青金石板", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "蓝图与笔", "item.create.shadow_steel": "暗影钢", "item.create.super_glue": "强力胶", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "树木肥料", "item.create.vertical_gearbox": "竖直十字齿轮箱", "item.create.wand_of_symmetry": "对称之杖", 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 525b6b7e0..991403374 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: 24", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -429,6 +429,7 @@ "item.create.builders_tea": "工人茶", "item.create.chest_minecart_contraption": "裝修過的機械礦車", "item.create.chocolate_bucket": "巧克力桶", + "item.create.chocolate_glazed_berries": "UNLOCALIZED: Chocolate Glazed Berries", "item.create.chromatic_compound": "異彩化合物", "item.create.cinder_flour": "地獄麵粉", "item.create.copper_ingot": "銅錠", @@ -462,6 +463,7 @@ "item.create.handheld_blockzapper": "方塊放置器", "item.create.handheld_worldshaper": "地形雕塑器", "item.create.honey_bucket": "蜂蜜桶", + "item.create.honeyed_apple": "UNLOCALIZED: Honeyed Apple", "item.create.integrated_circuit": "IC板", "item.create.iron_sheet": "鐵板", "item.create.lapis_sheet": "青金石板", @@ -478,6 +480,7 @@ "item.create.schematic_and_quill": "藍圖與筆", "item.create.shadow_steel": "暗影鋼", "item.create.super_glue": "強力膠", + "item.create.sweet_roll": "UNLOCALIZED: Sweet Roll", "item.create.tree_fertilizer": "樹木肥料", "item.create.vertical_gearbox": "豎直齒輪箱", "item.create.wand_of_symmetry": "對稱杖", diff --git a/src/generated/resources/assets/create/models/item/chocolate_glazed_berries.json b/src/generated/resources/assets/create/models/item/chocolate_glazed_berries.json new file mode 100644 index 000000000..d556cc478 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/chocolate_glazed_berries.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/chocolate_glazed_berries" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/goggles.json b/src/generated/resources/assets/create/models/item/goggles.json new file mode 100644 index 000000000..0ae90a266 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/goggles.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/goggles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/honeyed_apple.json b/src/generated/resources/assets/create/models/item/honeyed_apple.json new file mode 100644 index 000000000..9940c5fab --- /dev/null +++ b/src/generated/resources/assets/create/models/item/honeyed_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/honeyed_apple" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/models/item/sweet_roll.json b/src/generated/resources/assets/create/models/item/sweet_roll.json new file mode 100644 index 000000000..a7cb2e8f3 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/sweet_roll.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "create:item/sweet_roll" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/filling/chocolate_glazed_berries.json b/src/generated/resources/data/create/recipes/filling/chocolate_glazed_berries.json new file mode 100644 index 000000000..0ce5553a5 --- /dev/null +++ b/src/generated/resources/data/create/recipes/filling/chocolate_glazed_berries.json @@ -0,0 +1,18 @@ +{ + "type": "create:filling", + "ingredients": [ + { + "item": "minecraft:sweet_berries" + }, + { + "fluid": "create:chocolate", + "nbt": {}, + "amount": 250 + } + ], + "results": [ + { + "item": "create:chocolate_glazed_berries" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/filling/honeyed_apple.json b/src/generated/resources/data/create/recipes/filling/honeyed_apple.json new file mode 100644 index 000000000..93692da87 --- /dev/null +++ b/src/generated/resources/data/create/recipes/filling/honeyed_apple.json @@ -0,0 +1,17 @@ +{ + "type": "create:filling", + "ingredients": [ + { + "item": "minecraft:apple" + }, + { + "fluidTag": "forge:honey", + "amount": 250 + } + ], + "results": [ + { + "item": "create:honeyed_apple" + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/filling/sweet_roll.json b/src/generated/resources/data/create/recipes/filling/sweet_roll.json new file mode 100644 index 000000000..b80ab581b --- /dev/null +++ b/src/generated/resources/data/create/recipes/filling/sweet_roll.json @@ -0,0 +1,17 @@ +{ + "type": "create:filling", + "ingredients": [ + { + "item": "minecraft:bread" + }, + { + "fluidTag": "forge:milk", + "amount": 250 + } + ], + "results": [ + { + "item": "create:sweet_roll" + } + ] +} \ 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..bd23757e2 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -117,6 +117,8 @@ public class AllBlockPartials { SPEED_CONTROLLER_BRACKET = get("rotation_speed_controller/bracket"), + GOGGLES = get("goggles"), + COUPLING_ATTACHMENT = getEntity("minecart_coupling/attachment"), COUPLING_RING = getEntity("minecart_coupling/ring"), COUPLING_CONNECTOR = getEntity("minecart_coupling/connector") diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 292e50d91..698b61e36 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -16,6 +16,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.glu import com.simibubi.create.content.contraptions.components.structureMovement.mounted.MinecartContraptionItem; import com.simibubi.create.content.contraptions.components.structureMovement.train.MinecartCouplingItem; import com.simibubi.create.content.contraptions.goggles.GogglesItem; +import com.simibubi.create.content.contraptions.goggles.GogglesModel; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlockItem; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorItem; import com.simibubi.create.content.contraptions.relays.gearbox.VerticalGearboxItem; @@ -117,6 +118,24 @@ public class AllItems { .lang("Bar of Chocolate") .register(); + public static final ItemEntry SWEET_ROLL = REGISTRATE.item("sweet_roll", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(6) + .saturation(1.0F) + .build())) + .register(); + + public static final ItemEntry CHOCOLATE_BERRIES = REGISTRATE.item("chocolate_glazed_berries", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(7) + .saturation(0.7F) + .build())) + .register(); + + public static final ItemEntry HONEYED_APPLE = REGISTRATE.item("honeyed_apple", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(8) + .saturation(0.6F) + .build())) + .register(); + public static final ItemEntry BUILDERS_TEA = REGISTRATE.item("builders_tea", BuildersTeaItem::new) .tag(AllItemTags.UPRIGHT_ON_BELT.tag) .properties(p -> p.maxStackSize(16)) @@ -189,7 +208,7 @@ public class AllItems { public static final ItemEntry GOGGLES = REGISTRATE.item("goggles", GogglesItem::new) .properties(p -> p.maxStackSize(1)) - .model(AssetLookup.existingItemModel()) + .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) .lang("Engineer's Goggles") .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java new file mode 100644 index 000000000..333f65bbd --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/GogglesModel.java @@ -0,0 +1,24 @@ +package com.simibubi.create.content.contraptions.goggles; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.block.render.WrappedBakedModel; + +import net.minecraft.client.renderer.model.IBakedModel; +import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType; + +public class GogglesModel extends WrappedBakedModel { + + public GogglesModel(IBakedModel template) { + super(template); + } + + @Override + public IBakedModel handlePerspective(TransformType cameraTransformType, MatrixStack mat) { + if (cameraTransformType == TransformType.HEAD) + return AllBlockPartials.GOGGLES.get() + .handlePerspective(cameraTransformType, mat); + return super.handlePerspective(cameraTransformType, mat); + } + +} \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java index 1b4a7f3fa..48486180e 100644 --- a/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java +++ b/src/main/java/com/simibubi/create/foundation/data/recipe/FillingRecipeGen.java @@ -26,6 +26,18 @@ public class FillingRecipeGen extends ProcessingRecipeGen { BLAZE_CAKE = create("blaze_cake", b -> b.require(Fluids.LAVA, 250) .require(AllItems.BLAZE_CAKE_BASE.get()) .output(AllItems.BLAZE_CAKE.get())), + + HONEYED_APPLE = create("honeyed_apple", b -> b.require(AllTags.forgeFluidTag("honey"), 250) + .require(Items.APPLE) + .output(AllItems.HONEYED_APPLE.get())), + + SWEET_ROLL = create("sweet_roll", b -> b.require(AllTags.forgeFluidTag("milk"), 250) + .require(Items.BREAD) + .output(AllItems.SWEET_ROLL.get())), + + CHOCOLATE_BERRIES = create("chocolate_glazed_berries", b -> b.require(AllFluids.CHOCOLATE.get(), 250) + .require(Items.SWEET_BERRIES) + .output(AllItems.CHOCOLATE_BERRIES.get())), GRASS_BLOCK = create("grass_block", b -> b.require(Fluids.WATER, 500) .require(Items.DIRT) diff --git a/src/main/resources/assets/create/models/item/goggles.json b/src/main/resources/assets/create/models/block/goggles.json similarity index 86% rename from src/main/resources/assets/create/models/item/goggles.json rename to src/main/resources/assets/create/models/block/goggles.json index 5dbe10332..b91727c27 100644 --- a/src/main/resources/assets/create/models/item/goggles.json +++ b/src/main/resources/assets/create/models/block/goggles.json @@ -4,7 +4,7 @@ "textures": { "0": "create:block/brass_casing", "1": "block/black_stained_glass", - "2": "create:item/goggles", + "2": "create:item/goggles_model", "particle": "create:block/brass_casing" }, "elements": [ @@ -13,7 +13,7 @@ "from": [11, 7, 3], "to": [12, 8, 4], "faces": { - "north": {"uv": [11, 0, 12, 1], "texture": "#0"}, + "north": {"uv": [8, 1, 9, 2], "texture": "#0"}, "east": {"uv": [10, 0, 11, 1], "texture": "#0"}, "south": {"uv": [11, 8, 12, 9], "texture": "#0"}, "west": {"uv": [4, 0, 5, 1], "texture": "#0"}, @@ -26,7 +26,7 @@ "from": [4, 7, 3], "to": [5, 8, 4], "faces": { - "north": {"uv": [11, 0, 12, 1], "texture": "#0"}, + "north": {"uv": [14, 1, 15, 2], "texture": "#0"}, "east": {"uv": [10, 0, 11, 1], "texture": "#0"}, "south": {"uv": [11, 8, 12, 9], "texture": "#0"}, "west": {"uv": [4, 0, 5, 1], "texture": "#0"}, @@ -39,11 +39,11 @@ "from": [9, 8, 3], "to": [11, 9, 4], "faces": { - "north": {"uv": [7, 0, 9, 1], "texture": "#0"}, + "north": {"uv": [3, 1, 5, 2], "texture": "#0"}, "east": {"uv": [6, 0, 7, 1], "texture": "#0"}, "south": {"uv": [7, 0, 9, 1], "texture": "#0"}, "west": {"uv": [7, 0, 8, 1], "texture": "#0"}, - "up": {"uv": [7, 1, 9, 2], "texture": "#0"}, + "up": {"uv": [6, 1, 8, 2], "texture": "#0"}, "down": {"uv": [7, 0, 9, 1], "texture": "#0"} } }, @@ -52,7 +52,7 @@ "from": [7, 7, 3], "to": [9, 8, 4], "faces": { - "north": {"uv": [7, 0, 9, 1], "texture": "#0"}, + "north": {"uv": [7, 1, 9, 2], "texture": "#0"}, "east": {"uv": [6, 0, 7, 1], "texture": "#0"}, "south": {"uv": [7, 0, 9, 1], "texture": "#0"}, "west": {"uv": [7, 0, 8, 1], "texture": "#0"}, @@ -66,11 +66,11 @@ "to": [7, 9, 4], "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 9, 1], "texture": "#0"}, + "north": {"uv": [10, 1, 12, 2], "texture": "#0"}, "east": {"uv": [6, 0, 7, 1], "texture": "#0"}, "south": {"uv": [7, 0, 9, 1], "texture": "#0"}, "west": {"uv": [7, 0, 8, 1], "texture": "#0"}, - "up": {"uv": [12, 1, 14, 2], "texture": "#0"}, + "up": {"uv": [10, 1, 12, 2], "texture": "#0"}, "down": {"uv": [7, 0, 9, 1], "texture": "#0"} } }, @@ -79,7 +79,7 @@ "from": [9, 6, 3], "to": [11, 7, 4], "faces": { - "north": {"uv": [7, 0, 9, 1], "texture": "#0"}, + "north": {"uv": [13, 14, 15, 15], "texture": "#0"}, "east": {"uv": [6, 0, 7, 1], "texture": "#0"}, "south": {"uv": [7, 0, 9, 1], "texture": "#0"}, "west": {"uv": [7, 0, 8, 1], "texture": "#0"}, @@ -93,7 +93,7 @@ "to": [7, 7, 4], "rotation": {"angle": 0, "axis": "y", "origin": [4, 8, 8]}, "faces": { - "north": {"uv": [7, 0, 9, 1], "texture": "#0"}, + "north": {"uv": [13, 14, 15, 15], "texture": "#0"}, "east": {"uv": [6, 0, 7, 1], "texture": "#0"}, "south": {"uv": [7, 0, 9, 1], "texture": "#0"}, "west": {"uv": [7, 0, 8, 1], "texture": "#0"}, @@ -103,8 +103,9 @@ }, { "name": "glass", - "from": [5, 7, 3.5], - "to": [11, 8, 3.5], + "from": [5, 7, 3.3], + "to": [11, 8, 3.3], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 8, 7.8]}, "faces": { "north": {"uv": [1, 0, 7, 1], "texture": "#1"}, "east": {"uv": [11, 0, 11.2, 1], "texture": "#1"}, diff --git a/src/main/resources/assets/create/textures/item/builders_tea.png b/src/main/resources/assets/create/textures/item/builders_tea.png index 57428406785fc8401143f1fbfa17537a3d90d756..55870a490ae49ee016db6daf70625003f7e444f8 100644 GIT binary patch delta 372 zcmV-)0gL{a0)zvQ8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00BNpL_t(IjpdQQO9EjS z$3GV>88~E0dZ30#4uO9`3Awd8v?Mh24@m26Nkbs6O%b@}6x0Y{122H8BuOzMA%MQA3VJ}Vt+re?f=iO)8tEgj5-Tq z`3Uc$FW&BKpSQ6}?i)+d8#^4TTZ;E$`3R%V0)U-V^!EgPV<{$g|EZwW?&*q|}67Y6Qrk0-lIhnTIg)pWqwzkc*xT So{Up978mMr=E2bJ8HnfdO^OXU{^IYE1-;PsdM_Nm#pW$qNUg(3MK^4&J7#FEXm%Pdsq*;hTNYc?TSFR^M@u ywmkHKV?p5OhF#|`O+3f^W8?GHZ1Ya-VfcB8GrC6g;bowO44$rjF6*2U7@Gi{I&3ch diff --git a/src/main/resources/assets/create/textures/item/chocolate_glazed_berries.png b/src/main/resources/assets/create/textures/item/chocolate_glazed_berries.png new file mode 100644 index 0000000000000000000000000000000000000000..29e0f3c161ea1967184c359eb490343ec95b850c GIT binary patch literal 427 zcmV;c0aX5pP)Px$Wl2OqR5*>zk}*pHVI0PPZ-^+A9;K0K2!Wt3H8{97xH|L=oNVdq1TFOq8d{YI zmmC_hL2rtVu8g}=?leeDcpK!7JLTqjrWfA#dH&D;d0zNyh_H)Bxgy>3b^kH+T_lWL zFUHAdl4wH*sK_vpjWFeWCJBIM|DYRMK-}*x;Yn9$`$Aqm#aucLD)8fnEwK+}$~7NWZ^KzHJZV2yDuIx6a&DGsWKvNzcd z1iJxHOQq#>KBqfzJZt_MUA%Q)1Oz{p=fF?a4UNtqvR30NIS}G1YN@ohrF2s+aSyMV?GxCu8P z-GZ|&#s##v00(v8KtX~76-_Zj0wIvW>!b?tZ(MptXK>GV4+s9Y29Be8<+6HolY11- znMVY`QL_3*&v#ENu8q*}<5QgMUlht-hwN&C`HaiClAvmTfW8c>@4VFQ`$n$7R zN!~PRO9{Xs3^9bDZdm{v(=^lQ>14*fuNgw9X_D|Un=uiBg0AE3_vZ%y&y@;a>-F^p zL)TUPR*T7EL0H|gIHoDfAfTY@yfhlrEsM8KhbWHEZ88lGVaWS0c{HDEL)TSpDf!&( xm@F2IHXCgj1nSiGYQ#$o97lQkeP*z~sUP)^gQFE$>zn`p002ovPDHLkV1ghdon-(3 delta 349 zcmV-j0iyng1BC;SF@HZvL_t(IjopwzYQjJmgeipT zTgxWr0D$L4<0|ALz!gHhG@FQ}gvA(iLast;fS=AL=lDv~@_+3Tqylh-P-&LIrWC6@ zhfOH}z+&twL^}_Y!9b0>U99pPv6L`5$LD^JhgJ)7&np*nLU1e!ETTxOB-kVgW>=0076LsGM+r9u`rg>4d0No@4HLSP}w@F$7^)8UVm!r-P5}w%)D?7obl z9z_6IBRX(5(O`J;?hA%Na0a^O!*}1K7;dX9_#fFIm?11M1u)I%8qp2ZR{DZs5hDWw z14DbH)&Hn$eTHRIFTy1%mmfnhs6Eo^Ka34iTeV*}{A2IZ9iD0m+`v$c` zh@sa;km1E+NDP!t_r{PraO6D$JPagcd7-unF{r7kLKR+Mz$f?O@n?hqmCKJYzIgok ze{ZB5gOvU|1~LW)28OKtdXy97;gt+vvgr3Z{SpF z{z*hZR5(v#{Qv(y13AD+S@6Fw7aIc;lur_H*OmUSr6|U*`tnOgl3d`fBlZ8=_wNjn zJRA(GEkr5J(p?VVkpMUwmz{SbQ zuAD2_%74PamZ0E;Mv UJ>mpbg8%>k07*qoM6N<$f&hw%>;M1& diff --git a/src/main/resources/assets/create/textures/item/goggles_model.png b/src/main/resources/assets/create/textures/item/goggles_model.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6467f88cdeff586de4cb5b3c6c48676c39e188 GIT binary patch literal 361 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!GE4Ejv*HQ$$$R;w`aCI;2HU0zk#?kv+xvu zp@QpE|E*uDacsk{Pu^~mVjiqh{`&v+_xC)LY-D&=>)EBVbPAdr2zCAOzh2Fa%}gwe zjZrSGEp_?42Gc_fizjQz-{`2_Znwz8Vg=W~=Z_vGJz%aXI{I_DM$rj|H%$(@7yr+R z(czh2XJBZs`Csw_maIn)o+U*TywLOOHE<}?IlvIPv4P1!??AhA$&r87TAUBc)XaQO zNU&_0d-dOL#>E0>9GO`TH%t^1>RVVP^nZT+&w~e!o;Px$$Vo&&R5*>bkWFh7Q51%so5Yz(Z1dqFQ>oNKMU)H_L2+L&T|{uxjeEBi6#NJN z0CB5(36vnpAW5Oic9CuZnZsI^XyqiPFtaHaj?Ihr zX`LkzC7xa-p0Fjr7of70^j+i+dLqB0qnaJ+e*-iT;o7}(2{w;jKE^JVaJ~xGZh88w zp;93!IUBJ5{ak$hqZ4yLWh*JyR>x!w6@X0Ptv5I+)3r?Ba;HARX)5FodLrOpz9o|@ z(6vmu=I+AZJN3~*&kynNC<=gGERo3-0*~hRtfAsG72ehQi-3#vSlQY z3j%&ABd(%xcogM+LZw{=7-1JnUJgo%xGY*seT}#X*oh}ui9~5@uFUn9{l1lO0X*?+%HE(C8t6Zr-*>{NM|&rJ Q;{X5v07*qoM6N<$g3HkA;Q#;t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/item/sweet_roll.png b/src/main/resources/assets/create/textures/item/sweet_roll.png new file mode 100644 index 0000000000000000000000000000000000000000..7fdf41754b913d90ae09e4260e034333b0b83bc1 GIT binary patch literal 417 zcmV;S0bc%zP)Px$TS-JgR5*>zlCf&SP!xtgZI@=u(i$X@vnWo2;N%c8b!eAP(#dy_w$D&^X`evE z!9|DSU>&4`Ah;-W2^u7Ia%=3C4%Rdpo!bK!?mhROpYQ*<@YfYPcG0d^{qXtv_WtPG z$l#~@=KEhxWbKPa2-@|kZ<$3DHOX{5#I|h!M1*XvfVW!E>koElPQwBs0zjwLz%q+u za|Hmr)q+l|!PQMELLA?2nq|XJ=^Bcf1VB-fc&i1|@sM7BfMpi(RtrRgX4&u~0su3| z1;8?kbXpA*HAza>*xH&oE-78xAqXstmT+d Date: Wed, 3 Mar 2021 02:34:57 +0100 Subject: [PATCH 043/124] Fixed honey bottles on belt/depots --- src/generated/resources/.cache/cache | 4 +- .../create/blockstates/radial_chassis.json | 72 +++++++++---------- .../create/tags/items/upright_on_belt.json | 3 +- .../java/com/simibubi/create/AllTags.java | 3 +- 4 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index c4027857d..3f277f4a4 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 @@ -3547,7 +3547,7 @@ eac71740fb12bdb38b5dfaa2268613d7ba82b809 data/create/tags/blocks/windmill_sails. 081f5aa35602fc27af2ca01ea9f2fd5e7eb284dc data/create/tags/items/create_ingots.json 94c62bf22678ef55b2b8a5398a7960e5b00682dc data/create/tags/items/crushed_ores.json 6cdeeac1689f7b5bfd9bc40b462143d8eaf3ad0b data/create/tags/items/seats.json -43ae6f21db7b43984e163af11f4e6cc80459803a data/create/tags/items/upright_on_belt.json +c7efc23c08d5e3602c84ff43dac18f72b1cfced3 data/create/tags/items/upright_on_belt.json 50936b211d94167a35ec78c89954082a336b6269 data/create/tags/items/valve_handles.json 16bcb8fcbe9170c2c11f1ca8d99d8b36cd812bbd data/forge/tags/blocks/glass/colorless.json 81ced867d24ec814942909965dd4576eff1db685 data/forge/tags/blocks/glass_panes.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/data/create/tags/items/upright_on_belt.json b/src/generated/resources/data/create/tags/items/upright_on_belt.json index 83603f5b0..0aa3286d8 100644 --- a/src/generated/resources/data/create/tags/items/upright_on_belt.json +++ b/src/generated/resources/data/create/tags/items/upright_on_belt.json @@ -7,6 +7,7 @@ "minecraft:glass_bottle", "minecraft:potion", "minecraft:splash_potion", - "minecraft:lingering_potion" + "minecraft:lingering_potion", + "minecraft:honey_bottle" ] } \ No newline at end of file diff --git a/src/main/java/com/simibubi/create/AllTags.java b/src/main/java/com/simibubi/create/AllTags.java index 71bf7c9d2..f7ca2802d 100644 --- a/src/main/java/com/simibubi/create/AllTags.java +++ b/src/main/java/com/simibubi/create/AllTags.java @@ -176,7 +176,8 @@ public class AllTags { AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.BEACON_PAYMENT); AllItemTags.CREATE_INGOTS.includeIn(AllItemTags.INGOTS); - AllItemTags.UPRIGHT_ON_BELT.add(Items.GLASS_BOTTLE, Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION); + AllItemTags.UPRIGHT_ON_BELT.add(Items.GLASS_BOTTLE, Items.POTION, Items.SPLASH_POTION, Items.LINGERING_POTION, + Items.field_226638_pX_); AllBlockTags.WINDMILL_SAILS.includeAll(BlockTags.WOOL); From c1c6e5e04677387c06c27ccdad20a9dba4ccde71 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 Mar 2021 05:21:58 +0100 Subject: [PATCH 044/124] Controlled attachment - Added the Sticker, a redstone-driven block attachment component - Fixed lighting of TileEntities lowered by a pulley --- src/generated/resources/.cache/cache | 35 ++-- .../create/blockstates/radial_chassis.json | 72 ++++---- .../assets/create/blockstates/sticker.json | 108 ++++++++++++ .../resources/assets/create/lang/en_ud.json | 1 + .../resources/assets/create/lang/en_us.json | 1 + .../assets/create/lang/unfinished/de_de.json | 3 +- .../assets/create/lang/unfinished/es_es.json | 3 +- .../assets/create/lang/unfinished/es_mx.json | 3 +- .../assets/create/lang/unfinished/fr_fr.json | 3 +- .../assets/create/lang/unfinished/it_it.json | 3 +- .../assets/create/lang/unfinished/ja_jp.json | 3 +- .../assets/create/lang/unfinished/ko_kr.json | 3 +- .../assets/create/lang/unfinished/nl_nl.json | 3 +- .../assets/create/lang/unfinished/pt_br.json | 3 +- .../assets/create/lang/unfinished/ru_ru.json | 3 +- .../assets/create/lang/unfinished/zh_cn.json | 3 +- .../assets/create/lang/unfinished/zh_tw.json | 3 +- .../assets/create/models/item/sticker.json | 3 + .../crafting/kinetics/sticker.json | 32 ++++ .../create/loot_tables/blocks/sticker.json | 19 ++ .../recipes/crafting/kinetics/sticker.json | 24 +++ .../com/simibubi/create/AllBlockPartials.java | 2 + .../java/com/simibubi/create/AllBlocks.java | 10 ++ .../com/simibubi/create/AllTileEntities.java | 8 + .../category/animations/AnimatedKinetics.java | 2 +- .../category/animations/AnimatedMixer.java | 2 +- .../category/animations/AnimatedPress.java | 2 +- .../category/animations/AnimatedSpout.java | 2 +- .../base/KineticTileEntityRenderer.java | 2 +- .../components/actors/DrillRenderer.java | 2 +- .../components/actors/HarvesterRenderer.java | 2 +- .../components/deployer/DeployerRenderer.java | 4 +- .../components/fan/EncasedFanRenderer.java | 2 +- .../mixer/MechanicalMixerRenderer.java | 2 +- .../BlockMovementTraits.java | 7 + .../structureMovement/Contraption.java | 61 ++++--- .../ContraptionEntityRenderer.java | 2 +- .../chassis/StickerBlock.java | 162 ++++++++++++++++++ .../chassis/StickerRenderer.java | 48 ++++++ .../chassis/StickerTileEntity.java | 94 ++++++++++ .../gantry/GantryPinionRenderer.java | 2 +- .../processing/BasinRenderer.java | 2 +- .../burner/BlazeBurnerRenderer.java | 2 +- .../relays/belt/BeltRenderer.java | 2 +- .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../wrench/WrenchItemRenderer.java | 2 +- .../curiosities/ChromaticCompoundColor.java | 2 +- .../curiosities/symmetry/SymmetryHandler.java | 2 +- .../client/SymmetryWandItemRenderer.java | 2 +- .../tools/DeforesterItemRenderer.java | 2 +- .../tools/ExtendoGripItemRenderer.java | 2 +- .../blockzapper/BlockzapperItemRenderer.java | 2 +- .../WorldshaperItemRenderer.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 2 +- .../data/recipe/StandardRecipeGen.java | 11 +- .../render/TileEntityRenderHelper.java | 1 + .../render/backend/gl/BasicProgram.java | 2 +- .../utility/AnimationTickHolder.java | 2 +- .../create/models/block/sticker/block.json | 71 ++++++++ .../models/block/sticker/block_powered.json | 6 + .../create/models/block/sticker/head.json | 41 +++++ .../create/models/block/sticker/item.json | 104 +++++++++++ .../models/block/sticker/sticker.bbmodel | 1 + .../assets/create/textures/block/sticker.png | Bin 0 -> 1509 bytes .../create/textures/block/sticker_side.png | Bin 0 -> 6761 bytes .../textures/block/sticker_side_powered.png | Bin 0 -> 6836 bytes 67 files changed, 902 insertions(+), 114 deletions(-) create mode 100644 src/generated/resources/assets/create/blockstates/sticker.json create mode 100644 src/generated/resources/assets/create/models/item/sticker.json create mode 100644 src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json create mode 100644 src/generated/resources/data/create/loot_tables/blocks/sticker.json create mode 100644 src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java create mode 100644 src/main/resources/assets/create/models/block/sticker/block.json create mode 100644 src/main/resources/assets/create/models/block/sticker/block_powered.json create mode 100644 src/main/resources/assets/create/models/block/sticker/head.json create mode 100644 src/main/resources/assets/create/models/block/sticker/item.json create mode 100644 src/main/resources/assets/create/models/block/sticker/sticker.bbmodel create mode 100644 src/main/resources/assets/create/textures/block/sticker.png create mode 100644 src/main/resources/assets/create/textures/block/sticker_side.png create mode 100644 src/main/resources/assets/create/textures/block/sticker_side_powered.png diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 3f277f4a4..5edcb82e1 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 @@ -371,6 +371,7 @@ e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/speedometer.j 1cb7cdbefa0ff199263782809287854b9d85074c assets/create/blockstates/spout.json d62b7908119fa4f51715a186d0882b388bb25cab assets/create/blockstates/spruce_window.json 8d7dfa60630a8b4bae4e8eca5c66e1cfa34dda1f assets/create/blockstates/spruce_window_pane.json +5d7385d28a23dcfc95a221d36d82337908582726 assets/create/blockstates/sticker.json 3d93eabbb327aecc526beae9c62283f1d43eb710 assets/create/blockstates/sticky_mechanical_piston.json f385988cb6fa9c48b5d59a6942ec50ed2b60c8bf assets/create/blockstates/stockpile_switch.json e815bfd854c2653f10828bb11950f7fb991d7efc assets/create/blockstates/stressometer.json @@ -400,20 +401,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 -00e2b77dcc86224cd5a33aefaac01f20c90bcb40 assets/create/lang/en_ud.json -55638abca6ffa48e1059f2578ea6d76b8327f496 assets/create/lang/en_us.json -374dd193cb26eb590a4a66bf5c8e13f9743ddbdb assets/create/lang/unfinished/de_de.json -84b205e2a8c9539ab6da68aa8f7c91f1dbec0702 assets/create/lang/unfinished/es_es.json -3397c2fed7517a4c9b3b41ee081abb120ddf9b3b assets/create/lang/unfinished/es_mx.json -e61eb3ca3d279c438275fb50333b135560574e62 assets/create/lang/unfinished/fr_fr.json -eaa202ec1821372b5f26d724e7c58d710fda7f5b assets/create/lang/unfinished/it_it.json -d1627e59cf6cf5ac2382397a7db416e75072ac31 assets/create/lang/unfinished/ja_jp.json -39f4258b8d9d56c5d7e5761065081d69ab07d4d8 assets/create/lang/unfinished/ko_kr.json -402c16cffdd530dfde3e016691720145cc66c7a1 assets/create/lang/unfinished/nl_nl.json -73f22223f6d30068ac2bc3f9be02e43f7fe4cae0 assets/create/lang/unfinished/pt_br.json -015a444814ec9982c35d08a3705df3861ce2545e assets/create/lang/unfinished/ru_ru.json -38ed221082ce3ce7b4f6c93ec28b7e89a95cab06 assets/create/lang/unfinished/zh_cn.json -e51b6bd8cd9696858a417d3d9472a263e9268dd8 assets/create/lang/unfinished/zh_tw.json +369f9c6fce0aa11d70efa2e73a4ba2ff12e57e37 assets/create/lang/en_ud.json +10f9c238cdc8b68246c5663bc9745942d1014927 assets/create/lang/en_us.json +c46eabdb4476c18f539c95c24259a3fe1ee9cbff assets/create/lang/unfinished/de_de.json +551cd06b553080815a129d6b113473efde3fb5ac assets/create/lang/unfinished/es_es.json +1bac8afa8f92030077db8d921fd9dda30c0e8a5a assets/create/lang/unfinished/es_mx.json +d62993dd6f73224cbc17f04ea96022c4ac385dc4 assets/create/lang/unfinished/fr_fr.json +749274555f9b3edc9d7799a7147d724fd7993c66 assets/create/lang/unfinished/it_it.json +7e9723798c1459780b2814145eb6a0dc681a2281 assets/create/lang/unfinished/ja_jp.json +2d1da43b76d2184df5b183641241478e1c101218 assets/create/lang/unfinished/ko_kr.json +9cea3a5a2fe4e2c6d966f3c91b24e9d6595a9cc6 assets/create/lang/unfinished/nl_nl.json +e7299620ca48f296d678c87470358816f23d7578 assets/create/lang/unfinished/pt_br.json +6fd3ef5962b10f83e5df7dd0fbdb50cadee1a06b assets/create/lang/unfinished/ru_ru.json +b0688d7e4c593c0ed4fc87ea0b4e52205dcdeec8 assets/create/lang/unfinished/zh_cn.json +ff1c97c854da7b7bfe6be829c9bf6a787f6dfacd 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 @@ -1544,6 +1545,7 @@ d6fb0d38b1b5bcc199b52ac8889eaecd167f6725 assets/create/models/item/speedometer.j b9abe1331d49871838231f3a8e5d2973634e9325 assets/create/models/item/spout.json b305e81f1dc5272634745b6e822af40955a2ef28 assets/create/models/item/spruce_window.json 5f622bca8386b8dd077310647e39ac3abb80c6a1 assets/create/models/item/spruce_window_pane.json +bb546e5342c6d1a6b4040cf7ccdd2f10c6f79965 assets/create/models/item/sticker.json 891abc24593d53d282773eca5534065056d89b4c assets/create/models/item/sticky_mechanical_piston.json bbb5773adc23128c70174bfc531af936e6e063e3 assets/create/models/item/stockpile_switch.json bab8f78c319b2a79ed55c5d2a94b521ddaa44996 assets/create/models/item/stressometer.json @@ -1816,6 +1818,7 @@ cd8cefee21a1690f9158b8e8661a92d20ad0f535 data/create/advancements/recipes/create e8a5d924ccf30b6eae4b9ec0a8040e31f0eb165b data/create/advancements/recipes/create.base/crafting/kinetics/speedometer.json 90ff137eb1533695d9d17296ed180c0a88ddd891 data/create/advancements/recipes/create.base/crafting/kinetics/speedometerfrom_conversion.json 44867af16ec6d960268747effcd578ab55e3a366 data/create/advancements/recipes/create.base/crafting/kinetics/spout.json +8c7fd72b8b4d414a61859dd08857e8538d84f88b data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json 3859abc8839e92b01461d3e9ef853a4934c3256b data/create/advancements/recipes/create.base/crafting/kinetics/sticky_mechanical_piston.json 9a4dad31370d9e71308afe5c3f9349b67f749635 data/create/advancements/recipes/create.base/crafting/kinetics/stressometerfrom_conversion.json f3fc3d4fee0712906f833aa17185f0bacb21922f data/create/advancements/recipes/create.base/crafting/kinetics/super_glue.json @@ -2665,6 +2668,7 @@ b127cb6920e6d7d9c8b2402cb186402a9a8dd3fc data/create/loot_tables/blocks/shaft.js f6c497d625de67ea9377e840208b1be539d13b73 data/create/loot_tables/blocks/spout.json a23a1e332c9ba84474e3c0588e8a0857afe346e0 data/create/loot_tables/blocks/spruce_window.json 3ee2350936ea82fef716bc58e4cd088a384616f0 data/create/loot_tables/blocks/spruce_window_pane.json +111a3bb893abb899652a923b10ca7dc5ea424e5f data/create/loot_tables/blocks/sticker.json 8d2970acd61b96844a4308d87e858b1612d5862e data/create/loot_tables/blocks/sticky_mechanical_piston.json ec2889e712702644092197a4b41a682fb953817d data/create/loot_tables/blocks/stockpile_switch.json 3479775008a256bc35f98b31655975f7d5c836b2 data/create/loot_tables/blocks/stressometer.json @@ -2876,6 +2880,7 @@ a17db27e61baa45f8a6ecb46a6d2a5a464704f8b data/create/recipes/crafting/kinetics/s b1a74f0b51fa37ca1ed814266b3d69b8b7e69fa3 data/create/recipes/crafting/kinetics/speedometer.json 8d632845deeb723e1a56083536ee5f9d60de2fcb data/create/recipes/crafting/kinetics/speedometerfrom_conversion.json eea9d4066cd2fafef40b50b79323dcc603fa6388 data/create/recipes/crafting/kinetics/spout.json +e532a5c405e48b415e3fcd4f7c6183ea335cb915 data/create/recipes/crafting/kinetics/sticker.json 3be40664acfd150d0617bc138dc2dd9d54a21b3a data/create/recipes/crafting/kinetics/sticky_mechanical_piston.json af5854ee2fa3be195ad9abcdeebe6ed7306b651c data/create/recipes/crafting/kinetics/stressometerfrom_conversion.json 21f885a674603367b67e1e993c175638cbda9ea3 data/create/recipes/crafting/kinetics/super_glue.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/blockstates/sticker.json b/src/generated/resources/assets/create/blockstates/sticker.json new file mode 100644 index 000000000..1949f8b4e --- /dev/null +++ b/src/generated/resources/assets/create/blockstates/sticker.json @@ -0,0 +1,108 @@ +{ + "variants": { + "extended=false,facing=down,powered=false": { + "model": "create:block/sticker/block", + "x": 180 + }, + "extended=true,facing=down,powered=false": { + "model": "create:block/sticker/block", + "x": 180 + }, + "extended=false,facing=up,powered=false": { + "model": "create:block/sticker/block" + }, + "extended=true,facing=up,powered=false": { + "model": "create:block/sticker/block" + }, + "extended=false,facing=north,powered=false": { + "model": "create:block/sticker/block", + "x": 90 + }, + "extended=true,facing=north,powered=false": { + "model": "create:block/sticker/block", + "x": 90 + }, + "extended=false,facing=south,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 180 + }, + "extended=true,facing=south,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 180 + }, + "extended=false,facing=west,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 270 + }, + "extended=true,facing=west,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 270 + }, + "extended=false,facing=east,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 90 + }, + "extended=true,facing=east,powered=false": { + "model": "create:block/sticker/block", + "x": 90, + "y": 90 + }, + "extended=false,facing=down,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 180 + }, + "extended=true,facing=down,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 180 + }, + "extended=false,facing=up,powered=true": { + "model": "create:block/sticker/block_powered" + }, + "extended=true,facing=up,powered=true": { + "model": "create:block/sticker/block_powered" + }, + "extended=false,facing=north,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90 + }, + "extended=true,facing=north,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90 + }, + "extended=false,facing=south,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 180 + }, + "extended=true,facing=south,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 180 + }, + "extended=false,facing=west,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 270 + }, + "extended=true,facing=west,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 270 + }, + "extended=false,facing=east,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 90 + }, + "extended=true,facing=east,powered=true": { + "model": "create:block/sticker/block_powered", + "x": 90, + "y": 90 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/create/lang/en_ud.json b/src/generated/resources/assets/create/lang/en_ud.json index b9de24d4a..992efe5b8 100644 --- a/src/generated/resources/assets/create/lang/en_ud.json +++ b/src/generated/resources/assets/create/lang/en_ud.json @@ -372,6 +372,7 @@ "block.create.spout": "\u0287nodS", "block.create.spruce_window": "\u028Dopu\u0131M \u01DD\u0254n\u0279dS", "block.create.spruce_window_pane": "\u01DDu\u0250\u0500 \u028Dopu\u0131M \u01DD\u0254n\u0279dS", + "block.create.sticker": "\u0279\u01DD\u029E\u0254\u0131\u0287S", "block.create.sticky_mechanical_piston": "uo\u0287s\u0131\u0500 \u05DF\u0250\u0254\u0131u\u0250\u0265\u0254\u01DDW \u028E\u029E\u0254\u0131\u0287S", "block.create.stockpile_switch": "\u0265\u0254\u0287\u0131\u028DS \u01DD\u05DF\u0131d\u029E\u0254o\u0287S", "block.create.stressometer": "\u0279\u01DD\u0287\u01DD\u026Foss\u01DD\u0279\u0287S", diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 50fec28fc..eff9c55ae 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -375,6 +375,7 @@ "block.create.spout": "Spout", "block.create.spruce_window": "Spruce Window", "block.create.spruce_window_pane": "Spruce Window Pane", + "block.create.sticker": "Sticker", "block.create.sticky_mechanical_piston": "Sticky Mechanical Piston", "block.create.stockpile_switch": "Stockpile Switch", "block.create.stressometer": "Stressometer", 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 97b496027..e119df01b 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: 973", + "_": "Missing Localizations: 974", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Klebriger Mechanischer Kolben", "block.create.stockpile_switch": "Vorratssensor", "block.create.stressometer": "UNLOCALIZED: Stressometer", 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 c2b82e6a5..ef8b92ed9 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: 15", + "_": "Missing Localizations: 16", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Surtidor", "block.create.spruce_window": "Ventana de abeto", "block.create.spruce_window_pane": "Panel de ventana de abeto", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistón mecánico pegajoso", "block.create.stockpile_switch": "Interruptor de acopio", "block.create.stressometer": "Estresómetro", 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 6ba4f32e8..9b0d9f25f 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: 903", + "_": "Missing Localizations: 904", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Canaleta", "block.create.spruce_window": "Ventana de Abeto", "block.create.spruce_window_pane": "Panel de Ventana de Abeto", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistón Mecánico Pegajoso", "block.create.stockpile_switch": "Interruptor de Pila", "block.create.stressometer": "Estresómetro", 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 6ad32e75f..ec6b5cb05 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: 685", + "_": "Missing Localizations: 686", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Piston mécanique collant", "block.create.stockpile_switch": "Détecteur de stockage", "block.create.stressometer": "Stressomètre", 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 d13863bd4..74e8c9f8c 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: 20", + "_": "Missing Localizations: 21", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Spruzzo", "block.create.spruce_window": "Finestra di abete", "block.create.spruce_window_pane": "Pannello di finestra di abete", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistone meccanico appiccicoso", "block.create.stockpile_switch": "Interruttore accumulatore", "block.create.stressometer": "Stressometro", 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 1a3e51cc8..b877a56ef 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: 27", + "_": "Missing Localizations: 28", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "アイテム注液口", "block.create.spruce_window": "マツの窓", "block.create.spruce_window_pane": "マツの窓パネル", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "粘着メカニカルピストン", "block.create.stockpile_switch": "在庫スイッチ", "block.create.stressometer": "応力メーター", 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 141d5a8fc..f6dbbfaba 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: 74", + "_": "Missing Localizations: 75", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "수도꼭지", "block.create.spruce_window": "가문비나무 유리창", "block.create.spruce_window_pane": "가문비나무 유리판", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "끈끈이 기계식 피스톤", "block.create.stockpile_switch": "수량 스위치", "block.create.stressometer": "피로도 계측기", 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 3703e1c17..1fd9f8c71 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: 1172", + "_": "Missing Localizations: 1173", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Mechanische Zuiger", "block.create.stockpile_switch": "Voorraad Schakelaar", "block.create.stressometer": "Stressmeter", 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 4af028159..0536a2b6c 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: 1238", + "_": "Missing Localizations: 1239", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "UNLOCALIZED: Spout", "block.create.spruce_window": "UNLOCALIZED: Spruce Window", "block.create.spruce_window_pane": "UNLOCALIZED: Spruce Window Pane", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Pistão Mecânico Grudento", "block.create.stockpile_switch": "Disjuntor de Armazenamento", "block.create.stressometer": "UNLOCALIZED: Stressometer", 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 90d8c8487..fc9de42f9 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: 24", + "_": "Missing Localizations: 25", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "Дозатор", "block.create.spruce_window": "Еловое окно", "block.create.spruce_window_pane": "Панель из елового окна", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "Липкий механический поршень", "block.create.stockpile_switch": "Настраиваемый компаратор", "block.create.stressometer": "Динамометр", 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 82f3fbf24..18a87a456 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: 22", + "_": "Missing Localizations: 23", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "注液器", "block.create.spruce_window": "云杉窗户", "block.create.spruce_window_pane": "云杉窗户板", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "黏性动力活塞", "block.create.stockpile_switch": "存量转换器", "block.create.stressometer": "应力表", 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 991403374..d811d8311 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: 27", + "_": "Missing Localizations: 28", "_": "->------------------------] Game Elements [------------------------<-", @@ -376,6 +376,7 @@ "block.create.spout": "液體灌注器", "block.create.spruce_window": "雲杉木窗戶", "block.create.spruce_window_pane": "雲杉木窗戶片", + "block.create.sticker": "UNLOCALIZED: Sticker", "block.create.sticky_mechanical_piston": "黏性機械活塞", "block.create.stockpile_switch": "存量檢測器", "block.create.stressometer": "動能錶", diff --git a/src/generated/resources/assets/create/models/item/sticker.json b/src/generated/resources/assets/create/models/item/sticker.json new file mode 100644 index 000000000..b1367cf86 --- /dev/null +++ b/src/generated/resources/assets/create/models/item/sticker.json @@ -0,0 +1,3 @@ +{ + "parent": "create:block/sticker/item" +} \ No newline at end of file diff --git a/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json new file mode 100644 index 000000000..65c58bb33 --- /dev/null +++ b/src/generated/resources/data/create/advancements/recipes/create.base/crafting/kinetics/sticker.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:recipes/root", + "rewards": { + "recipes": [ + "create:crafting/kinetics/sticker" + ] + }, + "criteria": { + "has_item": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "item": "create:andesite_alloy" + } + ] + } + }, + "has_the_recipe": { + "trigger": "minecraft:recipe_unlocked", + "conditions": { + "recipe": "create:crafting/kinetics/sticker" + } + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/loot_tables/blocks/sticker.json b/src/generated/resources/data/create/loot_tables/blocks/sticker.json new file mode 100644 index 000000000..92ccdbe64 --- /dev/null +++ b/src/generated/resources/data/create/loot_tables/blocks/sticker.json @@ -0,0 +1,19 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "minecraft:item", + "name": "create:sticker" + } + ], + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ] + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json b/src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json new file mode 100644 index 000000000..71db9df8a --- /dev/null +++ b/src/generated/resources/data/create/recipes/crafting/kinetics/sticker.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shaped", + "pattern": [ + "ISI", + "CRC" + ], + "key": { + "I": { + "item": "create:andesite_alloy" + }, + "C": { + "tag": "forge:cobblestone" + }, + "R": { + "tag": "forge:dusts/redstone" + }, + "S": { + "tag": "forge:slimeballs" + } + }, + "result": { + "item": "create:sticker" + } +} \ 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 bd23757e2..727ecf78f 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -93,6 +93,8 @@ public class AllBlockPartials { SYMMETRY_PLANE = get("symmetry_effect/plane"), SYMMETRY_CROSSPLANE = get("symmetry_effect/crossplane"), SYMMETRY_TRIPLEPLANE = get("symmetry_effect/tripleplane"), + + STICKER_HEAD = get("sticker/head"), PORTABLE_STORAGE_INTERFACE_MIDDLE = get("portable_storage_interface/block_middle"), PORTABLE_STORAGE_INTERFACE_MIDDLE_POWERED = get("portable_storage_interface/block_middle_powered"), diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index aea45c42e..ac22dda0c 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -54,6 +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.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock.MinecartAnchorBlock; @@ -846,6 +847,15 @@ public class AllBlocks { .build() .register(); + public static final BlockEntry STICKER = REGISTRATE.block("sticker", StickerBlock::new) + .initialProperties(SharedProperties::stone) + .properties(Block.Properties::nonOpaque) + .addLayer(() -> RenderType::getCutoutMipped) + .blockstate((c, p) -> p.directionalBlock(c.get(), AssetLookup.forPowered(c, p))) + .item() + .transform(customItemModel()) + .register(); + public static final BlockEntry MECHANICAL_DRILL = REGISTRATE.block("mechanical_drill", DrillBlock::new) .initialProperties(SharedProperties::stone) .blockstate(BlockStateGen.directionalBlockProvider(true)) diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 7e24832ab..5b0c1e96b 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -51,6 +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.chassis.StickerRenderer; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; 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.mounted.CartAssemblerTileEntity; @@ -398,6 +400,12 @@ public class AllTileEntities { .validBlocks(AllBlocks.RADIAL_CHASSIS, AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) // .renderer(() -> renderer) .register(); + + public static final TileEntityEntry STICKER = Create.registrate() + .tileEntity("sticker", StickerTileEntity::new) + .validBlocks(AllBlocks.STICKER) + .renderer(() -> StickerRenderer::new) + .register(); public static final TileEntityEntry DRILL = Create.registrate() .tileEntity("drill", DrillTileEntity::new) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java index 2ff8f46ad..ef9e662ce 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedKinetics.java @@ -12,7 +12,7 @@ import net.minecraft.util.Direction.Axis; public abstract class AnimatedKinetics implements IDrawable { public static float getCurrentAngle() { - return ((AnimationTickHolder.getRenderTick()) * 4f) % 360; + return ((AnimationTickHolder.getRenderTime()) * 4f) % 360; } protected BlockState shaft(Axis axis) { diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java index a45e77ecd..2d3f78e12 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedMixer.java @@ -29,7 +29,7 @@ public class AnimatedMixer extends AnimatedKinetics { .scale(scale) .render(); - float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTick() / 32f) + 1) / 5) + .5f; + float animation = ((MathHelper.sin(AnimationTickHolder.getRenderTime() / 32f) + 1) / 5) + .5f; GuiGameElement.of(AllBlockPartials.MECHANICAL_MIXER_POLE) .atLocal(0, animation, 0) diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java index 849e95121..7cbf31cab 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedPress.java @@ -48,7 +48,7 @@ public class AnimatedPress extends AnimatedKinetics { } private float getAnimatedHeadOffset() { - float cycle = (AnimationTickHolder.getRenderTick()) % 30; + float cycle = (AnimationTickHolder.getRenderTime()) % 30; if (cycle < 10) { float progress = cycle / 10; return -(progress * progress * progress); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java index d39255552..25db4f26a 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/animations/AnimatedSpout.java @@ -37,7 +37,7 @@ public class AnimatedSpout extends AnimatedKinetics { .scale(scale) .render(); - float cycle = AnimationTickHolder.getRenderTick() % 30; + float cycle = AnimationTickHolder.getRenderTime() % 30; float squeeze = cycle < 20 ? MathHelper.sin((float) (cycle / 20f * Math.PI)) : 0; squeeze *= 20; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index cc27ee7f8..f3814c3e3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -58,7 +58,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer ms.translate(0, isBlockItem ? 9 / 16f : 11 / 16f, 0); ms.scale(scale, scale, scale); transform = TransformType.GROUND; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTick())); + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTime())); } else { float scale = punching ? .75f : isBlockItem ? .75f - 1 / 64f : .5f; @@ -176,7 +176,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer double factor; if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { - factor = MathHelper.sin(AnimationTickHolder.getRenderTick() * .5f) * .25f + .25f; + factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; } else { Vec3d center = VecHelper.getCenterOf(new BlockPos(context.position)); double distance = context.position.distanceTo(center); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 5bf8b87d2..6421411d3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -41,7 +41,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { SuperByteBuffer fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); float speed = te.getSpeed() * 5; if (speed > 0) speed = MathHelper.clamp(speed, 80, 64 * 20); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 4220afa17..134b7b788 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -45,7 +45,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); float angle = (float) (((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI); SuperByteBuffer poleRender = AllBlockPartials.MECHANICAL_MIXER_POLE.renderOn(blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java index aaaef728b..c3566bad9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/BlockMovementTraits.java @@ -14,6 +14,7 @@ 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.SailBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock; import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; @@ -198,6 +199,10 @@ public class BlockMovementTraits { .getAxis(); if (state.getBlock() instanceof FluidTankBlock) return FluidTankConnectivityHandler.isConnected(world, pos, pos.offset(direction)); + if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) { + return direction == state.get(StickerBlock.FACING) + && !notSupportive(world.getBlockState(pos.offset(direction)), direction.getOpposite()); + } return false; } @@ -231,6 +236,8 @@ public class BlockMovementTraits { if (AllBlocks.MECHANICAL_PISTON_HEAD.has(state)) return facing.getAxis() != state.get(BlockStateProperties.FACING) .getAxis(); + if (AllBlocks.STICKER.has(state) && !state.get(StickerBlock.EXTENDED)) + return facing == state.get(StickerBlock.FACING); return isBrittle(state); } 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 09fbc01f4..44fb1523c 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 @@ -8,7 +8,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -21,7 +20,6 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; -import com.simibubi.create.foundation.utility.*; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -35,6 +33,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.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionBlock; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueHandler; @@ -54,6 +53,12 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.render.backend.light.EmptyLighter; +import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.NBTProcessors; +import com.simibubi.create.foundation.utility.UniqueLinkedList; +import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.AbstractButtonBlock; @@ -172,7 +177,8 @@ public abstract class Contraption { return contraption; } - public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) throws AssemblyException { + public boolean searchMovedStructure(World world, BlockPos pos, @Nullable Direction forcedDirection) + throws AssemblyException { initialPassengers.clear(); Queue frontier = new UniqueLinkedList<>(); Set visited = new HashSet<>(); @@ -293,6 +299,14 @@ public abstract class Contraption { if (AllBlocks.GANTRY_SHAFT.has(state)) moveGantryShaft(world, pos, frontier, visited, state); + if (AllBlocks.STICKER.has(state) && state.get(StickerBlock.EXTENDED)) { + Direction offset = state.get(StickerBlock.FACING); + BlockPos attached = pos.offset(offset); + if (!visited.contains(attached) + && !BlockMovementTraits.notSupportive(world.getBlockState(attached), offset.getOpposite())) + frontier.add(attached); + } + // Bearings potentially create stabilized sub-contraptions if (AllBlocks.MECHANICAL_BEARING.has(state)) moveBearing(pos, frontier, visited, state); @@ -348,7 +362,8 @@ public abstract class Contraption { boolean brittle = BlockMovementTraits.isBrittle(blockState); boolean canStick = !brittle && state.canStickTo(blockState) && blockState.canStickTo(state); if (canStick) { - if (state.getPushReaction() == PushReaction.PUSH_ONLY || blockState.getPushReaction() == PushReaction.PUSH_ONLY) { + if (state.getPushReaction() == PushReaction.PUSH_ONLY + || blockState.getPushReaction() == PushReaction.PUSH_ONLY) { canStick = false; } if (BlockMovementTraits.notSupportive(state, offset)) { @@ -359,7 +374,8 @@ public abstract class Contraption { } } - if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue || (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection)))) + if (!wasVisited && (canStick || blockAttachedTowardsFace || faceHasGlue + || (offset == forcedDirection && !BlockMovementTraits.notSupportive(state, forcedDirection)))) frontier.add(offsetPos); if (faceHasGlue) addGlue(superglue.get(offset)); @@ -499,7 +515,8 @@ public abstract class Contraption { } } - private boolean moveMechanicalPiston(World world, BlockPos pos, Queue frontier, Set visited, BlockState state) throws AssemblyException { + private boolean moveMechanicalPiston(World world, BlockPos pos, Queue frontier, Set visited, + BlockState state) throws AssemblyException { Direction direction = state.get(MechanicalPistonBlock.FACING); PistonState pistonState = state.get(MechanicalPistonBlock.STATE); if (pistonState == PistonState.MOVING) @@ -621,8 +638,9 @@ public abstract class Contraption { specialRenderedTileEntities.clear(); INBT blocks = nbt.get("Blocks"); - //used to differentiate between the 'old' and the paletted serialization - boolean usePalettedDeserialization = blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette"); + // used to differentiate between the 'old' and the paletted serialization + boolean usePalettedDeserialization = + blocks != null && blocks.getId() == 10 && ((CompoundNBT) blocks).contains("Palette"); readBlocksCompound(blocks, world, usePalettedDeserialization); actors.clear(); @@ -713,7 +731,8 @@ public abstract class Contraption { for (Pair glueEntry : superglue) { CompoundNBT c = new CompoundNBT(); c.put("Pos", NBTUtil.writeBlockPos(glueEntry.getKey())); - c.putByte("Direction", (byte) glueEntry.getValue().getIndex()); + c.putByte("Direction", (byte) glueEntry.getValue() + .getIndex()); superglueNBT.add(c); } @@ -773,7 +792,9 @@ public abstract class Contraption { private CompoundNBT writeBlocksCompound() { CompoundNBT compound = new CompoundNBT(); - PaletteHashMap palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState); + PaletteHashMap palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> { + throw new IllegalStateException("Palette Map index exceeded maximum"); + }, NBTUtil::readBlockState, NBTUtil::writeBlockState); ListNBT blockList = new ListNBT(); for (BlockInfo block : this.blocks.values()) { @@ -799,7 +820,9 @@ public abstract class Contraption { ListNBT blockList; if (usePalettedDeserialization) { CompoundNBT c = ((CompoundNBT) compound); - palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> {throw new IllegalStateException("Palette Map index exceeded maximum");}, NBTUtil::readBlockState, NBTUtil::writeBlockState); + palette = new PaletteHashMap<>(GameData.getBlockStateIDMap(), 16, (i, s) -> { + throw new IllegalStateException("Palette Map index exceeded maximum"); + }, NBTUtil::readBlockState, NBTUtil::writeBlockState); palette.read(c.getList("Palette", 10)); blockList = c.getList("BlockList", 10); @@ -857,19 +880,15 @@ public abstract class Contraption { } private static BlockInfo readBlockInfo(CompoundNBT blockListEntry, PaletteHashMap palette) { - return new BlockInfo( - BlockPos.fromLong(blockListEntry.getLong("Pos")), - Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))), - blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null - ); + return new BlockInfo(BlockPos.fromLong(blockListEntry.getLong("Pos")), + Objects.requireNonNull(palette.get(blockListEntry.getInt("State"))), + blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null); } private static BlockInfo legacyReadBlockInfo(CompoundNBT blockListEntry) { - return new BlockInfo( - NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")), - NBTUtil.readBlockState(blockListEntry.getCompound("Block")), - blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null - ); + return new BlockInfo(NBTUtil.readBlockPos(blockListEntry.getCompound("Pos")), + NBTUtil.readBlockState(blockListEntry.getCompound("Block")), + blockListEntry.contains("Data") ? blockListEntry.getCompound("Data") : null); } public void removeBlocksFromWorld(World world, BlockPos offset) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java index b66008c4e..f3d1f4b44 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/ContraptionEntityRenderer.java @@ -39,7 +39,7 @@ public class ContraptionEntityRenderer exte super.render(entity, yaw, partialTicks, ms, buffers, overlay); // Keep a copy of the transforms in order to determine correct lighting - MatrixStack msLocal = translateTo(entity, AnimationTickHolder.getRenderTick()); + MatrixStack msLocal = translateTo(entity, AnimationTickHolder.getPartialTicks()); MatrixStack[] matrixStacks = new MatrixStack[] { ms, msLocal }; ms.push(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java new file mode 100644 index 000000000..74a3959a0 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerBlock.java @@ -0,0 +1,162 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllTileEntities; +import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.block.ProperDirectionalBlock; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.item.BlockItemUseContext; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.state.BooleanProperty; +import net.minecraft.state.StateContainer.Builder; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.IBlockReader; +import net.minecraft.world.IWorldReader; +import net.minecraft.world.World; +import net.minecraft.world.server.ServerWorld; + +public class StickerBlock extends ProperDirectionalBlock implements ITE { + + public static final BooleanProperty POWERED = BlockStateProperties.POWERED; + public static final BooleanProperty EXTENDED = BlockStateProperties.EXTENDED; + + public StickerBlock(Properties p_i48415_1_) { + super(p_i48415_1_); + setDefaultState(getDefaultState().with(POWERED, false) + .with(EXTENDED, false)); + } + + @Override + public BlockState getStateForPlacement(BlockItemUseContext context) { + Direction nearestLookingDirection = context.getNearestLookingDirection(); + boolean shouldPower = context.getWorld() + .isBlockPowered(context.getPos()); + Direction facing = context.getPlayer() != null && context.getPlayer() + .isSneaking() ? nearestLookingDirection : nearestLookingDirection.getOpposite(); + + return getDefaultState().with(FACING, facing) + .with(POWERED, shouldPower); + } + + @Override + protected void fillStateContainer(Builder builder) { + super.fillStateContainer(builder.add(POWERED, EXTENDED)); + } + + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + if (worldIn.isRemote) + return; + + boolean previouslyPowered = state.get(POWERED); + if (previouslyPowered != worldIn.isBlockPowered(pos)) { + state = state.cycle(POWERED); + if (state.get(POWERED)) + state = state.cycle(EXTENDED); + worldIn.setBlockState(pos, state, 2); + } + } + + @Override + public boolean hasTileEntity(BlockState state) { + return true; + } + + @Override + public boolean shouldCheckWeakPower(BlockState state, IWorldReader world, BlockPos pos, Direction side) { + return false; + } + + @Override + public TileEntity createTileEntity(BlockState state, IBlockReader world) { + return AllTileEntities.STICKER.create(); + } + + @Override + public Class getTileEntityClass() { + return StickerTileEntity.class; + } + + // Slime block stuff + + private boolean isUprightSticker(IBlockReader world, BlockPos pos) { + BlockState blockState = world.getBlockState(pos); + return AllBlocks.STICKER.has(blockState) && blockState.get(FACING) == Direction.UP; + } + + @Override + public void onFallenUpon(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) { + if (!isUprightSticker(p_180658_1_, p_180658_2_) || p_180658_3_.bypassesLandingEffects()) { + super.onFallenUpon(p_180658_1_, p_180658_2_, p_180658_3_, p_180658_4_); + } else { + p_180658_3_.handleFallDamage(p_180658_4_, 0.0F); + } + } + + @Override + public void onLanded(IBlockReader p_176216_1_, Entity p_176216_2_) { + if (!isUprightSticker(p_176216_1_, p_176216_2_.getPosition() + .down()) || p_176216_2_.bypassesLandingEffects()) { + super.onLanded(p_176216_1_, p_176216_2_); + } else { + this.func_226946_a_(p_176216_2_); + } + } + + private void func_226946_a_(Entity p_226946_1_) { + Vec3d vec3d = p_226946_1_.getMotion(); + if (vec3d.y < 0.0D) { + double d0 = p_226946_1_ instanceof LivingEntity ? 1.0D : 0.8D; + p_226946_1_.setMotion(vec3d.x, -vec3d.y * d0, vec3d.z); + } + } + + @Override + public void onEntityWalk(World p_176199_1_, BlockPos p_176199_2_, Entity p_176199_3_) { + double d0 = Math.abs(p_176199_3_.getMotion().y); + if (d0 < 0.1D && !p_176199_3_.bypassesSteppingEffects() && isUprightSticker(p_176199_1_, p_176199_2_)) { + double d1 = 0.4D + d0 * 0.2D; + p_176199_3_.setMotion(p_176199_3_.getMotion() + .mul(d1, 1.0D, d1)); + } + super.onEntityWalk(p_176199_1_, p_176199_2_, p_176199_3_); + } + + @Override + public boolean addLandingEffects(BlockState state1, ServerWorld worldserver, BlockPos pos, BlockState state2, + LivingEntity entity, int numberOfParticles) { + if (isUprightSticker(worldserver, pos)) { + worldserver.spawnParticle(new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()), + entity.getX(), entity.getY(), entity.getZ(), numberOfParticles, 0.0D, 0.0D, 0.0D, (double) 0.15F); + return true; + } + return super.addLandingEffects(state1, worldserver, pos, state2, entity, numberOfParticles); + } + + @Override + public boolean addRunningEffects(BlockState state, World world, BlockPos pos, Entity entity) { + if (state.get(FACING) == Direction.UP) { + Vec3d vec3d = entity.getMotion(); + world.addParticle( + new BlockParticleData(ParticleTypes.BLOCK, Blocks.SLIME_BLOCK.getDefaultState()).setPos(pos), + entity.getX() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), + entity.getY() + 0.1D, + entity.getZ() + ((double) world.rand.nextFloat() - 0.5D) * (double) entity.getWidth(), vec3d.x * -4.0D, + 1.5D, vec3d.z * -4.0D); + return true; + } + return super.addRunningEffects(state, world, pos, entity); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java new file mode 100644 index 000000000..8e6ef665c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -0,0 +1,48 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +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.RenderType; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.util.Direction; + +public class StickerRenderer extends SafeTileEntityRenderer { + + public StickerRenderer(TileEntityRendererDispatcher dispatcher) { + super(dispatcher); + } + + @Override + protected void renderSafe(StickerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, + int light, int overlay) { + BlockState state = te.getBlockState(); + SuperByteBuffer head = AllBlockPartials.STICKER_HEAD.renderOn(state); + float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks()); + + if (te.getWorld() != Minecraft.getInstance().world) + offset = state.get(StickerBlock.EXTENDED) ? 1 : 0; + + Direction facing = state.get(StickerBlock.FACING); + ms.push(); + MatrixStacker.of(ms) + .nudge(te.hashCode()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing) + 90) + .unCentre(); + ms.translate(0, (offset * offset) * 4 / 16f, 0); + head.light(light) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java new file mode 100644 index 000000000..b79977b04 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -0,0 +1,94 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import java.util.List; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; +import com.simibubi.create.foundation.tileEntity.SmartTileEntity; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; + +import net.minecraft.block.BlockState; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; + +public class StickerTileEntity extends SmartTileEntity { + + LerpedFloat piston; + boolean update; + + public StickerTileEntity(TileEntityType tileEntityTypeIn) { + super(tileEntityTypeIn); + piston = LerpedFloat.linear(); + update = false; + } + + @Override + public void addBehaviours(List behaviours) {} + + @Override + public void initialize() { + super.initialize(); + if (!world.isRemote) + return; + piston.startWithValue(isBlockStateExtended() ? 1 : 0); + } + + public boolean isBlockStateExtended() { + BlockState blockState = getBlockState(); + boolean extended = AllBlocks.STICKER.has(blockState) && blockState.get(StickerBlock.EXTENDED); + return extended; + } + + @Override + public void tick() { + super.tick(); + if (!world.isRemote) + return; + piston.tickChaser(); + + if (isAttachedToBlock() && piston.getValue(0) != piston.getValue() && piston.getValue() == 1) { + SuperGlueItem.spawnParticles(world, pos, getBlockState().get(StickerBlock.FACING), true); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(true)); + } + + if (!update) + return; + update = false; + int target = isBlockStateExtended() ? 1 : 0; + if (isAttachedToBlock() && target == 0 && piston.getChaseTarget() == 1) + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> playSound(false)); + piston.chase(target, .4f, Chaser.LINEAR); + } + + public boolean isAttachedToBlock() { + BlockState blockState = getBlockState(); + if (!AllBlocks.STICKER.has(blockState)) + return false; + Direction direction = blockState.get(StickerBlock.FACING); + return SuperGlueEntity.isValidFace(world, pos.offset(direction), direction.getOpposite()); + } + + @Override + protected void read(CompoundNBT compound, boolean clientPacket) { + super.read(compound, clientPacket); + if (clientPacket) + update = true; + } + + @OnlyIn(Dist.CLIENT) + public void playSound(boolean attach) { + world.playSound(Minecraft.getInstance().player, pos, AllSoundEvents.SLIME_ADDED.get(), SoundCategory.BLOCKS, + 0.35F, attach ? 0.75F : 0.2f); + } + +} 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/GantryPinionRenderer.java index 7772d70de..df2d3b49b 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/GantryPinionRenderer.java @@ -72,7 +72,7 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); float offset = getRotationOffsetForPosition(te, pos, axis); return ((time * te.getSpeed() * 3f / 20 + offset) % 360) / 180 * (float) Math.PI; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index e05fb6ee0..618816da2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -72,7 +72,7 @@ public class BasinRenderer extends SmartTileEntityRenderer { if (fluidLevel > 0) { ms.translate(0, - (MathHelper.sin(AnimationTickHolder.getRenderTick() / 12f + anglePartition * itemCount) + 1.5f) * 1 + (MathHelper.sin(AnimationTickHolder.getRenderTime() / 12f + anglePartition * itemCount) + 1.5f) * 1 / 32f, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index a2b7abd5c..458035ec9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -27,7 +27,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer { MatrixStacker msr = MatrixStacker.of(ms); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - float renderTick = AnimationTickHolder.getRenderTick(); + float renderTick = AnimationTickHolder.getRenderTime(); ms.push(); msr.centre(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 8aca8cccd..1d4531a36 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -32,7 +32,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index bd74bcdf8..601aedc49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -30,7 +30,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTick(); + float time = AnimationTickHolder.getRenderTime(); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index fc0828078..03cc04bdf 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -16,7 +16,7 @@ public class WrenchItemRenderer extends CustomRenderedItemModelRenderer b.key('B', ItemTags.PLANKS) .key('S', I.cog()) @@ -669,6 +669,15 @@ public class StandardRecipeGen extends CreateRecipeProvider { LINEAR_CHASSIS_CYCLE = conversionCycle(ImmutableList.of(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS)), + STICKER = create(AllBlocks.STICKER).returns(1) + .unlockedBy(I::andesite) + .viaShaped(b -> b.key('I', I.andesite()) + .key('C', Tags.Items.COBBLESTONE) + .key('R', I.redstone()) + .key('S', Tags.Items.SLIMEBALLS) + .patternLine("ISI") + .patternLine("CRC")), + MINECART = create(() -> Items.MINECART).withSuffix("_from_contraption_cart") .unlockedBy(AllBlocks.CART_ASSEMBLER::get) .viaShapeless(b -> b.addIngredient(AllItems.MINECART_CONTRAPTION.get())), 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..0b6e7ff62 100644 --- a/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java +++ b/src/main/java/com/simibubi/create/foundation/render/TileEntityRenderHelper.java @@ -7,6 +7,7 @@ import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Debug; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.worldWrappers.PlacementSimulationWorld; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index 8d6f71711..2201626c1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -43,7 +43,7 @@ public class BasicProgram extends GlProgram { super.bind(); GL20.glUniform1i(uDebug, debugMode); - GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTick()); + GL20.glUniform1f(uTime, AnimationTickHolder.getRenderTime()); uploadMatrixUniform(uViewProjection, viewProjection); GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ); diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index 4b8f410c5..b86ac025a 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -16,7 +16,7 @@ public class AnimationTickHolder { } } - public static float getRenderTick() { + public static float getRenderTime() { return getTicks() + getPartialTicks(); } diff --git a/src/main/resources/assets/create/models/block/sticker/block.json b/src/main/resources/assets/create/models/block/sticker/block.json new file mode 100644 index 000000000..1ece065f4 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/block.json @@ -0,0 +1,71 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "0": "block/piston_bottom", + "1": "block/piston_inner", + "3": "create:block/sticker", + "4": "create:block/sticker_side", + "particle": "block/piston_bottom" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 8, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "east": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "west": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#3"} + } + }, + { + "from": [0, 8, -0.95], + "to": [16, 16, 0.05], + "faces": { + "south": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [0, 8, 15.95], + "to": [16, 16, 16.95], + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [15.95, 8, 0], + "to": [16.95, 16, 16], + "faces": { + "west": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [-0.95, 8, 0], + "to": [0.05, 16, 16], + "faces": { + "east": {"uv": [16, 0, 0, 8], "texture": "#4"} + } + } + ], + "groups": [ + { + "name": "Piston Block", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/block_powered.json b/src/main/resources/assets/create/models/block/sticker/block_powered.json new file mode 100644 index 000000000..ee3244b46 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/block_powered.json @@ -0,0 +1,6 @@ +{ + "parent": "create:block/sticker/block", + "textures": { + "4": "create:block/sticker_side_powered" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/head.json b/src/main/resources/assets/create/models/block/sticker/head.json new file mode 100644 index 000000000..b2b808c18 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/head.json @@ -0,0 +1,41 @@ +{ + "credit": "Made with Blockbench", + "textures": { + "2": "block/piston_side", + "3": "create:block/sticker", + "particle": "block/piston_bottom" + }, + "elements": [ + { + "from": [1, 8, 1], + "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 16, 9]}, + "faces": { + "north": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "east": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "south": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "west": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#3"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#3"} + } + }, + { + "from": [6, 3, 6], + "to": [10, 8, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 11, 14]}, + "faces": { + "north": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "south": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "Piston Head", + "origin": [14, 28, 14], + "children": [0, 1] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/item.json b/src/main/resources/assets/create/models/block/sticker/item.json new file mode 100644 index 000000000..c8c48ec47 --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/item.json @@ -0,0 +1,104 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "0": "block/piston_bottom", + "1": "block/piston_inner", + "2": "block/piston_side", + "3": "create:block/sticker", + "4": "create:block/sticker_side", + "particle": "block/piston_bottom" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 8, 16], + "faces": { + "north": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "east": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "south": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "west": {"uv": [0, 8, 16, 16], "texture": "#4"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#1"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#0"} + } + }, + { + "from": [0, 8, 0], + "to": [16, 16, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 16, 8]}, + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "east": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "south": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "west": {"uv": [0, 0, 16, 8], "texture": "#4"}, + "up": {"uv": [0, 0, 8, 8], "texture": "#3"} + } + }, + { + "from": [0, 8, -0.95], + "to": [16, 16, 0.05], + "faces": { + "south": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [0, 8, 15.95], + "to": [16, 16, 16.95], + "faces": { + "north": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [16, 8, 0.05], + "to": [17, 16, 16.05], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 8, 8]}, + "faces": { + "west": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [-1, 8, -0.05], + "to": [0, 16, 15.95], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 8, 8]}, + "faces": { + "east": {"uv": [0, 0, 16, 8], "texture": "#4"} + } + }, + { + "from": [1, 9, 1], + "to": [15, 14, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [9, 17, 9]}, + "faces": { + "north": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "east": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "south": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "west": {"uv": [8.5, 0, 15.5, 2.5], "texture": "#3"}, + "up": {"uv": [8.5, 8.5, 15.5, 15.5], "texture": "#3"}, + "down": {"uv": [0.5, 8.5, 7.5, 15.5], "texture": "#3"} + } + }, + { + "from": [6, 4, 6], + "to": [10, 9, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [14, 12, 14]}, + "faces": { + "north": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "east": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "south": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"}, + "west": {"uv": [0, 0, 5, 4], "rotation": 90, "texture": "#2"} + } + } + ], + "groups": [ + { + "name": "Piston Block", + "origin": [8, 8, 8], + "children": [0, 1, 2, 3, 4, 5] + }, + { + "name": "Piston Head", + "origin": [14, 28, 14], + "children": [6, 7] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sticker/sticker.bbmodel b/src/main/resources/assets/create/models/block/sticker/sticker.bbmodel new file mode 100644 index 000000000..0a341360e --- /dev/null +++ b/src/main/resources/assets/create/models/block/sticker/sticker.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"3.6","creation_time":1614729493,"model_format":"java_block","box_uv":false},"name":"","parent":"","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"resolution":{"width":16,"height":16},"elements":[{"name":"cube","from":[0,0,0],"to":[16,8,16],"autouv":0,"color":6,"locked":false,"origin":[8,8,8],"faces":{"north":{"uv":[0,8,16,16],"texture":4},"east":{"uv":[0,8,16,16],"texture":4},"south":{"uv":[0,8,16,16],"texture":4},"west":{"uv":[0,8,16,16],"texture":4},"up":{"uv":[0,0,16,16],"texture":1},"down":{"uv":[0,0,16,16],"texture":0}},"uuid":"9189c687-ec3f-0483-bb94-8eb1610bb0f7"},{"name":"cube","from":[0,8,0],"to":[16,16,16],"autouv":0,"color":6,"locked":false,"origin":[8,16,8],"faces":{"north":{"uv":[0,0,16,8],"texture":4},"east":{"uv":[0,0,16,8],"texture":4},"south":{"uv":[0,0,16,8],"texture":4},"west":{"uv":[0,0,16,8],"texture":4},"up":{"uv":[0,0,8,8],"texture":3},"down":{"uv":[0,0,0,0],"texture":null}},"uuid":"c915a8a9-e0c7-0d13-5267-953429b366f5"},{"name":"cube","from":[1,12,1],"to":[15,17,15],"autouv":0,"color":1,"locked":false,"origin":[9,20,9],"faces":{"north":{"uv":[8.5,0,15.5,2.5],"texture":3},"east":{"uv":[8.5,0,15.5,2.5],"texture":3},"south":{"uv":[8.5,0,15.5,2.5],"texture":3},"west":{"uv":[8.5,0,15.5,2.5],"texture":3},"up":{"uv":[8.5,8.5,15.5,15.5],"texture":3},"down":{"uv":[0.5,8.5,7.5,15.5],"texture":3}},"uuid":"838bfc74-3754-755e-97b9-dc8f49cb4cc4"},{"name":"cube","from":[6,7,6],"to":[10,12,10],"autouv":0,"color":6,"locked":false,"origin":[14,15,14],"faces":{"north":{"uv":[0,0,5,4],"rotation":90,"texture":2},"east":{"uv":[0,0,5,4],"rotation":90,"texture":2},"south":{"uv":[0,0,5,4],"rotation":90,"texture":2},"west":{"uv":[0,0,5,4],"rotation":90,"texture":2},"up":{"uv":[0,0,4,4],"texture":null},"down":{"uv":[0,0,4,4],"texture":null}},"uuid":"e380ceaa-57a4-7e47-45d8-238ff048b7cd"}],"outliner":[{"name":"Piston Block","origin":[8,8,8],"uuid":"d35280bd-4aab-971b-e553-24b5af733d45","export":true,"isOpen":false,"locked":false,"visibility":true,"autouv":0,"children":["9189c687-ec3f-0483-bb94-8eb1610bb0f7","c915a8a9-e0c7-0d13-5267-953429b366f5"]},{"name":"Piston Head","origin":[14,28,14],"uuid":"6c824c11-53c5-d20a-8857-1867915ba892","export":true,"isOpen":true,"locked":false,"visibility":true,"autouv":0,"children":["838bfc74-3754-755e-97b9-dc8f49cb4cc4","e380ceaa-57a4-7e47-45d8-238ff048b7cd"]}],"textures":[{"path":"F:\\Create\\Attacher\\Sticker Textures\\piston_bottom.png","name":"piston_bottom.png","folder":"Sticker Textures","namespace":"","id":"0","particle":true,"visible":true,"mode":"bitmap","saved":true,"uuid":"fd815e7a-cd5f-a1d8-9ed5-64cee6940ea0","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABZUlEQVQ4T4VTsYqDQBRcm1RGqyMgyRVBAlbCGdsjET/Y0s6QxibcBwSrMwjhKo2Vjce8u9HVC9xrdnk7Ozvz3lsjjuNe/UZd17Lruk7WxWKhbNvm8Z8VeAME9nKp3vZ7ATRNIysOv+535e52wx75l9VKSC3LUlmWKSMMwz6KIkmQoLheZa+Dy7IUQuY3m81IEASBsPJVXASAAVUg1dUAUxTFj4LX9XoAAwTw++Gg2rYVS7w8V/l5uynD9/3e3W4n0ngJr0A2Vs/zBFNV1aB0QoCX8YJpmhMQlDCgiLUAaZ7nYxdI8KwLjuOInXkhJwSsuN7CZzm9kGIBc3A8HtXH5SJe2SrOBfIMXSUKWz8eIwFAJOGg6HMxby2wAwHmAAWceySR3krd4mDBdV1RCfmQjk6cT6eJJU4gcbCTpunYBRzQ91w6lbAetJMkyTiJ+txDMsda/xMo3NPPBBC+ML4v4r8vrGO+ARsXKQWAtEm4AAAAAElFTkSuQmCC"},{"path":"F:\\Create\\Attacher\\Sticker Textures\\piston_inner.png","name":"piston_inner.png","folder":"Sticker Textures","namespace":"","id":"1","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"b94d7326-7db9-4e58-dfb6-169b5ecac9fd","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABs0lEQVQ4T4VTsWoCQRR81wiCelW00QhyCFZK1MImqFj4E8HfEC0sRPE3JD9gaaeksZFgLYdgFCGmOhUUG8O85D3vYkK22b13s7PzZmeNSqVyoe/hOI4sdTZN86bmxhsgMINBesjluL7b7XgG2cf7O1nJpK5Rv4tECKShUIhGoxEZ+Xz+Ui6XuSAEstkNXq1WTCgksVjsSpDNZplVNgIkioTUns89akBu2/aXgvtoVPuEZIAfi0U6HA4kJ6PuVgnM23pNRjqdvliJBPeGAWmBQIDC4TD5/X4lXi6XvN5sNqpUCQqFws3mXq/ncb9er9NisVBFOHAymRDfgmVZ7AEGpD3VatRqtfjb5/Px3Gw2aTgceoxUAlyjOA4jq9UqdTodVXA6najdbtNzv+8xkluAglKpRK/TKW+AWZlMhrrdrqeFRqNBs9mMjURWoNTZ768EQIMESlKpFMXjcSU4Ho+03W75VmQAqwTIAZh/hkUSJydCnTul2gJMxEDSECBc48t4zGokfZJAwYEMpupb+Ct97jiLT6ghL4PB4JpENxCS3bGWfzDu18eE08/ns975f08YeMF8ApBNGgW9XdHyAAAAAElFTkSuQmCC"},{"path":"F:\\Create\\Attacher\\Sticker Textures\\piston_side.png","name":"piston_side.png","folder":"Sticker Textures","namespace":"","id":"2","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"db3f52e8-b2d3-9368-ac4d-62cc93c62134","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAB0ElEQVQ4T4VSwWoaURQ9A8WmzTg2NNFENIIdEl0UIcZFFw2R+An5gf6BX+GfuHfpJijtQkiiELqx0iyMIlHTwowGEglMOc/c8U0J5G7evHvvnHvOeddot9tet9tFbHYGxgfrvToZxv43SE3Ps/bL+4JMJgOjWq16/X4fn0MXuJ062N6K+ADuzimk5icBvDM3cP7XRiqVglGpVLzJZILc5rXeg821N/i5KIC1k0Tfr909PKnvq7tPiEajMMrlssfE4/AHPlrrAZC5daDuptvBH/c+UHub+LqUWSqVFADDcRx1LhYLdYZCIUQiK0kBhOd+I5fLeXY6rWpbsRiSySRc18XvXk/dp+OxOrPZrOoZjUZqEPM3wyF8AHtvD5ZlwTTNQNPR8bE/eD6fYzAY+KCtVmspIRIOQwA4XeRwCvPxeBz6z8I2AECaolcovpQjYEACGRSLRXQuL33NnHBweKiYMC+hs6RHzmy2lEAAaZap9IOhG0qDJQjsA+TzeWWgGCQaKYl5ASED3R/1CmRg27Yq0DRS50t8bzYDkgRU+ghWr9dXr6Dr/p+6MBE/ZF9qtRqMQqHg7SYSappOWZzW5chySV+j0VgCsInry9VlvLa+es8/A5wUOjLC82gAAAAASUVORK5CYII="},{"path":"F:\\Create\\Attacher\\Sticker Textures\\sticker.png","name":"sticker.png","folder":"Sticker Textures","namespace":"","id":"3","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"d37f6ff6-f6ff-f4aa-4402-5bccef23d620","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAADh0lEQVRYR+1XPUxTURQ+TQu8wiu00ECJCkaJxhgwymRAY4IDYTNGBxiMJG4OEBclcTJBFwODmwmGAQYd3AiLiTEqgwECLtVUtETTgi0t5UEf8sgz3ymneW35Tetgwlneve/de853v3v+nu35wBNzYnaWhl6M2ugA0n2707zY1ER3eu/bOl+2mYpaQh7Vty8NMS1MurZOozff2GxQdFDjYkX2Tk5Omg8/PCBfg4NBKKpCuqbzMhir9fpI14kUhSgUCVM4YNCjlsfU3NxsO9CpdzreyMiIGQwG6b36lty+TV4WD9vZiN/vp5HocMb7Vu0K1dfXU1dXV2EA9Pf3m4uLi3TO+428ioMBOFUPLbjaCMAaiz/xPKnFKKIbNBM5SdXV1dTX11cYAD09PSaMqompNEnRxCodu3CdACz7fcnRS7xucHCwMAD25Xk7LCqIDxwCOGTgkIH/m4FCFKO8GChEOc4LQD6bC7GXU7FUs/aGGOtMbqyRs6iUphKneX7GOZ2qcEWl/BwPeNLVDPO8GhIoQDUrT0ywcl9lyojTrXLZhKDMiiTjGg+/Gue4mmHcPdZhSiMi61R7BQ+1zWXCGE8RNCtoVIY6xlLVcPzZLfPjlJ+utpzlNWvJVFORNrrFiMznfszTieN11H53mPffe9dtoguKL0XJ2NgkR5Gd1NIyMowMNemJdExPLw+lALweuGGGfkVYKejfTXANofgSucsUutb7Kg2AT7uaoJWVGNX66tMqcFKwEwoH+R2+5QAAA1Ba665kAAADwTVAhPbaI172AzCAsRWAKIVBiDSo6APJodD3wBeSxnVHBqAUMv15ns431mUQAVDyXdiyXoG3ooZ+/p4jpbgsYx8DIOKmVARrI8sLlL4CaxQIAzAWX03tAt0Y4wkGsqNAfECcCy239RqsiPQ/q+SurOKueV8AQD/ACAN7AbDeNQyLD1hBbHsFOKHVB4Ru2SgMYC5gsp0ww4iSSTuAwQecxa5cBrKjQJwwvLTGeUGcUa5guyiQMMz2AWFBwME5c3wAAKwM7BWG20bB1omzo0B0ye+Yy+Uhb1U5O2XaB6xhyGGXlXhESanTzklqtzCEkyEZqWXlnBfwxDuIJKkcJ0QqRrqFw4Fua7rFxlOOmRxSdkzFhp76D1QVIkMntaSGtPUFzgWY45mTirPDENasxai1JkDRxAqD2C4K8i5Gu935v/72F6SUUT/55o1qAAAAAElFTkSuQmCC"},{"path":"F:\\Create\\Attacher\\Sticker Textures\\sticker_side.png","name":"sticker_side.png","folder":"Sticker Textures","namespace":"","id":"4","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"b6008321-379a-f043-b8b9-8285c50d2ce8","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACGElEQVQ4T5WSS2gTYRSFz2wCgUxSayeToqMRxyqEPDQmqEVtJAgKAdfuFFxLcdOFIqKLbkRcC3YhuHXXneKDGghJGwYC2o5IOjHNODU2j1VARu4t/zStQfSufube8537GOn+3G3Xsh08X3gp4T/i5o3rrqYqkF69WHA3N220fji49+jxP0Ee3r3jRvYrmJhQIRHpZ28L++QxEPHB/NO/Qp49mXeLhgGh4Q6qtSrelpZx9LCGs4kEbs3OjYSIcb/ULcxkTyEVS0Ei4uLSe56+3e4xZFQnwpnE4+My11+dvgBp7xIvXjrvEuTIgUlvJzTz128bIPG7Nx+4O2+Jo64wDKHiveI/AIa5xu0L+vHYCTeiKjwOBTm3bAefa5/YnQxojIR+bOeMDXsDi68/smAwGODalRleEp2YckvlmveXTJ+O4aA6ufuMva0BdF2HpmnodruoVCo4pIVZtG59R6FQ4Hez2eScPObj00vJZNJVFAXpdBrBYBCBQICLOp0OTNNkkRD3+31YlgXHttHp9eA4DqR8Pu+GZBn61BQDyH37pG12oiB4NBr1xPRNUVUUi8UdAH0IhUIsIPdSqYTLxgqMXxJaJ1PIZrPsTEaUp/d6o7ENyOVyWC6XmUoJPl29jshKFWuQED53BpFweFeX5uoqj+EBSCQg1Inowu/3Ix6PM5QWLIJqGZDJZFxxOp/Px3kxilc99CDwcM1vBi4whPcwgQ8AAAAASUVORK5CYII="},{"path":"F:\\Create\\Attacher\\Sticker Textures\\sticker_side_powered.png","name":"sticker_side_powered.png","folder":"Sticker Textures","namespace":"","id":"5","particle":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"1c9b6770-8e6d-ef0b-3c7b-a3e4be8da6a6","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAACNElEQVQ4T5WSTWgTYRCG3zU0EM2P/Vk2NQaRNo00mLQmESVoG81FTzl7U+hZxEsPFhE99CIiHgv2IHj11ptilTQQQlujQZO2iEmadtk0Nj8ohMavzJTd1hpEv9O338z7zDszK92fvC2Kqobnsy8l/Me5dfOGcCsypFcvZkWlomJzS8PUo8f/BHl4765w9sro61MgEel7YxvdtuMg4oPpp3+FzDyZFslMBrqGHSxnl/E2tYiBU25c9PsxcWeyI0Rvd+1bEePnz2HENwKJiHOJd9x9tdpgSCcnemUS9/TYOP965DKkw0Mcu3JJEOS0q9+YCfX8dX0DJJ5/857dGUPstIWDEEo+LP4DkFldYfs63es7I5yKzO3QocqbqoZc9gtXpwLUhn/Qs7/GkrqBudcLLGi1WohfG+ch0Yoplkhnjb8kEvLhpNL/+xrbWz9xwuuF2+1GvV7H51QKAy55z8G6hqvxON/L5TLHTL0WXr0UCASELMsIBoOw2+2wWq2cVKvVUM7lWKSLm80misUiNFVFrdGApmmQYrGYcNhsGBwaYgBVp9NWVSSWlvgeGR1Ft8djiOlNVhQkk8l9AD04HA4WSJUK5tNpLHz4hKwkMOE/i7FQCCvVKhcid+SiUCrtAaLRKBbTaaZSwLqzg3yhgJnMR6wd+YVn4QtwyTKcw8OGy9V8ntswAFRZh5AT3cUxiwUhnw/bXV08YP1QLgPC4bDQV2c2mzmut3K03ebvHyaTIST7B3N2AQhkNoSNVX+GAAAAAElFTkSuQmCC"}]} \ No newline at end of file diff --git a/src/main/resources/assets/create/textures/block/sticker.png b/src/main/resources/assets/create/textures/block/sticker.png new file mode 100644 index 0000000000000000000000000000000000000000..75429c8afeec9968fb691653b77e393f2c02fe03 GIT binary patch literal 1509 zcmVEX>4Tx04R}tkv&MmKpe$iQ$>-AgBe5|GSuQ=K~%(1s#pXIrLEAagUO{|(4-+r zad8w}3l4rPRvlcNb#-tR1i=pwH#a9m7b)?7NufoI2gm(*ckglc4iFj@rdeGRfTr7K zDjt)vxmBs>6+s9PF@}iDEF+O#%)obi-6O!)yC~1{KlkV8SMwGF0uu2YGfbO!gLr1s zHaPDSi>xH8#OK80CS8#Dk?V@bZ=8!R3p`UaGpTuEkyt8ru+qV-WNO6I#9>v_DPPEX zta9GstW|2Pbx;1nP+nh2bDic0;#figNk~voLm3s=h|;Q)Vj)HQF(3c1>rawPAy*lU z91EyIgY5dj|KNAGR$*$=OA5t+?ia`T7zKKEfo9!tzK)BVfh)c3uQq_$Ptxmc zEqnwFYy%h9ZB5w&E_Z;TCqp)6R|?V;3I*W(jJ_!c4Bi5LYhG`yeVjf38R}~J1~@nb zB1Otx_jz}3XK(+WY4!I5jmC1ab>4+|00006VoOIv0Gj}h0Ekwf`q2OY010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00X^AL_t(o!|j*BYa2%t#(%O_(yX+OB_k9Gw-v38OK5A8 z-a>jPvyt2H~ zj-^%A!)nJ`%Oy=3NDBTg%g)ZcH}k&ly*C@X_x*Q+&D~w@KiG)z9JqaJd2nN4fiJ%L zI=1}NCj()m$Qi|dwbpShq3jkq=h%+&K z6(V@I_I>Wm-UZ;f9bbg?_4R>in*3(`LblikplQYV=H|ClDizinKSstsazCbAF0-<- z64PGB229h$wrxK9D@DE=nAD9Nl}ZKEH2E@_K|jjjxej&dvs1U#+Ly8c+YSsqJ~-y_ zaIDd)^5%zg*tX5@tp?B-j<-p@F{{>G;u4p*#H+{cTg!u2u{OlSjfI65G8DGs|2<*= zYinx*+qPMna{%yq9rQ$+t=78$T+_FM4wpy+@Nhpzp-^CTbu|X?UoIqC*v+oAHhHuK z#p%F_o;9$CZL^e@K`%$*HC^VlDtq>#G8j4^y@(j`DFEF5F-Cj}w|}g@0O)wZ<)M@fBO=u4$xd_dq{`Bq!w;dsq4VZZ1HactOT_Wh65kKLOJpPh z!Vu&ro^8PEbtq1!>3Ds-UgyHFh2wf6jh;2e=1EuL_xhZiIFyQI<=k;Caz>GwWd?^T zmLu!5QKKPhhjm2*fY)?`#WQ*Jp3R7{Qvvh_9pyBjuLzn@RGo*4fY)^KhDNQU4%a_; zOHImVgxb_-Bt~Jxr)YK?7Yossk&_$oDMgD0@TYej+qZcq;V3!)nr*2z5Jp2!q}lTq zX|@UxA8!8`k<2KChYn?weq^^D5#+?PQYH+4_K+rw0wj(p5! zgyLH1q1Rzvt5VYQVraJObxWSUaq<{YRDBVO>#ikzhwf zD7)>m4asN}LIH|oM%9SOwS3fQsP@v#KhttP3-G1VKv)|XsS}|#+*nKfDMiw-IaH;d zNUKtO9%((Uiqv>M2|%JJC-Hm19Jk%V$Xr2o+vv$j5|e4PL|n~P8+f>%V=;fk!INrG zWQKI?`9Zmz*LKGI{c6rcLYyP0hQbfRFARYYV5F|%o<0qn`VusObft=v22dyz*s+6> z?DaZ9+9lE|)!x7QHjUPaicr{$MwRbisq#81N-3X)BkCE_@mk<-_;kcS%!$$n00000 LNkvXXu0mjfMw-B5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sticker_side.png b/src/main/resources/assets/create/textures/block/sticker_side.png new file mode 100644 index 0000000000000000000000000000000000000000..4e82caf62d6708a64e5eac1c4f455c00e3d2d8a3 GIT binary patch literal 6761 zcmeHKX;f3$vJQx%1SQQNlS2$n2q7T^GIT&OL5UD%5oFA8LIQ*nl0X6?iUX}8B7=&6 zGlK$(LaQx!5fDWiP#PSNNkmXY2GK??V(UE#sQ9k0?{lqp|CzN;l3n|&uWHw>s(tou z7pJwe)eO{NFxYImJZSUbda%Of`&a$nbt>9cZZ8v8yisP~xo{osSQC)*gM-pDX;BD2sfM zOpqBo=qTGI3KUS@d#g716P>7$q(6g+BTWb5c4zMAQM_d*(uSAOWwkNI2J?e%*jK0C zaI6V&nKg5j!6=O$a3^M@e&AGq?@I3n2XCjvmF~RYpt0FE=NC#$%Rq4pNF9v6_D6Kf zZJU;!jQGchotwC^cAR&w?$wS|1rJ&N*})A0Qo_ATS`)|)hnGm|uKS47uMZ4gUOpbR zw#{~#AM!}P#Fhqlpv;MboYQV6odo4@omKd@=BM?(74LZPPLxP#SfxDNq_5vL<^Ze@ z{ws?23=Xf4dYX04W$U2HiDg=Q|7f^><$g%dwYG)v(F@I~+1GnaI=fErD)j0Smqo`R z`dae>Js7%8J-rV@5GH{QP6Sm`?2D_89EZ!7IIk!tA9qraEpOP3hT9J?9dPkAMBGqsXc~S{lKK!^m1a z_?S#f8=qF_#XcMHpf&Im!>Mf-_W4yqJ~3+erq9sT(aN>Qwy9`^3M+p>u<2qJ?o&>nq`058;cKy7T24N&lA<1S!HuW+sAi!Nt%~i&x(B1{(^$?c!QAO zd&nGahTz=T+>N1UsKI`vFD{i0ZtA^|mvFJZ@8=NbXR&t;1P^4IOVl*BT!`lmCCxH; zQ9b8Qg`T1E(^xFb_D!dwDlT4CtnYg2{19@5>9m~r-5v&e<7}ID3Gx!kGOrX}HP-sD zix7*;n-TF*RUGUx8aSAG8B=)wf_~cV=Dn*ekK|8(qWascYnu6Hv1!CL1JuhL(?^o> zB*xoXpTGL9Yjm{#k%fWZD7-1Ti5j`s&sAMkB{+!Kl=a~Fa=RjyWll^<;fI-fir{KV zNdGq`v;7L^%sF#Oppuh4T_bLR$ z*ZsjHNB=s+Ynpm=>4gH~K9#G>?sB}{vi+#{KqmxbzE>(5xCMh_v}+Qz{q1Y_ z&s|)31tFC1q?q!5^hQ5(xD5X?n~z zo=Q72a+u4C?WUO=qBWUcT)e%#Eh{VW>{z;e%{D=v;oG|-=H1aYjj1V5;3KadFL~bR z^g?sv6N{9~y6u(y#Vx%3Ng92%j6>pe?Zww0Wm|J8*(L+@4!>lFWKU;}>UAaN^E*Mwzb>cUJ#!};K!IeKUmUgCiw+lInCUc-@<%Iu3V7TuSjGwGxYd1@;s$^DLU- zJpqH332gUJp*CaWT*8%rjFZ32Y*mX0 z706E3=45O8>#OG72ynMc-m_hwHV=2NE6~=X+BM%x1)g)ZA%FYroPdVxMfC7+ZD07D zSX0mWzF83wLLHS#4FrL(%ud&Mcnkf6-Cot2zhu&(@X&%_ zp>T0Q_4DedOa1o$Gx_D78Zaxt3{G*!TbzkvC3~%iJl|MZ$O*1)s%EZlG7h*ET`214 zDqJ627~%Y(%Edo`EQ`u{l4I_8APHA z%IaF`=#ckfIFi|*z>LWOS%8^LAcRr_2BWN$ z37PB=K!RieLHsal)KJ+q6q3)eMs2WUU>QOxz~kFTivag%Cl7XX2%E$~t+Y|2$jA_Z z0FW?|GC^pVm@KnKDR{}yf4LZgLMkAV5Nnhd!v#qNMF0|ShBw2a?PUB&9Lh!wNfB|l zWH;KHNeXCWjp9ipLNW#;l}gQ|7G|I*2xCqnkuX>s28TmK2(&mVOv03*!^B2%iU|%H zAZCl8eCC5;NI55y1x84$Q7C90IY}jpN@x;iOLX5c?79$XRr6HEsMSijOO%1UJ^sa?*1H@p2hz;09 z0$~!PsYZpN5#p&fBgBAQr0_eG!^J>ODJ)ObSxaZQeAbbNF^De^Dm3KisYnj{Gfo&G z3RPe@YzzRu5;T#?g(#RD08O-H;m}Mh0I&%-0*S!FPoZ!Y@u5m!hEDZLPQ`(! zh&W3QmQ6HA<4HK^%iI!&W|3GVG(cjpnK+gOfn-TiP|5d!Z0ka|M&Zn`UnDM}ObHhh z383=ghjBou_{)?BUjVpEnDVfhTbbhtI3mdkZ-uqAu(bRF@&rU;D9z=p=2$ZvPBFt_ zlh;6;Oeo#>0%j0^5rzdRCgdAKhL!_`mMO0eh*=?rRzs$W0Hy>Kd4OQ3HA?O+QckHT zDkNpHT*!_fTcM}`0~~q9P1f9MW)Ma(q+tFI{BKO|JWv|;f8+TA{mf!3l1M>Oh_lF< z6%4Q?f6wzR@Mk7BsN0DpqA2=*Sk(W(Q6>`B9?}IxQB&-@1K|^+iIx<~SA+_QRI~vy zlRXiBF*6e2D7FBKqof0D+1pI{*hfj!u4Gd_%85|?D~HTm)e&r zHxLHB_er4(bq0yn4_(G*upHLXV7p=AFwwchO)nwIETO%(7zQ&ll0QnaoRyJ~P*p-_ z*s1nRQ`R-tD=7S}6%y%7?7SpYP$0iW!6x6G5}(F6wTv zeB>37I=+uuK~o#kUvt)W&l24Y_nINumTemj&h0LL>SB6j@5b%guPtbO5pm)e8u_f7 z>6QMU=a@LaUrTSFJMC(ECA(?Go#CHGN|BOUGgGV%dxLX_V1S zUw!sL3)d$FAN`ai>s25tUCC(E=Do2c+X3(NTzbL% zs!M{w41JhQ>3X%D%CH`he(NRI)Nr@plwJ+}D9wZpR!mHm<5DUJV#VsyCG2)rh2;E&6*Ij;{tgVMs@quvBgB za*pP1#Nf-9@Q93DKTkw@Z+u)Xzc;?p2bpRQU8{{oP{bjAPx literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/sticker_side_powered.png b/src/main/resources/assets/create/textures/block/sticker_side_powered.png new file mode 100644 index 0000000000000000000000000000000000000000..04a2c1e23225b0efc07e02860a6d939e7590d6b1 GIT binary patch literal 6836 zcmeHLc|6o@*B?uEMUf?CP?l;|W6VsJEF%*WBDA1celvzKGiHVvZrZdVg-Q$VR(GW# zNvY5xrM-|lTZ@#Gr7Sf_d44lgdY|6=dHa0c=f8YDGv+$i_k7Q}&UMbYuHP@&cgZ4c z4Py-m1fosybYBYo*O7hHRKRc3{!t19qM{QY5G-6u5kYx;E`!Aepu#vF00qP>1_UB* zDhP_q?6;me^1$Y!T7X~q_G`9OF0%UBOPl8Ip~JM;E{?ic!0g@oHc6VoM!VlS4C0W(}wk0T=(L_J035o@3~$lfd});<~fW~9Ts%n)ZAX# z^oK#sWXW}l12K^9O>J8AAXjen1t&M7z2}Y4#*47!zWaN9EL+*_8TE!ZM3uWqqogX* zS6ywPvDBUPjDD%T{Z`Ghgf(X*u$?waAJk~2P6N>^P5a)nq}lbO%6#dFN9P->Pc_^g z%*bYI2iyL6=HX8-7YuExe;V0QaqsHlOq`^#o0yw-ce+Y@M#0eDI*X%8IHmh-GkUcN zZxr7Iwz=?rP(|p7^E1=+@uq*8)wZ^4oEKXgBUJ=#Tm7IL zhws}MF0;KZoc4LxsLB`_&fKpweXlUotT=DcO2&JK7H+S8MGN^-55!Zq{T#$iMJs&K zjZBN~eU7?)hF5$P`Pj;R0cOQn^L&d9+ZIkF7C{gIt_OCBV9IV!v}R-wQTqp4WP+m z5VhHmwsL2^k$Z5t$ zA02IM-_JdCJ&SPkZ}J{aS?8rKv;Md!i3)tS{1d(Bfux3!X65J6`WzA2@$t*XgMLf8 zo@;G8tz#%nQc&Bk$|R(#O=(B3I#TrRihkDm+R6O6+BdEo#88{x@TExUZu>c{roA@~ z+&$s)CRGwr2e$gu3HVlL;FefDj$_vHeQ~Z4_{M)^XPUfot?!dNUJSB zy^?(Cxq-O=VOs&$!4N_demcusjb|-iB!HS0$`6h(;iua1| zox%uDtKfDuozvZwIX$4ew?Oe|raOGLn(WB1KiEVpJ#c!TzfUsQap0O z3#0Z=qJtL7{7_$6QPy3b!n)9v$MeqT2H3pa!RT;Zkk^+|>L@hFo~7;5;U7AzRroBI6sb9XlTRH1~v!30)?b6~z)$C5odxQ~{zBi7h z2i=UyYC=^Dj>I32Cyk!7;^U^16j;O7F@mt%^$g;_h$$@cdrV=#G04Y$c3$cX>}SkaCj3 zMB;P$PHhdG)u6XPv5E>8qYLYQ$DOP0G_7b%!WV|HnQB@d`WI@ zUk@YDOip5kqvy4SCfCFKi5V$LM(!r)M=w^p1XTIu2Pbf#2ub5h}&4*nS16LHjx;JL9ywO1wdh^o3O%Cb6}u$%D` z{?iwdWf77XpD&fZp1a`>Po|eykkK|1 z&Eu{~UBg#LpNmQZDG{|^8rRqL7*r1#PKu9R&v+7jX~)cCaf-?Z*3YZxK80P^=u_Jn z1xrxYVk;Rujv_ZI!A0v1S-D|>AdOl*jY-cxZ@Xlps`XScF*1}}keK5HF?t&@q=LgK zn-gz`O5;RaCU^8t)(5Fl+6{j39UHD41TrOu1zrw<$=(DSHwsRnbEyDa9K{1O0|Iey z7V{{yNI(ds0!$Xi(fnQ6WpgNt?r0ulM@Eu)Za_H8GoBCl$1e$>#YfWcbaQ7X4F@p+ zB!~ip6sS0g%@Gj9j^=V+0{B}dMwmn85MiXFc`(@*>c-^*Pz)RcN5Y6=RxH}wNdxM@ zr!xpk-95%Bz>%YQxKPL=AP^#v2rjaPbNNgJ3XjJlkZ1%N4FeG{K^#X&5yLnF3mL^2 zhdUsk@xgRvaXC;KCxyz55jvWigY(dFa#^wy#h`H9fNU(M7YOMH5;(ws>j41>G!lt} zA<-~29x+iLoF$XLX>$bQQ3T_O5L0*v6dZ|&iuyrAASA|qxA#*GK>&D1Lo5XZ+!#I$ zAjSe5p~Xa_Ja&v=qRkiqAQQ>`X44r6&?&j)i8_l&WZ!Q(vM@4PQ9QYZ3_TG^r+vfm zV)$%1hE78OY#<7BL;y0Qe!vS^jPD!t!+K;h|KFP=&$jT`y!7k!JSKskr^eq zJDSV$sQ^|K;4h@e!iK`4F!pF19*e}<7^&85i|S-=W`FT=+r}mmlfF z_n}4rG~qw<{0#h!X(`z41VVls=|3#$f8ZR(64n#cVFF;k9WS=8a@J208AV6Za40MuhG9^VFboEdg;D5O z6pUiaz}aE3wsttMJ^x@>z-0(U6h7d>1akn~XRx^B`wX=n&p(?V@uF}*mRv|Q3Wl@= z`(OatmVm(%&`9&K-G(|KWF7YFY8_-fh)gC-jE94)M-fP}MD&m0@z^YY|6`oK=FR_t zo1j0QqyI^LB5X|CjmwJzt2kWfBjWs{`JVvC7`$0DfFt1klj{>9V_}(a5P?3A$-n~+ zJTDR74$Sc^krmQ^@ozi{{)-ks>fc6wDZanM^*da@6oFp?|IV)8;rgWr{1W(gcKyGF zOXK?^H^2e!eIoFIx`i1O4L*#kP`wtpLy{rU5Po6WADy5?o#(k+0D-_QWFG}_o^vcH zR27oQMAcVHiUugX!^Q*eL6MP=7%X(-M#-L{Amg`nsE8#Dhsv(@LF*?QKp=`iBzKnp z+@0Ovo0u7Xkm|L2svbVd+2f92t+3tYF-d9a>^DoRGGAEZ%4~28&f|jFr<1%g?z@)7 zOl>ilq&rWU)!`TYaCIB2c8^zoT8d%Vmdrtyl})7%V({g5*uDd~S$`FYM_Z3nuFbiX z9Bri0fjgXG{Y2qv+l7M(L+#zp$@A~tyQ!K>2nkWx1p=1m@9xc?<*JbTIQ89^xy9ur z)}`7>mett(h7@Rv8-YgENPU$@9J1;g=_+Z#YSkKnuTiHQN!Dd=+HeKeQ2pAU#PmL= zoix2x3^y2$4cv}k6kNof7Gx3~8fpT2Ygvr}d_J2(6OjLz)apzy^q zN0U^O?PW{Au|~34<7`EfKVPnRSteFpcp{L2L(R@!_pb8dq{Ym;E4kN_%|JgdplIo| zjJA?kxB?sw7k?3^htFPo2&y(ocrG?peNx$+D`$c?_AGq=aa)=x)1j-=LQli5Ah6NP zGOo{abocYB7uOpMA&u;;3i{MPj%l8Hdv(p6s8c2%|In&x8~nVcg=2qqh4!)Ldo``P zc}=X;Ri_@`dflI6Zya!vX>#;3r7mVBdD+U(#f|eJJ^ca+Rrh3Ym3Q9p$DMosN}i(( zY2^(LPg9t?d$E_hjb6jzyupE2^U6}_8iwbZPp1$oD=Gr!>d!ah5ppjptI$wR@46tX z)z^ROo4PK9n0YRwriY(#=e4?2T31t3Q_0#Nn|sjau&QGCevgOmm>S`t3tNfiyPBI; zylmG#Sk>11w{Xd^X%KQ9 literal 0 HcmV?d00001 From b1dc36d3582f9232b30e86aca8473e933a6a0b77 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 2 Mar 2021 23:12:43 -0800 Subject: [PATCH 045/124] Trying to tick everything is slow. - Keep track of tickable instances separately. --- .../block/belts/tunnel/BeltTunnelInstance.java | 2 +- .../logistics/block/funnel/FunnelInstance.java | 2 +- .../render/backend/instancing/ITickableInstance.java | 8 ++++++++ .../backend/instancing/InstancedTileRenderer.java | 11 ++++++++--- .../render/backend/instancing/TileEntityInstance.java | 5 ----- 5 files changed, 18 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/ITickableInstance.java diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index 5b38ee07f..654bea79b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -16,7 +16,7 @@ import java.util.Collection; import java.util.EnumMap; import java.util.Map; -public class BeltTunnelInstance extends TileEntityInstance { +public class BeltTunnelInstance extends TileEntityInstance implements ITickableInstance { public static void register(TileEntityType type) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, BeltTunnelInstance::new)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index 21d838502..b91a5b37f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -13,7 +13,7 @@ import net.minecraftforge.fml.DistExecutor; import java.util.ArrayList; -public class FunnelInstance extends TileEntityInstance { +public class FunnelInstance extends TileEntityInstance implements ITickableInstance { public static void register(TileEntityType type) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, FunnelInstance::new)); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ITickableInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ITickableInstance.java new file mode 100644 index 000000000..4d79545a4 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/ITickableInstance.java @@ -0,0 +1,8 @@ +package com.simibubi.create.foundation.render.backend.instancing; + +public interface ITickableInstance { + /** + * Called every frame, this can be used to make more dynamic animations. + */ + void tick(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 2f7c37288..325a3c3a5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -1,7 +1,6 @@ package com.simibubi.create.foundation.render.backend.instancing; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import javax.annotation.Nullable; @@ -20,6 +19,8 @@ import net.minecraft.world.World; public abstract class InstancedTileRenderer

{ protected Map> instances = new HashMap<>(); + protected Map tickableInstances = new HashMap<>(); + protected Map, RenderMaterial> materials = new HashMap<>(); protected InstancedTileRenderer() { @@ -41,7 +42,7 @@ public abstract class InstancedTileRenderer

{ } public void beginFrame(double cameraX, double cameraY, double cameraZ) { - instances.values().forEach(TileEntityInstance::tick); + tickableInstances.values().forEach(ITickableInstance::tick); } public void render(RenderType layer, Matrix4f viewProjection, double camX, double camY, double camZ) { @@ -79,6 +80,9 @@ public abstract class InstancedTileRenderer

{ if (renderer != null) { instances.put(tile, renderer); + + if (renderer instanceof ITickableInstance) + tickableInstances.put(tile, (ITickableInstance) renderer); } return renderer; @@ -126,6 +130,7 @@ public abstract class InstancedTileRenderer

{ if (instance != null) { instance.remove(); instances.remove(tile); + tickableInstances.remove(tile); } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index fd77e7fd3..8683832da 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -33,11 +33,6 @@ public abstract class TileEntityInstance { } } - /** - * Called every frame, this can be used to make more dynamic animations. - */ - public void tick() { } - /** * Acquire all {@link InstanceKey}s and initialize any data you may need to calculate the instance properties. */ From 5567e57265cfd582677bd58f5a14ef32bf2cb1b6 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 Mar 2021 16:34:10 +0100 Subject: [PATCH 046/124] Post-PR datagen --- src/generated/resources/.cache/cache | 18 +- .../assets/create/blockstates/fluid_pipe.json | 182 +++++++++--------- .../create/blockstates/radial_chassis.json | 24 +-- .../assets/create/lang/unfinished/de_de.json | 2 +- .../assets/create/lang/unfinished/es_es.json | 74 +++---- .../assets/create/lang/unfinished/es_mx.json | 2 +- .../assets/create/lang/unfinished/fr_fr.json | 2 +- .../assets/create/lang/unfinished/it_it.json | 2 +- .../assets/create/lang/unfinished/ja_jp.json | 2 +- .../assets/create/lang/unfinished/ko_kr.json | 2 +- .../assets/create/lang/unfinished/nl_nl.json | 2 +- .../assets/create/lang/unfinished/pt_br.json | 2 +- .../assets/create/lang/unfinished/ru_ru.json | 22 +-- .../assets/create/lang/unfinished/zh_cn.json | 2 +- .../assets/create/lang/unfinished/zh_tw.json | 2 +- 15 files changed, 177 insertions(+), 163 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index e5c3179d6..adddd5c58 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 -cedc68a9c3ab47a94bd8200889316a708c25950a 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 -ab2a1bf8f37f1c64d00538867f4c3a97195bd3c4 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,6 +401,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 +369f9c6fce0aa11d70efa2e73a4ba2ff12e57e37 assets/create/lang/en_ud.json +0dd7dbb57e8c2cb13498fcbf3f5b28ddbed28a67 assets/create/lang/en_us.json +96b15a158336ded61b5f64760331cd5b3db1ad94 assets/create/lang/unfinished/de_de.json +3e90bdf50e0437be7dd526f15576816b4273f2f6 assets/create/lang/unfinished/es_es.json +ac92cedf2c602239ca1d8e3ecffef9153e492355 assets/create/lang/unfinished/es_mx.json +f84146bf81d48cf89274a5f95f8f02f7450e4fff assets/create/lang/unfinished/fr_fr.json +d5c292a0ecab558c9a4704abd3d3274f64c6d020 assets/create/lang/unfinished/it_it.json +42d86a97e0bf04982392e37f2034b33349857b96 assets/create/lang/unfinished/ja_jp.json +09d1683c72fd4c3dbacdd3485c580020bc6b4baa assets/create/lang/unfinished/ko_kr.json +4501e9ad422cdffb000326043cd764db78a6678e assets/create/lang/unfinished/nl_nl.json +691b5fb5146ad38b94de4b1c6a640390a10a87d0 assets/create/lang/unfinished/pt_br.json +773b40b4f8100bbde0e40cf6f131ae44f6004ade assets/create/lang/unfinished/ru_ru.json +cb6fc7e408753280b7059bdadb3ccf31845167e1 assets/create/lang/unfinished/zh_cn.json +b3d2618c25b4ff9abfb0330f4a900732f4c82ab9 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 d4179b0cb..80a25280c 100644 --- a/src/generated/resources/assets/create/blockstates/fluid_pipe.json +++ b/src/generated/resources/assets/create/blockstates/fluid_pipe.json @@ -60,10 +60,10 @@ }, { "when": { - "north": "true", "down": "false", + "up": "true", "south": "false", - "up": "true" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_x" @@ -71,10 +71,10 @@ }, { "when": { - "north": "false", "down": "false", + "up": "true", "south": "true", - "up": "true" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_x" @@ -82,10 +82,10 @@ }, { "when": { - "north": "true", "down": "true", + "up": "false", "south": "false", - "up": "false" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_x" @@ -93,10 +93,10 @@ }, { "when": { - "north": "false", "down": "true", + "up": "false", "south": "true", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_x" @@ -104,10 +104,10 @@ }, { "when": { - "north": "false", "down": "true", + "up": "true", "south": "false", - "up": "true" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -115,10 +115,10 @@ }, { "when": { - "north": "false", "down": "false", + "up": "true", "south": "false", - "up": "true" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -126,10 +126,10 @@ }, { "when": { - "north": "false", "down": "true", + "up": "false", "south": "false", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_x" @@ -137,10 +137,10 @@ }, { "when": { - "north": "true", "down": "false", + "up": "false", "south": "true", - "up": "false" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -148,10 +148,10 @@ }, { "when": { - "north": "true", "down": "false", + "up": "false", "south": "false", - "up": "false" + "north": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -159,10 +159,10 @@ }, { "when": { - "north": "false", "down": "false", + "up": "false", "south": "true", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_x" @@ -170,10 +170,10 @@ }, { "when": { - "north": "false", "down": "false", + "up": "false", "south": "false", - "up": "false" + "north": "false" }, "apply": { "model": "create:block/fluid_pipe/none_x" @@ -181,10 +181,10 @@ }, { "when": { - "east": "false", - "north": "false", "south": "true", - "west": "true" + "west": "true", + "north": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lu_y" @@ -192,10 +192,10 @@ }, { "when": { - "east": "true", - "north": "false", "south": "true", - "west": "false" + "west": "false", + "north": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ru_y" @@ -203,10 +203,10 @@ }, { "when": { - "east": "false", - "north": "true", "south": "false", - "west": "true" + "west": "true", + "north": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ld_y" @@ -214,10 +214,10 @@ }, { "when": { - "east": "true", - "north": "true", "south": "false", - "west": "false" + "west": "false", + "north": "true", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/rd_y" @@ -225,32 +225,10 @@ }, { "when": { - "east": "false", - "north": "true", "south": "true", - "west": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_y" - } - }, - { - "when": { - "east": "false", - "north": "false", - "south": "true", - "west": "false" - }, - "apply": { - "model": "create:block/fluid_pipe/ud_y" - } - }, - { - "when": { - "east": "false", + "west": "false", "north": "true", - "south": "false", - "west": "false" + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_y" @@ -258,10 +236,32 @@ }, { "when": { - "east": "true", + "south": "true", + "west": "false", "north": "false", + "east": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_y" + } + }, + { + "when": { "south": "false", - "west": "true" + "west": "false", + "north": "true", + "east": "false" + }, + "apply": { + "model": "create:block/fluid_pipe/ud_y" + } + }, + { + "when": { + "south": "false", + "west": "true", + "north": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -269,10 +269,10 @@ }, { "when": { - "east": "false", - "north": "false", "south": "false", - "west": "true" + "west": "true", + "north": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -280,10 +280,10 @@ }, { "when": { - "east": "true", - "north": "false", "south": "false", - "west": "false" + "west": "false", + "north": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_y" @@ -291,10 +291,10 @@ }, { "when": { - "east": "false", - "north": "false", "south": "false", - "west": "false" + "west": "false", + "north": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_y" @@ -302,10 +302,10 @@ }, { "when": { - "east": "true", "down": "false", "up": "true", - "west": "false" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lu_z" @@ -313,10 +313,10 @@ }, { "when": { - "east": "false", "down": "false", "up": "true", - "west": "true" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ru_z" @@ -324,10 +324,10 @@ }, { "when": { - "east": "true", "down": "true", "up": "false", - "west": "false" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/ld_z" @@ -335,10 +335,10 @@ }, { "when": { - "east": "false", "down": "true", "up": "false", - "west": "true" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/rd_z" @@ -346,10 +346,10 @@ }, { "when": { - "east": "false", "down": "true", "up": "true", - "west": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -357,10 +357,10 @@ }, { "when": { - "east": "false", "down": "false", "up": "true", - "west": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -368,10 +368,10 @@ }, { "when": { - "east": "false", "down": "true", "up": "false", - "west": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/ud_z" @@ -379,10 +379,10 @@ }, { "when": { - "east": "true", "down": "false", "up": "false", - "west": "true" + "west": "true", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -390,10 +390,10 @@ }, { "when": { - "east": "true", "down": "false", "up": "false", - "west": "false" + "west": "false", + "east": "true" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -401,10 +401,10 @@ }, { "when": { - "east": "false", "down": "false", "up": "false", - "west": "true" + "west": "true", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/lr_z" @@ -412,10 +412,10 @@ }, { "when": { - "east": "false", "down": "false", "up": "false", - "west": "false" + "west": "false", + "east": "false" }, "apply": { "model": "create:block/fluid_pipe/none_z" diff --git a/src/generated/resources/assets/create/blockstates/radial_chassis.json b/src/generated/resources/assets/create/blockstates/radial_chassis.json index 410cb13c7..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", 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 b4f514fa1..ef30133b1 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: 989", "_": "->------------------------] Game Elements [------------------------<-", 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 20acf0dd8..da20ce519 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: 19", "_": "->------------------------] Game Elements [------------------------<-", @@ -108,7 +108,7 @@ "block.create.dolomite_pillar": "Pilar de dolomita", "block.create.encased_chain_drive": "Cadena de transmisión revestida", "block.create.encased_fan": "Ventilador revestido", - "block.create.encased_fluid_pipe": "Tubería de fluidos de cobre revestida", + "block.create.encased_fluid_pipe": "Tubería de fluidos de cobre reforzada", "block.create.fancy_andesite_bricks": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_slab": "Ladrillos de andesita elegantes", "block.create.fancy_andesite_bricks_stairs": "Escaleras de ladrillos de andesita elegantes", @@ -166,7 +166,7 @@ "block.create.gantry_shaft": "Eje de grúa", "block.create.gearbox": "Caja de transmisión", "block.create.gearshift": "Caja de cambios", - "block.create.glass_fluid_pipe": "Tubo de cristal para fluidos", + "block.create.glass_fluid_pipe": "Tubería de fluidos de cristal", "block.create.granite_bricks": "Ladrillos de granito", "block.create.granite_bricks_slab": "Losa de ladrillos de granito", "block.create.granite_bricks_stairs": "Escaleras de ladrillos de granito", @@ -350,7 +350,7 @@ "block.create.redstone_link": "Enlace de Redstone", "block.create.refined_radiance_casing": "Revestidor de radiante", "block.create.reinforced_rail": "Raíl reforzado", - "block.create.rope": "Soga", + "block.create.rope": "Cuerda", "block.create.rope_pulley": "Polea de cuerda", "block.create.rotation_speed_controller": "Controlador de velocidad de rotación", "block.create.sail_frame": "Marco de vela", @@ -511,7 +511,7 @@ "advancement.create.splitter_tunnel": "Divide y vencerás", "advancement.create.splitter_tunnel.desc": "Crear un divisor con un grupo de túneles de latón.", "advancement.create.chute": "Caída en picado", - "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la correa.", + "advancement.create.chute.desc": "Coloque un ducto, la contrapartida vertical de la cinta.", "advancement.create.upward_chute": "Abducción aérea", "advancement.create.upward_chute.desc": "Observe cómo un objeto lanzado vuela hacia un paracaídas impulsado por un ventilador.", "advancement.create.belt_funnel": "Colgantes con forma de embudo", @@ -537,7 +537,7 @@ "advancement.create.aesthetics": "Boom, Estética!", "advancement.create.aesthetics.desc": "Colocar los soportes en un eje, tubo y rueda dentada.", "advancement.create.reinforced": "Boom, Reforzado!", - "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una correa.", + "advancement.create.reinforced.desc": "Utilizar bloques de revestimiento en un eje, un tubo y una cinta.", "advancement.create.water_wheel": "Aprovechar la hidráulica", "advancement.create.water_wheel.desc": "Coloca una Rueda hidráulica e intenta hacerla girar.", "advancement.create.chocolate_wheel": "Potencia de buen gusto", @@ -689,7 +689,7 @@ "create.recipe.mechanical_crafting": "Elaboración mecánica", "create.recipe.automatic_shaped": "Elaboración automatizada de productos con forma", "create.recipe.block_cutting": "Corte de bloques", - "create.recipe.wood_cutting": "UNLOCALIZED: Wood Cutting", + "create.recipe.wood_cutting": "Corte de maderas", "create.recipe.blockzapper_upgrade": "Blockzapper", "create.recipe.sandpaper_polishing": "Pulido con papel de lija", "create.recipe.mystery_conversion": "Conversión misteriosa", @@ -829,12 +829,12 @@ "create.gui.goggles.at_current_speed": "con la velocidad actual", "create.gui.goggles.pole_length": "Longitud del poste:", "create.gui.assembly.exception": "Este artilugio no se pudo montar:", - "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s %2$s %3$s]", - "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s %2$s %3$s] no estaba en un chunk cargado", + "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s,%2$s,%3$s]", + "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s,%2$s,%3$s] no estaba en un chunk cargado", "create.gui.assembly.exception.structureTooLarge": "Hay demasiados bloques incluídos en el artilugio.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.tooManyPistonPoles": "Hay demasiadas Pértigas de extensión conectadas a este Pistón.\nEl máximo configurado es: %1$s", "create.gui.assembly.exception.noPistonPoles": "Faltan pértigas de extensión para el Pistón", - "create.gui.assembly.exception.not_enough_sails": "UNLOCALIZED: Attached structure does not include enough sail-like blocks: %1$s\nA minimum of %2$s are required", + "create.gui.assembly.exception.not_enough_sails": "La estructura adjunta no incluye suficientes bloques tipo vela: %1$s\nSe requiere un mínimo de %2$s", "create.gui.gauge.info_header": "Información sobre el medidor:", "create.gui.speedometer.title": "Velocidad de rotación", "create.gui.stressometer.title": "Estrés de la red", @@ -860,19 +860,19 @@ "create.gui.stockpile_switch.move_to_upper_at": "Pasar al carril superior en %1$s%%", "create.gui.sequenced_gearshift.title": "Cambio de marchas secuenciado", "create.gui.sequenced_gearshift.instruction": "Instrucción", - "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "UNLOCALIZED: Turn by angle", + "create.gui.sequenced_gearshift.instruction.turn_angle.descriptive": "Giro por ángulo", "create.gui.sequenced_gearshift.instruction.turn_angle": "Giro", "create.gui.sequenced_gearshift.instruction.turn_angle.angle": "Ángulo", - "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "UNLOCALIZED: Turn to move Piston/Pulley/Gantry", + "create.gui.sequenced_gearshift.instruction.turn_distance.descriptive": "Giro para mover el pistón/polea/grúa", "create.gui.sequenced_gearshift.instruction.turn_distance": "Pistón", "create.gui.sequenced_gearshift.instruction.turn_distance.distance": "Distancia", - "create.gui.sequenced_gearshift.instruction.delay.descriptive": "UNLOCALIZED: Timed Delay", - "create.gui.sequenced_gearshift.instruction.delay": "UNLOCALIZED: Delay", - "create.gui.sequenced_gearshift.instruction.delay.duration": "UNLOCALIZED: Duration", - "create.gui.sequenced_gearshift.instruction.end.descriptive": "UNLOCALIZED: End", + "create.gui.sequenced_gearshift.instruction.delay.descriptive": "Tiempo de retraso", + "create.gui.sequenced_gearshift.instruction.delay": "Retraso", + "create.gui.sequenced_gearshift.instruction.delay.duration": "Duración", + "create.gui.sequenced_gearshift.instruction.end.descriptive": "Fin", "create.gui.sequenced_gearshift.instruction.end": "Fin", - "create.gui.sequenced_gearshift.instruction.await.descriptive": "UNLOCALIZED: Await new Redstone Pulse", - "create.gui.sequenced_gearshift.instruction.await": "UNLOCALIZED: Await", + "create.gui.sequenced_gearshift.instruction.await.descriptive": "En espera de un Pulso de Redstone", + "create.gui.sequenced_gearshift.instruction.await": "En espera", "create.gui.sequenced_gearshift.speed": "Velocidad, Dirección", "create.gui.sequenced_gearshift.speed.forward": "Velocidad de entrada, hacia adelante", "create.gui.sequenced_gearshift.speed.forward_fast": "Doble velocidad, hacia adelante", @@ -1185,19 +1185,19 @@ "block.create.metal_bracket.tooltip.summary": "Decora tus _Ejes_, _Ruedas dentadas_ y _Ductos_ con un poco de refuerzo industrial robusto.", "block.create.andesite_casing.tooltip": "REVESTIDOR DE ANDESITA", - "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _encastrar ejes_ y _correas._", + "block.create.andesite_casing.tooltip.summary": "Máquina de revestimiento simple con una variedad de usos. Seguro para la decoración. Puede utilizarse para _revestir ejes_ y _cintas._", "block.create.andesite_funnel.tooltip": "EMBUDO DE ANDESITA", "block.create.andesite_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_.", "block.create.andesite_funnel.tooltip.condition1": "Comportamiento general", "block.create.andesite_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo", - "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", + "block.create.andesite_funnel.tooltip.condition2": "Cuando se montan en cintas, depósitos y similares", "block.create.andesite_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave.", "block.create.andesite_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.andesite_funnel.tooltip.behaviour3": "Transferirá los artículos hacia abajo, como una tolva sin búfer.", "block.create.andesite_tunnel.tooltip": "TÚNEL DE ANDESITA", - "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _correas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra correa o depósito al lado de la correa principal.", + "block.create.andesite_tunnel.tooltip.summary": "¡Una cubierta protectora para sus _cintas_!. El _Túnel de Andesita_ puede separar un elemento de una pila cuando se coloca otra cinta o depósito al lado de la cinta principal.", "block.create.andesite_tunnel.tooltip.control1": "Click derecho con la Llave Inglesa en el lateral", "block.create.andesite_tunnel.tooltip.action1": "_Ajusta las persianas de las ventanas_ si el túnel tiene una ventana en esa cara.", @@ -1205,15 +1205,15 @@ "block.create.brass_funnel.tooltip.summary": "Un componente de transferencia de elementos en general, que hace la transición de éstos entre los medios de transporte. Se puede controlar con una _señal de Redstone_. Viene con un práctico _filtro_.", "block.create.brass_funnel.tooltip.condition1": "Comportamiento General", "block.create.brass_funnel.tooltip.behaviour1": "La cara _abierta_ _recogerá los objetos molidos_ en el espacio del bloque que tiene delante y los _insertará_ en cualquier contenedor del lado opuesto del embudo.", - "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en correas, depósitos y similares", + "block.create.brass_funnel.tooltip.condition2": "Cuando se montan en cintas, depósitos y similares", "block.create.brass_funnel.tooltip.behaviour2": "_Recoge_ o _Coloca_ los elementos en el componente montado, desde o hacia el inventario _detrás_ de sí mismo. Siempre que el embudo tenga una direccionalidad específica, puede invertirse utilizando una Llave Inglesa.", "block.create.brass_funnel.tooltip.condition3": "Cuando se encuentra verticalmente entre dos inventarios", "block.create.brass_funnel.tooltip.behaviour3": "Transfiere los artículos hacia abajo, como una tolva sin búfer.", "block.create.brass_tunnel.tooltip": "TÚNEL DE LATÓN", - "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _correas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", + "block.create.brass_tunnel.tooltip.summary": "Una cubierta protectora elegante para sus _cintas_. Los _Túneles de latón_ también vienen con una serie de opciones de _Filtración_ y _División_ para sus artículos.", "block.create.brass_tunnel.tooltip.condition1": "Cuando se colocan uno al lado del otro", - "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una correa a otra.", + "block.create.brass_tunnel.tooltip.behaviour1": "Los túneles de latón se conectan entre sí y permiten redirigir el contenido de una cinta a otra.", "block.create.brass_tunnel.tooltip.condition2": "Filtrado", "block.create.brass_tunnel.tooltip.behaviour2": "Los _Túneles de latón_ vienen con filtros tanto para la _Entrada_ como para la _Salida_. Si un _Elemento_ no está permitido desde la salida filtrada de un _Túnel_ será transferido a la salida de un _Túnel_ conectado.", "block.create.brass_tunnel.tooltip.condition3": "Dividiendo", @@ -1228,8 +1228,8 @@ "block.create.copper_casing.tooltip.condition1": "Cuando se utiliza en una tubería de fluidos", "block.create.copper_casing.tooltip.behaviour1": "_Reviste_ la _Tubería de fluidos_ con _Revestimiento de cobre_. Las tuberías de fluidos revestidas _bloquean sus conexiones_ en su lugar, dejando de reaccionar a los cambios en las tuberías vecinas.", - "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REVESTIDO", - "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos revestido con cobre.", + "block.create.encased_fluid_pipe.tooltip": "TUBO DE FLUIDOS REFORZADO", + "block.create.encased_fluid_pipe.tooltip.summary": "Un tubo de fluidos reforzado con más cobre.", "block.create.copper_valve_handle.tooltip": "ASA DE VÁLVULA DE COBRE", "block.create.copper_valve_handle.tooltip.summary": "Una precisa _fuente_ de _fuerza de rotación_ que requiere la interacción de los jugadores. ¡Ten cuidado de no agotarte!", @@ -1244,12 +1244,12 @@ "block.create.chute.tooltip": "DUCTO", "block.create.chute.tooltip.summary": "_Recoge_ y _Transporta_ elementos en vertical o en diagonal. Puede tanto coger como colocar objetos en _contenedores de objetos_. También puede interactuar con los ductos desde el lateral utilizando _tolvas_ o _embudos montados_.", "block.create.chute.tooltip.condition1": "Cuando se alimenta con un ventilador", - "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _correas_.", + "block.create.chute.tooltip.behaviour1": "Los ductos accionados por ventilador pueden transportar _elementos_ hacia arriba, y aspirar _elementos_ de los _depósitos_ y de las _cintas_.", "block.create.depot.tooltip": "DEPÓSITO", "block.create.depot.tooltip.summary": "Un lugar práctico para colocar sus _elementos_. Proporciona un punto de interacción para varias máquinas", "block.create.depot.tooltip.condition1": "Click derecho en el depósito", - "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _Correa_ también funcionan en un _Depósito_.", + "block.create.depot.tooltip.behaviour1": "Coloca o toma un _Elemento_ del _Depósito_. Los _Bloques_ y los _Artilugios_ que interactúan con una _cinta_ también funcionan en un _Depósito_.", "item.create.blaze_cake.tooltip": "PASTEL DE BLAZE", "item.create.blaze_cake.tooltip.summary": "Un delicioso regalo para sus esforzados _Quemadores de blaze_. Los pone en marcha!.", @@ -1311,7 +1311,7 @@ "block.create.spout.tooltip.condition1": "Transferencia de fluidos", "block.create.spout.tooltip.behaviour1": "Cuando se coloca un _contenedor de fluidos_ como un _cubo_ o una _botella_ debajo, el caño intentará rellenarlo con su propio _fluido_ almacenado", "block.create.spout.tooltip.condition2": "Automatización de fluidos", - "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _correa_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", + "block.create.spout.tooltip.behaviour2": "El caño colocado encima de una _cinta_ o _depósito_ reaccionará automáticamente con un contenedor de fluidos_ que pase por debajo", "block.create.item_drain.tooltip": "DRENADOR DE ELEMENTOS", "block.create.item_drain.tooltip.summary": "Un depósito rallado para vaciar tus _artículos fluidos._", @@ -1321,7 +1321,7 @@ "block.create.mechanical_arm.tooltip": "BRAZO MECÁNICO", "block.create.mechanical_arm.tooltip.summary": "Artilugio avanzado para reubicar _elementos_", "block.create.mechanical_arm.tooltip.condition1": "Transferencia de elementos", - "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Correas_, _Depósitos_, _Embudos_ y _Autoensambladores_", + "block.create.mechanical_arm.tooltip.behaviour1": "Puede tomar o colocar objetos en cualquier _inventario_ accesible_, como _Cintas_, _Depósitos_, _Embudos_ y _Autoensambladores_", "block.create.mechanical_arm.tooltip.control1": "Mientras está en la mano", "block.create.mechanical_arm.tooltip.action1": "Haz clic con el botón derecho en un _objeto accesible del inventario_ para establecerlo como _fuente_ para el _brazo mecánico_. Haz clic con el botón derecho del ratón dos veces para establecerlo como _destino_", "block.create.mechanical_arm.tooltip.control2": "Usa la rueda del ratón con la Llave Inglesa", @@ -1436,7 +1436,7 @@ "block.create.gearshift.tooltip.condition1": "Cuando se alimenta", "block.create.gearshift.tooltip.behaviour1": "_Invierte_ la rotación de salida", - "block.create.clutch.tooltip": "UNLOCALIZED: CLUTCH", + "block.create.clutch.tooltip": "Embrague", "block.create.clutch.tooltip.summary": "Un control para conectar/desconectar la rotación de los ejes conectados", "block.create.clutch.tooltip.condition1": "Cuando se acciona", "block.create.clutch.tooltip.behaviour1": "_Detiene_ el transporte de la rotación al otro lado", @@ -1521,8 +1521,8 @@ "block.create.mechanical_press.tooltip.summary": "Un pistón de fuerza para comprimir los objetos que tiene debajo. Requiere una _fuerza de rotación_ constante", "block.create.mechanical_press.tooltip.condition1": "Cuando es impulsado por Redstone", "block.create.mechanical_press.tooltip.behaviour1": "Comienza a _comprimir_ los objetos que caen debajo", - "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una correa", - "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la correa", + "block.create.mechanical_press.tooltip.condition2": "Cuando está por encima de una cinta", + "block.create.mechanical_press.tooltip.behaviour2": "Comprime _automáticamente_ los elementos de derivación en la cinta", "block.create.mechanical_press.tooltip.condition3": "Cuando está por encima de la Cuenca", "block.create.mechanical_press.tooltip.behaviour3": "Comienza a _compactar artículos_ en la cuenca siempre que estén presentes todos los ingredientes necesarios", @@ -1547,13 +1547,13 @@ "block.create.mechanical_mixer.tooltip.behaviour1": "Comienza a mezclar los elementos en la cuenca siempre que estén presentes todos los ingredientes necesarios. Para evitar recetas no deseadas, utilice la ranura del filtro de la cuenca o reduzca la fuerza de rotación hasta que se hayan añadido todos los ingredientes deseados", "block.create.mechanical_crafter.tooltip": "AUTOENSAMBLADOR MECÁNICO", - "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus correas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", + "block.create.mechanical_crafter.tooltip.summary": "Un ensamblador cinético para _automatizar_ cualquier receta de _crafteo_ con forma. Coloca _múltiples en una cuadrícula_ correspondiente a tu receta, y _organiza sus cintas_ para crear un _flujo_ que salga de la cuadrícula en uno de los Autoensambladores", "block.create.mechanical_crafter.tooltip.condition1": "Cuando es impulsado por la cinética", "block.create.mechanical_crafter.tooltip.behaviour1": "_Empieza el proceso de creación_ en cuanto _todos los crafters_ de la parrilla hayan recibido un objeto_", "block.create.mechanical_crafter.tooltip.condition2": "Con pulso de Redstone", "block.create.mechanical_crafter.tooltip.behaviour2": "_Fuerza_ el inicio del proceso de _creación_ con todos los _artículos_ dados actualmente en la parrilla", "block.create.mechanical_crafter.tooltip.control1": "Cuando se arranca por delante", - "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las correas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", + "block.create.mechanical_crafter.tooltip.action1": "_Circula la dirección_ hacia la que un autoensamblador individual _mueve sus objetos_. Para formar una cuadrícula de trabajo, _organiza las cintas en un flujo_ que mueva todos los objetos hacia un autoensamblador final. El autoensamblador final debe _apuntar hacia fuera_ de la rejilla", "block.create.mechanical_crafter.tooltip.control2": "Cuando se arranca hacia atrás", "block.create.mechanical_crafter.tooltip.action2": "Conecta_ el _inventario de entrada_ de los autoensambladores adyacentes. Usa esto para _combinar ranuras_ en la cuadrícula de trabajo y _guardar el la entrada de trabajo_", @@ -1658,7 +1658,7 @@ "block.create.secondary_linear_chassis.tooltip": "CHASIS LINEAL SECUNDARIO", "block.create.secondary_linear_chassis.tooltip.summary": "Un segundo tipo de _Chasis lineal_ que no se conecta al otro", - "block.create.radial_chassis.tooltip": "UNLOCALIZED: ROTATION CHASSIS", + "block.create.radial_chassis.tooltip": "CHASIS RADIAL", "block.create.radial_chassis.tooltip.summary": "Bloque base configurable que conecta estructuras para el movimiento", "block.create.radial_chassis.tooltip.condition1": "Cuando se mueve", "block.create.radial_chassis.tooltip.behaviour1": "_Mueve_ todos los _Chasis_ adjuntos en una columna, y un cilindro de bloques a su alrededor. Los bloques que lo rodean sólo se mueven cuando están dentro del rango y están adheridos a un lado pegajoso (Ver [Ctrl]).", @@ -1744,7 +1744,7 @@ "block.create.deployer.tooltip.behaviour3": "El desplegador no se activará a menos que el elemento retenido _coincida_ con el _filtro._ Los elementos que no coincidan no podrán ser insertados; los elementos retenidos que coincidan con el filtro no podrán ser extraídos.", "block.create.brass_casing.tooltip": "REVESTIDOR DE LATÓN", - "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _correas._", + "block.create.brass_casing.tooltip.summary": "Resistente máquina revestidora con una gran variedad de usos. Segura para la decoración. Se puede utilizar para _revestir ejes_ y _cintas._", "block.create.pulse_repeater.tooltip": "REPETIDOR DE PULSOS DE REDSTONE", "block.create.pulse_repeater.tooltip.summary": "Un circuito sencillo para cortar las señales de Redstone que pasan a una longitud de _1 tick_", 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 b8e2ed112..567455835 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: 919", "_": "->------------------------] Game Elements [------------------------<-", 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 67f324ccc..7c63419d4 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: 701", "_": "->------------------------] Game Elements [------------------------<-", 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 600ce86e4..0d220b4aa 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: 36", "_": "->------------------------] Game Elements [------------------------<-", 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 8df1f5557..9d52c50ac 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: 43", "_": "->------------------------] Game Elements [------------------------<-", 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 8943e8fec..5b334ff56 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: 90", "_": "->------------------------] Game Elements [------------------------<-", 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 0c9221797..8912b67a8 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: 1188", "_": "->------------------------] Game Elements [------------------------<-", 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 77de36ab7..886089ecf 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: 1254", "_": "->------------------------] Game Elements [------------------------<-", 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 103a5c0e9..5faa13307 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: 40", "_": "->------------------------] Game Elements [------------------------<-", @@ -777,7 +777,7 @@ "create.gui.terrainzapper.tool.overlay": "Наложение", "create.gui.terrainzapper.tool.flatten": "Выравнивание", - "create.terrainzapper.shiftRightClickToSet": "ПКМ крадясь, чтобы выбрать форму", + "create.terrainzapper.shiftRightClickToSet": "ПКМ крадучись, чтобы выбрать форму", "create.blockzapper.usingBlock": "С помощью: %1$s", "create.blockzapper.componentUpgrades": "Обновления компонентов:", @@ -1335,7 +1335,7 @@ "item.create.wand_of_symmetry.tooltip.action1": "_Создаёт_ или _Перемещает_ зеркало", "item.create.wand_of_symmetry.tooltip.control2": "ПКМ в воздух", "item.create.wand_of_symmetry.tooltip.action2": "_Убирает_ зеркало", - "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадясь", + "item.create.wand_of_symmetry.tooltip.control3": "ПКМ крадучись", "item.create.wand_of_symmetry.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.handheld_blockzapper.tooltip": "BLOCKZAPPER", @@ -1344,7 +1344,7 @@ "item.create.handheld_blockzapper.tooltip.action1": "Устанавливает выбранный блок как материал.", "item.create.handheld_blockzapper.tooltip.control2": "ПКМ на блок", "item.create.handheld_blockzapper.tooltip.action2": "_Размещает_ или _Замещает_ блок.", - "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_blockzapper.tooltip.control3": "ПКМ крадучись", "item.create.handheld_blockzapper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.handheld_worldshaper.tooltip": "HANDHELD WORLDSHAPER", @@ -1353,7 +1353,7 @@ "item.create.handheld_worldshaper.tooltip.action1": "Устанавливает блоки, помещенные инструментом, в целевой блок.", "item.create.handheld_worldshaper.tooltip.control2": "ПКМ на блок", "item.create.handheld_worldshaper.tooltip.action2": "Применяет выбранную _кисть_ и _инструмент_ в выбранном месте.", - "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадясь", + "item.create.handheld_worldshaper.tooltip.control3": "ПКМ крадучись", "item.create.handheld_worldshaper.tooltip.action3": "Открывает _интерфейс_ _конфигурации_", "item.create.tree_fertilizer.tooltip": "TREE FERTILIZER", @@ -1390,7 +1390,7 @@ "item.create.schematic.tooltip.summary": "Содержит структуру, которая будет позиционироваться и помещаться в мир. Расположите голограмму по своему усмотрению и используйте _схематичную пушку_ для ее построения.", "item.create.schematic.tooltip.condition1": "При удерживании", "item.create.schematic.tooltip.behaviour1": "Может быть позиционирован с помощью инструментов на экране.", - "item.create.schematic.tooltip.control1": "ПКМ крадясь", + "item.create.schematic.tooltip.control1": "ПКМ крадучись", "item.create.schematic.tooltip.action1": "Открывает _интерфейс_ для ввода _точных_ _координат_.", "item.create.schematic_and_quill.tooltip": "SCHEMATIC AND QUILL", @@ -1403,7 +1403,7 @@ "item.create.schematic_and_quill.tooltip.action1": "Выберите угловые точки / подтвердите сохранение.", "item.create.schematic_and_quill.tooltip.control2": "Удержание Ctrl", "item.create.schematic_and_quill.tooltip.action2": "Выберите точки в воздухе. Прокрутка для настройки расстояния.", - "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадясь", + "item.create.schematic_and_quill.tooltip.control3": "ПКМ крадучись", "item.create.schematic_and_quill.tooltip.action3": "_Сбрасывает_ и _удаляет_ выделение.", "block.create.schematicannon.tooltip": "SCHEMATICANNON", @@ -1455,7 +1455,7 @@ "item.create.belt_connector.tooltip.summary": "Соединяет _2_ _Вала_ с помощью _механического_ _ремня_._ Соединённые валы будут иметь одинаковые _скорость_ и _направление_ _вращения._ Лента может служить как _конвейер_ для _транспортировки._", "item.create.belt_connector.tooltip.control1": "ПКМ по валу", "item.create.belt_connector.tooltip.action1": "Выбирает вал в качестве одного шкива конвейера. Оба выбранных вала должны быть _на_ _одной_ _линии_ _вертикально,_ _горизонтально_ либо _диагонально_ по направлению конвейера.", - "item.create.belt_connector.tooltip.control2": "ПКМ крадясь", + "item.create.belt_connector.tooltip.control2": "ПКМ крадучись", "item.create.belt_connector.tooltip.action2": "_Сбрасывает_ первый выбранный шкив для конвейера.", "item.create.goggles.tooltip": "GOGGLES", @@ -1471,7 +1471,7 @@ "item.create.wrench.tooltip.summary": "Полезный _инструмент_ для работы с _кинетическими_ штуковинами. Может использоваться для _поворота_, _демонтажа_ и _настройки_ компонентов.", "item.create.wrench.tooltip.control1": "ПКМ по кинетическому блоку", "item.create.wrench.tooltip.action1": "_Поворачивает_ _компонент_ с которым вы взаимодействуете _к_ _лицу_ или _от_ _лица_.", - "item.create.wrench.tooltip.control2": "ПКМ крадясь", + "item.create.wrench.tooltip.control2": "ПКМ крадучись", "item.create.wrench.tooltip.action2": "Разбирает кинетические компоненты и помещает их обратно в ваш инвентарь.", "block.create.creative_motor.tooltip": "CREATIVE MOTOR", @@ -1704,10 +1704,10 @@ "block.create.redstone_link.tooltip": "REDSTONE LINK", "block.create.redstone_link.tooltip.summary": "_Беспроводной_ _передатчик_ сигнала красного камня. Можно выбрать _частоты_ с помощью любого предмета. Диапазон сигнала ограничен, но достаточно далёк.", "block.create.redstone_link.tooltip.condition1": "Когда приведен в действие", - "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той-же _частоты_ выдаёт сигнал красного камня или наоборот.", + "block.create.redstone_link.tooltip.behaviour1": "Приняв сигнал той же _частоты_ выдаёт сигнал красного камня или наоборот.", "block.create.redstone_link.tooltip.control1": "При ПКМ предметом", "block.create.redstone_link.tooltip.action1": "Устанавливает частоту для этого предмета. Всего _два_ разных предмета могут быть использованы в комбинации для определения частоты.", - "block.create.redstone_link.tooltip.control2": "ПКМ крадясь", + "block.create.redstone_link.tooltip.control2": "ПКМ крадучись", "block.create.redstone_link.tooltip.action2": "Переключение между режимом _приемника_ и _передатчика_.", "block.create.nixie_tube.tooltip": "NIXIE TUBE", 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 7aa5b8ebe..c4c1b8fd1 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: 38", "_": "->------------------------] Game Elements [------------------------<-", 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 c680621aa..83bb7c621 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: 43", "_": "->------------------------] Game Elements [------------------------<-", From 31cb70489489051f508a67ca4f501924e226544d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 Mar 2021 17:59:27 +0100 Subject: [PATCH 047/124] Refactor comparator overrides - Removed unnecessary level tracking - Remove code duplicates - Fixed smart fluid tank behaviours not triggering markDirty on deferred fluid update --- .../fluids/actors/ItemDrainBlock.java | 8 ++---- .../fluids/actors/ItemDrainTileEntity.java | 18 ++----------- .../fluids/actors/SpoutBlock.java | 8 ++---- .../fluids/actors/SpoutTileEntity.java | 25 +++++------------- .../fluids/tank/FluidTankBlock.java | 12 +++------ .../fluids/tank/FluidTankTileEntity.java | 20 +++----------- .../foundation/tileEntity/ComparatorUtil.java | 26 +++++++++++++++++++ .../fluid/SmartFluidTankBehaviour.java | 1 + 8 files changed, 46 insertions(+), 72 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/tileEntity/ComparatorUtil.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java index 2d12c3fc9..389d49fca 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/ItemDrainBlock.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.fluid.FluidHelper; +import com.simibubi.create.foundation.tileEntity.ComparatorUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -106,12 +107,7 @@ public class ItemDrainBlock extends Block implements IWrenchable, ITE> itemHandlers; public ItemDrainTileEntity(TileEntityType tileEntityTypeIn) { @@ -73,12 +71,12 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI if (!getHeldItemStack().isEmpty()) return inserted; - + if (inserted.getCount() > 1 && EmptyingByBasin.canItemBeEmptied(world, inserted)) { returned = ItemHandlerHelper.copyStackWithSize(inserted, inserted.getCount() - 1); inserted = ItemHandlerHelper.copyStackWithSize(inserted, 1); } - + if (simulate) return returned; @@ -102,12 +100,6 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI public void tick() { super.tick(); - if (lastRedstoneLevel != getComparatorOutput()) { - lastRedstoneLevel = getComparatorOutput(); - if (world != null) - world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock()); - } - if (heldItem == null) { processingTicks = 0; return; @@ -296,12 +288,6 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI return super.getCapability(cap, side); } - public int getComparatorOutput() { - ItemDrainTileEntity te = this; - double fillFraction = (double) te.internalTank.getPrimaryHandler().getFluidAmount() / te.internalTank.getPrimaryHandler().getCapacity(); - return MathHelper.floor(MathHelper.clamp(fillFraction * 14 + (fillFraction > 0 ? 1 : 0), 0, 15)); - } - @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { ItemDrainTileEntity te = this; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java index bb97ddac8..f53e8331b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutBlock.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.fluids.actors; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.foundation.tileEntity.ComparatorUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -42,12 +43,7 @@ public class SpoutBlock extends Block implements IWrenchable { @Override public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { - TileEntity te = worldIn.getTileEntity(pos); - if (te == null) - return 0; - if (te instanceof SpoutTileEntity) - return ((SpoutTileEntity) te).getComparatorOutput(); - return 0; + return ComparatorUtil.levelOfSmartFluidTank(worldIn, pos); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index e7ede91af..45a900ec2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -8,8 +8,8 @@ import java.util.List; import java.util.stream.Collectors; import com.simibubi.create.AllFluids; -import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; import com.simibubi.create.content.contraptions.fluids.FluidFX; +import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; @@ -32,7 +32,6 @@ import net.minecraft.potion.PotionUtils; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; @@ -50,7 +49,6 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor protected BeltProcessingBehaviour beltProcessing; protected int processingTicks; protected boolean sendSplash; - protected int lastRedstoneLevel; SmartFluidTankBehaviour tank; @@ -60,12 +58,12 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor } protected AxisAlignedBB cachedBoundingBox; + @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { - if (cachedBoundingBox == null) { + if (cachedBoundingBox == null) cachedBoundingBox = super.getRenderBoundingBox().expand(0, -2, 0); - } return cachedBoundingBox; } @@ -126,9 +124,10 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor } AllTriggers.triggerForNearbyPlayers(AllTriggers.SPOUT, world, pos, 5); - if (out.getItem() instanceof PotionItem && !PotionUtils.getEffectsFromStack(out).isEmpty()) + if (out.getItem() instanceof PotionItem && !PotionUtils.getEffectsFromStack(out) + .isEmpty()) AllTriggers.triggerForNearbyPlayers(AllTriggers.SPOUT_POTION, world, pos, 5); - + tank.getPrimaryHandler() .setFluid(fluid); sendSplash = true; @@ -178,12 +177,6 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor if (processingTicks >= 8 && world.isRemote) spawnProcessingParticles(tank.getPrimaryTank() .getRenderedFluid()); - - if (lastRedstoneLevel != getComparatorOutput()) { - lastRedstoneLevel = getComparatorOutput(); - if (world != null) - world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock()); - } } protected void spawnProcessingParticles(FluidStack fluid) { @@ -206,12 +199,6 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor } } - public int getComparatorOutput() { - SpoutTileEntity te = this; - double fillFraction = (double) te.getCurrentFluidInTank().getAmount() / te.tank.getPrimaryHandler().getCapacity(); - return MathHelper.floor(MathHelper.clamp(fillFraction * 14 + (fillFraction > 0 ? 1 : 0), 0, 15)); - } - @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { SpoutTileEntity te = this; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java index 959272e27..3ae0f9a4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankBlock.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.fluid.FluidHelper; import com.simibubi.create.foundation.fluid.FluidHelper.FluidExchange; +import com.simibubi.create.foundation.tileEntity.ComparatorUtil; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.Block; @@ -318,14 +319,9 @@ public class FluidTankBlock extends Block implements IWrenchable, ITE ComparatorUtil.fractionToRedstoneLevel(te.getFillState())) + .orElse(0); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java index cb89cad19..4631f7a23 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java @@ -29,7 +29,6 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; @@ -58,7 +57,6 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI protected int luminosity; protected int width; protected int height; - protected int lastRedstoneLevel; private static final int SYNC_RATE = 8; protected int syncCooldown; @@ -100,24 +98,18 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI if (syncCooldown == 0 && queuedSync) sendData(); } - + if (lastKnownPos == null) lastKnownPos = getPos(); else if (!lastKnownPos.equals(pos) && pos != null) { onPositionChanged(); return; } - + if (updateConnectivity) updateConnectivity(); if (fluidLevel != null) fluidLevel.tick(); - - if (lastRedstoneLevel != getComparatorOutput()) { - lastRedstoneLevel = getComparatorOutput(); - if (world != null) - world.updateComparatorOutputLevel(getPos(), getBlockState().getBlock()); - } } public boolean isController() { @@ -302,6 +294,7 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI } private AxisAlignedBB cachedBoundingBox; + @Override @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { @@ -329,13 +322,6 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI return null; } - public int getComparatorOutput() { - FluidTankTileEntity te = getControllerTE(); - if (te == null) - return 0; - return MathHelper.floor(MathHelper.clamp(te.getFillState() * 14 + (te.getFillState() > 0 ? 1 : 0), 0, 15)); - } - @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { FluidTankTileEntity controllerTE = getControllerTE(); diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/ComparatorUtil.java b/src/main/java/com/simibubi/create/foundation/tileEntity/ComparatorUtil.java new file mode 100644 index 000000000..e35593b63 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/ComparatorUtil.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.tileEntity; + +import com.simibubi.create.foundation.fluid.SmartFluidTank; +import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.IBlockReader; + +public class ComparatorUtil { + + public static int fractionToRedstoneLevel(double frac) { + return MathHelper.floor(MathHelper.clamp(frac * 14 + (frac > 0 ? 1 : 0), 0, 15)); + } + + public static int levelOfSmartFluidTank(IBlockReader world, BlockPos pos) { + SmartFluidTankBehaviour fluidBehaviour = TileEntityBehaviour.get(world, pos, SmartFluidTankBehaviour.TYPE); + if (fluidBehaviour == null) + return 0; + SmartFluidTank primaryHandler = fluidBehaviour.getPrimaryHandler(); + double fillFraction = (double) primaryHandler.getFluid() + .getAmount() / primaryHandler.getCapacity(); + return fractionToRedstoneLevel(fillFraction); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index c69c1aeb2..cabc60556 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -132,6 +132,7 @@ public class SmartFluidTankBehaviour extends TileEntityBehaviour { protected void updateFluids() { fluidUpdateCallback.run(); tileEntity.sendData(); + tileEntity.markDirty(); } @Override From 8bf82aff7938701cde803cd8fc646de3379df0af Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 3 Mar 2021 19:17:56 +0100 Subject: [PATCH 048/124] Refactor Goggles Fluid Information - Removed code duplicates - Made fluid information more generic and concise - Made fluid information easier to port - Fixed potion fluid not overriding its translation key - (I'm sorry, Steven) --- src/generated/resources/.cache/cache | 28 +++---- .../resources/assets/create/lang/en_us.json | 15 +--- .../assets/create/lang/unfinished/de_de.json | 17 +---- .../assets/create/lang/unfinished/es_es.json | 17 +---- .../assets/create/lang/unfinished/es_mx.json | 17 +---- .../assets/create/lang/unfinished/fr_fr.json | 17 +---- .../assets/create/lang/unfinished/it_it.json | 17 +---- .../assets/create/lang/unfinished/ja_jp.json | 17 +---- .../assets/create/lang/unfinished/ko_kr.json | 17 +---- .../assets/create/lang/unfinished/nl_nl.json | 17 +---- .../assets/create/lang/unfinished/pt_br.json | 17 +---- .../assets/create/lang/unfinished/ru_ru.json | 17 +---- .../assets/create/lang/unfinished/zh_cn.json | 17 +---- .../assets/create/lang/unfinished/zh_tw.json | 17 +---- .../data/create/advancements/aesthetics.json | 4 +- .../jei/category/CreateRecipeCategory.java | 10 +-- .../fluids/FluidFullnessOverlay.java | 73 ------------------ .../fluids/actors/ItemDrainTileEntity.java | 40 +--------- .../fluids/actors/SpoutTileEntity.java | 38 +--------- .../fluids/potion/PotionFluid.java | 14 +++- .../fluids/potion/PotionFluidHandler.java | 8 -- .../fluids/tank/FluidTankTileEntity.java | 50 ++----------- .../goggles/IHaveGoggleInformation.java | 74 +++++++++++++++++-- .../processing/BasinTileEntity.java | 72 +++--------------- .../assets/create/lang/default/messages.json | 17 +---- 25 files changed, 164 insertions(+), 483 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index adddd5c58..f36e7588a 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 369f9c6fce0aa11d70efa2e73a4ba2ff12e57e37 assets/create/lang/en_ud.json -0dd7dbb57e8c2cb13498fcbf3f5b28ddbed28a67 assets/create/lang/en_us.json -96b15a158336ded61b5f64760331cd5b3db1ad94 assets/create/lang/unfinished/de_de.json -3e90bdf50e0437be7dd526f15576816b4273f2f6 assets/create/lang/unfinished/es_es.json -ac92cedf2c602239ca1d8e3ecffef9153e492355 assets/create/lang/unfinished/es_mx.json -f84146bf81d48cf89274a5f95f8f02f7450e4fff assets/create/lang/unfinished/fr_fr.json -d5c292a0ecab558c9a4704abd3d3274f64c6d020 assets/create/lang/unfinished/it_it.json -42d86a97e0bf04982392e37f2034b33349857b96 assets/create/lang/unfinished/ja_jp.json -09d1683c72fd4c3dbacdd3485c580020bc6b4baa assets/create/lang/unfinished/ko_kr.json -4501e9ad422cdffb000326043cd764db78a6678e assets/create/lang/unfinished/nl_nl.json -691b5fb5146ad38b94de4b1c6a640390a10a87d0 assets/create/lang/unfinished/pt_br.json -773b40b4f8100bbde0e40cf6f131ae44f6004ade assets/create/lang/unfinished/ru_ru.json -cb6fc7e408753280b7059bdadb3ccf31845167e1 assets/create/lang/unfinished/zh_cn.json -b3d2618c25b4ff9abfb0330f4a900732f4c82ab9 assets/create/lang/unfinished/zh_tw.json +1e3157b36cce7bf30abde83323513f8f7c1a7c2c assets/create/lang/en_us.json +7ddb6aa393d89dd1d9d1e27c998783a7db18e831 assets/create/lang/unfinished/de_de.json +525232bd81bef5086d210ceee26742c06818c9e9 assets/create/lang/unfinished/es_es.json +02e31fdd37f3b933ca96531c3d98b1e352e858d9 assets/create/lang/unfinished/es_mx.json +7754dc1f5c493d81189d535841bd32401d328e19 assets/create/lang/unfinished/fr_fr.json +f5064df0df1f055ba8ac42a97831171b2cb724eb assets/create/lang/unfinished/it_it.json +429da2684276d3385e82851f6a0a176c5dd8471e assets/create/lang/unfinished/ja_jp.json +9b0ab4186a35d8484dbee5c41cd4000c98b8a0a2 assets/create/lang/unfinished/ko_kr.json +b362f846ad523840e65ffc94ccd0bc6c694acbb5 assets/create/lang/unfinished/nl_nl.json +14950620733669b606d480c6a25b1f8ddea1fbb5 assets/create/lang/unfinished/pt_br.json +832483d95d4f36c1ee247dde86758c7c768912e9 assets/create/lang/unfinished/ru_ru.json +27f5f218699fd03172ecf6d1033689b0a35f23e2 assets/create/lang/unfinished/zh_cn.json +ac53a2d2146238a6314a51c199afdac98465b01a assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 2afe2bfdf..d1b1f9528 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -827,6 +827,8 @@ "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.at_current_speed": "at current speed", "create.gui.goggles.pole_length": "Pole Length:", + "create.gui.goggles.fluid_container": "Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "Capacity: ", "create.gui.assembly.exception": "This Contraption was unable to assemble:", "create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]", "create.gui.assembly.exception.chunkNotLoaded": "The Block at [%1$s,%2$s,%3$s] was not in a loaded chunk", @@ -842,15 +844,6 @@ "create.gui.stressometer.no_rotation": "No Rotation", "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "Potion Effects", - "create.gui.stores_fluid.empty": "Empty", - "create.gui.input_tanks.title": "Input Tanks", - "create.gui.output_tanks.title": "Output Tanks", - "create.gui.tank.info_header": "Tank Information:", - "create.gui.spout.info_header": "Spout Information:", - "create.gui.drain.info_header": "Drain Information:", - "create.gui.basin.info_header": "Basin Information:", "create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Storage Space", "create.gui.stockpile_switch.title": "Stockpile Switch", @@ -1077,10 +1070,6 @@ "create.tooltip.stressImpact.medium": "Moderate", "create.tooltip.stressImpact.high": "High", "create.tooltip.stressImpact.overstressed": "Overstressed", - "create.tooltip.fluidFullness.low": "Low", - "create.tooltip.fluidFullness.medium": "Moderate", - "create.tooltip.fluidFullness.high": "High", - "create.tooltip.fluidFullness.full": "Full", "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Small", "create.tooltip.capacityProvided.medium": "Medium", 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 ef30133b1..c47bf9b29 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: 989", + "_": "Missing Localizations: 978", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "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.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "UNLOCALIZED: Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Lagerraum", "create.gui.stockpile_switch.title": "Vorratssensor", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", "create.tooltip.stressImpact.high": "UNLOCALIZED: High", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", 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 da20ce519..7614ce83f 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: 19", + "_": "Missing Localizations: 8", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "create.gui.goggles.kinetic_stats": "Estadísticas cinéticas:", "create.gui.goggles.at_current_speed": "con la velocidad actual", "create.gui.goggles.pole_length": "Longitud del poste:", + "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "create.gui.assembly.exception": "Este artilugio no se pudo montar:", "create.gui.assembly.exception.unmovableBlock": "Bloque inamovible (%4$s) en [%1$s,%2$s,%3$s]", "create.gui.assembly.exception.chunkNotLoaded": "El bloque en [%1$s,%2$s,%3$s] no estaba en un chunk cargado", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "Sin rotación", "create.gui.contraptions.not_fast_enough": "Parece que este %1$s no está girando con _suficiente_ velocidad_.", "create.gui.contraptions.network_overstressed": "Parece que este artilugio está _sobrecargado_. Añade más fuentes o _desacelera_ los componentes con un _impacto_ de alto estrés.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Caja ajustable", "create.gui.adjustable_crate.storageSpace": "Espacio de almacenamiento", "create.gui.stockpile_switch.title": "Interruptor de acopio", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "Moderado", "create.tooltip.stressImpact.high": "Alto", "create.tooltip.stressImpact.overstressed": "Sobrecargado", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Capacidad de estrés: %1$s", "create.tooltip.capacityProvided.low": "Pequeña", "create.tooltip.capacityProvided.medium": "Media", 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 567455835..e3db6b4ac 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: 919", + "_": "Missing Localizations: 908", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "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.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "UNLOCALIZED: Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "UNLOCALIZED: Storage Space", "create.gui.stockpile_switch.title": "UNLOCALIZED: Stockpile Switch", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", "create.tooltip.stressImpact.high": "UNLOCALIZED: High", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", 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 7c63419d4..d51c8cd12 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: 701", + "_": "Missing Localizations: 690", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "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.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "Pas de rotation", "create.gui.contraptions.not_fast_enough": "Il semblerais que ce.t.te %1$s ne tourne _pas_ à la _vitesse_ _suffisante_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Caisse réglable", "create.gui.adjustable_crate.storageSpace": "Espace de stockage", "create.gui.stockpile_switch.title": "Commutateur de stockage", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "Modéré", "create.tooltip.stressImpact.high": "Elevé", "create.tooltip.stressImpact.overstressed": "Surmené", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Capacité de stress: %1$s", "create.tooltip.capacityProvided.low": "Petite", "create.tooltip.capacityProvided.medium": "Moyenne", 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 0d220b4aa..e93e4ea9d 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: 36", + "_": "Missing Localizations: 25", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "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.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "Nessuna rotazione", "create.gui.contraptions.not_fast_enough": "Sembra che questo %1$s _non_ stia girando con una _velocità_ _sufficiente_.", "create.gui.contraptions.network_overstressed": "Sembra che questo marchingegno sia _sovraccarico_. Aggiungi più fonti o _rallenta_ i componenti con un forte _impatto_ _di_ _stress_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Baule regolabile", "create.gui.adjustable_crate.storageSpace": "Spazio di immagazzinamento", "create.gui.stockpile_switch.title": "Interruttore accumulatore", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "Moderato", "create.tooltip.stressImpact.high": "Alto", "create.tooltip.stressImpact.overstressed": "Sovrastressato", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Capacità dello stress: %1$s", "create.tooltip.capacityProvided.low": "Piccola", "create.tooltip.capacityProvided.medium": "Media", 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 9d52c50ac..5121afc38 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: 43", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "create.gui.goggles.kinetic_stats": "動力の統計:", "create.gui.goggles.at_current_speed": "現在の速度", "create.gui.goggles.pole_length": "ポールの長さ:", + "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "回転なし", "create.gui.contraptions.not_fast_enough": "この %1$s は_十分な_回転を_していない_ようです。", "create.gui.contraptions.network_overstressed": "この仕掛けは_超過応力_のようです。さらに原動機を追加するか、_応力_の影響が大きい機械の速度を_下げて_ください。", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "可変クレート", "create.gui.adjustable_crate.storageSpace": "収納スペース", "create.gui.stockpile_switch.title": "在庫スイッチ", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "超過応力", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "応力の容量: %1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", 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 5b334ff56..d0794775c 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: 90", + "_": "Missing Localizations: 79", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "create.gui.goggles.kinetic_stats": "가동 상태:", "create.gui.goggles.at_current_speed": "현재 에너지량", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "회전없음", "create.gui.contraptions.not_fast_enough": "이 %1$s은(는) 작동하기에 _회전 속도_가 _부족합니다_", "create.gui.contraptions.network_overstressed": "_과부하!_ _높은 피로도_ _용량_을 가진 발전기를 추가로 설치하거나 _장치 속도_를 _늦추세요_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "가변 창고 ", "create.gui.adjustable_crate.storageSpace": "저장 공간", "create.gui.stockpile_switch.title": "수량 스위치", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "보통", "create.tooltip.stressImpact.high": "높음", "create.tooltip.stressImpact.overstressed": "과부하됨", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "피로도 용량: %1$s", "create.tooltip.capacityProvided.low": "적음", "create.tooltip.capacityProvided.medium": "보통", 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 8912b67a8..209100c76 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: 1188", + "_": "Missing Localizations: 1177", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "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.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "FlexKrat", "create.gui.adjustable_crate.storageSpace": "Opslagruimte", "create.gui.stockpile_switch.title": "Voorraad Schakelaar", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "Gemiddeld", "create.tooltip.stressImpact.high": "Hoog", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Klein", "create.tooltip.capacityProvided.medium": "Gemiddeld", 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 886089ecf..9da0705cc 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: 1254", + "_": "Missing Localizations: 1243", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "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.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "UNLOCALIZED: No Rotation", "create.gui.contraptions.not_fast_enough": "UNLOCALIZED: It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "UNLOCALIZED: It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "adjustable_crate", "create.gui.adjustable_crate.storageSpace": "Espaço de Armazenamento", "create.gui.stockpile_switch.title": "Disjuntor de Armazenamento", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "UNLOCALIZED: Moderate", "create.tooltip.stressImpact.high": "UNLOCALIZED: High", "create.tooltip.stressImpact.overstressed": "UNLOCALIZED: Overstressed", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "UNLOCALIZED: Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "UNLOCALIZED: Small", "create.tooltip.capacityProvided.medium": "UNLOCALIZED: Medium", 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 5faa13307..424e226e1 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: 40", + "_": "Missing Localizations: 29", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "create.gui.goggles.kinetic_stats": "Кинетическая статистика:", "create.gui.goggles.at_current_speed": "На текущей скорости", "create.gui.goggles.pole_length": "Длина поршня", + "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "Нет вращения", "create.gui.contraptions.not_fast_enough": "Похоже, что этот %1$s _не_ вращается с_достаточной_ _скоростью_.", "create.gui.contraptions.network_overstressed": "Похоже, что эта штуковина _перегружена_. Добавьте больше источников или _замедлите_ _скорость_ компонентов с высоким _влиянием_ на _момент_.", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "Регулируемый ящик", "create.gui.adjustable_crate.storageSpace": "Ёмкость", "create.gui.stockpile_switch.title": "Настраиваемый компаратор", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "Средний", "create.tooltip.stressImpact.high": "Высокий", "create.tooltip.stressImpact.overstressed": "Перегрузка", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "Ёмкостный крутящий момент: %1$s", "create.tooltip.capacityProvided.low": "Маленький", "create.tooltip.capacityProvided.medium": "Средний", 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 c4c1b8fd1..e384ec585 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: 38", + "_": "Missing Localizations: 27", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "create.gui.goggles.kinetic_stats": "动力学状态:", "create.gui.goggles.at_current_speed": "当前速度应力值", "create.gui.goggles.pole_length": "活塞杆长度:", + "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "无旋转", "create.gui.contraptions.not_fast_enough": "显然%1$s没有达到足够的工作转速。", "create.gui.contraptions.network_overstressed": "显然装置过载,减速网络中的高应力消耗装置或者添加更多的应力发生装置", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "板条箱", "create.gui.adjustable_crate.storageSpace": "储存空间", "create.gui.stockpile_switch.title": "储存开关", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "过载", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "应力量:%1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", 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 83bb7c621..9e55235fa 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: 43", + "_": "Missing Localizations: 32", "_": "->------------------------] Game Elements [------------------------<-", @@ -828,6 +828,8 @@ "create.gui.goggles.kinetic_stats": "機械學狀態:", "create.gui.goggles.at_current_speed": "現在速度動能值", "create.gui.goggles.pole_length": "UNLOCALIZED: Pole Length:", + "create.gui.goggles.fluid_container": "UNLOCALIZED: Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "UNLOCALIZED: Capacity: ", "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", @@ -843,15 +845,6 @@ "create.gui.stressometer.no_rotation": "無旋轉", "create.gui.contraptions.not_fast_enough": "看起來%1$s 沒有達到足夠的工作轉速。", "create.gui.contraptions.network_overstressed": "裝置似乎過載,減少高動能消耗的裝置或者增加更多更多動能", - "create.gui.stores_fluid.title": "UNLOCALIZED: Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "UNLOCALIZED: Potion Effects", - "create.gui.stores_fluid.empty": "UNLOCALIZED: Empty", - "create.gui.input_tanks.title": "UNLOCALIZED: Input Tanks", - "create.gui.output_tanks.title": "UNLOCALIZED: Output Tanks", - "create.gui.tank.info_header": "UNLOCALIZED: Tank Information:", - "create.gui.spout.info_header": "UNLOCALIZED: Spout Information:", - "create.gui.drain.info_header": "UNLOCALIZED: Drain Information:", - "create.gui.basin.info_header": "UNLOCALIZED: Basin Information:", "create.gui.adjustable_crate.title": "板條箱", "create.gui.adjustable_crate.storageSpace": "儲存空間", "create.gui.stockpile_switch.title": "儲存開關", @@ -1078,10 +1071,6 @@ "create.tooltip.stressImpact.medium": "中", "create.tooltip.stressImpact.high": "高", "create.tooltip.stressImpact.overstressed": "過載", - "create.tooltip.fluidFullness.low": "UNLOCALIZED: Low", - "create.tooltip.fluidFullness.medium": "UNLOCALIZED: Moderate", - "create.tooltip.fluidFullness.high": "UNLOCALIZED: High", - "create.tooltip.fluidFullness.full": "UNLOCALIZED: Full", "create.tooltip.capacityProvided": "動能生產量:%1$s", "create.tooltip.capacityProvided.low": "小", "create.tooltip.capacityProvided.medium": "中", 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/compat/jei/category/CreateRecipeCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java index e8d2a6170..53964a8dc 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/CreateRecipeCategory.java @@ -27,6 +27,7 @@ import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; import net.minecraftforge.fluids.FluidStack; public abstract class CreateRecipeCategory> implements IRecipeCategory { @@ -103,11 +104,11 @@ public abstract class CreateRecipeCategory> implements IRec ProcessingOutput output = results.get(slotIndex - 1); float chance = output.getChance(); if (chance != 1) - tooltip.add(1, - TextFormatting.GOLD + Lang.translate("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100))); + tooltip.add(1, TextFormatting.GOLD + + Lang.translate("recipe.processing.chance", chance < 0.01 ? "<1" : (int) (chance * 100))); }); } - + public List withImprovedVisibility(List stacks) { return stacks.stream() .map(this::withImprovedVisibility) @@ -130,8 +131,7 @@ public abstract class CreateRecipeCategory> implements IRec fluidStacks.addTooltipCallback((slotIndex, input, fluid, tooltip) -> { if (fluid.getFluid() .isEquivalentTo(AllFluids.POTION.get())) { - String name = PotionFluidHandler.getPotionName(fluid) - .getFormattedText(); + String name = new TranslationTextComponent(fluid.getTranslationKey()).getFormattedText(); if (tooltip.isEmpty()) tooltip.add(0, name); else diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java deleted file mode 100644 index a1604e4c6..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/FluidFullnessOverlay.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.simibubi.create.content.contraptions.fluids; - -import com.simibubi.create.AllFluids; -import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; -import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; -import com.simibubi.create.foundation.item.ItemDescription; -import com.simibubi.create.foundation.utility.Lang; -import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.fluids.FluidStack; - - -//Currently only used for Tank/Drain/Spout/Basin goggle tooltips, as fullness-based replacement for the stress-based tooltips in IRotate -public enum FluidFullnessOverlay { - LOW, - MEDIUM, - HIGH, - FULL; - - public TextFormatting getAbsoluteColor() { - return this == LOW ? TextFormatting.YELLOW : this == MEDIUM ? TextFormatting.GOLD : TextFormatting.RED; - } - - public TextFormatting getRelativeColor() { - return this == LOW ? TextFormatting.GREEN : this == MEDIUM ? TextFormatting.YELLOW : this == HIGH ? TextFormatting.GOLD : TextFormatting.RED; - } - - public static FluidFullnessOverlay of(double fullnessPercent){ - if (fullnessPercent >= 1) return FluidFullnessOverlay.FULL; - else if (fullnessPercent > .75d) return FluidFullnessOverlay.HIGH; - else if (fullnessPercent > .5d) return FluidFullnessOverlay.MEDIUM; - else return FluidFullnessOverlay.LOW; - } - - public static String getFormattedFullnessText(double fullnessPercent){ - FluidFullnessOverlay fullnessLevel = of(fullnessPercent); - TextFormatting color = fullnessLevel.getRelativeColor(); - if (fullnessPercent == 0) - return TextFormatting.DARK_GRAY + ItemDescription.makeProgressBar(3, -1) - + Lang.translate("gui.stores_fluid.empty"); - - String level = color + ItemDescription.makeProgressBar(3, Math.min(fullnessLevel.ordinal(), 2)); - level += Lang.translate("tooltip.fluidFullness."+Lang.asId(fullnessLevel.name())); - - level += String.format(" (%s%%) ", (int) (fullnessPercent * 100)); - - return level; - } - - public static String getFormattedCapacityText(int amount, int capacity){ - FluidFullnessOverlay fullnessLevel = of((double) amount / capacity); - TextFormatting color = fullnessLevel.getRelativeColor(); - - String mb = Lang.translate("generic.unit.millibuckets"); - String capacityString = color + "%s" + mb + TextFormatting.GRAY + " / " + TextFormatting.DARK_GRAY + "%s" + mb; - - if (amount == 0) - return TextFormatting.DARK_GRAY + IHaveGoggleInformation.format(capacity) + mb; - - return String.format(capacityString, IHaveGoggleInformation.format(amount), IHaveGoggleInformation.format(capacity)); - } - - public static String getFormattedFluidTypeText(FluidStack fluid, double fullnessPercent){ - FluidFullnessOverlay fullnessLevel = of(fullnessPercent); - TextFormatting color = fullnessLevel.getRelativeColor(); - - if (AllFluids.POTION.get().getFluid().isEquivalentTo(fluid.getFluid())) { - return color + PotionFluidHandler.getPotionName(fluid).getFormattedText(); - } else { - return color + fluid.getDisplayName().getFormattedText(); - } - } - } - 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 d8d19432b..6206ad9e8 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 @@ -1,14 +1,9 @@ package com.simibubi.create.content.contraptions.fluids.actors; -import java.util.ArrayList; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; -import com.simibubi.create.AllFluids; -import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; -import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.processing.EmptyingByBasin; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; @@ -18,7 +13,6 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; @@ -30,11 +24,10 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction; import net.minecraftforge.items.ItemHandlerHelper; @@ -290,35 +283,8 @@ public class ItemDrainTileEntity extends SmartTileEntity implements IHaveGoggleI @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - ItemDrainTileEntity te = this; - - int fluidAmount = te.internalTank.getPrimaryHandler().getFluidAmount(); - int fluidCapacity = te.internalTank.getPrimaryHandler().getCapacity(); - double fillFraction = (double) fluidAmount / fluidCapacity; - FluidStack fluidType = te.internalTank.getPrimaryHandler().getFluid(); - - tooltip.add(spacing + Lang.translate("gui.drain.info_header")); - - if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) { - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle")); - - ArrayList potionTooltip = new ArrayList<>(); - PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1); - tooltip.addAll(2, potionTooltip.stream() - .map(c -> spacing + " " + c.getFormattedText()) - .collect(Collectors.toList())); - return true; - } - - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title")); - - if (fluidAmount != 0) - tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction)); - - tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction)); - tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity)); - - return true; + return containedFluidTooltip(tooltip, isPlayerSneaking, + getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java index 45a900ec2..dba1c3e43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/SpoutTileEntity.java @@ -5,12 +5,8 @@ import static com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProce import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import com.simibubi.create.AllFluids; import com.simibubi.create.content.contraptions.fluids.FluidFX; -import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; -import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.foundation.advancement.AllTriggers; @@ -21,7 +17,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.BeltProcessingBe import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour.TransportedResult; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; -import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.item.ItemStack; @@ -33,8 +28,6 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; @@ -201,35 +194,8 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - SpoutTileEntity te = this; - - int fluidAmount = te.tank.getPrimaryHandler().getFluidAmount(); - int fluidCapacity = te.tank.getPrimaryHandler().getCapacity(); - double fillFraction = (double) fluidAmount / fluidCapacity; - FluidStack fluidType = te.tank.getPrimaryHandler().getFluid(); - - tooltip.add(spacing + Lang.translate("gui.spout.info_header")); - - if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) { - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle")); - - ArrayList potionTooltip = new ArrayList<>(); - PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1); - tooltip.addAll(2, potionTooltip.stream() - .map(c -> spacing + " " + c.getFormattedText()) - .collect(Collectors.toList())); - return true; - } - - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title")); - - if (fluidAmount != 0) - tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction)); - - tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction)); - tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity)); - - return true; + return containedFluidTooltip(tooltip, isPlayerSneaking, + getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java index da3aa0bce..bac7497c1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluid.java @@ -5,6 +5,7 @@ import java.util.List; import com.simibubi.create.AllFluids; import com.simibubi.create.content.contraptions.fluids.VirtualFluid; +import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.fluid.Fluid; import net.minecraft.nbt.CompoundNBT; @@ -13,6 +14,7 @@ import net.minecraft.potion.EffectInstance; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionUtils; import net.minecraft.potion.Potions; +import net.minecraft.util.IItemProvider; import net.minecraft.util.ResourceLocation; import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidStack; @@ -23,7 +25,7 @@ public class PotionFluid extends VirtualFluid { public enum BottleType { REGULAR, SPLASH, LINGERING; } - + public PotionFluid(Properties properties) { super(properties); } @@ -49,6 +51,16 @@ public class PotionFluid extends VirtualFluid { return color; } + @Override + public String getTranslationKey(FluidStack stack) { + CompoundNBT tag = stack.getOrCreateTag(); + IItemProvider itemFromBottleType = + PotionFluidHandler.itemFromBottleType(NBTHelper.readEnum(tag, "Bottle", BottleType.class)); + return PotionUtils.getPotionTypeFromNBT(tag) + .getNamePrefixed(itemFromBottleType.asItem() + .getTranslationKey() + ".effect."); + } + } public static FluidStack addPotionToFluidStack(FluidStack fs, Potion potion) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java index 3d7987e7f..12d87293c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/potion/PotionFluidHandler.java @@ -92,14 +92,6 @@ public class PotionFluidHandler { return potionStack; } - public static ITextComponent getPotionName(FluidStack fs) { - CompoundNBT tag = fs.getOrCreateTag(); - IItemProvider itemFromBottleType = itemFromBottleType(NBTHelper.readEnum(tag, "Bottle", BottleType.class)); - return new TranslationTextComponent(PotionUtils.getPotionTypeFromNBT(tag) - .getNamePrefixed(itemFromBottleType.asItem() - .getTranslationKey() + ".effect.")); - } - // Modified version of PotionUtils#addPotionTooltip @OnlyIn(Dist.CLIENT) public static void addPotionTooltip(FluidStack fs, List tooltip, float p_185182_2_) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java index 4631f7a23..779a0d6d9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/tank/FluidTankTileEntity.java @@ -2,16 +2,11 @@ package com.simibubi.create.content.contraptions.fluids.tank; import static java.lang.Math.abs; -import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import com.simibubi.create.AllFluids; -import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; -import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock.Shape; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.config.AllConfigs; @@ -19,7 +14,6 @@ import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; @@ -29,8 +23,6 @@ import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; @@ -113,10 +105,8 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI } public boolean isController() { - return controller == null || - pos.getX() == controller.getX() && - pos.getY() == controller.getY() && - pos.getZ() == controller.getZ(); + return controller == null + || pos.getX() == controller.getX() && pos.getY() == controller.getY() && pos.getZ() == controller.getZ(); } @Override @@ -324,36 +314,8 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - FluidTankTileEntity controllerTE = getControllerTE(); - if (controllerTE == null) - return false; - int fluidAmount = controllerTE.getTankInventory().getFluidAmount(); - int fluidCapacity = controllerTE.getTankInventory().getCapacity(); - double fillFraction = controllerTE.getFillState(); - FluidStack fluidType = controllerTE.getTankInventory().getFluid(); - - tooltip.add(spacing + Lang.translate("gui.tank.info_header")); - - if (isPlayerSneaking && AllFluids.POTION.get().getFluid().isEquivalentTo(fluidType.getFluid())) { - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.effectsTitle")); - - ArrayList potionTooltip = new ArrayList<>(); - PotionFluidHandler.addPotionTooltip(fluidType, potionTooltip, 1); - tooltip.addAll(2, potionTooltip.stream() - .map(c -> spacing + " " + c.getFormattedText()) - .collect(Collectors.toList())); - return true; - } - - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.stores_fluid.title")); - - if (fluidAmount != 0) - tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedFluidTypeText(fluidType, fillFraction)); - - tooltip.add(spacing + FluidFullnessOverlay.getFormattedFullnessText(fillFraction)); - tooltip.add(spacing + " " + FluidFullnessOverlay.getFormattedCapacityText(fluidAmount, fluidCapacity)); - - return true; + return containedFluidTooltip(tooltip, isPlayerSneaking, + getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)); } @Override @@ -482,11 +444,11 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI public static int getMaxHeight() { return AllConfigs.SERVER.fluids.fluidTankMaxHeight.get(); } - + public InterpolatedChasingValue getFluidLevel() { return fluidLevel; } - + public void setFluidLevel(InterpolatedChasingValue fluidLevel) { this.fluidLevel = fluidLevel; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java index 9a664a92d..a41378ffa 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java @@ -3,6 +3,16 @@ package com.simibubi.create.content.contraptions.goggles; import java.text.DecimalFormat; import java.util.List; +import com.simibubi.create.foundation.utility.Lang; + +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraft.util.text.TranslationTextComponent; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + /* * Implement this Interface in the TileEntity class that wants to add info to the screen * */ @@ -12,12 +22,13 @@ public interface IHaveGoggleInformation { String spacing = " "; /** - * this method will be called when looking at a TileEntity that implemented this interface + * this method will be called when looking at a TileEntity that implemented this + * interface * - * @return {@code true} if the tooltip creation was successful and should be displayed, - * or {@code false} if the overlay should not be displayed - * */ - default boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking){ + * @return {@code true} if the tooltip creation was successful and should be + * displayed, or {@code false} if the overlay should not be displayed + */ + default boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { return false; } @@ -25,4 +36,57 @@ public interface IHaveGoggleInformation { return decimalFormat.format(d); } + default boolean containedFluidTooltip(List tooltip, boolean isPlayerSneaking, + LazyOptional handler) { + + tooltip.add(spacing + Lang.translate("gui.goggles.fluid_container")); + String mb = Lang.translate("generic.unit.millibuckets"); + IFluidHandler tank = handler.orElse(null); + if (tank == null || tank.getTanks() == 0) + return false; + + ITextComponent indent = new StringTextComponent(spacing + " "); + + boolean isEmpty = true; + for (int i = 0; i < tank.getTanks(); i++) { + FluidStack fluidStack = tank.getFluidInTank(i); + if (fluidStack.isEmpty()) + continue; + + ITextComponent fluidName = + new TranslationTextComponent(fluidStack.getTranslationKey()).applyTextStyle(TextFormatting.GRAY); + ITextComponent contained = + new StringTextComponent(format(fluidStack.getAmount()) + mb).applyTextStyle(TextFormatting.GOLD); + ITextComponent slash = new StringTextComponent(" / ").applyTextStyle(TextFormatting.GRAY); + ITextComponent capacity = + new StringTextComponent(format(tank.getTankCapacity(i)) + mb).applyTextStyle(TextFormatting.DARK_GRAY); + + tooltip.add(indent.deepCopy() + .appendSibling(fluidName) + .getFormattedText()); + tooltip.add(indent.deepCopy() + .appendSibling(contained) + .appendSibling(slash) + .appendSibling(capacity) + .getFormattedText()); + + isEmpty = false; + } + + if (tank.getTanks() > 1 || !isEmpty) + return true; + + ITextComponent capacity = new StringTextComponent(Lang.translate("gui.goggles.fluid_container.capacity")) + .applyTextStyle(TextFormatting.GRAY); + ITextComponent amount = + new StringTextComponent(format(tank.getTankCapacity(0)) + mb).applyTextStyle(TextFormatting.GOLD); + + String capacityString = indent.deepCopy() + .appendSibling(capacity) + .appendSibling(amount) + .getFormattedText(); + tooltip.add(capacityString); + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index e1afa75c0..726f9fdc0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -9,14 +9,11 @@ import java.util.Random; import javax.annotation.Nonnull; -import com.simibubi.create.AllFluids; import com.simibubi.create.AllParticleTypes; import com.simibubi.create.AllTags; -import com.simibubi.create.content.contraptions.fluids.FluidFullnessOverlay; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity; import com.simibubi.create.content.contraptions.fluids.FluidFX; import com.simibubi.create.content.contraptions.fluids.particle.FluidParticleData; -import com.simibubi.create.content.contraptions.fluids.potion.PotionFluidHandler; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock; import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; @@ -29,8 +26,14 @@ import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputB import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.fluid.SmartFluidTankBehaviour.TankSegment; -import com.simibubi.create.foundation.utility.*; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.Couple; +import com.simibubi.create.foundation.utility.IntAttached; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.LerpedFloat; import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.NBTHelper; +import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -46,7 +49,6 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.capabilities.Capability; @@ -436,7 +438,7 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor for (ItemStack itemStack : outputItems) { // Catalyst items are never consumed if (itemStack.hasContainerItem() && itemStack.getContainerItem() - .isItemEqual(itemStack)) + .isItemEqual(itemStack)) continue; if (simulate || direction == Direction.DOWN) { @@ -601,62 +603,8 @@ public class BasinTileEntity extends SmartTileEntity implements IHaveGoggleInfor @Override public boolean addToGoggleTooltip(List tooltip, boolean isPlayerSneaking) { - - tooltip.add(spacing + Lang.translate("gui.basin.info_header")); - - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.input_tanks.title")); - - String mb = Lang.translate("generic.unit.millibuckets"); - - LazyOptional capability = this.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY); - IFluidHandler tank = capability.orElse(null); - - if (tank == null) - return false; - - for (int i = 0; i < tank.getTanks(); i += 2) { - Couple fluids = Couple.create(tank.getFluidInTank(i), tank.getFluidInTank(i + 1)); - - if (i > 1) - tooltip.add(spacing + TextFormatting.GRAY + Lang.translate("gui.output_tanks.title")); - - if (fluids.getFirst().getAmount() == 0 && fluids.getSecond().getAmount() == 0) { - tooltip.add(spacing + " " + TextFormatting.DARK_GRAY + "2x0" + mb); - continue; - } - - for (FluidStack fluid : fluids) { - String fluidName; - - if (fluid.getAmount() == 0) { - tooltip.add(spacing + " " + TextFormatting.DARK_GRAY + IHaveGoggleInformation.format(0) + mb); - } else { - if (AllFluids.POTION.get().getFluid().isEquivalentTo(fluid.getFluid())) { - fluidName = PotionFluidHandler.getPotionName(fluid).getFormattedText(); - } else { - fluidName = fluid.getDisplayName().getFormattedText(); - } - double fillFraction = (double) fluid.getAmount() / (double) this.inputTank.getPrimaryHandler().getCapacity(); - if (fluidName.length() > 15) { - tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor() - + fluidName); - tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor() - + IHaveGoggleInformation.format(fluid.getAmount()) + mb); - continue; - } - - tooltip.add(spacing + " " + FluidFullnessOverlay.of(fillFraction).getRelativeColor() - + fluidName + " " - + IHaveGoggleInformation.format(fluid.getAmount()) + mb); - - } - } - - - - - } - return true; + return containedFluidTooltip(tooltip, isPlayerSneaking, + getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY)); } class BasinValueBox extends ValueBoxTransform.Sided { diff --git a/src/main/resources/assets/create/lang/default/messages.json b/src/main/resources/assets/create/lang/default/messages.json index 22a2e1cf6..37ee82398 100644 --- a/src/main/resources/assets/create/lang/default/messages.json +++ b/src/main/resources/assets/create/lang/default/messages.json @@ -172,6 +172,8 @@ "create.gui.goggles.kinetic_stats": "Kinetic Stats:", "create.gui.goggles.at_current_speed": "at current speed", "create.gui.goggles.pole_length": "Pole Length:", + "create.gui.goggles.fluid_container": "Fluid Container Info:", + "create.gui.goggles.fluid_container.capacity": "Capacity: ", "create.gui.assembly.exception": "This Contraption was unable to assemble:", "create.gui.assembly.exception.unmovableBlock": "Unmovable Block (%4$s) at [%1$s,%2$s,%3$s]", @@ -191,16 +193,6 @@ "create.gui.contraptions.not_fast_enough": "It appears that this %1$s is _not_ rotating with _enough_ _speed_.", "create.gui.contraptions.network_overstressed": "It appears that this contraption is _overstressed_. Add more sources or _slow_ _down_ the components with a high _stress_ _impact_.", - "create.gui.stores_fluid.title": "Fluid Contained", - "create.gui.stores_fluid.effectsTitle": "Potion Effects", - "create.gui.stores_fluid.empty": "Empty", - "create.gui.input_tanks.title": "Input Tanks", - "create.gui.output_tanks.title": "Output Tanks", - "create.gui.tank.info_header": "Tank Information:", - "create.gui.spout.info_header": "Spout Information:", - "create.gui.drain.info_header": "Drain Information:", - "create.gui.basin.info_header": "Basin Information:", - "create.gui.adjustable_crate.title": "Adjustable Crate", "create.gui.adjustable_crate.storageSpace": "Storage Space", @@ -438,11 +430,6 @@ "create.tooltip.stressImpact.high": "High", "create.tooltip.stressImpact.overstressed": "Overstressed", - "create.tooltip.fluidFullness.low": "Low", - "create.tooltip.fluidFullness.medium": "Moderate", - "create.tooltip.fluidFullness.high": "High", - "create.tooltip.fluidFullness.full": "Full", - "create.tooltip.capacityProvided": "Stress Capacity: %1$s", "create.tooltip.capacityProvided.low": "Small", "create.tooltip.capacityProvided.medium": "Medium", From 93973004c8037d87f22aee256b3f58eb78d3699b Mon Sep 17 00:00:00 2001 From: grimmauld Date: Wed, 3 Mar 2021 19:33:15 +0100 Subject: [PATCH 049/124] Seats don't Like deployers. They just don't. --- .../content/contraptions/components/actors/SeatEntity.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java index 18e8cd48f..a009500eb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/SeatEntity.java @@ -15,6 +15,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; @@ -63,8 +64,9 @@ public class SeatEntity extends Entity implements IEntityAdditionalSpawnData { } @Override - protected boolean canBeRidden(Entity p_184228_1_) { - return true; + protected boolean canBeRidden(Entity entity) { + // Fake Players (tested with deployers) have a BUNCH of weird issues, don't let them ride seats + return !(entity instanceof FakePlayer); } @Override From 9d77f85b9442910a3f595c58f41cb3363093384e Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 3 Mar 2021 13:10:44 -0800 Subject: [PATCH 050/124] Fix crash on world reload. --- .../render/backend/instancing/InstancedTileRenderer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 325a3c3a5..4cd6ce646 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -144,6 +144,7 @@ public abstract class InstancedTileRenderer

{ material.delete(); } instances.clear(); + tickableInstances.clear(); } public boolean isTileUnloaded(TileEntity tile) { From fe492c5d751a2b7413eadb050e5ca65d13d90fae Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 3 Mar 2021 17:14:19 -0800 Subject: [PATCH 051/124] Better instance deletions. - Defer element removal until just before the model is drawn. - Use a modified version of ArrayList#removeIf to delete the instances and adjust the keys. --- .../backend/instancing/InstancedModel.java | 72 ++++++++++++++----- 1 file changed, 53 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index 5903ae496..c59bd573f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -2,7 +2,7 @@ package com.simibubi.create.foundation.render.backend.instancing; import java.nio.ByteBuffer; -import java.util.ArrayList; +import java.util.*; import java.util.function.Consumer; import com.simibubi.create.foundation.render.backend.Backend; @@ -74,18 +74,6 @@ public abstract class InstancedModel extends BufferedMod public synchronized void deleteInstance(InstanceKey key) { verifyKey(key); - int index = key.index; - - keys.remove(index); - data.remove(index); - - for (int i = index; i < keys.size(); i++) { - keys.get(i).index--; - } - - maxIndexChanged = keys.size() - 1; - markIndexChanged(Math.min(maxIndexChanged, index)); - key.invalidate(); } @@ -120,7 +108,9 @@ public abstract class InstancedModel extends BufferedMod } protected void renderSetup() { - if (minIndexChanged < 0 || data.isEmpty()) return; + boolean anyRemoved = doRemoval(); + + if (!anyRemoved && (minIndexChanged < 0 || data.isEmpty())) return; VertexFormat instanceFormat = getInstanceFormat(); @@ -140,11 +130,13 @@ public abstract class InstancedModel extends BufferedMod int offset = minIndexChanged * stride; int length = (1 + maxIndexChanged - minIndexChanged) * stride; - vbo.map(offset, length, buffer -> { - for (int i = minIndexChanged; i <= maxIndexChanged; i++) { - data.get(i).write(buffer); - } - }); + if (length > 0) { + vbo.map(offset, length, buffer -> { + for (int i = minIndexChanged; i <= maxIndexChanged; i++) { + data.get(i).write(buffer); + } + }); + } if (newInstanceCount < glInstanceCount) { int clearFrom = (maxIndexChanged + 1) * stride; @@ -170,6 +162,48 @@ public abstract class InstancedModel extends BufferedMod maxIndexChanged = -1; } + // copied from ArrayList#removeIf + protected boolean doRemoval() { + // figure out which elements are to be removed + // any exception thrown from the filter predicate at this stage + // will leave the collection unmodified + int removeCount = 0; + final int size = this.keys.size(); + final BitSet removeSet = new BitSet(size); + for (int i=0; i < size; i++) { + final InstanceKey element = this.keys.get(i); + if (!element.isValid()) { + removeSet.set(i); + removeCount++; + } + } + + // shift surviving elements left over the spaces left by removed elements + final boolean anyToRemove = removeCount > 0; + if (anyToRemove) { + final int newSize = size - removeCount; + for (int i = 0, j = 0; (i < size) && (j < newSize); i++, j++) { + i = removeSet.nextClearBit(i); + keys.set(j, keys.get(i)); + data.set(j, data.get(i)); + } + + keys.subList(newSize, size).clear(); + data.subList(newSize, size).clear(); + + int firstChanged = removeSet.nextSetBit(0); + + for (int i = firstChanged; i < newSize; i++) { + keys.get(i).index = i; + } + + minIndexChanged = 0; + maxIndexChanged = newSize - 1; + } + + return anyToRemove; + } + protected void markIndexChanged(int index) { if (minIndexChanged < 0) { minIndexChanged = index; From 9062f1c8fa3cf47ca9d25147d301cf902e13bbb2 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 3 Mar 2021 17:15:45 -0800 Subject: [PATCH 052/124] Null checks and flap updates. --- .../logistics/block/belts/tunnel/BeltTunnelInstance.java | 7 ++++++- .../logistics/block/belts/tunnel/BeltTunnelTileEntity.java | 4 ++++ .../content/logistics/block/funnel/FunnelTileEntity.java | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index 654bea79b..05671ba32 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.logistics.block.FlapData; +import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.tileentity.TileEntityType; @@ -72,8 +73,12 @@ public class BeltTunnelInstance extends TileEntityInstance @Override public void tick() { tunnelFlaps.forEach((direction, keys) -> { + InterpolatedChasingValue flapValue = tile.flaps.get(direction); + if (flapValue == null) { + return; + } - float flapness = tile.flaps.get(direction).get(AnimationTickHolder.getPartialTicks()); + float flapness = flapValue.get(AnimationTickHolder.getPartialTicks()); for (InstanceKey key : keys) { key.modifyInstance(data -> data.setFlapness(flapness)); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index bc5af6438..77938f65f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import java.util.*; import com.simibubi.create.CreateClient; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; @@ -113,6 +114,9 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe super.read(compound, clientPacket); + if (clientPacket) + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); + if (!clientPacket) return; if (!compound.contains("TriggerFlaps")) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index c2d8f3893..665f49802 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -331,6 +332,9 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn int direction = compound.getInt("Flap"); flap.set(direction); } + + if (clientPacket) + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); } @Override From d590b23aa731f919d06eb49bf9368ed62d0017c2 Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 4 Mar 2021 12:53:24 +0100 Subject: [PATCH 053/124] 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 b511a208149671cc8b471418f7417d41e294962a Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 4 Mar 2021 15:34:17 -0800 Subject: [PATCH 054/124] Flappy packets. - Instead of sending the entire tile entity (and maybe even chunk), send just what we need to. - Avoids unnecessary chunk rebuilds when flaps flap. - Beginning of a larger process to replace calls to SyncedTileEntity#sendData --- .../belts/tunnel/BeltTunnelInstance.java | 4 +- .../belts/tunnel/BeltTunnelTileEntity.java | 43 ++++--------- .../block/funnel/FunnelTileEntity.java | 20 +++--- .../logistics/packet/FunnelFlapPacket.java | 33 ++++++++++ .../logistics/packet/TunnelFlapPacket.java | 62 +++++++++++++++++++ .../foundation/networking/AllPackets.java | 6 +- .../networking/TileEntityDataPacket.java | 56 +++++++++++++++++ .../tileEntity/SyncedTileEntity.java | 11 ++++ 8 files changed, 190 insertions(+), 45 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java create mode 100644 src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index 05671ba32..afbfcc6a0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -3,7 +3,7 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.logistics.block.FlapData; -import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; +import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.tileentity.TileEntityType; @@ -73,7 +73,7 @@ public class BeltTunnelInstance extends TileEntityInstance @Override public void tick() { tunnelFlaps.forEach((direction, keys) -> { - InterpolatedChasingValue flapValue = tile.flaps.get(direction); + InterpolatedValue flapValue = tile.flaps.get(direction); if (flapValue == null) { return; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index 77938f65f..c6e805287 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import java.util.*; import com.simibubi.create.CreateClient; +import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; +import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; +import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import net.minecraftforge.api.distmarker.Dist; @@ -12,7 +15,6 @@ import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.AllBlocks; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; -import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.Iterate; @@ -68,22 +70,6 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe compound.put("Sides", sidesNBT); super.write(compound, clientPacket); - - if (!clientPacket) - return; - - flapsNBT = new ListNBT(); - if (!flapsToSend.isEmpty()) { - for (Pair pair : flapsToSend) { - CompoundNBT flap = new CompoundNBT(); - flap.putInt("Flap", pair.getKey() - .getIndex()); - flap.putBoolean("FlapInward", pair.getValue()); - flapsNBT.add(flap); - } - compound.put("TriggerFlaps", flapsNBT); - flapsToSend.clear(); - } } @Override @@ -116,17 +102,6 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe if (clientPacket) DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); - - if (!clientPacket) - return; - if (!compound.contains("TriggerFlaps")) - return; - flapsNBT = compound.getList("TriggerFlaps", NBT.TAG_COMPOUND); - for (INBT inbt : flapsNBT) { - CompoundNBT flap = (CompoundNBT) inbt; - Direction side = Direction.byIndex(flap.getInt("Flap")); - flap(side, flap.getBoolean("FlapInward")); - } } public void updateTunnelConnections() { @@ -158,8 +133,8 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe continue; flaps.put(direction, new InterpolatedChasingValue().start(.25f) - .target(0) - .withSpeed(.05f)); + .target(0) + .withSpeed(.05f)); } sendData(); } @@ -188,12 +163,18 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe super.tick(); if (!world.isRemote) { if (!flapsToSend.isEmpty()) - sendData(); + sendFlaps(); return; } flaps.forEach((d, value) -> value.tick()); } + private void sendFlaps() { + AllPackets.channel.send(packetTarget(), new TunnelFlapPacket(this, flapsToSend)); + + flapsToSend.clear(); + } + @Override public void addBehaviours(List behaviours) {} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 665f49802..c4d0516a1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -12,9 +12,12 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; +import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; +import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -39,6 +42,7 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -50,7 +54,6 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn private WeakReference lastObserved; // In-world Extractors only - int sendFlap; InterpolatedChasingValue flap; static enum Mode { @@ -285,8 +288,11 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn } public void flap(boolean inward) { - sendFlap = inward ? 1 : -1; - sendData(); + if (!world.isRemote) { + AllPackets.channel.send(packetTarget(), new FunnelFlapPacket(this, inward)); + } else { + flap.set(inward ? 1 : -1); + } } public boolean hasFlap() { @@ -318,20 +324,12 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn protected void write(CompoundNBT compound, boolean clientPacket) { super.write(compound, clientPacket); compound.putInt("TransferCooldown", extractionCooldown); - if (clientPacket && sendFlap != 0) { - compound.putInt("Flap", sendFlap); - sendFlap = 0; - } } @Override protected void read(CompoundNBT compound, boolean clientPacket) { super.read(compound, clientPacket); extractionCooldown = compound.getInt("TransferCooldown"); - if (clientPacket && compound.contains("Flap")) { - int direction = compound.getInt("Flap"); - flap.set(direction); - } if (clientPacket) DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); diff --git a/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java b/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java new file mode 100644 index 000000000..554643ce5 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packet/FunnelFlapPacket.java @@ -0,0 +1,33 @@ +package com.simibubi.create.content.logistics.packet; + +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; +import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; +import com.simibubi.create.foundation.networking.TileEntityDataPacket; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.Direction; + +public class FunnelFlapPacket extends TileEntityDataPacket { + + private final boolean inwards; + + public FunnelFlapPacket(PacketBuffer buffer) { + super(buffer); + + inwards = buffer.readBoolean(); + } + + public FunnelFlapPacket(FunnelTileEntity tile, boolean inwards) { + super(tile.getPos()); + this.inwards = inwards; + } + + @Override + protected void writeData(PacketBuffer buffer) { + buffer.writeBoolean(inwards); + } + + @Override + protected void handlePacket(FunnelTileEntity tile) { + tile.flap(inwards); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java b/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java new file mode 100644 index 000000000..d57360ac2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/packet/TunnelFlapPacket.java @@ -0,0 +1,62 @@ +package com.simibubi.create.content.logistics.packet; + +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelInstance; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; +import com.simibubi.create.foundation.networking.SimplePacketBase; +import com.simibubi.create.foundation.networking.TileEntityConfigurationPacket; +import com.simibubi.create.foundation.networking.TileEntityDataPacket; +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +public class TunnelFlapPacket extends TileEntityDataPacket { + + private List> flaps; + + public TunnelFlapPacket(PacketBuffer buffer) { + super(buffer); + + byte size = buffer.readByte(); + + this.flaps = new ArrayList<>(size); + + for (int i = 0; i < size; i++) { + Direction direction = Direction.byIndex(buffer.readByte()); + boolean inwards = buffer.readBoolean(); + + flaps.add(Pair.of(direction, inwards)); + } + } + + public TunnelFlapPacket(BeltTunnelTileEntity tile, List> flaps) { + super(tile.getPos()); + + this.flaps = new ArrayList<>(flaps); + } + + @Override + protected void writeData(PacketBuffer buffer) { + buffer.writeByte(flaps.size()); + + for (Pair flap : flaps) { + buffer.writeByte(flap.getLeft().getIndex()); + buffer.writeBoolean(flap.getRight()); + } + } + + @Override + protected void handlePacket(BeltTunnelTileEntity tile) { + for (Pair flap : flaps) { + tile.flap(flap.getLeft(), flap.getRight()); + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 0f5fca06b..044e806d5 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -28,6 +28,8 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmPlacementPac import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket; import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; +import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; +import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket; import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; @@ -86,7 +88,9 @@ public enum AllPackets { FLUID_SPLASH(FluidSplashPacket.class, FluidSplashPacket::new, PLAY_TO_CLIENT), CONTRAPTION_FLUID(ContraptionFluidPacket.class, ContraptionFluidPacket::new, PLAY_TO_CLIENT), GANTRY_UPDATE(GantryContraptionUpdatePacket.class, GantryContraptionUpdatePacket::new, PLAY_TO_CLIENT), - BLOCK_HIGHLIGHT(HighlightPacket.class, HighlightPacket::new, PLAY_TO_CLIENT) + BLOCK_HIGHLIGHT(HighlightPacket.class, HighlightPacket::new, PLAY_TO_CLIENT), + TUNNEL_FLAP(TunnelFlapPacket.class, TunnelFlapPacket::new, PLAY_TO_CLIENT), + FUNNEL_FLAP(FunnelFlapPacket.class, FunnelFlapPacket::new, PLAY_TO_CLIENT), ; diff --git a/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java b/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java new file mode 100644 index 000000000..2acdffb6d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/networking/TileEntityDataPacket.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.networking; + +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; +import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; +import net.minecraft.client.Minecraft; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraftforge.fml.network.NetworkEvent; + +import java.util.function.Supplier; + +/** + * A server to client version of {@link TileEntityConfigurationPacket} + * @param + */ +public abstract class TileEntityDataPacket extends SimplePacketBase { + + protected BlockPos tilePos; + + public TileEntityDataPacket(PacketBuffer buffer) { + tilePos = buffer.readBlockPos(); + } + + public TileEntityDataPacket(BlockPos pos) { + this.tilePos = pos; + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeBlockPos(tilePos); + writeData(buffer); + } + + @Override + public void handle(Supplier context) { + NetworkEvent.Context ctx = context.get(); + ctx.enqueueWork(() -> { + ClientWorld world = Minecraft.getInstance().world; + + if (world == null) return; + + TileEntity tile = world.getTileEntity(tilePos); + + if (tile instanceof SyncedTileEntity) { + handlePacket((TE) tile); + } + }); + ctx.setPacketHandled(true); + } + + protected abstract void writeData(PacketBuffer buffer); + + protected abstract void handlePacket(TE tile); +} diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java index be1c6b74d..2d2a1293c 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SyncedTileEntity.java @@ -5,6 +5,9 @@ import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SUpdateTileEntityPacket; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.math.SectionPos; +import net.minecraft.world.chunk.Chunk; +import net.minecraftforge.fml.network.PacketDistributor; public abstract class SyncedTileEntity extends TileEntity { @@ -60,4 +63,12 @@ public abstract class SyncedTileEntity extends TileEntity { sendData(); } + public PacketDistributor.PacketTarget packetTarget() { + return PacketDistributor.TRACKING_CHUNK.with(this::containedChunk); + } + + public Chunk containedChunk() { + SectionPos sectionPos = SectionPos.from(pos); + return world.getChunk(sectionPos.getSectionX(), sectionPos.getSectionZ()); + } } 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 055/124] 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 25fdf08e1132df6965b62aea3c3c225994a703bf Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 4 Mar 2021 23:43:28 -0800 Subject: [PATCH 056/124] Fog modes for new rendering. - For each fog mode, compile a different version of each shader. - Could maybe do some fancier preprocessing to make writing shaders easier? --- .../render/ContraptionProgram.java | 5 +- .../block/belts/tunnel/BeltTunnelBlock.java | 9 +++ .../foundation/render/backend/Backend.java | 52 +++++++++++------ .../render/backend/gl/BasicProgram.java | 14 ++--- .../foundation/render/backend/gl/GlFog.java | 21 ++++++- .../render/backend/gl/GlFogMode.java | 39 +++++++++++++ .../render/backend/gl/shader/GlProgram.java | 15 +++-- .../render/backend/gl/shader/GlShader.java | 4 +- .../backend/gl/shader/ProgramFogMode.java | 57 +++++++++++++++++++ .../backend/gl/shader/ProgramGroup.java | 22 +++++++ .../render/backend/gl/shader/ProgramSpec.java | 2 +- .../backend/gl/shader/ShaderConstants.java | 13 +++++ .../resources/assets/create/shader/belt.vert | 7 +++ .../assets/create/shader/contraption.frag | 33 +++++++++-- .../create/shader/contraption_actor.vert | 8 ++- .../create/shader/contraption_structure.vert | 7 ++- .../resources/assets/create/shader/flap.vert | 7 +++ .../assets/create/shader/instanced.frag | 33 +++++++++-- .../assets/create/shader/rotating.vert | 7 +++ 19 files changed, 306 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramGroup.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java index 7f0950ca0..4a0a6ffad 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionProgram.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramFogMode; import org.lwjgl.opengl.GL20; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; @@ -15,8 +16,8 @@ public class ContraptionProgram extends BasicProgram { protected int uLightVolume; - public ContraptionProgram(ResourceLocation name, int handle) { - super(name, handle); + public ContraptionProgram(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory) { + super(name, handle, fogFactory); uLightBoxSize = getUniformLocation("uLightBoxSize"); uLightBoxMin = getUniformLocation("uLightBoxMin"); uModel = getUniformLocation("uModel"); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java index 334a15976..bd24f2271 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelBlock.java @@ -26,6 +26,7 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.IStringSerializable; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.util.math.shapes.VoxelShape; @@ -211,6 +212,14 @@ public class BeltTunnelBlock extends Block implements ITE, return ActionResultType.SUCCESS; } + @Override + public BlockState rotate(BlockState state, Rotation rotation) { + Direction fromAxis = Direction.getFacingFromAxis(AxisDirection.POSITIVE, state.get(HORIZONTAL_AXIS)); + Direction rotated = rotation.rotate(fromAxis); + + return state.with(HORIZONTAL_AXIS, rotated.getAxis()); + } + @Override public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, boolean isMoving) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 5f53ee500..f495f3054 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -4,10 +4,14 @@ import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.FloatBuffer; +import java.util.EnumMap; import java.util.HashMap; import java.util.Map; import java.util.function.Predicate; +import com.simibubi.create.foundation.render.backend.gl.GlFog; +import com.simibubi.create.foundation.render.backend.gl.GlFogMode; +import com.simibubi.create.foundation.render.backend.gl.shader.*; import com.simibubi.create.foundation.render.backend.gl.versioned.GlFeatureCompat; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -16,10 +20,6 @@ import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.system.MemoryUtil; import com.simibubi.create.foundation.config.AllConfigs; -import com.simibubi.create.foundation.render.backend.gl.shader.GlProgram; -import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; -import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; -import com.simibubi.create.foundation.render.backend.gl.shader.ShaderType; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.texture.TextureUtil; @@ -31,11 +31,13 @@ import net.minecraftforge.resource.ISelectiveResourceReloadListener; import net.minecraftforge.resource.VanillaResourceType; public class Backend { + public static final Boolean SHADER_DEBUG_OUTPUT = false; + public static final Logger log = LogManager.getLogger(Backend.class); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); private static final Map> registry = new HashMap<>(); - private static final Map, GlProgram> programs = new HashMap<>(); + private static final Map, ProgramGroup> programs = new HashMap<>(); private static boolean enabled; @@ -60,7 +62,7 @@ public class Backend { @SuppressWarnings("unchecked") public static

> P getProgram(S spec) { - return (P) programs.get(spec); + return (P) programs.get(spec).get(GlFog.getFogMode()); } public static boolean available() { @@ -109,7 +111,7 @@ public class Backend { if (gl20()) { - programs.values().forEach(GlProgram::delete); + programs.values().forEach(ProgramGroup::delete); programs.clear(); for (ProgramSpec shader : registry.values()) { loadProgram(manager, shader); @@ -123,23 +125,39 @@ public class Backend { } private static

> void loadProgram(IResourceManager manager, S programSpec) { - GlShader vert = null; - GlShader frag = null; try { - vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, programSpec.defines); - frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, programSpec.defines); + Map programGroup = new EnumMap<>(GlFogMode.class); - GlProgram.Builder builder = GlProgram.builder(programSpec.name).attachShader(vert).attachShader(frag); + for (GlFogMode fogMode : GlFogMode.values()) { + programGroup.put(fogMode, loadProgram(manager, programSpec, fogMode)); + } - programSpec.attributes.forEach(builder::addAttribute); - - P program = builder.build(programSpec.factory); - - programs.put(programSpec, program); + programs.put(programSpec, new ProgramGroup<>(programGroup)); log.info("Loaded program {}", programSpec.name); } catch (IOException ex) { log.error("Failed to load program {}", programSpec.name, ex); + return; + } + } + + private static

> P loadProgram(IResourceManager manager, S programSpec, GlFogMode fogMode) throws IOException { + GlShader vert = null; + GlShader frag = null; + try { + ShaderConstants defines = new ShaderConstants(programSpec.defines); + + defines.defineAll(fogMode.getDefines()); + + vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, defines); + frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, defines); + + GlProgram.Builder builder = GlProgram.builder(programSpec.name, fogMode).attachShader(vert).attachShader(frag); + + programSpec.attributes.forEach(builder::addAttribute); + + return builder.build(programSpec.factory); + } finally { if (vert != null) vert.delete(); if (frag != null) frag.delete(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java index 2201626c1..bef778f9a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/BasicProgram.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.render.backend.gl; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramFogMode; import org.lwjgl.opengl.GL20; import com.simibubi.create.foundation.render.backend.Backend; @@ -14,20 +15,20 @@ public class BasicProgram extends GlProgram { protected final int uViewProjection; protected final int uDebug; protected final int uCameraPos; - protected final int uFogRange; - protected final int uFogColor; + + protected final ProgramFogMode fogMode; protected int uBlockAtlas; protected int uLightMap; - public BasicProgram(ResourceLocation name, int handle) { + public BasicProgram(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory) { super(name, handle); uTime = getUniformLocation("uTime"); uViewProjection = getUniformLocation("uViewProjection"); uDebug = getUniformLocation("uDebug"); uCameraPos = getUniformLocation("uCameraPos"); - uFogRange = getUniformLocation("uFogRange"); - uFogColor = getUniformLocation("uFogColor"); + + fogMode = fogFactory.create(this); bind(); registerSamplers(); @@ -48,8 +49,7 @@ public class BasicProgram extends GlProgram { uploadMatrixUniform(uViewProjection, viewProjection); GL20.glUniform3f(uCameraPos, (float) camX, (float) camY, (float) camZ); - GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); - GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); + fogMode.bind(); } protected static void uploadMatrixUniform(int uniform, Matrix4f mat) { diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java index de7958b8c..c56a789a8 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFog.java @@ -1,6 +1,7 @@ package com.simibubi.create.foundation.render.backend.gl; import com.mojang.blaze3d.platform.GlStateManager; +import org.lwjgl.opengl.GL11; public class GlFog { public static float[] FOG_COLOR = new float[] {0, 0, 0, 0}; @@ -9,7 +10,7 @@ public class GlFog { return GlStateManager.FOG.field_179049_a.field_179201_b; } - public static int getFogMode() { + public static int getFogModeGlEnum() { return GlStateManager.FOG.field_179047_b; } @@ -24,4 +25,22 @@ public class GlFog { public static float getFogStart() { return GlStateManager.FOG.field_179045_d; } + + public static GlFogMode getFogMode() { + if (!fogEnabled()) { + return GlFogMode.NONE; + } + + int mode = getFogModeGlEnum(); + + switch (mode) { + case GL11.GL_EXP2: + case GL11.GL_EXP: + return GlFogMode.EXP2; + case GL11.GL_LINEAR: + return GlFogMode.LINEAR; + default: + throw new UnsupportedOperationException("Unknown fog mode: " + mode); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java new file mode 100644 index 000000000..996763bab --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/GlFogMode.java @@ -0,0 +1,39 @@ +package com.simibubi.create.foundation.render.backend.gl; + +import com.google.common.collect.Lists; +import com.simibubi.create.foundation.render.backend.gl.shader.GlShader; +import com.simibubi.create.foundation.render.backend.gl.shader.ProgramFogMode; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; +import java.util.List; + +public enum GlFogMode { + NONE(ProgramFogMode.None::new), + LINEAR(ProgramFogMode.Linear::new, "USE_FOG_LINEAR"), + EXP2(ProgramFogMode.Exp2::new, "USE_FOG_EXP2"), + ; + + public static final String USE_FOG = "USE_FOG"; + + private final ProgramFogMode.Factory fogFactory; + private final List defines; + + GlFogMode(ProgramFogMode.Factory fogFactory) { + this.fogFactory = fogFactory; + this.defines = Collections.emptyList(); + } + + GlFogMode(ProgramFogMode.Factory fogFactory, String name) { + this.fogFactory = fogFactory; + this.defines = Lists.newArrayList(USE_FOG, name); + } + + public List getDefines() { + return defines; + } + + public ProgramFogMode.Factory getFogFactory() { + return fogFactory; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java index c911eea5f..09fdde86d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.render.backend.gl.shader; +import com.simibubi.create.foundation.render.backend.gl.GlFogMode; import org.lwjgl.opengl.GL20; import com.simibubi.create.foundation.render.backend.Backend; @@ -17,8 +18,8 @@ public abstract class GlProgram extends GlObject { this.name = name; } - public static Builder builder(ResourceLocation name) { - return new Builder(name); + public static Builder builder(ResourceLocation name, GlFogMode fogMode) { + return new Builder(name, fogMode); } public void bind() { @@ -37,7 +38,7 @@ public abstract class GlProgram extends GlObject { public int getUniformLocation(String uniform) { int index = GL20.glGetUniformLocation(this.handle(), uniform); - if (index < 0) { + if (index < 0 && Backend.SHADER_DEBUG_OUTPUT) { Backend.log.warn("No active uniform '{}' exists in program '{}'. Could be unused.", uniform, this.name); } @@ -69,12 +70,14 @@ public abstract class GlProgram extends GlObject { public static class Builder { private final ResourceLocation name; private final int program; + private final GlFogMode fogMode; private int attributeIndex; - public Builder(ResourceLocation name) { + public Builder(ResourceLocation name, GlFogMode fogMode) { this.name = name; this.program = GL20.glCreateProgram(); + this.fogMode = fogMode; } public Builder attachShader(GlShader shader) { @@ -113,12 +116,12 @@ public abstract class GlProgram extends GlObject { throw new RuntimeException("Shader program linking failed, see log for details"); } - return factory.create(this.name, this.program); + return factory.create(this.name, this.program, this.fogMode.getFogFactory()); } } @FunctionalInterface public interface ProgramFactory

{ - P create(ResourceLocation name, int handle); + P create(ResourceLocation name, int handle, ProgramFogMode.Factory fogFactory); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java index 8ef265920..6f7076a18 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java @@ -19,7 +19,9 @@ public class GlShader extends GlObject { if (preProcessor != null) { source = preProcessor.process(source); - Backend.log.info("Preprocessor run on " + name);// + ":\n" + source); + + if (Backend.SHADER_DEBUG_OUTPUT) + Backend.log.info("Preprocessor run on " + name);// + ":\n" + source); } GL20.glShaderSource(handle, source); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java new file mode 100644 index 000000000..804aa5073 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramFogMode.java @@ -0,0 +1,57 @@ +package com.simibubi.create.foundation.render.backend.gl.shader; + +import com.simibubi.create.foundation.render.backend.gl.GlFog; +import org.lwjgl.opengl.GL20; + +public abstract class ProgramFogMode { + + public abstract void bind(); + + public static class None extends ProgramFogMode { + + public None(GlProgram program) { + + } + + @Override + public void bind() { + + } + } + + public static class Linear extends ProgramFogMode { + private final int uFogColor; + private final int uFogRange; + + public Linear(GlProgram program) { + this.uFogColor = program.getUniformLocation("uFogColor"); + this.uFogRange = program.getUniformLocation("uFogRange"); + } + + @Override + public void bind() { + GL20.glUniform2f(uFogRange, GlFog.getFogStart(), GlFog.getFogEnd()); + GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); + } + } + + public static class Exp2 extends ProgramFogMode { + private final int uFogColor; + private final int uFogDensity; + + public Exp2(GlProgram program) { + this.uFogColor = program.getUniformLocation("uFogColor"); + this.uFogDensity = program.getUniformLocation("uFogDensity"); + } + + @Override + public void bind() { + GL20.glUniform1f(uFogDensity, GlFog.getFogDensity()); + GL20.glUniform4fv(uFogColor, GlFog.FOG_COLOR); + } + } + + public interface Factory { + ProgramFogMode create(GlProgram program); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramGroup.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramGroup.java new file mode 100644 index 000000000..b31ae0237 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramGroup.java @@ -0,0 +1,22 @@ +package com.simibubi.create.foundation.render.backend.gl.shader; + +import com.simibubi.create.foundation.render.backend.gl.GlFogMode; + +import java.util.Map; + +public class ProgramGroup

{ + + private final Map programs; + + public ProgramGroup(Map programs) { + this.programs = programs; + } + + public P get(GlFogMode fogMode) { + return programs.get(fogMode); + } + + public void delete() { + programs.values().forEach(GlProgram::delete); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java index 7c2a2ca93..a7bc130af 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ProgramSpec.java @@ -50,7 +50,7 @@ public class ProgramSpec

{ public static class Builder

{ private ResourceLocation vert; private ResourceLocation frag; - private ShaderConstants defines = null; + private ShaderConstants defines = ShaderConstants.EMPTY; private final ResourceLocation name; private final GlProgram.ProgramFactory

factory; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java index 3f1ed6c09..9c509cc7d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/ShaderConstants.java @@ -1,12 +1,16 @@ package com.simibubi.create.foundation.render.backend.gl.shader; +import com.google.common.collect.Lists; + import java.io.BufferedReader; import java.io.StringReader; import java.util.ArrayList; +import java.util.Collection; import java.util.stream.Collectors; import java.util.stream.Stream; public class ShaderConstants implements GlShader.PreProcessor { + public static final ShaderConstants EMPTY = new ShaderConstants(); private final ArrayList defines; @@ -14,6 +18,10 @@ public class ShaderConstants implements GlShader.PreProcessor { defines = new ArrayList<>(); } + public ShaderConstants(ShaderConstants other) { + this.defines = Lists.newArrayList(other.defines); + } + public static ShaderConstants define(String def) { return new ShaderConstants().def(def); } @@ -23,6 +31,11 @@ public class ShaderConstants implements GlShader.PreProcessor { return this; } + public ShaderConstants defineAll(Collection defines) { + this.defines.addAll(defines); + return this; + } + public ArrayList getDefines() { return defines; } diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index c150f012b..14921cb7a 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -33,7 +33,10 @@ uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; + +#if defined(USE_FOG) varying float FragDistance; +#endif mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -71,12 +74,16 @@ void main() { mat4 normalMat = uModel * localRotation; BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + #if defined(USE_FOG) FragDistance = length(worldPos.xyz); + #endif #else mat4 normalMat = localRotation; + #if defined(USE_FOG) FragDistance = length(worldPos.xyz - uCameraPos); #endif + #endif vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/shader/contraption.frag index 5d90b40ff..9049221f1 100644 --- a/src/main/resources/assets/create/shader/contraption.frag +++ b/src/main/resources/assets/create/shader/contraption.frag @@ -4,17 +4,35 @@ varying vec2 TexCoords; varying vec4 Color; varying float Diffuse; varying vec2 Light; -varying float FragDistance; varying vec3 BoxCoord; -uniform vec2 uFogRange; -uniform vec4 uFogColor; - uniform sampler2D uBlockAtlas; uniform sampler2D uLightMap; uniform sampler3D uLightVolume; +#if defined(USE_FOG) +varying float FragDistance; +uniform vec4 uFogColor; +#endif + +#if defined(USE_FOG_LINEAR) +uniform vec2 uFogRange; + +float fogFactor() { + return (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); +} +#endif + +#ifdef USE_FOG_EXP2 +uniform float uFogDensity; + +float fogFactor() { + float dist = FragDistance * uFogDensity; + return 1. / exp2(dist * dist); +} +#endif + vec4 light() { vec2 lm = texture3D(uLightVolume, BoxCoord).rg * 0.9375 + 0.03125; return texture2D(uLightMap, max(lm, Light)); @@ -25,9 +43,12 @@ void main() { vec4 color = vec4(tex.rgb * light().rgb * Diffuse * Color.rgb, tex.a); - float fog = (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); - fog = clamp(fog, 0., 1.); +#if defined(USE_FOG) + float fog = clamp(fogFactor(), 0., 1.); gl_FragColor = mix(uFogColor, color, fog); gl_FragColor.a = color.a; +#else + gl_FragColor = color; +#endif } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index 7dbae771c..cc31d18ed 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -29,7 +29,10 @@ uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; + +#if defined(USE_FOG) varying float FragDistance; +#endif mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -77,9 +80,12 @@ void main() { Diffuse = diffuse(norm); TexCoords = aTexCoords; Light = aModelLight; - FragDistance = length(worldPos.xyz); gl_Position = uViewProjection * worldPos; + #if defined(USE_FOG) + FragDistance = length(worldPos.xyz); + #endif + if (uDebug == 2) { Color = vec4(norm, 1.); } else { diff --git a/src/main/resources/assets/create/shader/contraption_structure.vert b/src/main/resources/assets/create/shader/contraption_structure.vert index a665ea8ff..0e053db27 100644 --- a/src/main/resources/assets/create/shader/contraption_structure.vert +++ b/src/main/resources/assets/create/shader/contraption_structure.vert @@ -22,7 +22,10 @@ uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; + +#if defined(USE_FOG) varying float FragDistance; +#endif mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -52,8 +55,10 @@ void main() { Color = aColor / diffuse(aNormal); TexCoords = aTexCoords; Light = aModelLight; - FragDistance = length(viewPos.xyz); gl_Position = uViewProjection * viewPos; + #if defined(USE_FOG) + FragDistance = length(viewPos.xyz); + #endif if (uDebug == 2) { Color = vec4(norm, 1.); diff --git a/src/main/resources/assets/create/shader/flap.vert b/src/main/resources/assets/create/shader/flap.vert index bd982595d..a70fdf1ad 100644 --- a/src/main/resources/assets/create/shader/flap.vert +++ b/src/main/resources/assets/create/shader/flap.vert @@ -35,7 +35,10 @@ uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; + +#if defined(USE_FOG) varying float FragDistance; +#endif float diffuse(vec3 normal) { float x = normal.x; @@ -86,12 +89,16 @@ void main() { mat4 normalMat = uModel * orientation * flapRotation; BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + #if defined(USE_FOG) FragDistance = length(worldPos.xyz); + #endif #else mat4 normalMat = orientation * flapRotation; + #if defined(USE_FOG) FragDistance = length(worldPos.xyz - uCameraPos); #endif + #endif vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/instanced.frag index cb85241f5..e8ffaa00c 100644 --- a/src/main/resources/assets/create/shader/instanced.frag +++ b/src/main/resources/assets/create/shader/instanced.frag @@ -4,14 +4,32 @@ varying vec2 TexCoords; varying vec2 Light; varying float Diffuse; varying vec4 Color; -varying float FragDistance; - -uniform vec2 uFogRange; -uniform vec4 uFogColor; uniform sampler2D uBlockAtlas; uniform sampler2D uLightMap; +#if defined(USE_FOG) +varying float FragDistance; +uniform vec4 uFogColor; +#endif + +#if defined(USE_FOG_LINEAR) +uniform vec2 uFogRange; + +float fogFactor() { + return (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); +} +#endif + +#ifdef USE_FOG_EXP2 +uniform float uFogDensity; + +float fogFactor() { + float dist = FragDistance * uFogDensity; + return 1. / exp2(dist * dist); +} +#endif + vec4 light() { vec2 lm = Light * 0.9375 + 0.03125; return texture2D(uLightMap, lm); @@ -22,9 +40,12 @@ void main() { vec4 color = vec4(tex.rgb * light().rgb * Diffuse, tex.a) * Color; - float fog = (uFogRange.y - FragDistance) / (uFogRange.y - uFogRange.x); - fog = clamp(fog, 0., 1.); +#if defined(USE_FOG) + float fog = clamp(fogFactor(), 0., 1.); gl_FragColor = mix(uFogColor, color, fog); gl_FragColor.a = color.a; +#else + gl_FragColor = color; +#endif } \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert index a1f803139..afa32c38c 100644 --- a/src/main/resources/assets/create/shader/rotating.vert +++ b/src/main/resources/assets/create/shader/rotating.vert @@ -29,7 +29,10 @@ uniform mat4 uViewProjection; uniform int uDebug; uniform vec3 uCameraPos; + +#if defined(USE_FOG) varying float FragDistance; +#endif mat4 rotate(vec3 axis, float angle) { float s = sin(angle); @@ -69,12 +72,16 @@ void main() { mat4 normalMat = uModel * kineticRotation; BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + #if defined(USE_FOG) FragDistance = length(worldPos.xyz); + #endif #else mat4 normalMat = kineticRotation; + #if defined(USE_FOG) FragDistance = length(worldPos.xyz - uCameraPos); #endif + #endif vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; 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 057/124] 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 058/124] 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 059/124] 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: Sat, 6 Mar 2021 14:33:01 -0800 Subject: [PATCH 060/124] The bell tolls for this bug. - Fix MovementBehavior#onSpeedChanged not ever being called. --- .../structureMovement/AbstractContraptionEntity.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index 5b8c56e0b..3a9bd106d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -253,6 +253,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit BlockInfo blockInfo = pair.left; MovementBehaviour actor = AllMovementBehaviours.of(blockInfo.state); + Vec3d oldMotion = context.motion; Vec3d actorPosition = toGlobalVector(VecHelper.getCenterOf(blockInfo.pos) .add(actor.getActiveAreaOffset(context)), 1); BlockPos gridPosition = new BlockPos(actorPosition); @@ -261,8 +262,6 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit context.rotation = v -> applyRotation(v, 1); context.position = actorPosition; - - Vec3d oldMotion = context.motion; if (!actor.isActive(context)) continue; if (newPosVisited && !context.stall) { From e930e62436ce8e061c2d703f00e3f6fd473074cb Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 6 Mar 2021 15:08:46 -0800 Subject: [PATCH 061/124] Belting these bugs. - Belts now always render their items again. - Items on belts on contraptions are now at least somewhat lit. --- .../content/contraptions/base/KineticTileEntity.java | 1 + .../content/contraptions/relays/belt/BeltRenderer.java | 7 +++++-- .../content/contraptions/relays/belt/BeltTileEntity.java | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) 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 d0ca45720..c12fa785a 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 @@ -225,6 +225,7 @@ public abstract class KineticTileEntity extends SmartTileEntity boolean overStressedBefore = overStressed; clearKineticInformation(); + cachedBoundingBox = null; // DO NOT READ kinetic information when placed after movement if (wasMoved) { super.read(compound, clientPacket); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index 0c2593245..c78922e49 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -20,6 +20,7 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -45,7 +46,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { @Override public boolean isGlobalRenderer(BeltTileEntity te) { - return BeltBlock.canTransportObjects(te.getBlockState()); + return te.isController(); } @Override @@ -189,6 +190,8 @@ public class BeltRenderer extends SafeTileEntityRenderer { boolean slopeAlongX = beltFacing .getAxis() == Axis.X; + boolean onContraption = te.getWorld() instanceof WrappedWorld; + for (TransportedItemStack transported : te.getInventory() .getTransportedItems()) { ms.push(); @@ -203,7 +206,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { sideOffset = transported.sideOffset; } - int stackLight = getPackedLight(te, offset); + int stackLight = onContraption ? light : getPackedLight(te, offset); if (offset < .5) verticalMovement = 0; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index f26ebceed..a55c23825 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -521,7 +521,7 @@ public class BeltTileEntity extends KineticTileEntity { @Override public boolean shouldRenderAsTE() { - return BeltBlock.canTransportObjects(getBlockState()); + return isController(); } private void updateLight() { From bb3fed2a3b1fdefdc7cfb989b9519308c1753a84 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Sat, 6 Mar 2021 21:46:17 -0800 Subject: [PATCH 062/124] Towards better normals. - Easier SuperByteBuffer transform settings. - Some cleanup here and there. --- .../base/BackHalfShaftInstance.java | 2 +- .../contraptions/base/KineticData.java | 7 + .../base/SingleRotatingInstance.java | 2 +- .../components/actors/DrillInstance.java | 2 +- .../chassis/StickerRenderer.java | 9 +- .../gantry/GantryPinionRenderer.java | 24 ++- .../render/ContraptionRenderer.java | 7 - .../relays/belt/BeltRenderer.java | 9 +- .../relays/encased/ShaftInstance.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 57 ++++--- .../block/SchematicannonRenderer.java | 149 +++++++++--------- .../simibubi/create/events/ClientEvents.java | 1 - .../foundation/render/SuperByteBuffer.java | 31 +++- .../backend/instancing/InstancedModel.java | 8 + .../foundation/utility/MatrixStacker.java | 13 +- 15 files changed, 182 insertions(+), 141 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index 0d566b45f..909b380bc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -15,7 +15,7 @@ public class BackHalfShaftInstance extends HalfShaftInstance { InstancedTileRenderRegistry.instance.register(type, BackHalfShaftInstance::new)); } - public BackHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public BackHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java index 84d8a878a..36ce074fd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java @@ -58,6 +58,13 @@ public class KineticData> extends InstanceData { return (D) this; } + public D nudge(float x, float y, float z) { + this.x += x; + this.y += y; + this.z += z; + return (D) this; + } + public D setBlockLight(int blockLight) { this.blockLight = (byte) ((blockLight & 0xF) << 4); return (D) this; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 9008e2f44..65996958c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -21,7 +21,7 @@ public class SingleRotatingInstance extends KineticTileInstance rotatingModelKey; - public SingleRotatingInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public SingleRotatingInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 6ff6d7832..27d2bcdd6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -24,7 +24,7 @@ public class DrillInstance extends SingleRotatingInstance { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, DrillInstance::new)); } - public DrillInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public DrillInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index 8e6ef665c..e1b3e2741 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -32,17 +32,16 @@ public class StickerRenderer extends SafeTileEntityRenderer { offset = state.get(StickerBlock.EXTENDED) ? 1 : 0; Direction facing = state.get(StickerBlock.FACING); - ms.push(); - MatrixStacker.of(ms) + head.matrixStacker() .nudge(te.hashCode()) .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(AngleHelper.verticalAngle(facing) + 90) - .unCentre(); - ms.translate(0, (offset * offset) * 4 / 16f, 0); + .unCentre() + .translate(0, (offset * offset) * 4 / 16f, 0); + head.light(light) .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); - ms.pop(); } } 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/GantryPinionRenderer.java index df2d3b49b..eb5be4809 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/GantryPinionRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; @@ -50,25 +51,20 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { if (facing == Direction.NORTH || facing == Direction.EAST) angleForTe *= -1; - ms.push(); - - MatrixStacker msr = MatrixStacker.of(ms); - - msr.centre() + SuperByteBuffer cogs = AllBlockPartials.GANTRY_COGS.renderOn(state); + cogs.matrixStacker() + .centre() .rotateY(AngleHelper.horizontalAngle(facing)) .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) - .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0); + .rotateY(alongFirst ^ facing.getAxis() == Axis.Z ? 90 : 0) + .translate(0, -9 / 16f, 0) + .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)) + .translate(0, 9 / 16f, 0) + .unCentre(); - ms.translate(0, -9 / 16f, 0); - ms.multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)); - ms.translate(0, 9 / 16f, 0); - - msr.unCentre(); - AllBlockPartials.GANTRY_COGS.renderOn(state) - .light(light) + cogs.light(light) .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); - ms.pop(); } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java deleted file mode 100644 index cf2bd4059..000000000 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderer.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.simibubi.create.content.contraptions.components.structureMovement.render; - -public class ContraptionRenderer { - - - -} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index c78922e49..9af581f3f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -71,11 +71,11 @@ public class BeltRenderer extends SafeTileEntityRenderer { boolean sideways = beltSlope == BeltSlope.SIDEWAYS; boolean alongX = facing.getAxis() == Axis.X; - MatrixStacker msr = MatrixStacker.of(ms); + MatrixStack localTransforms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(localTransforms); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); float renderTick = AnimationTickHolder.getRenderTime(); - ms.push(); msr.centre(); msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); msr.rotateZ(sideways ? 90 : 0); @@ -117,12 +117,13 @@ public class BeltRenderer extends SafeTileEntityRenderer { beltBuffer.shiftUVScrolling(spriteShift, (float) scroll); } - beltBuffer.renderInto(ms, vb); + beltBuffer + .transform(localTransforms) + .renderInto(ms, vb); // Diagonal belt do not have a separate bottom model if (diagonal) break; } - ms.pop(); if (te.hasPulley()) { // TODO 1.15 find a way to cache this model matrix computation diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java index 3dd04f582..de4093d09 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java @@ -17,7 +17,7 @@ public class ShaftInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, ShaftInstance::new)); } - public ShaftInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + public ShaftInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { super(dispatcher, tile); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 40d8c9ccd..a15fca209 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -41,7 +41,9 @@ public class ArmRenderer extends KineticTileEntityRenderer { ArmTileEntity arm = (ArmTileEntity) te; IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); BlockState blockState = te.getBlockState(); - MatrixStacker msr = MatrixStacker.of(ms); + + MatrixStack msLocal = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(msLocal); int color = 0xFFFFFF; float baseAngle = arm.baseAngle.get(pt); @@ -58,8 +60,6 @@ public class ArmRenderer extends KineticTileEntityRenderer { headAngle = -lowerArmAngle; color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100); } - - ms.push(); SuperByteBuffer base = AllBlockPartials.ARM_BASE.renderOn(blockState).light(light); SuperByteBuffer lowerBody = AllBlockPartials.ARM_LOWER_BODY.renderOn(blockState).light(light); @@ -73,27 +73,32 @@ public class ArmRenderer extends KineticTileEntityRenderer { if (blockState.get(ArmBlock.CEILING)) msr.rotateX(180); - ms.translate(0, 4 / 16d, 0); + msLocal.translate(0, 4 / 16d, 0); msr.rotateY(baseAngle); - base.renderInto(ms, builder); - - ms.translate(0, 1 / 16d, -2 / 16d); - msr.rotateX(lowerArmAngle); - ms.translate(0, -1 / 16d, 0); - lowerBody.color(color) + base.transform(msLocal) .renderInto(ms, builder); - ms.translate(0, 12 / 16d, 12 / 16d); + msLocal.translate(0, 1 / 16d, -2 / 16d); + msr.rotateX(lowerArmAngle); + msLocal.translate(0, -1 / 16d, 0); + lowerBody.color(color) + .transform(msLocal) + .renderInto(ms, builder); + + msLocal.translate(0, 12 / 16d, 12 / 16d); msr.rotateX(upperArmAngle); upperBody.color(color) + .transform(msLocal) + .renderInto(ms, builder); + + msLocal.translate(0, 11 / 16d, -11 / 16d); + msr.rotateX(headAngle); + head.transform(msLocal) .renderInto(ms, builder); - ms.translate(0, 11 / 16d, -11 / 16d); - msr.rotateX(headAngle); - head.renderInto(ms, builder); - - ms.translate(0, 0, -4 / 16d); - claw.renderInto(ms, builder); + msLocal.translate(0, 0, -4 / 16d); + claw.transform(msLocal) + .renderInto(ms, builder); ItemStack item = arm.heldItem; ItemRenderer itemRenderer = Minecraft.getInstance() .getItemRenderer(); @@ -103,23 +108,27 @@ public class ArmRenderer extends KineticTileEntityRenderer { .isGui3d(); for (int flip : Iterate.positiveAndNegative) { - ms.push(); - ms.translate(0, flip * 3 / 16d, -1 / 16d); + msLocal.push(); + msLocal.translate(0, flip * 3 / 16d, -1 / 16d); msr.rotateX(flip * (hasItem ? isBlockItem ? 0 : -35 : 0)); - clawGrip.light(light).renderInto(ms, builder); - ms.pop(); + clawGrip.light(light).transform(msLocal).renderInto(ms, builder); + msLocal.pop(); } if (hasItem) { + ms.push(); float itemScale = isBlockItem ? .5f : .625f; msr.rotateX(90); - ms.translate(0, -4 / 16f, 0); - ms.scale(itemScale, itemScale, itemScale); + msLocal.translate(0, -4 / 16f, 0); + msLocal.scale(itemScale, itemScale, itemScale); + + ms.peek().getModel().multiply(msLocal.peek().getModel()); + itemRenderer .renderItem(item, TransformType.FIXED, light, overlay, ms, buffer); + ms.pop(); } - ms.pop(); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java index bf90d3f84..6163c07fc 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java @@ -42,7 +42,6 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer launched.totalTicks - 10) - recoil = Math.max(recoil, (launched.ticksRemaining + 1 - partialTicks) - launched.totalTicks + 10); - - // Render particles for launch - if (launched.ticksRemaining == launched.totalTicks && tileEntityIn.firstRenderTick) { - tileEntityIn.firstRenderTick = false; - for (int i = 0; i < 10; i++) { - Random r = tileEntityIn.getWorld().getRandom(); - double sX = cannonOffset.x * .01f; - double sY = (cannonOffset.y + 1) * .01f; - double sZ = cannonOffset.z * .01f; - double rX = r.nextFloat() - sX * 40; - double rY = r.nextFloat() - sY * 40; - double rZ = r.nextFloat() - sZ * 40; - tileEntityIn.getWorld().addParticle(ParticleTypes.CLOUD, start.x + rX, start.y + rY, - start.z + rZ, sX, sY, sZ); - } - } - - } - } + double recoil = !tileEntityIn.flyingBlocks.isEmpty() ? getRecoil(tileEntityIn, partialTicks, ms, buffer, light, overlay) : 0; ms.push(); BlockState state = tileEntityIn.getBlockState(); @@ -163,4 +91,79 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer launched.totalTicks - 10) + recoil = Math.max(recoil, (launched.ticksRemaining + 1 - partialTicks) - launched.totalTicks + 10); + + // Render particles for launch + if (launched.ticksRemaining == launched.totalTicks && tileEntityIn.firstRenderTick) { + tileEntityIn.firstRenderTick = false; + for (int i = 0; i < 10; i++) { + Random r = tileEntityIn.getWorld().getRandom(); + double sX = cannonOffset.x * .01f; + double sY = (cannonOffset.y + 1) * .01f; + double sZ = cannonOffset.z * .01f; + double rX = r.nextFloat() - sX * 40; + double rY = r.nextFloat() - sY * 40; + double rZ = r.nextFloat() - sZ * 40; + tileEntityIn.getWorld().addParticle(ParticleTypes.CLOUD, start.x + rX, start.y + rY, + start.z + rZ, sX, sY, sZ); + } + } + + } + + return recoil; + } + } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 1407b4d1e..7aeca6f3b 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -201,7 +201,6 @@ public class ClientEvents { if (!isGameActive()) return; TurntableHandler.gameRenderTick(); - ContraptionRenderDispatcher.renderTick(); } protected static boolean isGameActive() { diff --git a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java index 62c3f935f..840f5f0f0 100644 --- a/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java @@ -8,17 +8,15 @@ import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; +import com.simibubi.create.foundation.utility.MatrixStacker; import it.unimi.dsi.fastutil.longs.Long2DoubleMap; import it.unimi.dsi.fastutil.longs.Long2DoubleOpenHashMap; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BufferBuilder; -import net.minecraft.client.renderer.Matrix3f; -import net.minecraft.client.renderer.Matrix4f; -import net.minecraft.client.renderer.Vector3f; -import net.minecraft.client.renderer.Vector4f; +import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.LightType; import net.minecraft.world.World; import net.minecraftforge.client.model.pipeline.LightUtil; @@ -107,13 +105,16 @@ public class SuperByteBuffer extends TemplateBuffer { float staticDiffuse = LightUtil.diffuseLight(normalX, normalY, normalZ); normal.set(normalX, normalY, normalZ); normal.transform(normalMat); - float instanceDiffuse = LightUtil.diffuseLight(normal.getX(), normal.getY(), normal.getZ()); + float nx = normal.getX(); + float ny = normal.getY(); + float nz = normal.getZ(); + float instanceDiffuse = LightUtil.diffuseLight(nx, ny, nz); pos.set(x, y, z, 1F); pos.transform(modelMat); builder.vertex(pos.getX(), pos.getY(), pos.getZ()); - //builder.color((byte) Math.max(0, normal.getX() * 255), (byte) Math.max(0, normal.getY() * 255), (byte) Math.max(0, normal.getZ() * 255), a); + //builder.color((byte) Math.max(0, nx * 255), (byte) Math.max(0, ny * 255), (byte) Math.max(0, nz * 255), a); if (shouldColor) { //float lum = (r < 0 ? 255 + r : r) / 256f; int colorR = Math.min(255, (int) (((float) this.r) * instanceDiffuse)); @@ -152,7 +153,7 @@ public class SuperByteBuffer extends TemplateBuffer { } else builder.light(getLight(buffer, i)); - builder.normal(normal.getX(), normal.getY(), normal.getZ()) + builder.normal(nx, ny, nz) .endVertex(); } @@ -164,6 +165,14 @@ public class SuperByteBuffer extends TemplateBuffer { otherBlockLight = -1; } + public MatrixStacker matrixStacker() { + return MatrixStacker.of(transforms); + } + + public SuperByteBuffer translate(Vec3d vec) { + return translate(vec.x, vec.y, vec.z); + } + public SuperByteBuffer translate(double x, double y, double z) { return translate((float) x, (float) y, (float) z); } @@ -173,6 +182,12 @@ public class SuperByteBuffer extends TemplateBuffer { return this; } + public SuperByteBuffer transform(MatrixStack stack) { + transforms.peek().getModel().multiply(stack.peek().getModel()); + transforms.peek().getNormal().multiply(stack.peek().getNormal()); + return this; + } + public SuperByteBuffer rotate(Direction axis, float radians) { if (radians == 0) return this; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index c59bd573f..2a0255eab 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -77,6 +77,14 @@ public abstract class InstancedModel extends BufferedMod key.invalidate(); } + public D getInstance(InstanceKey key) { + verifyKey(key); + + markIndexChanged(key.index); + + return this.data.get(key.index); + } + public synchronized void modifyInstance(InstanceKey key, Consumer edit) { verifyKey(key); diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 46555224c..c56938d49 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.utility; import com.mojang.blaze3d.matrix.MatrixStack; +import net.minecraft.client.renderer.Quaternion; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; @@ -10,7 +11,7 @@ import net.minecraft.util.math.Vec3i; public class MatrixStacker { - static Vec3d center = VecHelper.getCenterOf(BlockPos.ZERO); + public static final Vec3d center = VecHelper.getCenterOf(BlockPos.ZERO); static MatrixStacker instance; MatrixStack ms; @@ -63,6 +64,16 @@ public class MatrixStacker { return this; } + public MatrixStacker translate(double x, double y, double z) { + ms.translate(x, y, z); + return this; + } + + public MatrixStacker multiply(Quaternion quaternion) { + ms.multiply(quaternion); + return this; + } + public MatrixStacker nudge(int id) { long randomBits = (long) id * 493286711L; randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; From 47b54b1ae6c1c416e38b961e17d6acbd9f0922f4 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 7 Mar 2021 17:22:18 +0100 Subject: [PATCH 063/124] 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 064/124] 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 065/124] 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 From d0e5be24d70ef4181324b8ef9797669f406395c8 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Mar 2021 00:36:23 -0800 Subject: [PATCH 066/124] Transformed models. --- .../com/simibubi/create/AllTileEntities.java | 5 +- .../base/KineticTileInstance.java | 5 +- .../base/KineticVertexAttributes.java | 3 +- .../base/RotatingVertexAttributes.java | 3 +- .../base/SingleRotatingInstance.java | 2 +- .../actors/ActorVertexAttributes.java | 3 +- .../components/actors/DrillInstance.java | 2 +- .../components/actors/HarvesterRenderer.java | 2 +- .../components/fan/FanInstance.java | 4 +- .../components/flywheel/FlyWheelInstance.java | 2 +- .../chassis/StickerInstance.java | 80 +++++++++++++++ .../chassis/StickerRenderer.java | 4 + .../chassis/StickerTileEntity.java | 9 +- .../gantry/GantryPinionInstance.java | 99 +++++++++++++++++++ .../gantry/GantryPinionRenderer.java | 4 + .../render/ContraptionKineticRenderer.java | 12 ++- .../render/ContraptionRenderDispatcher.java | 8 +- .../render/ContraptionVertexAttributes.java | 3 +- .../render/RenderedContraption.java | 4 +- .../relays/belt/BeltInstance.java | 4 +- .../relays/belt/BeltVertexAttributes.java | 3 +- .../relays/encased/SplitShaftInstance.java | 2 +- .../relays/gearbox/GearboxInstance.java | 2 +- .../logistics/block/FlapVertexAttributes.java | 3 +- .../belts/tunnel/BeltTunnelInstance.java | 2 +- .../block/funnel/FunnelInstance.java | 18 ++-- .../foundation/render/AllProgramSpecs.java | 97 ++++++++++-------- .../foundation/render/KineticRenderer.java | 4 + .../create/foundation/render/RenderMath.java | 13 --- .../foundation/render/backend/Backend.java | 2 +- .../render/backend/RenderMaterials.java | 10 ++ .../foundation/render/backend/RenderUtil.java | 56 +++++++++++ .../backend/gl/attrib/CommonAttributes.java | 1 - .../render/backend/gl/attrib/IAttribSpec.java | 12 +++ .../backend/gl/attrib/IVertexAttrib.java | 2 +- .../gl/attrib/InstanceVertexAttributes.java | 36 +++++++ .../backend/gl/attrib/MatrixAttributes.java | 36 +++++++ .../gl/attrib/ModelVertexAttributes.java | 2 +- .../backend/gl/attrib/VertexAttribSpec.java | 5 +- .../backend/gl/attrib/VertexFormat.java | 4 +- .../backend/instancing/InstanceKey.java | 4 + .../backend/instancing/InstancedModel.java | 18 +++- .../instancing/TileEntityInstance.java | 4 + .../instancing/impl/TransformData.java | 56 +++++++++++ .../impl/TransformedInstancedModel.java | 25 +++++ .../render/backend/light/GridAlignedBB.java | 16 +-- .../resources/META-INF/accesstransformer.cfg | 29 +++++- .../shader/{instanced.frag => model.frag} | 0 .../resources/assets/create/shader/model.vert | 76 ++++++++++++++ 49 files changed, 679 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionInstance.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/RenderMath.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java rename src/main/resources/assets/create/shader/{instanced.frag => model.frag} (100%) create mode 100644 src/main/resources/assets/create/shader/model.vert diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 5b0c1e96b..b194f3204 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -51,8 +51,10 @@ 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.chassis.StickerInstance; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryPinionInstance; 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.mounted.CartAssemblerTileEntity; @@ -250,7 +252,7 @@ public class AllTileEntities { .tileEntity("gantry_pinion", GantryPinionTileEntity::new) .validBlocks(AllBlocks.GANTRY_PINION) .renderer(() -> GantryPinionRenderer::new) - .onRegister(ShaftInstance::register) + .onRegister(GantryPinionInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() @@ -405,6 +407,7 @@ public class AllTileEntities { .tileEntity("sticker", StickerTileEntity::new) .validBlocks(AllBlocks.STICKER) .renderer(() -> StickerRenderer::new) + .onRegister(StickerInstance::register) .register(); public static final TileEntityEntry DRILL = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index 69f53613c..861d51752 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -5,11 +5,8 @@ import java.util.function.Consumer; 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.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance; import net.minecraft.block.BlockState; import net.minecraft.util.Direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java index 46f8740f4..bb6585755 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticVertexAttributes.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; @@ -26,7 +27,7 @@ public enum KineticVertexAttributes implements IVertexAttrib { } @Override - public VertexAttribSpec attribSpec() { + public IAttribSpec attribSpec() { return spec; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java index 677b18190..e264731cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/RotatingVertexAttributes.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.base; import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; @@ -22,7 +23,7 @@ public enum RotatingVertexAttributes implements IVertexAttrib { } @Override - public VertexAttribSpec attribSpec() { + public IAttribSpec attribSpec() { return spec; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 65996958c..baa9d10f2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -28,7 +28,7 @@ public class SingleRotatingInstance extends KineticTileInstance model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); - model.setupInstance(data -> { + model.createInstance(data -> { Direction facing = state.get(DrillBlock.FACING); float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); float eulerY = facing.getHorizontalAngle(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 1dcdabde2..017fea6b9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -46,7 +46,7 @@ public class HarvesterRenderer extends SafeTileEntityRenderer model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); - model.setupInstance(data -> { + model.createInstance(data -> { Direction facing = state.get(HORIZONTAL_FACING); float originOffset = 1 / 16f; Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index c2fbf6d56..804dd22e6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -42,7 +42,7 @@ public class FanInstance extends KineticTileInstance { InstancedModel fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite()); - shaft = shaftHalf.setupInstance(data -> { + shaft = shaftHalf.createInstance(data -> { BlockPos behind = pos.offset(direction.getOpposite()); int blockLight = world.getLightLevel(LightType.BLOCK, behind); int skyLight = world.getLightLevel(LightType.SKY, behind); @@ -54,7 +54,7 @@ public class FanInstance extends KineticTileInstance { .setBlockLight(blockLight) .setSkyLight(skyLight); }); - fan = fanInner.setupInstance(data -> { + fan = fanInner.createInstance(data -> { BlockPos inFront = pos.offset(direction); int blockLight = world.getLightLevel(LightType.BLOCK, inFront); int skyLight = world.getLightLevel(LightType.SKY, inFront); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index f49c7dbef..2dcde88a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -40,7 +40,7 @@ public class FlyWheelInstance extends KineticTileInstance { Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); Consumer setup = setupFunc(tile.getSpeed(), axis); - shaft = shaftModel().setupInstance(setup); + shaft = shaftModel().createInstance(setup); // wheel = wheelModel().setupInstance(setup); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java new file mode 100644 index 000000000..60c9e199d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.chassis; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.TransformData; +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; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class StickerInstance extends TileEntityInstance implements ITickableInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, StickerInstance::new)); + } + + float lastOffset = Float.NaN; + + private InstanceKey head; + + public StickerInstance(InstancedTileRenderer modelManager, StickerTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + head = modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.STICKER_HEAD, lastState).createInstance(); + + updateLight(); + } + + @Override + public void tick() { + lastState = world.getBlockState(pos); + + float offset = tile.piston.getValue(AnimationTickHolder.getPartialTicks()); + + if (tile.getWorld() != Minecraft.getInstance().world) + offset = lastState.get(StickerBlock.EXTENDED) ? 1 : 0; + + if (Math.abs(offset - lastOffset) < 1e-4) + return; + + Direction facing = lastState.get(StickerBlock.FACING); + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .translate(getFloatingPos()) + .nudge(tile.hashCode()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing) + 90) + .unCentre() + .translate(0, (offset * offset) * 4 / 16f, 0); + + head.getInstance() + .setTransform(stack); + + lastOffset = offset; + } + + @Override + public void updateLight() { + head.getInstance() + .setBlockLight((byte) (world.getLightLevel(LightType.BLOCK, pos) << 4)) + .setSkyLight((byte) (world.getLightLevel(LightType.SKY, pos) << 4)); + } + + @Override + public void remove() { + head.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index e1b3e2741..91064b937 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.ch import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -24,6 +25,9 @@ public class StickerRenderer extends SafeTileEntityRenderer { @Override protected void renderSafe(StickerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (FastRenderDispatcher.available(te.getWorld())) return; + BlockState state = te.getBlockState(); SuperByteBuffer head = AllBlockPartials.STICKER_HEAD.renderOn(state); float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java index b79977b04..8d0886951 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -4,8 +4,10 @@ import java.util.List; import com.simibubi.create.AllBlocks; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueEntity; import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.LerpedFloat; @@ -21,7 +23,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.DistExecutor; -public class StickerTileEntity extends SmartTileEntity { +public class StickerTileEntity extends SmartTileEntity implements IInstanceRendered { LerpedFloat piston; boolean update; @@ -41,6 +43,7 @@ public class StickerTileEntity extends SmartTileEntity { if (!world.isRemote) return; piston.startWithValue(isBlockStateExtended() ? 1 : 0); + CreateClient.kineticRenderer.add(this); } public boolean isBlockStateExtended() { @@ -91,4 +94,8 @@ public class StickerTileEntity extends SmartTileEntity { 0.35F, attach ? 0.75F : 0.2f); } + @Override + public void onChunkLightUpdate() { + CreateClient.kineticRenderer.onLightUpdate(this); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionInstance.java new file mode 100644 index 000000000..adb7cc56f --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryPinionInstance.java @@ -0,0 +1,99 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.gantry; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.impl.TransformData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.Iterate; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class GantryPinionInstance extends ShaftInstance implements ITickableInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, GantryPinionInstance::new)); + } + + private InstanceKey gantryCogs; + + public GantryPinionInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + gantryCogs = modelManager.getMaterial(RenderMaterials.MODELS) + .getModel(AllBlockPartials.GANTRY_COGS, lastState) + .createInstance(); + + updateLight(); + } + + @Override + public void tick() { + lastState = world.getBlockState(pos); + Direction facing = lastState.get(GantryPinionBlock.FACING); + Boolean alongFirst = lastState.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE); + Direction.Axis rotationAxis = KineticTileEntityRenderer.getRotationAxisOf(tile); + BlockPos visualPos = facing.getAxisDirection() == Direction.AxisDirection.POSITIVE ? tile.getPos() + : tile.getPos() + .offset(facing.getOpposite()); + float angleForTe = GantryPinionRenderer.getAngleForTe(tile, visualPos, rotationAxis); + + Direction.Axis gantryAxis = Direction.Axis.X; + for (Direction.Axis axis : Iterate.axes) + if (axis != rotationAxis && axis != facing.getAxis()) + gantryAxis = axis; + + if (gantryAxis == Direction.Axis.Z) + if (facing == Direction.DOWN) + angleForTe *= -1; + if (gantryAxis == Direction.Axis.Y) + if (facing == Direction.NORTH || facing == Direction.EAST) + angleForTe *= -1; + + MatrixStack ms = new MatrixStack(); + MatrixStacker.of(ms) + .translate(getFloatingPos()) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90) + .rotateY(alongFirst ^ facing.getAxis() == Direction.Axis.Z ? 90 : 0) + .translate(0, -9 / 16f, 0) + .multiply(Vector3f.POSITIVE_X.getRadialQuaternion(-angleForTe)) + .translate(0, 9 / 16f, 0) + .unCentre(); + + gantryCogs.getInstance().setTransform(ms); + } + + @Override + public void updateLight() { + gantryCogs.getInstance() + .setBlockLight((byte) (world.getLightLevel(LightType.BLOCK, pos) << 4)) + .setSkyLight((byte) (world.getLightLevel(LightType.SKY, pos) << 4)); + } + + @Override + public void remove() { + super.remove(); + gantryCogs.delete(); + } +} 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/GantryPinionRenderer.java index eb5be4809..b92e2aa8b 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/GantryPinionRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Iterate; @@ -30,6 +31,9 @@ public class GantryPinionRenderer extends KineticTileEntityRenderer { protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + + if (FastRenderDispatcher.available(te.getWorld())) return; + BlockState state = te.getBlockState(); Direction facing = state.get(GantryPinionBlock.FACING); Boolean alongFirst = state.get(GantryPinionBlock.AXIS_ALONG_FIRST_COORDINATE); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index f5fe4a9b9..6cd01e76b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -6,19 +6,23 @@ import com.simibubi.create.content.contraptions.components.actors.RotatingActorM import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.impl.TransformedInstancedModel; import net.minecraft.util.math.BlockPos; public class ContraptionKineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_BELT, BeltInstancedModel::new)); - materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_ROTATING, RotatingInstancedModel::new)); - materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_FLAPS, FlapInstancedModel::new)); - materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.CONTRAPTION_ACTOR, RotatingActorModel::new)); + materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, TransformedInstancedModel::new)); + + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.C_BELT, BeltInstancedModel::new)); + materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.C_ROTATING, RotatingInstancedModel::new)); + materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.C_FLAPS, FlapInstancedModel::new)); + materials.put(KineticRenderMaterials.ACTORS, new RenderMaterial<>(this, AllProgramSpecs.C_ACTOR, RotatingActorModel::new)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java index 346c3e244..aeff61450 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionRenderDispatcher.java @@ -56,8 +56,6 @@ public class ContraptionRenderDispatcher { public static final Compartment> CONTRAPTION = new Compartment<>(); protected static PlacementSimulationWorld renderWorld; - private static boolean firstLayer = true; - public static void notifyLightUpdate(ILightReader world, LightType type, SectionPos pos) { for (RenderedContraption renderer : renderers.values()) { renderer.getLighter().lightVolume.notifyLightUpdate(world, type, pos); @@ -70,10 +68,6 @@ public class ContraptionRenderDispatcher { } } - public static void renderTick() { - firstLayer = true; - } - public static void renderTileEntities(World world, Contraption c, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffer) { PlacementSimulationWorld renderWorld = null; @@ -120,7 +114,7 @@ public class ContraptionRenderDispatcher { GL13.glActiveTexture(GL40.GL_TEXTURE4); // the shaders expect light volumes to be in texture 4 if (Backend.canUseVBOs()) { - ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.CONTRAPTION_STRUCTURE); + ContraptionProgram structureShader = Backend.getProgram(AllProgramSpecs.C_STRUCTURE); structureShader.bind(viewProjection, camX, camY, camZ, FastRenderDispatcher.getDebugMode()); for (RenderedContraption renderer : renderers.values()) { renderer.doRenderLayer(layer, structureShader); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java index 6bfbf8af7..53e9931f9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionVertexAttributes.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; @@ -26,7 +27,7 @@ public enum ContraptionVertexAttributes implements IVertexAttrib { } @Override - public VertexAttribSpec attribSpec() { + public IAttribSpec attribSpec() { return spec; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index c86f70336..23cdc0c55 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.List; import java.util.Random; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import org.apache.commons.lang3.tuple.MutablePair; import org.lwjgl.opengl.GL11; @@ -19,7 +20,6 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; -import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; import com.simibubi.create.foundation.utility.AnimationTickHolder; @@ -100,6 +100,8 @@ public class RenderedContraption { } public void beginFrame(double camX, double camY, double camZ) { + kinetics.beginFrame(camX, camY, camZ); + AbstractContraptionEntity entity = contraption.entity; float pt = AnimationTickHolder.getPartialTicks(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 7b8c7997a..3e28761c9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -74,7 +74,7 @@ public class BeltInstance extends KineticTileInstance { InstancedModel beltModel = beltPartial.renderOnBelt(modelManager, lastState); Consumer setupFunc = setupFunc(bottom, spriteShift); - keys.add(beltModel.setupInstance(setupFunc)); + keys.add(beltModel.createInstance(setupFunc)); if (diagonal) break; } @@ -82,7 +82,7 @@ public class BeltInstance extends KineticTileInstance { if (tile.hasPulley()) { InstancedModel pulleyModel = getPulleyModel(); - pulleyKey = pulleyModel.setupInstance(setupFunc(tile.getSpeed(), getRotationAxis())); + pulleyKey = pulleyModel.createInstance(setupFunc(tile.getSpeed(), getRotationAxis())); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java index ca2125848..678b29c73 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.contraptions.relays.belt; import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; @@ -25,7 +26,7 @@ public enum BeltVertexAttributes implements IVertexAttrib { } @Override - public VertexAttribSpec attribSpec() { + public IAttribSpec attribSpec() { return spec; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 1ac7476bb..f21f5d4ff 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -45,7 +45,7 @@ public class SplitShaftInstance extends KineticTileInstance { InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction); - InstanceKey key = shaft.setupInstance(data -> { + InstanceKey key = shaft.createInstance(data -> { data.setBlockLight(blockLight) .setSkyLight(skyLight) .setRotationalSpeed(getSpeed(direction)) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java b/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java index d32768a3f..6bf8a85d5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/FlapVertexAttributes.java @@ -1,6 +1,7 @@ package com.simibubi.create.content.logistics.block; import com.simibubi.create.foundation.render.backend.gl.attrib.CommonAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.IAttribSpec; import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; @@ -29,7 +30,7 @@ public enum FlapVertexAttributes implements IVertexAttrib { } @Override - public VertexAttribSpec attribSpec() { + public IAttribSpec attribSpec() { return spec; } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index afbfcc6a0..d2f6fa318 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -53,7 +53,7 @@ public class BeltTunnelInstance extends TileEntityInstance float intensity = segment == 3 ? 1.5f : segment + 1; float segmentOffset = -3 / 16f * segment; - flaps.add(model.setupInstance(flapData -> { + flaps.add(model.createInstance(flapData -> { flapData.setPosition(pos) .setSegmentOffset(segmentOffset, 0, 0) .setBlockLight(blockLight) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index b91a5b37f..cf5b54e6a 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -48,15 +48,15 @@ public class FunnelInstance extends TileEntityInstance impleme float intensity = segment == 3 ? 1.5f : segment + 1; float segmentOffset = -3 / 16f * segment; - flaps.add(model.setupInstance(flapData -> flapData.setPosition(pos) - .setSegmentOffset(segmentOffset, 0, -tile.getFlapOffset()) - .setBlockLight(blockLight) - .setSkyLight(skyLight) - .setHorizontalAngle(horizontalAngle) - .setFlapness(flapness) - .setFlapScale(-1) - .setPivotVoxelSpace(0, 10, 9.5f) - .setIntensity(intensity))); + flaps.add(model.createInstance(flapData -> flapData.setPosition(pos) + .setSegmentOffset(segmentOffset, 0, -tile.getFlapOffset()) + .setBlockLight(blockLight) + .setSkyLight(skyLight) + .setHorizontalAngle(horizontalAngle) + .setFlapness(flapness) + .setFlapScale(-1) + .setPivotVoxelSpace(0, 10, 9.5f) + .setIntensity(intensity))); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index d943724d0..a07a85727 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -11,6 +11,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.ren import com.simibubi.create.content.contraptions.relays.belt.BeltVertexAttributes; import com.simibubi.create.content.logistics.block.FlapVertexAttributes; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; +import com.simibubi.create.foundation.render.backend.gl.attrib.InstanceVertexAttributes; import com.simibubi.create.foundation.render.backend.gl.attrib.ModelVertexAttributes; import com.simibubi.create.foundation.render.backend.gl.shader.ProgramSpec; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderConstants; @@ -18,12 +19,19 @@ import com.simibubi.create.foundation.render.backend.gl.shader.ShaderConstants; import net.minecraft.util.ResourceLocation; public class AllProgramSpecs { + public static final ProgramSpec MODEL = register(ProgramSpec.builder("model", BasicProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(InstanceVertexAttributes.class) + .setVert(Locations.MODEL_VERT) + .setFrag(Locations.MODEL_FRAG) + .createProgramSpec()); + public static final ProgramSpec ROTATING = register(ProgramSpec.builder("rotating", BasicProgram::new) .addAttributes(ModelVertexAttributes.class) .addAttributes(KineticVertexAttributes.class) .addAttributes(RotatingVertexAttributes.class) .setVert(Locations.ROTATING) - .setFrag(Locations.INSTANCED) + .setFrag(Locations.MODEL_FRAG) .createProgramSpec()); public static final ProgramSpec BELT = register(ProgramSpec.builder("belt", BasicProgram::new) @@ -31,58 +39,65 @@ public class AllProgramSpecs { .addAttributes(KineticVertexAttributes.class) .addAttributes(BeltVertexAttributes.class) .setVert(Locations.BELT) - .setFrag(Locations.INSTANCED) + .setFrag(Locations.MODEL_FRAG) .createProgramSpec()); public static final ProgramSpec FLAPS = register(ProgramSpec.builder("flap", BasicProgram::new) .addAttributes(ModelVertexAttributes.class) .addAttributes(FlapVertexAttributes.class) .setVert(Locations.FLAP) - .setFrag(Locations.INSTANCED) + .setFrag(Locations.MODEL_FRAG) .createProgramSpec()); + public static final ProgramSpec C_STRUCTURE = register(ProgramSpec.builder("contraption_structure", ContraptionProgram::new) + .addAttributes(ContraptionVertexAttributes.class) + .setVert(Locations.CONTRAPTION_STRUCTURE) + .setFrag(Locations.CONTRAPTION) + .createProgramSpec()); + public static final ProgramSpec C_MODEL = register(ProgramSpec.builder("contraption_model", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(InstanceVertexAttributes.class) + .setVert(Locations.MODEL_VERT) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + public static final ProgramSpec C_ROTATING = register(ProgramSpec.builder("contraption_rotating", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(KineticVertexAttributes.class) + .addAttributes(RotatingVertexAttributes.class) + .setVert(Locations.ROTATING) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + public static final ProgramSpec C_BELT = register(ProgramSpec.builder("contraption_belt", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(KineticVertexAttributes.class) + .addAttributes(BeltVertexAttributes.class) + .setVert(Locations.BELT) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + public static final ProgramSpec C_FLAPS = register(ProgramSpec.builder("contraption_flap", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(FlapVertexAttributes.class) + .setVert(Locations.FLAP) + .setFrag(Locations.CONTRAPTION) + .setDefines(ShaderConstants.define("CONTRAPTION")) + .createProgramSpec()); + public static final ProgramSpec C_ACTOR = register(ProgramSpec.builder("contraption_actor", ContraptionProgram::new) + .addAttributes(ModelVertexAttributes.class) + .addAttributes(ActorVertexAttributes.class) + .setVert(Locations.CONTRAPTION_ACTOR) + .setFrag(Locations.CONTRAPTION) + .createProgramSpec()); - public static final ProgramSpec CONTRAPTION_STRUCTURE = register(ProgramSpec.builder("contraption_structure", ContraptionProgram::new) - .addAttributes(ContraptionVertexAttributes.class) - .setVert(Locations.CONTRAPTION_STRUCTURE) - .setFrag(Locations.CONTRAPTION) - .createProgramSpec()); + public static class Contraption { - public static final ProgramSpec CONTRAPTION_ROTATING = register(ProgramSpec.builder("contraption_rotating", ContraptionProgram::new) - .addAttributes(ModelVertexAttributes.class) - .addAttributes(KineticVertexAttributes.class) - .addAttributes(RotatingVertexAttributes.class) - .setVert(Locations.ROTATING) - .setFrag(Locations.CONTRAPTION) - .setDefines(ShaderConstants.define("CONTRAPTION")) - .createProgramSpec()); - - public static final ProgramSpec CONTRAPTION_BELT = register(ProgramSpec.builder("contraption_belt", ContraptionProgram::new) - .addAttributes(ModelVertexAttributes.class) - .addAttributes(KineticVertexAttributes.class) - .addAttributes(BeltVertexAttributes.class) - .setVert(Locations.BELT) - .setFrag(Locations.CONTRAPTION) - .setDefines(ShaderConstants.define("CONTRAPTION")) - .createProgramSpec()); - - public static final ProgramSpec CONTRAPTION_FLAPS = register(ProgramSpec.builder("contraption_flap", ContraptionProgram::new) - .addAttributes(ModelVertexAttributes.class) - .addAttributes(FlapVertexAttributes.class) - .setVert(Locations.FLAP) - .setFrag(Locations.CONTRAPTION) - .setDefines(ShaderConstants.define("CONTRAPTION")) - .createProgramSpec()); - - public static final ProgramSpec CONTRAPTION_ACTOR = register(ProgramSpec.builder("contraption_actor", ContraptionProgram::new) - .addAttributes(ModelVertexAttributes.class) - .addAttributes(ActorVertexAttributes.class) - .setVert(Locations.CONTRAPTION_ACTOR) - .setFrag(Locations.CONTRAPTION) - .createProgramSpec()); + } public static class Locations { - public static final ResourceLocation INSTANCED = loc("instanced.frag"); + public static final ResourceLocation MODEL_FRAG = loc("model.frag"); + public static final ResourceLocation MODEL_VERT = loc("model.vert"); public static final ResourceLocation CONTRAPTION = loc("contraption.frag"); public static final ResourceLocation ROTATING = loc("rotating.vert"); diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index 68cb7367e..7446f86ff 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -6,11 +6,13 @@ import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.logistics.block.FlapInstancedModel; +import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.impl.TransformedInstancedModel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; @@ -25,6 +27,8 @@ public class KineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { + materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.MODEL, TransformedInstancedModel::new)); + materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.BELT, BeltInstancedModel::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.ROTATING, RotatingInstancedModel::new)); materials.put(KineticRenderMaterials.FLAPS, new RenderMaterial<>(this, AllProgramSpecs.FLAPS, FlapInstancedModel::new)); diff --git a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java b/src/main/java/com/simibubi/create/foundation/render/RenderMath.java deleted file mode 100644 index 3839ff718..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/RenderMath.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.simibubi.create.foundation.render; - -public class RenderMath { - public static int nextPowerOf2(int a) { - int h = Integer.highestOneBit(a); - return (h == a) ? h : (h << 1); - } - - public static boolean isPowerOf2(int n) { - int b = n & (n - 1); - return b == 0 && n != 0; - } -} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index f495f3054..159122f24 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -31,7 +31,7 @@ import net.minecraftforge.resource.ISelectiveResourceReloadListener; import net.minecraftforge.resource.VanillaResourceType; public class Backend { - public static final Boolean SHADER_DEBUG_OUTPUT = false; + public static final Boolean SHADER_DEBUG_OUTPUT = true; public static final Logger log = LogManager.getLogger(Backend.class); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java new file mode 100644 index 000000000..7cc06e520 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java @@ -0,0 +1,10 @@ +package com.simibubi.create.foundation.render.backend; + +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; +import com.simibubi.create.foundation.render.backend.instancing.MaterialType; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.impl.TransformData; + +public class RenderMaterials { + public static final MaterialType> MODELS = new MaterialType<>(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java new file mode 100644 index 000000000..b0de2dea6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderUtil.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.render.backend; + +import net.minecraft.client.renderer.Matrix3f; +import net.minecraft.client.renderer.Matrix4f; + +import java.nio.ByteBuffer; +import java.nio.FloatBuffer; + +public class RenderUtil { + public static int nextPowerOf2(int a) { + int h = Integer.highestOneBit(a); + return (h == a) ? h : (h << 1); + } + + public static boolean isPowerOf2(int n) { + int b = n & (n - 1); + return b == 0 && n != 0; + } + + // GPUs want matrices in column major order. + + public static void writeMat3(ByteBuffer buf, Matrix3f mat) { + buf.putFloat(mat.a00); + buf.putFloat(mat.a10); + buf.putFloat(mat.a20); + buf.putFloat(mat.a01); + buf.putFloat(mat.a11); + buf.putFloat(mat.a21); + buf.putFloat(mat.a02); + buf.putFloat(mat.a12); + buf.putFloat(mat.a22); + } + + public static void writeMat4(ByteBuffer buf, Matrix4f mat) { + buf.putFloat(mat.a00); + buf.putFloat(mat.a10); + buf.putFloat(mat.a20); + buf.putFloat(mat.a30); + buf.putFloat(mat.a01); + buf.putFloat(mat.a11); + buf.putFloat(mat.a21); + buf.putFloat(mat.a31); + buf.putFloat(mat.a02); + buf.putFloat(mat.a12); + buf.putFloat(mat.a22); + buf.putFloat(mat.a32); + buf.putFloat(mat.a03); + buf.putFloat(mat.a13); + buf.putFloat(mat.a23); + buf.putFloat(mat.a33); + + + + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java index d3fd9d48e..f6daa58c6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java @@ -4,7 +4,6 @@ import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; public class CommonAttributes { - public static final VertexAttribSpec MAT4 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 16); public static final VertexAttribSpec VEC4 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); public static final VertexAttribSpec VEC3 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 3); public static final VertexAttribSpec VEC2 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java new file mode 100644 index 000000000..f16d1deb1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IAttribSpec.java @@ -0,0 +1,12 @@ +package com.simibubi.create.foundation.render.backend.gl.attrib; + +import org.lwjgl.opengl.GL20; + +public interface IAttribSpec { + + void vertexAttribPointer(int stride, int index, int pointer); + + int getSize(); + + int getAttributeCount(); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java index 5c77620f9..ee122db00 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/IVertexAttrib.java @@ -4,7 +4,7 @@ public interface IVertexAttrib { String attribName(); - VertexAttribSpec attribSpec(); + IAttribSpec attribSpec(); int getDivisor(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java new file mode 100644 index 000000000..cf1702532 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java @@ -0,0 +1,36 @@ +package com.simibubi.create.foundation.render.backend.gl.attrib; + +public enum InstanceVertexAttributes implements IVertexAttrib { + TRANSFORM("aTransform", MatrixAttributes.MAT4), + NORMAL_MAT("aNormalMat", MatrixAttributes.MAT3), + LIGHT("aLight", CommonAttributes.LIGHT), + ; + + private final String name; + private final IAttribSpec spec; + + InstanceVertexAttributes(String name, IAttribSpec spec) { + this.name = name; + this.spec = spec; + } + + @Override + public String attribName() { + return name; + } + + @Override + public IAttribSpec attribSpec() { + return spec; + } + + @Override + public int getDivisor() { + return 0; + } + + @Override + public int getBufferIndex() { + return 0; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java new file mode 100644 index 000000000..f7eb4d85f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/MatrixAttributes.java @@ -0,0 +1,36 @@ +package com.simibubi.create.foundation.render.backend.gl.attrib; + +import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; +import org.lwjgl.opengl.GL20; + +public enum MatrixAttributes implements IAttribSpec { + MAT3(3, 3), + MAT4(4, 4), + ; + + private final int rows; + private final int cols; + + MatrixAttributes(int rows, int cols) { + this.rows = rows; + this.cols = cols; + } + + @Override + public void vertexAttribPointer(int stride, int index, int pointer) { + for (int i = 0; i < rows; i++) { + long attribPointer = pointer + (long) i * cols * GlPrimitiveType.FLOAT.getSize(); + GL20.glVertexAttribPointer(index + i, cols, GlPrimitiveType.FLOAT.getGlConstant(), false, stride, attribPointer); + } + } + + @Override + public int getSize() { + return GlPrimitiveType.FLOAT.getSize() * rows * cols; + } + + @Override + public int getAttributeCount() { + return rows; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java index 960289fd6..5fec24349 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/ModelVertexAttributes.java @@ -20,7 +20,7 @@ public enum ModelVertexAttributes implements IVertexAttrib { } @Override - public VertexAttribSpec attribSpec() { + public IAttribSpec attribSpec() { return spec; } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java index 1af7dc3a6..82cdac6fc 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexAttribSpec.java @@ -4,7 +4,7 @@ import org.lwjgl.opengl.GL20; import com.simibubi.create.foundation.render.backend.gl.GlPrimitiveType; -public class VertexAttribSpec { +public class VertexAttribSpec implements IAttribSpec { private final GlPrimitiveType type; private final int count; @@ -24,14 +24,17 @@ public class VertexAttribSpec { this.normalized = normalized; } + @Override public void vertexAttribPointer(int stride, int index, int pointer) { GL20.glVertexAttribPointer(index, count, type.getGlConstant(), normalized, stride, pointer); } + @Override public int getSize() { return size; } + @Override public int getAttributeCount() { return attributeCount; } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java index 3929e3354..4541a9205 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/VertexFormat.java @@ -15,7 +15,7 @@ public class VertexFormat { int numAttributes = 0, stride = 0; for (IVertexAttrib attrib : allAttributes) { - VertexAttribSpec spec = attrib.attribSpec(); + IAttribSpec spec = attrib.attribSpec(); numAttributes += spec.getAttributeCount(); stride += spec.getSize(); } @@ -34,7 +34,7 @@ public class VertexFormat { public void vertexAttribPointers(int index) { int offset = 0; for (IVertexAttrib attrib : this.allAttributes) { - VertexAttribSpec spec = attrib.attribSpec(); + IAttribSpec spec = attrib.attribSpec(); spec.vertexAttribPointer(stride, index, offset); index += spec.getAttributeCount(); offset += spec.getSize(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java index 166bf8e56..e25440f75 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java @@ -25,6 +25,10 @@ public class InstanceKey { model.modifyInstance(this, edit); } + public D getInstance() { + return model.getInstance(this); + } + public void delete() { model.deleteInstance(this); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index 2a0255eab..ab1b292a7 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -6,11 +6,11 @@ import java.util.*; import java.util.function.Consumer; import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.RenderUtil; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL20; -import com.simibubi.create.foundation.render.RenderMath; import com.simibubi.create.foundation.render.backend.BufferedModel; import com.simibubi.create.foundation.render.backend.gl.GlBuffer; import com.simibubi.create.foundation.render.backend.gl.GlVertexArray; @@ -95,7 +95,19 @@ public abstract class InstancedModel extends BufferedMod markIndexChanged(key.index); } - public synchronized InstanceKey setupInstance(Consumer setup) { + public synchronized InstanceKey createInstance() { + D instanceData = newInstance(); + + InstanceKey key = new InstanceKey<>(this, data.size()); + data.add(instanceData); + keys.add(key); + + markIndexChanged(key.index); + + return key; + } + + public synchronized InstanceKey createInstance(Consumer setup) { D instanceData = newInstance(); setup.accept(instanceData); @@ -124,7 +136,7 @@ public abstract class InstancedModel extends BufferedMod int stride = instanceFormat.getStride(); int newInstanceCount = instanceCount(); - int instanceSize = RenderMath.nextPowerOf2((newInstanceCount + 1) * stride); + int instanceSize = RenderUtil.nextPowerOf2((newInstanceCount + 1) * stride); instanceVBO.with(vbo -> { // this probably changes enough that it's not worth reallocating the entire buffer every time. diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index 8683832da..32537476e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -53,4 +53,8 @@ public abstract class TileEntityInstance { * Call {@link InstanceKey#delete()} on all acquired keys. */ public abstract void remove(); + + public BlockPos getFloatingPos() { + return pos.subtract(modelManager.getOriginCoordinate()); + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java new file mode 100644 index 000000000..115463df7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.render.backend.instancing.impl; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.backend.RenderUtil; +import com.simibubi.create.foundation.render.backend.instancing.InstanceData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.Matrix3f; +import net.minecraft.client.renderer.Matrix4f; + +import java.nio.ByteBuffer; + +public class TransformData extends InstanceData { + + private Matrix4f modelMat; + private Matrix3f normalMat; + + private byte blockLight; + private byte skyLight; + + public TransformData(InstancedModel owner) { + super(owner); + } + + public TransformData setModelMat(Matrix4f modelMat) { + this.modelMat = modelMat; + return this; + } + + public TransformData setNormalMat(Matrix3f normalMat) { + this.normalMat = normalMat; + return this; + } + + public TransformData setTransform(MatrixStack stack) { + this.modelMat = stack.peek().getModel(); + this.normalMat = stack.peek().getNormal(); + return this; + } + + public TransformData setBlockLight(byte blockLight) { + this.blockLight = blockLight; + return this; + } + + public TransformData setSkyLight(byte skyLight) { + this.skyLight = skyLight; + return this; + } + + @Override + public void write(ByteBuffer buf) { + RenderUtil.writeMat4(buf, modelMat); + RenderUtil.writeMat3(buf, normalMat); + buf.put(new byte[] { blockLight, skyLight }); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java new file mode 100644 index 000000000..2335a386f --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java @@ -0,0 +1,25 @@ +package com.simibubi.create.foundation.render.backend.instancing.impl; + +import com.simibubi.create.foundation.render.backend.gl.attrib.InstanceVertexAttributes; +import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import net.minecraft.client.renderer.BufferBuilder; + +public class TransformedInstancedModel extends InstancedModel { + public static final VertexFormat INSTANCE_FORMAT = VertexFormat.builder().addAttributes(InstanceVertexAttributes.class).build(); + + public TransformedInstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + super(renderer, buf); + } + + @Override + protected TransformData newInstance() { + return new TransformData(this); + } + + @Override + protected VertexFormat getInstanceFormat() { + return INSTANCE_FORMAT; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java index e25fe1924..f711ab41f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java @@ -1,8 +1,8 @@ package com.simibubi.create.foundation.render.backend.light; -import static com.simibubi.create.foundation.render.RenderMath.isPowerOf2; +import static com.simibubi.create.foundation.render.backend.RenderUtil.isPowerOf2; -import com.simibubi.create.foundation.render.RenderMath; +import com.simibubi.create.foundation.render.backend.RenderUtil; import net.minecraft.util.Direction; import net.minecraft.util.math.AxisAlignedBB; @@ -142,9 +142,9 @@ public class GridAlignedBB { int sizeY = sizeY(); int sizeZ = sizeZ(); - int newSizeX = RenderMath.nextPowerOf2(sizeX); - int newSizeY = RenderMath.nextPowerOf2(sizeY); - int newSizeZ = RenderMath.nextPowerOf2(sizeZ); + int newSizeX = RenderUtil.nextPowerOf2(sizeX); + int newSizeY = RenderUtil.nextPowerOf2(sizeY); + int newSizeZ = RenderUtil.nextPowerOf2(sizeZ); int diffX = newSizeX - sizeX; int diffY = newSizeY - sizeY; @@ -162,9 +162,9 @@ public class GridAlignedBB { * Grow this bounding box to have power of 2 side lengths, scaling from the minimum coords. */ public void nextPowerOf2() { - int sizeX = RenderMath.nextPowerOf2(sizeX()); - int sizeY = RenderMath.nextPowerOf2(sizeY()); - int sizeZ = RenderMath.nextPowerOf2(sizeZ()); + int sizeX = RenderUtil.nextPowerOf2(sizeX()); + int sizeY = RenderUtil.nextPowerOf2(sizeY()); + int sizeZ = RenderUtil.nextPowerOf2(sizeZ()); this.maxX = this.minX + sizeX; this.maxY = this.minY + sizeY; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 17a263235..80912c491 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -46,4 +46,31 @@ public net.minecraft.client.renderer.GameRenderer func_215311_a(Lnet/minecraft/c # IResizeCallback public net.minecraft.util.palette.IResizeCallback -public net.minecraft.entity.Entity func_205011_p()V # updateAquatics \ No newline at end of file +public net.minecraft.entity.Entity func_205011_p()V # updateAquatics + +public net.minecraft.client.renderer.Matrix3f field_226097_a_ #a00 +public net.minecraft.client.renderer.Matrix3f field_226098_b_ #a01 +public net.minecraft.client.renderer.Matrix3f field_226099_c_ #a02 +public net.minecraft.client.renderer.Matrix3f field_226100_d_ #a10 +public net.minecraft.client.renderer.Matrix3f field_226101_e_ #a11 +public net.minecraft.client.renderer.Matrix3f field_226102_f_ #a12 +public net.minecraft.client.renderer.Matrix3f field_226103_g_ #a20 +public net.minecraft.client.renderer.Matrix3f field_226104_h_ #a21 +public net.minecraft.client.renderer.Matrix3f field_226105_i_ #a22 + +public net.minecraft.client.renderer.Matrix4f field_226575_a_ #a00 +public net.minecraft.client.renderer.Matrix4f field_226576_b_ #a01 +public net.minecraft.client.renderer.Matrix4f field_226577_c_ #a02 +public net.minecraft.client.renderer.Matrix4f field_226578_d_ #a03 +public net.minecraft.client.renderer.Matrix4f field_226579_e_ #a10 +public net.minecraft.client.renderer.Matrix4f field_226580_f_ #a11 +public net.minecraft.client.renderer.Matrix4f field_226581_g_ #a12 +public net.minecraft.client.renderer.Matrix4f field_226582_h_ #a13 +public net.minecraft.client.renderer.Matrix4f field_226583_i_ #a20 +public net.minecraft.client.renderer.Matrix4f field_226584_j_ #a21 +public net.minecraft.client.renderer.Matrix4f field_226585_k_ #a22 +public net.minecraft.client.renderer.Matrix4f field_226586_l_ #a23 +public net.minecraft.client.renderer.Matrix4f field_226587_m_ #a30 +public net.minecraft.client.renderer.Matrix4f field_226588_n_ #a31 +public net.minecraft.client.renderer.Matrix4f field_226589_o_ #a32 +public net.minecraft.client.renderer.Matrix4f field_226590_p_ #a33 \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/instanced.frag b/src/main/resources/assets/create/shader/model.frag similarity index 100% rename from src/main/resources/assets/create/shader/instanced.frag rename to src/main/resources/assets/create/shader/model.frag diff --git a/src/main/resources/assets/create/shader/model.vert b/src/main/resources/assets/create/shader/model.vert new file mode 100644 index 000000000..916cc7bcb --- /dev/null +++ b/src/main/resources/assets/create/shader/model.vert @@ -0,0 +1,76 @@ +#version 110 + +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; + +attribute mat4 aTransform; +attribute mat3 aNormalMat; +attribute vec2 aLight; + +varying vec2 TexCoords; +varying vec4 Color; +varying float Diffuse; +varying vec2 Light; + +#if defined(CONTRAPTION) +varying vec3 BoxCoord; + +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; +#endif + +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; + +uniform vec3 uCameraPos; + +#if defined(USE_FOG) +varying float FragDistance; +#endif + +mat3 modelToNormal(mat4 mat) { + // Discard the edges. This won't be accurate for scaled or skewed matrices, + // but we don't have to work with those often. + mat3 m; + m[0] = mat[0].xyz; + m[1] = mat[1].xyz; + m[2] = mat[2].xyz; + return m; +} + +float diffuse(vec3 normal) { + float x = normal.x; + float y = normal.y; + float z = normal.z; + return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); +} + +void main() { + vec4 worldPos = aTransform * vec4(aPos, 1.); + + mat3 normalMat = aNormalMat; + +#ifdef CONTRAPTION + worldPos = uModel * worldPos; + normalMat *= modelToNormal(uModel); + + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + #if defined(USE_FOG) + FragDistance = length(worldPos.xyz); + #endif +#elif defined(USE_FOG) + FragDistance = length(worldPos.xyz - uCameraPos); +#endif + + vec3 norm = normalize(normalMat * aNormal); + + Diffuse = diffuse(norm); + TexCoords = aTexCoords; + Light = aLight; + gl_Position = uViewProjection * worldPos; + + Color = vec4(1.); +} \ No newline at end of file From 8ce0f47f01ac5c7cdf83997cffa1a8d409c5a464 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Mar 2021 02:02:47 -0800 Subject: [PATCH 067/124] No more 7 circles of callbacks. - Instead of using consumers to edit instance data, just give the user a pointer to the data. - Easier to use, more predictable access. --- .../base/KineticTileInstance.java | 39 +++++----- .../base/SingleRotatingInstance.java | 4 +- .../components/actors/DrillInstance.java | 24 +++--- .../components/actors/HarvesterRenderer.java | 21 +++-- .../components/fan/FanInstance.java | 77 ++++++++----------- .../components/flywheel/FlyWheelInstance.java | 6 +- .../relays/belt/BeltInstance.java | 48 ++++++------ .../relays/encased/SplitShaftInstance.java | 19 ++--- .../relays/gearbox/GearboxInstance.java | 38 +++++---- .../belts/tunnel/BeltTunnelInstance.java | 31 ++++---- .../block/funnel/FunnelInstance.java | 30 +++++--- .../backend/instancing/InstanceKey.java | 4 - .../backend/instancing/InstancedModel.java | 23 ------ 13 files changed, 164 insertions(+), 200 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index 861d51752..71cdb735d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.contraptions.base; -import java.util.function.Consumer; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; @@ -19,28 +17,29 @@ public abstract class KineticTileInstance extends T } protected final void updateRotation(InstanceKey key, Direction.Axis axis) { - key.modifyInstance(data -> { - data.setColor(tile.network) - .setRotationalSpeed(tile.getSpeed()) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(axis); - }); + key.getInstance() + .setColor(tile.network) + .setRotationalSpeed(tile.getSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(axis); } - protected final Consumer setupFunc(float speed, Direction.Axis axis) { - return data -> { - data.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)) - .setTileEntity(tile) - .setRotationalSpeed(speed) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(axis); - }; + protected final InstanceKey setup(InstanceKey key, float speed, Direction.Axis axis) { + key.getInstance() + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)) + .setTileEntity(tile) + .setRotationalSpeed(speed) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(axis); + + return key; } - protected final void relight(KineticData data) { - data.setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + protected final void relight(InstanceKey> key) { + key.getInstance() + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)); } protected float getRotationOffset(final Direction.Axis axis) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index baa9d10f2..10f342f0a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -28,7 +28,7 @@ public class SingleRotatingInstance extends KineticTileInstance model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); - model.createInstance(data -> { - Direction facing = state.get(DrillBlock.FACING); - float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); - float eulerY = facing.getHorizontalAngle(); - data.setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationAxis(0, 0, 1) - .setLocalRotation(eulerX, eulerY, 0); - }); + Direction facing = state.get(DrillBlock.FACING); + float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerY = facing.getHorizontalAngle(); + model.getInstance(model.createInstance()) + .setPosition(context.localPos) + .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) + .setRotationOffset(0) + .setRotationAxis(0, 0, 1) + .setLocalRotation(eulerX, eulerY, 0); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index 017fea6b9..d3455237d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -46,17 +46,16 @@ public class HarvesterRenderer extends SafeTileEntityRenderer model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); - model.createInstance(data -> { - Direction facing = state.get(HORIZONTAL_FACING); - float originOffset = 1 / 16f; - Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); - data.setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationCenter(rotOffset) - .setRotationAxis(-1, 0, 0) - .setLocalRotation(0, facing.getHorizontalAngle(), 0); - }); + Direction facing = state.get(HORIZONTAL_FACING); + float originOffset = 1 / 16f; + Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); + model.getInstance(model.createInstance()) + .setPosition(context.localPos) + .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) + .setRotationOffset(0) + .setRotationCenter(rotOffset) + .setRotationAxis(-1, 0, 0) + .setLocalRotation(0, facing.getHorizontalAngle(), 0); } public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 804dd22e6..5e2aa0f7c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -28,7 +28,7 @@ public class FanInstance extends KineticTileInstance { protected InstanceKey shaft; protected InstanceKey fan; - public FanInstance(InstancedTileRenderer modelManager, EncasedFanTileEntity tile) { + public FanInstance(InstancedTileRenderer modelManager, EncasedFanTileEntity tile) { super(modelManager, tile); } @@ -42,30 +42,22 @@ public class FanInstance extends KineticTileInstance { InstancedModel fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouthRotating(modelManager, lastState, direction.getOpposite()); - shaft = shaftHalf.createInstance(data -> { - BlockPos behind = pos.offset(direction.getOpposite()); - int blockLight = world.getLightLevel(LightType.BLOCK, behind); - int skyLight = world.getLightLevel(LightType.SKY, behind); + shaft = shaftHalf.createInstance(); + shaft.getInstance() + .setRotationalSpeed(tile.getSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(tile); - data.setRotationalSpeed(tile.getSpeed()) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(tile) - .setBlockLight(blockLight) - .setSkyLight(skyLight); - }); - fan = fanInner.createInstance(data -> { - BlockPos inFront = pos.offset(direction); - int blockLight = world.getLightLevel(LightType.BLOCK, inFront); - int skyLight = world.getLightLevel(LightType.SKY, inFront); - data.setRotationalSpeed(getFanSpeed()) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(tile) - .setBlockLight(blockLight) - .setSkyLight(skyLight); - }); + fan = fanInner.createInstance(); + fan.getInstance() + .setRotationalSpeed(getFanSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(tile); + + updateLight(); } private float getFanSpeed() { @@ -82,32 +74,31 @@ public class FanInstance extends KineticTileInstance { Direction.Axis axis = lastState.get(FACING).getAxis(); updateRotation(shaft, axis); - fan.modifyInstance(data -> { - data.setColor(tile.network) - .setRotationalSpeed(getFanSpeed()) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); - }); + fan.getInstance() + .setColor(tile.network) + .setRotationalSpeed(getFanSpeed()) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); } @Override public void updateLight() { final Direction direction = lastState.get(FACING); - shaft.modifyInstance(data -> { - BlockPos behind = pos.offset(direction.getOpposite()); - int blockLight = world.getLightLevel(LightType.BLOCK, behind); - int skyLight = world.getLightLevel(LightType.SKY, behind); - data.setBlockLight(blockLight) - .setSkyLight(skyLight); - }); - fan.modifyInstance(data -> { - BlockPos inFront = pos.offset(direction); - int blockLight = world.getLightLevel(LightType.BLOCK, inFront); - int skyLight = world.getLightLevel(LightType.SKY, inFront); - data.setBlockLight(blockLight) - .setSkyLight(skyLight); - }); + BlockPos behind = pos.offset(direction.getOpposite()); + putLight(shaft, behind); + + BlockPos inFront = pos.offset(direction); + putLight(fan, inFront); + } + + private void putLight(InstanceKey key, BlockPos pos) { + int blockLight = world.getLightLevel(LightType.BLOCK, pos); + int skyLight = world.getLightLevel(LightType.SKY, pos); + + key.getInstance() + .setBlockLight(blockLight) + .setSkyLight(skyLight); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index 2dcde88a6..e81756d8f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -39,8 +39,7 @@ public class FlyWheelInstance extends KineticTileInstance { facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING); Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); - Consumer setup = setupFunc(tile.getSpeed(), axis); - shaft = shaftModel().createInstance(setup); + shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis); // wheel = wheelModel().setupInstance(setup); } @@ -53,14 +52,13 @@ public class FlyWheelInstance extends KineticTileInstance { @Override public void updateLight() { - shaft.modifyInstance(this::relight); + relight(shaft); // wheel.modifyInstance(this::relight); } @Override public void remove() { shaft.delete(); - shaft = null; // wheel.delete(); // wheel = null; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 3e28761c9..50b15124a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -72,9 +72,8 @@ public class BeltInstance extends KineticTileInstance { SpriteShiftEntry spriteShift = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); InstancedModel beltModel = beltPartial.renderOnBelt(modelManager, lastState); - Consumer setupFunc = setupFunc(bottom, spriteShift); - keys.add(beltModel.createInstance(setupFunc)); + keys.add(setup(beltModel.createInstance(), bottom, spriteShift)); if (diagonal) break; } @@ -82,7 +81,7 @@ public class BeltInstance extends KineticTileInstance { if (tile.hasPulley()) { InstancedModel pulleyModel = getPulleyModel(); - pulleyKey = pulleyModel.createInstance(setupFunc(tile.getSpeed(), getRotationAxis())); + pulleyKey = setup(pulleyModel.createInstance(), tile.getSpeed(), getRotationAxis()); } } @@ -94,9 +93,10 @@ public class BeltInstance extends KineticTileInstance { for (InstanceKey key : keys) { SpriteShiftEntry spriteShiftEntry = BeltRenderer.getSpriteShiftEntry(color, diagonal, bottom); - key.modifyInstance(data -> data.setScrollTexture(spriteShiftEntry) - .setColor(tile.network) - .setRotationalSpeed(getScrollSpeed())); + key.getInstance() + .setScrollTexture(spriteShiftEntry) + .setColor(tile.network) + .setRotationalSpeed(getScrollSpeed()); bottom = false; } @@ -107,11 +107,9 @@ public class BeltInstance extends KineticTileInstance { @Override public void updateLight() { - for (InstanceKey key : keys) { - key.modifyInstance(this::relight); - } + keys.forEach(this::relight); - if (pulleyKey != null) pulleyKey.modifyInstance(this::relight); + if (pulleyKey != null) relight(pulleyKey); } @Override @@ -165,22 +163,22 @@ public class BeltInstance extends KineticTileInstance { return dir; } - private Consumer setupFunc(boolean bottom, SpriteShiftEntry spriteShift) { - return data -> { - float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (beltSlope == BeltSlope.DOWNWARD ? 180 : 0); - float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); - float rotZ = sideways ? 90 : ((vertical && facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ? 180 : 0); + private InstanceKey setup(InstanceKey key, boolean bottom, SpriteShiftEntry spriteShift) { + float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (beltSlope == BeltSlope.DOWNWARD ? 180 : 0); + float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); + float rotZ = sideways ? 90 : ((vertical && facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ? 180 : 0); - BlockPos pos = tile.getPos(); - data.setTileEntity(tile) - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)) - .setRotation(rotX, rotY, rotZ) - .setRotationalSpeed(getScrollSpeed()) - .setRotationOffset(bottom ? 0.5f : 0f) - .setScrollTexture(spriteShift) - .setScrollMult(diagonal ? 3f / 8f : 0.5f); - }; + key.getInstance() + .setTileEntity(tile) + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)) + .setRotation(rotX, rotY, rotZ) + .setRotationalSpeed(getScrollSpeed()) + .setRotationOffset(bottom ? 0.5f : 0f) + .setScrollTexture(spriteShift) + .setScrollMult(diagonal ? 3f / 8f : 0.5f); + + return key; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index f21f5d4ff..c61315fd1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -45,7 +45,7 @@ public class SplitShaftInstance extends KineticTileInstance key : keys) { - key.modifyInstance(this::relight); - } + keys.forEach(this::relight); } @Override @@ -75,13 +73,12 @@ public class SplitShaftInstance extends KineticTileInstance key, Direction dir) { - key.modifyInstance(data -> { - Direction.Axis axis = dir.getAxis(); + Direction.Axis axis = dir.getAxis(); - data.setColor(tile.network) - .setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); - }); + key.getInstance() + .setColor(tile.network) + .setRotationalSpeed(tile.getSpeed() * tile.getRotationSpeedModifier(dir)) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 3ee63c088..9ef1a4326 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -50,14 +50,16 @@ public class GearboxInstance extends KineticTileInstance { InstancedModel shaft = AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, direction); - InstanceKey key = shaft.createInstance(data -> { - data.setBlockLight(blockLight) - .setSkyLight(skyLight) - .setRotationalSpeed(getSpeed(direction)) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) - .setTileEntity(tile); - }); + InstanceKey key = shaft.createInstance(); + + key.getInstance() + .setBlockLight(blockLight) + .setSkyLight(skyLight) + .setRotationalSpeed(getSpeed(direction)) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()) + .setTileEntity(tile); + keys.put(direction, key); } } @@ -87,15 +89,15 @@ public class GearboxInstance extends KineticTileInstance { public void onUpdate() { updateSourceFacing(); for (Map.Entry> key : keys.entrySet()) { - key.getValue().modifyInstance(data -> { - Direction direction = key.getKey(); - Direction.Axis axis = direction.getAxis(); + Direction direction = key.getKey(); + Direction.Axis axis = direction.getAxis(); - data.setColor(tile.network) - .setRotationalSpeed(getSpeed(direction)) - .setRotationOffset(getRotationOffset(axis)) - .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); - }); + key.getValue() + .getInstance() + .setColor(tile.network) + .setRotationalSpeed(getSpeed(direction)) + .setRotationOffset(getRotationOffset(axis)) + .setRotationAxis(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis).getUnitVector()); } } @@ -105,7 +107,9 @@ public class GearboxInstance extends KineticTileInstance { int skyLight = tile.getWorld().getLightLevel(LightType.SKY, pos); for (InstanceKey key : keys.values()) { - key.modifyInstance(data -> data.setBlockLight(blockLight).setSkyLight(skyLight)); + key.getInstance() + .setBlockLight(blockLight) + .setSkyLight(skyLight); } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index d2f6fa318..b22a8437c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -53,17 +53,20 @@ public class BeltTunnelInstance extends TileEntityInstance float intensity = segment == 3 ? 1.5f : segment + 1; float segmentOffset = -3 / 16f * segment; - flaps.add(model.createInstance(flapData -> { - flapData.setPosition(pos) - .setSegmentOffset(segmentOffset, 0, 0) - .setBlockLight(blockLight) - .setSkyLight(skyLight) - .setHorizontalAngle(horizontalAngle) - .setFlapness(flapness) - .setFlapScale(flapScale) - .setPivotVoxelSpace(0, 10, 1) - .setIntensity(intensity); - })); + InstanceKey key = model.createInstance(); + + key.getInstance() + .setPosition(pos) + .setSegmentOffset(segmentOffset, 0, 0) + .setBlockLight(blockLight) + .setSkyLight(skyLight) + .setHorizontalAngle(horizontalAngle) + .setFlapness(flapness) + .setFlapScale(flapScale) + .setPivotVoxelSpace(0, 10, 1) + .setIntensity(intensity); + + flaps.add(key); } tunnelFlaps.put(direction, flaps); @@ -80,7 +83,7 @@ public class BeltTunnelInstance extends TileEntityInstance float flapness = flapValue.get(AnimationTickHolder.getPartialTicks()); for (InstanceKey key : keys) { - key.modifyInstance(data -> data.setFlapness(flapness)); + key.getInstance().setFlapness(flapness); } }); } @@ -95,8 +98,8 @@ public class BeltTunnelInstance extends TileEntityInstance for (ArrayList> instanceKeys : tunnelFlaps.values()) { for (InstanceKey it : instanceKeys) { - it.modifyInstance(data -> data.setBlockLight(blockLight) - .setSkyLight(skyLight)); + it.getInstance().setBlockLight(blockLight) + .setSkyLight(skyLight); } } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index cf5b54e6a..ca6283483 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -48,15 +48,20 @@ public class FunnelInstance extends TileEntityInstance impleme float intensity = segment == 3 ? 1.5f : segment + 1; float segmentOffset = -3 / 16f * segment; - flaps.add(model.createInstance(flapData -> flapData.setPosition(pos) - .setSegmentOffset(segmentOffset, 0, -tile.getFlapOffset()) - .setBlockLight(blockLight) - .setSkyLight(skyLight) - .setHorizontalAngle(horizontalAngle) - .setFlapness(flapness) - .setFlapScale(-1) - .setPivotVoxelSpace(0, 10, 9.5f) - .setIntensity(intensity))); + InstanceKey key = model.createInstance(); + + key.getInstance() + .setPosition(pos) + .setSegmentOffset(segmentOffset, 0, -tile.getFlapOffset()) + .setBlockLight(blockLight) + .setSkyLight(skyLight) + .setHorizontalAngle(horizontalAngle) + .setFlapness(flapness) + .setFlapScale(-1) + .setPivotVoxelSpace(0, 10, 9.5f) + .setIntensity(intensity); + + flaps.add(key); } } @@ -67,7 +72,7 @@ public class FunnelInstance extends TileEntityInstance impleme float flapness = tile.flap.get(AnimationTickHolder.getPartialTicks()); for (InstanceKey key : flaps) { - key.modifyInstance(data -> data.setFlapness(flapness)); + key.getInstance().setFlapness(flapness); } } @@ -79,8 +84,9 @@ public class FunnelInstance extends TileEntityInstance impleme int skyLight = world.getLightLevel(LightType.SKY, pos); for (InstanceKey it : flaps) { - it.modifyInstance(data -> data.setBlockLight(blockLight) - .setSkyLight(skyLight)); + it.getInstance() + .setBlockLight(blockLight) + .setSkyLight(skyLight); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java index e25440f75..6a3ec6d1e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstanceKey.java @@ -21,10 +21,6 @@ public class InstanceKey { return index != INVALID; } - public void modifyInstance(Consumer edit) { - model.modifyInstance(this, edit); - } - public D getInstance() { return model.getInstance(this); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index ab1b292a7..857541f6b 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -85,16 +85,6 @@ public abstract class InstancedModel extends BufferedMod return this.data.get(key.index); } - public synchronized void modifyInstance(InstanceKey key, Consumer edit) { - verifyKey(key); - - D data = this.data.get(key.index); - - edit.accept(data); - - markIndexChanged(key.index); - } - public synchronized InstanceKey createInstance() { D instanceData = newInstance(); @@ -107,19 +97,6 @@ public abstract class InstancedModel extends BufferedMod return key; } - public synchronized InstanceKey createInstance(Consumer setup) { - D instanceData = newInstance(); - setup.accept(instanceData); - - InstanceKey key = new InstanceKey<>(this, data.size()); - data.add(instanceData); - keys.add(key); - - markIndexChanged(key.index); - - return key; - } - protected void doRender() { vao.with(vao -> { renderSetup(); From b31f4d09bdac6cdbd7f76a79c93ce2dc46447af3 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Mar 2021 02:27:56 -0800 Subject: [PATCH 068/124] Housekeeping. --- .../content/contraptions/base/ShaftlessCogInstance.java | 2 +- .../components/millstone/MillStoneCogInstance.java | 2 +- .../content/contraptions/components/saw/SawInstance.java | 2 +- .../create/content/contraptions/fluids/PumpCogInstance.java | 2 +- .../contraptions/relays/encased/SplitShaftInstance.java | 2 +- .../content/contraptions/relays/gearbox/GearboxInstance.java | 2 +- .../content/logistics/block/mechanicalArm/ArmInstance.java | 2 +- .../render/backend/instancing/IRendererFactory.java | 2 +- .../foundation/render/backend/instancing/InstancedModel.java | 4 ++-- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index ff96d5856..9c7e9ebee 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -15,7 +15,7 @@ public class ShaftlessCogInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, ShaftlessCogInstance::new)); } - public ShaftlessCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public ShaftlessCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java index 329cc5e7b..8bc4b2541 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -17,7 +17,7 @@ public class MillStoneCogInstance extends SingleRotatingInstance { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, MillStoneCogInstance::new)); } - public MillStoneCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public MillStoneCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index 62060db98..5771f4ec5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -22,7 +22,7 @@ public class SawInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, SawInstance::new)); } - public SawInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public SawInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index 99b4bebec..e4b699c89 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -18,7 +18,7 @@ public class PumpCogInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, PumpCogInstance::new)); } - public PumpCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public PumpCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index c61315fd1..be7574bbc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -26,7 +26,7 @@ public class SplitShaftInstance extends KineticTileInstance> keys; - public SplitShaftInstance(InstancedTileRenderer modelManager, SplitShaftTileEntity tile) { + public SplitShaftInstance(InstancedTileRenderer modelManager, SplitShaftTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 9ef1a4326..9be02d612 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -29,7 +29,7 @@ public class GearboxInstance extends KineticTileInstance { protected EnumMap> keys; protected Direction sourceFacing; - public GearboxInstance(InstancedTileRenderer modelManager, GearboxTileEntity tile) { + public GearboxInstance(InstancedTileRenderer modelManager, GearboxTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index c4600dcf2..6432569f0 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -18,7 +18,7 @@ public class ArmInstance extends SingleRotatingInstance { InstancedTileRenderRegistry.instance.register(type, ArmInstance::new)); } - public ArmInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + public ArmInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java index 196e029d8..f1ec0d323 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IRendererFactory.java @@ -4,5 +4,5 @@ import net.minecraft.tileentity.TileEntity; @FunctionalInterface public interface IRendererFactory { - TileEntityInstance create(InstancedTileRenderer manager, T te); + TileEntityInstance create(InstancedTileRenderer manager, T te); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java index 857541f6b..b6eded4a9 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedModel.java @@ -69,8 +69,6 @@ public abstract class InstancedModel extends BufferedMod vao.delete(); } - protected abstract D newInstance(); - public synchronized void deleteInstance(InstanceKey key) { verifyKey(key); @@ -97,6 +95,8 @@ public abstract class InstancedModel extends BufferedMod return key; } + protected abstract D newInstance(); + protected void doRender() { vao.with(vao -> { renderSetup(); From 21d87a0cfed4719fd8dec999209fb50135a61fb8 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 8 Mar 2021 17:29:42 +0100 Subject: [PATCH 069/124] Change mixin repo --- build.gradle | 2 +- .../create/blockstates/radial_chassis.json | 24 +++++++++---------- .../resources/assets/create/lang/en_us.json | 18 ++++++++++++++ .../data/create/advancements/aesthetics.json | 4 ++-- .../foundation/ponder/ui/PonderButton.java | 2 +- 5 files changed, 34 insertions(+), 16 deletions(-) diff --git a/build.gradle b/build.gradle index 0bd3d4bb2..b89d16ba4 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { maven { url = 'https://files.minecraftforge.net/maven' } jcenter() mavenCentral() - maven { url='https://dist.creeper.host/Sponge/maven' } + maven { url='https://repo.spongepowered.org/repository/maven-public/' } } dependencies { classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true 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 bbb8f8fd0..097193486 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1906,6 +1906,24 @@ "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.fan_direction.header": "Air flow of Encased Fans", + "create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current", + "create.ponder.fan_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input", + + "create.ponder.fan_processing.header": "Processing Items using Encased Fans", + "create.ponder.fan_processing.text_1": "When passing through lava, the Air Flow becomes Heated", + "create.ponder.fan_processing.text_2": "Items caught in the area will be smelted", + "create.ponder.fan_processing.text_3": "Food items thrown here would be incinerated", + "create.ponder.fan_processing.text_4": "Instead, a setup for Smoking using Fire should be used for them", + "create.ponder.fan_processing.text_5": "Air Flows passing through water create a Washing Setup", + "create.ponder.fan_processing.text_6": "Some interesting new processing can be done with it", + "create.ponder.fan_processing.text_7": "The Speed of the Fan does NOT affect the processing speed, only its range", + "create.ponder.fan_processing.text_8": "Fan Processing can also be applied to Items on Depots and Belts", + + "create.ponder.fan_source.header": "Generating Rotational Force using Encased Fans", + "create.ponder.fan_source.text_1": "Fans facing down into a source of heat can provide Rotational Force", + "create.ponder.fan_source.text_2": "When given a Redstone Signal, the Fans will start providing power", + "create.ponder.funnel_compat.header": "Funnel compatibility", "create.ponder.funnel_compat.text_1": "Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "Vertical Saws", diff --git a/src/generated/resources/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/ui/PonderButton.java b/src/main/java/com/simibubi/create/foundation/ponder/ui/PonderButton.java index 9e3e4cb1a..1c007367e 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 @@ -95,7 +95,7 @@ public class PonderButton extends AbstractSimiWidget { float flashValue = flash.getValue(partialTicks); if (flashValue > .1f) - fade *= 3 * flashValue + (Math.sin(AnimationTickHolder.getRenderTick() / 6)) / 1f; + fade *= 3 * flashValue + ((Math.sin(AnimationTickHolder.getTicks() + partialTicks) / 6)) / 1f; int backgroundColor = ColorHelper.applyAlpha(0xdd000000, fade); int borderColorStart = ColorHelper.applyAlpha(isHovered ? 0x70ffffff : 0x40aa9999, fade); From bea60ccb86f66764c90baed6f31df642a14a8e49 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 8 Mar 2021 17:42:50 +0100 Subject: [PATCH 070/124] Fix build issues --- .../com/simibubi/create/foundation/mixin/RenderHooksMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index d44d476b0..89310489c 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -45,7 +45,7 @@ public class RenderHooksMixin { GL20.glUseProgram(0); } - @Inject(at = @At(value = "INVOKE", target = "updateChunks(J)V"), method = "render") + @Inject(at = @At(value = "INVOKE", target = "net.minecraft.client.renderer.WorldRenderer.updateChunks(J)V"), method = "render") private void setupFrame(MatrixStack p_228426_1_, float p_228426_2_, long p_228426_3_, boolean p_228426_5_, ActiveRenderInfo info, GameRenderer p_228426_7_, LightTexture p_228426_8_, Matrix4f p_228426_9_, CallbackInfo ci) { Vec3d cameraPos = info.getProjectedView(); double camX = cameraPos.getX(); From 6c8fe67fd4cdf443aa2a6515083176c80bec5c69 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 8 Mar 2021 22:12:25 +0100 Subject: [PATCH 071/124] Gradle Mondays - Replaced ponderworld particle AT with reflection - Symmetry Wand now checks for placement permissions - Lang now uses Locale.ROOT - Fixed crash using ponder without advanced tooltips enabled --- .../curiosities/symmetry/SymmetryWandItem.java | 12 ++++++++++++ .../foundation/ponder/PonderTooltipHandler.java | 13 +++++++------ .../create/foundation/ponder/PonderWorld.java | 10 ++++++++-- .../simibubi/create/foundation/utility/Lang.java | 5 ++--- src/main/resources/META-INF/accesstransformer.cfg | 3 --- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java index 6118eb8b9..a7558fc74 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/symmetry/SymmetryWandItem.java @@ -21,6 +21,7 @@ import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.fluid.IFluidState; import net.minecraft.item.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -38,6 +39,9 @@ import net.minecraft.util.math.shapes.ISelectionContext; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.common.util.Constants.BlockFlags; +import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.PacketDistributor; @@ -227,7 +231,15 @@ public class SymmetryWandItem extends Item { if (BlockHelper.findAndRemoveInInventory(blockState, player, 1) == 0) continue; + BlockSnapshot blocksnapshot = BlockSnapshot.getBlockSnapshot(world, position); + IFluidState ifluidstate = world.getFluidState(position); + world.setBlockState(position, ifluidstate.getBlockState(), BlockFlags.UPDATE_NEIGHBORS); world.setBlockState(position, blockState); + if (ForgeEventFactory.onBlockPlace(player, blocksnapshot, Direction.UP)) { + blocksnapshot.restore(true, false); + continue; + } + targets.add(position); } } 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 87c56e7f0..6209624bc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -98,12 +98,13 @@ public class PonderTooltipHandler { float renderPartialTicks = AnimationTickHolder.getPartialTicks(); if (lastHoveredStack != stack) return; - if (subject) { - toolTip.set(1, Lang.createTranslationTextComponent(SUBJECT) - .applyTextStyle(TextFormatting.GREEN)); - return; - } - toolTip.set(1, makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); + ITextComponent component = subject ? Lang.createTranslationTextComponent(SUBJECT) + .applyTextStyle(TextFormatting.GREEN) + : makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f)); + if (toolTip.size() < 2) + toolTip.add(component); + else + toolTip.set(1, component); } public static void handleTooltipColor(RenderTooltipEvent.Color event) { 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 1b75b6571..f9adefdfc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -42,6 +42,7 @@ 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.fml.common.ObfuscationReflectionHelper; import net.minecraftforge.registries.ForgeRegistries; public class PonderWorld extends SchematicWorld { @@ -49,7 +50,9 @@ public class PonderWorld extends SchematicWorld { protected Map originalBlocks; protected Map originalTileEntities; protected List originalEntities; + protected PonderWorldParticles particles; + private final Map> particleFactories; int overrideLight; Selection mask; @@ -60,6 +63,10 @@ public class PonderWorld extends SchematicWorld { originalTileEntities = new HashMap<>(); originalEntities = new ArrayList<>(); particles = new PonderWorldParticles(this); + + // ParticleManager.factories - ATs don't seem to like this one + particleFactories = ObfuscationReflectionHelper.getPrivateValue(ParticleManager.class, + Minecraft.getInstance().particles, "field_178932_g"); } public void createBackup() { @@ -186,9 +193,8 @@ public class PonderWorld extends SchematicWorld { @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); + IParticleFactory iparticlefactory = (IParticleFactory) particleFactories.get(key); return iparticlefactory == null ? null : iparticlefactory.makeParticle(data, this, x, y, z, mx, my, mz); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/Lang.java b/src/main/java/com/simibubi/create/foundation/utility/Lang.java index 479ae60e0..b30a4704d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Lang.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Lang.java @@ -25,14 +25,13 @@ public class Lang { public static List translatedOptions(String prefix, String... keys) { List result = new ArrayList<>(keys.length); - for (String key : keys) { + for (String key : keys) result.add(translate(prefix + "." + key)); - } return result; } public static String asId(String name) { - return name.toLowerCase(Locale.ENGLISH); + return name.toLowerCase(Locale.ROOT); } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 809edfd79..1cfeb0d93 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -25,9 +25,6 @@ public net.minecraft.tileentity.BeaconTileEntity field_174909_f # beamSegments public net.minecraft.world.server.ServerTickList field_205374_d # pendingTickListEntriesHashSet public net.minecraft.world.server.ServerTickList field_205375_e # pendingTickListEntriesTreeSet -# Particle Manager -public net.minecraft.client.particle.ParticleManager field_178932_g # factories - # Lightmap information for instanced rendering public net.minecraft.client.renderer.LightTexture field_205112_c #resourceLocation public net.minecraft.client.Minecraft field_193996_ah #renderPartialTicksPaused From 33d718d65353db214b82766645e8abc5a591c655 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 8 Mar 2021 15:24:58 -0800 Subject: [PATCH 072/124] Check if worlds support the flywheel backend. --- .../backend/instancing/IFlywheelWorld.java | 13 ++++++++++++ .../instancing/InstancedTileRenderer.java | 20 ++++++++++++------- .../PlacementSimulationWorld.java | 3 ++- 3 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java new file mode 100644 index 000000000..91684c428 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IFlywheelWorld.java @@ -0,0 +1,13 @@ +package com.simibubi.create.foundation.render.backend.instancing; + +/** + * A marker interface custom worlds can override to indicate + * that tiles inside the world should render with Flywheel. + * + * Minecraft.getInstance().world will always support Flywheel. + */ +public interface IFlywheelWorld { + default boolean supportsFlywheel() { + return true; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 4cd6ce646..ef3a3aeea 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -4,11 +4,13 @@ import java.util.*; import javax.annotation.Nullable; +import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.utility.AnimationTickHolder; +import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; import net.minecraft.tileentity.TileEntity; @@ -69,7 +71,7 @@ public abstract class InstancedTileRenderer

{ @SuppressWarnings("unchecked") @Nullable public TileEntityInstance getInstance(T tile, boolean create) { - if (!Backend.canUseInstancing() || isTileUnloaded(tile)) return null; + if (!Backend.canUseInstancing() || !canCreateInstance(tile)) return null; TileEntityInstance instance = instances.get(tile); @@ -147,17 +149,21 @@ public abstract class InstancedTileRenderer

{ tickableInstances.clear(); } - public boolean isTileUnloaded(TileEntity tile) { - if (tile.isRemoved()) return true; + public boolean canCreateInstance(TileEntity tile) { + if (tile.isRemoved()) return false; World world = tile.getWorld(); - if (world == null) return true; + if (world == null) return false; - BlockPos pos = tile.getPos(); + if (world == Minecraft.getInstance().world) { + BlockPos pos = tile.getPos(); - IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4); + IBlockReader existingChunk = world.getExistingChunk(pos.getX() >> 4, pos.getZ() >> 4); - return existingChunk == null; + return existingChunk != null; + } + + return world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel(); } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java index 8e8d71b3c..9e548cf46 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java +++ b/src/main/java/com/simibubi/create/foundation/utility/worldWrappers/PlacementSimulationWorld.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.function.Predicate; +import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.tileentity.TileEntity; @@ -13,7 +14,7 @@ import net.minecraft.util.math.SectionPos; import net.minecraft.world.World; import net.minecraft.world.lighting.WorldLightManager; -public class PlacementSimulationWorld extends WrappedWorld { +public class PlacementSimulationWorld extends WrappedWorld implements IFlywheelWorld { public HashMap blocksAdded; public HashMap tesAdded; From 62c3ae40405b99bedb80e4f3c23e05e2c381353a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 9 Mar 2021 01:49:49 +0100 Subject: [PATCH 073/124] Captain Distracto - Removed processing recipes from recipe book - Reorganized items in creative tab - Tweaked a few model transforms - Fixed belt uvs - ponder birbs can now face the cursor - fix interpolation on ponder birbs - Fixed log spam when assembling certain blocks (Points of interest) in a contraption - Fixed content observers not triggering for in-line belt funnels --- .../java/com/simibubi/create/AllItems.java | 151 +++++++++--------- .../jei/category/BlockCuttingCategory.java | 7 +- .../crafter/MechanicalCraftingRecipe.java | 5 + .../structureMovement/Contraption.java | 16 +- .../processing/ProcessingRecipe.java | 5 + .../BeltFunnelInteractionHandler.java | 1 + .../foundation/ponder/SceneBuilder.java | 44 ++--- .../foundation/ponder/content/BeltScenes.java | 8 +- .../ponder/content/DebugScenes.java | 10 +- .../foundation/ponder/content/FanScenes.java | 4 +- .../ponder/elements/ParrotElement.java | 114 +++++++------ .../models/block/analog_lever/item.json | 2 +- .../create/models/block/belt/start.json | 8 +- .../diodes/adjustable_pulse_repeater.json | 5 + .../block/diodes/adjustable_repeater.json | 5 + .../create/models/block/diodes/latch_off.json | 19 ++- .../create/models/block/diodes/latch_on.json | 19 ++- .../models/block/diodes/pulse_repeater.json | 14 +- .../block/redstone_link/transmitter.json | 10 +- .../create/models/block/sail_frame.json | 2 +- .../create/models/block/white_sail.json | 2 +- 21 files changed, 261 insertions(+), 190 deletions(-) diff --git a/src/main/java/com/simibubi/create/AllItems.java b/src/main/java/com/simibubi/create/AllItems.java index 698b61e36..7485830ae 100644 --- a/src/main/java/com/simibubi/create/AllItems.java +++ b/src/main/java/com/simibubi/create/AllItems.java @@ -68,6 +68,74 @@ public class AllItems { REGISTRATE.startSection(MATERIALS); } + public static final ItemEntry WHEAT_FLOUR = ingredient("wheat_flour"), DOUGH = ingredient("dough"), + CINDER_FLOUR = ingredient("cinder_flour"), POWDERED_OBSIDIAN = ingredient("powdered_obsidian"), + ROSE_QUARTZ = ingredient("rose_quartz"), POLISHED_ROSE_QUARTZ = ingredient("polished_rose_quartz"), + PROPELLER = ingredient("propeller"), WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), + CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"), ELECTRON_TUBE = ingredient("electron_tube"), + INTEGRATED_CIRCUIT = ingredient("integrated_circuit"); + + public static final ItemEntry BLAZE_CAKE_BASE = + REGISTRATE.item("blaze_cake_base", HiddenIngredientItem::new) + .tag(AllItemTags.UPRIGHT_ON_BELT.tag) + .register(); + + public static final ItemEntry BLAZE_CAKE = REGISTRATE.item("blaze_cake", CombustibleItem::new) + .tag(AllItemTags.UPRIGHT_ON_BELT.tag) + .register(); + + public static final ItemEntry BAR_OF_CHOCOLATE = REGISTRATE.item("bar_of_chocolate", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(6) + .saturation(0.3F) + .build())) + .lang("Bar of Chocolate") + .register(); + + public static final ItemEntry SWEET_ROLL = REGISTRATE.item("sweet_roll", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(6) + .saturation(0.8F) + .build())) + .register(); + + public static final ItemEntry CHOCOLATE_BERRIES = REGISTRATE.item("chocolate_glazed_berries", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(7) + .saturation(0.8F) + .build())) + .register(); + + public static final ItemEntry HONEYED_APPLE = REGISTRATE.item("honeyed_apple", Item::new) + .properties(p -> p.food(new Food.Builder().hunger(8) + .saturation(0.8F) + .build())) + .register(); + + public static final ItemEntry BUILDERS_TEA = REGISTRATE.item("builders_tea", BuildersTeaItem::new) + .tag(AllItemTags.UPRIGHT_ON_BELT.tag) + .properties(p -> p.maxStackSize(16)) + .lang("Builder's Tea") + .register(); + + public static final ItemEntry ANDESITE_ALLOY = ingredient("andesite_alloy"), + COPPER_INGOT = taggedIngredient("copper_ingot", forgeItemTag("ingots/copper"), CREATE_INGOTS.tag), + ZINC_INGOT = taggedIngredient("zinc_ingot", forgeItemTag("ingots/zinc"), CREATE_INGOTS.tag), + BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass"), CREATE_INGOTS.tag); + + public static final ItemEntry CHROMATIC_COMPOUND = + REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .model(AssetLookup.existingItemModel()) + .onRegister(CreateRegistrate.itemColors(() -> ChromaticCompoundColor::new)) + .register(); + + public static final ItemEntry SHADOW_STEEL = REGISTRATE.item("shadow_steel", ShadowSteelItem::new) + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .register(); + + public static final ItemEntry REFINED_RADIANCE = + REGISTRATE.item("refined_radiance", RefinedRadianceItem::new) + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .register(); + public static final ItemEntry COPPER_NUGGET = taggedIngredient("copper_nugget", forgeItemTag("nuggets/copper"), NUGGETS.tag), ZINC_NUGGET = taggedIngredient("zinc_nugget", forgeItemTag("nuggets/zinc"), NUGGETS.tag), @@ -91,77 +159,6 @@ public class AllItems { CRUSHED_QUICKSILVER = compatCrushedOre("quicksilver"), CRUSHED_BAUXITE = compatCrushedOre("aluminum"), CRUSHED_URANIUM = compatCrushedOre("uranium"), CRUSHED_NICKEL = compatCrushedOre("nickel"); - public static final ItemEntry ANDESITE_ALLOY = ingredient("andesite_alloy"), - COPPER_INGOT = taggedIngredient("copper_ingot", forgeItemTag("ingots/copper"), CREATE_INGOTS.tag), - ZINC_INGOT = taggedIngredient("zinc_ingot", forgeItemTag("ingots/zinc"), CREATE_INGOTS.tag), - BRASS_INGOT = taggedIngredient("brass_ingot", forgeItemTag("ingots/brass"), CREATE_INGOTS.tag), - - WHEAT_FLOUR = ingredient("wheat_flour"), DOUGH = ingredient("dough"), CINDER_FLOUR = ingredient("cinder_flour"), - POWDERED_OBSIDIAN = ingredient("powdered_obsidian"), ROSE_QUARTZ = ingredient("rose_quartz"), - POLISHED_ROSE_QUARTZ = ingredient("polished_rose_quartz"), PROPELLER = ingredient("propeller"), - WHISK = ingredient("whisk"), BRASS_HAND = ingredient("brass_hand"), - CRAFTER_SLOT_COVER = ingredient("crafter_slot_cover"); - - public static final ItemEntry BLAZE_CAKE_BASE = - REGISTRATE.item("blaze_cake_base", HiddenIngredientItem::new) - .tag(AllItemTags.UPRIGHT_ON_BELT.tag) - .register(); - - public static final ItemEntry BLAZE_CAKE = REGISTRATE.item("blaze_cake", CombustibleItem::new) - .tag(AllItemTags.UPRIGHT_ON_BELT.tag) - .register(); - - public static final ItemEntry BAR_OF_CHOCOLATE = REGISTRATE.item("bar_of_chocolate", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(5) - .saturation(0.6F) - .build())) - .lang("Bar of Chocolate") - .register(); - - public static final ItemEntry SWEET_ROLL = REGISTRATE.item("sweet_roll", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(6) - .saturation(1.0F) - .build())) - .register(); - - public static final ItemEntry CHOCOLATE_BERRIES = REGISTRATE.item("chocolate_glazed_berries", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(7) - .saturation(0.7F) - .build())) - .register(); - - public static final ItemEntry HONEYED_APPLE = REGISTRATE.item("honeyed_apple", Item::new) - .properties(p -> p.food(new Food.Builder().hunger(8) - .saturation(0.6F) - .build())) - .register(); - - public static final ItemEntry BUILDERS_TEA = REGISTRATE.item("builders_tea", BuildersTeaItem::new) - .tag(AllItemTags.UPRIGHT_ON_BELT.tag) - .properties(p -> p.maxStackSize(16)) - .lang("Builder's Tea") - .register(); - - public static final ItemEntry CHROMATIC_COMPOUND = - REGISTRATE.item("chromatic_compound", ChromaticCompoundItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .model(AssetLookup.existingItemModel()) - .onRegister(CreateRegistrate.itemColors(() -> ChromaticCompoundColor::new)) - .register(); - - public static final ItemEntry SHADOW_STEEL = REGISTRATE.item("shadow_steel", ShadowSteelItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .register(); - - public static final ItemEntry REFINED_RADIANCE = - REGISTRATE.item("refined_radiance", RefinedRadianceItem::new) - .properties(p -> p.rarity(Rarity.UNCOMMON)) - .register(); - - public static final ItemEntry - - ELECTRON_TUBE = ingredient("electron_tube"), INTEGRATED_CIRCUIT = ingredient("integrated_circuit"); - // Kinetics static { @@ -184,6 +181,12 @@ public class AllItems { .model(AssetLookup.customItemModel("blaze_burner", "block")) .register(); + public static final ItemEntry GOGGLES = REGISTRATE.item("goggles", GogglesItem::new) + .properties(p -> p.maxStackSize(1)) + .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) + .lang("Engineer's Goggles") + .register(); + public static final ItemEntry SUPER_GLUE = REGISTRATE.item("super_glue", SuperGlueItem::new) .register(); @@ -206,12 +209,6 @@ public class AllItems { .model(AssetLookup.itemModelWithPartials()) .register(); - public static final ItemEntry GOGGLES = REGISTRATE.item("goggles", GogglesItem::new) - .properties(p -> p.maxStackSize(1)) - .onRegister(CreateRegistrate.itemModel(() -> GogglesModel::new)) - .lang("Engineer's Goggles") - .register(); - public static final ItemEntry MINECART_CONTRAPTION = REGISTRATE.item("minecart_contraption", MinecartContraptionItem::rideable) .register(); diff --git a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java index 2fd5373e6..93e27c9ab 100644 --- a/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java +++ b/src/main/java/com/simibubi/create/compat/jei/category/BlockCuttingCategory.java @@ -33,7 +33,7 @@ public class BlockCuttingCategory extends CreateRecipeCategory getRecipeClass() { return CondensedBlockCuttingRecipe.class; } - + @Override public void setIngredients(CondensedBlockCuttingRecipe recipe, IIngredients ingredients) { ingredients.setInputIngredients(recipe.getIngredients()); @@ -118,6 +118,11 @@ public class BlockCuttingCategory extends CreateRecipeCategory getSerializer() { return AllRecipeTypes.MECHANICAL_CRAFTING.serializer; 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 5ee4c3bb0..d80494f5e 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 @@ -91,6 +91,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.palette.PaletteHashMap; +import net.minecraft.village.PointOfInterestType; import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraft.world.gen.feature.template.Template.BlockInfo; @@ -929,10 +930,14 @@ public abstract class Contraption { for (BlockInfo block : blocks.values()) { BlockPos add = block.pos.add(anchor) .add(offset); - if (!shouldUpdateAfterMovement(block)) - continue; - world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(), - BlockFlags.IS_MOVING | BlockFlags.DEFAULT); +// if (!shouldUpdateAfterMovement(block)) +// continue; + int flags = BlockFlags.IS_MOVING | BlockFlags.DEFAULT; + world.notifyBlockUpdate(add, block.state, Blocks.AIR.getDefaultState(), flags); + world.notifyNeighbors(add, block.state.getBlock()); + block.state.updateDiagonalNeighbors(world, add, flags & -2); +// world.markAndNotifyBlock(add, null, block.state, Blocks.AIR.getDefaultState(), +// BlockFlags.IS_MOVING | BlockFlags.DEFAULT); this method did strange logspamming with POI-related blocks } } @@ -1079,6 +1084,9 @@ public abstract class Contraption { } protected boolean shouldUpdateAfterMovement(BlockInfo info) { + if (PointOfInterestType.forState(info.state) + .isPresent()) + return false; return true; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java index 5f928b1db..9fc92040c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/ProcessingRecipe.java @@ -180,6 +180,11 @@ public abstract class ProcessingRecipe implements IRecipe< public ResourceLocation getId() { return id; } + + @Override + public boolean isDynamic() { + return true; + } @Override public IRecipeSerializer getSerializer() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java index 3fa3d429c..b4da7da8f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltFunnelInteractionHandler.java @@ -97,6 +97,7 @@ public class BeltFunnelInteractionHandler { remainder = ItemHandlerHelper.copyStackWithSize(currentItem.stack, notFilled); funnelTE.flap(true); + funnelTE.onTransfer(toInsert); currentItem.stack = remainder; beltInventory.belt.sendData(); if (blocking) 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 fe208b5ff..7dc616f67 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -4,6 +4,7 @@ import java.util.Optional; 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.simibubi.create.content.contraptions.base.IRotate.SpeedLevel; @@ -19,6 +20,8 @@ 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.ParrotElement.ParrotPose; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.SpinOnComponentPose; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction; @@ -294,44 +297,25 @@ public class SceneBuilder { public class SpecialInstructions { 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; + return createBirb(VecHelper.getCenterOf(pos), () -> new SpinOnComponentPose(pos)); } public ElementLink birbOnSpinnyShaft(BlockPos pos) { + return createBirb(VecHelper.getCenterOf(pos) + .add(0, 0.5, 0), () -> new SpinOnComponentPose(pos)); + } + + public ElementLink createBirb(Vec3d location, Supplier pose) { ElementLink link = new ElementLink<>(ParrotElement.class); - ParrotElement parrot = ParrotElement.spinOnComponent(VecHelper.getCenterOf(pos) - .add(0, 0.5, 0), pos); + ParrotElement parrot = ParrotElement.create(location, pose); addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); addInstruction(scene -> scene.linkElement(parrot, link)); return link; } - 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 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); - ParrotElement parrot = ParrotElement.dance(location); - addInstruction(new CreateParrotInstruction(10, Direction.DOWN, parrot)); - addInstruction(scene -> scene.linkElement(parrot, link)); - return link; + public void changeBirbPose(ElementLink birb, Supplier pose) { + addInstruction(scene -> scene.resolve(birb) + .setPose(pose.get())); } public void movePointOfInterest(Vec3d location) { @@ -574,7 +558,7 @@ public class SceneBuilder { resolve.ifPresent(tis -> tis.locked = stalled); }); } - + public void changeBeltItemTo(ElementLink link, ItemStack newStack) { addInstruction(scene -> { BeltItemElement resolve = scene.resolve(link); 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 09c5ff47b..547a8c348 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 @@ -17,6 +17,8 @@ import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FaceCursorPose; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FacePointOfInterestPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.Pointing; @@ -324,8 +326,8 @@ public class BeltScenes { scene.idle(20); - ElementLink parrot = scene.special.birbLookingAtPOI(util.vector.topOf(0, 1, 2) - .add(0, -3 / 16f, 0)); + ElementLink parrot = scene.special.createBirb(util.vector.topOf(0, 1, 2) + .add(0, -3 / 16f, 0), FacePointOfInterestPose::new); scene.special.moveParrot(parrot, util.vector.of(1.78, 0, 0), 40); scene.special.movePointOfInterest(util.grid.at(1, 1, 3)); @@ -371,7 +373,7 @@ public class BeltScenes { scene.effects.indicateSuccess(util.grid.at(3, 2, 2)); scene.idle(20); - scene.special.movePointOfInterest(util.grid.at(2, 1, 5)); + scene.special.changeBirbPose(parrot, FaceCursorPose::new); } public static void beltsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { 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 da89236c3..1f37322eb 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,8 @@ 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.ParrotElement.DancePose; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FacePointOfInterestPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.utility.Pointing; @@ -108,7 +110,7 @@ public class DebugScenes { scene.showBasePlate(); scene.idle(10); Vec3d parrotPos = util.vector.topOf(1, 0, 1); - scene.special.birbLookingAtPOI(parrotPos); + scene.special.createBirb(parrotPos, FacePointOfInterestPose::new); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); scene.overlay.showText(1000) .text("Fluid rendering test.") @@ -290,11 +292,11 @@ public class DebugScenes { .pointAt(util.vector.topOf(pos)); scene.idle(10); - scene.special.birbPartying(util.vector.topOf(0, 1, 2)); + scene.special.createBirb(util.vector.topOf(0, 1, 2), DancePose::new); scene.idle(10); - scene.special.birbLookingAtPOI(util.vector.centerOf(3, 1, 3) - .add(0, 0.25f, 0)); + scene.special.createBirb(util.vector.centerOf(3, 1, 3) + .add(0, 0.25f, 0), FacePointOfInterestPose::new); scene.idle(20); BlockPos poi1 = util.grid.at(4, 1, 0); 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 index 8d52c8113..edde435de 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/FanScenes.java @@ -11,6 +11,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.ParrotElement.FlappyPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.utility.Pointing; @@ -32,7 +33,6 @@ public class FanScenes { 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); @@ -45,7 +45,7 @@ public class FanScenes { scene.idle(40); scene.effects.rotationDirectionIndicator(fanPos.south()); - ElementLink flappyBirb = scene.special.flappyBirb(util.vector.topOf(1, 0, 3)); + ElementLink flappyBirb = scene.special.createBirb(util.vector.topOf(1, 0, 3), FlappyPose::new); scene.idle(2); scene.special.rotateParrot(flappyBirb, 0, 235, 0, 30); scene.special.moveParrot(flappyBirb, util.vector.of(0, 0, -2.5), 30); 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 abcbfd691..cd7043524 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 @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.ponder.elements; +import java.util.function.Supplier; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -9,6 +11,7 @@ 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.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.entity.EntityRendererManager; @@ -24,42 +27,29 @@ public class ParrotElement extends AnimatedSceneElement { private Vec3d location; private ParrotEntity entity; private ParrotPose pose; + private Supplier initialPose; - public static ParrotElement lookAtPOI(Vec3d location) { - ParrotElement parrotElement = new ParrotElement(location); - parrotElement.pose = parrotElement.new FacePointOfInterestPose(); - return parrotElement; + public static ParrotElement create(Vec3d location, Supplier pose) { + return new ParrotElement(location, pose); } - 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; - } - - public static ParrotElement flappy(Vec3d location) { - ParrotElement parrotElement = new ParrotElement(location); - parrotElement.pose = parrotElement.new FlappyPose(); - return parrotElement; - } - - protected ParrotElement(Vec3d location) { + protected ParrotElement(Vec3d location, Supplier pose) { this.location = location; + initialPose = pose; + setPose(initialPose.get()); } @Override public void reset(PonderScene scene) { super.reset(scene); + setPose(initialPose.get()); entity.setPos(0, 0, 0); entity.prevPosX = 0; entity.prevPosY = 0; entity.prevPosZ = 0; + entity.lastTickPosX = 0; + entity.lastTickPosY = 0; + entity.lastTickPosZ = 0; } @Override @@ -74,13 +64,17 @@ public class ParrotElement extends AnimatedSceneElement { entity.oFlap = entity.flap; entity.onGround = true; - pose.tick(scene); - entity.prevPosX = entity.getX(); entity.prevPosY = entity.getY(); entity.prevPosZ = entity.getZ(); entity.prevRotationYaw = entity.rotationYaw; entity.prevRotationPitch = entity.rotationPitch; + + pose.tick(scene, entity, location); + + entity.lastTickPosX = entity.getX(); + entity.lastTickPosY = entity.getY(); + entity.lastTickPosZ = entity.getZ(); } public void setPositionOffset(Vec3d position, boolean immediate) { @@ -119,7 +113,7 @@ public class ParrotElement extends AnimatedSceneElement { .getRenderManager(); if (entity == null) - pose.create(world); + entity = pose.create(world); ms.push(); ms.translate(location.x, location.y, location.z); @@ -133,45 +127,46 @@ public class ParrotElement extends AnimatedSceneElement { ms.pop(); } - abstract class ParrotPose { + public void setPose(ParrotPose pose) { + this.pose = pose; + } - abstract void tick(PonderScene scene); + public static abstract class ParrotPose { - void create(PonderWorld world) { - entity = new ParrotEntity(EntityType.PARROT, world); + abstract void tick(PonderScene scene, ParrotEntity entity, Vec3d location); + + ParrotEntity create(PonderWorld world) { + ParrotEntity entity = new ParrotEntity(EntityType.PARROT, world); int nextInt = Create.random.nextInt(5); entity.setVariant(nextInt == 1 ? 0 : nextInt); // blue parrots are kinda hard to see + return entity; } } - class DancePose extends ParrotPose { + public static class DancePose extends ParrotPose { @Override - void create(PonderWorld world) { - super.create(world); + ParrotEntity create(PonderWorld world) { + ParrotEntity entity = super.create(world); entity.setPartying(BlockPos.ZERO, true); + return entity; } @Override - void tick(PonderScene scene) { + void tick(PonderScene scene, ParrotEntity entity, Vec3d location) { entity.prevRotationYaw = entity.rotationYaw; entity.rotationYaw -= 2; } } - class FlappyPose extends ParrotPose { + public static class FlappyPose extends ParrotPose { @Override - void create(PonderWorld world) { - super.create(world); - } - - @Override - void tick(PonderScene scene) { + void tick(PonderScene scene, ParrotEntity entity, Vec3d location) { double length = entity.getPositionVec() - .subtract(entity.prevPosX, entity.prevPosY, entity.prevPosZ) + .subtract(entity.lastTickPosX, entity.lastTickPosY, entity.lastTickPosZ) .length(); entity.onGround = false; double phase = Math.min(length * 15, 8); @@ -183,7 +178,7 @@ public class ParrotElement extends AnimatedSceneElement { } - class SpinOnComponentPose extends ParrotPose { + public static class SpinOnComponentPose extends ParrotPose { private BlockPos componentPos; @@ -192,7 +187,7 @@ public class ParrotElement extends AnimatedSceneElement { } @Override - void tick(PonderScene scene) { + void tick(PonderScene scene, ParrotEntity entity, Vec3d location) { TileEntity tileEntity = scene.getWorld() .getTileEntity(componentPos); if (!(tileEntity instanceof KineticTileEntity)) @@ -204,11 +199,11 @@ public class ParrotElement extends AnimatedSceneElement { } - class FacePointOfInterestPose extends ParrotPose { + public static abstract class FaceVecPose extends ParrotPose { @Override - void tick(PonderScene scene) { - Vec3d p_200602_2_ = scene.getPointOfInterest(); + void tick(PonderScene scene, ParrotEntity entity, Vec3d location) { + Vec3d p_200602_2_ = getFacedVec(scene); Vec3d vec3d = location.add(entity.getEyePosition(0)); double d0 = p_200602_2_.x - vec3d.x; double d1 = p_200602_2_.y - vec3d.y; @@ -220,6 +215,31 @@ public class ParrotElement extends AnimatedSceneElement { MathHelper.wrapDegrees((float) -(MathHelper.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); } + protected abstract Vec3d getFacedVec(PonderScene scene); + + } + + public static class FacePointOfInterestPose extends FaceVecPose { + + @Override + protected Vec3d getFacedVec(PonderScene scene) { + return scene.getPointOfInterest(); + } + + } + + public static class FaceCursorPose extends FaceVecPose { + + @Override + protected Vec3d getFacedVec(PonderScene scene) { + Minecraft minecraft = Minecraft.getInstance(); + MainWindow w = minecraft.getWindow(); + double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); + double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); + return scene.getTransform() + .screenToScene(mouseX, mouseY, 300); + } + } } diff --git a/src/main/resources/assets/create/models/block/analog_lever/item.json b/src/main/resources/assets/create/models/block/analog_lever/item.json index 01b9ee73e..855add131 100644 --- a/src/main/resources/assets/create/models/block/analog_lever/item.json +++ b/src/main/resources/assets/create/models/block/analog_lever/item.json @@ -67,7 +67,7 @@ }, "fixed": { "rotation": [-90, 0, 0], - "translation": [0, 0, -6], + "translation": [0, 0, -5.25], "scale": [0.75, 0.75, 0.75] } }, diff --git a/src/main/resources/assets/create/models/block/belt/start.json b/src/main/resources/assets/create/models/block/belt/start.json index ff4a6eed9..1402bc0ac 100644 --- a/src/main/resources/assets/create/models/block/belt/start.json +++ b/src/main/resources/assets/create/models/block/belt/start.json @@ -9,6 +9,7 @@ "name": "Top", "from": [3, 10, 2], "to": [13, 11, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [3, 0, 4, 14], "rotation": 270, "texture": "#0"}, "west": {"uv": [12, 0, 13, 14], "rotation": 90, "texture": "#0"}, @@ -19,6 +20,7 @@ "name": "Top", "from": [1, 11, 1], "to": [15, 13, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [1, 15, 15, 16], "texture": "#0"}, "east": {"uv": [0, 0, 2, 15], "rotation": 270, "texture": "#0"}, @@ -31,6 +33,7 @@ "name": "Side", "from": [1.1, 4, 0], "to": [14.9, 12, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [1, 0, 15, 8], "texture": "#0"}, "east": {"uv": [0, 0, 2, 8], "texture": "#0"}, @@ -44,10 +47,11 @@ "name": "Side", "from": [3, 6, 2], "to": [13, 10, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "east": {"uv": [3, 6, 4, 10], "rotation": 180, "texture": "#0"}, + "east": {"uv": [3, 6, 4, 10], "texture": "#0"}, "south": {"uv": [3, 2, 13, 6], "texture": "#0"}, - "west": {"uv": [12, 6, 13, 10], "rotation": 180, "texture": "#0"} + "west": {"uv": [12, 6, 13, 10], "texture": "#0"} } } ] diff --git a/src/main/resources/assets/create/models/block/diodes/adjustable_pulse_repeater.json b/src/main/resources/assets/create/models/block/diodes/adjustable_pulse_repeater.json index 685e4b7b6..6481341d8 100644 --- a/src/main/resources/assets/create/models/block/diodes/adjustable_pulse_repeater.json +++ b/src/main/resources/assets/create/models/block/diodes/adjustable_pulse_repeater.json @@ -60,6 +60,11 @@ } ], "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, "fixed": { "rotation": [ 270, 0, 0 ], "translation": [ 0, 0, -3], diff --git a/src/main/resources/assets/create/models/block/diodes/adjustable_repeater.json b/src/main/resources/assets/create/models/block/diodes/adjustable_repeater.json index 7cd8a0331..cf137e612 100644 --- a/src/main/resources/assets/create/models/block/diodes/adjustable_repeater.json +++ b/src/main/resources/assets/create/models/block/diodes/adjustable_repeater.json @@ -34,6 +34,11 @@ } ], "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, "fixed": { "rotation": [ 270, 0, 0 ], "translation": [ 0, 0, -3], diff --git a/src/main/resources/assets/create/models/block/diodes/latch_off.json b/src/main/resources/assets/create/models/block/diodes/latch_off.json index b1fdfac10..4e8ce60be 100644 --- a/src/main/resources/assets/create/models/block/diodes/latch_off.json +++ b/src/main/resources/assets/create/models/block/diodes/latch_off.json @@ -90,11 +90,16 @@ } } ], - "groups": [0, 1, 2, 3, 4, - { - "name": "lever", - "origin": [8, 8, 8], - "children": [5, 6] - } - ] + "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [ 270, 0, 0 ], + "translation": [ 0, 0, -3], + "scale":[ 0.5, 0.5, 0.5 ] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/diodes/latch_on.json b/src/main/resources/assets/create/models/block/diodes/latch_on.json index 8354678e8..6d4c4797f 100644 --- a/src/main/resources/assets/create/models/block/diodes/latch_on.json +++ b/src/main/resources/assets/create/models/block/diodes/latch_on.json @@ -92,11 +92,16 @@ } } ], - "groups": [0, 1, 2, 3, 4, - { - "name": "lever", - "origin": [8, 8, 8], - "children": [5, 6] - } - ] + "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [ 270, 0, 0 ], + "translation": [ 0, 0, -3], + "scale":[ 0.5, 0.5, 0.5 ] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/diodes/pulse_repeater.json b/src/main/resources/assets/create/models/block/diodes/pulse_repeater.json index 8504219bf..315d2fed2 100644 --- a/src/main/resources/assets/create/models/block/diodes/pulse_repeater.json +++ b/src/main/resources/assets/create/models/block/diodes/pulse_repeater.json @@ -46,5 +46,17 @@ "up": { "texture": "#torch", "uv": [ 7, 6, 9, 8 ] } } } - ] + ], + "display": { + "gui": { + "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], + "scale": [0.625, 0.625, 0.625] + }, + "fixed": { + "rotation": [ 270, 0, 0 ], + "translation": [ 0, 0, -3], + "scale":[ 0.5, 0.5, 0.5 ] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/redstone_link/transmitter.json b/src/main/resources/assets/create/models/block/redstone_link/transmitter.json index 133eae26f..235a9a0e5 100644 --- a/src/main/resources/assets/create/models/block/redstone_link/transmitter.json +++ b/src/main/resources/assets/create/models/block/redstone_link/transmitter.json @@ -51,7 +51,13 @@ "display": { "gui": { "rotation": [30, 45, 0], + "translation": [0, 2.5, 0], "scale": [0.625, 0.625, 0.625] - } - } + }, + "fixed": { + "rotation": [ 270, 0, 0 ], + "translation": [ 0, 0, -3], + "scale":[ 0.5, 0.5, 0.5 ] + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/create/models/block/sail_frame.json b/src/main/resources/assets/create/models/block/sail_frame.json index da4b090fe..6240b3aee 100644 --- a/src/main/resources/assets/create/models/block/sail_frame.json +++ b/src/main/resources/assets/create/models/block/sail_frame.json @@ -131,7 +131,7 @@ "scale": [0.25, 0.25, 0.25] }, "gui": { - "rotation": [30, 225, 0], + "rotation": [30, 315, -90], "scale": [0.625, 0.625, 0.625] }, "fixed": { diff --git a/src/main/resources/assets/create/models/block/white_sail.json b/src/main/resources/assets/create/models/block/white_sail.json index 413810a92..dbeda7194 100644 --- a/src/main/resources/assets/create/models/block/white_sail.json +++ b/src/main/resources/assets/create/models/block/white_sail.json @@ -129,7 +129,7 @@ "scale": [0.25, 0.25, 0.25] }, "gui": { - "rotation": [30, 225, 0], + "rotation": [30, 315, -90], "scale": [0.625, 0.625, 0.625] }, "fixed": { From a91360a7b936f3177d0b448ca9f4b931add7b5f4 Mon Sep 17 00:00:00 2001 From: zelophed Date: Tue, 9 Mar 2021 03:45:05 +0100 Subject: [PATCH 074/124] changing format - goggle overlays now use a localized number format - minor changes to the layout of the ponder index screen --- .../goggles/IHaveGoggleInformation.java | 32 +++++- .../simibubi/create/events/ClientEvents.java | 8 ++ .../foundation/ResourceReloadHandler.java | 3 +- .../ponder/content/PonderIndexScreen.java | 105 +++++++++++++----- 4 files changed, 116 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java index a41378ffa..1c21fe6b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java +++ b/src/main/java/com/simibubi/create/content/contraptions/goggles/IHaveGoggleInformation.java @@ -1,10 +1,7 @@ package com.simibubi.create.content.contraptions.goggles; -import java.text.DecimalFormat; -import java.util.List; - import com.simibubi.create.foundation.utility.Lang; - +import net.minecraft.client.Minecraft; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; @@ -13,12 +10,16 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; +import java.text.NumberFormat; +import java.util.List; +import java.util.Locale; + /* * Implement this Interface in the TileEntity class that wants to add info to the screen * */ public interface IHaveGoggleInformation { - DecimalFormat decimalFormat = new DecimalFormat("#.##"); + Format numberFormat = new Format(); String spacing = " "; /** @@ -33,7 +34,7 @@ public interface IHaveGoggleInformation { } static String format(double d) { - return decimalFormat.format(d); + return numberFormat.get().format(d); } default boolean containedFluidTooltip(List tooltip, boolean isPlayerSneaking, @@ -89,4 +90,23 @@ public interface IHaveGoggleInformation { return true; } + class Format { + + private NumberFormat format = NumberFormat.getNumberInstance(Locale.ROOT);; + + private Format() {} + + public NumberFormat get() { + return format; + } + + public void update() { + format = NumberFormat.getInstance(Minecraft.getInstance().getLanguageManager().getCurrentLanguage().getJavaLocale()); + format.setMaximumFractionDigits(2); + format.setMinimumFractionDigits(0); + format.setGroupingUsed(true); + } + + } + } diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index fbb370c09..2448ef2ba 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -14,6 +14,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.tra import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.CapabilityMinecartController; import com.simibubi.create.content.contraptions.components.turntable.TurntableHandler; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.contraptions.relays.belt.item.BeltConnectorHandler; import com.simibubi.create.content.curiosities.tools.ExtendoGripRenderHandler; import com.simibubi.create.content.curiosities.zapper.ZapperItem; @@ -124,6 +125,13 @@ public class ClientEvents { AnimationTickHolder.reset(); ((ClientWorld) world).loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); } + + /* + i was getting nullPointers when trying to call this during client setup, + so i assume minecraft's language manager isn't yet fully loaded at that time. + not sure where else to call this tho :S + */ + IHaveGoggleInformation.numberFormat.update(); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java index 6342594b9..0bb2d6f73 100644 --- a/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ResourceReloadHandler.java @@ -1,8 +1,8 @@ package com.simibubi.create.foundation; import com.simibubi.create.CreateClient; +import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.block.render.SpriteShifter; - import net.minecraft.client.resources.ReloadListener; import net.minecraft.profiler.IProfiler; import net.minecraft.resources.IResourceManager; @@ -18,6 +18,7 @@ public class ResourceReloadHandler extends ReloadListener { protected void apply(Object $, IResourceManager resourceManagerIn, IProfiler profilerIn) { SpriteShifter.reloadUVs(); CreateClient.invalidateRenderers(); + IHaveGoggleInformation.numberFormat.update(); } } 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 a8176db77..364ce0797 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 @@ -1,6 +1,8 @@ package com.simibubi.create.foundation.ponder.content; import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.gui.UIRenderHelper; @@ -13,10 +15,12 @@ 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.BlockItem; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; import net.minecraftforge.registries.ForgeRegistries; +import org.apache.commons.lang3.mutable.MutableBoolean; import java.util.ArrayList; import java.util.List; @@ -31,7 +35,7 @@ public class PonderIndexScreen extends AbstractSimiScreen { protected final List items; private final double itemXmult = 0.5; - private final double itemYmult = 0.75; + private double itemYmult = 0.75; protected Rectangle2d itemArea; private ItemStack hoveredItem = ItemStack.EMPTY; @@ -45,11 +49,31 @@ public class PonderIndexScreen extends AbstractSimiScreen { protected void init() { super.init(); + //populate lists widgets.clear(); chapters.clear(); - chapters.addAll(PonderRegistry.chapters.getAllChapters()); + //chapters.addAll(PonderRegistry.chapters.getAllChapters()); + 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) + .filter(PonderIndexScreen::exclusions) + .forEach(items::add); + + boolean hasChapters = !chapters.isEmpty(); + + //setup chapters LayoutHelper layout = LayoutHelper.centeredHorizontal( chapters.size(), MathHelper.clamp((int) Math.ceil(chapters.size() / 4f), 1, 4), @@ -73,24 +97,15 @@ public class PonderIndexScreen extends AbstractSimiScreen { 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); + //setup items + if (!hasChapters) { + itemYmult = 0.5; + } + int maxItemRows = hasChapters ? 4 : 7; layout = LayoutHelper.centeredHorizontal( items.size(), - MathHelper.clamp((int) Math.ceil(items.size() / 11f), 1, 4), + MathHelper.clamp((int) Math.ceil(items.size() / 11f), 1, maxItemRows), 28, 28, 8 @@ -100,8 +115,13 @@ 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, (x, y) -> {}) - .showing(new ItemStack(item)); + PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, (x, y) -> { + if (!PonderRegistry.all.containsKey(item.getRegistryName())) + return; + + centerScalingOn(x, y); + ScreenOpener.transitionTo(PonderUI.of(new ItemStack(item))); + }).showing(new ItemStack(item)); button.fade(1); widgets.add(button); @@ -111,6 +131,15 @@ public class PonderIndexScreen extends AbstractSimiScreen { } + private static boolean exclusions(Item item) { + if (item instanceof BlockItem) { + Block block = ((BlockItem) item).getBlock(); + if (block instanceof ValveHandleBlock && !AllBlocks.COPPER_VALVE_HANDLE.is(item)) return false; + } + + return true; + } + @Override public void tick() { super.tick(); @@ -132,14 +161,15 @@ public class PonderIndexScreen extends AbstractSimiScreen { int x = (int) (width * chapterXmult); int y = (int) (height * chapterYmult); - RenderSystem.pushMatrix(); - RenderSystem.translated(x, y, 0); + if (!chapters.isEmpty()) { + 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(); + 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); @@ -166,6 +196,31 @@ public class PonderIndexScreen extends AbstractSimiScreen { RenderSystem.popMatrix(); } + @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 btn = (PonderButton) w; + btn.runCallback(x, y); + handled.setTrue(); + } + }); + + if (handled.booleanValue()) + return true; + return super.mouseClicked(x, y, button); + } + + @Override + public boolean isEquivalentTo(AbstractSimiScreen other) { + return other instanceof PonderIndexScreen; + } + public ItemStack getHoveredTooltipItem() { return hoveredItem; } From d61b840c5c07c9f1ac029b142534d1897b0ce612 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 9 Mar 2021 04:24:45 +0100 Subject: [PATCH 075/124] Back to fighting Minecarts - Fixed Minecart Contraptions started on a powered rail facing in unwanted directions - Fixed powered rail Cart Assemblers not respecting the solid block rule of powered rails - Fixed Minecart contraption items not facing away from the player when placed - Polished every last bit of the belt uvs --- .../AbstractContraptionEntity.java | 2 +- .../OrientedContraptionEntity.java | 45 ++++++++++------ .../mounted/CartAssemblerBlock.java | 51 +++++++++++++------ .../mounted/MinecartContraptionItem.java | 7 ++- .../models/block/belt/diagonal_end.json | 12 +++-- .../assets/create/models/block/belt/end.json | 10 ++-- .../create/models/block/belt/start.json | 4 +- .../models/block/belt/start_bottom.json | 4 +- 8 files changed, 93 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java index 3a9bd106d..867d8d685 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/AbstractContraptionEntity.java @@ -58,7 +58,7 @@ public abstract class AbstractContraptionEntity extends Entity implements IEntit protected Contraption contraption; protected boolean initialized; - private boolean prevPosInvalid; + protected boolean prevPosInvalid; private boolean ticking; public AbstractContraptionEntity(EntityType entityTypeIn, World worldIn) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java index 6d241061a..b5d3c21e7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/OrientedContraptionEntity.java @@ -64,6 +64,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { protected boolean forceAngle; private boolean isSerializingFurnaceCart; private boolean attachedExtraInventories; + private boolean manuallyPlaced; public float prevYaw; public float yaw; @@ -94,6 +95,14 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { return entity; } + public static OrientedContraptionEntity createAtYaw(World world, Contraption contraption, + Optional initialOrientation, float initialYaw) { + OrientedContraptionEntity entity = create(world, contraption, initialOrientation); + entity.startAtYaw(initialYaw); + entity.manuallyPlaced = true; + return entity; + } + public void setInitialOrientation(Direction direction) { dataManager.set(INITIAL_ORIENTATION, direction); } @@ -153,6 +162,11 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { if (compound.contains("InitialOrientation")) setInitialOrientation(NBTHelper.readEnum(compound, "InitialOrientation", Direction.class)); + + yaw = compound.getFloat("Yaw"); + pitch = compound.getFloat("Pitch"); + manuallyPlaced = compound.getBoolean("Placed"); + if (compound.contains("ForceYaw")) startAtYaw(compound.getFloat("ForceYaw")); @@ -164,9 +178,6 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { setMotion(Vec3d.ZERO); } - yaw = compound.getFloat("Yaw"); - pitch = compound.getFloat("Pitch"); - setCouplingId( compound.contains("OnCoupling") ? NBTUtil.readUniqueId(compound.getCompound("OnCoupling")) : null); } @@ -188,6 +199,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { forceAngle = false; } + compound.putBoolean("Placed", manuallyPlaced); compound.putFloat("Yaw", yaw); compound.putFloat("Pitch", pitch); @@ -198,7 +210,7 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { @Override public void notifyDataManagerChange(DataParameter key) { super.notifyDataManagerChange(key); - if (key == INITIAL_ORIENTATION && isInitialOrientationPresent()) + if (key == INITIAL_ORIENTATION && isInitialOrientationPresent() && !manuallyPlaced) startAtInitialYaw(); } @@ -357,14 +369,16 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { boolean rotating = false; Vec3d movementVector = riding.getMotion(); - + Vec3d locationDiff = riding.getPositionVec() + .subtract(riding.prevPosX, riding.prevPosY, riding.prevPosZ); if (!(riding instanceof AbstractMinecartEntity)) - movementVector = getPositionVec().subtract(prevPosX, prevPosY, prevPosZ); + movementVector = locationDiff; Vec3d motion = movementVector.normalize(); if (!isInitialOrientationPresent() && !world.isRemote) { - if (motion.length() > 0) { - Direction facingFromVector = Direction.getFacingFromVector(motion.x, motion.y, motion.z); + if (locationDiff.length() > 0) { + Direction facingFromVector = + Direction.getFacingFromVector(locationDiff.x, locationDiff.y, locationDiff.z); if (initialYawOffset != -1) facingFromVector = Direction.fromAngle(facingFromVector.getHorizontalAngle() - initialYawOffset); if (facingFromVector.getAxis() @@ -520,12 +534,12 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { for (MatrixStack stack : matrixStacks) MatrixStacker.of(stack) - .nudge(getEntityId()) - .centre() - .rotateY(angleYaw) - .rotateZ(anglePitch) - .rotateY(angleInitialYaw) - .unCentre(); + .nudge(getEntityId()) + .centre() + .rotateY(angleYaw) + .rotateZ(anglePitch) + .rotateY(angleInitialYaw) + .unCentre(); } @OnlyIn(Dist.CLIENT) @@ -541,7 +555,8 @@ public class OrientedContraptionEntity extends AbstractContraptionEntity { private void repositionOnCart(float partialTicks, MatrixStack[] matrixStacks, Entity ridingEntity) { Vec3d cartPos = getCartOffset(partialTicks, ridingEntity); - if (cartPos == Vec3d.ZERO) return; + if (cartPos == Vec3d.ZERO) + return; for (MatrixStack stack : matrixStacks) stack.translate(cartPos.x, cartPos.y, cartPos.z); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index f6f67fe4f..786c994a4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -92,15 +92,18 @@ public class CartAssemblerBlock extends AbstractRailBlock } private static Item getRailItem(BlockState state) { - return state.get(RAIL_TYPE).getItem(); + return state.get(RAIL_TYPE) + .getItem(); } public static BlockState getRailBlock(BlockState state) { - AbstractRailBlock railBlock = (AbstractRailBlock) state.get(RAIL_TYPE).getBlock(); + AbstractRailBlock railBlock = (AbstractRailBlock) state.get(RAIL_TYPE) + .getBlock(); BlockState railState = railBlock.getDefaultState() .with(railBlock.getShapeProperty(), state.get(RAIL_SHAPE)); if (railState.has(ControllerRailBlock.BACKWARDS)) { - railState = railState.with(ControllerRailBlock.BACKWARDS, state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS); + railState = railState.with(ControllerRailBlock.BACKWARDS, + state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS); } return railState; } @@ -145,11 +148,22 @@ public class CartAssemblerBlock extends AbstractRailBlock disassemble(world, pos, cart); if (action == CartAssemblerAction.ASSEMBLE_ACCELERATE) { Direction facing = cart.getAdjustedHorizontalFacing(); + + RailShape railShape = state.get(RAIL_SHAPE); + for (Direction d : Iterate.directionsInAxis(railShape == RailShape.EAST_WEST ? Axis.X : Axis.Z)) + if (world.getBlockState(pos.offset(d)) + .isNormalCube(world, pos.offset(d))) + facing = d.getOpposite(); + float speed = getRailMaxSpeed(state, world, pos, cart); cart.setMotion(facing.getXOffset() * speed, facing.getYOffset() * speed, facing.getZOffset() * speed); } if (action == CartAssemblerAction.ASSEMBLE_ACCELERATE_DIRECTIONAL) { - Vec3i accelerationVector = ControllerRailBlock.getAccelerationVector(AllBlocks.CONTROLLER_RAIL.getDefaultState().with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)).with(ControllerRailBlock.BACKWARDS, state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS)); + Vec3i accelerationVector = + ControllerRailBlock.getAccelerationVector(AllBlocks.CONTROLLER_RAIL.getDefaultState() + .with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)) + .with(ControllerRailBlock.BACKWARDS, + state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS)); float speed = getRailMaxSpeed(state, world, pos, cart); cart.setMotion(new Vec3d(accelerationVector).scale(speed)); } @@ -192,7 +206,8 @@ public class CartAssemblerBlock extends AbstractRailBlock .isEmpty() ? CartAssemblerAction.ASSEMBLE_ACCELERATE : CartAssemblerAction.DISASSEMBLE; if (type == CartAssembleRailType.CONTROLLER_RAIL || type == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS) - return powered ? CartAssemblerAction.ASSEMBLE_ACCELERATE_DIRECTIONAL : CartAssemblerAction.DISASSEMBLE_BRAKE; + return powered ? CartAssemblerAction.ASSEMBLE_ACCELERATE_DIRECTIONAL + : CartAssemblerAction.DISASSEMBLE_BRAKE; return CartAssemblerAction.PASS; } @@ -241,10 +256,9 @@ public class CartAssemblerBlock extends AbstractRailBlock .isCoupledThroughContraption()) return; - Optional assembler = getTileEntityOptional(world, pos); CartMovementMode mode = assembler.map(te -> CartMovementMode.values()[te.movementMode.value]) - .orElse(CartMovementMode.ROTATE); + .orElse(CartMovementMode.ROTATE); MountedContraption contraption = new MountedContraption(mode); try { @@ -485,15 +499,22 @@ public class CartAssemblerBlock extends AbstractRailBlock if (world.isRemote) return ActionResultType.SUCCESS; BlockPos pos = context.getPos(); - BlockState newState = state.with(RAIL_SHAPE, state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH); - if (state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL || state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS) { - newState = newState.with(RAIL_TYPE, AllBlocks.CONTROLLER_RAIL.get().rotate(AllBlocks.CONTROLLER_RAIL.getDefaultState() - .with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)).with(ControllerRailBlock.BACKWARDS, - state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS), Rotation.CLOCKWISE_90) - .get(ControllerRailBlock.BACKWARDS) ? CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS : CartAssembleRailType.CONTROLLER_RAIL); + BlockState newState = state.with(RAIL_SHAPE, + state.get(RAIL_SHAPE) == RailShape.NORTH_SOUTH ? RailShape.EAST_WEST : RailShape.NORTH_SOUTH); + if (state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL + || state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS) { + newState = newState.with(RAIL_TYPE, AllBlocks.CONTROLLER_RAIL.get() + .rotate(AllBlocks.CONTROLLER_RAIL.getDefaultState() + .with(ControllerRailBlock.SHAPE, state.get(RAIL_SHAPE)) + .with(ControllerRailBlock.BACKWARDS, + state.get(RAIL_TYPE) == CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS), + Rotation.CLOCKWISE_90) + .get(ControllerRailBlock.BACKWARDS) ? CartAssembleRailType.CONTROLLER_RAIL_BACKWARDS + : CartAssembleRailType.CONTROLLER_RAIL); } - context.getWorld().setBlockState(pos, newState, 3); - world.notifyNeighborsOfStateChange(pos.down(), this); + context.getWorld() + .setBlockState(pos, newState, 3); + world.notifyNeighborsOfStateChange(pos.down(), this); return ActionResultType.SUCCESS; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java index 6c38f9c41..75058a61a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/MinecartContraptionItem.java @@ -169,7 +169,9 @@ public class MinecartContraptionItem extends Item { Contraption mountedContraption = Contraption.fromNBT(world, contraptionTag, false); OrientedContraptionEntity contraptionEntity = - OrientedContraptionEntity.create(world, mountedContraption, intialOrientation); + newFacing == null ? OrientedContraptionEntity.create(world, mountedContraption, intialOrientation) + : OrientedContraptionEntity.createAtYaw(world, mountedContraption, intialOrientation, + newFacing.getHorizontalAngle()); contraptionEntity.startRiding(cart); contraptionEntity.setPosition(cart.getX(), cart.getY(), cart.getZ()); @@ -209,7 +211,8 @@ public class MinecartContraptionItem extends Item { OrientedContraptionEntity contraption = (OrientedContraptionEntity) passengers.get(0); if (!event.getWorld().isRemote) { - player.inventory.placeItemBackInInventory(event.getWorld(), create(type, contraption).setDisplayName(entity.getCustomName())); + player.inventory.placeItemBackInInventory(event.getWorld(), + create(type, contraption).setDisplayName(entity.getCustomName())); contraption.remove(); entity.remove(); } diff --git a/src/main/resources/assets/create/models/block/belt/diagonal_end.json b/src/main/resources/assets/create/models/block/belt/diagonal_end.json index 5a73025f5..02bd2d2d7 100644 --- a/src/main/resources/assets/create/models/block/belt/diagonal_end.json +++ b/src/main/resources/assets/create/models/block/belt/diagonal_end.json @@ -10,6 +10,7 @@ "name": "Bottom", "from": [0.9, 3, 1], "to": [15.1, 5, 6.8], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [1, 6, 15, 7], "rotation": 180, "texture": "#0"}, "east": {"uv": [14, 0, 16, 6], "rotation": 270, "texture": "#0"}, @@ -22,6 +23,7 @@ "name": "Bottom", "from": [2.9, 5, 2], "to": [13.1, 6, 6.8], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [3, 0, 4, 5], "rotation": 270, "texture": "#0"}, "west": {"uv": [12, 0, 13, 5], "rotation": 90, "texture": "#0"}, @@ -32,8 +34,9 @@ "name": "Top", "from": [0.9, 11, 1], "to": [15.1, 13, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [1, 6, 15, 5], "rotation": 180, "texture": "#0"}, + "north": {"uv": [1, 5, 15, 6], "rotation": 180, "texture": "#0"}, "east": {"uv": [14, 6, 16, 15], "rotation": 90, "texture": "#0"}, "west": {"uv": [0, 6, 2, 15], "rotation": 270, "texture": "#0"}, "up": {"uv": [1, 6, 15, 15], "texture": "#0"}, @@ -44,6 +47,7 @@ "name": "Top", "from": [2.9, 10, 2], "to": [13.1, 11, 10.1], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [3, 7, 4, 15], "rotation": 90, "texture": "#0"}, "west": {"uv": [12, 7, 13, 15], "rotation": 270, "texture": "#0"}, @@ -54,19 +58,21 @@ "name": "Side", "from": [1, 4, 0], "to": [15, 12, 2], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [1, 8, 15, 16], "rotation": 180, "texture": "#0"}, "east": {"uv": [14, 8, 16, 16], "rotation": 180, "texture": "#0"}, "south": {"uv": [1, 8, 15, 16], "rotation": 180, "texture": "#0"}, "west": {"uv": [0, 8, 2, 16], "rotation": 180, "texture": "#0"}, - "up": {"uv": [1, 4, 15, 5], "rotation": 180, "texture": "#0"}, - "down": {"uv": [1, 7, 15, 8], "rotation": 180, "texture": "#0"} + "up": {"uv": [1, 4, 15, 5], "texture": "#0"}, + "down": {"uv": [1, 7, 15, 8], "texture": "#0"} } }, { "name": "Side", "from": [2.9, 6, 2], "to": [13.1, 10, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [3, 10, 4, 14], "rotation": 180, "texture": "#0"}, "south": {"uv": [3, 10, 13, 14], "rotation": 180, "texture": "#0"}, diff --git a/src/main/resources/assets/create/models/block/belt/end.json b/src/main/resources/assets/create/models/block/belt/end.json index 142f58c71..d8f167443 100644 --- a/src/main/resources/assets/create/models/block/belt/end.json +++ b/src/main/resources/assets/create/models/block/belt/end.json @@ -9,9 +9,10 @@ "name": "Top", "from": [1, 11, 0], "to": [15, 13, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [0, 1, 2, 16], "rotation": 270, "texture": "#0"}, - "south": {"uv": [1, 1, 15, 0], "texture": "#0"}, + "south": {"uv": [1, 0, 15, 1], "rotation": 180, "texture": "#0"}, "west": {"uv": [14, 1, 16, 16], "rotation": 90, "texture": "#0"}, "up": {"uv": [1, 1, 15, 16], "rotation": 180, "texture": "#0"}, "down": {"uv": [1, 1, 15, 16], "texture": "#0"} @@ -21,6 +22,7 @@ "name": "Top", "from": [3, 10, 0], "to": [13, 11, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [3, 2, 4, 16], "rotation": 270, "texture": "#0"}, "west": {"uv": [12, 2, 13, 16], "rotation": 90, "texture": "#0"}, @@ -31,19 +33,21 @@ "name": "Side", "from": [1.1, 4, 14], "to": [14.9, 12, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [1, 8, 15, 16], "rotation": 180, "texture": "#0"}, "east": {"uv": [0, 8, 2, 16], "rotation": 180, "texture": "#0"}, "south": {"uv": [1, 8, 15, 16], "rotation": 180, "texture": "#0"}, "west": {"uv": [14, 8, 16, 16], "rotation": 180, "texture": "#0"}, - "up": {"uv": [1, 15, 15, 16], "rotation": 180, "texture": "#0"}, - "down": {"uv": [1, 8, 15, 9], "rotation": 180, "texture": "#0"} + "up": {"uv": [1, 0, 15, 1], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 7, 15, 8], "rotation": 180, "texture": "#0"} } }, { "name": "Side", "from": [3, 6, 13], "to": [13, 10, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [3, 10, 13, 14], "rotation": 180, "texture": "#0"}, "east": {"uv": [12, 10, 13, 14], "rotation": 180, "texture": "#0"}, diff --git a/src/main/resources/assets/create/models/block/belt/start.json b/src/main/resources/assets/create/models/block/belt/start.json index 1402bc0ac..c262e4bb5 100644 --- a/src/main/resources/assets/create/models/block/belt/start.json +++ b/src/main/resources/assets/create/models/block/belt/start.json @@ -39,8 +39,8 @@ "east": {"uv": [0, 0, 2, 8], "texture": "#0"}, "south": {"uv": [1, 0, 15, 8], "texture": "#0"}, "west": {"uv": [14, 0, 16, 8], "texture": "#0"}, - "up": {"uv": [1, 0, 15, 1], "rotation": 180, "texture": "#0"}, - "down": {"uv": [1, 7, 15, 8], "rotation": 180, "texture": "#0"} + "up": {"uv": [1, 15, 15, 16], "rotation": 180, "texture": "#0"}, + "down": {"uv": [1, 8, 15, 9], "rotation": 180, "texture": "#0"} } }, { diff --git a/src/main/resources/assets/create/models/block/belt/start_bottom.json b/src/main/resources/assets/create/models/block/belt/start_bottom.json index cecb17d1d..bacf34a55 100644 --- a/src/main/resources/assets/create/models/block/belt/start_bottom.json +++ b/src/main/resources/assets/create/models/block/belt/start_bottom.json @@ -9,8 +9,9 @@ "name": "Bottom", "from": [1, 3, 1], "to": [15, 5, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { - "north": {"uv": [1, 0, 15, 1], "rotation": 180, "texture": "#1"}, + "north": {"uv": [1, 0, 15, 1], "texture": "#1"}, "east": {"uv": [0, 1, 2, 16], "rotation": 90, "texture": "#1"}, "west": {"uv": [14, 1, 16, 16], "rotation": 270, "texture": "#1"}, "up": {"uv": [1, 1, 15, 16], "texture": "#1"}, @@ -21,6 +22,7 @@ "name": "Bottom", "from": [3, 5, 2], "to": [13, 6, 16], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "east": {"uv": [12, 2, 13, 16], "rotation": 90, "texture": "#1"}, "west": {"uv": [3, 2, 4, 16], "rotation": 270, "texture": "#1"}, From 6b999fa7d40daee595ade1ec674a499ca4af8556 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 9 Mar 2021 17:32:01 +0100 Subject: [PATCH 076/124] Tag hopping - Ponder UIs opened from a tag screen now skip to the first scene with a matching tag if available --- .../foundation/gui/AbstractSimiScreen.java | 11 ++-- .../create/foundation/gui/ScreenOpener.java | 12 +++-- .../foundation/ponder/PonderRegistry.java | 30 ++++++++--- .../create/foundation/ponder/PonderUI.java | 34 +++++++++++++ .../ponder/content/PonderIndex.java | 50 ++++++++++++------- .../ponder/content/PonderTagScreen.java | 4 +- .../foundation/ponder/ui/PonderButton.java | 2 +- 7 files changed, 104 insertions(+), 39 deletions(-) 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 874bfeba7..fd3982b1b 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.gui; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import org.apache.commons.lang3.mutable.MutableBoolean; @@ -145,7 +146,7 @@ public abstract class AbstractSimiScreen extends Screen { return true; if (code == GLFW.GLFW_KEY_BACKSPACE) { - ScreenOpener.openPreviousScreen(this); + ScreenOpener.openPreviousScreen(this, Optional.empty()); return true; } @@ -242,9 +243,7 @@ public abstract class AbstractSimiScreen extends Screen { private static String screenTitle(Screen screen) { if (screen instanceof AbstractSimiScreen) return ((AbstractSimiScreen) screen).getBreadcrumbTitle(); - - return screen.getClass() - .getSimpleName(); + return "<"; } protected String getBreadcrumbTitle() { @@ -275,9 +274,11 @@ 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; } + public void shareContextWith(AbstractSimiScreen other) {} + } 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 82f736791..dbecc7e51 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -4,6 +4,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List; +import java.util.Optional; import javax.annotation.Nullable; @@ -34,14 +35,17 @@ public class ScreenOpener { openScreen(toOpen); } - public static void openPreviousScreen(Screen current) { + public static void openPreviousScreen(Screen current, Optional screenWithContext) { if (backStack.isEmpty()) return; backSteppedFrom = current; Screen previousScreen = backStack.pop(); - if (previousScreen instanceof AbstractSimiScreen) - ((AbstractSimiScreen) previousScreen).transition.startWithValue(-0.1) + if (previousScreen instanceof AbstractSimiScreen) { + AbstractSimiScreen previousAbstractSimiScreen = (AbstractSimiScreen) previousScreen; + screenWithContext.ifPresent(s -> s.shareContextWith(previousAbstractSimiScreen)); + previousAbstractSimiScreen.transition.startWithValue(-0.1) .chase(-1, .4f, LerpedFloat.Chaser.EXP); + } openScreen(previousScreen); } @@ -65,7 +69,7 @@ public class ScreenOpener { if (!screen.isEquivalentTo((AbstractSimiScreen) previouslyRenderedScreen)) return false; - openPreviousScreen(Minecraft.getInstance().currentScreen); + openPreviousScreen(Minecraft.getInstance().currentScreen, Optional.of(screen)); return true; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 74f7e7ec5..6c7bf9cbb 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -39,15 +39,20 @@ public class PonderRegistry { public static final PonderChapterRegistry chapters = new PonderChapterRegistry(); public static Map> all = new HashMap<>(); - public static PonderSceneBuilder addStoryBoard(ItemProviderEntry component, String schematic, PonderStoryBoard storyBoard) { + public static PonderSceneBuilder addStoryBoard(ItemProviderEntry component, String schematic, + PonderStoryBoard storyBoard, PonderTag... tags) { ResourceLocation id = component.getId(); PonderStoryBoardEntry entry = new PonderStoryBoardEntry(storyBoard, schematic, id); PonderSceneBuilder builder = new PonderSceneBuilder(entry); - all.computeIfAbsent(id, _$ -> new ArrayList<>()).add(entry); + if (tags.length > 0) + builder.highlightTags(tags); + all.computeIfAbsent(id, _$ -> new ArrayList<>()) + .add(entry); return builder; } - public static PonderSceneBuilder addStoryBoard(PonderChapter chapter, ResourceLocation component, String schematic, PonderStoryBoard storyBoard) { + public static PonderSceneBuilder addStoryBoard(PonderChapter chapter, ResourceLocation component, String schematic, + PonderStoryBoard storyBoard) { if (component == null) component = new ResourceLocation("minecraft", "stick"); @@ -94,7 +99,8 @@ public class PonderRegistry { public static PonderScene compileScene(int i, PonderStoryBoardEntry sb, PonderWorld world) { PonderScene scene = new PonderScene(world, sb.getComponent(), sb.getTags()); SceneBuilder builder = scene.builder(); - sb.getBoard().program(builder, scene.getSceneBuildingUtil()); + sb.getBoard() + .program(builder, scene.getSceneBuildingUtil()); return scene; } @@ -135,10 +141,16 @@ public class PonderRegistry { } public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard) { - return addStoryBoard(schematicPath, storyBoard, PonderSceneBuilder::highlightAllTags); + return addStoryBoard(schematicPath, storyBoard, $ -> { + }); } - public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, Consumer extras) { + public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, PonderTag... tags) { + return addStoryBoard(schematicPath, storyBoard, sb -> sb.highlightTags(tags)); + } + + public MultiSceneBuilder addStoryBoard(String schematicPath, PonderStoryBoard storyBoard, + Consumer extras) { components.forEach(c -> extras.accept(PonderRegistry.addStoryBoard(c, schematicPath, storyBoard))); return this; } @@ -154,12 +166,14 @@ public class PonderRegistry { } public PonderSceneBuilder highlightAllTags() { - entry.getTags().add(PonderTag.Highlight.ALL); + entry.getTags() + .add(PonderTag.Highlight.ALL); return this; } public PonderSceneBuilder highlightTags(PonderTag... tags) { - entry.getTags().addAll(Arrays.asList(tags)); + entry.getTags() + .addAll(Arrays.asList(tags)); return this; } 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 1e5b8bca9..29f877017 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -77,6 +77,7 @@ public class PonderUI extends AbstractSimiScreen { private LerpedFloat lazyIndex; private int index = 0; + private PonderTag referredToByTag; private PonderButton left, right, scan, chap; @@ -85,6 +86,13 @@ public class PonderUI extends AbstractSimiScreen { .getRegistryName())); } + public static PonderUI of(ItemStack item, PonderTag tag) { + PonderUI ponderUI = new PonderUI(PonderRegistry.compile(item.getItem() + .getRegistryName())); + ponderUI.referredToByTag = tag; + return ponderUI; + } + public static PonderUI of(PonderChapter chapter) { PonderUI ui = new PonderUI(PonderRegistry.compile(chapter)); ui.chapter = chapter; @@ -186,6 +194,26 @@ public class PonderUI extends AbstractSimiScreen { @Override public void tick() { super.tick(); + + if (referredToByTag != null) { + for (int i = 0; i < scenes.size(); i++) { + PonderScene ponderScene = scenes.get(i); + if (!ponderScene.tags.contains(referredToByTag)) + continue; + if (i == index) + break; + scenes.get(index) + .fadeOut(); + index = i; + scenes.get(index) + .begin(); + lazyIndex.chase(index, 1 / 4f, Chaser.EXP); + identifyMode = false; + break; + } + referredToByTag = null; + } + PonderScene activeScene = scenes.get(index); if (!identifyMode) activeScene.tick(); @@ -743,4 +771,10 @@ public class PonderUI extends AbstractSimiScreen { return super.isEquivalentTo(other); } + @Override + public void shareContextWith(AbstractSimiScreen other) { + if (other instanceof PonderUI) + ((PonderUI) other).referredToByTag = referredToByTag; + } + } 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 63ad820b8..40cad7990 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,20 +16,22 @@ 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, PonderTag.KINETIC_RELAYS); 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/small", KineticsScenes::cogAsRelay, PonderTag.KINETIC_RELAYS) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp); + PonderRegistry.forComponents(AllBlocks.LARGE_COGWHEEL) .addStoryBoard("cog/speedup", KineticsScenes::cogsSpeedUp) - .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay); + .addStoryBoard("cog/large", KineticsScenes::largeCogAsRelay, PonderTag.KINETIC_RELAYS); + PonderRegistry.forComponents(AllItems.BELT_CONNECTOR) - .addStoryBoard("belt/connect", BeltScenes::beltConnector) + .addStoryBoard("belt/connect", BeltScenes::beltConnector, PonderTag.KINETIC_RELAYS) .addStoryBoard("belt/directions", BeltScenes::directions) - .addStoryBoard("belt/transport", BeltScenes::transport) + .addStoryBoard("belt/transport", BeltScenes::transport, PonderTag.LOGISTICS) .addStoryBoard("belt/encasing", BeltScenes::beltsCanBeEncased); PonderRegistry.forComponents(AllBlocks.ANDESITE_CASING, AllBlocks.BRASS_CASING) @@ -37,31 +39,38 @@ public class PonderIndex { .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); + .addStoryBoard("gearbox", KineticsScenes::gearbox, PonderTag.KINETIC_RELAYS); + + PonderRegistry.addStoryBoard(AllBlocks.CLUTCH, "clutch", KineticsScenes::clutch, PonderTag.KINETIC_RELAYS); + PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, + PonderTag.KINETIC_RELAYS); PonderRegistry.forComponents(AllBlocks.ENCASED_FAN) - .addStoryBoard("fan/direction", FanScenes::direction) + .addStoryBoard("fan/direction", FanScenes::direction, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("fan/processing", FanScenes::processing) - .addStoryBoard("fan/source", FanScenes::source); + .addStoryBoard("fan/source", FanScenes::source, PonderTag.KINETIC_SOURCES); - 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.addStoryBoard(AllBlocks.CREATIVE_MOTOR, "creative_motor", KineticsScenes::creativeMotor, + PonderTag.KINETIC_SOURCES); + PonderRegistry.addStoryBoard(AllBlocks.WATER_WHEEL, "water_wheel", KineticsScenes::waterWheel, + PonderTag.KINETIC_SOURCES); + PonderRegistry.addStoryBoard(AllBlocks.HAND_CRANK, "hand_crank", KineticsScenes::handCrank, + PonderTag.KINETIC_SOURCES); + + PonderRegistry.addStoryBoard(AllBlocks.COPPER_VALVE_HANDLE, "valve_handle", KineticsScenes::valveHandle, + PonderTag.KINETIC_SOURCES); PonderRegistry.forComponents(AllBlocks.DYED_VALVE_HANDLES) .addStoryBoard("valve_handle", KineticsScenes::valveHandle); PonderRegistry.addStoryBoard(AllBlocks.ENCASED_CHAIN_DRIVE, "chain_drive/relay", - ChainDriveScenes::chainDriveAsRelay); + ChainDriveScenes::chainDriveAsRelay, PonderTag.KINETIC_RELAYS); 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) - .addStoryBoard("funnels/intro", FunnelScenes::intro) + .addStoryBoard("funnels/intro", FunnelScenes::intro, PonderTag.LOGISTICS) .addStoryBoard("funnels/direction", FunnelScenes::directionality) .addStoryBoard("funnels/compat", FunnelScenes::compat) .addStoryBoard("funnels/redstone", FunnelScenes::redstone) @@ -69,8 +78,11 @@ public class PonderIndex { 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.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft, + PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); + PonderRegistry.addStoryBoard(AllBlocks.GANTRY_CARRIAGE, "gantry/intro", GantryScenes::introForPinion, + PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); + PonderRegistry.forComponents(AllBlocks.GANTRY_SHAFT, AllBlocks.GANTRY_CARRIAGE) .addStoryBoard("gantry/redstone", GantryScenes::redstone) .addStoryBoard("gantry/direction", GantryScenes::direction) @@ -78,7 +90,7 @@ public class PonderIndex { // Movement Actors PonderRegistry.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) - .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer) + .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, PonderTag.CONTRAPTION_ACTOR) .addStoryBoard("portable_interface/redstone", MovementActorScenes::psiRedstone); // Debug scenes, can be found in game via the Brass Hand 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 822f0e59b..8c03321c9 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 @@ -82,7 +82,7 @@ public class PonderTagScreen extends AbstractSimiScreen { if (!PonderRegistry.all.containsKey(i.getRegistryName())) return; centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(PonderUI.of(new ItemStack(i))); + ScreenOpener.transitionTo(PonderUI.of(new ItemStack(i), tag)); }).showing(new ItemStack(i)); button.fade(1); @@ -99,7 +99,7 @@ public class PonderTagScreen extends AbstractSimiScreen { .getRegistryName())) return; centerScalingOn(mouseX, mouseY); - ScreenOpener.transitionTo(PonderUI.of(tag.getMainItem())); + ScreenOpener.transitionTo(PonderUI.of(tag.getMainItem(), tag)); }).showing(tag.getMainItem()); button.fade(1); 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 1c007367e..c5ff15c2a 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 @@ -95,7 +95,7 @@ public class PonderButton extends AbstractSimiWidget { float flashValue = flash.getValue(partialTicks); if (flashValue > .1f) - fade *= 3 * flashValue + ((Math.sin(AnimationTickHolder.getTicks() + partialTicks) / 6)) / 1f; + fade *= 3 * flashValue + Math.sin((AnimationTickHolder.getTicks() + partialTicks) / 6); int backgroundColor = ColorHelper.applyAlpha(0xdd000000, fade); int borderColorStart = ColorHelper.applyAlpha(isHovered ? 0x70ffffff : 0x40aa9999, fade); From cb063d161c8aa4eca680d231a3e73b093aaa77f7 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 9 Mar 2021 21:17:02 +0100 Subject: [PATCH 077/124] Pondering about Windmills --- .../components/actors/HarvesterRenderer.java | 34 +-- .../actors/HarvesterTileEntity.java | 11 +- .../foundation/ponder/SceneBuilder.java | 9 + .../ponder/content/BearingScenes.java | 198 ++++++++++++++++++ .../ponder/content/PonderIndex.java | 6 + .../ponder/windmill_bearing/source.nbt | Bin 0 -> 820 bytes .../ponder/windmill_bearing/structure.nbt | Bin 0 -> 1120 bytes 7 files changed, 242 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java create mode 100644 src/main/resources/ponder/windmill_bearing/source.nbt create mode 100644 src/main/resources/ponder/windmill_bearing/structure.nbt diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index d3455237d..7a39b6233 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -35,7 +35,8 @@ public class HarvesterRenderer extends SafeTileEntityRenderer type) { super(type); } - + @Override public boolean hasFastRenderer() { return true; - } + } + + // For simulations such as Ponder + float manuallyAnimatedSpeed; + + public void setAnimatedSpeed(float speed) { + manuallyAnimatedSpeed = speed; + } } 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 7dc616f67..17ea8d9a0 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -596,6 +596,15 @@ public class SceneBuilder { modifyTileNBT(selection, teType, consumer, false); } + public void modifyTileEntity(BlockPos position, Class teType, + Consumer consumer) { + addInstruction(scene -> { + TileEntity tileEntity = scene.world.getTileEntity(position); + if (teType.isInstance(tileEntity)) + consumer.accept(teType.cast(tileEntity)); + }); + } + public void modifyTileNBT(Selection selection, Class teType, Consumer consumer, boolean reDrawBlocks) { addInstruction(new TileEntityDataInstruction(selection, teType, nbt -> { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java new file mode 100644 index 000000000..6358cf7ab --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -0,0 +1,198 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; +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.Iterate; +import com.simibubi.create.foundation.utility.Pointing; + +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 BearingScenes { + + public static void windmillsAsSource(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("windmill_source", "Generating Rotational Force using Windmill Bearings"); + scene.world.showSection(util.select.fromTo(1, 0, 1, 5, 0, 5), Direction.UP); + scene.world.setBlock(util.grid.at(2, -1, 0), AllBlocks.SAIL.getDefaultState() + .with(SailBlock.FACING, Direction.NORTH), false); + scene.idle(5); + Selection kinetics = util.select.fromTo(3, 1, 1, 4, 1, 4); + Selection largeCog = util.select.position(3, 2, 2); + BlockPos windmill = util.grid.at(3, 2, 1); + scene.world.showSection(kinetics.add(largeCog), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(util.select.position(windmill), Direction.DOWN); + scene.idle(10); + + BlockPos anchorPos = windmill.north(); + scene.overlay.showSelectionWithText(util.select.position(anchorPos), 60) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(windmill, Direction.WEST)) + .placeNearTarget() + .text("Windmill Bearings attach to the block in front of them"); + scene.idle(50); + + ElementLink structure = + scene.world.showIndependentSection(util.select.position(anchorPos), Direction.SOUTH); + scene.idle(10); + for (Direction d : Iterate.directions) + if (d.getAxis() != Axis.Z) + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.offset(d, 1), anchorPos.offset(d, 2)), + d.getOpposite(), structure); + scene.idle(10); + + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.up() + .east(), + anchorPos.up(3) + .east()), + Direction.WEST, structure); + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.down() + .west(), + anchorPos.down(3) + .west()), + Direction.EAST, structure); + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.east() + .down(), + anchorPos.east(3) + .down()), + Direction.UP, structure); + scene.world.showSectionAndMerge(util.select.fromTo(anchorPos.west() + .up(), + anchorPos.west(3) + .up()), + Direction.DOWN, structure); + + scene.idle(5); + for (Direction d : Iterate.directions) + if (d.getAxis() != Axis.Z) + scene.effects.superGlue(anchorPos.offset(d, 1), d.getOpposite(), false); + scene.idle(10); + + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(anchorPos, Direction.NORTH)) + .placeNearTarget() + .text("If enough Sail-like blocks are attached to the block, it can act as a Windmill"); + scene.idle(70); + + scene.rotateCameraY(-90); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill), Pointing.DOWN).rightClick(), 60); + scene.idle(7); + scene.world.rotateBearing(windmill, 360, 200); + scene.world.rotateSection(structure, 0, 0, 360, 200); + scene.world.setKineticSpeed(largeCog, 4); + scene.world.setKineticSpeed(kinetics, -8); + scene.effects.rotationDirectionIndicator(windmill.south()); + BlockPos gaugePos = util.grid.at(4, 1, 4); + scene.effects.indicateSuccess(gaugePos); + scene.idle(10); + + scene.overlay.showText(60) + .pointAt(util.vector.topOf(windmill)) + .placeNearTarget() + .text("Once Activated, the Windmill Bearing will start providing Rotational Force"); + scene.idle(70); + + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(gaugePos, Direction.WEST)) + .colored(PonderPalette.SLOW) + .placeNearTarget() + .text("The Amount of Sail Blocks determine its Rotation Speed"); + scene.idle(90); + + Vec3d surface = util.vector.blockSurface(windmill, Direction.WEST); + AxisAlignedBB point = new AxisAlignedBB(surface, surface); + AxisAlignedBB expanded = point.grow(1 / 16f, 1 / 4f, 1 / 4f); + + scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).scroll() + .withWrench(), 60); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, point, point, 1); + scene.idle(1); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, point, expanded, 50); + scene.overlay.showText(60) + .pointAt(surface) + .placeNearTarget() + .text("Use a Wrench to configure its rotation direction"); + scene.idle(35); + + scene.world.rotateBearing(windmill, -90 - 45, 75); + scene.world.rotateSection(structure, 0, 0, -90 - 45, 75); + scene.world.modifyKineticSpeed(largeCog, f -> -f); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(windmill.south()); + scene.idle(69); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(windmill), Pointing.DOWN).rightClick(), 60); + scene.idle(7); + scene.world.rotateBearing(windmill, -45, 0); + scene.world.rotateSection(structure, 0, 0, -45, 0); + scene.world.setKineticSpeed(largeCog, 0); + scene.world.setKineticSpeed(kinetics, 0); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(util.vector.topOf(windmill)) + .placeNearTarget() + .text("Right-click the Bearing anytime to stop and edit the Structure again"); + + } + + public static void windmillsAnyStructure(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("windmill_structure", "Windmill Contraptions"); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos bearingPos = util.grid.at(3, 1, 3); + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(10); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(bearingPos.up()), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.fromTo(3, 2, 2, 3, 3, 1), Direction.SOUTH, contraption); + scene.world.showSectionAndMerge(util.select.fromTo(3, 2, 4, 3, 3, 5), Direction.NORTH, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 5), Direction.NORTH, contraption); + scene.world.showSectionAndMerge(util.select.position(3, 4, 2), Direction.DOWN, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(2, 1, 5), Direction.EAST, contraption); + scene.world.showSectionAndMerge(util.select.position(3, 3, 3), Direction.DOWN, contraption); + scene.idle(5); + scene.effects.superGlue(bearingPos.up(), Direction.SOUTH, true); + scene.effects.superGlue(bearingPos.up(), Direction.NORTH, true); + scene.idle(5); + scene.effects.superGlue(util.grid.at(3, 1, 5), Direction.UP, true); + scene.idle(5); + scene.effects.superGlue(util.grid.at(3, 3, 3), Direction.DOWN, true); + scene.idle(10); + + scene.overlay.showOutline(PonderPalette.BLUE, bearingPos, util.select.fromTo(3, 2, 1, 3, 3, 2), 80); + scene.overlay.showSelectionWithText(util.select.fromTo(3, 2, 4, 3, 3, 5), 80) + .colored(PonderPalette.BLUE) + .text("Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks."); + + scene.idle(90); + scene.overlay.showControls( + new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.WEST), Pointing.LEFT).rightClick(), + 40); + scene.idle(7); + scene.world.rotateBearing(bearingPos, -720, 400); + scene.world.rotateSection(contraption, 0, -720, 0, 400); + scene.world.modifyTileEntity(util.grid.at(2, 1, 5), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.markAsFinished(); + scene.idle(400); + scene.world.modifyTileEntity(util.grid.at(2, 1, 5), HarvesterTileEntity.class, hte -> hte.setAnimatedSpeed(0)); + } + +} 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 40cad7990..63438e8ec 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 @@ -77,6 +77,12 @@ public class PonderIndex { .addStoryBoard("funnels/transposer", FunnelScenes::transposer); PonderRegistry.addStoryBoard(AllBlocks.ANDESITE_FUNNEL, "funnels/brass", FunnelScenes::brass); + // Windmill Bearing + PonderRegistry.forComponents(AllBlocks.WINDMILL_BEARING) + .addStoryBoard("windmill_bearing/source", BearingScenes::windmillsAsSource, PonderTag.KINETIC_SOURCES) + .addStoryBoard("windmill_bearing/structure", BearingScenes::windmillsAnyStructure, + PonderTag.MOVEMENT_ANCHOR); + // Gantries PonderRegistry.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft, PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); diff --git a/src/main/resources/ponder/windmill_bearing/source.nbt b/src/main/resources/ponder/windmill_bearing/source.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7426cb759b0f4772e35b997be901d16eb98e21e7 GIT binary patch literal 820 zcmV-41Izp$iwFP!000000L50{Z__Xkb`qz*wy}Zu`I=``A?*e24GqK#8i5JKhMhr3t)4$*)L z!wjPumDdpUCR`?$dIW!thbYLUu8qpuN7X~94KZ|O(ZqOYd3gb?c%`> zJfQ;HfnS4z&mzYO#$6JMe@KJhf)*kZ0_W=WRUL zfhTm}sWpcVc@7=&yp0Dt@Pt;L5eme_geW}EDV>(*#eZhBO*g&&7frKa`;KnFY1dT&C;Qm$$1$#te-UDWHeImCatrBCd{c>(%G0h9hE1b!AU&l70$Oq`CG>r+DB8_KEX|p0-Q`sh)Taq8wNv`T!?xSr(oDn{Q1G+Ru&O2i3 z=dz%x@uK#IDQuCz0dxXkqZYTCUu}GPu=VFtDL14q6$D1+58}QfbM?o~S(=$RRpfe0 y`tBsYpts^%1^?UR-ADNzNJ29U&LxDy+~8RPdr61TR5PDk2C$f}nyRo^lfL2WwUT zn3+swdJ8hLyENTh_1^csdf%&h&6EHr0x0P&@c;nkn$j0C_ag8KS5#3VOZvS~0v_K` zMNn7~iV9vx?MMDOpsN3GneRSs0&mO<=^^XoHFY)a*<0Qfxi~tvS zb2M_!I>5ik&qt!oYZ|&(rA@-64h7;+hu1`;Fk29U)kG&A)D$lXg$*4;*)?M~J~sTz zi-2UT(1D3%*cKYux%9Zc!W%y}g zGF;7*0p`e1d0=8Pygfhl&R<(Ud~?7uY@@HPO`lrs+RO0L#AN8^$>8S604FBHhci2S zpZ{8N4p@eZzx`V$;f0gdG6XXdli}q&8Bm@KC+iN~Opar$*cy>vxVk3k!EgpD&~<5}Q93mjyD zlW`ifaYxvALpB~5y>>T;k2}I<6rcTYpal-Hz{xndIqT}#<>V(@yJw-hXQ6u@4z$2Q z7C0GaXrULh&?^rITHqiHoQxB+s8wiDtH?qxWT96c4z$2Q7C60LF<=A7OFAiau^B5u3&xgn#tr;ekeVa zJCxU&l(Arg;7B_laNn|SN9T!YKq?70X0?MAj8c|&h4YhehtqIj14~KenA{8^7J5w; zEh*BJpwIpOCgmiI@TSsuM5-}a97LN+(Gq|oDVqk4wzWTrM%34^p8kj^rhW#`o}&Jr zYGFo{BBlkEd;nK*lYr?y<4%Jr5`=XRi;cn2; z?S2$M5+a^0fznzebmKL@CTLTH6o!+%p~a#ny;STU`nj(gK|2}^%qS8Kozw~e^82cHrOL`JS7w18pSNgDr}fa zN83bteRW;aS=4N8&=Ayks@o!WDfkcf4lAZP5&!^X^&-yz literal 0 HcmV?d00001 From 95eabe9cf91cfd477d12817f8622880c84067530 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 9 Mar 2021 14:22:20 -0800 Subject: [PATCH 078/124] Instanced arms. --- .../chassis/StickerInstance.java | 7 +- .../gantry/GantryCarriageInstance.java | 8 +- .../render/ContraptionKineticRenderer.java | 4 +- .../block/mechanicalArm/ArmInstance.java | 157 +++++++++++++++++- .../block/mechanicalArm/ArmRenderer.java | 147 ++++++++++------ .../gui/widgets/InterpolatedValue.java | 4 + .../foundation/render/KineticRenderer.java | 4 +- .../render/backend/RenderMaterials.java | 5 +- .../gl/attrib/InstanceVertexAttributes.java | 1 + ...cedModel.java => BasicInstancedModel.java} | 8 +- .../backend/instancing/impl/ModelData.java | 100 +++++++++++ .../instancing/impl/TransformData.java | 56 ------- .../resources/assets/create/shader/model.vert | 3 +- 13 files changed, 375 insertions(+), 129 deletions(-) rename src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/{TransformedInstancedModel.java => BasicInstancedModel.java} (74%) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java delete mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java index 60c9e199d..ab3fdbc59 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -4,12 +4,11 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.instancing.*; -import com.simibubi.create.foundation.render.backend.instancing.impl.TransformData; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.world.LightType; @@ -24,7 +23,7 @@ public class StickerInstance extends TileEntityInstance imple float lastOffset = Float.NaN; - private InstanceKey head; + private InstanceKey head; public StickerInstance(InstancedTileRenderer modelManager, StickerTileEntity tile) { super(modelManager, tile); @@ -61,7 +60,7 @@ public class StickerInstance extends TileEntityInstance imple .translate(0, (offset * offset) * 4 / 16f, 0); head.getInstance() - .setTransform(stack); + .setTransformNoCopy(stack); lastOffset = offset; } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index 3a94fccb8..30e971cdd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.render.backend.instancing.ITickableInstanc import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.impl.TransformData; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -28,7 +28,7 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn InstancedTileRenderRegistry.instance.register(type, GantryCarriageInstance::new)); } - private InstanceKey gantryCogs; + private InstanceKey gantryCogs; public GantryCarriageInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { super(dispatcher, tile); @@ -47,7 +47,7 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn @Override public void tick() { - lastState = world.getBlockState(pos); + lastState = tile.getBlockState(); Direction facing = lastState.get(GantryCarriageBlock.FACING); Boolean alongFirst = lastState.get(GantryCarriageBlock.AXIS_ALONG_FIRST_COORDINATE); Direction.Axis rotationAxis = KineticTileEntityRenderer.getRotationAxisOf(tile); @@ -80,7 +80,7 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn .translate(0, 9 / 16f, 0) .unCentre(); - gantryCogs.getInstance().setTransform(ms); + gantryCogs.getInstance().setTransformNoCopy(ms); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index 6cd01e76b..8413118f7 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -10,14 +10,14 @@ import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.backend.instancing.impl.TransformedInstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.impl.BasicInstancedModel; import net.minecraft.util.math.BlockPos; public class ContraptionKineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, TransformedInstancedModel::new)); + materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, BasicInstancedModel::new)); materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.C_BELT, BeltInstancedModel::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.C_ROTATING, RotatingInstancedModel::new)); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 6432569f0..942895949 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -1,29 +1,178 @@ package com.simibubi.create.content.logistics.block.mechanicalArm; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.gui.widgets.InterpolatedValue; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +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.MatrixStacker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.item.BlockItem; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -public class ArmInstance extends SingleRotatingInstance { +import java.util.ArrayList; +import java.util.stream.Stream; + +public class ArmInstance extends SingleRotatingInstance implements ITickableInstance { public static void register(TileEntityType type) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, ArmInstance::new)); } + private InstanceKey base; + private InstanceKey lowerBody; + private InstanceKey upperBody; + private InstanceKey head; + private InstanceKey claw; + private ArrayList> clawGrips; + + private ArrayList> models; + + private boolean firstTick = true; public ArmInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } + @Override + protected void init() { + super.init(); + + RenderMaterial> mat = modelManager.getMaterial(RenderMaterials.MODELS); + + base = mat.getModel(AllBlockPartials.ARM_BASE, lastState).createInstance(); + lowerBody = mat.getModel(AllBlockPartials.ARM_LOWER_BODY, lastState).createInstance(); + upperBody = mat.getModel(AllBlockPartials.ARM_UPPER_BODY, lastState).createInstance(); + head = mat.getModel(AllBlockPartials.ARM_HEAD, lastState).createInstance(); + claw = mat.getModel(AllBlockPartials.ARM_CLAW_BASE, lastState).createInstance(); + + InstancedModel clawHalfModel = mat.getModel(AllBlockPartials.ARM_CLAW_GRIP, lastState); + InstanceKey clawGrip1 = clawHalfModel.createInstance(); + InstanceKey clawGrip2 = clawHalfModel.createInstance(); + + clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); + models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2); + + tick(); + updateLight(); + } + + @Override + public void tick() { + ArmTileEntity arm = (ArmTileEntity) tile; + + boolean settled = Stream.of(arm.baseAngle, arm.lowerArmAngle, arm.upperArmAngle, arm.headAngle).allMatch(InterpolatedValue::settled); + boolean rave = arm.phase == ArmTileEntity.Phase.DANCING; + + if (!settled || rave || firstTick) + transformModels(arm, rave); + + if (settled) + firstTick = false; + } + + private void transformModels(ArmTileEntity arm, boolean rave) { + float pt = AnimationTickHolder.getPartialTicks(); + int color = 0xFFFFFF; + + float baseAngle = arm.baseAngle.get(pt); + float lowerArmAngle = arm.lowerArmAngle.get(pt) - 135; + float upperArmAngle = arm.upperArmAngle.get(pt) - 90; + float headAngle = arm.headAngle.get(pt); + + if (rave) { + float renderTick = AnimationTickHolder.getRenderTime() + (tile.hashCode() % 64); + baseAngle = (renderTick * 10) % 360; + lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); + upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); + headAngle = -lowerArmAngle; + color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100); + } + + + MatrixStack msLocal = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(msLocal); + msr.translate(getFloatingPos()); + msr.centre(); + + if (lastState.get(ArmBlock.CEILING)) + msr.rotateX(180); + + ArmRenderer.transformBase(msr, baseAngle); + base.getInstance() + .setTransform(msLocal); + + ArmRenderer.transformLowerArm(msr, lowerArmAngle); + lowerBody.getInstance() + .setColor(color) + .setTransform(msLocal); + + ArmRenderer.transformUpperArm(msr, upperArmAngle); + upperBody.getInstance() + .setColor(color) + .setTransform(msLocal); + + ArmRenderer.transformHead(msr, headAngle); + head.getInstance() + .setTransform(msLocal); + + ArmRenderer.transformClaw(msr); + claw.getInstance() + .setTransform(msLocal); + + ItemStack item = arm.heldItem; + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + boolean hasItem = !item.isEmpty(); + boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) + && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) + .isGui3d(); + + for (int index : Iterate.zeroAndOne) { + msLocal.push(); + int flip = index * 2 - 1; + ArmRenderer.transformClawHalf(msr, hasItem, isBlockItem, flip); + clawGrips.get(index) + .getInstance() + .setTransform(msLocal); + msLocal.pop(); + } + } + + @Override + public void updateLight() { + super.updateLight(); + byte block = (byte) (world.getLightLevel(LightType.BLOCK, pos) << 4); + byte sky = (byte) (world.getLightLevel(LightType.SKY, pos) << 4); + + + models.stream() + .map(InstanceKey::getInstance) + .forEach(data -> data.setSkyLight(sky).setBlockLight(block)); + } + @Override protected InstancedModel getModel() { return AllBlockPartials.ARM_COG.renderOnRotating(modelManager, tile.getBlockState()); } + + @Override + public void remove() { + super.remove(); + models.forEach(InstanceKey::delete); + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index a15fca209..09644967e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -39,6 +40,21 @@ public class ArmRenderer extends KineticTileEntityRenderer { int overlay) { super.renderSafe(te, pt, ms, buffer, light, overlay); ArmTileEntity arm = (ArmTileEntity) te; + + boolean usingFlywheel = Backend.canUseInstancing(); + + ItemStack item = arm.heldItem; + boolean hasItem = !item.isEmpty(); + + if (usingFlywheel && !hasItem) return; + + ItemRenderer itemRenderer = Minecraft.getInstance() + .getItemRenderer(); + + boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) + && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) + .isGui3d(); + IVertexBuilder builder = buffer.getBuffer(RenderType.getSolid()); BlockState blockState = te.getBlockState(); @@ -61,59 +77,15 @@ public class ArmRenderer extends KineticTileEntityRenderer { color = ColorHelper.rainbowColor(AnimationTickHolder.getTicks() * 100); } - SuperByteBuffer base = AllBlockPartials.ARM_BASE.renderOn(blockState).light(light); - SuperByteBuffer lowerBody = AllBlockPartials.ARM_LOWER_BODY.renderOn(blockState).light(light); - SuperByteBuffer upperBody = AllBlockPartials.ARM_UPPER_BODY.renderOn(blockState).light(light); - SuperByteBuffer head = AllBlockPartials.ARM_HEAD.renderOn(blockState).light(light); - SuperByteBuffer claw = AllBlockPartials.ARM_CLAW_BASE.renderOn(blockState).light(light); - SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState); - msr.centre(); - + if (blockState.get(ArmBlock.CEILING)) msr.rotateX(180); - msLocal.translate(0, 4 / 16d, 0); - msr.rotateY(baseAngle); - base.transform(msLocal) - .renderInto(ms, builder); - - msLocal.translate(0, 1 / 16d, -2 / 16d); - msr.rotateX(lowerArmAngle); - msLocal.translate(0, -1 / 16d, 0); - lowerBody.color(color) - .transform(msLocal) - .renderInto(ms, builder); - - msLocal.translate(0, 12 / 16d, 12 / 16d); - msr.rotateX(upperArmAngle); - upperBody.color(color) - .transform(msLocal) - .renderInto(ms, builder); - - msLocal.translate(0, 11 / 16d, -11 / 16d); - msr.rotateX(headAngle); - head.transform(msLocal) - .renderInto(ms, builder); - - msLocal.translate(0, 0, -4 / 16d); - claw.transform(msLocal) - .renderInto(ms, builder); - ItemStack item = arm.heldItem; - ItemRenderer itemRenderer = Minecraft.getInstance() - .getItemRenderer(); - boolean hasItem = !item.isEmpty(); - boolean isBlockItem = hasItem && (item.getItem() instanceof BlockItem) - && itemRenderer.getItemModelWithOverrides(item, Minecraft.getInstance().world, null) - .isGui3d(); - - for (int flip : Iterate.positiveAndNegative) { - msLocal.push(); - msLocal.translate(0, flip * 3 / 16d, -1 / 16d); - msr.rotateX(flip * (hasItem ? isBlockItem ? 0 : -35 : 0)); - clawGrip.light(light).transform(msLocal).renderInto(ms, builder); - msLocal.pop(); - } + if (usingFlywheel) + doItemTransforms(msr, baseAngle, lowerArmAngle, upperArmAngle, headAngle); + else + renderArm(builder, ms, msLocal, msr, blockState, color, baseAngle, lowerArmAngle, upperArmAngle, headAngle, hasItem, isBlockItem, light); if (hasItem) { ms.push(); @@ -131,6 +103,83 @@ public class ArmRenderer extends KineticTileEntityRenderer { } + private void renderArm(IVertexBuilder builder, MatrixStack ms, MatrixStack msLocal, MatrixStacker msr, BlockState blockState, int color, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle, boolean hasItem, boolean isBlockItem, int light) { + SuperByteBuffer base = AllBlockPartials.ARM_BASE.renderOn(blockState).light(light); + SuperByteBuffer lowerBody = AllBlockPartials.ARM_LOWER_BODY.renderOn(blockState).light(light); + SuperByteBuffer upperBody = AllBlockPartials.ARM_UPPER_BODY.renderOn(blockState).light(light); + SuperByteBuffer head = AllBlockPartials.ARM_HEAD.renderOn(blockState).light(light); + SuperByteBuffer claw = AllBlockPartials.ARM_CLAW_BASE.renderOn(blockState).light(light); + SuperByteBuffer clawGrip = AllBlockPartials.ARM_CLAW_GRIP.renderOn(blockState); + + transformBase(msr, baseAngle); + base.transform(msLocal) + .renderInto(ms, builder); + + transformLowerArm(msr, lowerArmAngle); + lowerBody.color(color) + .transform(msLocal) + .renderInto(ms, builder); + + transformUpperArm(msr, upperArmAngle); + upperBody.color(color) + .transform(msLocal) + .renderInto(ms, builder); + + transformHead(msr, headAngle); + head.transform(msLocal) + .renderInto(ms, builder); + + transformClaw(msr); + claw.transform(msLocal) + .renderInto(ms, builder); + + for (int flip : Iterate.positiveAndNegative) { + msLocal.push(); + transformClawHalf(msr, hasItem, isBlockItem, flip); + clawGrip.light(light).transform(msLocal).renderInto(ms, builder); + msLocal.pop(); + } + } + + private void doItemTransforms(MatrixStacker msr, float baseAngle, float lowerArmAngle, float upperArmAngle, float headAngle) { + + transformBase(msr, baseAngle); + transformLowerArm(msr, lowerArmAngle); + transformUpperArm(msr, upperArmAngle); + transformHead(msr, headAngle); + transformClaw(msr); + } + + public static void transformClawHalf(MatrixStacker msr, boolean hasItem, boolean isBlockItem, int flip) { + msr.translate(0, flip * 3 / 16d, -1 / 16d); + msr.rotateX(flip * (hasItem ? isBlockItem ? 0 : -35 : 0)); + } + + public static void transformClaw(MatrixStacker msr) { + msr.translate(0, 0, -4 / 16d); + } + + public static void transformHead(MatrixStacker msr, float headAngle) { + msr.translate(0, 11 / 16d, -11 / 16d); + msr.rotateX(headAngle); + } + + public static void transformUpperArm(MatrixStacker msr, float upperArmAngle) { + msr.translate(0, 12 / 16d, 12 / 16d); + msr.rotateX(upperArmAngle); + } + + public static void transformLowerArm(MatrixStacker msr, float lowerArmAngle) { + msr.translate(0, 1 / 16d, -2 / 16d); + msr.rotateX(lowerArmAngle); + msr.translate(0, -1 / 16d, 0); + } + + public static void transformBase(MatrixStacker msr, float baseAngle) { + msr.translate(0, 4 / 16d, 0); + msr.rotateY(baseAngle); + } + @Override protected SuperByteBuffer getRotatedModel(KineticTileEntity te) { return AllBlockPartials.ARM_COG.renderOn(te.getBlockState()); diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedValue.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedValue.java index 6739f39af..ebc1e712f 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedValue.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/InterpolatedValue.java @@ -16,5 +16,9 @@ public class InterpolatedValue { public float get(float partialTicks) { return MathHelper.lerp(partialTicks, lastValue, value); } + + public boolean settled() { + return Math.abs(value - lastValue) < 1e-3; + } } diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index 7446f86ff..d9c8f74d6 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -12,7 +12,7 @@ import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; -import com.simibubi.create.foundation.render.backend.instancing.impl.TransformedInstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.impl.BasicInstancedModel; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Matrix4f; import net.minecraft.client.renderer.RenderType; @@ -27,7 +27,7 @@ public class KineticRenderer extends InstancedTileRenderer { @Override public void registerMaterials() { - materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.MODEL, TransformedInstancedModel::new)); + materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.MODEL, BasicInstancedModel::new)); materials.put(KineticRenderMaterials.BELTS, new RenderMaterial<>(this, AllProgramSpecs.BELT, BeltInstancedModel::new)); materials.put(KineticRenderMaterials.ROTATING, new RenderMaterial<>(this, AllProgramSpecs.ROTATING, RotatingInstancedModel::new)); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java b/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java index 7cc06e520..b1a09fc0a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/RenderMaterials.java @@ -1,10 +1,9 @@ package com.simibubi.create.foundation.render.backend; -import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.foundation.render.backend.instancing.MaterialType; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.impl.TransformData; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; public class RenderMaterials { - public static final MaterialType> MODELS = new MaterialType<>(); + public static final MaterialType> MODELS = new MaterialType<>(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java index cf1702532..dacecf161 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/InstanceVertexAttributes.java @@ -4,6 +4,7 @@ public enum InstanceVertexAttributes implements IVertexAttrib { TRANSFORM("aTransform", MatrixAttributes.MAT4), NORMAL_MAT("aNormalMat", MatrixAttributes.MAT3), LIGHT("aLight", CommonAttributes.LIGHT), + COLOR("aColor", CommonAttributes.RGBA), ; private final String name; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/BasicInstancedModel.java similarity index 74% rename from src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java rename to src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/BasicInstancedModel.java index 2335a386f..cd67de720 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformedInstancedModel.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/BasicInstancedModel.java @@ -6,16 +6,16 @@ import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.client.renderer.BufferBuilder; -public class TransformedInstancedModel extends InstancedModel { +public class BasicInstancedModel extends InstancedModel { public static final VertexFormat INSTANCE_FORMAT = VertexFormat.builder().addAttributes(InstanceVertexAttributes.class).build(); - public TransformedInstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { + public BasicInstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { super(renderer, buf); } @Override - protected TransformData newInstance() { - return new TransformData(this); + protected ModelData newInstance() { + return new ModelData(this); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java new file mode 100644 index 000000000..a94687b58 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java @@ -0,0 +1,100 @@ +package com.simibubi.create.foundation.render.backend.instancing.impl; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.render.backend.RenderUtil; +import com.simibubi.create.foundation.render.backend.instancing.InstanceData; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.Matrix3f; +import net.minecraft.client.renderer.Matrix4f; + +import java.nio.ByteBuffer; + +public class ModelData extends InstanceData { + private static final Matrix4f IDENT4 = new Matrix4f(); + private static final Matrix3f IDENT3 = new Matrix3f(); + static { + IDENT4.loadIdentity(); + IDENT3.loadIdentity(); + } + + private Matrix4f modelMat = IDENT4; + private Matrix3f normalMat = IDENT3; + + private byte blockLight; + private byte skyLight; + + private byte r = (byte) 0xFF; + private byte g = (byte) 0xFF; + private byte b = (byte) 0xFF; + private byte a = (byte) 0xFF; + + public ModelData(InstancedModel owner) { + super(owner); + } + + public ModelData setModelMat(Matrix4f modelMat) { + this.modelMat = modelMat; + return this; + } + + public ModelData setNormalMat(Matrix3f normalMat) { + this.normalMat = normalMat; + return this; + } + + public ModelData setTransform(MatrixStack stack) { + this.modelMat = stack.peek().getModel().copy(); + this.normalMat = stack.peek().getNormal().copy(); + return this; + } + + public ModelData setTransformNoCopy(MatrixStack stack) { + this.modelMat = stack.peek().getModel(); + this.normalMat = stack.peek().getNormal(); + return this; + } + + public ModelData setBlockLight(byte blockLight) { + this.blockLight = blockLight; + return this; + } + + public ModelData setSkyLight(byte skyLight) { + this.skyLight = skyLight; + return this; + } + + public ModelData setColor(int color) { + byte a = (byte) ((color >> 24) & 0xFF); + byte r = (byte) ((color >> 16) & 0xFF); + byte g = (byte) ((color >> 8) & 0xFF); + byte b = (byte) (color & 0xFF); + return setColor(r, g, b); + } + + public ModelData setColor(int r, int g, int b) { + return setColor((byte) r, (byte) g, (byte) b); + } + + public ModelData setColor(byte r, byte g, byte b) { + this.r = r; + this.g = g; + this.b = b; + return this; + } + + public ModelData setColor(byte r, byte g, byte b, byte a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + return this; + } + + @Override + public void write(ByteBuffer buf) { + RenderUtil.writeMat4(buf, modelMat); + RenderUtil.writeMat3(buf, normalMat); + buf.put(new byte[] { blockLight, skyLight, r, g, b, a }); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java deleted file mode 100644 index 115463df7..000000000 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/TransformData.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.simibubi.create.foundation.render.backend.instancing.impl; - -import com.mojang.blaze3d.matrix.MatrixStack; -import com.simibubi.create.foundation.render.backend.RenderUtil; -import com.simibubi.create.foundation.render.backend.instancing.InstanceData; -import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import net.minecraft.client.renderer.Matrix3f; -import net.minecraft.client.renderer.Matrix4f; - -import java.nio.ByteBuffer; - -public class TransformData extends InstanceData { - - private Matrix4f modelMat; - private Matrix3f normalMat; - - private byte blockLight; - private byte skyLight; - - public TransformData(InstancedModel owner) { - super(owner); - } - - public TransformData setModelMat(Matrix4f modelMat) { - this.modelMat = modelMat; - return this; - } - - public TransformData setNormalMat(Matrix3f normalMat) { - this.normalMat = normalMat; - return this; - } - - public TransformData setTransform(MatrixStack stack) { - this.modelMat = stack.peek().getModel(); - this.normalMat = stack.peek().getNormal(); - return this; - } - - public TransformData setBlockLight(byte blockLight) { - this.blockLight = blockLight; - return this; - } - - public TransformData setSkyLight(byte skyLight) { - this.skyLight = skyLight; - return this; - } - - @Override - public void write(ByteBuffer buf) { - RenderUtil.writeMat4(buf, modelMat); - RenderUtil.writeMat3(buf, normalMat); - buf.put(new byte[] { blockLight, skyLight }); - } -} diff --git a/src/main/resources/assets/create/shader/model.vert b/src/main/resources/assets/create/shader/model.vert index 916cc7bcb..54bf4ba4b 100644 --- a/src/main/resources/assets/create/shader/model.vert +++ b/src/main/resources/assets/create/shader/model.vert @@ -7,6 +7,7 @@ attribute vec2 aTexCoords; attribute mat4 aTransform; attribute mat3 aNormalMat; attribute vec2 aLight; +attribute vec4 aColor; varying vec2 TexCoords; varying vec4 Color; @@ -72,5 +73,5 @@ void main() { Light = aLight; gl_Position = uViewProjection * worldPos; - Color = vec4(1.); + Color = aColor; } \ No newline at end of file From 2ddf57cd76cc6a5dca8ea527a6040c1a38d3c6ce Mon Sep 17 00:00:00 2001 From: JozsefA Date: Tue, 9 Mar 2021 15:46:15 -0800 Subject: [PATCH 079/124] Instanced mixers and presses. --- .../com/simibubi/create/AllTileEntities.java | 6 +- .../mixer/MechanicalMixerRenderer.java | 11 +- .../components/mixer/MixerInstance.java | 112 ++++++++++++++++++ .../press/MechanicalPressRenderer.java | 7 +- .../components/press/PressInstance.java | 84 +++++++++++++ .../chassis/StickerInstance.java | 4 +- .../gantry/GantryCarriageInstance.java | 4 +- .../block/mechanicalArm/ArmInstance.java | 4 +- .../block/mechanicalArm/ArmRenderer.java | 3 +- .../backend/instancing/impl/ModelData.java | 8 +- .../foundation/utility/MatrixStacker.java | 2 +- 11 files changed, 225 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 0220a6c85..6f4e55685 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -39,10 +39,12 @@ import com.simibubi.create.content.contraptions.components.millstone.MillstoneRe import com.simibubi.create.content.contraptions.components.millstone.MillstoneTileEntity; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerRenderer; import com.simibubi.create.content.contraptions.components.mixer.MechanicalMixerTileEntity; +import com.simibubi.create.content.contraptions.components.mixer.MixerInstance; import com.simibubi.create.content.contraptions.components.motor.CreativeMotorRenderer; import com.simibubi.create.content.contraptions.components.motor.CreativeMotorTileEntity; import com.simibubi.create.content.contraptions.components.press.MechanicalPressRenderer; import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.content.contraptions.components.press.PressInstance; import com.simibubi.create.content.contraptions.components.saw.SawInstance; import com.simibubi.create.content.contraptions.components.saw.SawRenderer; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; @@ -488,14 +490,14 @@ public class AllTileEntities { .tileEntity("mechanical_press", MechanicalPressTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_PRESS) .renderer(() -> MechanicalPressRenderer::new) - .onRegister(ShaftInstance::register) + .onRegister(PressInstance::register) .register(); public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_MIXER) .renderer(() -> MechanicalMixerRenderer::new) - .onRegister(ShaftlessCogInstance::register) + .onRegister(MixerInstance::register) .register(); public static final TileEntityEntry DEPLOYER = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 134b7b788..5ad5963e0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -31,22 +31,23 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (FastRenderDispatcher.available(te.getWorld())) return; + BlockState blockState = te.getBlockState(); MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) te; BlockPos pos = te.getPos(); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - if (!FastRenderDispatcher.available(te.getWorld())) { - SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); - standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); - } + SuperByteBuffer superBuffer = AllBlockPartials.SHAFTLESS_COGWHEEL.renderOn(blockState); + standardKineticRotationTransform(superBuffer, te, light).renderInto(ms, vb); int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); float time = AnimationTickHolder.getRenderTime(); - float angle = (float) (((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI); + float angle = ((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI; SuperByteBuffer poleRender = AllBlockPartials.MECHANICAL_MIXER_POLE.renderOn(blockState); poleRender.translate(0, -renderedHeadOffset, 0) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java new file mode 100644 index 000000000..cdf738df3 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java @@ -0,0 +1,112 @@ +package com.simibubi.create.content.contraptions.components.mixer; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.RotatingData; +import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance; +import com.simibubi.create.content.contraptions.components.press.MechanicalPressTileEntity; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.client.renderer.Vector3d; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class MixerInstance extends ShaftlessCogInstance implements ITickableInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, MixerInstance::new)); + } + + private InstanceKey mixerHead; + private InstanceKey mixerPole; + + public MixerInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + mixerHead = rotatingMaterial().getModel(AllBlockPartials.MECHANICAL_MIXER_HEAD, lastState) + .createInstance(); + + mixerHead.getInstance() + .setRotationAxis(Direction.Axis.Y); + + mixerPole = modelManager.getMaterial(RenderMaterials.MODELS) + .getModel(AllBlockPartials.MECHANICAL_MIXER_POLE, lastState) + .createInstance(); + + + updateLight(); + MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tile; + transformPole(getRenderedHeadOffset(mixer)); + } + + @Override + public void tick() { + MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tile; + + float renderedHeadOffset = getRenderedHeadOffset(mixer); + + if (mixer.running) { + transformPole(renderedHeadOffset); + } + + transformHead(mixer, renderedHeadOffset); + } + + private void transformHead(MechanicalMixerTileEntity mixer, float renderedHeadOffset) { + float speed = mixer.getRenderedHeadRotationSpeed(AnimationTickHolder.getPartialTicks()); + + mixerHead.getInstance() + .setPosition(pos) + .nudge(0, -renderedHeadOffset, 0) + .setRotationalSpeed(speed * 2); + } + + private void transformPole(float renderedHeadOffset) { + MatrixStack ms = new MatrixStack(); + + MatrixStacker msr = MatrixStacker.of(ms); + msr.translate(getFloatingPos()); + msr.translate(0, -renderedHeadOffset, 0); + + mixerPole.getInstance().setTransformNoCopy(ms); + } + + private float getRenderedHeadOffset(MechanicalMixerTileEntity mixer) { + return mixer.getRenderedHeadOffset(AnimationTickHolder.getPartialTicks()); + } + + @Override + public void updateLight() { + super.updateLight(); + + BlockPos down = pos.down(); + mixerHead.getInstance() + .setBlockLight(world.getLightLevel(LightType.BLOCK, down)) + .setSkyLight(world.getLightLevel(LightType.SKY, down)); + + mixerPole.getInstance() + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + } + + @Override + public void remove() { + super.remove(); + mixerHead.delete(); + mixerPole.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java index 18f2353a7..7bb36e753 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/MechanicalPressRenderer.java @@ -6,6 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.RenderType; @@ -29,13 +30,17 @@ public class MechanicalPressRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + if (FastRenderDispatcher.available(te.getWorld())) return; + BlockPos pos = te.getPos(); BlockState blockState = te.getBlockState(); int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = ((MechanicalPressTileEntity) te).getRenderedHeadOffset(partialTicks); SuperByteBuffer headRender = AllBlockPartials.MECHANICAL_PRESS_HEAD.renderOnHorizontal(blockState); - headRender.translate(0, -renderedHeadOffset, 0).light(packedLightmapCoords).renderInto(ms, buffer.getBuffer(RenderType.getSolid())); + headRender.translate(0, -renderedHeadOffset, 0) + .light(packedLightmapCoords) + .renderInto(ms, buffer.getBuffer(RenderType.getSolid())); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java new file mode 100644 index 000000000..53084bef4 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java @@ -0,0 +1,84 @@ +package com.simibubi.create.content.contraptions.components.press; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class PressInstance extends ShaftInstance implements ITickableInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, PressInstance::new)); + } + + private InstanceKey pressHead; + + public PressInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + pressHead = modelManager.getMaterial(RenderMaterials.MODELS) + .getModel(AllBlockPartials.MECHANICAL_PRESS_HEAD, lastState) + .createInstance(); + + updateLight(); + transformModels((MechanicalPressTileEntity) tile); + } + + @Override + public void tick() { + MechanicalPressTileEntity press = (MechanicalPressTileEntity) tile; + if (!press.running) + return; + + transformModels(press); + } + + private void transformModels(MechanicalPressTileEntity press) { + float renderedHeadOffset = getRenderedHeadOffset(press); + + MatrixStack ms = new MatrixStack(); + + MatrixStacker msr = MatrixStacker.of(ms); + msr.translate(getFloatingPos()); + msr.translate(0, -renderedHeadOffset, 0); + + pressHead.getInstance() + .setTransformNoCopy(ms); + } + + private float getRenderedHeadOffset(MechanicalPressTileEntity press) { + return press.getRenderedHeadOffset(AnimationTickHolder.getPartialTicks()); + } + + @Override + public void updateLight() { + super.updateLight(); + + pressHead.getInstance() + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + } + + @Override + public void remove() { + super.remove(); + pressHead.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java index ab3fdbc59..4f5becd7c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -68,8 +68,8 @@ public class StickerInstance extends TileEntityInstance imple @Override public void updateLight() { head.getInstance() - .setBlockLight((byte) (world.getLightLevel(LightType.BLOCK, pos) << 4)) - .setSkyLight((byte) (world.getLightLevel(LightType.SKY, pos) << 4)); + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index 30e971cdd..c6d2b13a3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -86,8 +86,8 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn @Override public void updateLight() { gantryCogs.getInstance() - .setBlockLight((byte) (world.getLightLevel(LightType.BLOCK, pos) << 4)) - .setSkyLight((byte) (world.getLightLevel(LightType.SKY, pos) << 4)); + .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) + .setSkyLight(world.getLightLevel(LightType.SKY, pos)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 942895949..2675f8550 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -156,8 +156,8 @@ public class ArmInstance extends SingleRotatingInstance implements ITickableInst @Override public void updateLight() { super.updateLight(); - byte block = (byte) (world.getLightLevel(LightType.BLOCK, pos) << 4); - byte sky = (byte) (world.getLightLevel(LightType.SKY, pos) << 4); + int block = world.getLightLevel(LightType.BLOCK, pos); + int sky = world.getLightLevel(LightType.SKY, pos); models.stream() diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 09644967e..79d3c3765 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity.Phase; import com.simibubi.create.foundation.render.SuperByteBuffer; import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; @@ -41,7 +42,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { super.renderSafe(te, pt, ms, buffer, light, overlay); ArmTileEntity arm = (ArmTileEntity) te; - boolean usingFlywheel = Backend.canUseInstancing(); + boolean usingFlywheel = FastRenderDispatcher.available(te.getWorld()); ItemStack item = arm.heldItem; boolean hasItem = !item.isEmpty(); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java index a94687b58..350c8e4ad 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java @@ -54,13 +54,13 @@ public class ModelData extends InstanceData { return this; } - public ModelData setBlockLight(byte blockLight) { - this.blockLight = blockLight; + public ModelData setBlockLight(int blockLight) { + this.blockLight = (byte) (blockLight << 4); return this; } - public ModelData setSkyLight(byte skyLight) { - this.skyLight = skyLight; + public ModelData setSkyLight(int skyLight) { + this.skyLight = (byte) (skyLight << 4); return this; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index c56938d49..5db42563c 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -84,7 +84,7 @@ public class MatrixStacker { return this; } - private MatrixStacker multiply(Vector3f axis, double angle) { + public MatrixStacker multiply(Vector3f axis, double angle) { if (angle == 0) return this; ms.multiply(axis.getDegreesQuaternion((float) angle)); From d8ab00b66e9506b12b7bbfa5c1bd5c193457c07a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 10 Mar 2021 19:18:25 +0100 Subject: [PATCH 080/124] Pondering about Mechanical Bearings --- .../create/foundation/ponder/PonderUI.java | 8 +- .../foundation/ponder/SceneBuilder.java | 24 +- .../ponder/content/BearingScenes.java | 242 +++++++++++++++++- .../ponder/content/PonderIndex.java | 8 + .../ponder/elements/WorldSectionElement.java | 38 ++- .../DisplayWorldSectionInstruction.java | 13 + .../FadeIntoSceneInstruction.java | 2 +- .../HighlightValueBoxInstruction.java | 31 +++ .../ponder/mechanical_bearing/anchor.nbt | Bin 0 -> 532 bytes .../ponder/mechanical_bearing/modes.nbt | Bin 0 -> 630 bytes .../ponder/mechanical_bearing/stabilized.nbt | Bin 0 -> 718 bytes 11 files changed, 345 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java create mode 100644 src/main/resources/ponder/mechanical_bearing/anchor.nbt create mode 100644 src/main/resources/ponder/mechanical_bearing/modes.nbt create mode 100644 src/main/resources/ponder/mechanical_bearing/stabilized.nbt 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 29f877017..f9ac2c8a6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -602,8 +602,12 @@ public class PonderUI extends AbstractSimiScreen { return true; } - clipboardHelper.setClipboardString(handle, "util.grid.at(" + hoveredBlockPos.getX() + ", " - + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); + if (hasShiftDown()) + clipboardHelper.setClipboardString(handle, "util.select.position(" + hoveredBlockPos.getX() + ", " + + hoveredBlockPos.getY() + ", " + hoveredBlockPos.getZ() + ")"); + else + 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 17ea8d9a0..5bfe87504 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.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.HighlightValueBoxInstruction; import com.simibubi.create.foundation.ponder.instructions.LineInstruction; import com.simibubi.create.foundation.ponder.instructions.MarkAsFinishedInstruction; import com.simibubi.create.foundation.ponder.instructions.MovePoiInstruction; @@ -284,6 +285,15 @@ public class SceneBuilder { addInstruction(new ChaseAABBInstruction(color, slot, boundingBox, duration)); } + public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) { + Axis axis = side.getAxis(); + float s = 1 / 16f; + float q = 1 / 4f; + Vec3d expands = new Vec3d(axis == Axis.X ? s : q, axis == Axis.Y ? s : q, axis == Axis.Z ? s : q); + addInstruction(new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), + expands, duration)); + } + public void showLine(PonderPalette color, Vec3d start, Vec3d end, int duration) { addInstruction(new LineInstruction(color, start, end, duration)); } @@ -350,6 +360,12 @@ public class SceneBuilder { Optional.of(() -> scene.resolve(link)))); } + public void glueBlockOnto(BlockPos position, Direction fadeInDirection, ElementLink link) { + addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, + scene.getSceneBuildingUtil().select.position(position), Optional.of(() -> scene.resolve(link)), + position)); + } + public ElementLink showIndependentSection(Selection selection, Direction fadeInDirection) { DisplayWorldSectionInstruction instruction = new DisplayWorldSectionInstruction(15, fadeInDirection, selection, Optional.empty()); @@ -405,6 +421,11 @@ public class SceneBuilder { .setCenterOfRotation(anchor)); } + public void configureStabilization(ElementLink link, Vec3d anchor) { + addInstruction(scene -> scene.resolve(link) + .stabilizeRotation(anchor)); + } + public void moveSection(ElementLink link, Vec3d offset, int duration) { addInstruction(AnimateWorldSectionInstruction.move(link, offset, duration)); } @@ -596,8 +617,7 @@ public class SceneBuilder { modifyTileNBT(selection, teType, consumer, false); } - public void modifyTileEntity(BlockPos position, Class teType, - Consumer consumer) { + public void modifyTileEntity(BlockPos position, Class teType, Consumer consumer) { addInstruction(scene -> { TileEntity tileEntity = scene.world.getTileEntity(position); if (teType.isInstance(tileEntity)) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index 6358cf7ab..9ba29fd57 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -14,7 +14,6 @@ import com.simibubi.create.foundation.utility.Pointing; 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; @@ -102,7 +101,7 @@ public class BearingScenes { scene.overlay.showText(60) .pointAt(util.vector.topOf(windmill)) .placeNearTarget() - .text("Once Activated, the Windmill Bearing will start providing Rotational Force"); + .text("Activated with Right-Click, the Windmill Bearing will start providing Rotational Force"); scene.idle(70); scene.overlay.showText(60) @@ -113,19 +112,14 @@ public class BearingScenes { scene.idle(90); Vec3d surface = util.vector.blockSurface(windmill, Direction.WEST); - AxisAlignedBB point = new AxisAlignedBB(surface, surface); - AxisAlignedBB expanded = point.grow(1 / 16f, 1 / 4f, 1 / 4f); - scene.overlay.showControls(new InputWindowElement(surface, Pointing.DOWN).scroll() .withWrench(), 60); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, point, point, 1); - scene.idle(1); - scene.overlay.chaseBoundingBoxOutline(PonderPalette.WHITE, point, expanded, 50); + scene.overlay.showCenteredScrollInput(windmill, Direction.WEST, 50); scene.overlay.showText(60) .pointAt(surface) .placeNearTarget() .text("Use a Wrench to configure its rotation direction"); - scene.idle(35); + scene.idle(36); scene.world.rotateBearing(windmill, -90 - 45, 75); scene.world.rotateSection(structure, 0, 0, -90 - 45, 75); @@ -186,13 +180,241 @@ public class BearingScenes { new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.WEST), Pointing.LEFT).rightClick(), 40); scene.idle(7); + scene.markAsFinished(); scene.world.rotateBearing(bearingPos, -720, 400); scene.world.rotateSection(contraption, 0, -720, 0, 400); scene.world.modifyTileEntity(util.grid.at(2, 1, 5), HarvesterTileEntity.class, hte -> hte.setAnimatedSpeed(-150)); - scene.markAsFinished(); scene.idle(400); scene.world.modifyTileEntity(util.grid.at(2, 1, 5), HarvesterTileEntity.class, hte -> hte.setAnimatedSpeed(0)); } + public static void mechanicalBearing(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_bearing", "Movings Structures using the Mechanical Bearing"); + 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.layer(2), Direction.DOWN); + scene.idle(10); + + Selection cog1 = util.select.position(6, 0, 4); + Selection cog2 = util.select.position(5, 1, 4); + Selection cog3 = util.select.position(4, 1, 3); + Selection cog4 = util.select.position(3, 1, 3); + Selection all = cog1.copy() + .add(cog2) + .add(cog3) + .add(cog4); + + BlockPos bearingPos = util.grid.at(3, 2, 3); + scene.overlay.showSelectionWithText(util.select.position(bearingPos.up()), 60) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .placeNearTarget() + .text("Mechanical Bearings attach to the block in front of them"); + scene.idle(50); + + ElementLink plank = scene.world.showIndependentSection(util.select.position(bearingPos.up() + .east() + .north()), Direction.DOWN); + scene.world.moveSection(plank, util.vector.of(-1, 0, 1), 0); + scene.idle(20); + + scene.world.setKineticSpeed(cog1, -8); + scene.world.setKineticSpeed(cog2, 8); + scene.world.setKineticSpeed(cog3, -16); + scene.world.setKineticSpeed(cog4, 16); + scene.effects.rotationSpeedIndicator(bearingPos.down()); + scene.world.rotateBearing(bearingPos, 360, 37 * 2); + scene.world.rotateSection(plank, 0, 360, 0, 37 * 2); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(bearingPos.up())) + .placeNearTarget() + .text("Upon receiving Rotational Force, it will assemble it into a Rotating Contraption"); + scene.idle(37 * 2); + scene.world.setKineticSpeed(all, 0); + scene.idle(20); + + scene.world.hideIndependentSection(plank, Direction.UP); + scene.idle(15); + Selection plank2 = util.select.position(4, 3, 2); + ElementLink contraption = scene.world.showIndependentSection(util.select.layersFrom(3) + .substract(plank2), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(plank2, Direction.SOUTH, contraption); + scene.idle(15); + scene.effects.superGlue(util.grid.at(4, 3, 2), Direction.SOUTH, true); + scene.idle(5); + + scene.world.configureCenterOfRotation(contraption, util.vector.topOf(bearingPos)); + scene.world.setKineticSpeed(cog1, -8); + scene.world.setKineticSpeed(cog2, 8); + scene.world.setKineticSpeed(cog3, -16); + scene.world.setKineticSpeed(cog4, 16); + scene.effects.rotationSpeedIndicator(bearingPos.down()); + scene.world.rotateBearing(bearingPos, 360 * 2, 37 * 4); + scene.world.rotateSection(contraption, 0, 360 * 2, 0, 37 * 4); + + scene.overlay.showText(120) + .pointAt(util.vector.topOf(bearingPos.up())) + .placeNearTarget() + .sharedText("movement_anchors"); + + scene.idle(37 * 4); + scene.world.setKineticSpeed(all, 0); + } + + public static void bearingModes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("bearing_modes", "Movement Modes of the Mechanical Bearing"); + Selection sideCog = util.select.position(util.grid.at(7, 0, 3)); + Selection cogColumn = util.select.fromTo(6, 1, 3, 6, 4, 3); + Selection cogAndClutch = util.select.fromTo(5, 3, 1, 5, 4, 2); + BlockPos leverPos = util.grid.at(5, 3, 1); + + scene.world.setKineticSpeed(sideCog, 4); + scene.world.setKineticSpeed(cogColumn, -4); + scene.world.setKineticSpeed(cogAndClutch, 8); + scene.world.toggleRedstonePower(cogAndClutch); + + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(cogColumn, Direction.DOWN); + scene.idle(5); + scene.world.showSection(cogAndClutch, Direction.DOWN); + scene.idle(10); + + BlockPos bearingPos = util.grid.at(5, 2, 2); + scene.world.showSection(util.select.position(bearingPos), Direction.UP); + scene.idle(10); + + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 2, 1, 2), Direction.EAST); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.idle(20); + + scene.world.toggleRedstonePower(cogAndClutch); + scene.effects.indicateRedstone(leverPos); + scene.world.rotateSection(contraption, 0, 55, 0, 23); + scene.world.rotateBearing(bearingPos, 55, 23); + scene.idle(24); + + scene.world.toggleRedstonePower(cogAndClutch); + scene.effects.indicateRedstone(leverPos); + scene.world.rotateSection(contraption, 0, 35, 0, 0); + scene.world.rotateBearing(bearingPos, 35, 0); + + Vec3d target = util.vector.topOf(bearingPos.down()); + scene.overlay.showLine(PonderPalette.RED, target.add(-2.5, 0, 3.5), target, 50); + scene.overlay.showLine(PonderPalette.GREEN, target.add(0, 0, 4.5), target, 50); + + scene.idle(50); + + scene.overlay.showText(100) + .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .placeNearTarget() + .colored(PonderPalette.RED) + .text("When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle"); + scene.idle(110); + + scene.overlay.showCenteredScrollInput(bearingPos, Direction.NORTH, 60); + scene.overlay.showControls( + new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.NORTH), Pointing.DOWN).scroll() + .withWrench(), + 60); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .placeNearTarget() + .text("This behaviour can be modified using a Wrench"); + scene.idle(70); + + scene.world.toggleRedstonePower(cogAndClutch); + scene.effects.indicateRedstone(leverPos); + scene.world.rotateSection(contraption, 0, -55, 0, 23); + scene.world.rotateBearing(bearingPos, -55, 23); + scene.idle(24); + + scene.world.toggleRedstonePower(cogAndClutch); + scene.effects.indicateRedstone(leverPos); + scene.idle(40); + + scene.overlay.showText(120) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP)) + .placeNearTarget() + .text("It can be configured never to revert to solid blocks, or only near the angle it started at"); + + } + + public static void stabilizedBearings(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("stabilized_bearings", "Stabilized Contraptions"); + + Selection beltAndBearing = util.select.fromTo(3, 3, 4, 3, 1, 6); + Selection largeCog = util.select.position(2, 0, 6); + BlockPos parentBearingPos = util.grid.at(3, 3, 4); + BlockPos bearingPos = util.grid.at(3, 4, 2); + + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(beltAndBearing, Direction.DOWN); + scene.idle(10); + + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(3, 3, 3, 3, 4, 3), Direction.SOUTH); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(parentBearingPos)); + scene.idle(20); + scene.world.glueBlockOnto(bearingPos, Direction.SOUTH, contraption); + + scene.idle(15); + + scene.overlay.showSelectionWithText(util.select.position(bearingPos), 60) + .text("Whenever Mechanical Bearings are themselves part of a moving Structure..") + .placeNearTarget(); + scene.idle(70); + + scene.world.setKineticSpeed(largeCog, -8); + scene.world.setKineticSpeed(beltAndBearing, 16); + scene.world.rotateBearing(parentBearingPos, 360, 74); + scene.world.rotateSection(contraption, 0, 0, 360, 74); + scene.world.rotateBearing(bearingPos, -360, 74); + scene.idle(74); + + scene.world.setKineticSpeed(largeCog, 0); + scene.world.setKineticSpeed(beltAndBearing, 0); + scene.overlay.showText(60) + .text("..they will attempt to keep themselves upright") + .pointAt(util.vector.blockSurface(bearingPos, Direction.NORTH)) + .placeNearTarget(); + scene.idle(70); + + scene.overlay.showSelectionWithText(util.select.position(bearingPos.north()), 60) + .colored(PonderPalette.GREEN) + .text("Once again, the bearing will attach to the block in front of it") + .placeNearTarget(); + scene.idle(70); + + ElementLink subContraption = + scene.world.showIndependentSection(util.select.fromTo(4, 4, 1, 2, 4, 1), Direction.SOUTH); + scene.world.configureCenterOfRotation(subContraption, util.vector.centerOf(parentBearingPos)); + scene.world.configureStabilization(subContraption, util.vector.centerOf(bearingPos)); + scene.idle(20); + + scene.overlay.showText(80) + .text("As a result, the entire sub-Contraption will stay upright"); + + scene.world.setKineticSpeed(largeCog, -8); + scene.world.setKineticSpeed(beltAndBearing, 16); + scene.world.rotateBearing(parentBearingPos, 360 * 2, 74 * 2); + scene.world.rotateSection(contraption, 0, 0, 360 * 2, 74 * 2); + scene.world.rotateBearing(bearingPos, -360 * 2, 74 * 2); + scene.world.rotateSection(subContraption, 0, 0, 360 * 2, 74 * 2); + + scene.markAsFinished(); + scene.idle(74 * 2); + scene.world.setKineticSpeed(largeCog, 0); + scene.world.setKineticSpeed(beltAndBearing, 0); + } + } 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 63438e8ec..2bbdb6088 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 @@ -83,6 +83,14 @@ public class PonderIndex { .addStoryBoard("windmill_bearing/structure", BearingScenes::windmillsAnyStructure, PonderTag.MOVEMENT_ANCHOR); + // Mechanical Bearing + PonderRegistry.forComponents(AllBlocks.MECHANICAL_BEARING) + .addStoryBoard("mechanical_bearing/anchor", BearingScenes::mechanicalBearing, PonderTag.KINETIC_APPLIANCES, + PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("mechanical_bearing/modes", BearingScenes::bearingModes) + .addStoryBoard("mechanical_bearing/stabilized", BearingScenes::stabilizedBearings, + PonderTag.CONTRAPTION_ACTOR); + // Gantries PonderRegistry.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft, PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); 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 aa53b9f60..e4f24ed6a 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 @@ -64,6 +64,7 @@ public class WorldSectionElement extends AnimatedSceneElement { Vec3d prevAnimatedRotation = Vec3d.ZERO; Vec3d animatedRotation = Vec3d.ZERO; Vec3d centerOfRotation = Vec3d.ZERO; + Vec3d stabilizationAnchor = null; BlockPos selectedBlock; @@ -103,6 +104,10 @@ public class WorldSectionElement extends AnimatedSceneElement { centerOfRotation = center; } + public void stabilizeRotation(Vec3d anchor) { + stabilizationAnchor = anchor; + } + @Override public void reset(PonderScene scene) { super.reset(scene); @@ -194,11 +199,21 @@ public class WorldSectionElement extends AnimatedSceneElement { if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) { if (centerOfRotation == null) centerOfRotation = section.getCenter(); + double rotX = MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x); + double rotZ = MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z); + double rotY = MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y); 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 = VecHelper.rotate(in, -rotX, Axis.X); + in = VecHelper.rotate(in, -rotZ, Axis.Z); + in = VecHelper.rotate(in, -rotY, Axis.Y); in = in.add(centerOfRotation); + if (stabilizationAnchor != null) { + in = in.subtract(stabilizationAnchor); + in = VecHelper.rotate(in, rotX, Axis.X); + in = VecHelper.rotate(in, rotZ, Axis.Z); + in = VecHelper.rotate(in, rotY, Axis.Y); + in = in.add(stabilizationAnchor); + } } return in; } @@ -209,12 +224,23 @@ public class WorldSectionElement extends AnimatedSceneElement { if (!animatedRotation.equals(Vec3d.ZERO) || !prevAnimatedRotation.equals(Vec3d.ZERO)) { if (centerOfRotation == null) centerOfRotation = section.getCenter(); + double rotX = MathHelper.lerp(pt, prevAnimatedRotation.x, animatedRotation.x); + double rotZ = MathHelper.lerp(pt, prevAnimatedRotation.z, animatedRotation.z); + double rotY = MathHelper.lerp(pt, prevAnimatedRotation.y, animatedRotation.y); 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)) + .rotateX(rotX) + .rotateZ(rotZ) + .rotateY(rotY) .translateBack(centerOfRotation); + if (stabilizationAnchor != null) { + MatrixStacker.of(ms) + .translate(stabilizationAnchor) + .rotateX(-rotX) + .rotateZ(-rotZ) + .rotateY(-rotY) + .translateBack(stabilizationAnchor); + } } } 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 e180ac92a..b0c50333c 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 @@ -3,22 +3,33 @@ package com.simibubi.create.foundation.ponder.instructions; import java.util.Optional; import java.util.function.Supplier; +import javax.annotation.Nullable; + +import com.simibubi.create.content.contraptions.components.structureMovement.glue.SuperGlueItem; 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; +import net.minecraft.util.math.BlockPos; public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction { private Selection initialSelection; private Optional> mergeOnto; + private BlockPos glue; public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, Optional> mergeOnto) { + this(fadeInTicks, fadeInFrom, selection, mergeOnto, null); + } + + public DisplayWorldSectionInstruction(int fadeInTicks, Direction fadeInFrom, Selection selection, + Optional> mergeOnto, @Nullable BlockPos glue) { super(fadeInTicks, fadeInFrom, new WorldSectionElement(selection)); initialSelection = selection; this.mergeOnto = mergeOnto; + this.glue = glue; } @Override @@ -34,6 +45,8 @@ public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction 0) return; mergeOnto.ifPresent(c -> element.mergeOnto(c.get())); + if (glue != null) + SuperGlueItem.spawnParticles(scene.getWorld(), glue, fadeInFrom, true); } @Override 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 a45b1d967..bad0f79b9 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 @@ -9,7 +9,7 @@ import net.minecraft.util.math.Vec3d; public abstract class FadeIntoSceneInstruction extends TickingInstruction { - private Direction fadeInFrom; + protected Direction fadeInFrom; protected T element; private ElementLink elementLink; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.java new file mode 100644 index 000000000..aee65a54e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/HighlightValueBoxInstruction.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.content.PonderPalette; + +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.Vec3d; + +public class HighlightValueBoxInstruction extends TickingInstruction { + + private Vec3d vec; + private Vec3d expands; + + public HighlightValueBoxInstruction(Vec3d vec, Vec3d expands, int duration) { + super(false, duration); + this.vec = vec; + this.expands = expands; + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + AxisAlignedBB point = new AxisAlignedBB(vec, vec); + AxisAlignedBB expanded = point.grow(expands.x, expands.y, expands.z); + scene.getOutliner() + .chaseAABB(vec, remainingTicks == totalTicks ? point : expanded) + .lineWidth(1 / 32f) + .colored(PonderPalette.WHITE.getColor()); + } + +} diff --git a/src/main/resources/ponder/mechanical_bearing/anchor.nbt b/src/main/resources/ponder/mechanical_bearing/anchor.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3ae522be00a2074c34eae63bde3123df86f9d3ce GIT binary patch literal 532 zcmV+v0_*)BiwFP!000000IikVirX*{hR2qaI9YnQXraCCTkKt-*GuWry)}w6afD^b zNDA5A2kY~7oY>jLaf~1_7#}qA%|8dBCBOo>SFgwbpuOjGi}tyI3{6l$p@;Tbz-*;$ zQTZi({8#{MtnZx?I9>?@;e!m=dAzqtM{JUT4U6FL2#$#0^qSKNPC8;Us&nt4PoctkIzI6Q(QA~?Nf5m9FmQRgWRkKl+=&Jvhe z1p(r*L0rSZ@ACt_`ooXE&6+He3{tg*uZ2VUy7#JXH0G5u7*sJLHyN~(-98MzA`Gqn zG^NJl`uxw%7-dRwzk4j4)%r>5-C^;l=XQmn%Tkf}rdPtdVWYO+{bl04GCbr7J`-7)SRWJF< zhG6TViq{O5ok6fow|a`wmt9k?(&haSO-JCt?QR=js*KO)Ea}R&o#VxfYsm!`?Xq7o W$R~7OSwqwH5B>x8Qs0xf2><{}w-Jf} literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/mechanical_bearing/modes.nbt b/src/main/resources/ponder/mechanical_bearing/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..a3e80f13f92b1250589dc822ac629f09a84d997d GIT binary patch literal 630 zcmV-+0*U<}iwFP!000000KJyaj?*v@#;38Jrd<{|fCML=f$QFoIIj>Z_8PhAY#PHU7;RRS$Gk8)lo^n7nE$Y*M%&&a zGq`r4*7Yu581Kyn#Di2014TZD^I`H7W}-{*rtYE#kuR}v4D_Y6yIciTY4do#^t93k zS+rZ6FHNHll##QbH-1{125qpTSLN=&>TUMk_^T$wtTJUe#&{PQrfgP->LrxN10^mB zC2iTx{>xdrS7E)0o~^>#=p%SA2!S_Jse##!_6cpQUmfS`xYQK>M%y0x-=&xLXkBG= Q*iC=nF9hIBpVkZj0Qi(KzW@LL literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/mechanical_bearing/stabilized.nbt b/src/main/resources/ponder/mechanical_bearing/stabilized.nbt new file mode 100644 index 0000000000000000000000000000000000000000..59ac0501cb0231612de1b1a34a8f7c5be2c52605 GIT binary patch literal 718 zcmV;<0x|s`iwFP!000000L_-)Z__Xk$1iodh#{qSY1M1wxi32!1fa7&HZF(&>y+>?(?mS?= zc))yhapC|DZ{>`EshMLiIZKR|@?6NPYG62oUY^3s#2{H7By(YHZd=q>k()b>J&DM6 zPK-N<9Qav@n8LDJua4=bUHBD}7 zW}|6RYnq{SV;FB>45A-o^?~}I)E`j)i~8T>*FO}t5*;6(9Dfr^Ls>>U%JP9@u_=A9W9hx;lg_rJ4+Gcx zO3|BIkN9RKq(X=S;ax$D#E1)b zu$bo#r-@b+gq*y^>y3p~dNEyo3$91s)`|qpkX`z(%1qO8YIKRF`ivaHo+X`^x6_$+ zP8Yy0gtSNuaYKhsbVtRm4V*6P(RB!)v?LwEO#P9y6`_A2k}5D)+R(c3&K>7Vx5U_) zs~sz>OS4YC6vi#5$heLE7=@)*ZY6ob@VfFQ)$3TzwI3FtU*u^j@i{{ Date: Wed, 10 Mar 2021 13:44:04 -0800 Subject: [PATCH 081/124] Instanced flywheels, engines, and schematicannons. --- .../com/simibubi/create/AllBlockPartials.java | 21 +++ .../com/simibubi/create/AllTileEntities.java | 4 + .../components/flywheel/FlyWheelInstance.java | 174 ++++++++++++++++-- .../components/flywheel/FlywheelRenderer.java | 5 +- .../flywheel/FlywheelTileEntity.java | 5 - .../flywheel/engine/EngineInstance.java | 80 ++++++++ .../flywheel/engine/EngineRenderer.java | 4 + .../flywheel/engine/EngineTileEntity.java | 18 +- .../components/mixer/MixerInstance.java | 7 +- .../block/SchematicannonInstance.java | 99 ++++++++++ .../block/SchematicannonRenderer.java | 82 ++++++--- .../block/SchematicannonTileEntity.java | 21 ++- .../foundation/utility/MatrixStacker.java | 9 + 13 files changed, 473 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java create mode 100644 src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java diff --git a/src/main/java/com/simibubi/create/AllBlockPartials.java b/src/main/java/com/simibubi/create/AllBlockPartials.java index dcef481c9..bfc1cb9fd 100644 --- a/src/main/java/com/simibubi/create/AllBlockPartials.java +++ b/src/main/java/com/simibubi/create/AllBlockPartials.java @@ -16,8 +16,11 @@ import com.simibubi.create.content.contraptions.fluids.FluidTransportBehaviour.A import com.simibubi.create.content.contraptions.processing.burner.BlazeBurnerBlock.HeatLevel; import com.simibubi.create.content.contraptions.relays.belt.BeltData; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; @@ -259,4 +262,22 @@ public class AllBlockPartials { return dispatcher.getMaterial(KineticRenderMaterials.ROTATING).getModel(this, referenceState, facing, ms); } + public InstancedModel renderOnHorizontalModel(InstancedTileRenderer dispatcher, BlockState referenceState) { + Direction facing = referenceState.get(HORIZONTAL_FACING); + return renderOnDirectionalSouthModel(dispatcher, referenceState, facing); + } + + public InstancedModel renderOnDirectionalSouthModel(InstancedTileRenderer dispatcher, BlockState referenceState, Direction facing) { + Supplier ms = () -> { + MatrixStack stack = new MatrixStack(); + MatrixStacker.of(stack) + .centre() + .rotateY(AngleHelper.horizontalAngle(facing)) + .rotateX(AngleHelper.verticalAngle(facing)) + .unCentre(); + return stack; + }; + return dispatcher.getMaterial(RenderMaterials.MODELS).getModel(this, referenceState, facing, ms); + } + } diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 6f4e55685..e480efc82 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -32,6 +32,7 @@ import com.simibubi.create.content.contraptions.components.fan.NozzleTileEntity; import com.simibubi.create.content.contraptions.components.flywheel.FlyWheelInstance; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; +import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineInstance; import com.simibubi.create.content.contraptions.components.flywheel.engine.EngineRenderer; import com.simibubi.create.content.contraptions.components.flywheel.engine.FurnaceEngineTileEntity; import com.simibubi.create.content.contraptions.components.millstone.MillStoneCogInstance; @@ -139,6 +140,7 @@ import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; +import com.simibubi.create.content.schematics.block.SchematicannonInstance; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; @@ -151,6 +153,7 @@ public class AllTileEntities { .tileEntity("schematicannon", SchematicannonTileEntity::new) .validBlocks(AllBlocks.SCHEMATICANNON) .renderer(() -> SchematicannonRenderer::new) + .onRegister(SchematicannonInstance::register) .register(); public static final TileEntityEntry SCHEMATIC_TABLE = Create.registrate() @@ -456,6 +459,7 @@ public class AllTileEntities { .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) .validBlocks(AllBlocks.FURNACE_ENGINE) .renderer(() -> EngineRenderer::new) + .onRegister(EngineInstance::register) .register(); public static final TileEntityEntry MILLSTONE = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index e81756d8f..2bc3cb728 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -1,34 +1,57 @@ package com.simibubi.create.content.contraptions.components.flywheel; -import java.util.function.Consumer; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import com.google.common.collect.Collections2; +import com.google.common.collect.Lists; +import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; -import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; -import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; -import net.minecraft.block.BlockState; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; +import net.minecraft.world.LightType; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; -public class FlyWheelInstance extends KineticTileInstance { +public class FlyWheelInstance extends KineticTileInstance implements ITickableInstance { public static void register(TileEntityType type) { DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedTileRenderRegistry.instance.register(type, FlyWheelInstance::new)); } protected Direction facing; + protected boolean connectedLeft; + protected float connectorAngleMult; + + protected Direction connection; protected InstanceKey shaft; -// protected InstanceKey wheel; + + protected InstanceKey wheel; + protected InstanceKey upperRotating; + protected InstanceKey lowerRotating; + protected InstanceKey upperSliding; + protected InstanceKey lowerSliding; + + protected List> connectors; + + protected float lastAngle = Float.NaN; public FlyWheelInstance(InstancedTileRenderer modelManager, FlywheelTileEntity tile) { super(modelManager, tile); @@ -40,35 +63,152 @@ public class FlyWheelInstance extends KineticTileInstance { Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); shaft = setup(shaftModel().createInstance(), tile.getSpeed(), axis); -// wheel = wheelModel().setupInstance(setup); + + wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontalModel(modelManager, lastState.rotate(Rotation.CLOCKWISE_90)).createInstance(); + + connection = FlywheelBlock.getConnection(lastState); + if (connection != null) { + connectedLeft = lastState.get(FlywheelBlock.CONNECTION) == FlywheelBlock.ConnectionState.LEFT; + + boolean flipAngle = connection.getAxis() == Direction.Axis.X ^ connection.getAxisDirection() == Direction.AxisDirection.NEGATIVE; + + connectorAngleMult = flipAngle ? -1 : 1; + + RenderMaterial> mat = modelManager.getMaterial(RenderMaterials.MODELS); + + upperRotating = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_ROTATING, lastState).createInstance(); + lowerRotating = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_ROTATING, lastState).createInstance(); + upperSliding = mat.getModel(AllBlockPartials.FLYWHEEL_UPPER_SLIDING, lastState).createInstance(); + lowerSliding = mat.getModel(AllBlockPartials.FLYWHEEL_LOWER_SLIDING, lastState).createInstance(); + + connectors = Lists.newArrayList(upperRotating, lowerRotating, upperSliding, lowerSliding); + } else { + connectors = Collections.emptyList(); + } + + updateLight(); + } + + @Override + public void tick() { + + float partialTicks = AnimationTickHolder.getPartialTicks(); + + float speed = tile.visualSpeed.get(partialTicks) * 3 / 10f; + float angle = tile.angle + speed * partialTicks; + + if (Math.abs(angle - lastAngle) < 0.001) return; + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()); + + if (connection != null) { + float rotation = angle * connectorAngleMult; + + ms.push(); + rotateToFacing(msr, connection); + + ms.push(); + transformConnector(msr, true, true, rotation, connectedLeft); + upperRotating.getInstance().setTransform(ms); + ms.pop(); + + ms.push(); + transformConnector(msr, false, true, rotation, connectedLeft); + lowerRotating.getInstance().setTransform(ms); + ms.pop(); + + ms.push(); + transformConnector(msr, true, false, rotation, connectedLeft); + upperSliding.getInstance().setTransform(ms); + ms.pop(); + + ms.push(); + transformConnector(msr, false, false, rotation, connectedLeft); + lowerSliding.getInstance().setTransform(ms); + ms.pop(); + + ms.pop(); + } + + msr.centre() + .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, facing.getAxis()), AngleHelper.rad(angle)) + .unCentre(); + + wheel.getInstance().setTransformNoCopy(ms); + + lastAngle = angle; } @Override protected void onUpdate() { Direction.Axis axis = ((IRotate) lastState.getBlock()).getRotationAxis(lastState); updateRotation(shaft, axis); -// updateRotation(wheel, axis); } @Override public void updateLight() { - relight(shaft); -// wheel.modifyInstance(this::relight); + int block = world.getLightLevel(LightType.BLOCK, pos); + int sky = world.getLightLevel(LightType.SKY, pos); + + shaft.getInstance().setBlockLight(block).setSkyLight(sky); + wheel.getInstance().setBlockLight(block).setSkyLight(sky); + + if (connection != null) { + BlockPos pos = this.pos.offset(connection); + + int connectionBlock = world.getLightLevel(LightType.BLOCK, pos); + int connectionSky = world.getLightLevel(LightType.SKY, pos); + connectors.stream() + .map(InstanceKey::getInstance) + .forEach(data -> data.setBlockLight(connectionBlock).setSkyLight(connectionSky)); + } } @Override public void remove() { shaft.delete(); -// wheel.delete(); -// wheel = null; + wheel.delete(); + + connectors.forEach(InstanceKey::delete); + connectors.clear(); } protected InstancedModel shaftModel() { return AllBlockPartials.SHAFT_HALF.renderOnDirectionalSouthRotating(modelManager, lastState, facing.getOpposite()); } - protected InstancedModel wheelModel() { - BlockState rotate = lastState.rotate(Rotation.CLOCKWISE_90); - return AllBlockPartials.FLYWHEEL.renderOnDirectionalSouthRotating(modelManager, rotate, rotate.get(BlockStateProperties.HORIZONTAL_FACING)); + protected void transformConnector(MatrixStacker ms, boolean upper, boolean rotating, float angle, boolean flip) { + float shift = upper ? 1 / 4f : -1 / 8f; + float offset = upper ? 1 / 4f : 1 / 4f; + float radians = (float) (angle / 180 * Math.PI); + float shifting = MathHelper.sin(radians) * shift + offset; + + float maxAngle = upper ? -5 : -15; + float minAngle = upper ? -45 : 5; + float barAngle = 0; + + if (rotating) + barAngle = MathHelper.lerp((MathHelper.sin((float) (radians + Math.PI / 2)) + 1) / 2, minAngle, maxAngle); + + float pivotX = (upper ? 8f : 3f) / 16; + float pivotY = (upper ? 8f : 2f) / 16; + float pivotZ = (upper ? 23f : 21.5f) / 16f; + + ms.translate(pivotX, pivotY, pivotZ + shifting); + if (rotating) + ms.rotate(Direction.EAST, AngleHelper.rad(barAngle)); + ms.translate(-pivotX, -pivotY, -pivotZ); + + if (flip && !upper) + ms.translate(9 / 16f, 0, 0); + } + + protected void rotateToFacing(MatrixStacker buffer, Direction facing) { + buffer.centre() + .rotate(Direction.UP, AngleHelper.rad(AngleHelper.horizontalAngle(facing))) + .unCentre(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java index be3d3e108..03434b9e9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelRenderer.java @@ -9,6 +9,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock.ConnectionState; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.block.BlockState; @@ -33,10 +34,11 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + if (FastRenderDispatcher.available(te.getWorld())) return; + BlockState blockState = te.getBlockState(); FlywheelTileEntity wte = (FlywheelTileEntity) te; - SuperByteBuffer wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontal(blockState.rotate(Rotation.CLOCKWISE_90)); float speed = wte.visualSpeed.get(partialTicks) * 3 / 10f; float angle = wte.angle + speed * partialTicks; @@ -68,6 +70,7 @@ public class FlywheelRenderer extends KineticTileEntityRenderer { .renderInto(ms, vb); } + SuperByteBuffer wheel = AllBlockPartials.FLYWHEEL.renderOnHorizontal(blockState.rotate(Rotation.CLOCKWISE_90)); kineticRotationTransform(wheel, te, blockState.get(HORIZONTAL_FACING) .getAxis(), AngleHelper.rad(angle), light); wheel.renderInto(ms, vb); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 67f4952b7..2dab48a50 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -100,9 +100,4 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { updateGeneratedRotation(); } } - - @Override - public boolean shouldRenderAsTE() { - return true; - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java new file mode 100644 index 000000000..2324e3a7d --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java @@ -0,0 +1,80 @@ +package com.simibubi.create.content.contraptions.components.flywheel.engine; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.TileEntityInstance; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.block.Block; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class EngineInstance extends TileEntityInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, EngineInstance::new)); + } + + protected BlockPos baseBlockPos; + protected InstanceKey frame; + + public EngineInstance(InstancedTileRenderer modelManager, EngineTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + Block block = lastState + .getBlock(); + if (!(block instanceof EngineBlock)) + return; + + EngineBlock engineBlock = (EngineBlock) block; + AllBlockPartials frame = engineBlock.getFrameModel(); + + Direction facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING); + + baseBlockPos = EngineBlock.getBaseBlockPos(lastState, pos); + + this.frame = modelManager.getMaterial(RenderMaterials.MODELS).getModel(frame, lastState).createInstance(); + + float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()) + .centre() + .rotate(Direction.UP, angle) + .unCentre() + .translate(0, 0, -1); + + this.frame.getInstance() + .setTransformNoCopy(ms); + + updateLight(); + } + + @Override + public void remove() { + frame.delete(); + } + + @Override + public void updateLight() { + int block = world.getLightLevel(LightType.BLOCK, baseBlockPos); + int sky = world.getLightLevel(LightType.SKY, baseBlockPos); + + frame.getInstance().setBlockLight(block).setSkyLight(sky); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java index 477348870..597895c48 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineRenderer.java @@ -2,6 +2,7 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; @@ -21,6 +22,9 @@ public class EngineRenderer extends SafeTileEntityRe @Override protected void renderSafe(T te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (FastRenderDispatcher.available(te.getWorld())) return; + Block block = te.getBlockState() .getBlock(); if (block instanceof EngineBlock) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java index 6a3988caa..b14e7e47e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java @@ -3,8 +3,10 @@ package com.simibubi.create.content.contraptions.components.flywheel.engine; import java.util.List; import com.simibubi.create.AllBlocks; +import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelBlock; import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; +import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; @@ -16,8 +18,10 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.fml.DistExecutor; +import org.apache.http.client.CredentialsProvider; -public class EngineTileEntity extends SmartTileEntity { +public class EngineTileEntity extends SmartTileEntity implements IInstanceRendered { public float appliedCapacity; public float appliedSpeed; @@ -100,4 +104,16 @@ public class EngineTileEntity extends SmartTileEntity { poweredWheel.setRotation(appliedSpeed, appliedCapacity); } + @Override + public void onChunkLightUpdate() { + CreateClient.kineticRenderer.onLightUpdate(this); + } + + @Override + public void initialize() { + super.initialize(); + + DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java index cdf738df3..4beadc933 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java @@ -48,9 +48,12 @@ public class MixerInstance extends ShaftlessCogInstance implements ITickableInst .createInstance(); - updateLight(); MechanicalMixerTileEntity mixer = (MechanicalMixerTileEntity) tile; - transformPole(getRenderedHeadOffset(mixer)); + float renderedHeadOffset = getRenderedHeadOffset(mixer); + + transformPole(renderedHeadOffset); + transformHead(mixer, renderedHeadOffset); + updateLight(); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java new file mode 100644 index 000000000..47ddbaf4c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java @@ -0,0 +1,99 @@ +package com.simibubi.create.content.schematics.block; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelInstance; +import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelTileEntity; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.WorldRenderer; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class SchematicannonInstance extends TileEntityInstance implements ITickableInstance { + public static void register(TileEntityType type) { + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> + InstancedTileRenderRegistry.instance.register(type, SchematicannonInstance::new)); + } + + private InstanceKey connector; + private InstanceKey pipe; + + public SchematicannonInstance(InstancedTileRenderer modelManager, SchematicannonTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + + RenderMaterial> mat = modelManager.getMaterial(RenderMaterials.MODELS); + + connector = mat.getModel(AllBlockPartials.SCHEMATICANNON_CONNECTOR, lastState).createInstance(); + pipe = mat.getModel(AllBlockPartials.SCHEMATICANNON_PIPE, lastState).createInstance(); + + updateLight(); + } + + @Override + public void tick() { + float partialTicks = AnimationTickHolder.getPartialTicks(); + + double[] cannonAngles = SchematicannonRenderer.getCannonAngles(tile, pos, partialTicks); + + double pitch = cannonAngles[0]; + double yaw = cannonAngles[1]; + + double recoil = SchematicannonRenderer.getRecoil(tile, partialTicks); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()); + + ms.push(); + msr.centre(); + msr.rotate(Direction.UP, (float) ((yaw + 90) / 180 * Math.PI)); + msr.unCentre(); + connector.getInstance().setTransform(ms); + ms.pop(); + + msr.translate(.5f, 15 / 16f, .5f); + msr.rotate(Direction.UP, (float) ((yaw + 90) / 180 * Math.PI)); + msr.rotate(Direction.SOUTH, (float) (pitch / 180 * Math.PI)); + msr.translate(-.5f, -15 / 16f, -.5f); + msr.translate(0, -recoil / 100, 0); + + pipe.getInstance().setTransformNoCopy(ms); + } + + @Override + public void remove() { + connector.delete(); + pipe.delete(); + } + + @Override + public void updateLight() { + int block = world.getLightLevel(LightType.BLOCK, pos); + int sky = world.getLightLevel(LightType.SKY, pos); + + connector.getInstance() + .setBlockLight(block) + .setSkyLight(sky); + + pipe.getInstance() + .setBlockLight(block) + .setSkyLight(sky); + } +} diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java index 6163c07fc..32856a392 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.schematics.block.LaunchedItem.ForBlockState; import com.simibubi.create.content.schematics.block.LaunchedItem.ForEntity; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import net.minecraft.block.BlockState; @@ -40,33 +41,20 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer launched.totalTicks - 10) + recoil = Math.max(recoil, (launched.ticksRemaining + 1 - partialTicks) - launched.totalTicks + 10); + } + + return recoil; + } + + private static void renderLaunchedBlocks(SchematicannonTileEntity tileEntityIn, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { for (LaunchedItem launched : tileEntityIn.flyingBlocks) { if (launched.ticksRemaining == 0) @@ -141,10 +171,6 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer launched.totalTicks - 10) - recoil = Math.max(recoil, (launched.ticksRemaining + 1 - partialTicks) - launched.totalTicks + 10); - // Render particles for launch if (launched.ticksRemaining == launched.totalTicks && tileEntityIn.firstRenderTick) { tileEntityIn.firstRenderTick = false; @@ -162,8 +188,6 @@ public class SchematicannonRenderer extends SafeTileEntityRenderer () -> CreateClient.kineticRenderer.add(this)); + } + + @Override + public void onChunkLightUpdate() { + CreateClient.kineticRenderer.onLightUpdate(this); + } + + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 5db42563c..9b41a4ed2 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import net.minecraft.client.renderer.Quaternion; import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -23,6 +24,14 @@ public class MatrixStacker { return instance; } + public MatrixStacker rotate(Direction axis, float radians) { + if (radians == 0) + return this; + ms.multiply(axis.getUnitVector() + .getRadialQuaternion(radians)); + return this; + } + public MatrixStacker rotate(double angle, Axis axis) { Vector3f vec = axis == Axis.X ? Vector3f.POSITIVE_X : axis == Axis.Y ? Vector3f.POSITIVE_Y : Vector3f.POSITIVE_Z; From b7f0fe9b10701339313b0a4f397e2d843a342225 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 10 Mar 2021 16:09:17 -0800 Subject: [PATCH 082/124] Oops engine stuff is okay again. --- .../components/flywheel/FlyWheelInstance.java | 6 +++++- .../components/flywheel/engine/EngineInstance.java | 8 +++----- .../create/foundation/render/backend/Backend.java | 6 ++++++ .../foundation/render/backend/FastRenderDispatcher.java | 2 +- .../simibubi/create/foundation/utility/MatrixStacker.java | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index 2bc3cb728..267e05572 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -53,6 +53,8 @@ public class FlyWheelInstance extends KineticTileInstance im protected float lastAngle = Float.NaN; + protected boolean firstFrame = true; + public FlyWheelInstance(InstancedTileRenderer modelManager, FlywheelTileEntity tile) { super(modelManager, tile); } @@ -87,6 +89,7 @@ public class FlyWheelInstance extends KineticTileInstance im } updateLight(); + firstFrame = true; } @Override @@ -97,7 +100,7 @@ public class FlyWheelInstance extends KineticTileInstance im float speed = tile.visualSpeed.get(partialTicks) * 3 / 10f; float angle = tile.angle + speed * partialTicks; - if (Math.abs(angle - lastAngle) < 0.001) return; + if (!firstFrame && Math.abs(angle - lastAngle) < 0.001) return; MatrixStack ms = new MatrixStack(); MatrixStacker msr = MatrixStacker.of(ms); @@ -140,6 +143,7 @@ public class FlyWheelInstance extends KineticTileInstance im wheel.getInstance().setTransformNoCopy(ms); lastAngle = angle; + firstFrame = false; } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java index 2324e3a7d..dcffdd401 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java @@ -25,7 +25,6 @@ public class EngineInstance extends TileEntityInstance { InstancedTileRenderRegistry.instance.register(type, EngineInstance::new)); } - protected BlockPos baseBlockPos; protected InstanceKey frame; public EngineInstance(InstancedTileRenderer modelManager, EngineTileEntity tile) { @@ -44,8 +43,6 @@ public class EngineInstance extends TileEntityInstance { Direction facing = lastState.get(BlockStateProperties.HORIZONTAL_FACING); - baseBlockPos = EngineBlock.getBaseBlockPos(lastState, pos); - this.frame = modelManager.getMaterial(RenderMaterials.MODELS).getModel(frame, lastState).createInstance(); float angle = AngleHelper.rad(AngleHelper.horizontalAngle(facing)); @@ -54,6 +51,7 @@ public class EngineInstance extends TileEntityInstance { MatrixStacker msr = MatrixStacker.of(ms); msr.translate(getFloatingPos()) + .nudge(tile.hashCode()) .centre() .rotate(Direction.UP, angle) .unCentre() @@ -72,8 +70,8 @@ public class EngineInstance extends TileEntityInstance { @Override public void updateLight() { - int block = world.getLightLevel(LightType.BLOCK, baseBlockPos); - int sky = world.getLightLevel(LightType.SKY, baseBlockPos); + int block = world.getLightLevel(LightType.BLOCK, pos); + int sky = world.getLightLevel(LightType.SKY, pos); frame.getInstance().setBlockLight(block).setSkyLight(sky); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 159122f24..b2a50382f 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -13,6 +13,8 @@ import com.simibubi.create.foundation.render.backend.gl.GlFog; import com.simibubi.create.foundation.render.backend.gl.GlFogMode; import com.simibubi.create.foundation.render.backend.gl.shader.*; import com.simibubi.create.foundation.render.backend.gl.versioned.GlFeatureCompat; +import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld; +import net.minecraft.world.World; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.lwjgl.opengl.GL; @@ -65,6 +67,10 @@ public class Backend { return (P) programs.get(spec).get(GlFog.getFogMode()); } + public static boolean isFlywheelWorld(World world) { + return world == Minecraft.getInstance().world || (world instanceof IFlywheelWorld && ((IFlywheelWorld) world).supportsFlywheel()); + } + public static boolean available() { return canUseVBOs(); } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index 7038c4a78..6f096d888 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -57,7 +57,7 @@ public class FastRenderDispatcher { } public static boolean available(World world) { - return Backend.canUseInstancing() && !(world instanceof SchematicWorld); + return Backend.canUseInstancing() && Backend.isFlywheelWorld(world); } public static int getDebugMode() { diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 9b41a4ed2..0323a1ebb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -84,7 +84,7 @@ public class MatrixStacker { } public MatrixStacker nudge(int id) { - long randomBits = (long) id * 493286711L; + long randomBits = (long) id * 31L * 493286711L; randomBits = randomBits * randomBits * 4392167121L + randomBits * 98761L; float xNudge = (((float) (randomBits >> 16 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; float yNudge = (((float) (randomBits >> 20 & 7L) + 0.5F) / 8.0F - 0.5F) * 0.004F; From c54d80a1618715ce2c82289875777983583d9b80 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Wed, 10 Mar 2021 17:08:20 -0800 Subject: [PATCH 083/124] Better bounding boxes for bearings. - Fix bug causing entities to slip off the far corners of bearing contraptions. - This was already implemented for BearingLighter.java, now it's promoted to Contraption.java. - Promote anonymous WrappedWorld in Contraption.java to inner class. --- .../structureMovement/Contraption.java | 104 ++++++++++++------ .../bearing/BearingLighter.java | 63 +---------- .../render/backend/light/GridAlignedBB.java | 4 + .../create/foundation/utility/Coordinate.java | 8 ++ 4 files changed, 83 insertions(+), 96 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/Coordinate.java 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 d80494f5e..660ced0b3 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 @@ -20,6 +20,9 @@ import java.util.stream.Collectors; import javax.annotation.Nullable; +import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld; +import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; +import com.simibubi.create.foundation.utility.*; import org.apache.commons.lang3.tuple.MutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -53,12 +56,6 @@ import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.fluid.CombinedTankWrapper; import com.simibubi.create.foundation.render.backend.light.EmptyLighter; -import com.simibubi.create.foundation.utility.BlockFace; -import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.NBTHelper; -import com.simibubi.create.foundation.utility.NBTProcessors; -import com.simibubi.create.foundation.utility.UniqueLinkedList; -import com.simibubi.create.foundation.utility.VecHelper; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import net.minecraft.block.AbstractButtonBlock; @@ -85,7 +82,6 @@ import net.minecraft.state.properties.PistonType; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.Rotation; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; @@ -853,16 +849,7 @@ public abstract class Contraption { TileEntity te = TileEntity.create(tag); if (te == null) return; - te.setLocation(new WrappedWorld(world) { - - @Override - public BlockState getBlockState(BlockPos pos) { - if (!pos.equals(te.getPos())) - return Blocks.AIR.getDefaultState(); - return info.state; - } - - }, te.getPos()); + te.setLocation(new ContraptionTileWorld(world, te, info), te.getPos()); if (te instanceof KineticTileEntity) ((KineticTileEntity) te).setSpeed(0); te.getBlockState(); @@ -1091,27 +1078,25 @@ public abstract class Contraption { } public void expandBoundsAroundAxis(Axis axis) { - AxisAlignedBB bb = bounds; - double maxXDiff = Math.max(bb.maxX - 1, -bb.minX); - double maxYDiff = Math.max(bb.maxY - 1, -bb.minY); - double maxZDiff = Math.max(bb.maxZ - 1, -bb.minZ); - double maxDiff = 0; + Set blocks = getBlocks().keySet(); - if (axis == Axis.X) - maxDiff = Math.max(maxZDiff, maxYDiff); - if (axis == Axis.Y) - maxDiff = Math.max(maxZDiff, maxXDiff); - if (axis == Axis.Z) - maxDiff = Math.max(maxXDiff, maxYDiff); + int radius = (int) (Math.ceil(Math.sqrt(getRadius(blocks, axis)))); - Vec3d vec = new Vec3d(Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis) - .getDirectionVec()); - Vec3d planeByNormal = VecHelper.axisAlingedPlaneOf(vec); - Vec3d min = vec.mul(bb.minX, bb.minY, bb.minZ) - .add(planeByNormal.scale(-maxDiff)); - Vec3d max = vec.mul(bb.maxX, bb.maxY, bb.maxZ) - .add(planeByNormal.scale(maxDiff + 1)); - bounds = new AxisAlignedBB(min, max); + GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius); + + GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(bounds); + if (axis == Direction.Axis.X) { + betterBounds.maxX = contraptionBounds.maxX; + betterBounds.minX = contraptionBounds.minX; + } else if (axis == Direction.Axis.Y) { + betterBounds.maxY = contraptionBounds.maxY; + betterBounds.minY = contraptionBounds.minY; + } else if (axis == Direction.Axis.Z) { + betterBounds.maxZ = contraptionBounds.maxZ; + betterBounds.minZ = contraptionBounds.minZ; + } + + bounds = betterBounds.toAABB(); } public void addExtraInventories(Entity entity) {} @@ -1163,4 +1148,51 @@ public abstract class Contraption { return new EmptyLighter(this); } + public static float getRadius(Set blocks, Direction.Axis axis) { + switch (axis) { + case X: + return getMaxDistSqr(blocks, BlockPos::getY, BlockPos::getZ); + case Y: + return getMaxDistSqr(blocks, BlockPos::getX, BlockPos::getZ); + case Z: + return getMaxDistSqr(blocks, BlockPos::getX, BlockPos::getY); + } + + throw new IllegalStateException("Impossible axis"); + } + + public static float getMaxDistSqr(Set blocks, Coordinate one, Coordinate other) { + float maxDistSq = -1; + for (BlockPos pos : blocks) { + float a = one.get(pos); + float b = other.get(pos); + + float distSq = a * a + b * b; + + + if (distSq > maxDistSq) maxDistSq = distSq; + } + + return maxDistSq; + } + + private static class ContraptionTileWorld extends WrappedWorld implements IFlywheelWorld { + + private final TileEntity te; + private final BlockInfo info; + + public ContraptionTileWorld(World world, TileEntity te, BlockInfo info) { + super(world); + this.te = te; + this.info = info; + } + + @Override + public BlockState getBlockState(BlockPos pos) { + if (!pos.equals(te.getPos())) + return Blocks.AIR.getDefaultState(); + return info.state; + } + + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java index ef4ab3bf4..ac670ea50 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java @@ -1,13 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import java.util.Set; - import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; -import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; - public class BearingLighter extends ContraptionLighter { public BearingLighter(BearingContraption contraption) { @@ -16,60 +11,8 @@ public class BearingLighter extends ContraptionLighter { @Override public GridAlignedBB getContraptionBounds() { - Set blocks = contraption.getBlocks().keySet(); - - Direction orientation = contraption.facing; - Direction.Axis axis = orientation.getAxis(); - - int radius = (int) (Math.ceil(Math.sqrt(getRadius(blocks, axis)))); - - GridAlignedBB betterBounds = GridAlignedBB.ofRadius(radius); - - GridAlignedBB contraptionBounds = GridAlignedBB.fromAABB(contraption.bounds); - if (axis == Direction.Axis.X) { - betterBounds.maxX = contraptionBounds.maxX; - betterBounds.minX = contraptionBounds.minX; - } else if (axis == Direction.Axis.Y) { - betterBounds.maxY = contraptionBounds.maxY; - betterBounds.minY = contraptionBounds.minY; - } else if (axis == Direction.Axis.Z) { - betterBounds.maxZ = contraptionBounds.maxZ; - betterBounds.minZ = contraptionBounds.minZ; - } - - betterBounds.translate(contraption.anchor); - return betterBounds; - } - - private static float getRadius(Set blocks, Direction.Axis axis) { - switch (axis) { - case X: - return getMaxDistSqr(blocks, BlockPos::getY, BlockPos::getZ); - case Y: - return getMaxDistSqr(blocks, BlockPos::getX, BlockPos::getZ); - case Z: - return getMaxDistSqr(blocks, BlockPos::getX, BlockPos::getY); - } - - throw new IllegalStateException("Impossible axis"); - } - - private static float getMaxDistSqr(Set blocks, Coordinate one, Coordinate other) { - float maxDistSq = -1; - for (BlockPos pos : blocks) { - float a = one.get(pos); - float b = other.get(pos); - - float distSq = a * a + b * b; - - - if (distSq > maxDistSq) maxDistSq = distSq; - } - - return maxDistSq; - } - - private interface Coordinate { - float get(BlockPos from); + GridAlignedBB bb = GridAlignedBB.fromAABB(contraption.bounds); + bb.translate(contraption.anchor); + return bb; } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java index f711ab41f..5ee051229 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/light/GridAlignedBB.java @@ -269,6 +269,10 @@ public class GridAlignedBB { } } + public AxisAlignedBB toAABB() { + return toAABB(this); + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/simibubi/create/foundation/utility/Coordinate.java b/src/main/java/com/simibubi/create/foundation/utility/Coordinate.java new file mode 100644 index 000000000..adb419c3e --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/Coordinate.java @@ -0,0 +1,8 @@ +package com.simibubi.create.foundation.utility; + +import net.minecraft.util.math.BlockPos; + +@FunctionalInterface +public interface Coordinate { + float get(BlockPos from); +} From c73e3166cbe433125f10bd43599896fccdcbce68 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 11 Mar 2021 03:32:18 +0100 Subject: [PATCH 084/124] Contraption Ponder Push - Scenes for Pulley, Piston, and Clockwork Bearing --- .../bearing/ClockworkBearingTileEntity.java | 13 +- .../bearing/IBearingTileEntity.java | 2 + .../pulley/PulleyRenderer.java | 6 +- .../pulley/PulleyTileEntity.java | 20 ++ .../create/foundation/ponder/PonderScene.java | 9 +- .../ponder/content/BearingScenes.java | 138 ++++++++- .../ponder/content/PistonScenes.java | 279 ++++++++++++++++++ .../ponder/content/PonderIndex.java | 22 ++ .../ponder/content/PulleyScenes.java | 221 ++++++++++++++ .../foundation/ponder/content/SharedText.java | 1 + .../AnimateTileEntityInstruction.java | 8 +- .../DisplayWorldSectionInstruction.java | 2 + .../MarkAsFinishedInstruction.java | 5 + .../resources/ponder/clockwork_bearing.nbt | Bin 0 -> 882 bytes .../ponder/mechanical_piston/anchor.nbt | Bin 0 -> 904 bytes .../ponder/mechanical_piston/modes.nbt | Bin 0 -> 878 bytes .../ponder/mechanical_piston/piston_pole.nbt | Bin 0 -> 782 bytes .../resources/ponder/rope_pulley/anchor.nbt | Bin 0 -> 742 bytes .../ponder/rope_pulley/attachment.nbt | Bin 0 -> 874 bytes .../resources/ponder/rope_pulley/modes.nbt | Bin 0 -> 679 bytes 20 files changed, 712 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java create mode 100644 src/main/resources/ponder/clockwork_bearing.nbt create mode 100644 src/main/resources/ponder/mechanical_piston/anchor.nbt create mode 100644 src/main/resources/ponder/mechanical_piston/modes.nbt create mode 100644 src/main/resources/ponder/mechanical_piston/piston_pole.nbt create mode 100644 src/main/resources/ponder/rope_pulley/anchor.nbt create mode 100644 src/main/resources/ponder/rope_pulley/attachment.nbt create mode 100644 src/main/resources/ponder/rope_pulley/modes.nbt diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java index 49cba252a..197637276 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingTileEntity.java @@ -28,7 +28,8 @@ import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; -public class ClockworkBearingTileEntity extends KineticTileEntity implements IBearingTileEntity, IDisplayAssemblyExceptions { +public class ClockworkBearingTileEntity extends KineticTileEntity + implements IBearingTileEntity, IDisplayAssemblyExceptions { protected ControlledContraptionEntity hourHand; protected ControlledContraptionEntity minuteHand; @@ -40,9 +41,10 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe protected boolean running; protected boolean assembleNextTick; protected AssemblyException lastException; - protected ScrollOptionBehaviour operationMode; + private float prevForcedAngle; + public ClockworkBearingTileEntity(TileEntityType type) { super(type); setLazyTickRate(3); @@ -67,6 +69,7 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe super.tick(); if (world.isRemote) { + prevForcedAngle = hourAngle; clientMinuteAngleDiff /= 2; clientHourAngleDiff /= 2; } @@ -341,6 +344,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe @Override public float getInterpolatedAngle(float partialTicks) { + if (isVirtual()) + return MathHelper.lerp(partialTicks, prevForcedAngle, hourAngle); if (hourHand == null || hourHand.isStalled()) partialTicks = 0; return MathHelper.lerp(partialTicks, hourAngle, hourAngle + getHourArmSpeed()); @@ -414,4 +419,8 @@ public class ClockworkBearingTileEntity extends KineticTileEntity implements IBe public boolean shouldRenderAsTE() { return true; } + + public void setAngle(float forcedAngle) { + hourAngle = forcedAngle; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java index f2f9a475d..e729feae4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/IBearingTileEntity.java @@ -20,5 +20,7 @@ public interface IBearingTileEntity extends IControlContraption { return bearingAxis != axis; }); } + + void setAngle(float forcedAngle); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java index 182e063bb..00d708294 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyRenderer.java @@ -41,9 +41,7 @@ public class PulleyRenderer extends AbstractPulleyRenderer { @Override protected float getOffset(KineticTileEntity te, float partialTicks) { PulleyTileEntity pulley = (PulleyTileEntity) te; - boolean running = pulley.running; - boolean moving = running && (pulley.movedContraption == null || !pulley.movedContraption.isStalled()); - float offset = pulley.getInterpolatedOffset(moving ? partialTicks : 0.5f); + float offset = pulley.getInterpolatedOffset(partialTicks); if (pulley.movedContraption != null) { AbstractContraptionEntity e = pulley.movedContraption; @@ -57,7 +55,7 @@ public class PulleyRenderer extends AbstractPulleyRenderer { @Override protected boolean isRunning(KineticTileEntity te) { - return ((PulleyTileEntity) te).running; + return ((PulleyTileEntity) te).running || te.isVirtual(); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index 5fde955e9..f6dbbb33c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -27,6 +27,7 @@ import net.minecraft.util.math.Vec3d; public class PulleyTileEntity extends LinearActuatorTileEntity { protected int initialOffset; + private float prevAnimatedOffset; public PulleyTileEntity(TileEntityType type) { super(type); @@ -41,6 +42,13 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { public double getMaxRenderDistanceSquared() { return super.getMaxRenderDistanceSquared() + offset * offset; } + + @Override + public void tick() { + super.tick(); + if (isVirtual()) + prevAnimatedOffset = offset; + } @Override protected void assemble() throws AssemblyException { @@ -219,4 +227,16 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { return new CenteredSideValueBoxTransform((state, d) -> d == Direction.UP); } + @Override + public float getInterpolatedOffset(float partialTicks) { + if (isVirtual()) + return MathHelper.lerp(partialTicks, prevAnimatedOffset, offset); + boolean moving = running && (movedContraption == null || !movedContraption.isStalled()); + return super.getInterpolatedOffset(moving ? partialTicks : 0.5f); + } + + public void animateOffset(float forcedOffset) { + offset = forcedOffset; + } + } 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 1eee89b34..a622c8b8d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -80,6 +80,7 @@ public class PonderScene { int offsetZ; int size; + boolean stoppedCounting; int totalTime; int currentTime; @@ -189,6 +190,7 @@ public class PonderScene { elements.add(baseWorldSection); totalTime = 0; + stoppedCounting = false; activeSchedule.addAll(schedule); activeSchedule.forEach(i -> i.onScheduled(this)); } @@ -269,7 +271,12 @@ public class PonderScene { } public void addToSceneTime(int time) { - totalTime += time; + if (!stoppedCounting) + totalTime += time; + } + + public void stopCounting() { + stoppedCounting = true; } public void addElement(PonderElement e) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index 9ba29fd57..a1526380d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -327,9 +327,10 @@ public class BearingScenes { scene.overlay.showText(60) .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) .placeNearTarget() - .text("This behaviour can be modified using a Wrench"); + .sharedText("behaviour_modify_wrench"); scene.idle(70); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); scene.world.toggleRedstonePower(cogAndClutch); scene.effects.indicateRedstone(leverPos); scene.world.rotateSection(contraption, 0, -55, 0, 23); @@ -343,7 +344,6 @@ public class BearingScenes { scene.overlay.showText(120) .colored(PonderPalette.GREEN) .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.UP)) - .placeNearTarget() .text("It can be configured never to revert to solid blocks, or only near the angle it started at"); } @@ -410,11 +410,143 @@ public class BearingScenes { scene.world.rotateSection(contraption, 0, 0, 360 * 2, 74 * 2); scene.world.rotateBearing(bearingPos, -360 * 2, 74 * 2); scene.world.rotateSection(subContraption, 0, 0, 360 * 2, 74 * 2); - + scene.markAsFinished(); scene.idle(74 * 2); scene.world.setKineticSpeed(largeCog, 0); scene.world.setKineticSpeed(beltAndBearing, 0); } + public static void clockwork(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("clockwork_bearing", "Animating Structures using Clockwork Bearings"); + + Selection kinetics = util.select.fromTo(3, 3, 4, 3, 1, 6); + Selection largeCog = util.select.position(2, 0, 6); + BlockPos bearingPos = util.grid.at(3, 3, 3); + + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(10); + + scene.overlay.showSelectionWithText(util.select.position(bearingPos.north()), 60) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .placeNearTarget() + .text("Clockwork Bearings attach to blocks in front of them"); + scene.idle(50); + + ElementLink plank = + scene.world.showIndependentSection(util.select.position(2, 3, 2), Direction.SOUTH); + scene.world.moveSection(plank, util.vector.of(1, 0, 0), 0); + scene.idle(20); + + scene.world.rotateSection(plank, 0, 0, 60, 25); + scene.world.rotateBearing(bearingPos, 60, 25); + scene.world.setKineticSpeed(kinetics, 8); + scene.world.setKineticSpeed(largeCog, -4); + + scene.idle(25); + scene.overlay.showText(80) + .pointAt(util.vector.blockSurface(bearingPos.north(), Direction.NORTH)) + .placeNearTarget() + .text("Upon receiving Rotational Force, the structure will be rotated according to the hour of the day"); + scene.idle(90); + + scene.overlay.showText(30) + .pointAt(util.vector.blockSurface(bearingPos.north(), Direction.NORTH)) + .placeNearTarget() + .text("3:00"); + scene.world.rotateSection(plank, 0, 0, 30, 12); + scene.world.rotateBearing(bearingPos, 30, 12); + scene.idle(42); + scene.overlay.showText(30) + .pointAt(util.vector.blockSurface(bearingPos.north(), Direction.NORTH)) + .placeNearTarget() + .text("4:00"); + scene.world.rotateSection(plank, 0, 0, 30, 12); + scene.world.rotateBearing(bearingPos, 30, 12); + scene.idle(42); + + InputWindowElement clickTheBearing = new InputWindowElement(util.vector.topOf(bearingPos), Pointing.DOWN); + InputWindowElement clickTheBearingSide = + new InputWindowElement(util.vector.blockSurface(bearingPos, Direction.WEST), Pointing.LEFT); + + scene.overlay.showControls(clickTheBearing.rightClick(), 60); + scene.idle(7); + scene.world.rotateSection(plank, 0, 0, -120, 0); + scene.world.rotateBearing(bearingPos, -120, 0); + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(bearingPos, Direction.WEST)) + .placeNearTarget() + .text("Right-Click the bearing to start or stop animating the structure"); + scene.idle(70); + + scene.world.hideIndependentSection(plank, Direction.NORTH); + scene.idle(15); + + ElementLink hourHand = + scene.world.showIndependentSection(util.select.fromTo(3, 3, 1, 3, 5, 2), Direction.SOUTH); + scene.world.configureCenterOfRotation(hourHand, util.vector.centerOf(bearingPos)); + scene.idle(15); + scene.overlay.showSelectionWithText(util.select.fromTo(3, 3, 1, 3, 4, 2), 80) + .placeNearTarget() + .sharedText("movement_anchors"); + scene.idle(90); + + scene.overlay.showControls(clickTheBearingSide.rightClick(), 20); + scene.idle(7); + scene.world.rotateSection(hourHand, 0, 0, 120, 50); + scene.world.rotateBearing(bearingPos, 120, 50); + scene.idle(60); + + scene.overlay.showSelectionWithText(util.select.position(bearingPos.north(3)), 80) + .placeNearTarget() + .colored(PonderPalette.BLUE) + .text("In front of the Hour Hand, a second structure can be added"); + scene.idle(90); + scene.overlay.showControls(clickTheBearingSide.rightClick(), 20); + scene.idle(7); + scene.world.rotateSection(hourHand, 0, 0, -120, 0); + scene.world.rotateBearing(bearingPos, -120, 0); + scene.idle(10); + + ElementLink minuteHand = + scene.world.showIndependentSection(util.select.fromTo(3, 3, 0, 3, 6, 0), Direction.SOUTH); + scene.world.configureCenterOfRotation(minuteHand, util.vector.centerOf(bearingPos)); + scene.idle(30); + + scene.overlay.showOutline(PonderPalette.BLUE, minuteHand, util.select.fromTo(3, 3, 0, 3, 6, 0), 85); + scene.overlay.showSelectionWithText(util.select.fromTo(3, 3, 1, 3, 4, 2), 80) + .placeNearTarget() + .colored(PonderPalette.GREEN) + .text("Ensure the two Structures are not attached to each other through super glue or similar"); + scene.idle(90); + + scene.overlay.showControls(clickTheBearingSide.rightClick(), 20); + scene.idle(7); + + scene.world.rotateSection(hourHand, 0, 0, 120, 50); + scene.world.rotateSection(minuteHand, 0, 0, 180, 75); + scene.world.rotateBearing(bearingPos, 120, 50); + scene.idle(90); + scene.world.rotateSection(minuteHand, 0, 0, 6, 3); + + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.blockSurface(bearingPos.north(3), Direction.NORTH)) + .colored(PonderPalette.GREEN) + .text("The Second Structure will now rotate as the Minute Hand"); + scene.markAsFinished(); + + for (int i = 0; i < 40; i++) { + scene.idle(23); + scene.world.rotateSection(minuteHand, 0, 0, 6, 3); + if (i == 29) + scene.world.rotateSection(hourHand, 0, 0, 30, 20); + } + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java new file mode 100644 index 000000000..28706d1fa --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PistonScenes.java @@ -0,0 +1,279 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonHeadBlock; +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.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FaceCursorPose; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.block.DoublePlantBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.state.properties.DoubleBlockHalf; +import net.minecraft.state.properties.PistonType; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +public class PistonScenes { + + public static void movement(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_piston", "Moving Structures using Mechanical Pistons"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(0, 1, 2)), Direction.UP); + + Selection kinetics = util.select.fromTo(3, 1, 3, 3, 1, 2); + BlockPos piston = util.grid.at(3, 1, 2); + BlockPos leverPos = util.grid.at(3, 2, 4); + BlockPos shaft = util.grid.at(3, 1, 3); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(piston), Direction.DOWN); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(0, 0, 1), 0); + scene.idle(20); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .east()), Direction.DOWN, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .east(2)), Direction.DOWN, contraption); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .west()), Direction.DOWN, contraption); + scene.idle(15); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.overlay.showText(55) + .pointAt(util.vector.topOf(piston)) + .placeNearTarget() + .text("Mechanical Pistons can move blocks in front of them"); + scene.idle(65); + + scene.overlay.showText(45) + .pointAt(util.vector.blockSurface(shaft, Direction.SOUTH)) + .placeNearTarget() + .text("Speed and direction of movement depend on the Rotational Input"); + scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.getDefaultState(), false); + scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.OAK_PLANKS.getDefaultState(), false); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.idle(60); + + scene.overlay.showControls( + new InputWindowElement(util.vector.blockSurface(piston, Direction.WEST), Pointing.DOWN).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)), + 30); + scene.idle(7); + scene.world.modifyBlock(piston.north(), s -> s.with(MechanicalPistonHeadBlock.TYPE, PistonType.STICKY), false); + scene.effects.superGlue(piston, Direction.WEST, true); + + scene.idle(33); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + + scene.idle(25); + scene.overlay.showText(60) + .pointAt(util.vector.topOf(piston)) + .placeNearTarget() + .text("Sticky Mechanical Pistons can pull the attached blocks back"); + scene.idle(20); + scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.OAK_PLANKS.getDefaultState(), false); + scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.AIR.getDefaultState(), false); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + + scene.idle(50); + scene.world.setBlock(util.grid.at(2, 1, 1), Blocks.AIR.getDefaultState(), false); + ElementLink chassis = + scene.world.showIndependentSection(util.select.fromTo(2, 2, 0, 2, 3, 2), Direction.DOWN); + scene.world.moveSection(chassis, util.vector.of(0, -1, 1), 0); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(1, 2, 0), Direction.EAST, chassis); + scene.idle(15); + scene.effects.superGlue(piston.west() + .north(), Direction.WEST, true); + scene.overlay.showText(80) + .pointAt(util.vector.topOf(piston.west())) + .placeNearTarget() + .sharedText("movement_anchors"); + + scene.idle(90); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.world.moveSection(chassis, util.vector.of(-2, 0, 0), 40); + } + + public static void poles(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("piston_pole", "Piston Extension Poles"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + + Selection kinetics = util.select.fromTo(3, 1, 3, 3, 1, 2); + BlockPos piston = util.grid.at(3, 1, 2); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(piston), Direction.DOWN); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(0, 0, 1), 0); + scene.idle(20); + + BlockPos leverPos = util.grid.at(3, 2, 4); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.setKineticSpeed(kinetics, 16); + scene.idle(10); + + scene.overlay.showSelectionWithText(util.select.position(piston), 50) + .colored(PonderPalette.RED) + .placeNearTarget() + .text("Without attached Poles, a Mechanical Piston cannot move"); + scene.idle(60); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.setKineticSpeed(kinetics, 0); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .east()), Direction.DOWN, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .east(2)), Direction.DOWN, contraption); + scene.idle(10); + + scene.overlay.showOutline(PonderPalette.RED, new Object(), util.select.fromTo(piston.east(), piston.east(2)), + 100); + scene.overlay.showSelectionWithText(util.select.fromTo(piston.west(), piston.west(2)), 100) + .text("The Length of pole added at its back determines the Extension Range") + .placeNearTarget() + .colored(PonderPalette.GREEN); + scene.idle(110); + + scene.world.showSectionAndMerge(util.select.position(piston.north() + .west()), Direction.EAST, contraption); + scene.idle(10); + ElementLink birb = + scene.special.createBirb(util.vector.topOf(piston.west()), FaceCursorPose::new); + scene.idle(15); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.special.moveParrot(birb, util.vector.of(-2, 0, 0), 40); + + } + + public static void movementModes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_piston_modes", "Movement Modes of the Mechanical Piston"); + scene.configureBasePlate(0, 0, 5); + Selection rose = util.select.fromTo(0, 2, 2, 0, 1, 2); + scene.world.showSection(util.select.layer(0) + .add(rose), Direction.UP); + + Selection kinetics = util.select.fromTo(3, 1, 3, 3, 1, 2); + BlockPos piston = util.grid.at(3, 1, 2); + BlockPos leverPos = util.grid.at(3, 2, 4); + BlockPos shaft = util.grid.at(3, 1, 3); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 2, 5), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(piston), Direction.DOWN); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(3, 1, 1), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(0, 0, 1), 0); + scene.idle(20); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .east()), Direction.DOWN, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .east(2)), Direction.DOWN, contraption); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .west()), Direction.DOWN, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(piston.north() + .west() + .up()), Direction.DOWN, contraption); + scene.idle(15); + scene.effects.superGlue(piston.west(), Direction.UP, true); + scene.idle(10); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.idle(40); + + scene.world.destroyBlock(util.grid.at(0, 1, 2)); + scene.world.destroyBlock(util.grid.at(0, 2, 2)); + scene.idle(10); + scene.overlay.showSelectionWithText(rose, 70) + .text("Whenever Pistons stop moving, the moved structure reverts to blocks") + .colored(PonderPalette.RED); + scene.idle(80); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(rose, Direction.UP); + scene.idle(50); + + scene.world.setBlock(util.grid.at(0, 1, 2), Blocks.ROSE_BUSH.getDefaultState(), false); + scene.world.setBlock(util.grid.at(0, 2, 2), Blocks.ROSE_BUSH.getDefaultState() + .with(DoublePlantBlock.HALF, DoubleBlockHalf.UPPER), false); + scene.world.showIndependentSection(rose, Direction.DOWN); + scene.overlay.showCenteredScrollInput(piston, Direction.UP, 60); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(piston), Pointing.DOWN).scroll() + .withWrench(), 60); + scene.overlay.showText(70) + .pointAt(util.vector.topOf(piston)) + .placeNearTarget() + .sharedText("behaviour_modify_wrench"); + scene.idle(80); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(leverPos, leverPos.down())); + scene.world.modifyKineticSpeed(kinetics, f -> -f); + scene.effects.rotationDirectionIndicator(shaft); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 40); + scene.idle(50); + scene.overlay.showText(120) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(util.grid.at(0, 1, 2), Direction.WEST)) + .placeNearTarget() + .text("It can be configured never to revert to solid blocks, or only at the location it started at"); + + } + +} 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 2bbdb6088..67b6c5e68 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 @@ -77,6 +77,24 @@ public class PonderIndex { .addStoryBoard("funnels/transposer", FunnelScenes::transposer); PonderRegistry.addStoryBoard(AllBlocks.ANDESITE_FUNNEL, "funnels/brass", FunnelScenes::brass); + // Mechanical Piston + PonderRegistry.forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) + .addStoryBoard("mechanical_piston/anchor", PistonScenes::movement, PonderTag.KINETIC_APPLIANCES, + PonderTag.MOVEMENT_ANCHOR); + PonderRegistry + .forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON, + AllBlocks.PISTON_EXTENSION_POLE) + .addStoryBoard("mechanical_piston/piston_pole", PistonScenes::poles); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) + .addStoryBoard("mechanical_piston/modes", PistonScenes::movementModes); + + // Windmill Bearing + PonderRegistry.forComponents(AllBlocks.ROPE_PULLEY) + .addStoryBoard("rope_pulley/anchor", PulleyScenes::movement, PonderTag.KINETIC_APPLIANCES, + PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("rope_pulley/modes", PulleyScenes::movementModes) + .addStoryBoard("rope_pulley/attachment", PulleyScenes::attachment); + // Windmill Bearing PonderRegistry.forComponents(AllBlocks.WINDMILL_BEARING) .addStoryBoard("windmill_bearing/source", BearingScenes::windmillsAsSource, PonderTag.KINETIC_SOURCES) @@ -91,6 +109,10 @@ public class PonderIndex { .addStoryBoard("mechanical_bearing/stabilized", BearingScenes::stabilizedBearings, PonderTag.CONTRAPTION_ACTOR); + // Clockwork Bearing + PonderRegistry.addStoryBoard(AllBlocks.CLOCKWORK_BEARING, "clockwork_bearing", BearingScenes::clockwork, + PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); + // Gantries PonderRegistry.addStoryBoard(AllBlocks.GANTRY_SHAFT, "gantry/intro", GantryScenes::introForShaft, PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java new file mode 100644 index 000000000..b4712e67c --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java @@ -0,0 +1,221 @@ +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.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +public class PulleyScenes { + + public static void movement(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("rope_pulley", "Moving Structures using Rope Pulleys"); + scene.configureBasePlate(0, 0, 8); + + Selection reversable = util.select.fromTo(2, 3, 4, 2, 4, 2); + BlockPos leverPos = util.grid.at(1, 2, 4); + BlockPos pulleyPos = util.grid.at(2, 4, 2); + Selection redstoneStuff = util.select.fromTo(leverPos, leverPos.east()); + + scene.world.showSection(util.select.layer(0), Direction.UP); + ElementLink plank = + scene.world.showIndependentSection(util.select.position(2, 1, 2), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(1, 4, 3, 2, 1, 4), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(util.select.position(pulleyPos), Direction.SOUTH); + scene.idle(20); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, 2, 40); + + scene.idle(45); + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(pulleyPos, Direction.WEST)) + .text("Rope Pulleys can move blocks vertically when given Rotational Force") + .placeNearTarget(); + scene.idle(70); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, -2, 40); + scene.world.moveSection(plank, util.vector.of(0, 2, 0), 40); + scene.idle(60); + + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(pulleyPos, Direction.SOUTH)) + .text("Direction and Speed of movement depend on the Rotational Input") + .placeNearTarget(); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, 2, 40); + scene.world.moveSection(plank, util.vector.of(0, -2, 0), 40); + scene.idle(50); + + scene.world.hideIndependentSection(plank, Direction.NORTH); + scene.idle(15); + ElementLink chassis = + scene.world.showIndependentSection(util.select.fromTo(2, 1, 1, 0, 2, 1), Direction.SOUTH); + scene.world.moveSection(chassis, util.vector.of(1, 0, 1), 0); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(2, 1, 0), Direction.SOUTH, chassis); + scene.idle(15); + scene.effects.superGlue(util.grid.at(3, 1, 1), Direction.SOUTH, true); + scene.overlay.showText(80) + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 2), Direction.NORTH)) + .placeNearTarget() + .sharedText("movement_anchors"); + scene.idle(90); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, -2, 40); + scene.world.moveSection(chassis, util.vector.of(0, 2, 0), 40); + scene.idle(50); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, 2, 40); + scene.world.moveSection(chassis, util.vector.of(0, -2, 0), 40); + scene.idle(50); + } + + public static void movementModes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("rope_pulley_modes", "Movement Modes of the Rope Pulley"); + scene.configureBasePlate(0, 0, 8); + + Selection reversable = util.select.fromTo(2, 3, 4, 2, 4, 2); + BlockPos leverPos = util.grid.at(1, 2, 4); + BlockPos pulleyPos = util.grid.at(2, 4, 2); + Selection redstoneStuff = util.select.fromTo(leverPos, leverPos.east()); + BlockPos flowerPos = util.grid.at(2, 1, 2); + + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.showSection(util.select.position(flowerPos), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(1, 4, 3, 2, 1, 4), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(util.select.position(pulleyPos), Direction.SOUTH); + ElementLink glass = + scene.world.showIndependentSection(util.select.position(pulleyPos.down()), Direction.UP); + scene.idle(20); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, 2, 40); + scene.world.moveSection(glass, util.vector.of(0, -2, 0), 40); + scene.idle(40); + + scene.world.destroyBlock(flowerPos); + scene.idle(10); + scene.overlay.showSelectionWithText(util.select.position(flowerPos), 70) + .text("Whenever Pulleys stop moving, the moved structure reverts to blocks") + .placeNearTarget() + .colored(PonderPalette.RED); + scene.idle(80); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, -2, 40); + scene.world.moveSection(glass, util.vector.of(0, 2, 0), 40); + scene.world.hideSection(util.select.position(flowerPos), Direction.DOWN); + scene.idle(40); + + scene.world.setBlock(flowerPos, Blocks.BLUE_ORCHID.getDefaultState(), false); + scene.world.showSection(util.select.position(flowerPos), Direction.DOWN); + scene.overlay.showCenteredScrollInput(pulleyPos, Direction.UP, 60); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(pulleyPos), Pointing.DOWN).scroll() + .withWrench(), 60); + scene.overlay.showText(70) + .pointAt(util.vector.topOf(pulleyPos)) + .placeNearTarget() + .sharedText("behaviour_modify_wrench"); + scene.idle(80); + + scene.world.toggleRedstonePower(redstoneStuff); + scene.effects.indicateRedstone(leverPos); + scene.world.modifyKineticSpeed(reversable, f -> -f); + scene.effects.rotationDirectionIndicator(pulleyPos.south()); + scene.world.movePulley(pulleyPos, 2, 40); + scene.world.moveSection(glass, util.vector.of(0, -2, 0), 40); + scene.idle(50); + scene.overlay.showText(120) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(flowerPos, Direction.WEST)) + .placeNearTarget() + .text("It can be configured never to revert to solid blocks, or only at the location it started at"); + } + + public static void attachment(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("rope_pulley_attachment", "Moving Pulleys as part of a Contraption"); + scene.configureBasePlate(0, 0, 8); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + Selection kinetics = util.select.fromTo(4, 3, 2, 4, 1, 5); + Selection largeCog = util.select.position(3, 0, 5); + + scene.world.showSection(kinetics, Direction.DOWN); + ElementLink poles = + scene.world.showIndependentSection(util.select.fromTo(4, 4, 2, 6, 4, 2), Direction.DOWN); + scene.world.moveSection(poles, util.vector.of(0, -1, 0), 0); + scene.idle(10); + + BlockPos pulleyPos = util.grid.at(3, 3, 2); + ElementLink pulley = + scene.world.showIndependentSection(util.select.position(pulleyPos), Direction.EAST); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.fromTo(3, 1, 1, 3, 1, 2) + .add(util.select.position(3, 2, 1)), Direction.SOUTH, pulley); + + scene.idle(10); + scene.overlay.showText(50) + .pointAt(util.vector.blockSurface(pulleyPos, Direction.WEST)) + .placeNearTarget() + .text("Whenever Pulleys are themselves being moved by a Contraption..."); + scene.idle(60); + + scene.world.setKineticSpeed(largeCog, -16); + scene.world.setKineticSpeed(kinetics, 32); + scene.effects.rotationDirectionIndicator(util.grid.at(4, 1, 5)); + scene.world.moveSection(poles, util.vector.of(-2, 0, 0), 40); + scene.world.moveSection(pulley, util.vector.of(-2, 0, 0), 40); + scene.idle(40); + + scene.overlay.showSelectionWithText(util.select.fromTo(1, 1, 1, 1, 1, 2), 50) + .colored(PonderPalette.GREEN) + .placeNearTarget() + .text("...its attached structure will be dragged with it"); + scene.idle(60); + scene.overlay.showText(80) + .colored(PonderPalette.RED) + .pointAt(util.vector.topOf(pulleyPos.west(2))) + .placeNearTarget() + .text("Mind that pulleys are only movable while stopped"); + } + +} 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 c7e2ed679..73d233ba2 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 @@ -16,6 +16,7 @@ public class SharedText { add("rpm32", "32 RPM"); add("movement_anchors", "With the help of Chassis or Super Glue, larger structures can be moved."); + add("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java index 99e1e8f2b..fd788e53d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -4,7 +4,7 @@ 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.bearing.IBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; @@ -24,14 +24,14 @@ public class AnimateTileEntityInstruction extends TickingInstruction { 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)) + (w, f) -> castIfPresent(w, location, IBearingTileEntity.class).ifPresent(bte -> bte.setAngle(f)), + (w) -> castIfPresent(w, location, IBearingTileEntity.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, f) -> castIfPresent(w, location, PulleyTileEntity.class).ifPresent(pulley -> pulley.animateOffset(f)), (w) -> castIfPresent(w, location, PulleyTileEntity.class).map(pulley -> pulley.offset) .orElse(0f)); } 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 b0c50333c..d9f5c70fc 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 @@ -35,6 +35,8 @@ public class DisplayWorldSectionInstruction extends FadeIntoSceneInstruction element.setAnimatedOffset(wse.get() + .getAnimatedOffset(), true)); element.set(initialSelection); element.setVisible(true); } 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 a7f2e15b2..ef15e46dd 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 @@ -14,5 +14,10 @@ public class MarkAsFinishedInstruction extends PonderInstruction { public void tick(PonderScene scene) { scene.setFinished(true); } + + @Override + public void onScheduled(PonderScene scene) { + scene.stopCounting(); + } } diff --git a/src/main/resources/ponder/clockwork_bearing.nbt b/src/main/resources/ponder/clockwork_bearing.nbt new file mode 100644 index 0000000000000000000000000000000000000000..43b4c4f9331c19a3ec7a5bb6a95906a7d5c0fa2c GIT binary patch literal 882 zcmV-&1C9J2iwFP!000000JT=zZreBz9bM@7lC%NZ0!2}v4}IM)$lId3zy{b&igsJH zeGzDBA`78Ofu!R&AGY7uk!;FZRd(6L5g^dA&YU@;xsYRk5yYmr!w3MX`^eoR7^1X= zEzm%9jbJbpD!n#idiZSwQK^hG3SfN&5in!9#f?Q96ZT+&4kq&8i9L9j2anSn?%@f0 zFkPO=gD3XjVIDl8TU(fLM_iFdE+UUy?Bj_&c$f!|)7{2IJ(%z(7#Dl&k<-{Cr~7zf z4<6>h<1{mmd@+xF?c<3(cvvsb7$P~f5llX&S_$!)i$(QfIE1js;7O{HkZ0+P8&jAb zWwp8%V|){4w4C)-8UeHfd|M98J z$Tnaw`b#ZzgAd^7!$QhJ=J10&Sj&6q8?Qt9htid;@$)d47g;9oFl;9 zqiAx@bzXH*zMLV7`*A&WC9s2~{veHcFDElWSq zrkYAUS#t3JDb3^IwDioGlG>H#izvh@QCEqbVRA!ITvg|;Ke*+eQJX?Z+LHf+@7H)} IoS_c@0IqSk<^TWy literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/mechanical_piston/anchor.nbt b/src/main/resources/ponder/mechanical_piston/anchor.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7bbee5cc9b26aca8678ccaf5a149b4d2570bb317 GIT binary patch literal 904 zcmV;319$u%iwFP!000000L4~KZ`(!?9q~h=2W$KnnzpYvrrG z5NmQo5nApNyQ|1f5Wv4G_vD|nzoIu~D3LNlQ_9A0TLJ_j?aX^K?=6Qr0O*6K(|70s zKyi2J_KIg80u&}SDQYOLK6KByj3#~iRm`tg$7#ek(B4;P16QXdrpe`4;J6kzo&}Cm*3_}+%dzmwvG8jXj%$JAS>UWJweZ5V z@M05=Yk}ig;8d4qp|fY9^CleE0>^8`8GtL!jSE}DNJ-9LF+MF8f&iQ}h94q@6nPkp znbxUpsjT@Hxp#tC-@jgo=z~AZ5#!H`s<)ppZJu64n446J0Q$!=%cY>H1wXytH;M_( zDS!WPe@S?dOw$9R#O$139$=MtAmnMPjTEPnqu&2Os_mW-iC$2>%wtNWVs@Th7!;Zk zo}oz0xF~Y~-JzVSh^A-f&3r!pi=Kbb!XZ8Xr04I1)qBloh>8S!=sq8fG@7GD^}Q1` zGpQy%1jj6AQED!Ky(%Q|hBS^Tr0c`h&vA_L&?waU=&I1c`7NH$|G5JH=rQ3fSB_y} zb?1BBj%JOuYHFC+gsadOp$J*k6-@HK6cAK5@bq`(~ssF* z_b8^9Gmge!ah}``z&l|X!d^yQM~aQi;cT253?nH>7D}oj?q5e}A!p&@P};UC*(A(4 z6BA9X4NjHJQ5C1z0Jb&hI=Kwbr7A7|nWbhS~&`u-#0)rGEq1Eto>arAWe2sg)48C=F9Q zbD5JTLaL1M74oBX%7iNKYut-l$3OxEu4^Gl zn+vffMvP4-D>VbfWl-ZLk-2~L-&l!=v)uz&$B+bxzv@>a=74Y!wi-dbxfxP(`jHF3m(^k z$Ftz6MrRFArv=mGaV&UT3m(sc$0>cPW1JR@a|@;#P7UL((C%2|%dyDUIv&r0XPHuq ze7P3+TF2vB@OTzH)$lCNg=Z1xbv&*GkJrjG09TwDAN*mC7=K&5*?hyaIl722H<=Ux z^bh4Ymx4M1{QPOxC?+%~``!KBNFhD!C6jEAX^rDEKHI~}a8JmSOdBaqBuBmbnLOG) zrcLx>tG9Vfrc|g~M;8W#CWAL95|b8^2hbhLiHfK*b^e&o=YP@sCoSyL{DI~Z;_AI; z)SyHHK6HN@jWn8rh4;N8|NIu^Gu-0qT7P~dt0@28rAPNbo}~X>ew!I zB*>Ibvyr(?!s#jr^~2C@Ncej7!&C8hspCbdW4Njj`86HA|1%Z$)3GuibsfP9O#O1} zx5T4~88k4y1qND<>P8F3X<#0-`0O<5Y?Cm(oN+V;i|?tQ0`QL67-45j(Tfxtnf+;+ z84M#SD7<7;As*czw2;$q@lm#1-MU##IQ3&vH8@c+M^${t1>^zQ%)lQpu5UOW*Q^v- zm81>Z?ug2RdZ0H&ZGuWncPu~B+W@xNMW#c>rAWe2rnG79vbsk$HrkjHOmUec7?&i( zQP4x@a!L1~D!Y{YZc_AeIYmY0o>7xF>+kx<{hX+3pEH#d$x5avBEKKkR>^fImPS%M zGs`I_nhxOkY{~p|Rpi4IS$y|>mc&m=;*t%kYdp;9zHjn+DdQvXd6AhV!^4}>Q&MAi zHqq${!%3ds)sUPjcV_m(eL{MK>f{DILP-AUlyi>+ zAWUKs&?Fx{(z)O=n(01%dEO&lCUxnw9v<Op%$ESI2$-l zgH4^|T5voI4z=L8g{G>F+me@S(F@n27n?Yq1&3O2*6p(Bg=f)=O&rgHLoGPvpcZwe z7Iogl@hmvBk<%xhxG+BPM;X9)^~?4N)8_apg3KgR1f+K)(@YB7?c~L`fl*9oj{bv# zL8Jg5hVeWZGOZ!K;MYSa9fv}mCE7@FCOPQAcT}`{ib3=;)W>X$uDDQlj;{;|jSeRu zVl&NCc1ZXAT!=)(D1B=bDarXchbEf6%+qi)ly+4vSVoL6qGBEGZp70j~7z_{xH@~spmeFT1Tk4&afdus+93H`B_`p!zr-w z{o|~`PYZBCgYvcsGrX4ST#5)lAeU18-JW#-V3hzncdL@aC8+$$dd&ynUfXhvp$*A@w z@kFsbl7dN3c`DBEJiGyyuuAPTB#x`nfHD~+*0KwvQ(8ui{XKpA~?u8Nwc@Pe`Qn9K~XcR2( zNbgRJ&ej>-3PyHk)$WEEeegROV)SEbyzZUSPc?t=K8pzHw4u>S$1wKKeWt}5UPEqHn9Qx3F$ul0tdU8B9 zVAi3wPLRNdoueqisG}t+bvQNZ-IHiG`}H0C!+r8`wen&*PgHO=P7>pMEjMtLn+HX1 zWSU_&8w-Jxij14RwtSv_>-^lPs8JLDRfvy@5LG(b?2rm(P9hKXvRCI{L_^8pJ)lNy0&0Dclta&Fx9>w_J*+bvnEo zN^ysy@vpYjyG_@q|Hsi-Z{@2sYtbjjxInGZyh*m3z)txH;qizf2_^68gM1Kc?1pJV zp^{OFczBIaNt$=(ucK9~DIaz-!IPn)#J1mc!w3W%2Zd-~FNE|?1d4^s%0EbGbMIe496uHUl zZdAvPY`5F?#8dHBJVTjm;%ww*TMKP1McIvKzVDmyjO{5Q6B6n28Ym&8d3NxL@ku5m z1z}24f+o$FkmQuh{7g^r&+7@Hwba(BAC$z}Faw>(&?XqM2^^cy1BZIxL>@SH1b5&B zBQ`Eh=z&8$a3T*JJ3@~@T(Qh4No9O{7+dEnR)dE`0r$n#w| z)B`6P#hDT+P7NiypK~QS|H}AzGm)kwEDQ1|SAdp>`GRR(>Jio^f?>6VTR{v*5%-S- zZY7ML%w`%)V;YnAa}7|CmEYrI{Ha$TzSISJ2LajnbS^|G=H!+j(h7Rg2~x6#tUl)) zuF&fnLnic!Nz$^t`8}F+>WHPC*!zT0a`67rfY7BBA3)5_qP4tN?(@n#y?3PFN?{repn~xrl3sh$2}h!U%eB9VRhWM`!SQ|22Mces(I z+o!R6YCNEsJX|zGn(2s?(Aj8rH`ojtdvAm*a%}b;n|Q?LkzBkmZ|&;0`0}>>`tWO}%!*c-ff`_~8jhYMy=c4< zvu7PPz8^zUl|{kfAt@+`VmtV|OPo<$&ga;nPN7`)2zxg53oN|(JMm)O9W~ZI6xbi AKL7v# literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/rope_pulley/modes.nbt b/src/main/resources/ponder/rope_pulley/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..6da97dd80b1a9756f2a5123526196a7380eaf56d GIT binary patch literal 679 zcmV;Y0$BYYiwFP!000000L@lSZ__{!9edYt;tEkADskptw1CtC2YM;cK>4^tTYHjN z-P+df29uuhtGM%@xS}vl?IxIwyS<=pWUb?U^LF0M?AQ^&0Ju)CkO4q-_2>$!c>sOP zOlnfpP>lif&Sf57=!pJ29RMqG-5A{r27xxhU~RF9@hljxh4CGDm;(=Y;Aw`}!Q)vl zZ64o&hdJF68=I1mOvqGFKM?^k0cW#HpFTSyW&? zq*gGVXSf~&xD+< zB=*5i6L=IWBqawbFK|@Mq{O);&b(EJ+&MnCE9&t7+Qq%vMV($25=R$lh9-@-h5mUR z`cqqt^HyyJEgeVqN5_7xV`$Uiwd%F^KXvTZIwmNTo~C27O~OG}D*Tp&@cyRaS(grW zODgWs(P&EQ!?yMx{B<dZl$U(tUhf-OLGXuLh7~Y-r97cgx0lfv;1&l zS<-Twl#B1F2Jh;|z}6;PHajH&l*}g+Olo&5L`}w|P?JjXq?{tkyKv3#$Q2fOiK>g| zp95_R<2k)HM!AZoRCeuXjYW*WOChCYyB@7pZy;WxHnt2%{D!J}LA@46oT1Wbo>6W6 NfIsi3r^aOq004?8QJVk& literal 0 HcmV?d00001 From ea901962501c945143580ab741c1a9b36171f380 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Mar 2021 01:17:01 -0800 Subject: [PATCH 085/124] Clocks are lit. - ClockworkContraptions and BearingContraptions now both use the same lighter type. --- .../bearing/{BearingLighter.java => AnchoredLighter.java} | 5 +++-- .../structureMovement/bearing/BearingContraption.java | 2 +- .../structureMovement/bearing/ClockworkContraption.java | 5 +++++ 3 files changed, 9 insertions(+), 3 deletions(-) rename src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/{BearingLighter.java => AnchoredLighter.java} (69%) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/AnchoredLighter.java similarity index 69% rename from src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java rename to src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/AnchoredLighter.java index ac670ea50..09cfa2a39 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingLighter.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/AnchoredLighter.java @@ -1,11 +1,12 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; +import com.simibubi.create.content.contraptions.components.structureMovement.Contraption; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import com.simibubi.create.foundation.render.backend.light.GridAlignedBB; -public class BearingLighter extends ContraptionLighter { +public class AnchoredLighter extends ContraptionLighter { - public BearingLighter(BearingContraption contraption) { + public AnchoredLighter(Contraption contraption) { super(contraption); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java index 3c2edd2d2..8e1e60aa6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingContraption.java @@ -97,6 +97,6 @@ public class BearingContraption extends Contraption { @OnlyIn(Dist.CLIENT) @Override public ContraptionLighter makeLighter() { - return new BearingLighter(this); + return new AnchoredLighter(this); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java index 1dea812eb..c32679a34 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkContraption.java @@ -4,6 +4,7 @@ import java.util.HashSet; import java.util.Queue; import java.util.Set; +import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionLighter; import org.apache.commons.lang3.tuple.Pair; import com.simibubi.create.content.contraptions.components.structureMovement.AssemblyException; @@ -129,4 +130,8 @@ public class ClockworkContraption extends Contraption { HOUR, MINUTE } + @Override + public ContraptionLighter makeLighter() { + return new AnchoredLighter(this); + } } From d1e96c3b4b9b33879aa20b0004c684a4f3256712 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 11 Mar 2021 11:35:34 +0100 Subject: [PATCH 086/124] Timewarp - Added user view mode for editors to hide coordinates - Ponder now pauses the game in SP - Ponder elements now use a separate timer and separate partial ticks - Fixed virtual funnels not flapping - Fixed ponder buttons having hover highlights when not clickable - Fixed ponder button mouse hitbox - Addressed strange render state bleed with identify mode highlighting --- .../base/KineticTileEntityRenderer.java | 2 +- .../components/actors/HarvesterRenderer.java | 10 +- .../components/deployer/DeployerRenderer.java | 2 +- .../components/fan/EncasedFanRenderer.java | 2 +- .../mixer/MechanicalMixerRenderer.java | 2 +- .../gantry/GantryCarriageRenderer.java | 2 +- .../particle/RotationIndicatorParticle.java | 2 +- .../processing/BasinRenderer.java | 5 +- .../burner/BlazeBurnerRenderer.java | 2 +- .../relays/belt/BeltRenderer.java | 2 +- .../relays/encased/SplitShaftRenderer.java | 2 +- .../relays/gearbox/GearboxRenderer.java | 2 +- .../block/mechanicalArm/ArmInstance.java | 2 +- .../block/mechanicalArm/ArmRenderer.java | 2 +- .../create/foundation/gui/AllIcons.java | 3 +- .../ponder/PonderTooltipHandler.java | 3 +- .../create/foundation/ponder/PonderUI.java | 102 +++++++++++++----- .../foundation/ponder/SceneBuilder.java | 12 +-- .../ponder/content/FunnelScenes.java | 15 ++- .../ponder/content/PonderIndexScreen.java | 78 +++++++------- .../ponder/content/PonderTagScreen.java | 21 +++- .../ponder/elements/ParrotElement.java | 4 +- .../ponder/elements/WorldSectionElement.java | 7 +- .../foundation/ponder/ui/PonderButton.java | 26 ++++- .../utility/AnimationTickHolder.java | 22 +++- .../assets/create/textures/gui/icons.png | Bin 2858 -> 2881 bytes 26 files changed, 209 insertions(+), 123 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java index f3814c3e3..6ff654402 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileEntityRenderer.java @@ -58,7 +58,7 @@ public class KineticTileEntityRenderer extends SafeTileEntityRenderer { @@ -36,7 +37,8 @@ public class HarvesterRenderer extends SafeTileEntityRenderer ms.translate(0, isBlockItem ? 9 / 16f : 11 / 16f, 0); ms.scale(scale, scale, scale); transform = TransformType.GROUND; - ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTime())); + ms.multiply(Vector3f.POSITIVE_Y.getDegreesQuaternion(AnimationTickHolder.getRenderTime(te.getWorld()))); } else { float scale = punching ? .75f : isBlockItem ? .75f - 1 / 64f : .5f; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java index 6421411d3..cb469d615 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/EncasedFanRenderer.java @@ -41,7 +41,7 @@ public class EncasedFanRenderer extends KineticTileEntityRenderer { SuperByteBuffer fanInner = AllBlockPartials.ENCASED_FAN_INNER.renderOnDirectionalSouth(te.getBlockState(), direction.getOpposite()); - float time = AnimationTickHolder.getRenderTime(); + float time = AnimationTickHolder.getRenderTime(te.getWorld()); float speed = te.getSpeed() * 5; if (speed > 0) speed = MathHelper.clamp(speed, 80, 64 * 20); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java index 5ad5963e0..41635cb02 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MechanicalMixerRenderer.java @@ -46,7 +46,7 @@ public class MechanicalMixerRenderer extends KineticTileEntityRenderer { int packedLightmapCoords = WorldRenderer.getLightmapCoordinates(te.getWorld(), blockState, pos); float renderedHeadOffset = mixer.getRenderedHeadOffset(partialTicks); float speed = mixer.getRenderedHeadRotationSpeed(partialTicks); - float time = AnimationTickHolder.getRenderTime(); + float time = AnimationTickHolder.getRenderTime(te.getWorld()); float angle = ((time * speed * 6 / 10f) % 360) / 180 * (float) Math.PI; SuperByteBuffer poleRender = AllBlockPartials.MECHANICAL_MIXER_POLE.renderOn(blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java index 0010a4755..271992288 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageRenderer.java @@ -72,7 +72,7 @@ public class GantryCarriageRenderer extends KineticTileEntityRenderer { } public static float getAngleForTe(KineticTileEntity te, final BlockPos pos, Axis axis) { - float time = AnimationTickHolder.getRenderTime(); + float time = AnimationTickHolder.getRenderTime(te.getWorld()); float offset = getRotationOffsetForPosition(te, pos, axis); return ((time * te.getSpeed() * 3f / 20 + offset) % 360) / 180 * (float) Math.PI; } 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 f9b754484..43e871aa2 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 @@ -67,7 +67,7 @@ public class RotationIndicatorParticle extends SimpleAnimatedParticle { } public void move(double x, double y, double z) { - float time = AnimationTickHolder.getTicks(); + float time = AnimationTickHolder.getTicks(world); float angle = (float) ((time * speed) % 360) - (speed / 2 * age * (((float) age) / maxAge)); if (speed < 0 && axis.isVertical()) angle += 180; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java index 618816da2..72d80ad6b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinRenderer.java @@ -72,8 +72,9 @@ public class BasinRenderer extends SmartTileEntityRenderer { if (fluidLevel > 0) { ms.translate(0, - (MathHelper.sin(AnimationTickHolder.getRenderTime() / 12f + anglePartition * itemCount) + 1.5f) * 1 - / 32f, + (MathHelper.sin( + AnimationTickHolder.getRenderTime(basin.getWorld()) / 12f + anglePartition * itemCount) + 1.5f) + * 1 / 32f, 0); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java index 458035ec9..df11ef484 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerRenderer.java @@ -27,7 +27,7 @@ public class BlazeBurnerRenderer extends SafeTileEntityRenderer { MatrixStack localTransforms = new MatrixStack(); MatrixStacker msr = MatrixStacker.of(localTransforms); IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); - float renderTick = AnimationTickHolder.getRenderTime(); + float renderTick = AnimationTickHolder.getRenderTime(te.getWorld()); msr.centre(); msr.rotateY(AngleHelper.horizontalAngle(facing) + (upward ? 180 : 0) + (sideways ? 270 : 0)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java index 1d4531a36..a1cf575af 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftRenderer.java @@ -32,7 +32,7 @@ public class SplitShaftRenderer extends KineticTileEntityRenderer { Block block = te.getBlockState().getBlock(); final Axis boxAxis = ((IRotate) block).getRotationAxis(te.getBlockState()); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTime(); + float time = AnimationTickHolder.getRenderTime(te.getWorld()); for (Direction direction : Iterate.directions) { Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java index 601aedc49..45463f007 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxRenderer.java @@ -30,7 +30,7 @@ public class GearboxRenderer extends KineticTileEntityRenderer { final Axis boxAxis = te.getBlockState().get(BlockStateProperties.AXIS); final BlockPos pos = te.getPos(); - float time = AnimationTickHolder.getRenderTime(); + float time = AnimationTickHolder.getRenderTime(te.getWorld()); for (Direction direction : Iterate.directions) { final Axis axis = direction.getAxis(); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index 2675f8550..e4e00e69c 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -95,7 +95,7 @@ public class ArmInstance extends SingleRotatingInstance implements ITickableInst float headAngle = arm.headAngle.get(pt); if (rave) { - float renderTick = AnimationTickHolder.getRenderTime() + (tile.hashCode() % 64); + float renderTick = AnimationTickHolder.getRenderTime(arm.getWorld()) + (tile.hashCode() % 64); baseAngle = (renderTick * 10) % 360; lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); upperArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 8) + 1) / 4, -45, 95); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java index 79d3c3765..9f4c6224e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmRenderer.java @@ -69,7 +69,7 @@ public class ArmRenderer extends KineticTileEntityRenderer { float headAngle = arm.headAngle.get(pt); boolean rave = arm.phase == Phase.DANCING; - float renderTick = AnimationTickHolder.getRenderTime() + (te.hashCode() % 64); + float renderTick = AnimationTickHolder.getRenderTime(te.getWorld()) + (te.hashCode() % 64); if (rave) { baseAngle = (renderTick * 10) % 360; lowerArmAngle = MathHelper.lerp((MathHelper.sin(renderTick / 4) + 1) / 2, -45, 15); 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 17806fb70..577ea8028 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,8 @@ public class AllIcons implements IScreenRenderable { I_MTD_CLOSE = next(), I_MTD_RIGHT = next(), I_MTD_SCAN = next(), - I_MTD_REPLAY = next(); + I_MTD_REPLAY = next(), + I_MTD_USER_MODE = next(); public AllIcons(int x, int y) { iconX = x * 16; 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 6209624bc..2f1abec45 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -95,7 +95,8 @@ public class PonderTooltipHandler { } public static void addToTooltip(List toolTip, ItemStack stack) { - float renderPartialTicks = AnimationTickHolder.getPartialTicks(); + float renderPartialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); if (lastHoveredStack != stack) return; ITextComponent component = subject ? Lang.createTranslationTextComponent(SUBJECT) 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 f9ac2c8a6..c17df5a2e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -38,6 +38,7 @@ 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.gui.widget.Widget; import net.minecraft.client.settings.KeyBinding; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; @@ -55,6 +56,9 @@ import net.minecraftforge.registries.ForgeRegistries; public class PonderUI extends AbstractSimiScreen { + public static int ponderTicks; + public static float ponderPartialTicksPaused; + 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"; @@ -68,6 +72,7 @@ public class PonderUI extends AbstractSimiScreen { ItemStack stack; PonderChapter chapter = null; + private boolean userViewMode; private boolean identifyMode; private ItemStack hoveredTooltipItem; private BlockPos hoveredBlockPos; @@ -79,7 +84,7 @@ public class PonderUI extends AbstractSimiScreen { private int index = 0; private PonderTag referredToByTag; - private PonderButton left, right, scan, chap; + private PonderButton left, right, scan, chap, userMode; public static PonderUI of(ItemStack item) { return new PonderUI(PonderRegistry.compile(item.getItem() @@ -165,10 +170,19 @@ public class PonderUI extends AbstractSimiScreen { if (!identifyMode) scenes.get(index) .deselect(); + else + ponderPartialTicksPaused = minecraft.getRenderPartialTicks(); }).showing(AllIcons.I_MTD_SCAN) .shortcut(bindings.keyBindDrop) .fade(0, -1)); + if (PonderIndex.EDITOR_MODE) { + widgets.add(userMode = new PonderButton(31, bY, () -> { + userViewMode = !userViewMode; + }).showing(AllIcons.I_MTD_USER_MODE) + .fade(0, -1)); + } + bX += 50 + spacing; widgets.add(left = new PonderButton(bX, bY, () -> this.scroll(false)).showing(AllIcons.I_MTD_LEFT) .shortcut(bindings.keyBindLeft) @@ -215,8 +229,10 @@ public class PonderUI extends AbstractSimiScreen { } PonderScene activeScene = scenes.get(index); - if (!identifyMode) + if (!identifyMode) { + ponderTicks++; activeScene.tick(); + } sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP); lazyIndex.tickChaser(); fadeIn.tickChaser(); @@ -295,8 +311,8 @@ public class PonderUI extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderVisibleScenes(mouseX, mouseY, identifyMode ? 0 : partialTicks); - renderWidgets(mouseX, mouseY, identifyMode ? 0 : partialTicks); + renderVisibleScenes(mouseX, mouseY, identifyMode ? ponderPartialTicksPaused : partialTicks); + renderWidgets(mouseX, mouseY, identifyMode ? ponderPartialTicksPaused : partialTicks); } protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { @@ -310,7 +326,7 @@ public class PonderUI extends AbstractSimiScreen { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); - double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks()); + double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks(story.world)); double diff = i - value; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; @@ -326,7 +342,7 @@ public class PonderUI extends AbstractSimiScreen { buffer.draw(); // coords for debug - if (PonderIndex.EDITOR_MODE) { + if (PonderIndex.EDITOR_MODE && !userViewMode) { MutableBoundingBox bounds = story.getBounds(); RenderSystem.pushMatrix(); @@ -388,6 +404,10 @@ public class PonderUI extends AbstractSimiScreen { PonderScene activeScene = scenes.get(index); int textColor = 0xeeeeee; + boolean noWidgetsHovered = true; + for (Widget widget : widgets) + noWidgetsHovered &= !widget.isMouseOver(mouseX, mouseY); + { // Chapter title RenderSystem.pushMatrix(); @@ -433,34 +453,43 @@ public class PonderUI extends AbstractSimiScreen { } if (identifyMode) { - RenderSystem.pushMatrix(); - 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) + if (noWidgetsHovered) { + RenderSystem.pushMatrix(); + 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(coords, 0, 0); + renderTooltip(font.listFormattedStringToWidth(tooltip, width / 3), 0, 0); + } else + renderTooltip(hoveredTooltipItem, 0, 0); + if (hoveredBlockPos != null && PonderIndex.EDITOR_MODE && !userViewMode) { + 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(); } - RenderSystem.popMatrix(); scan.flash(); } else { scan.dim(); } + if (PonderIndex.EDITOR_MODE) { + if (userViewMode) + userMode.flash(); + else + userMode.dim(); + } + { // Scene overlay RenderSystem.pushMatrix(); @@ -777,8 +806,25 @@ public class PonderUI extends AbstractSimiScreen { @Override public void shareContextWith(AbstractSimiScreen other) { - if (other instanceof PonderUI) - ((PonderUI) other).referredToByTag = referredToByTag; + if (other instanceof PonderUI) { + PonderUI ponderUI = (PonderUI) other; + ponderUI.referredToByTag = referredToByTag; + } + } + + public static float getPartialTicks() { + if (Minecraft.getInstance().currentScreen instanceof PonderUI) { + PonderUI ui = (PonderUI) Minecraft.getInstance().currentScreen; + if (ui.identifyMode) + return ponderPartialTicksPaused; + } + return Minecraft.getInstance() + .getRenderPartialTicks(); + } + + @Override + public boolean isPauseScreen() { + 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 5bfe87504..a6dbd20a9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -525,7 +525,7 @@ public class SceneBuilder { return; behaviour.handleInsertion(stack, insertionSide.getOpposite(), false); }); - flapFunnels(scene.getSceneBuildingUtil().select.position(location.up()), true); + flapFunnel(location.up(), true); } public ElementLink createItemOnBelt(BlockPos beltLocation, Direction insertionSide, @@ -553,9 +553,8 @@ public class SceneBuilder { scene.linkElement(tracker, link); return TransportedResult.doNothing(); }); - }); - flapFunnels(scene.getSceneBuildingUtil().select.position(beltLocation.up()), true); + flapFunnel(beltLocation.up(), true); return link; } @@ -633,11 +632,8 @@ public class SceneBuilder { }, reDrawBlocks)); } - public void flapFunnels(Selection selection, boolean outward) { - addInstruction(new TileEntityDataInstruction(selection, FunnelTileEntity.class, nbt -> { - nbt.putInt("Flap", outward ? -1 : 1); - return nbt; - }, false)); + public void flapFunnel(BlockPos position, boolean outward) { + modifyTileEntity(position, FunnelTileEntity.class, funnel -> funnel.flap(!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 f6fee510c..c8f9c6c44 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 @@ -52,12 +52,11 @@ public class FunnelScenes { 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); + scene.world.flapFunnel(exitBeltPos.up(), false); if (i == 2) scene.rotateCameraY(70); if (i < 6) @@ -94,7 +93,7 @@ public class FunnelScenes { for (int i = 0; i < 3; i++) { scene.idle(8); - scene.world.flapFunnels(outputFunnel, false); + scene.world.flapFunnel(util.grid.at(1, 2, 4), false); scene.world.createItemEntity(sideItemSpawn, util.vector.of(-.05, 0, 0), itemStack); } @@ -198,7 +197,7 @@ public class FunnelScenes { scene.idle(20); - scene.world.flapFunnels(sideFunnelSelection, true); + scene.world.flapFunnel(sideFunnel, 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); @@ -233,7 +232,7 @@ public class FunnelScenes { scene.idle(35); scene.world.removeItemsFromBelt(beltPos); - scene.world.flapFunnels(beltFunnelSetup, false); + scene.world.flapFunnel(util.grid.at(2, 2, 2), false); if (i == 0) { scene.idle(50); @@ -374,7 +373,7 @@ public class FunnelScenes { scene.idle(10); scene.world.createItemOnBeltLike(andesiteFunnel.down() .north(), Direction.SOUTH, itemStack); - scene.world.flapFunnels(util.select.position(andesiteFunnel), true); + scene.world.flapFunnel(andesiteFunnel, true); scene.idle(60); scene.overlay.showText(60) @@ -384,7 +383,7 @@ public class FunnelScenes { scene.idle(10); scene.world.createItemOnBeltLike(brassFunnel.down() .north(), Direction.SOUTH, ItemHandlerHelper.copyStackWithSize(itemStack, 64)); - scene.world.flapFunnels(util.select.position(brassFunnel), true); + scene.world.flapFunnel(brassFunnel, true); scene.idle(60); AxisAlignedBB filterSlot = new AxisAlignedBB(brassFunnel).grow(-.35, -.35, -.35) @@ -421,7 +420,7 @@ public class FunnelScenes { if (i > 0 && (i < 3 || i % 3 == 0)) { scene.world.removeItemsFromBelt(brassFunnel.down()); - scene.world.flapFunnels(util.select.position(brassFunnel), false); + scene.world.flapFunnel(brassFunnel, false); } scene.world.modifyEntities(ItemEntity.class, e -> { 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 364ce0797..15f3e70f8 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 @@ -49,43 +49,39 @@ public class PonderIndexScreen extends AbstractSimiScreen { protected void init() { super.init(); - //populate lists + // populate lists widgets.clear(); chapters.clear(); - //chapters.addAll(PonderRegistry.chapters.getAllChapters()); + // chapters.addAll(PonderRegistry.chapters.getAllChapters()); 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) - .filter(PonderIndexScreen::exclusions) - .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) + .filter(PonderIndexScreen::exclusions) + .forEach(items::add); boolean hasChapters = !chapters.isEmpty(); - //setup chapters - LayoutHelper layout = LayoutHelper.centeredHorizontal( - chapters.size(), - MathHelper.clamp((int) Math.ceil(chapters.size() / 4f), 1, 4), - 200, - 38, - 16 - ); + // setup chapters + 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 + // 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(), (mouseX, mouseY) -> { @@ -97,44 +93,40 @@ public class PonderIndexScreen extends AbstractSimiScreen { layout.next(); } - //setup items + // setup items if (!hasChapters) { itemYmult = 0.5; } int maxItemRows = hasChapters ? 4 : 7; - layout = LayoutHelper.centeredHorizontal( - items.size(), - MathHelper.clamp((int) Math.ceil(items.size() / 11f), 1, maxItemRows), - 28, - 28, - 8 - ); + layout = LayoutHelper.centeredHorizontal(items.size(), + MathHelper.clamp((int) Math.ceil(items.size() / 11f), 1, maxItemRows), 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, (x, y) -> { - if (!PonderRegistry.all.containsKey(item.getRegistryName())) - return; + PonderButton button = + new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, (x, y) -> { + if (!PonderRegistry.all.containsKey(item.getRegistryName())) + return; - centerScalingOn(x, y); - ScreenOpener.transitionTo(PonderUI.of(new ItemStack(item))); - }).showing(new ItemStack(item)); + centerScalingOn(x, y); + ScreenOpener.transitionTo(PonderUI.of(new ItemStack(item))); + }).showing(new ItemStack(item)); button.fade(1); widgets.add(button); layout.next(); } - } private static boolean exclusions(Item item) { if (item instanceof BlockItem) { Block block = ((BlockItem) item).getBlock(); - if (block instanceof ValveHandleBlock && !AllBlocks.COPPER_VALVE_HANDLE.is(item)) return false; + if (block instanceof ValveHandleBlock && !AllBlocks.COPPER_VALVE_HANDLE.is(item)) + return false; } return true; @@ -143,6 +135,7 @@ public class PonderIndexScreen extends AbstractSimiScreen { @Override public void tick() { super.tick(); + PonderUI.ponderTicks++; hoveredItem = ItemStack.EMPTY; MainWindow w = minecraft.getWindow(); @@ -224,4 +217,9 @@ public class PonderIndexScreen extends AbstractSimiScreen { public ItemStack getHoveredTooltipItem() { return hoveredItem; } + + @Override + public boolean isPauseScreen() { + return true; + } } 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 8c03321c9..a443af1f2 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 @@ -77,13 +77,16 @@ public class PonderTagScreen extends AbstractSimiScreen { int itemCenterY = getItemsY(); for (Item i : items) { + final boolean canClick = PonderRegistry.all.containsKey(i.getRegistryName()); PonderButton button = new PonderButton(itemCenterX + layout.getX() + 4, itemCenterY + layout.getY() + 4, (mouseX, mouseY) -> { - if (!PonderRegistry.all.containsKey(i.getRegistryName())) + if (!canClick) return; centerScalingOn(mouseX, mouseY); ScreenOpener.transitionTo(PonderUI.of(new ItemStack(i), tag)); }).showing(new ItemStack(i)); + if (!canClick) + button.noClickEvent(); button.fade(1); widgets.add(button); @@ -92,18 +95,20 @@ public class PonderTagScreen extends AbstractSimiScreen { if (!tag.getMainItem() .isEmpty()) { + final boolean canClick = PonderRegistry.all.containsKey(tag.getMainItem() + .getItem() + .getRegistryName()); PonderButton button = new PonderButton(itemCenterX - layout.getTotalWidth() / 2 - 42, itemCenterY - 10, (mouseX, mouseY) -> { - if (!PonderRegistry.all.containsKey(tag.getMainItem() - .getItem() - .getRegistryName())) + if (!canClick) return; centerScalingOn(mouseX, mouseY); ScreenOpener.transitionTo(PonderUI.of(tag.getMainItem(), tag)); }).showing(tag.getMainItem()); + if (!canClick) + button.noClickEvent(); button.fade(1); -// button.flash(); widgets.add(button); } @@ -133,6 +138,7 @@ public class PonderTagScreen extends AbstractSimiScreen { @Override public void tick() { super.tick(); + PonderUI.ponderTicks++; hoveredItem = ItemStack.EMPTY; MainWindow w = minecraft.getWindow(); @@ -291,5 +297,10 @@ public class PonderTagScreen extends AbstractSimiScreen { return tag == ((PonderTagScreen) other).tag; return super.isEquivalentTo(other); } + + @Override + public boolean isPauseScreen() { + return true; + } } 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 cd7043524..c2ea78695 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,9 +6,9 @@ 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.PonderUI; 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.MainWindow; @@ -170,7 +170,7 @@ public class ParrotElement extends AnimatedSceneElement { .length(); entity.onGround = false; double phase = Math.min(length * 15, 8); - float f = (float) ((AnimationTickHolder.getTicks() % 100) * phase); + float f = (float) ((PonderUI.ponderTicks % 100) * phase); entity.flapSpeed = MathHelper.sin(f) + 1; if (length == 0) entity.flapSpeed = 0; 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 e4f24ed6a..f1e05c489 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 @@ -313,10 +313,9 @@ public class WorldSectionElement extends AnimatedSceneElement { 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(); + .offset(selectedBlock), 1, 1, 1, 0.6f); +// if (buffer instanceof SuperRenderTypeBuffer) +// ((SuperRenderTypeBuffer) buffer).draw(RenderType.getLines()); ms.pop(); } 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 c5ff15c2a..defd97deb 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 @@ -7,7 +7,6 @@ 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; @@ -26,6 +25,7 @@ public class PonderButton extends AbstractSimiWidget { private float fade; private KeyBinding shortcut; private LerpedFloat flash; + private boolean noClickEvent; public static final int SIZE = 20; @@ -54,6 +54,11 @@ public class PonderButton extends AbstractSimiWidget { return this; } + public PonderButton noClickEvent() { + this.noClickEvent = true; + return this; + } + public PonderButton shortcut(KeyBinding key) { this.shortcut = key; return this; @@ -86,7 +91,7 @@ public class PonderButton extends AbstractSimiWidget { if (fade < .1f) return; - isHovered = mouseX >= x && mouseY >= y && mouseX < x + width && mouseY < y + height && fade > .75f; + isHovered = isMouseOver(mouseX, mouseY) && fade > .75f; RenderSystem.pushMatrix(); RenderSystem.disableDepthTest(); @@ -95,11 +100,13 @@ public class PonderButton extends AbstractSimiWidget { float flashValue = flash.getValue(partialTicks); if (flashValue > .1f) - fade *= 3 * flashValue + Math.sin((AnimationTickHolder.getTicks() + partialTicks) / 6); + fade *= 3 * flashValue + Math.sin((PonderUI.ponderTicks + partialTicks) / 6); int backgroundColor = ColorHelper.applyAlpha(0xdd000000, fade); - int borderColorStart = ColorHelper.applyAlpha(isHovered ? 0x70ffffff : 0x40aa9999, fade); - int borderColorEnd = ColorHelper.applyAlpha(isHovered ? 0x30ffffff : 0x20aa9999, fade); + int borderColorStart = + ColorHelper.applyAlpha(noClickEvent ? 0x70984500 : isHovered ? 0x70ffffff : 0x40aa9999, fade); + int borderColorEnd = + ColorHelper.applyAlpha(noClickEvent ? 0x70692400 : isHovered ? 0x30ffffff : 0x20aa9999, fade); PonderUI.renderBox(x, y, width, height, backgroundColor, borderColorStart, borderColorEnd); RenderSystem.translated(0, 0, 800); @@ -153,4 +160,13 @@ public class PonderButton extends AbstractSimiWidget { public ItemStack getItem() { return item; } + + @Override + public boolean isMouseOver(double x, double y) { + double m = 4; + x = Math.floor(x); + y = Math.floor(y); + return active && visible + && !(x < this.x - m || x > this.x + width + m - 1 || y < this.y - m || y > this.y + height + m - 1); + } } diff --git a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java index b86ac025a..1da015fd6 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java +++ b/src/main/java/com/simibubi/create/foundation/utility/AnimationTickHolder.java @@ -1,6 +1,10 @@ package com.simibubi.create.foundation.utility; +import com.simibubi.create.foundation.ponder.PonderUI; +import com.simibubi.create.foundation.ponder.PonderWorld; + import net.minecraft.client.Minecraft; +import net.minecraft.world.IWorld; public class AnimationTickHolder { @@ -15,6 +19,10 @@ public class AnimationTickHolder { ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision } } + + public static int getTicks() { + return ticks; + } public static float getRenderTime() { return getTicks() + getPartialTicks(); @@ -24,8 +32,16 @@ public class AnimationTickHolder { Minecraft mc = Minecraft.getInstance(); return (mc.isGamePaused() ? mc.renderPartialTicksPaused : mc.getRenderPartialTicks()); } - - public static int getTicks() { - return ticks; + + public static int getTicks(IWorld world) { + return world instanceof PonderWorld ? PonderUI.ponderTicks : getTicks(); + } + + public static float getRenderTime(IWorld world) { + return getTicks(world) + getPartialTicks(world); + } + + public static float getPartialTicks(IWorld world) { + return world instanceof PonderWorld ? PonderUI.getPartialTicks() : getPartialTicks(); } } diff --git a/src/main/resources/assets/create/textures/gui/icons.png b/src/main/resources/assets/create/textures/gui/icons.png index 000090fafd170660d0268f17bb6fcac13ecb9d57..c9d661aee4462a0b8ea19468f8c50e180a0a9546 100644 GIT binary patch delta 2559 zcmV|x07Qq&fnSZGO01l}E@e&7h000VxNklblf`5QxxC zWGw}xj10T!T#x{*!=~-lHbZnDHqA*x77UCP;nJ@_LN$a2*3A`hWRul(2CTn%KJ)=wecj=9bfLsIIL+GJT1JV6?zB^bRb31#Ah(O=Nk0 z55D*6^f=73xdzE1b&TZw$()|L3pXBL>m&mP9Rk6-?Zd=^^o68(ZBng3A~g73hPAK7 zaZ)7tYUMaPa+v{1bHytnO4&@WNZt!F$Q;vDK`N;3rGGR|f?txN5a$Oj{R-s4)#i*g zw<&U10&>t?K&EVIh8IAY!a@Tu0|Gkv_#|R=@Sa#Spc2yn#Ij5S5Pz8AiJG6G-+rcU zEqLq(rx>vD3*i)oUqpi;Ug!G_df_;^vZak+K;9MLDx1(oea^@r0lC01x~6mUpb-OX zu^(WQ)_=6&4M_KCv}#YJGfFp`QUQ{QiZv48HJ=5kkTo&tSlQAYXF%R#gUWIq0tLyM z)T~RpSr|^S^)e*9b}I>kj!iv`EmK@b>Ljf{C+rr%=eI}w`SQ7=ZwSQS?chJ~12c7M-;B#h8%S3r;@rce# zC}IGQFAod05N8@Rwkdf9N`qazdTmJ&_e(COAiUG1a_XB0k!Zv+WtAAu{$k@<4-&e9`&KYN#ri6CLSizJQg49m{ zgpL!Yt#B+}ik!zSvUR?t`yKD6m7fmJoT#SwOq!J5lP}K)?7)2mA~30u_ZYM^yV0O2 zf$l9*Le7NMgsi#Z8T%WQKJfut?dj|AbdWM68w6=zfw-NZwl%Fp|6J_^9oCR>hr|rDP3wkM1HbdI#+;@}hUp?&8vAePzr5z1aF1+uhWRW`IaW6~Fq0Uw^1KeeU?G zzA}pjXz2Hgp$%Kq)He9j`pW##HF43Pcj2FKOKnWh+$waH6c?BNjJ`7T3E-7wVFZ^! zQ_z=UvK8(b{tCzsm}5UuJe#U8$i1=YDEJsP&eZz2F;Ki7{0X3Cb@jG>I-H7DGKqrB z>X#L*ENVyBdE_U+LvWqwj(^FswkOSQM%EcO-qV%-i#f@Fb@B$Y?kwwE6W6Axg(_Yg~V!N~?ZD$@YO zvP=UI&t)&qux|qc&VMLxPKZnH=Bb}C1Hysud%KnR7dZpT?V|yqfml;JqJIM14n?>M z65kO|%XvEgssX9>mNWyr19BF3AWB)KGmQPI0f`Vq8oMdo0Du1z$AKVabZOiQlF)c- z$Z8l3V>iVa(03(i)T~UaVu=bm`ve~GD(f(GTf7095_-N~kWps09zXA;ruEL|TVMu;+he~VJDEXyOalbOToZ#QO+;|6QgT5dO%mX)la_0jJ7C{C`!v89>M3|8puu&*n~e$fu?50~MhJ zYPm;8U;uBv8zASUcdHz{8;lIu|6dtNeus|KzhBe<-flm?o;Q@T1Dab!#@zpuq|?KM z-696?UfucayuOqikh~R;nC7zsE$kUFVEBsb8IUWayCL!g=?$8;0zN<_gRA>Q4d|O! zSXIVSIF1cjfemD!4-`phvUl_uFnqxIw7#SjAcBF`Uf&@@_i%hOU^p%nxCE_7Mvmct zN?&yL>>C&mj*H#9GsGh=9F9u&a^i#;u>K>v*VCOqGoUJyQ3}74{|XHn#SQrS`XBn~ VTTMCjcCY{d002ovPDHLkV1i~0*HQog delta 2536 zcmVW?O?Ex14d10A8s>12vNxZq=bwXR<%YsHh*oh^*v*4Y1E|#gg}JR zMAlM3%1GOt&IJk3+BR*MwlhTcwrNfpGGSn>2$wzr30d$u+;#&bcLi3yz=Nd#&B!i2 zZT|{&-2gW^7%K`JAlDPLhROOFQOh{}YNczDmNZG3bbA~9UXX)HPAL!Cw^cg_FdR~H zO*{Vdz;z6e=zq_5UBdbzG_h|h(7~i`%}uAHp}MvKlIcez1fvD6VeG)-BVbcN?jqCs zYw)!PYB={pK3i15FrH?>vZVt}q z;C6~^mVg{I7mz7?n&Amhrm!#om;nJjdHp0}vw0*I4XDI40I@970K{)*c%$Zb=$GHA zdlRl*;1mOPej%K~@QY|L#Or*$K`(44SN60K49KejTxAnl*XN8h3CIP8?v~Dj2aOnD zi+zJl+JDl9Hy~Z7(W*U>kx{y{DHR}@s8}NbUh`g%3Rx4Qj+H&#aR%fyHmEH7AyAO4 zNzJ;ni-mTIZ7f5=Yd4cH=yLc4;-t~u!0P76L~wzQlmA1$uv zJcS|#aDTZi*hHLZ(AZANGf*ltwGioxzLK?#>-1$PqmB$Z&8P4qK%M0#STKN-evX_^ zKnhs}ncJh*Ns$V9fYUtG59S5?;aPj+9S~0+Y26kTC}QFKP>G{OBU7>_XwA8{r!PTY zf`1F^kMITW$ym$S(R{wIWX+t@XPTyjR>)Yvloo>2 zI{-raglQ|R#Y>U>xJmZ*w{*Sr@ig<(^KVX6Q~XVulwOk$zn`%J_XtE_QX{W1Xc_Ff zK~nws(L^;aq)($P(Kkql%IZD9tngu`J(W zz}_3;p57qS0L06Y7ivH7?lf=OQaR93KkNN%ePzxtVCC|CZE~O^s!dxe2RiQcxAm2Q z0X#ROs%a=CYrt!C2l>!9Xm^kgeS>xfmoDooV+QEK=GWM+re-t)L^7)Q(|-^ALA~j7 z`ph2&~KjD^IPte>dbd(eamwu1FGIR&<%rY^8 z%b+RfM={w7M}{8(`2ln6TZ(&A6`DLY4q64bQR7UluNwo!>%n&bO{=rF`P1f9w30~_ zwovVT?O4<)s z<_ZRUmG9Wr>D++AA$m-1-52@xpY0{7+WWRaj759VwhhNo?(C-mp%tb-j!pf1b@dz?Q@-&g)|tY9#h_ zM=zx%%fG~jAQg=kZ1KbKl zxC#-1ta?j-0>>w(7G+&08I(qUoS}48NlBzMYtdX!iJ-U z;tBeYo8cdUh6q>Tt}GamzdS;v4b>wfW1Gra6b1QrbKFa?Bg&O16-@HikGBC(Jiu)@ zYbgERoMwQ=lYa=CRTfIy=-~S?;KxzF3L9`YOalimx+a1kvOX-+ z0K~Ga-2qv*BM9QiEE+&8h)^Q3J|G5EqA z@EFWH0I@970K~FP0}#t12IOCBr1fJ`GOCDdx(zroXMY&b{)qi}2JB!Pe&{$ds%P%PEh5FgWr^2Ix<`Zz*dcKk$$70wBzQb_67vrc{Cz9`7Z% zhi-H*;2~ZE^A12P%QOJ7EYkqQvX}uch~n@cLHI0W#q4zc+pbyz*6bW&eL=B>8*D{lkE`f8B4iB<)Xgt4PoNPf15Y42YX0 zbiclo9FV*fkoWIw%!4akdU8B4610oJkt8_0ya=pg7j zU_Q9PdAGi#6(E9v*0FxXflvd6?NWhD(7I*hXa`gtasOsO*e?Hg+fj&Hb`68?hePha y8L+gg&QW)F0?mM`lYt7RlduXV8WcC+^Yee|@m)|aY39=a0000 Date: Thu, 11 Mar 2021 12:55:44 +0100 Subject: [PATCH 087/124] easier crank interaction - allow some blocks to be used while sneaking and holding an item --- .../java/com/simibubi/create/AllBlocks.java | 93 ++++--------------- .../components/crank/HandCrankBlock.java | 6 -- .../foundation/block/ItemUseOverrides.java | 44 +++++++++ .../foundation/data/BuilderTransformers.java | 20 ++-- 4 files changed, 74 insertions(+), 89 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java diff --git a/src/main/java/com/simibubi/create/AllBlocks.java b/src/main/java/com/simibubi/create/AllBlocks.java index 444f80625..8d936a3a9 100644 --- a/src/main/java/com/simibubi/create/AllBlocks.java +++ b/src/main/java/com/simibubi/create/AllBlocks.java @@ -1,29 +1,10 @@ package com.simibubi.create; -import static com.simibubi.create.AllMovementBehaviours.addMovementBehaviour; -import static com.simibubi.create.AllTags.tagBlockAndItem; -import static com.simibubi.create.content.AllSections.SCHEMATICS; -import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; -import static com.simibubi.create.foundation.data.BlockStateGen.oxidizedBlockstate; -import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; -import static com.simibubi.create.foundation.data.ModelGen.customItemModel; -import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel; - import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; import com.simibubi.create.content.AllSections; import com.simibubi.create.content.contraptions.base.CasingBlock; -import com.simibubi.create.content.contraptions.components.actors.DrillBlock; -import com.simibubi.create.content.contraptions.components.actors.DrillMovementBehaviour; -import com.simibubi.create.content.contraptions.components.actors.HarvesterBlock; -import com.simibubi.create.content.contraptions.components.actors.HarvesterMovementBehaviour; -import com.simibubi.create.content.contraptions.components.actors.PloughBlock; -import com.simibubi.create.content.contraptions.components.actors.PloughMovementBehaviour; -import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceBlock; -import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceMovement; -import com.simibubi.create.content.contraptions.components.actors.SawMovementBehaviour; -import com.simibubi.create.content.contraptions.components.actors.SeatBlock; -import com.simibubi.create.content.contraptions.components.actors.SeatMovementBehaviour; +import com.simibubi.create.content.contraptions.components.actors.*; import com.simibubi.create.content.contraptions.components.clock.CuckooClockBlock; import com.simibubi.create.content.contraptions.components.crafter.CrafterCTBehaviour; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterBlock; @@ -46,11 +27,7 @@ import com.simibubi.create.content.contraptions.components.motor.CreativeMotorGe import com.simibubi.create.content.contraptions.components.press.MechanicalPressBlock; import com.simibubi.create.content.contraptions.components.saw.SawBlock; import com.simibubi.create.content.contraptions.components.saw.SawGenerator; -import com.simibubi.create.content.contraptions.components.structureMovement.bearing.ClockworkBearingBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.bearing.MechanicalBearingBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.bearing.SailBlock; -import com.simibubi.create.content.contraptions.components.structureMovement.bearing.StabilizedBearingMovementBehaviour; -import com.simibubi.create.content.contraptions.components.structureMovement.bearing.WindmillBearingBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.*; 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; @@ -73,15 +50,7 @@ import com.simibubi.create.content.contraptions.fluids.PumpBlock; import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyBlock; import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainBlock; import com.simibubi.create.content.contraptions.fluids.actors.SpoutBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.BracketBlockItem; -import com.simibubi.create.content.contraptions.fluids.pipes.BracketGenerator; -import com.simibubi.create.content.contraptions.fluids.pipes.EncasedPipeBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.GlassFluidPipeBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeBlock; -import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeGenerator; +import com.simibubi.create.content.contraptions.fluids.pipes.*; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankBlock; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankGenerator; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankItem; @@ -103,13 +72,7 @@ import com.simibubi.create.content.contraptions.relays.elementary.BracketedKinet import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogwheelBlockItem; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; -import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyBlock; -import com.simibubi.create.content.contraptions.relays.encased.ClutchBlock; -import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltBlock; -import com.simibubi.create.content.contraptions.relays.encased.EncasedBeltGenerator; -import com.simibubi.create.content.contraptions.relays.encased.EncasedCTBehaviour; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; -import com.simibubi.create.content.contraptions.relays.encased.GearshiftBlock; +import com.simibubi.create.content.contraptions.relays.encased.*; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock; import com.simibubi.create.content.contraptions.relays.gauge.GaugeGenerator; import com.simibubi.create.content.contraptions.relays.gearbox.GearboxBlock; @@ -121,50 +84,23 @@ import com.simibubi.create.content.logistics.block.chute.ChuteGenerator; import com.simibubi.create.content.logistics.block.chute.ChuteItem; import com.simibubi.create.content.logistics.block.chute.SmartChuteBlock; import com.simibubi.create.content.logistics.block.depot.DepotBlock; -import com.simibubi.create.content.logistics.block.diodes.AbstractDiodeGenerator; -import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock; -import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterGenerator; -import com.simibubi.create.content.logistics.block.diodes.PoweredLatchBlock; -import com.simibubi.create.content.logistics.block.diodes.PoweredLatchGenerator; -import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock; -import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterGenerator; -import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock; -import com.simibubi.create.content.logistics.block.diodes.ToggleLatchGenerator; -import com.simibubi.create.content.logistics.block.funnel.AndesiteFunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.BeltFunnelGenerator; -import com.simibubi.create.content.logistics.block.funnel.BrassFunnelBlock; -import com.simibubi.create.content.logistics.block.funnel.FunnelGenerator; -import com.simibubi.create.content.logistics.block.funnel.FunnelItem; -import com.simibubi.create.content.logistics.block.funnel.FunnelMovementBehaviour; +import com.simibubi.create.content.logistics.block.diodes.*; +import com.simibubi.create.content.logistics.block.funnel.*; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateBlock; import com.simibubi.create.content.logistics.block.inventories.CreativeCrateBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmBlock; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmItem; -import com.simibubi.create.content.logistics.block.redstone.AnalogLeverBlock; -import com.simibubi.create.content.logistics.block.redstone.ContactMovementBehaviour; -import com.simibubi.create.content.logistics.block.redstone.ContentObserverBlock; -import com.simibubi.create.content.logistics.block.redstone.NixieTubeBlock; -import com.simibubi.create.content.logistics.block.redstone.NixieTubeGenerator; -import com.simibubi.create.content.logistics.block.redstone.RedstoneContactBlock; -import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; -import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkGenerator; -import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchBlock; +import com.simibubi.create.content.logistics.block.redstone.*; import com.simibubi.create.content.palettes.MetalBlock; import com.simibubi.create.content.schematics.block.SchematicTableBlock; import com.simibubi.create.content.schematics.block.SchematicannonBlock; +import com.simibubi.create.foundation.block.ItemUseOverrides; import com.simibubi.create.foundation.config.StressConfigDefaults; -import com.simibubi.create.foundation.data.AssetLookup; -import com.simibubi.create.foundation.data.BlockStateGen; -import com.simibubi.create.foundation.data.BuilderTransformers; -import com.simibubi.create.foundation.data.CreateRegistrate; -import com.simibubi.create.foundation.data.ModelGen; -import com.simibubi.create.foundation.data.SharedProperties; +import com.simibubi.create.foundation.data.*; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.utility.DyeHelper; import com.simibubi.create.foundation.worldgen.OxidizingBlock; import com.tterrag.registrate.util.entry.BlockEntry; - import net.minecraft.block.Block; import net.minecraft.block.Blocks; import net.minecraft.block.SoundType; @@ -183,6 +119,15 @@ import net.minecraftforge.client.model.generators.ModelFile; import net.minecraftforge.common.Tags; import net.minecraftforge.common.ToolType; +import static com.simibubi.create.AllMovementBehaviours.addMovementBehaviour; +import static com.simibubi.create.AllTags.tagBlockAndItem; +import static com.simibubi.create.content.AllSections.SCHEMATICS; +import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; +import static com.simibubi.create.foundation.data.BlockStateGen.oxidizedBlockstate; +import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; +import static com.simibubi.create.foundation.data.ModelGen.customItemModel; +import static com.simibubi.create.foundation.data.ModelGen.oxidizedItemModel; + public class AllBlocks { private static final CreateRegistrate REGISTRATE = Create.registrate() @@ -373,6 +318,7 @@ public class AllBlocks { .blockstate(BlockStateGen.directionalBlockProvider(true)) .transform(StressConfigDefaults.setCapacity(8.0)) .tag(AllBlockTags.BRITTLE.tag) + .onRegister(ItemUseOverrides::addBlock) .item() .transform(customItemModel()) .register(); @@ -1197,6 +1143,7 @@ public class AllBlocks { .initialProperties(() -> Blocks.LEVER) .tag(AllBlockTags.SAFE_NBT.tag) .blockstate((c, p) -> p.horizontalFaceBlock(c.get(), AssetLookup.partialBaseModel(c, p))) + .onRegister(ItemUseOverrides::addBlock) .item() .transform(customItemModel()) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java index a6cc4c35f..9cd4a201c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankBlock.java @@ -6,7 +6,6 @@ import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.config.AllConfigs; - import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -55,11 +54,6 @@ public class HandCrankBlock extends DirectionalKineticBlock implements ITE te.turn(player.isSneaking())); player.addExhaustion(getRotationSpeed() * AllConfigs.SERVER.kinetics.crankHungerMultiplier.getF()); diff --git a/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java new file mode 100644 index 000000000..8aa1000f9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/block/ItemUseOverrides.java @@ -0,0 +1,44 @@ +package com.simibubi.create.foundation.block; + +import com.simibubi.create.AllItems; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; + +import java.util.HashSet; +import java.util.Set; + +@Mod.EventBusSubscriber +public class ItemUseOverrides { + + private static final Set overrides = new HashSet<>(); + + public static void addBlock(Block block) { + overrides.add(block.getRegistryName()); + } + + @SubscribeEvent + public static void onBlockActivated(PlayerInteractEvent.RightClickBlock event) { + if (AllItems.WRENCH.isIn(event.getItemStack())) return; + + BlockState state = event.getWorld().getBlockState(event.getPos()); + ResourceLocation id = state.getBlock().getRegistryName(); + + if (!overrides.contains(id)) return; + + BlockRayTraceResult blockTrace = new BlockRayTraceResult(VecHelper.getCenterOf(event.getPos()), event.getFace(), event.getPos(), true); + ActionResultType result = state.onUse(event.getWorld(), event.getPlayer(), event.getHand(), blockTrace); + + if (!result.isAccepted()) return; + + event.setCanceled(true); + event.setCancellationResult(result); + + } +} diff --git a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java index 3eec801c2..d84bced3d 100644 --- a/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java +++ b/src/main/java/com/simibubi/create/foundation/data/BuilderTransformers.java @@ -1,14 +1,5 @@ package com.simibubi.create.foundation.data; -import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; -import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; -import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; - -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.Nullable; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllTags.AllBlockTags; import com.simibubi.create.AllTags.AllItemTags; @@ -22,12 +13,12 @@ import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelBlock.Shape; import com.simibubi.create.content.logistics.block.belts.tunnel.BeltTunnelItem; import com.simibubi.create.content.logistics.block.inventories.CrateBlock; +import com.simibubi.create.foundation.block.ItemUseOverrides; import com.simibubi.create.foundation.block.connected.CTSpriteShiftEntry; import com.simibubi.create.foundation.config.StressConfigDefaults; import com.simibubi.create.foundation.item.TooltipHelper; import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.util.nullness.NonNullUnaryOperator; - import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderType; import net.minecraft.item.DyeColor; @@ -39,6 +30,14 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.generators.ConfiguredModel; import net.minecraftforge.client.model.generators.ModelFile; +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; + +import static com.simibubi.create.foundation.data.BlockStateGen.axisBlock; +import static com.simibubi.create.foundation.data.CreateRegistrate.casingConnectivity; +import static com.simibubi.create.foundation.data.CreateRegistrate.connectedTextures; + public class BuilderTransformers { public static NonNullUnaryOperator> cuckooClock() { @@ -81,6 +80,7 @@ public class BuilderTransformers { TooltipHelper.referTo(v, AllBlocks.COPPER_VALVE_HANDLE); }) .tag(AllBlockTags.BRITTLE.tag, AllBlockTags.VALVE_HANDLES.tag) + .onRegister(ItemUseOverrides::addBlock) .item() .tag(AllItemTags.VALVE_HANDLES.tag) .build(); From 4445872959d752db03f8df41eb13d651d8a52479 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 11 Mar 2021 13:48:31 +0100 Subject: [PATCH 088/124] Stop hacking the base plate size - Added proper scene scale/alignment instructions --- .../create/foundation/ponder/PonderScene.java | 40 ++++++++----- .../create/foundation/ponder/PonderUI.java | 59 ++++++++++++++----- .../foundation/ponder/SceneBuilder.java | 32 ++++++++-- .../ponder/content/BearingScenes.java | 12 ++++ .../foundation/ponder/content/BeltScenes.java | 3 + .../ponder/content/ChainDriveScenes.java | 3 +- .../ponder/content/GantryScenes.java | 1 + .../ponder/content/KineticsScenes.java | 2 + .../ponder/content/MovementActorScenes.java | 9 ++- .../ponder/content/PulleyScenes.java | 12 +++- 10 files changed, 132 insertions(+), 41 deletions(-) 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 a622c8b8d..3f56194e9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -76,9 +76,11 @@ public class PonderScene { WorldSectionElement baseWorldSection; Entity renderViewEntity; - int offsetX; - int offsetZ; - int size; + int basePlateOffsetX; + int basePlateOffsetZ; + int basePlateSize; + float scaleFactor; + float yOffset; boolean stoppedCounting; int totalTime; @@ -98,10 +100,12 @@ public class PonderScene { schedule = new ArrayList<>(); activeSchedule = new ArrayList<>(); transform = new SceneTransform(); - size = getBounds().getXSize(); + basePlateSize = getBounds().getXSize(); info = new SceneRenderInfo(); baseWorldSection = new WorldSectionElement(); renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); + scaleFactor = 1; + yOffset = 0; setPointOfInterest(new Vec3d(0, 4, 0)); } @@ -136,11 +140,12 @@ public class PonderScene { BlockPos selectedPos = nearestHit.getValue() .getSecond(); - BlockPos origin = new BlockPos(offsetX, 0, offsetZ); + BlockPos origin = new BlockPos(basePlateOffsetX, 0, basePlateOffsetZ); 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 (new MutableBoundingBox(origin, origin.add(new Vec3i(basePlateSize - 1, 0, basePlateSize - 1))) + .isVecInside(selectedPos)) { if (PonderIndex.EDITOR_MODE) nearestHit.getValue() .getFirst() @@ -383,11 +388,11 @@ public class PonderScene { } public MatrixStack apply(MatrixStack ms) { - return apply(ms, AnimationTickHolder.getPartialTicks()); + return apply(ms, AnimationTickHolder.getPartialTicks(world)); } public MatrixStack apply(MatrixStack ms, float pt) { - ms.translate(width / 2, height / 2, 200); + ms.translate(width / 2, height / 2, 200 + offset); MatrixStacker.of(ms) .rotateX(-35) @@ -396,12 +401,15 @@ public class PonderScene { 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, -1f, (size + offsetZ) / -2f); + + float f = 30 * scaleFactor; + + ms.scale(f, -f, f); + ms.translate((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, + (basePlateSize + basePlateOffsetZ) / -2f); return ms; } @@ -416,7 +424,7 @@ public class PonderScene { float pt = AnimationTickHolder.getPartialTicks(); Vec3d vec = new Vec3d(x, y, depth); - vec = vec.subtract(width / 2, height / 2, 200); + vec = vec.subtract(width / 2, height / 2, 200 + offset); vec = VecHelper.rotate(vec, 35, Axis.X); vec = VecHelper.rotate(vec, -55, Axis.Y); vec = vec.subtract(offset, 0, 0); @@ -424,8 +432,12 @@ public class PonderScene { 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); + + float f = 1f / (30 * scaleFactor); + + vec = vec.mul(f, -f, f); + vec = vec.subtract((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, + (basePlateSize + basePlateOffsetZ) / -2f); return 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 c17df5a2e..c39d48077 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -24,7 +24,6 @@ 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.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; @@ -139,7 +138,7 @@ public class PonderUI extends AbstractSimiScreen { tags.forEach(t -> { int i = tagButtons.size(); int x = 31; - int y = 71 + i * 30; + int y = 81 + i * 30; PonderButton b = new PonderButton(x, y, (mouseX, mouseY) -> { centerScalingOn(mouseX, mouseY); ScreenOpener.transitionTo(new PonderTagScreen(t)); @@ -315,6 +314,11 @@ public class PonderUI extends AbstractSimiScreen { renderWidgets(mouseX, mouseY, identifyMode ? ponderPartialTicksPaused : partialTicks); } + @Override + public void renderBackground() { + super.renderBackground(); + } + protected void renderVisibleScenes(int mouseX, int mouseY, float partialTicks) { renderScene(mouseX, mouseY, index, partialTicks); float lazyIndexValue = lazyIndex.getValue(partialTicks); @@ -326,7 +330,7 @@ public class PonderUI extends AbstractSimiScreen { SuperRenderTypeBuffer buffer = SuperRenderTypeBuffer.getInstance(); PonderScene story = scenes.get(i); MatrixStack ms = new MatrixStack(); - double value = lazyIndex.getValue(AnimationTickHolder.getPartialTicks(story.world)); + double value = lazyIndex.getValue(minecraft.getRenderPartialTicks()); double diff = i - value; double slide = MathHelper.lerp(diff * diff, 200, 600) * diff; @@ -341,15 +345,36 @@ public class PonderUI extends AbstractSimiScreen { story.renderScene(buffer, ms, partialTicks); buffer.draw(); + MutableBoundingBox bounds = story.getBounds(); + RenderSystem.pushMatrix(); + RenderSystem.multMatrix(ms.peek() + .getModel()); + + // kool shadow fx + { + RenderSystem.enableCull(); + RenderSystem.enableDepthTest(); + RenderSystem.pushMatrix(); + RenderSystem.translated(story.basePlateOffsetX, 0, story.basePlateOffsetZ); + RenderSystem.scaled(1, -1, 1); + for (int f = 0; f < 4; f++) { + RenderSystem.translated(story.basePlateSize, 0, 0); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 1/1024f); + GuiUtils.drawGradientRect(0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); + RenderSystem.popMatrix(); + RenderSystem.rotatef(-90, 0, 1, 0); + } + RenderSystem.popMatrix(); + RenderSystem.disableCull(); + RenderSystem.disableDepthTest(); + } + // coords for debug if (PonderIndex.EDITOR_MODE && !userViewMode) { - MutableBoundingBox bounds = story.getBounds(); - RenderSystem.pushMatrix(); - RenderSystem.multMatrix(ms.peek() - .getModel()); - - RenderSystem.scaled(-1 / 16d, -1 / 16d, 1 / 16d); + RenderSystem.scaled(-1, -1, 1); + RenderSystem.scaled(1 / 16d, 1 / 16d, 1 / 16d); RenderSystem.translated(1, -8, -1 / 64f); // X AXIS @@ -389,11 +414,11 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.popMatrix(); } RenderSystem.popMatrix(); - buffer.draw(); - RenderSystem.popMatrix(); } + RenderSystem.popMatrix(); + ms.pop(); } @@ -416,7 +441,7 @@ public class PonderUI extends AbstractSimiScreen { int y = 31; String title = activeScene.getTitle(); - int wordWrappedHeight = font.getWordWrappedHeight(title, left.x); + int wordWrappedHeight = font.getWordWrappedHeight(title, left.x - 51); int streakHeight = 35 - 9 + wordWrappedHeight; UIRenderHelper.streak(0, x - 4, y - 12 + streakHeight / 2, streakHeight, (int) (150 * fade), 0x101010); @@ -435,7 +460,7 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.translated(x, y, 0); RenderSystem.rotatef(indexDiff * -75, 1, 0, 0); RenderSystem.translated(0, 0, 5); - font.drawSplitString(title, 0, 0, left.x, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + font.drawSplitString(title, 0, 0, left.x - 51, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); RenderSystem.popMatrix(); if (chapter != null) { @@ -477,7 +502,6 @@ public class PonderUI extends AbstractSimiScreen { } RenderSystem.popMatrix(); } - scan.flash(); } else { scan.dim(); @@ -523,11 +547,16 @@ public class PonderUI extends AbstractSimiScreen { int x = (width / 2) - 110; int y = right.y + right.getHeight() + 4; int w = width - 2 * x; + + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 400); renderBox(x, y, w, 1, false); + RenderSystem.popMatrix(); + 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); + GuiUtils.drawGradientRect(500, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd); RenderSystem.popMatrix(); } 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 a6dbd20a9..2529ea352 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -141,9 +141,29 @@ public class SceneBuilder { * assumes it to be square */ public void configureBasePlate(int xOffset, int zOffset, int basePlateSize) { - scene.offsetX = xOffset; - scene.offsetZ = zOffset; - scene.size = basePlateSize; + scene.basePlateOffsetX = xOffset; + scene.basePlateOffsetZ = zOffset; + scene.basePlateSize = basePlateSize; + } + + /** + * Use this in case you are not happy with the scale of the scene relative to + * the overlay + * + * @param factor >1 will make the scene appear larger, smaller otherwise + */ + public void scaleSceneView(float factor) { + scene.scaleFactor = factor; + } + + /** + * Use this in case you are not happy with the vertical alignment of the scene + * relative to the overlay + * + * @param yOffset >0 moves the scene up, down otherwise + */ + public void setSceneOffsetY(float yOffset) { + scene.yOffset = yOffset; } /** @@ -151,8 +171,10 @@ public class SceneBuilder { * 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); + world.showSection( + scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.basePlateOffsetX, 0, scene.basePlateOffsetZ), + new Vec3i(scene.basePlateSize, 0, scene.basePlateSize)), + Direction.UP); } /** diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index a1526380d..01ac69c20 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -21,6 +21,9 @@ public class BearingScenes { public static void windmillsAsSource(SceneBuilder scene, SceneBuildingUtil util) { scene.title("windmill_source", "Generating Rotational Force using Windmill Bearings"); + scene.configureBasePlate(1, 1, 5); + scene.setSceneOffsetY(-1); + scene.world.showSection(util.select.fromTo(1, 0, 1, 5, 0, 5), Direction.UP); scene.world.setBlock(util.grid.at(2, -1, 0), AllBlocks.SAIL.getDefaultState() .with(SailBlock.FACING, Direction.NORTH), false); @@ -144,6 +147,8 @@ public class BearingScenes { public static void windmillsAnyStructure(SceneBuilder scene, SceneBuildingUtil util) { scene.title("windmill_structure", "Windmill Contraptions"); + scene.configureBasePlate(1, 1, 5); + scene.setSceneOffsetY(-1); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -191,6 +196,8 @@ public class BearingScenes { public static void mechanicalBearing(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_bearing", "Movings Structures using the Mechanical Bearing"); + scene.configureBasePlate(1, 1, 5); + scene.setSceneOffsetY(-1); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); scene.world.showSection(util.select.layer(1), Direction.DOWN); @@ -268,6 +275,9 @@ public class BearingScenes { public static void bearingModes(SceneBuilder scene, SceneBuildingUtil util) { scene.title("bearing_modes", "Movement Modes of the Mechanical Bearing"); + scene.configureBasePlate(1, 1, 6); + scene.setSceneOffsetY(-1); + Selection sideCog = util.select.position(util.grid.at(7, 0, 3)); Selection cogColumn = util.select.fromTo(6, 1, 3, 6, 4, 3); Selection cogAndClutch = util.select.fromTo(5, 3, 1, 5, 4, 2); @@ -350,6 +360,8 @@ public class BearingScenes { public static void stabilizedBearings(SceneBuilder scene, SceneBuildingUtil util) { scene.title("stabilized_bearings", "Stabilized Contraptions"); + scene.configureBasePlate(1, 1, 5); + scene.setSceneOffsetY(-1); Selection beltAndBearing = util.select.fromTo(3, 3, 4, 3, 1, 6); Selection largeCog = util.select.position(2, 0, 6); 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 547a8c348..ed9604071 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 @@ -161,6 +161,7 @@ public class BeltScenes { public static void directions(SceneBuilder scene, SceneBuildingUtil util) { scene.title("belt_directions", "Valid Orientations for Mechanical Belts"); scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); scene.showBasePlate(); scene.idle(5); @@ -305,6 +306,7 @@ public class BeltScenes { public static void transport(SceneBuilder scene, SceneBuildingUtil util) { scene.title("belt_transport", "Using Mechanical Belts for Logistics"); scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -.6f * f); scene.showBasePlate(); scene.idle(5); @@ -379,6 +381,7 @@ public class BeltScenes { public static void beltsCanBeEncased(SceneBuilder scene, SceneBuildingUtil util) { scene.title("belt_casing", "Encasing Belts"); scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); scene.showBasePlate(); scene.idle(5); scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); 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 index 841646d57..168e171c2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChainDriveScenes.java @@ -92,7 +92,8 @@ public class ChainDriveScenes { public static void adjustableChainGearshift(SceneBuilder scene, SceneBuildingUtil util) { scene.title("chain_gearshift", "Controlling rotational speed with Chain Gearshifts"); - scene.configureBasePlate(0, 0, 7); + scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); 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/GantryScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/GantryScenes.java index 152d7c781..7ce74ee04 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 @@ -241,6 +241,7 @@ public class GantryScenes { public static void subgantry(SceneBuilder scene, SceneBuildingUtil util) { scene.title("gantry_cascaded", "Cascaded Gantries"); scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); scene.world.showSection(util.select.layer(0) .add(util.select.column(5, 3)) 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 28ff3e051..03ab44c64 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 @@ -279,6 +279,8 @@ public class KineticsScenes { public static void gearbox(SceneBuilder scene, SceneBuildingUtil util) { scene.title("gearbox", "Relaying rotational force using Gearboxes"); scene.configureBasePlate(1, 1, 5); + scene.setSceneOffsetY(-1); + scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP); scene.idle(10); 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 5203f0756..8c262ceca 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 @@ -22,7 +22,9 @@ public class MovementActorScenes { public static void psiTransfer(SceneBuilder scene, SceneBuildingUtil util) { scene.title("portable_storage_interface", "Contraption Storage Exchange"); - scene.configureBasePlate(0, 0, 8); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.95f); + scene.setSceneOffsetY(-1); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); @@ -112,7 +114,7 @@ public class MovementActorScenes { scene.world.modifyEntity(entity2, Entity::remove); scene.overlay - .showControls(new InputWindowElement(util.vector.topOf(6, 3, 2), Pointing.DOWN).withItem(itemStack), 40); + .showControls(new InputWindowElement(util.vector.topOf(5, 3, 2), Pointing.DOWN).withItem(itemStack), 40); scene.idle(30); scene.world.hideSection(util.select.position(hopper), Direction.UP); @@ -148,7 +150,8 @@ public class MovementActorScenes { public static void psiRedstone(SceneBuilder scene, SceneBuildingUtil util) { scene.title("portable_storage_interface_redstone", "Redstone Control"); - scene.configureBasePlate(0, 0, 6); + scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); Class psiClass = PortableItemInterfaceTileEntity.class; Selection psis = util.select.fromTo(1, 1, 3, 1, 3, 3); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java index b4712e67c..8b11d693e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PulleyScenes.java @@ -16,7 +16,9 @@ public class PulleyScenes { public static void movement(SceneBuilder scene, SceneBuildingUtil util) { scene.title("rope_pulley", "Moving Structures using Rope Pulleys"); - scene.configureBasePlate(0, 0, 8); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(0.95f); + scene.setSceneOffsetY(-1); Selection reversable = util.select.fromTo(2, 3, 4, 2, 4, 2); BlockPos leverPos = util.grid.at(1, 2, 4); @@ -101,7 +103,9 @@ public class PulleyScenes { public static void movementModes(SceneBuilder scene, SceneBuildingUtil util) { scene.title("rope_pulley_modes", "Movement Modes of the Rope Pulley"); - scene.configureBasePlate(0, 0, 8); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(0.95f); + scene.setSceneOffsetY(-1); Selection reversable = util.select.fromTo(2, 3, 4, 2, 4, 2); BlockPos leverPos = util.grid.at(1, 2, 4); @@ -172,7 +176,9 @@ public class PulleyScenes { public static void attachment(SceneBuilder scene, SceneBuildingUtil util) { scene.title("rope_pulley_attachment", "Moving Pulleys as part of a Contraption"); - scene.configureBasePlate(0, 0, 8); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(0.95f); + scene.setSceneOffsetY(-1); scene.world.showSection(util.select.layer(0), Direction.UP); scene.idle(5); From 60dbb931c1f19cc128ce31e0f2efabc740319069 Mon Sep 17 00:00:00 2001 From: zelophed Date: Thu, 11 Mar 2021 15:27:17 +0100 Subject: [PATCH 089/124] double stick - prevent super glue from being placed on already sticky faces --- .../glue/SuperGlueEntity.java | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 547aeb02c..c5a019872 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -1,29 +1,25 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; -import javax.annotation.Nullable; - -import org.apache.commons.lang3.Validate; - +import com.simibubi.create.AllBlocks; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; +import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import com.simibubi.create.content.contraptions.components.structureMovement.BlockMovementTraits; +import com.simibubi.create.content.contraptions.components.structureMovement.bearing.BearingBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.AbstractChassisBlock; import com.simibubi.create.content.schematics.ISpecialEntityItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement; import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.BlockFace; - import net.minecraft.block.BlockState; +import net.minecraft.block.DirectionalBlock; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.Entity; -import net.minecraft.entity.EntitySize; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.MoverType; -import net.minecraft.entity.Pose; +import net.minecraft.entity.*; import net.minecraft.entity.effect.LightningBoltEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -31,21 +27,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ActionResultType; -import net.minecraft.util.DamageSource; -import net.minecraft.util.Direction; +import net.minecraft.state.BooleanProperty; +import net.minecraft.util.*; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.Hand; -import net.minecraft.util.Mirror; -import net.minecraft.util.Rotation; -import net.minecraft.util.SoundEvents; -import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.BlockRayTraceResult; -import net.minecraft.util.math.MathHelper; -import net.minecraft.util.math.RayTraceResult; +import net.minecraft.util.math.*; import net.minecraft.util.math.RayTraceResult.Type; -import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -53,6 +39,9 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.PacketDistributor; +import org.apache.commons.lang3.Validate; + +import javax.annotation.Nullable; public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement { @@ -173,6 +162,8 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (!isValidFace(world, pos2, getFacingDirection()) && !isValidFace(world, pos, getFacingDirection().getOpposite())) return false; + if (isSideSticky(world, pos2, getFacingDirection()) || isSideSticky(world, pos, getFacingDirection().getOpposite())) + return false; return world.getEntitiesInAABBexcluding(this, getBoundingBox(), e -> e instanceof SuperGlueEntity) .isEmpty(); } @@ -188,6 +179,30 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat return true; } + public static boolean isSideSticky(World world, BlockPos pos, Direction direction) { + BlockState state = world.getBlockState(pos); + if (AllBlocks.STICKY_MECHANICAL_PISTON.has(state)) + return state.get(DirectionalKineticBlock.FACING) == direction; + + if (AllBlocks.STICKER.has(state)) + return state.get(DirectionalBlock.FACING) == direction; + + if (AllBlocks.GANTRY_CARRIAGE.has(state)) + return state.get(DirectionalKineticBlock.FACING) == direction; + + if (state.getBlock() instanceof BearingBlock) { + return state.get(DirectionalKineticBlock.FACING) == direction; + } + + if (state.getBlock() instanceof AbstractChassisBlock) { + BooleanProperty glueableSide = ((AbstractChassisBlock) state.getBlock()).getGlueableSide(state, direction); + if (glueableSide == null) return false; + return state.get(glueableSide); + } + + return false; + } + @Override public boolean canBeCollidedWith() { return true; From 59303fea2f8116095ceca51d1c574e7b2392817b Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 11 Mar 2021 18:39:12 +0100 Subject: [PATCH 090/124] Extend /create ponder command functionality --- .../foundation/command/PonderCommand.java | 30 ++++++++++++- .../foundation/networking/AllPackets.java | 1 + .../foundation/networking/PonderPacket.java | 45 +++++++++++++++++++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java diff --git a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java index b69b5664b..ddc439925 100644 --- a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java @@ -1,13 +1,26 @@ package com.simibubi.create.foundation.command; +import com.google.common.collect.ImmutableList; import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.suggestion.SuggestionProvider; import com.simibubi.create.foundation.networking.AllPackets; +import com.simibubi.create.foundation.networking.PonderPacket; +import com.simibubi.create.foundation.ponder.PonderRegistry; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; +import net.minecraft.command.ISuggestionProvider; +import net.minecraft.command.arguments.EntityArgument; +import net.minecraft.command.arguments.ResourceLocationArgument; +import net.minecraft.command.arguments.SuggestionProviders; import net.minecraft.entity.player.ServerPlayerEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.FakePlayer; import net.minecraftforge.fml.network.PacketDistributor; +import java.util.Collection; + public class PonderCommand { + public static final SuggestionProvider ALL_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.func_212476_a(PonderRegistry.all.keySet().stream(), builder)); static ArgumentBuilder register() { return Commands.literal("ponder") @@ -20,6 +33,21 @@ public class PonderCommand { new ConfigureConfigPacket(ConfigureConfigPacket.Actions.ponderIndex.name(), "")); return 1; - }); + }) + .then(Commands.argument("scene", ResourceLocationArgument.resourceLocation()).suggests(ALL_PONDERS) + .executes(context -> openScene(ResourceLocationArgument.getResourceLocation(context, "scene"), ImmutableList.of(context.getSource().asPlayer()))) + .then(Commands.argument("targets", EntityArgument.players()) + .requires(cs -> cs.hasPermissionLevel(2)) + .executes(context -> openScene(ResourceLocationArgument.getResourceLocation(context, "scene"), EntityArgument.getPlayers(context, "targets"))))); + + } + + private static int openScene(ResourceLocation scene, Collection players) { + for (ServerPlayerEntity player : players) { + if (player instanceof FakePlayer) + continue; + AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player), new PonderPacket(scene)); + } + return 1; } } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 044e806d5..4ead9e86e 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -91,6 +91,7 @@ public enum AllPackets { BLOCK_HIGHLIGHT(HighlightPacket.class, HighlightPacket::new, PLAY_TO_CLIENT), TUNNEL_FLAP(TunnelFlapPacket.class, TunnelFlapPacket::new, PLAY_TO_CLIENT), FUNNEL_FLAP(FunnelFlapPacket.class, FunnelFlapPacket::new, PLAY_TO_CLIENT), + OPEN_PONDER(PonderPacket.class, PonderPacket::new, PLAY_TO_CLIENT) ; diff --git a/src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java b/src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java new file mode 100644 index 000000000..c9de06967 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java @@ -0,0 +1,45 @@ +package com.simibubi.create.foundation.networking; + +import com.simibubi.create.Create; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.ponder.PonderRegistry; +import com.simibubi.create.foundation.ponder.PonderUI; +import mcp.MethodsReturnNonnullByDefault; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.network.NetworkDirection; +import net.minecraftforge.fml.network.NetworkEvent; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.function.Supplier; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class PonderPacket extends SimplePacketBase { + private final ResourceLocation scene; + + public PonderPacket(ResourceLocation scene) { + this.scene = scene; + } + + public PonderPacket(PacketBuffer buffer) { + this.scene = buffer.readResourceLocation(); + } + + @Override + public void write(PacketBuffer buffer) { + buffer.writeResourceLocation(scene); + } + + @Override + public void handle(Supplier context) { + NetworkEvent.Context ctx = context.get(); + if (ctx.getDirection() != NetworkDirection.PLAY_TO_CLIENT) + return; + if (PonderRegistry.all.containsKey(scene)) + ScreenOpener.transitionTo(new PonderUI(PonderRegistry.compile(PonderRegistry.all.get(scene)))); + else + Create.logger.error("Could not find ponder scene: " + scene); + ctx.setPacketHandled(true); + } +} From 2a8c3debeb0330ae8f8f6dba01a00e292a460ecf Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Thu, 11 Mar 2021 19:51:58 +0100 Subject: [PATCH 091/124] Captain Distracto, Part II - Linear Chassis now connect to each other in any direction --- .../com/simibubi/create/AllSpriteShifts.java | 5 +- .../chassis/ChassisTileEntity.java | 2 - .../chassis/LinearChassisBlock.java | 44 ++++++++++++++++-- .../connected/ConnectedTextureBehaviour.java | 15 ++++-- .../ponder/content/BearingScenes.java | 2 + .../block/linear_chassis_side_connected.png | Bin 0 -> 2405 bytes ...econdary_linear_chassis_side_connected.png | Bin 0 -> 1986 bytes 7 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/assets/create/textures/block/linear_chassis_side_connected.png create mode 100644 src/main/resources/assets/create/textures/block/secondary_linear_chassis_side_connected.png diff --git a/src/main/java/com/simibubi/create/AllSpriteShifts.java b/src/main/java/com/simibubi/create/AllSpriteShifts.java index 9aafdc586..650c1d6ab 100644 --- a/src/main/java/com/simibubi/create/AllSpriteShifts.java +++ b/src/main/java/com/simibubi/create/AllSpriteShifts.java @@ -44,7 +44,10 @@ public class AllSpriteShifts { SHADOW_STEEL_CASING = omni("shadow_steel_casing"), REFINED_RADIANCE_CASING = omni("refined_radiance_casing"), CREATIVE_CASING = getCT(CTType.CROSS, "creative_casing"); - public static final CTSpriteShiftEntry CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"), + public static final CTSpriteShiftEntry + CHASSIS_SIDE = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_side"), + SECONDARY_CHASSIS_SIDE = getCT(CTType.OMNIDIRECTIONAL, "secondary_linear_chassis_side"), + CHASSIS = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end"), CHASSIS_STICKY = getCT(CTType.OMNIDIRECTIONAL, "linear_chassis_end_sticky"); public static final CTSpriteShiftEntry BRASS_TUNNEL_TOP = vertical("brass_tunnel_top"), diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java index 1f8396922..0c21d2b83 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/ChassisTileEntity.java @@ -125,8 +125,6 @@ public class ChassisTileEntity extends SmartTileEntity { // Collect group of connected linear chassis for (Direction offset : Iterate.directions) { - if (offset.getAxis() == axis) - continue; BlockPos current = pos.offset(offset); if (visited.contains(current)) continue; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java index 30c6f95db..7450247d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java @@ -73,14 +73,49 @@ public class LinearChassisBlock extends AbstractChassisBlock { Block block = state.getBlock(); BooleanProperty glueableSide = ((LinearChassisBlock) block).getGlueableSide(state, direction); if (glueableSide == null) - return null; + return AllBlocks.LINEAR_CHASSIS.has(state) ? AllSpriteShifts.CHASSIS_SIDE + : AllSpriteShifts.SECONDARY_CHASSIS_SIDE; return state.get(glueableSide) ? AllSpriteShifts.CHASSIS_STICKY : AllSpriteShifts.CHASSIS; } + @Override + protected Direction getUpDirection(ILightReader reader, BlockPos pos, BlockState state, Direction face) { + Axis axis = state.get(AXIS); + if (face.getAxis() == axis) + return super.getUpDirection(reader, pos, state, face); + return Direction.getFacingFromAxis(AxisDirection.POSITIVE, axis); + } + + @Override + protected Direction getRightDirection(ILightReader reader, BlockPos pos, BlockState state, Direction face) { + Axis axis = state.get(AXIS); + return axis != face.getAxis() && axis.isHorizontal() ? (face.getAxis() + .isHorizontal() ? Direction.DOWN : (axis == Axis.X ? Direction.NORTH : Direction.EAST)) + : super.getRightDirection(reader, pos, state, face); + } + + @Override + protected boolean reverseUVsHorizontally(BlockState state, Direction face) { + Axis axis = state.get(AXIS); + boolean side = face.getAxis() != axis; + if (side && axis == Axis.X && face.getAxis() + .isHorizontal()) + return true; + return super.reverseUVsHorizontally(state, face); + } + + @Override + protected boolean reverseUVsVertically(BlockState state, Direction face) { + return super.reverseUVsVertically(state, face); + } + @Override public boolean reverseUVs(BlockState state, Direction face) { Axis axis = state.get(AXIS); - if (axis.isHorizontal() && (face.getAxisDirection() == AxisDirection.POSITIVE)) + boolean end = face.getAxis() == axis; + if (end && axis.isHorizontal() && (face.getAxisDirection() == AxisDirection.POSITIVE)) + return true; + if (!end && axis.isHorizontal() && face == Direction.DOWN) return true; return super.reverseUVs(state, face); } @@ -88,7 +123,10 @@ public class LinearChassisBlock extends AbstractChassisBlock { @Override public boolean connectsTo(BlockState state, BlockState other, ILightReader reader, BlockPos pos, BlockPos otherPos, Direction face) { - return sameKind(state, other) && state.get(AXIS) == other.get(AXIS); + Axis axis = state.get(AXIS); + boolean superConnect = face.getAxis() == axis ? super.connectsTo(state, other, reader, pos, otherPos, face) + : sameKind(state, other); + return superConnect && axis == other.get(AXIS); } } diff --git a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java index 5b9edc03b..64e655d9c 100644 --- a/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/block/connected/ConnectedTextureBehaviour.java @@ -55,10 +55,9 @@ public abstract class ConnectedTextureBehaviour { if (textureEntry == null) return context; - Axis axis = face.getAxis(); boolean positive = face.getAxisDirection() == AxisDirection.POSITIVE; - Direction h = axis == Axis.X ? Direction.SOUTH : Direction.WEST; - Direction v = axis.isHorizontal() ? Direction.UP : Direction.NORTH; + Direction h = getRightDirection(reader, pos, state, face); + Direction v = getUpDirection(reader, pos, state, face); h = positive ? h.getOpposite() : h; if (face == Direction.DOWN) { v = v.getOpposite(); @@ -95,6 +94,16 @@ public abstract class ConnectedTextureBehaviour { return context; } + protected Direction getUpDirection(ILightReader reader, BlockPos pos, BlockState state, Direction face) { + Axis axis = face.getAxis(); + return axis.isHorizontal() ? Direction.UP : Direction.NORTH; + } + + protected Direction getRightDirection(ILightReader reader, BlockPos pos, BlockState state, Direction face) { + Axis axis = face.getAxis(); + return axis == Axis.X ? Direction.SOUTH : Direction.WEST; + } + private boolean testConnection(ILightReader reader, BlockPos pos, BlockState state, Direction face, final Direction horizontal, final Direction vertical, int sh, int sv) { BlockPos p = pos.offset(horizontal, sh) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java index 01ac69c20..689a14165 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/BearingScenes.java @@ -431,6 +431,8 @@ public class BearingScenes { public static void clockwork(SceneBuilder scene, SceneBuildingUtil util) { scene.title("clockwork_bearing", "Animating Structures using Clockwork Bearings"); + scene.configureBasePlate(1, 1, 5); + scene.setSceneOffsetY(-1); Selection kinetics = util.select.fromTo(3, 3, 4, 3, 1, 6); Selection largeCog = util.select.position(2, 0, 6); diff --git a/src/main/resources/assets/create/textures/block/linear_chassis_side_connected.png b/src/main/resources/assets/create/textures/block/linear_chassis_side_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..b1398a95747e97b9c096ca390a6196e19b9a0c99 GIT binary patch literal 2405 zcmZuzXH-+!77heNjSx@~1zv(;8Apd=89D(01EN$BQ3!PqhbVP|LK=+E0!xY_;UP^J z1yl%~AP}NBhN6TL1tkz^h8{J961d4balIe!$K18f-S_OT+`Z4fKkgkj7p&@L?aeS4 zOx4NJ-UCFcd~Jk-`{L(}RS*(($LIKNz)DR`rBbN`0>KES=47aa$KyjoL;d{x zyu7>s`s6^n00hlg4;N3_KU}awA4xNSuqo2fCk6&nYm+Ypc0_3i47M@V$=>$tHC)|= zJA`q)EwQs}byW#-GRkafKvIU0Iy!HFyDLSH?YO1=a*oMoKfQ>NocdWw;Ol2PO_vv* zn z12*a_vjSo?mOj{!TMp6xuMFQB3Br}?Ij&IyhgX^UG$}|SuCtj2~S3!U4>{5K^=XPquLfM|X3mCO^ke)9`sETsqh21;m7}-Gy zl8&O6VTW31?rCCXXq?FQkrfouOAKreZlMtC;Y_cdwVXUQ{s*n4h?mg9E=BgNNz0ax zCmf17AtzVWpjZ}Du+;yEZG!wy%}*alIT>yKA%Pd5YtlmhICR~hzNFyrgkt7M1Kj#; zOc4;KWFD>qIc=rXz633|jFHv=Lpdksk{U*g8Rb}(NDnmk<&&#f$}74jwap+`M(klh zscaLy7O)}}isr*kL#`{$MQvwf+wyDK>h=UlhvKZlUkHykf>cgHcEkK!^m>^r>%hDQ zwJMKX9cI543^n)?{_KW}`O!mUTi6?*D9SKfGmC?h&D3MwLXPEyvQ2S=pW2?xE#7zd zGY?%c!Wk}-WnrvU3Iwmu|x7! z)n7{>>B0wSr(MV72UXjT6{b%D<-kuLR4P}Zn?sShT0ukot~;Js8*x&du?xEA%;|#& zaM}n@G^;$8CzSO%$#SgtKvF4A>=w=Q!k38PZ6^j))a{!rJ4JrDFjtJvlmvE+NW)%d zcKy)$p;^Y0jK?^B)o$A@dz-mrU0~>iW?^V&lJ!fQnRcPZtNWX|D6G6}IFoXi7BOKN zU`bQnmNxqLl4+0Yj(TgB^2;~-N^_a|eM6)AqmP%4Xo2(#YpO|>vzs!B*2w=Fl&}R3 zg#^whv{vi6`3}HCHXbvqr%Wp5hSeZ$g~<%#g>KdC+!$NDH}MkANUWe+47E;?-c^_i zk_IbQx|;)L;HIzFDDKP2!(7Co1|cDz3_neRnV5f)rHl;BC6E8qh#t~pXOQ8^Vg;VB zNmu5)292Bft3;%8D^E@h$RCGVUF)i?M#DVE7IlDM*v@&G13!G}M)8?D{Snl1q^1A2 z#vDk!gb(vW+obO$3VF&dtqL!!1EN1fP4Bgi%K)qjB%^rrq7`de<^`~))_TIj{22wD zj2;yjn|A+UGQ|JRfPR@xyZ|1C2Ha*yWzl;;5v;(ICYG_wp zv3wAlQA&9roP-d$WVrT#CwZG^7nXr zv%ZcBm`@I_z;sTV=#>e>p_5#lrY|m6kx>#=)@|(dpT`1ch*^9l%Iy!UsfKcqkG%V* z7Z!eXZ`EY?%G<7}xMh6LR}(s?+rasbDMNB+WI5wEUY`s@NAabD@iteh{_6Ckhp#V* zsl2hW3o`!7{H(%;T{s*)oTto{4=^5;UiCCGmLMN;z6#;{Nc6z8JWt-3gi9;_vb4%F zoq?oL@(e27*8xteF=mJSKL2|wB?%~+;06Ox&n5~PQ;k*6An7JRGuW81--VvBKjy7N zYq`~PEf+BRNZZ>R+TBfGUGea(eL46(epCs3Mq3n$biD<8G*#zBuyF6$e{Tb4RZmKs zxO|5HGQuBu9x|A*U{v#~P%Nj%d-7qAn0y?X<<)3O^5V-Xt*JIIXVbt`xdmG1rKcV$mhh<(kz&{5{uQ1rC{rv@&eG4W z9YK#T>bQ|`0cJ^?KQX7*+yV3+K+hniZ{PoTYC70c2TAfF6-t^}(GxYCaQphHA5`FS zQ@@;ua}FtPlh3+vKg>^QyD274=N=!){ijHvxSk(d=Us6mW8B97FQ$uOd$+A>3-F1e zm4F3jeH literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side_connected.png b/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side_connected.png new file mode 100644 index 0000000000000000000000000000000000000000..dc7fb57d72df2e734850da1fde25de978911c339 GIT binary patch literal 1986 zcmZuydpMNq7XM02*oXxQVH+n_jNhG@pE|9)22n2$Ysa60^FZ}$$hzo|-JdP4i{R2SK)6)|Y63ApS-a;oVEG#fEFx1f?mT-hf zBoZutO7bKL*k zvD;_}RGC(8HPksy=nXhPL}RQsBa^6!fLHV?bljVv65@TpoG5b)TEB}j-ch#NeI-U% zD>Ra{8s9kzI8#J5ERGo=C_j6_H*1}O>dHT7(4l83cu};*eDKbfxtm6_^esso;Ly7+ z$NMa>oir(J_c~;MD35d-LLHu7RqK$c#bL-`Yvk1;nC{53gW6> z{>5k5TM(vXE-;oow;VJJ2aSCc$vN-B=t4ND$WUy)v^dv}Ugh@QShm^fCtKRgHD059 z^{ew!(&(bEDAJYr{)Z)rPw}LV0Vo^~H>gFB0#UyY?h; zmydfxn3R3?K*+3KNn$4GFPohPx0h6bubt0+f>k_1$2$F13Q^U}Sg_|ni zs3(J~NC(dBtliL#)vGs0@&H*!BitRDE&VIvZBc!F?vP|{pJ{Qffho2* z!DsL{x48>T-%5Y)8@3BxePniTR!-15AMDT} zm6;XUQpj*ksw2H#cA^ipQ{3KzN?FFSCbI!ryQ&`^>E|*FoY6dGqYZ9=I_9kTLpEbj z7u&q>zETz$@3SJe(O|;YCsCnBPc{Q6(CP_X92Gj*)NViq*y3NzW74ly)8%e@b#c zEJ;|5NHeLAh@V8kEIgZ$bjwf3Yq?&K6NQqBLO-8C>v7?#D`@1yW!UXl2Esu?tKg_1 zBhu3g+M*_vj`S|rb2pe3VZUO6wU9oot|aFQlKbd2FI`vC7~V7&1-&pM0$Xk>Z9*bvXA#vTX2ia_;#jF6Uwcv_Oqk1QMnZ917Fk`EF!mf?9; z@=NXm&1m!CkTLvYKI1)&UcWme52FY22TC?ZXt!T-YcydmP&Q3wsrETVDNSLEsBE3T zbn>6zRIkJoJcM7ZA!iW|Im7pV_iD-~f8Qhd=uMAWiD?eEm?R=-#KBLj&HUy4%FX*7 z8KDoWi!+p zu}{myaeFFomj;??9=&9)9i+$j@Q1_un<~gB&60KiZmWPre`;;FZ<08IFPU0@Pw)qThb=Sp{&%>Pw zGPZe8BOeV^pN>r&@~rm;J#tsJKbhfO|H1);lo}Na6a%bQngV-d)Pmwz?<0XUtn*-F z^`7S}9X-0j|eWH0i=e#yj&=ly}AqTdHmi{-K$_3$p*ln7lc=XX{lSMp9 zne+vg;}GSgw!CdMma0$V_rFr-AwG;wM-Ng4{~VRUD38pQ?VX4bo+J~?Y47i+VSd*2 Uy^0Kp0QVn+JMCn{IOUV{H_!tIU;qFB literal 0 HcmV?d00001 From f115233197a49d5b5a914e7e8ff7fa73003aa3c6 Mon Sep 17 00:00:00 2001 From: grimmauld Date: Thu, 11 Mar 2021 20:31:23 +0100 Subject: [PATCH 092/124] Fix leave finding in saws so compatibility with other mods works --- .../java/com/simibubi/create/foundation/utility/TreeCutter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java index 32923920b..1432d99ff 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java +++ b/src/main/java/com/simibubi/create/foundation/utility/TreeCutter.java @@ -208,7 +208,7 @@ public class TreeCutter { } private static boolean isLeaf(BlockState state) { - return state.has(LeavesBlock.DISTANCE); + return state.has(LeavesBlock.DISTANCE) || state.isIn(BlockTags.LEAVES); } } From 5e5289fcb002e1fa474e1616c640c1410c6af435 Mon Sep 17 00:00:00 2001 From: Kryppers <65094918+Kryppers@users.noreply.github.com> Date: Thu, 11 Mar 2021 23:50:58 +0000 Subject: [PATCH 093/124] Update secondary_linear_chassis_side_connected.png --- ...econdary_linear_chassis_side_connected.png | Bin 1986 -> 3002 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side_connected.png b/src/main/resources/assets/create/textures/block/secondary_linear_chassis_side_connected.png index dc7fb57d72df2e734850da1fde25de978911c339..2b9ab5f1dc77b04fbb61e4768397738544985029 100644 GIT binary patch literal 3002 zcmXw53piAH8$YCknDW^um$Pl!bThjfQ8=tiLLzFl676bTnu_EyWyValno1d;-6+Xq zrOArvf^o}WTxwMlV#;l1Oc@MwGh=4V?K{)=ea~|)&-4D?%kO>9`~J^+E&M>Bx#@aS z007K`_W4J^Z@m6qxdMLDp|Br{zrSr$UP#gO!hY;VdT)TV)((UQG#;_+H zjy)X~it8qhx7o`xpRHgebzJYti+w;FbK5#z5rGRmOgy@_rO)G8fVtA68qx zjn>VL^ySd9TE^ebXL`t0a$yBc{DP80W3@bNJ_lP17G#`v1}BcIRVdAL!(FnUX0-1G zfA;e8;gr+31>e0Ig(6ib6biUpuK&wv$3xW7`Iwf{mfF}x29rSFw$9$ez@xI-x)#2w z1f}&kDAir-l3XUgp5N@e6>T2c5t@m)^PhwjvBnBeB;guS$S%^NfM&1vsf;f{x_OY+Zd?TG_9 z5oq<$H)SC~n&Cw^Bn0Zi({x&%Q_}>iwZGP(r5p&Ssn1C#Q4j)@1}zd=NyHg|$%H;7=A<7=u;HUn zeju+mab;-(*4aqYB3$R6t9Qsji5<)9(U0kGizb^8j2WL8&fsLtd`fJRY0BuXV0y#p z>~!-igNW9tpUW>D8D+I9(2Eep^TmM6>n4R2m{J3hz8d+go|~r%bnBK*nt;SMPbAZcMpG`9iQQjJV?b%0InqHyKy?wI{co0LYo z=ZPE`x}t8nL}YXm6pE^8&@^RSx6`iD5`v6DE|+{C_j2*5TsH?d=f38p+adDquF^2j zl0@eru6YOQ9rq*;v|+U76gsT-3!rFBcQ95dq_(jHIJYF5+qQ34UF5Y%#uVqUIKGy2 zR@;UoQMy4vB(hceLpKj49$EY&pCaSBEUfX3!8()T3~4MOahT&5>9ll2Qoc!4vZzvH z!7oXBowtPI^2kgXG3Dcmt|uXR%mx;Zo4f;$n;O*92BTO62J#|#iyil*guDfeHl!re zcH#P)bqJFUmQZ$m^d>oP5NXKDl1)BZ*dgPwPX3M{%d&T6tf9d|u;|@T(_!^JN`J`GNbRkQQQ(U<+s% z4rYB1flo6>U$?`MP%^lf{S)o0N%N|JN#s?dv)@CWm#D)aJuB#0_P6mDTm`%cJU7ebFlK4*XSXfni04(feb+U5A89fY?57wW_d-N zMF+J8z>IXCFhE=^h9ugXCqHH@VfwK{sNM~f;~MT=4NxEulK1Rzz$Q79CY*VJDCK(C zMtqL1jkH4#AAdhnj{OzttLLs0;}YQ(SH!$NobU%_vT~&KCxG zJ+6l@;Gm%jM8hz$Bi@b_jodd=%+9ObxKB=97;}$n-Jj#u(|eT9=#YzN+GM$hpxiC@ z9-js{s#8SgJBaXL+)C0v#-brvKdF-}tv1F>%~F>g|NW_RcP}vjx02XQy*r2jPSG5} z4VS}aq7Z;&Gj@@Bu2wxD{zSr(j`CrV`c{x)&JI(1<1j9Yuwd|5R&DHa5{J2t&<_te z&Lh?f_^x$&R*O;W7Cm)WjEK8e0CCj^y2(}qi<@EH9nAbF1pbIkk!_jzMd2*BJ{!Y` zm!f)LGU+(X<61=QGa9H=qk3UM0uCN$wn`ujgmfd~S%a@Xf(%MOdy`6qMJburVKOsX z^dvom9j{VFVzl+#yj4Ko!eYJRD1?8uPa$G3(|GeJF%<*+HbW;2W|tO5h_&y&pbr$H zBeB^Q_dHy*MTq;`-viZpyVAu-`xg@ugZrOE9JSdgH+m_R(!r7#T)M0d0-?JqQ57de z352JXn2P)BcD-Rf`u>dlPAKY(5|A~%<%6cga^`!OC!P}!6((%OZkfn>W2Mi()|EUN zUh-F}_(U-JMg{px1?);}i4PU0lI?2xiD*nxS0W*#z1kR9`m2DX#Mld3b86sWRZ6S4 zL(AHEDZY`bmz>(x!pFeg)}LrbM9h*t(AVOFHVsJ(K6AF1eRq~suh47zWKUqPGY)X- zmm(EbBq*cx0#Fw+`v0=H+?qeHidOFc@3*hQx4E7$dK?Hkc2p1tC*jPNC*TXhx|uel zdz~TJ3l?x`!jo38-=myi0aBnBVvh&^mm=|}ld=J>ATnyxVK($-nF^G8T-c#wB5XyN)g%3?Zv`;W@ zJIEOjcPHSf)*sKyEj=Y4qcw$?OCg=GcEL}T$-QpN&w`hsR)mA{R83AY)LE%_TyD{R z1s>Q?Q=!T*^cHRc7mVAg_Y;tSZ|l@V?62c#$kGtW8fO!V1K{~B>r78CxmQ$NgupYg zZIGkzFa}UO6wW8aV44|(#r~A>oc9!s7XIRHeK-C32}eaUSM{|Bak7vp?Y2Q)-xil4 ze0WBe)8TF|Vmw5CXGO}HQ34z6ul6#GJwTtnL_{~4H%Tr*)*WI`Hu=54m!)*RhHJJv_mdkE-Er1mLaP3#$CW*&gX^$aY*@k8Wn{sYx$ qJ*HXDxsEr4l2cK|`LI)&1aZYC>$FK>Ob5J^13>`?{A+!W=l%zRN_$iQ literal 1986 zcmZuydpMNq7XM02*oXxQVH+n_jNhG@pE|9)22n2$Ysa60^FZ}$$hzo|-JdP4i{R2SK)6)|Y63ApS-a;oVEG#fEFx1f?mT-hf zBoZutO7bKL*k zvD;_}RGC(8HPksy=nXhPL}RQsBa^6!fLHV?bljVv65@TpoG5b)TEB}j-ch#NeI-U% zD>Ra{8s9kzI8#J5ERGo=C_j6_H*1}O>dHT7(4l83cu};*eDKbfxtm6_^esso;Ly7+ z$NMa>oir(J_c~;MD35d-LLHu7RqK$c#bL-`Yvk1;nC{53gW6> z{>5k5TM(vXE-;oow;VJJ2aSCc$vN-B=t4ND$WUy)v^dv}Ugh@QShm^fCtKRgHD059 z^{ew!(&(bEDAJYr{)Z)rPw}LV0Vo^~H>gFB0#UyY?h; zmydfxn3R3?K*+3KNn$4GFPohPx0h6bubt0+f>k_1$2$F13Q^U}Sg_|ni zs3(J~NC(dBtliL#)vGs0@&H*!BitRDE&VIvZBc!F?vP|{pJ{Qffho2* z!DsL{x48>T-%5Y)8@3BxePniTR!-15AMDT} zm6;XUQpj*ksw2H#cA^ipQ{3KzN?FFSCbI!ryQ&`^>E|*FoY6dGqYZ9=I_9kTLpEbj z7u&q>zETz$@3SJe(O|;YCsCnBPc{Q6(CP_X92Gj*)NViq*y3NzW74ly)8%e@b#c zEJ;|5NHeLAh@V8kEIgZ$bjwf3Yq?&K6NQqBLO-8C>v7?#D`@1yW!UXl2Esu?tKg_1 zBhu3g+M*_vj`S|rb2pe3VZUO6wU9oot|aFQlKbd2FI`vC7~V7&1-&pM0$Xk>Z9*bvXA#vTX2ia_;#jF6Uwcv_Oqk1QMnZ917Fk`EF!mf?9; z@=NXm&1m!CkTLvYKI1)&UcWme52FY22TC?ZXt!T-YcydmP&Q3wsrETVDNSLEsBE3T zbn>6zRIkJoJcM7ZA!iW|Im7pV_iD-~f8Qhd=uMAWiD?eEm?R=-#KBLj&HUy4%FX*7 z8KDoWi!+p zu}{myaeFFomj;??9=&9)9i+$j@Q1_un<~gB&60KiZmWPre`;;FZ<08IFPU0@Pw)qThb=Sp{&%>Pw zGPZe8BOeV^pN>r&@~rm;J#tsJKbhfO|H1);lo}Na6a%bQngV-d)Pmwz?<0XUtn*-F z^`7S}9X-0j|eWH0i=e#yj&=ly}AqTdHmi{-K$_3$p*ln7lc=XX{lSMp9 zne+vg;}GSgw!CdMma0$V_rFr-AwG;wM-Ng4{~VRUD38pQ?VX4bo+J~?Y47i+VSd*2 Uy^0Kp0QVn+JMCn{IOUV{H_!tIU;qFB From f9eb4dd2e7546d14480861e2dd02645b3e33cee2 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Thu, 11 Mar 2021 15:59:26 -0800 Subject: [PATCH 094/124] Pondering back and forth. - Only about gantries so far. - Reduce Backend log spam. --- .../foundation/ponder/PonderProgressBar.java | 150 ++++++++++++++++++ .../create/foundation/ponder/PonderScene.java | 21 +++ .../create/foundation/ponder/PonderUI.java | 36 ++--- .../foundation/ponder/SceneBuilder.java | 24 +-- .../ponder/content/GantryScenes.java | 11 ++ .../instructions/KeyframeInstruction.java | 24 +++ .../foundation/render/backend/Backend.java | 4 +- .../render/backend/gl/shader/GlProgram.java | 6 +- .../render/backend/gl/shader/GlShader.java | 6 +- 9 files changed, 238 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java new file mode 100644 index 000000000..357b82820 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -0,0 +1,150 @@ +package com.simibubi.create.foundation.ponder; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; +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.audio.SoundHandler; +import net.minecraftforge.fml.client.gui.GuiUtils; +import org.antlr.v4.runtime.misc.IntegerList; + +public class PonderProgressBar extends AbstractSimiWidget { + + LerpedFloat progress; + LerpedFloat flash; + + PonderUI ponder; + + public PonderProgressBar(PonderUI ponder, int xIn, int yIn, int widthIn, int heightIn) { + super(xIn, yIn, widthIn, heightIn); + + this.ponder = ponder; + progress = LerpedFloat.linear() + .startWithValue(0); + flash = LerpedFloat.linear() + .startWithValue(0); + } + + public void tick() { + progress.chase(ponder.getActiveScene().getSceneProgress(), .5f, LerpedFloat.Chaser.EXP); + progress.tickChaser(); + + if (isHovered) + flash(); + } + + 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 + protected boolean clicked(double mouseX, double mouseY) { + return this.active && this.visible && + !ponder.getActiveScene().keyframeTimes.isEmpty() && + mouseX >= (double)this.x && + mouseX < (double)(this.x + this.width) && + mouseY >= (double)this.y - 3 && + mouseY < (double)(this.y + this.height + 3); + } + + @Override + public void onClick(double mouseX, double mouseY) { + PonderScene activeScene = ponder.getActiveScene(); + int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); + + int seekTime = 0; + + IntegerList keyframeTimes = activeScene.keyframeTimes; + for (int i = 0; i < keyframeTimes.size(); i++) { + int keyframeTime = keyframeTimes.get(i); + + if (keyframeTime > clickedAtTime) + break; + + seekTime = keyframeTime; + } + ponder.seekToTime(seekTime); + } + + public int getHoveredKeyframeIndex(double mouseX) { + PonderScene activeScene = ponder.getActiveScene(); + int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); + + int index = -1; + + IntegerList keyframeTimes = activeScene.keyframeTimes; + for (int i = 0; i < keyframeTimes.size(); i++) { + int keyframeTime = keyframeTimes.get(i); + + if (keyframeTime > clickedAtTime) + break; + + index = i; + } + + return index; + } + + @Override + public void renderButton(int mouseX, int mouseY, float partialTicks) { + + isHovered = clicked(mouseX, mouseY); + + PonderUI.renderBox(x, y, width, height, false); + RenderSystem.pushMatrix(); + RenderSystem.translated(x - 2, y - 2, 0); + + RenderSystem.pushMatrix(); + RenderSystem.scaled((width + 4) * progress.getValue(partialTicks), 1, 1); + GuiUtils.drawGradientRect(200, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd); + RenderSystem.popMatrix(); + + renderKeyframes(mouseX, partialTicks); + + RenderSystem.popMatrix(); + } + + private void renderKeyframes(int mouseX, float partialTicks) { + PonderScene activeScene = ponder.getActiveScene(); + + int hoverStartColor; + int hoverEndColor; + int hoverIndex; + if (isHovered) { + hoverIndex = getHoveredKeyframeIndex(mouseX); + + float flashValue = flash.getValue(partialTicks) * 3 + (float) Math.sin((AnimationTickHolder.getTicks() + partialTicks) / 6); + + hoverEndColor = ColorHelper.applyAlpha(0x70ffffff, flashValue); + hoverStartColor = ColorHelper.applyAlpha(0x30ffffff, flashValue); + } + else { + hoverIndex = -1; + hoverEndColor = 0; + hoverStartColor = 0; + } + + IntegerList keyframeTimes = activeScene.keyframeTimes; + for (int i = 0; i < keyframeTimes.size(); i++) { + int keyframeTime = keyframeTimes.get(i); + + int startColor = i == hoverIndex ? hoverStartColor : 0x60ffeedd; + int endColor = i == hoverIndex ? hoverEndColor : 0x60ffeedd; + + int keyframePos = (int) (((float) keyframeTime) / ((float) activeScene.totalTime) * (width + 4)); + GuiUtils.drawGradientRect(200, keyframePos, 1, keyframePos + 1, 4, startColor, endColor); + } + } + + @Override + public void playDownSound(SoundHandler handler) { + + } +} 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 a622c8b8d..db47f742e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -13,6 +13,8 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import com.simibubi.create.foundation.ponder.instructions.KeyframeInstruction; +import org.antlr.v4.runtime.misc.IntegerList; import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableObject; @@ -59,6 +61,8 @@ public class PonderScene { int textIndex; String sceneId; + IntegerList keyframeTimes; + List schedule, activeSchedule; Map linkedElements; Set elements; @@ -102,6 +106,7 @@ public class PonderScene { info = new SceneRenderInfo(); baseWorldSection = new WorldSectionElement(); renderViewEntity = new ArmorStandEntity(world, 0, 0, 0); + keyframeTimes = new IntegerList(4); setPointOfInterest(new Vec3d(0, 4, 0)); } @@ -180,6 +185,7 @@ public class PonderScene { world.restore(); elements.clear(); linkedElements.clear(); + keyframeTimes.clear(); transform = new SceneTransform(); finished = false; @@ -270,6 +276,15 @@ public class PonderScene { finished = true; } + public void seekToTime(int time) { + if (time < currentTime) + throw new IllegalStateException("Cannot seek backwards. Rewind first."); + + while (currentTime < time && !finished) { + tick(); + } + } + public void addToSceneTime(int time) { if (!stoppedCounting) totalTime += time; @@ -279,6 +294,12 @@ public class PonderScene { stoppedCounting = true; } + public void markKeyframe() { + if (!stoppedCounting) { + keyframeTimes.add(totalTime); + } + } + public void addElement(PonderElement e) { elements.add(e); } 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 f9ac2c8a6..cc7bbcde4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -64,7 +64,6 @@ public class PonderUI extends AbstractSimiScreen { private List tagButtons; private List tagFades; private LerpedFloat fadeIn; - private LerpedFloat sceneProgress; ItemStack stack; PonderChapter chapter = null; @@ -80,6 +79,7 @@ public class PonderUI extends AbstractSimiScreen { private PonderTag referredToByTag; private PonderButton left, right, scan, chap; + private PonderProgressBar progressBar; public static PonderUI of(ItemStack item) { return new PonderUI(PonderRegistry.compile(item.getItem() @@ -115,8 +115,6 @@ public class PonderUI extends AbstractSimiScreen { } lazyIndex = LerpedFloat.linear() .startWithValue(index); - sceneProgress = LerpedFloat.linear() - .startWithValue(0); fadeIn = LerpedFloat.linear() .startWithValue(0) .chase(1, .1f, Chaser.EXP); @@ -160,6 +158,11 @@ public class PonderUI extends AbstractSimiScreen { int bX = (width - 20) / 2 - (70 + 2 * spacing); int bY = height - 20 - 31; + int pX = (width / 2) - 110; + int pY = bY + PonderButton.SIZE + 4; + int pW = width - 2 * pX; + widgets.add(progressBar = new PonderProgressBar(this, pX, pY, pW, 1)); + widgets.add(scan = new PonderButton(bX, bY, () -> { identifyMode = !identifyMode; if (!identifyMode) @@ -188,7 +191,6 @@ public class PonderUI extends AbstractSimiScreen { widgets.add(new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) .shortcut(bindings.keyBindBack) .fade(0, -1)); - } @Override @@ -217,10 +219,9 @@ public class PonderUI extends AbstractSimiScreen { PonderScene activeScene = scenes.get(index); if (!identifyMode) activeScene.tick(); - sceneProgress.chase(activeScene.getSceneProgress(), .5f, Chaser.EXP); lazyIndex.tickChaser(); fadeIn.tickChaser(); - sceneProgress.tickChaser(); + progressBar.tick(); if (!identifyMode) { float lazyIndexValue = lazyIndex.getValue(); @@ -232,6 +233,17 @@ public class PonderUI extends AbstractSimiScreen { updateIdentifiedItem(activeScene); } + public PonderScene getActiveScene() { + return scenes.get(index); + } + + public void seekToTime(int time) { + if (getActiveScene().currentTime > time) + replay(); + + getActiveScene().seekToTime(time); + } + public void updateIdentifiedItem(PonderScene activeScene) { hoveredTooltipItem = ItemStack.EMPTY; hoveredBlockPos = null; @@ -490,18 +502,6 @@ public class PonderUI extends AbstractSimiScreen { 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(); - } - // Tags List sceneTags = activeScene.tags; boolean highlightAll = sceneTags.contains(PonderTag.Highlight.ALL); 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 5bfe87504..13fe61832 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -24,26 +24,8 @@ import com.simibubi.create.foundation.ponder.elements.ParrotElement.ParrotPose; import com.simibubi.create.foundation.ponder.elements.ParrotElement.SpinOnComponentPose; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction; -import com.simibubi.create.foundation.ponder.instructions.AnimateTileEntityInstruction; -import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; -import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; -import com.simibubi.create.foundation.ponder.instructions.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.*; import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; -import com.simibubi.create.foundation.ponder.instructions.FadeOutOfSceneInstruction; -import com.simibubi.create.foundation.ponder.instructions.HighlightValueBoxInstruction; -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; -import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; -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; @@ -345,6 +327,10 @@ public class SceneBuilder { addInstruction(AnimateParrotInstruction.move(link, offset, duration)); } + public void addKeyframe() { + addInstruction(KeyframeInstruction.INSTANCE); + } + } public class WorldInstructions { 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 152d7c781..f1487a4e5 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 @@ -48,6 +48,8 @@ public class GantryScenes { scene.overlay.showText(80) .text(text) .pointAt(util.vector.centerOf(centralShaft)); + + scene.special.addKeyframe(); scene.idle(80); scene.world.hideIndependentSection(gantry, Direction.UP); @@ -59,6 +61,7 @@ public class GantryScenes { .text("Gantry setups can move attached Blocks.") .pointAt(gantryTop) .placeNearTarget(); + scene.special.addKeyframe(); scene.idle(30); Selection planks = util.select.position(5, 3, 1); @@ -75,6 +78,7 @@ public class GantryScenes { .sharedText("movement_anchors") .pointAt(gantryTop) .placeNearTarget(); + scene.special.addKeyframe(); scene.idle(80); scene.world.modifyKineticSpeed(util.select.layer(0), f -> 32f); @@ -107,6 +111,7 @@ public class GantryScenes { scene.idle(15); scene.world.moveSection(gantry, util.vector.of(-3, 0, 0), 40); scene.idle(40); + scene.special.addKeyframe(); scene.world.toggleRedstonePower(shaft); scene.world.toggleRedstonePower(util.select.position(3, 1, 0)); @@ -122,6 +127,7 @@ public class GantryScenes { .south())) .text("Redstone-powered gantry shafts stop moving their carriages") .placeNearTarget(); + scene.special.addKeyframe(); scene.idle(70); Selection cogSelection = util.select.position(cogPos); @@ -168,6 +174,7 @@ public class GantryScenes { .text("The movement direction of carriages depend on their shafts' orientation") .pointAt(util.vector.topOf(1, 1, 3)) .placeNearTarget(); + scene.special.addKeyframe(); scene.idle(80); BlockPos lastShaft = util.grid.at(0, 1, 2); @@ -188,6 +195,7 @@ public class GantryScenes { .text("...as well as the rotation direction of the shaft") .pointAt(util.vector.blockSurface(lastShaft, Direction.WEST)) .placeNearTarget(); + scene.special.addKeyframe(); } scene.idle(30); @@ -216,6 +224,7 @@ public class GantryScenes { .text("Same rules apply for the propagated rotation") .pointAt(util.vector.topOf(0, 3, 3)) .placeNearTarget(); + scene.special.addKeyframe(); scene.idle(20); for (boolean flip2 : Iterate.trueAndFalse) { @@ -260,6 +269,7 @@ public class GantryScenes { scene.overlay.showText(60) .text("Gantry shafts attach to a carriage without the need of super glue") .independent(20); + scene.special.addKeyframe(); scene.idle(40); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); @@ -272,6 +282,7 @@ public class GantryScenes { scene.overlay.showText(60) .text("Same applies for carriages on moved Gantry Shafts") .independent(20); + scene.special.addKeyframe(); scene.idle(15); scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java new file mode 100644 index 000000000..1330c0fdb --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java @@ -0,0 +1,24 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.PonderInstruction; +import com.simibubi.create.foundation.ponder.PonderScene; + +public class KeyframeInstruction extends PonderInstruction { + + public static final KeyframeInstruction INSTANCE = new KeyframeInstruction(); + + private KeyframeInstruction() { } + + @Override + public boolean isComplete() { + return true; + } + + @Override + public void tick(PonderScene scene) { } + + @Override + public void onScheduled(PonderScene scene) { + scene.markKeyframe(); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index b2a50382f..9d718384e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -122,6 +122,8 @@ public class Backend { for (ProgramSpec shader : registry.values()) { loadProgram(manager, shader); } + + log.info("Loaded all shader programs."); } } } @@ -140,7 +142,7 @@ public class Backend { programs.put(programSpec, new ProgramGroup<>(programGroup)); - log.info("Loaded program {}", programSpec.name); + log.debug("Loaded program {}", programSpec.name); } catch (IOException ex) { log.error("Failed to load program {}", programSpec.name, ex); return; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java index 09fdde86d..0b550b448 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlProgram.java @@ -39,7 +39,7 @@ public abstract class GlProgram extends GlObject { int index = GL20.glGetUniformLocation(this.handle(), uniform); if (index < 0 && Backend.SHADER_DEBUG_OUTPUT) { - Backend.log.warn("No active uniform '{}' exists in program '{}'. Could be unused.", uniform, this.name); + Backend.log.debug("No active uniform '{}' exists in program '{}'. Could be unused.", uniform, this.name); } return index; @@ -106,8 +106,8 @@ public abstract class GlProgram extends GlObject { String log = GL20.glGetProgramInfoLog(this.program); - if (!log.isEmpty()) { - Backend.log.warn("Program link log for " + this.name + ": " + log); + if (!log.isEmpty() && Backend.SHADER_DEBUG_OUTPUT) { + Backend.log.debug("Program link log for " + this.name + ": " + log); } int result = GL20.glGetProgrami(this.program, GL20.GL_LINK_STATUS); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java index 6f7076a18..dae037bdb 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java @@ -21,7 +21,7 @@ public class GlShader extends GlObject { source = preProcessor.process(source); if (Backend.SHADER_DEBUG_OUTPUT) - Backend.log.info("Preprocessor run on " + name);// + ":\n" + source); + Backend.log.debug("Preprocessor run on " + name);// + ":\n" + source); } GL20.glShaderSource(handle, source); @@ -30,11 +30,11 @@ public class GlShader extends GlObject { String log = GL20.glGetShaderInfoLog(handle); if (!log.isEmpty()) { - Backend.log.warn("Shader compilation log for " + name + ": " + log); + Backend.log.error("Shader compilation log for " + name + ": " + log); } if (GL20.glGetShaderi(handle, GL20.GL_COMPILE_STATUS) != GL20.GL_TRUE) { - throw new RuntimeException("Could not compile shader"); + throw new RuntimeException("Could not compile shader. See log for details."); } setHandle(handle); From 51c919e4d8380ca3f9046c213a25867e919f7deb Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 12 Mar 2021 03:47:36 +0100 Subject: [PATCH 095/124] too much assist - add a configurable range to placement helpers i.e. the pole helper specifically --- .../structureMovement/bearing/SailBlock.java | 32 ++++------- .../piston/PistonExtensionPoleBlock.java | 15 +++--- .../relays/advanced/GantryShaftBlock.java | 21 ++++---- .../relays/advanced/SpeedControllerBlock.java | 18 ++----- .../relays/elementary/CogwheelBlockItem.java | 54 +++++-------------- .../relays/elementary/ShaftBlock.java | 7 ++- .../curiosities/tools/ExtendoGripItem.java | 16 +++--- .../foundation/config/CCuriosities.java | 2 + .../utility/placement/IPlacementHelper.java | 25 +++++---- .../utility/placement/PlacementHelpers.java | 14 +++-- .../utility/placement/util/PoleHelper.java | 32 ++++++----- 11 files changed, 90 insertions(+), 146 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java index 7acf1e590..3f7a4672e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/SailBlock.java @@ -1,13 +1,5 @@ package com.simibubi.create.content.contraptions.components.structureMovement.bearing; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.function.Predicate; - -import javax.annotation.Nullable; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.foundation.block.ProperDirectionalBlock; @@ -16,18 +8,13 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.LivingEntity; import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.item.BlockItem; -import net.minecraft.item.BlockItemUseContext; -import net.minecraft.item.DyeColor; -import net.minecraft.item.ItemStack; -import net.minecraft.item.ShearsItem; +import net.minecraft.item.*; import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Hand; @@ -40,6 +27,13 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + public class SailBlock extends ProperDirectionalBlock { public static SailBlock frame(Properties properties) { @@ -71,7 +65,7 @@ public class SailBlock extends ProperDirectionalBlock { IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); if (placementHelper.matchesItem(heldItem)) - return placementHelper.getOffset(world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); + return placementHelper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); if (heldItem.getItem() instanceof ShearsItem) { if (!world.isRemote) @@ -209,7 +203,7 @@ public class SailBlock extends ProperDirectionalBlock { } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { List directions = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(SailBlock.FACING).getAxis(), dir -> world.getBlockState(pos.offset(dir)).getMaterial().isReplaceable()); if (directions.isEmpty()) @@ -218,11 +212,5 @@ public class SailBlock extends ProperDirectionalBlock { return PlacementOffset.success(pos.offset(directions.get(0)), s -> s.with(FACING, state.get(FACING))); } } - - @Override - public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), state.get(FACING)); - displayGhost(offset); - } } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java index e8519c0e3..710a853d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/piston/PistonExtensionPoleBlock.java @@ -1,20 +1,13 @@ package com.simibubi.create.content.contraptions.components.structureMovement.piston; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isExtensionPole; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPiston; -import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.isPistonHead; - -import java.util.function.Predicate; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; -import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.PistonState; +import com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; import com.simibubi.create.content.contraptions.wrench.IWrenchable; import com.simibubi.create.foundation.block.ProperDirectionalBlock; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.util.PoleHelper; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -41,6 +34,10 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.IWorld; import net.minecraft.world.World; +import java.util.function.Predicate; + +import static com.simibubi.create.content.contraptions.components.structureMovement.piston.MechanicalPistonBlock.*; + public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IWrenchable, IWaterLoggable { private static final int placementHelperId = PlacementHelpers.register(PlacementHelper.get()); @@ -119,7 +116,7 @@ public class PistonExtensionPoleBlock extends ProperDirectionalBlock implements IPlacementHelper placementHelper = PlacementHelpers.get(placementHelperId); if (placementHelper.matchesItem(heldItem) && !player.isSneaking()) - return placementHelper.getOffset(world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); + return placementHelper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); return ActionResultType.PASS; } 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 645905b59..d169e4e2b 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 @@ -1,9 +1,5 @@ package com.simibubi.create.content.contraptions.relays.advanced; -import java.util.ArrayList; -import java.util.List; -import java.util.function.Predicate; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; @@ -15,7 +11,6 @@ import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; import com.simibubi.create.foundation.utility.placement.util.PoleHelper; - import net.minecraft.block.Block; import net.minecraft.block.BlockRenderType; import net.minecraft.block.BlockState; @@ -44,6 +39,10 @@ import net.minecraft.world.IWorld; import net.minecraft.world.IWorldReader; import net.minecraft.world.World; +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + public class GantryShaftBlock extends DirectionalKineticBlock { public static final IProperty PART = EnumProperty.create("part", Part.class); @@ -73,7 +72,7 @@ public class GantryShaftBlock extends DirectionalKineticBlock { if (!placementHelper.matchesItem(heldItem)) return ActionResultType.PASS; - return placementHelper.getOffset(world, state, pos, ray).placeInWorld(world, ((BlockItem) heldItem.getItem()), player, hand, ray); + return placementHelper.getOffset(player, world, state, pos, ray).placeInWorld(world, ((BlockItem) heldItem.getItem()), player, hand, ray); } @Override @@ -283,12 +282,10 @@ public class GantryShaftBlock extends DirectionalKineticBlock { } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { - PlacementOffset offset = super.getOffset(world, state, pos, ray); - if (!offset.isSuccessful()) - return offset; - return PlacementOffset.success(offset.getPos(), offset.getTransform() - .andThen(s -> s.with(POWERED, state.get(POWERED)))); + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + PlacementOffset offset = super.getOffset(player, world, state, pos, ray); + offset.withTransform(offset.getTransform().andThen(s -> s.with(POWERED, state.get(POWERED)))); + return offset; } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java index 1d39ccbd5..90d8667f6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerBlock.java @@ -1,7 +1,5 @@ package com.simibubi.create.content.contraptions.relays.advanced; -import java.util.function.Predicate; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; @@ -12,7 +10,6 @@ import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.Block; import net.minecraft.block.BlockState; @@ -31,6 +28,8 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import java.util.function.Predicate; + public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements ITE { private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); @@ -69,7 +68,7 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements ItemStack heldItem = player.getHeldItem(hand); IPlacementHelper helper = PlacementHelpers.get(placementHelperId); if (helper.matchesItem(heldItem)) - return helper.getOffset(world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); + return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); return ActionResultType.PASS; } @@ -92,7 +91,7 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { BlockPos newPos = pos.up(); if (!world.getBlockState(newPos) .getMaterial() @@ -107,15 +106,6 @@ public class SpeedControllerBlock extends HorizontalAxisKineticBlock implements return PlacementOffset.success(newPos, s -> s.with(CogWheelBlock.AXIS, newAxis)); } - - @Override - public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, - // state.get(HORIZONTAL_AXIS) == Axis.X ? Axis.Z : Axis.X)); - - displayGhost(offset); - } } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java index ba6b819b8..fef1d1459 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/elementary/CogwheelBlockItem.java @@ -1,10 +1,5 @@ package com.simibubi.create.content.contraptions.relays.elementary; -import static com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock.AXIS; - -import java.util.List; -import java.util.function.Predicate; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; @@ -15,7 +10,6 @@ import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.PlacementOffset; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -31,6 +25,11 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; +import java.util.List; +import java.util.function.Predicate; + +import static com.simibubi.create.content.contraptions.base.RotatedPillarKineticBlock.AXIS; + public class CogwheelBlockItem extends BlockItem { boolean large; @@ -56,14 +55,14 @@ public class CogwheelBlockItem extends BlockItem { PlayerEntity player = context.getPlayer(); BlockRayTraceResult ray = new BlockRayTraceResult(context.getHitVec(), context.getFace(), pos, true); if (helper.matchesState(state) && player != null && !player.isSneaking()) { - return helper.getOffset(world, state, pos, ray).placeInWorld(world, this, player, context.getHand(), ray); + return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, this, player, context.getHand(), ray); } if (integratedCogHelperId != -1) { helper = PlacementHelpers.get(integratedCogHelperId); if (helper.matchesState(state) && player != null && !player.isSneaking()) { - return helper.getOffset(world, state, pos, ray).placeInWorld(world, this, player, context.getHand(), ray); + return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, this, player, context.getHand(), ray); } } @@ -119,7 +118,7 @@ public class CogwheelBlockItem extends BlockItem { } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { if (hitOnShaft(state, ray)) return PlacementOffset.fail(); @@ -145,16 +144,7 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); } - return super.getOffset(world, state, pos, ray); - } - - @Override - public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), - // ((CogWheelBlock) state.getBlock()).isLarge ? 1.5D : 0.75D); - - displayGhost(offset); + return super.getOffset(player, world, state, pos, ray); } } @@ -167,7 +157,7 @@ public class CogwheelBlockItem extends BlockItem { } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { if (hitOnShaft(state, ray)) return PlacementOffset.fail(); @@ -190,7 +180,7 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); } - return super.getOffset(world, state, pos, ray); + return super.getOffset(player, world, state, pos, ray); } } @@ -203,7 +193,7 @@ public class CogwheelBlockItem extends BlockItem { } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { // diagonal gears of different size Direction closest = IPlacementHelper.orderedByDistanceExceptAxis(pos, ray.getHitVec(), state.get(AXIS)) .get(0); @@ -227,14 +217,6 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); } - @Override - public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, state.get(AXIS)), 1D); - - displayGhost(offset); - } - protected boolean hitOnShaft(BlockState state, BlockRayTraceResult ray) { return AllShapes.SIX_VOXEL_POLE.get(state.get(AXIS)) .getBoundingBox() @@ -284,7 +266,7 @@ public class CogwheelBlockItem extends BlockItem { } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { Direction face = ray.getFace(); Axis newAxis; @@ -321,15 +303,5 @@ public class CogwheelBlockItem extends BlockItem { return PlacementOffset.fail(); } - - @Override - public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), - // Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, offset.getTransform() - // .apply(AllBlocks.LARGE_COGWHEEL.getDefaultState()) - // .get(AXIS))); - - displayGhost(offset); - } } } 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 16dfa60c3..56cb322ad 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 @@ -1,7 +1,5 @@ package com.simibubi.create.content.contraptions.relays.elementary; -import java.util.function.Predicate; - import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.content.contraptions.base.KineticTileEntity; @@ -10,7 +8,6 @@ import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; import com.simibubi.create.foundation.utility.placement.util.PoleHelper; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; @@ -26,6 +23,8 @@ import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; +import java.util.function.Predicate; + public class ShaftBlock extends AbstractShaftBlock { private static final int placementHelperId = PlacementHelpers.register(new PlacementHelper()); @@ -78,7 +77,7 @@ public class ShaftBlock extends AbstractShaftBlock { IPlacementHelper helper = PlacementHelpers.get(placementHelperId); if (helper.matchesItem(heldItem)) - return helper.getOffset(world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); + return helper.getOffset(player, world, state, pos, ray).placeInWorld(world, (BlockItem) heldItem.getItem(), player, hand, ray); return ActionResultType.PASS; } diff --git a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java index 4d01867c5..811b6a28a 100644 --- a/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java +++ b/src/main/java/com/simibubi/create/content/curiosities/tools/ExtendoGripItem.java @@ -1,14 +1,11 @@ package com.simibubi.create.content.curiosities.tools; -import java.util.UUID; - import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.simibubi.create.AllItems; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; - import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.entity.Entity; @@ -36,24 +33,25 @@ import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; +import java.util.UUID; + @EventBusSubscriber public class ExtendoGripItem extends Item { + public static final AttributeModifier singleRangeAttributeModifier = new AttributeModifier(UUID.fromString("7f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 3, AttributeModifier.Operation.ADDITION); + public static final AttributeModifier doubleRangeAttributeModifier = new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5, AttributeModifier.Operation.ADDITION); + static Multimap rangeModifier; static Multimap doubleRangeModifier; static { // Holding an ExtendoGrip rangeModifier = HashMultimap.create(); - rangeModifier.put(PlayerEntity.REACH_DISTANCE.getName(), - new AttributeModifier(UUID.fromString("7f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 3, - AttributeModifier.Operation.ADDITION)); + rangeModifier.put(PlayerEntity.REACH_DISTANCE.getName(), singleRangeAttributeModifier); // Holding two ExtendoGrips o.O doubleRangeModifier = HashMultimap.create(); - doubleRangeModifier.put(PlayerEntity.REACH_DISTANCE.getName(), - new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5, - AttributeModifier.Operation.ADDITION)); + doubleRangeModifier.put(PlayerEntity.REACH_DISTANCE.getName(), doubleRangeAttributeModifier); } public ExtendoGripItem(Properties properties) { diff --git a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java index 21f79c1ee..6bc63467d 100644 --- a/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java +++ b/src/main/java/com/simibubi/create/foundation/config/CCuriosities.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.config; public class CCuriosities extends ConfigBase { public ConfigInt maxSymmetryWandRange = i(50, 10, "maxSymmetryWandRange", Comments.symmetryRange); + public ConfigInt placementAssistRange = i(12, 3, "placementAssistRange", Comments.placementRange); // public ConfigInt zapperUndoLogLength = i(10, 0, "zapperUndoLogLength", Comments.zapperUndoLogLength); NYI @Override @@ -12,6 +13,7 @@ public class CCuriosities extends ConfigBase { private static class Comments { static String symmetryRange = "The Maximum Distance to an active mirror for the symmetry wand to trigger."; + static String placementRange = "The Maximum Distance a Block placed by Create's placement assist will have to its interaction point."; // static String zapperUndoLogLength = "The maximum amount of operations, a blockzapper can remember for undoing. (0 to disable undo)"; } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java index 434d7a89f..c1ff65de4 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/IPlacementHelper.java @@ -1,19 +1,13 @@ package com.simibubi.create.foundation.utility.placement; -import java.util.Arrays; -import java.util.Comparator; -import java.util.List; -import java.util.function.Predicate; -import java.util.stream.Collectors; - import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.BlockItem; import net.minecraft.item.ItemStack; import net.minecraft.util.Direction; @@ -22,6 +16,12 @@ import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + @MethodsReturnNonnullByDefault public interface IPlacementHelper { @@ -46,11 +46,11 @@ public interface IPlacementHelper { * @return PlacementOffset.fail() if no valid offset could be found. * PlacementOffset.success(newPos) with newPos being the new position the block should be placed at */ - PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray); + PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray); - //overrides the default ghost state of the helper with the actual state of the held block item, this is used in PlacementHelpers and can be ignored in most cases - default PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray, ItemStack heldItem) { - PlacementOffset offset = getOffset(world, state, pos, ray); + //sets the offset's ghost state with the default state of the held block item, this is used in PlacementHelpers and can be ignored in most cases + default PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray, ItemStack heldItem) { + PlacementOffset offset = getOffset(player, world, state, pos, ray); if (heldItem.getItem() instanceof BlockItem) { BlockItem blockItem = (BlockItem) heldItem.getItem(); offset = offset.withGhostState(blockItem.getBlock().getDefaultState()); @@ -60,11 +60,10 @@ public interface IPlacementHelper { //only gets called when placementOffset is successful default void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos), VecHelper.getCenterOf(offset.getPos()), ray.getFace()); - displayGhost(offset); } + //RIP static void renderArrow(Vec3d center, Vec3d target, Direction arrowPlane) { renderArrow(center, target, arrowPlane, 1D); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java index 92ce7983d..48b2185d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/PlacementHelpers.java @@ -1,11 +1,5 @@ package com.simibubi.create.foundation.utility.placement; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -import org.lwjgl.opengl.GL11; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -13,7 +7,6 @@ import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingAngle; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; - import net.minecraft.block.BlockState; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; @@ -32,6 +25,11 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; +import org.lwjgl.opengl.GL11; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; @Mod.EventBusSubscriber public class PlacementHelpers { @@ -106,7 +104,7 @@ public class PlacementHelpers { boolean atLeastOneMatch = false; for (IPlacementHelper h : filteredForState) { - PlacementOffset offset = h.getOffset(world, state, pos, ray, heldItem); + PlacementOffset offset = h.getOffset(mc.player, world, state, pos, ray, heldItem); if (offset.isSuccessful()) { h.renderAt(pos, state, ray, offset); diff --git a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java index 4dceeaf48..5ac899530 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/placement/util/PoleHelper.java @@ -1,20 +1,23 @@ package com.simibubi.create.foundation.utility.placement.util; -import java.util.List; -import java.util.function.Function; -import java.util.function.Predicate; - +import com.simibubi.create.content.curiosities.tools.ExtendoGripItem; +import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.utility.placement.IPlacementHelper; import com.simibubi.create.foundation.utility.placement.PlacementOffset; - import mcp.MethodsReturnNonnullByDefault; import net.minecraft.block.BlockState; +import net.minecraft.entity.ai.attributes.IAttributeInstance; +import net.minecraft.entity.player.PlayerEntity; import net.minecraft.state.IProperty; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.world.World; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + @MethodsReturnNonnullByDefault public abstract class PoleHelper> implements IPlacementHelper { @@ -53,10 +56,19 @@ public abstract class PoleHelper> implements IPlacementH } @Override - public PlacementOffset getOffset(World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { + public PlacementOffset getOffset(PlayerEntity player, World world, BlockState state, BlockPos pos, BlockRayTraceResult ray) { List directions = IPlacementHelper.orderedByDistance(pos, ray.getHitVec(), dir -> dir.getAxis() == axisFunction.apply(state)); for (Direction dir : directions) { + int range = AllConfigs.SERVER.curiosities.placementAssistRange.get(); + if (player != null) { + IAttributeInstance reach = player.getAttribute(PlayerEntity.REACH_DISTANCE); + if (reach.hasModifier(ExtendoGripItem.singleRangeAttributeModifier)) + range += 4; + } int poles = attachedPoles(world, pos, dir); + if (poles >= range) + continue; + BlockPos newPos = pos.offset(dir, poles + 1); BlockState newState = world.getBlockState(newPos); @@ -67,12 +79,4 @@ public abstract class PoleHelper> implements IPlacementH return PlacementOffset.fail(); } - - @Override - public void renderAt(BlockPos pos, BlockState state, BlockRayTraceResult ray, PlacementOffset offset) { - //Vec3d centerOffset = new Vec3d(ray.getFace().getDirectionVec()).scale(.3); - //IPlacementHelper.renderArrow(VecHelper.getCenterOf(pos).add(centerOffset), VecHelper.getCenterOf(offset.getPos()).add(centerOffset), ray.getFace(), 0.75D); - - displayGhost(offset); - } } From 438ac99b2d8bd2f583c59a7c4cfbd3522f67766b Mon Sep 17 00:00:00 2001 From: zelophed Date: Fri, 12 Mar 2021 15:51:25 +0100 Subject: [PATCH 096/124] fix dist issues for dedicated server --- .../com/simibubi/create/AllTileEntities.java | 52 ++++--------------- .../command/ConfigureConfigPacket.java | 22 ++++++-- .../foundation/command/PonderCommand.java | 40 +++++++------- .../foundation/networking/AllPackets.java | 28 ++++------ .../foundation/networking/PonderPacket.java | 45 ---------------- .../create/foundation/ponder/PonderUI.java | 42 ++++++--------- 6 files changed, 74 insertions(+), 155 deletions(-) delete mode 100644 src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index e480efc82..2951cb835 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -1,19 +1,7 @@ package com.simibubi.create; -import com.simibubi.create.content.contraptions.base.BackHalfShaftInstance; -import com.simibubi.create.content.contraptions.base.HalfShaftInstance; -import com.simibubi.create.content.contraptions.base.HorizontalHalfShaftInstance; -import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; -import com.simibubi.create.content.contraptions.base.ShaftlessCogInstance; -import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; -import com.simibubi.create.content.contraptions.components.actors.DrillInstance; -import com.simibubi.create.content.contraptions.components.actors.DrillRenderer; -import com.simibubi.create.content.contraptions.components.actors.DrillTileEntity; -import com.simibubi.create.content.contraptions.components.actors.HarvesterRenderer; -import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; -import com.simibubi.create.content.contraptions.components.actors.PortableFluidInterfaceTileEntity; -import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; -import com.simibubi.create.content.contraptions.components.actors.PortableStorageInterfaceRenderer; +import com.simibubi.create.content.contraptions.base.*; +import com.simibubi.create.content.contraptions.components.actors.*; import com.simibubi.create.content.contraptions.components.clock.CuckooClockRenderer; import com.simibubi.create.content.contraptions.components.clock.CuckooClockTileEntity; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterInstance; @@ -57,9 +45,9 @@ import com.simibubi.create.content.contraptions.components.structureMovement.cha import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerInstance; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryCarriageInstance; 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.gantry.GantryCarriageInstance; 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; @@ -70,18 +58,8 @@ import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheel import com.simibubi.create.content.contraptions.fluids.PumpCogInstance; import com.simibubi.create.content.contraptions.fluids.PumpRenderer; import com.simibubi.create.content.contraptions.fluids.PumpTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyRenderer; -import com.simibubi.create.content.contraptions.fluids.actors.HosePulleyTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainRenderer; -import com.simibubi.create.content.contraptions.fluids.actors.ItemDrainTileEntity; -import com.simibubi.create.content.contraptions.fluids.actors.SpoutRenderer; -import com.simibubi.create.content.contraptions.fluids.actors.SpoutTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidPipeTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveRenderer; -import com.simibubi.create.content.contraptions.fluids.pipes.FluidValveTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.SmartFluidPipeTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity; -import com.simibubi.create.content.contraptions.fluids.pipes.TransparentStraightPipeRenderer; +import com.simibubi.create.content.contraptions.fluids.actors.*; +import com.simibubi.create.content.contraptions.fluids.pipes.*; import com.simibubi.create.content.contraptions.fluids.tank.CreativeFluidTankTileEntity; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankRenderer; import com.simibubi.create.content.contraptions.fluids.tank.FluidTankTileEntity; @@ -97,13 +75,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltInstance; import com.simibubi.create.content.contraptions.relays.belt.BeltRenderer; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.SimpleKineticTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.AdjustablePulleyTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.ClutchTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftRenderer; -import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftTileEntity; -import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; -import com.simibubi.create.content.contraptions.relays.encased.SplitShaftInstance; -import com.simibubi.create.content.contraptions.relays.encased.SplitShaftRenderer; +import com.simibubi.create.content.contraptions.relays.encased.*; import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEntity; @@ -132,19 +104,15 @@ import com.simibubi.create.content.logistics.block.inventories.CreativeCrateTile import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInstance; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmRenderer; import com.simibubi.create.content.logistics.block.mechanicalArm.ArmTileEntity; -import com.simibubi.create.content.logistics.block.redstone.AnalogLeverRenderer; -import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; -import com.simibubi.create.content.logistics.block.redstone.ContentObserverTileEntity; -import com.simibubi.create.content.logistics.block.redstone.NixieTubeRenderer; -import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; -import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; -import com.simibubi.create.content.logistics.block.redstone.StockpileSwitchTileEntity; +import com.simibubi.create.content.logistics.block.redstone.*; import com.simibubi.create.content.schematics.block.SchematicTableTileEntity; import com.simibubi.create.content.schematics.block.SchematicannonInstance; import com.simibubi.create.content.schematics.block.SchematicannonRenderer; import com.simibubi.create.content.schematics.block.SchematicannonTileEntity; import com.simibubi.create.foundation.tileEntity.renderer.SmartTileEntityRenderer; import com.tterrag.registrate.util.entry.TileEntityEntry; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; public class AllTileEntities { @@ -364,7 +332,7 @@ public class AllTileEntities { .tileEntity("mechanical_arm", ArmTileEntity::new) .validBlocks(AllBlocks.MECHANICAL_ARM) .renderer(() -> ArmRenderer::new) - .onRegister(ArmInstance::register) + .onRegister((type) -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ArmInstance.register(type)))//ArmInstance line 142 -> Minecraft.getInstance().world causes ClientWorld to get loaded on the server .register(); public static final TileEntityEntry MECHANICAL_PISTON = Create.registrate() 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 bb54b2db4..8856abb0b 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -1,14 +1,18 @@ package com.simibubi.create.foundation.command; +import com.simibubi.create.Create; 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.PonderRegistry; +import com.simibubi.create.foundation.ponder.PonderUI; 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; import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.TextFormatting; @@ -66,7 +70,7 @@ public class ConfigureConfigPacket extends SimplePacketBase { fixLighting(() -> Actions::experimentalLighting), overlayReset(() -> Actions::overlayReset), experimentalRendering(() -> Actions::experimentalRendering), - ponderIndex(() -> Actions::ponderIndex), + openPonder(() -> Actions::openPonder), ; @@ -133,8 +137,20 @@ public class ConfigureConfigPacket extends SimplePacketBase { } @OnlyIn(Dist.CLIENT) - private static void ponderIndex(String value) { - ScreenOpener.transitionTo(new PonderIndexScreen()); + private static void openPonder(String value) { + if (value.equals("index")) { + ScreenOpener.transitionTo(new PonderIndexScreen()); + return; + } + + ResourceLocation id = new ResourceLocation(value); + if (!PonderRegistry.all.containsKey(id)) { + Create.logger.error("Could not find ponder scenes for item: " + id); + return; + } + + ScreenOpener.transitionTo(PonderUI.of(id)); + } private static ITextComponent boolToText(boolean b) { diff --git a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java index ddc439925..f4e2cfb90 100644 --- a/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java +++ b/src/main/java/com/simibubi/create/foundation/command/PonderCommand.java @@ -1,10 +1,10 @@ package com.simibubi.create.foundation.command; import com.google.common.collect.ImmutableList; +import com.mojang.brigadier.Command; import com.mojang.brigadier.builder.ArgumentBuilder; import com.mojang.brigadier.suggestion.SuggestionProvider; import com.simibubi.create.foundation.networking.AllPackets; -import com.simibubi.create.foundation.networking.PonderPacket; import com.simibubi.create.foundation.ponder.PonderRegistry; import net.minecraft.command.CommandSource; import net.minecraft.command.Commands; @@ -20,34 +20,36 @@ import net.minecraftforge.fml.network.PacketDistributor; import java.util.Collection; public class PonderCommand { - public static final SuggestionProvider ALL_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.func_212476_a(PonderRegistry.all.keySet().stream(), builder)); + public static final SuggestionProvider ITEM_PONDERS = SuggestionProviders.register(new ResourceLocation("all_ponders"), (iSuggestionProviderCommandContext, builder) -> ISuggestionProvider.func_212476_a(PonderRegistry.all.keySet().stream(), builder)); 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; - }) - .then(Commands.argument("scene", ResourceLocationArgument.resourceLocation()).suggests(ALL_PONDERS) - .executes(context -> openScene(ResourceLocationArgument.getResourceLocation(context, "scene"), ImmutableList.of(context.getSource().asPlayer()))) - .then(Commands.argument("targets", EntityArgument.players()) - .requires(cs -> cs.hasPermissionLevel(2)) - .executes(context -> openScene(ResourceLocationArgument.getResourceLocation(context, "scene"), EntityArgument.getPlayers(context, "targets"))))); + .executes(ctx -> openScene("index", ctx.getSource().asPlayer())) + .then(Commands.argument("scene", ResourceLocationArgument.resourceLocation()) + .suggests(ITEM_PONDERS) + .executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene").toString(), ctx.getSource().asPlayer())) + .then(Commands.argument("targets", EntityArgument.players()) + .requires(cs -> cs.hasPermissionLevel(2)) + .executes(ctx -> openScene(ResourceLocationArgument.getResourceLocation(ctx, "scene").toString(), EntityArgument.getPlayers(ctx, "targets"))) + ) + ); } - private static int openScene(ResourceLocation scene, Collection players) { + private static int openScene(String sceneId, ServerPlayerEntity player) { + return openScene(sceneId, ImmutableList.of(player)); + } + + private static int openScene(String sceneId, Collection players) { for (ServerPlayerEntity player : players) { if (player instanceof FakePlayer) continue; - AllPackets.channel.send(PacketDistributor.PLAYER.with(() -> player), new PonderPacket(scene)); + + AllPackets.channel.send( + PacketDistributor.PLAYER.with(() -> player), + new ConfigureConfigPacket(ConfigureConfigPacket.Actions.openPonder.name(), sceneId)); } - return 1; + return Command.SINGLE_SUCCESS; } } diff --git a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java index 4ead9e86e..2d8d65d10 100644 --- a/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java +++ b/src/main/java/com/simibubi/create/foundation/networking/AllPackets.java @@ -1,22 +1,11 @@ package com.simibubi.create.foundation.networking; -import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT; -import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER; - -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.Supplier; - import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionDisassemblyPacket; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionStallPacket; import com.simibubi.create.content.contraptions.components.structureMovement.gantry.GantryContraptionUpdatePacket; import com.simibubi.create.content.contraptions.components.structureMovement.glue.GlueEffectPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.sync.ClientMotionPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionFluidPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionInteractionPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.sync.ContraptionSeatMappingPacket; -import com.simibubi.create.content.contraptions.components.structureMovement.sync.LimbSwingUpdatePacket; +import com.simibubi.create.content.contraptions.components.structureMovement.sync.*; import com.simibubi.create.content.contraptions.components.structureMovement.train.CouplingCreationPacket; import com.simibubi.create.content.contraptions.components.structureMovement.train.capability.MinecartControllerUpdatePacket; import com.simibubi.create.content.contraptions.fluids.actors.FluidSplashPacket; @@ -30,17 +19,12 @@ import com.simibubi.create.content.logistics.packet.ConfigureFlexcratePacket; import com.simibubi.create.content.logistics.packet.ConfigureStockswitchPacket; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; -import com.simibubi.create.content.schematics.packet.ConfigureSchematicannonPacket; -import com.simibubi.create.content.schematics.packet.InstantSchematicPacket; -import com.simibubi.create.content.schematics.packet.SchematicPlacePacket; -import com.simibubi.create.content.schematics.packet.SchematicSyncPacket; -import com.simibubi.create.content.schematics.packet.SchematicUploadPacket; +import com.simibubi.create.content.schematics.packet.*; import com.simibubi.create.foundation.command.ConfigureConfigPacket; import com.simibubi.create.foundation.command.HighlightPacket; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringCountUpdatePacket; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueUpdatePacket; import com.simibubi.create.foundation.utility.ServerSpeedProvider; - import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -52,6 +36,13 @@ import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.fml.network.PacketDistributor.TargetPoint; import net.minecraftforge.fml.network.simple.SimpleChannel; +import java.util.function.BiConsumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_CLIENT; +import static net.minecraftforge.fml.network.NetworkDirection.PLAY_TO_SERVER; + public enum AllPackets { // Client to Server @@ -91,7 +82,6 @@ public enum AllPackets { BLOCK_HIGHLIGHT(HighlightPacket.class, HighlightPacket::new, PLAY_TO_CLIENT), TUNNEL_FLAP(TunnelFlapPacket.class, TunnelFlapPacket::new, PLAY_TO_CLIENT), FUNNEL_FLAP(FunnelFlapPacket.class, FunnelFlapPacket::new, PLAY_TO_CLIENT), - OPEN_PONDER(PonderPacket.class, PonderPacket::new, PLAY_TO_CLIENT) ; diff --git a/src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java b/src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java deleted file mode 100644 index c9de06967..000000000 --- a/src/main/java/com/simibubi/create/foundation/networking/PonderPacket.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.simibubi.create.foundation.networking; - -import com.simibubi.create.Create; -import com.simibubi.create.foundation.gui.ScreenOpener; -import com.simibubi.create.foundation.ponder.PonderRegistry; -import com.simibubi.create.foundation.ponder.PonderUI; -import mcp.MethodsReturnNonnullByDefault; -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.network.NetworkDirection; -import net.minecraftforge.fml.network.NetworkEvent; - -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.function.Supplier; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class PonderPacket extends SimplePacketBase { - private final ResourceLocation scene; - - public PonderPacket(ResourceLocation scene) { - this.scene = scene; - } - - public PonderPacket(PacketBuffer buffer) { - this.scene = buffer.readResourceLocation(); - } - - @Override - public void write(PacketBuffer buffer) { - buffer.writeResourceLocation(scene); - } - - @Override - public void handle(Supplier context) { - NetworkEvent.Context ctx = context.get(); - if (ctx.getDirection() != NetworkDirection.PLAY_TO_CLIENT) - return; - if (PonderRegistry.all.containsKey(scene)) - ScreenOpener.transitionTo(new PonderUI(PonderRegistry.compile(PonderRegistry.all.get(scene)))); - else - Create.logger.error("Could not find ponder scene: " + scene); - ctx.setPacketHandled(true); - } -} 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 6ee2a01bb..e5670d0f4 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -1,37 +1,14 @@ 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.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.gui.*; import com.simibubi.create.foundation.ponder.PonderScene.SceneTransform; -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.content.*; 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.*; 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; @@ -52,6 +29,13 @@ 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 { @@ -85,6 +69,10 @@ public class PonderUI extends AbstractSimiScreen { private PonderButton left, right, scan, chap, userMode; private PonderProgressBar progressBar; + public static PonderUI of(ResourceLocation id) { + return new PonderUI(PonderRegistry.compile(id)); + } + public static PonderUI of(ItemStack item) { return new PonderUI(PonderRegistry.compile(item.getItem() .getRegistryName())); @@ -103,7 +91,7 @@ public class PonderUI extends AbstractSimiScreen { return ui; } - public PonderUI(List scenes) { + PonderUI(List scenes) { ResourceLocation component = scenes.get(0).component; if (ForgeRegistries.ITEMS.containsKey(component)) stack = new ItemStack(ForgeRegistries.ITEMS.getValue(component)); From 6baa51997343dfe3d7c0b4c33ca92adc4868609c Mon Sep 17 00:00:00 2001 From: Snownee Date: Fri, 12 Mar 2021 23:46:26 +0800 Subject: [PATCH 097/124] Fix cart assembler duplication (closes #1058, #1150) --- .../structureMovement/mounted/CartAssemblerBlock.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java index 786c994a4..bc4e96b43 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/mounted/CartAssemblerBlock.java @@ -366,8 +366,6 @@ public class CartAssemblerBlock extends AbstractRailBlock @Override public void neighborChanged(@Nonnull BlockState state, @Nonnull World worldIn, @Nonnull BlockPos pos, @Nonnull Block blockIn, @Nonnull BlockPos fromPos, boolean isMoving) { - super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); - if (worldIn.isRemote) return; @@ -375,6 +373,8 @@ public class CartAssemblerBlock extends AbstractRailBlock if (previouslyPowered != worldIn.isBlockPowered(pos)) { worldIn.setBlockState(pos, state.cycle(POWERED), 2); } + + super.neighborChanged(state, worldIn, pos, blockIn, fromPos, isMoving); } @Override @@ -439,7 +439,7 @@ public class CartAssemblerBlock extends AbstractRailBlock @Override public ItemRequirement getRequiredItems(BlockState state) { - ArrayList reuiredItems = new ArrayList(); + ArrayList reuiredItems = new ArrayList<>(); reuiredItems.add(new ItemStack(getRailItem(state))); reuiredItems.add(new ItemStack(asItem())); return new ItemRequirement(ItemUseType.CONSUME, reuiredItems); From 678ddfa7642c1e819b76ff9633a88f408395fb4e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 12 Mar 2021 18:44:05 +0100 Subject: [PATCH 098/124] Spoutput blockage - Fixed basin auto-output not working on stopped belts - Basin auto-output can now share a space with funnels - Linear chassis no longer allow sticky sides facing a directly attached linear chassis of the same type --- .../chassis/AbstractChassisBlock.java | 9 ++++- .../chassis/LinearChassisBlock.java | 17 ++++++++++ .../glue/SuperGlueEntity.java | 9 +++++ .../contraptions/processing/BasinBlock.java | 34 ++++++++++++------- 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java index 68b053ab6..21a847143 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/AbstractChassisBlock.java @@ -59,7 +59,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements if (isSlimeBall && state.get(affectedSide)) { for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(state, face); - if (glueableSide != null && !state.get(glueableSide)) { + if (glueableSide != null && !state.get(glueableSide) && glueAllowedOnSide(worldIn, pos, state, face)) { if (worldIn.isRemote) { Vec3d vec = hit.getHitVec(); worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); @@ -78,6 +78,8 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements return ActionResultType.PASS; if (state.get(affectedSide) == isSlimeBall) return ActionResultType.PASS; + if (!glueAllowedOnSide(worldIn, pos, state, hit.getFace())) + return ActionResultType.PASS; if (worldIn.isRemote) { Vec3d vec = hit.getHitVec(); worldIn.addParticle(ParticleTypes.ITEM_SLIME, vec.x, vec.y, vec.z, 0, 0, 0); @@ -94,6 +96,7 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements if (rotation == Rotation.NONE) return state; + @SuppressWarnings("deprecation") BlockState rotated = super.rotate(state, rotation); for (Direction face : Iterate.directions) { BooleanProperty glueableSide = getGlueableSide(rotated, face); @@ -141,4 +144,8 @@ public abstract class AbstractChassisBlock extends RotatedPillarBlock implements public abstract BooleanProperty getGlueableSide(BlockState state, Direction face); + protected boolean glueAllowedOnSide(IBlockReader world, BlockPos pos, BlockState state, Direction side) { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java index 7450247d2..fe1073432 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/LinearChassisBlock.java @@ -14,7 +14,9 @@ import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.Direction.AxisDirection; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IBlockReader; import net.minecraft.world.ILightReader; +import net.minecraft.world.IWorld; public class LinearChassisBlock extends AbstractChassisBlock { @@ -50,6 +52,15 @@ public class LinearChassisBlock extends AbstractChassisBlock { } return super.getStateForPlacement(context); } + + @Override + public BlockState updatePostPlacement(BlockState state, Direction side, BlockState other, IWorld p_196271_4_, + BlockPos p_196271_5_, BlockPos p_196271_6_) { + BooleanProperty property = getGlueableSide(state, side); + if (property == null || !sameKind(state, other) || state.get(AXIS) != other.get(AXIS)) + return state; + return state.with(property, false); + } @Override public BooleanProperty getGlueableSide(BlockState state, Direction face) { @@ -58,6 +69,12 @@ public class LinearChassisBlock extends AbstractChassisBlock { return face.getAxisDirection() == AxisDirection.POSITIVE ? STICKY_TOP : STICKY_BOTTOM; } + @Override + protected boolean glueAllowedOnSide(IBlockReader world, BlockPos pos, BlockState state, Direction side) { + BlockState other = world.getBlockState(pos.offset(side)); + return !sameKind(other, state) || state.get(AXIS) != other.get(AXIS); + } + public static boolean isChassis(BlockState state) { return AllBlocks.LINEAR_CHASSIS.has(state) || AllBlocks.SECONDARY_LINEAR_CHASSIS.has(state); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index c5a019872..21af0fd87 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.BlockFace; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.DirectionalBlock; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; @@ -186,6 +187,14 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat if (AllBlocks.STICKER.has(state)) return state.get(DirectionalBlock.FACING) == direction; + + if (state.getBlock() == Blocks.SLIME_BLOCK) + return true; + if (state.getBlock() == Blocks.field_226907_mc_) // honey block + return true; + + if (AllBlocks.CART_ASSEMBLER.has(state)) + return Direction.UP == direction; if (AllBlocks.GANTRY_CARRIAGE.has(state)) return state.get(DirectionalKineticBlock.FACING) == direction; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java index 2b2e32757..d11a5a6fc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinBlock.java @@ -4,7 +4,9 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllShapes; import com.simibubi.create.AllTileEntities; import com.simibubi.create.content.contraptions.fluids.actors.GenericItemFilling; +import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.wrench.IWrenchable; +import com.simibubi.create.content.logistics.block.funnel.FunnelBlock; import com.simibubi.create.foundation.advancement.AllTriggers; import com.simibubi.create.foundation.block.ITE; import com.simibubi.create.foundation.fluid.FluidHelper; @@ -170,11 +172,9 @@ public class BasinBlock extends Block implements ITE, IWrenchab @Override public int getComparatorInputOverride(BlockState blockState, World worldIn, BlockPos pos) { - try { - return ItemHelper.calcRedstoneFromInventory(getTileEntity(worldIn, pos).inputInventory); - } catch (TileEntityException e) { - } - return 0; + return getTileEntityOptional(worldIn, pos).map(BasinTileEntity::getInputInventory) + .map(ItemHelper::calcRedstoneFromInventory) + .orElse(0); } @Override @@ -184,15 +184,25 @@ public class BasinBlock extends Block implements ITE, IWrenchab public static boolean canOutputTo(IBlockReader world, BlockPos basinPos, Direction direction) { BlockPos neighbour = basinPos.offset(direction); - if (!world.getBlockState(neighbour) - .getCollisionShape(world, neighbour) - .isEmpty()) - return false; + BlockPos output = neighbour.down(); + BlockState blockState = world.getBlockState(neighbour); + + if (FunnelBlock.isFunnel(blockState)) { + if (FunnelBlock.getFunnelFacing(blockState) == direction) + return false; + } else if (!blockState.getCollisionShape(world, neighbour) + .isEmpty()) { + return false; + } else { + TileEntity tileEntity = world.getTileEntity(output); + if (tileEntity instanceof BeltTileEntity) { + BeltTileEntity belt = (BeltTileEntity) tileEntity; + return belt.getSpeed() == 0 || belt.getMovementFacing() != direction.getOpposite(); + } + } - BlockPos offset = basinPos.down() - .offset(direction); DirectBeltInputBehaviour directBeltInputBehaviour = - TileEntityBehaviour.get(world, offset, DirectBeltInputBehaviour.TYPE); + TileEntityBehaviour.get(world, output, DirectBeltInputBehaviour.TYPE); if (directBeltInputBehaviour != null) return directBeltInputBehaviour.canInsertFromSide(direction); return false; From 841bba04bd05fa09950d133085ae762c98147f5e Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Fri, 12 Mar 2021 20:42:37 +0100 Subject: [PATCH 099/124] Pondering too quickly - Fixed idle instruction only idling for t-1 - Made keyframe skipping a little easier - Added option to register keyframes as part of a text window builder - PonderUI now stalls the scene briefly after skips --- .../foundation/ponder/PonderProgressBar.java | 230 ++++++++++-------- .../create/foundation/ponder/PonderScene.java | 10 +- .../create/foundation/ponder/PonderUI.java | 25 +- .../foundation/ponder/SceneBuilder.java | 20 +- .../ponder/content/GantryScenes.java | 22 +- .../ponder/elements/TextWindowElement.java | 5 + .../instructions/KeyframeInstruction.java | 11 +- 7 files changed, 188 insertions(+), 135 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java index 93816d125..63f813347 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -5,150 +5,170 @@ import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; 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.audio.SoundHandler; +import net.minecraft.client.gui.FontRenderer; import net.minecraftforge.fml.client.gui.GuiUtils; import org.antlr.v4.runtime.misc.IntegerList; public class PonderProgressBar extends AbstractSimiWidget { - LerpedFloat progress; - LerpedFloat flash; + LerpedFloat progress; + LerpedFloat flash; - PonderUI ponder; + PonderUI ponder; - public PonderProgressBar(PonderUI ponder, int xIn, int yIn, int widthIn, int heightIn) { - super(xIn, yIn, widthIn, heightIn); + public PonderProgressBar(PonderUI ponder, int xIn, int yIn, int widthIn, int heightIn) { + super(xIn, yIn, widthIn, heightIn); - this.ponder = ponder; - progress = LerpedFloat.linear() - .startWithValue(0); - flash = LerpedFloat.linear() - .startWithValue(0); - } + this.ponder = ponder; + progress = LerpedFloat.linear() + .startWithValue(0); + flash = LerpedFloat.linear() + .startWithValue(0); + } - public void tick() { - progress.chase(ponder.getActiveScene().getSceneProgress(), .5f, LerpedFloat.Chaser.EXP); - progress.tickChaser(); + public void tick() { + progress.chase(ponder.getActiveScene() + .getSceneProgress(), .5f, LerpedFloat.Chaser.EXP); + progress.tickChaser(); - if (isHovered) - flash(); - } + if (isHovered) + flash(); + } - public void flash() { - float value = flash.getValue(); - flash.setValue(value + (1 - value) * .2f); - } + public void flash() { + float value = flash.getValue(); + flash.setValue(value + (1 - value) * .2f); + } - public void dim() { - float value = flash.getValue(); - flash.setValue(value * .5f); - } + public void dim() { + float value = flash.getValue(); + flash.setValue(value * .5f); + } - @Override - protected boolean clicked(double mouseX, double mouseY) { - return this.active && this.visible && - !ponder.getActiveScene().keyframeTimes.isEmpty() && - mouseX >= (double)this.x && - mouseX < (double)(this.x + this.width) && - mouseY >= (double)this.y - 3 && - mouseY < (double)(this.y + this.height + 3); - } + @Override + protected boolean clicked(double mouseX, double mouseY) { + return this.active && this.visible && !ponder.getActiveScene().keyframeTimes.isEmpty() + && mouseX >= (double) this.x && mouseX < (double) (this.x + this.width) && mouseY >= (double) this.y - 3 + && mouseY < (double) (this.y + this.height + 20); + } - @Override - public void onClick(double mouseX, double mouseY) { - PonderScene activeScene = ponder.getActiveScene(); - int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); + @Override + public void onClick(double mouseX, double mouseY) { + PonderScene activeScene = ponder.getActiveScene(); + int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); - int seekTime = 0; + int seekTime = 0; - IntegerList keyframeTimes = activeScene.keyframeTimes; - for (int i = 0; i < keyframeTimes.size(); i++) { - int keyframeTime = keyframeTimes.get(i); + IntegerList keyframeTimes = activeScene.keyframeTimes; + for (int i = 0; i < keyframeTimes.size(); i++) { + int keyframeTime = keyframeTimes.get(i); - if (keyframeTime > clickedAtTime) - break; + if (keyframeTime > clickedAtTime) + break; - seekTime = keyframeTime; - } - ponder.seekToTime(seekTime); - } + seekTime = keyframeTime; + } + ponder.seekToTime(seekTime); + } - public int getHoveredKeyframeIndex(double mouseX) { - PonderScene activeScene = ponder.getActiveScene(); - int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); + public int getHoveredKeyframeIndex(double mouseX) { + PonderScene activeScene = ponder.getActiveScene(); + int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); - int index = -1; + int index = -1; - IntegerList keyframeTimes = activeScene.keyframeTimes; - for (int i = 0; i < keyframeTimes.size(); i++) { - int keyframeTime = keyframeTimes.get(i); + IntegerList keyframeTimes = activeScene.keyframeTimes; + for (int i = 0; i < keyframeTimes.size(); i++) { + int keyframeTime = keyframeTimes.get(i); - if (keyframeTime > clickedAtTime) - break; + if (keyframeTime > clickedAtTime) + break; - index = i; - } + index = i; + } - return index; - } + return index; + } - @Override - public void renderButton(int mouseX, int mouseY, float partialTicks) { + @Override + public void renderButton(int mouseX, int mouseY, float partialTicks) { - isHovered = clicked(mouseX, mouseY); + isHovered = clicked(mouseX, mouseY); - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 400); - PonderUI.renderBox(x, y, width, height, false); - RenderSystem.popMatrix(); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 400); + PonderUI.renderBox(x, y, width, height, false); + RenderSystem.popMatrix(); - RenderSystem.pushMatrix(); - RenderSystem.translated(x - 2, y - 2, 0); + RenderSystem.pushMatrix(); + RenderSystem.translated(x - 2, y - 2, 0); - RenderSystem.pushMatrix(); - RenderSystem.scaled((width + 4) * progress.getValue(partialTicks), 1, 1); - GuiUtils.drawGradientRect(500, 0, 3, 1, 4, 0x60ffeedd, 0x60ffeedd); - RenderSystem.popMatrix(); + RenderSystem.pushMatrix(); + RenderSystem.scaled((width + 4) * progress.getValue(partialTicks), 1, 1); + GuiUtils.drawGradientRect(500, 0, 3, 1, 4, 0x80ffeedd, 0x80ffeedd); + GuiUtils.drawGradientRect(500, 0, 4, 1, 5, 0x50ffeedd, 0x50ffeedd); + RenderSystem.popMatrix(); - renderKeyframes(mouseX, partialTicks); + renderKeyframes(mouseX, partialTicks); - RenderSystem.popMatrix(); - } + RenderSystem.popMatrix(); + } - private void renderKeyframes(int mouseX, float partialTicks) { - PonderScene activeScene = ponder.getActiveScene(); + private void renderKeyframes(int mouseX, float partialTicks) { + PonderScene activeScene = ponder.getActiveScene(); - int hoverStartColor; - int hoverEndColor; - int hoverIndex; - if (isHovered) { - hoverIndex = getHoveredKeyframeIndex(mouseX); + int hoverStartColor; + int hoverEndColor; + int hoverIndex; - float flashValue = flash.getValue(partialTicks) * 3 + (float) Math.sin((AnimationTickHolder.getTicks() + partialTicks) / 6); + if (isHovered) { + hoverIndex = getHoveredKeyframeIndex(mouseX); + float flashValue = flash.getValue(partialTicks) * 3 + + (float) Math.sin((AnimationTickHolder.getTicks() + partialTicks) / 6); - hoverEndColor = ColorHelper.applyAlpha(0x70ffffff, flashValue); - hoverStartColor = ColorHelper.applyAlpha(0x30ffffff, flashValue); - } - else { - hoverIndex = -1; - hoverEndColor = 0; - hoverStartColor = 0; - } + hoverEndColor = ColorHelper.applyAlpha(0x70ffffff, flashValue); + hoverStartColor = ColorHelper.applyAlpha(0x30ffffff, flashValue); + } else { + hoverIndex = -1; + hoverEndColor = 0; + hoverStartColor = 0; + } - IntegerList keyframeTimes = activeScene.keyframeTimes; - for (int i = 0; i < keyframeTimes.size(); i++) { - int keyframeTime = keyframeTimes.get(i); + IntegerList keyframeTimes = activeScene.keyframeTimes; + for (int i = 0; i < keyframeTimes.size(); i++) { + int keyframeTime = keyframeTimes.get(i); + int keyframePos = (int) (((float) keyframeTime) / ((float) activeScene.totalTime) * (width + 4)); - int startColor = i == hoverIndex ? hoverStartColor : 0x60ffeedd; - int endColor = i == hoverIndex ? hoverEndColor : 0x60ffeedd; + int startColor = i == hoverIndex ? hoverStartColor : 0x30ffeedd; + int endColor = i == hoverIndex ? hoverEndColor : 0x60ffeedd; + int height = i == hoverIndex ? 8 : 4; - int keyframePos = (int) (((float) keyframeTime) / ((float) activeScene.totalTime) * (width + 4)); - GuiUtils.drawGradientRect(500, keyframePos, 1, keyframePos + 1, 4, startColor, endColor); - } - } + if (i == hoverIndex) { + FontRenderer font = Minecraft.getInstance().fontRenderer; + GuiUtils.drawGradientRect(500, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 400); + String text; + int offset; + if (activeScene.currentTime < keyframeTime) { + text = ">"; + offset = -1 - font.getStringWidth(text); + } else { + text = "<"; + offset = 3; + } + font.drawString(text, keyframePos + offset, 10, endColor); + RenderSystem.popMatrix(); + } + GuiUtils.drawGradientRect(500, keyframePos, -1, keyframePos + 1, 2 + height, startColor, endColor); + } + } - @Override - public void playDownSound(SoundHandler handler) { + @Override + public void playDownSound(SoundHandler handler) { - } + } } 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 155f88c22..f341d127f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -13,7 +13,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import com.simibubi.create.foundation.ponder.instructions.KeyframeInstruction; import org.antlr.v4.runtime.misc.IntegerList; import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableObject; @@ -271,6 +270,8 @@ public class PonderScene { instruction.tick(this); if (instruction.isComplete()) { iterator.remove(); + if (instruction.isBlocking()) + break; continue; } if (instruction.isBlocking()) @@ -299,10 +300,9 @@ public class PonderScene { stoppedCounting = true; } - public void markKeyframe() { - if (!stoppedCounting) { - keyframeTimes.add(totalTime); - } + public void markKeyframe(int offset) { + if (!stoppedCounting) + keyframeTimes.add(totalTime + offset); } public void addElement(PonderElement e) { 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 e5670d0f4..52fd625c5 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -68,6 +68,7 @@ public class PonderUI extends AbstractSimiScreen { private PonderButton left, right, scan, chap, userMode; private PonderProgressBar progressBar; + private int skipCooling = 0; public static PonderUI of(ResourceLocation id) { return new PonderUI(PonderRegistry.compile(id)); @@ -200,6 +201,9 @@ public class PonderUI extends AbstractSimiScreen { public void tick() { super.tick(); + if (skipCooling > 0) + skipCooling--; + if (referredToByTag != null) { for (int i = 0; i < scenes.size(); i++) { PonderScene ponderScene = scenes.get(i); @@ -222,7 +226,8 @@ public class PonderUI extends AbstractSimiScreen { PonderScene activeScene = scenes.get(index); if (!identifyMode) { ponderTicks++; - activeScene.tick(); + if (skipCooling == 0) + activeScene.tick(); } lazyIndex.tickChaser(); fadeIn.tickChaser(); @@ -247,6 +252,8 @@ public class PonderUI extends AbstractSimiScreen { replay(); getActiveScene().seekToTime(time); + if (time != 0) + coolDownAfterSkip(); } public void updateIdentifiedItem(PonderScene activeScene) { @@ -312,7 +319,8 @@ public class PonderUI extends AbstractSimiScreen { @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { RenderSystem.enableBlend(); - renderVisibleScenes(mouseX, mouseY, identifyMode ? ponderPartialTicksPaused : partialTicks); + renderVisibleScenes(mouseX, mouseY, + skipCooling > 0 ? 0 : identifyMode ? ponderPartialTicksPaused : partialTicks); renderWidgets(mouseX, mouseY, identifyMode ? ponderPartialTicksPaused : partialTicks); } @@ -362,7 +370,7 @@ public class PonderUI extends AbstractSimiScreen { for (int f = 0; f < 4; f++) { RenderSystem.translated(story.basePlateSize, 0, 0); RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 1/1024f); + RenderSystem.translated(0, 0, 1 / 1024f); GuiUtils.drawGradientRect(0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); RenderSystem.popMatrix(); RenderSystem.rotatef(-90, 0, 1, 0); @@ -480,7 +488,7 @@ public class PonderUI extends AbstractSimiScreen { } if (identifyMode) { - if (noWidgetsHovered) { + if (noWidgetsHovered && mouseY < height - 80) { RenderSystem.pushMatrix(); RenderSystem.translated(mouseX, mouseY, 100); if (hoveredTooltipItem.isEmpty()) { @@ -518,11 +526,12 @@ public class PonderUI extends AbstractSimiScreen { { // Scene overlay + float scenePT = skipCooling > 0 ? 0 : partialTicks; RenderSystem.pushMatrix(); RenderSystem.translated(0, 0, 100); - renderOverlay(index, partialTicks); + renderOverlay(index, scenePT); if (indexDiff > 1 / 512f) - renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, partialTicks); + renderOverlay(lazyIndexValue < index ? index - 1 : index + 1, scenePT); RenderSystem.popMatrix(); } @@ -841,4 +850,8 @@ public class PonderUI extends AbstractSimiScreen { return true; } + public void coolDownAfterSkip() { + skipCooling = 15; + } + } 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 fa463b3cc..2190daabf 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -203,6 +203,22 @@ public class SceneBuilder { addInstruction(new RotateSceneInstruction(0, degrees, true)); } + /** + * Adds a Key Frame at the end of the last delay() instruction for the users to + * skip to + */ + public void addKeyframe() { + addInstruction(KeyframeInstruction.IMMEDIATE); + } + + /** + * Adds a Key Frame a couple ticks after the last delay() instruction for the + * users to skip to + */ + public void addLazyKeyframe() { + addInstruction(KeyframeInstruction.DELAYED); + } + public class EffectInstructions { public void emitParticles(Vec3d location, Emitter emitter, float amountPerCycle, int cycles) { @@ -349,10 +365,6 @@ public class SceneBuilder { addInstruction(AnimateParrotInstruction.move(link, offset, duration)); } - public void addKeyframe() { - addInstruction(KeyframeInstruction.INSTANCE); - } - } public class WorldInstructions { 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 bdda5d67a..ea37f82ae 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 @@ -27,7 +27,7 @@ public class GantryScenes { 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); @@ -46,10 +46,9 @@ public class GantryScenes { : "Gantry Shafts form the basis of a gantry setup. Attached Carriages will move along them."; scene.overlay.showText(80) + .attachKeyFrame() .text(text) .pointAt(util.vector.centerOf(centralShaft)); - - scene.special.addKeyframe(); scene.idle(80); scene.world.hideIndependentSection(gantry, Direction.UP); @@ -58,10 +57,10 @@ public class GantryScenes { Vec3d gantryTop = util.vector.topOf(4, 2, 2); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 0f); scene.overlay.showText(40) + .attachKeyFrame() .text("Gantry setups can move attached Blocks.") .pointAt(gantryTop) .placeNearTarget(); - scene.special.addKeyframe(); scene.idle(30); Selection planks = util.select.position(5, 3, 1); @@ -75,12 +74,11 @@ public class GantryScenes { scene.idle(20); scene.overlay.showText(80) + .attachKeyFrame() .sharedText("movement_anchors") .pointAt(gantryTop) .placeNearTarget(); - scene.special.addKeyframe(); scene.idle(80); - scene.special.addKeyframe(); scene.world.modifyKineticSpeed(util.select.layer(0), f -> 32f); scene.world.modifyKineticSpeed(util.select.layer(1), f -> -64f); @@ -122,12 +120,12 @@ public class GantryScenes { BlockPos cogPos = util.grid.at(1, 2, 1); scene.overlay.showText(60) + .attachKeyFrame() .colored(PonderPalette.RED) .pointAt(util.vector.centerOf(cogPos.down() .south())) .text("Redstone-powered gantry shafts stop moving their carriages") .placeNearTarget(); - scene.special.addKeyframe(); scene.idle(70); Selection cogSelection = util.select.position(cogPos); @@ -171,10 +169,10 @@ public class GantryScenes { scene.world.moveSection(gantry2, util.vector.of(-1, 0, 0), 20); scene.overlay.showText(80) + .attachKeyFrame() .text("The movement direction of carriages depend on their shafts' orientation") .pointAt(util.vector.topOf(1, 1, 3)) .placeNearTarget(); - scene.special.addKeyframe(); scene.idle(80); BlockPos lastShaft = util.grid.at(0, 1, 2); @@ -192,10 +190,10 @@ public class GantryScenes { if (i == 0) { scene.overlay.showText(80) + .attachKeyFrame() .text("...as well as the rotation direction of the shaft") .pointAt(util.vector.blockSurface(lastShaft, Direction.WEST)) .placeNearTarget(); - scene.special.addKeyframe(); } scene.idle(30); @@ -221,10 +219,10 @@ public class GantryScenes { scene.idle(20); scene.overlay.showText(120) + .attachKeyFrame() .text("Same rules apply for the propagated rotation") .pointAt(util.vector.topOf(0, 3, 3)) .placeNearTarget(); - scene.special.addKeyframe(); scene.idle(20); for (boolean flip2 : Iterate.trueAndFalse) { @@ -268,9 +266,9 @@ public class GantryScenes { scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); scene.overlay.showText(60) + .attachKeyFrame() .text("Gantry shafts attach to a carriage without the need of super glue") .independent(20); - scene.special.addKeyframe(); scene.idle(40); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); @@ -281,9 +279,9 @@ public class GantryScenes { scene.world.showIndependentSection(util.select.position(gantryPos2), Direction.DOWN); scene.idle(15); scene.overlay.showText(60) + .attachKeyFrame() .text("Same applies for carriages on moved Gantry Shafts") .independent(20); - scene.special.addKeyframe(); scene.idle(15); scene.world.moveSection(gantry, util.vector.of(0, 2, 0), 40); 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 0afd83aee..615169fee 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 @@ -71,6 +71,11 @@ public class TextWindowElement extends AnimatedOverlayElement { return this; } + public Builder attachKeyFrame() { + scene.builder().addLazyKeyframe(); + return this; + } + } @Override diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java index 1330c0fdb..8bc6ea00a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/KeyframeInstruction.java @@ -5,9 +5,14 @@ import com.simibubi.create.foundation.ponder.PonderScene; public class KeyframeInstruction extends PonderInstruction { - public static final KeyframeInstruction INSTANCE = new KeyframeInstruction(); + public static final KeyframeInstruction IMMEDIATE = new KeyframeInstruction(false); + public static final KeyframeInstruction DELAYED = new KeyframeInstruction(true); + + private boolean delayed; - private KeyframeInstruction() { } + private KeyframeInstruction(boolean delayed) { + this.delayed = delayed; + } @Override public boolean isComplete() { @@ -19,6 +24,6 @@ public class KeyframeInstruction extends PonderInstruction { @Override public void onScheduled(PonderScene scene) { - scene.markKeyframe(); + scene.markKeyframe(delayed ? 6 : 0); } } From f14661fb6fded61d81f15bbfd3644a9da238d091 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Mar 2021 14:03:21 -0800 Subject: [PATCH 100/124] Pondering: the beginning and the end. - Special-case seeking to the end of a ponder scene. - Draw indicators for seeking to the beginning and end. - Fix pulleys not rendering correctly. --- .../pulley/PulleyTileEntity.java | 4 + .../foundation/ponder/PonderProgressBar.java | 105 +++++++++++------- 2 files changed, 67 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java index f6dbbb33c..a185e14cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/pulley/PulleyTileEntity.java @@ -239,4 +239,8 @@ public class PulleyTileEntity extends LinearActuatorTileEntity { offset = forcedOffset; } + @Override + public boolean shouldRenderAsTE() { + return true; + } } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java index 63f813347..dd2863865 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -51,36 +51,44 @@ public class PonderProgressBar extends AbstractSimiWidget { @Override protected boolean clicked(double mouseX, double mouseY) { return this.active && this.visible && !ponder.getActiveScene().keyframeTimes.isEmpty() - && mouseX >= (double) this.x && mouseX < (double) (this.x + this.width) && mouseY >= (double) this.y - 3 + && mouseX >= (double) this.x && mouseX < (double) (this.x + this.width + 4) && mouseY >= (double) this.y - 3 && mouseY < (double) (this.y + this.height + 20); } @Override public void onClick(double mouseX, double mouseY) { - PonderScene activeScene = ponder.getActiveScene(); - int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); + PonderScene activeScene = ponder.getActiveScene(); + IntegerList keyframeTimes = activeScene.keyframeTimes; - int seekTime = 0; + int keyframeIndex = getHoveredKeyframeIndex(activeScene, mouseX); - IntegerList keyframeTimes = activeScene.keyframeTimes; - for (int i = 0; i < keyframeTimes.size(); i++) { - int keyframeTime = keyframeTimes.get(i); - - if (keyframeTime > clickedAtTime) - break; - - seekTime = keyframeTime; - } - ponder.seekToTime(seekTime); + if (keyframeIndex == -1) + ponder.seekToTime(0); + else if (keyframeIndex == keyframeTimes.size()) + ponder.seekToTime(activeScene.totalTime); + else + ponder.seekToTime(keyframeTimes.get(keyframeIndex)); } - public int getHoveredKeyframeIndex(double mouseX) { - PonderScene activeScene = ponder.getActiveScene(); - int clickedAtTime = (int) ((mouseX - x) / ((double) width) * activeScene.totalTime); + public int getHoveredKeyframeIndex(PonderScene activeScene, double mouseX) { + IntegerList keyframeTimes = activeScene.keyframeTimes; + + int totalTime = activeScene.totalTime; + int clickedAtTime = (int) ((mouseX - x) / ((double) width + 4) * totalTime); + + { + int lastKeyframeTime = keyframeTimes.get(keyframeTimes.size() - 1); + + int diffToEnd = totalTime - clickedAtTime; + int diffToLast = clickedAtTime - lastKeyframeTime; + + if (diffToEnd > 0 && diffToEnd < diffToLast / 2) { + return keyframeTimes.size(); + } + } int index = -1; - IntegerList keyframeTimes = activeScene.keyframeTimes; for (int i = 0; i < keyframeTimes.size(); i++) { int keyframeTime = keyframeTimes.get(i); @@ -125,48 +133,61 @@ public class PonderProgressBar extends AbstractSimiWidget { int hoverIndex; if (isHovered) { - hoverIndex = getHoveredKeyframeIndex(mouseX); + hoverIndex = getHoveredKeyframeIndex(activeScene, mouseX); float flashValue = flash.getValue(partialTicks) * 3 + (float) Math.sin((AnimationTickHolder.getTicks() + partialTicks) / 6); hoverEndColor = ColorHelper.applyAlpha(0x70ffffff, flashValue); hoverStartColor = ColorHelper.applyAlpha(0x30ffffff, flashValue); } else { - hoverIndex = -1; + hoverIndex = -2; hoverEndColor = 0; hoverStartColor = 0; } - IntegerList keyframeTimes = activeScene.keyframeTimes; + + if (hoverIndex == -1) + drawKeyframe(activeScene, true, 0, 0, hoverStartColor, hoverEndColor, 8); + else if (hoverIndex == keyframeTimes.size()) + drawKeyframe(activeScene, true, activeScene.totalTime, width + 4, hoverStartColor, hoverEndColor, 8); + for (int i = 0; i < keyframeTimes.size(); i++) { int keyframeTime = keyframeTimes.get(i); int keyframePos = (int) (((float) keyframeTime) / ((float) activeScene.totalTime) * (width + 4)); - int startColor = i == hoverIndex ? hoverStartColor : 0x30ffeedd; - int endColor = i == hoverIndex ? hoverEndColor : 0x60ffeedd; - int height = i == hoverIndex ? 8 : 4; + boolean selected = i == hoverIndex; + int startColor = selected ? hoverStartColor : 0x30ffeedd; + int endColor = selected ? hoverEndColor : 0x60ffeedd; + int height = selected ? 8 : 4; + + drawKeyframe(activeScene, selected, keyframeTime, keyframePos, startColor, endColor, height); - if (i == hoverIndex) { - FontRenderer font = Minecraft.getInstance().fontRenderer; - GuiUtils.drawGradientRect(500, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); - RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 400); - String text; - int offset; - if (activeScene.currentTime < keyframeTime) { - text = ">"; - offset = -1 - font.getStringWidth(text); - } else { - text = "<"; - offset = 3; - } - font.drawString(text, keyframePos + offset, 10, endColor); - RenderSystem.popMatrix(); - } - GuiUtils.drawGradientRect(500, keyframePos, -1, keyframePos + 1, 2 + height, startColor, endColor); } } + private void drawKeyframe(PonderScene activeScene, boolean selected, int keyframeTime, int keyframePos, int startColor, int endColor, int height) { + if (selected) { + FontRenderer font = Minecraft.getInstance().fontRenderer; + GuiUtils.drawGradientRect(500, keyframePos, 10, keyframePos + 1, 10 + height, endColor, startColor); + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 400); + String text; + int offset; + if (activeScene.currentTime < keyframeTime) { + text = ">"; + offset = -1 - font.getStringWidth(text); + } + else { + text = "<"; + offset = 3; + } + font.drawString(text, keyframePos + offset, 10, endColor); + RenderSystem.popMatrix(); + } + + GuiUtils.drawGradientRect(500, keyframePos, -1, keyframePos + 1, 2 + height, startColor, endColor); + } + @Override public void playDownSound(SoundHandler handler) { From a1e10a5c3c245aff15d4503ef8f2fd74fbfbe078 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Mar 2021 16:33:01 -0800 Subject: [PATCH 101/124] Belt speed = item speed and secret wrench fix. --- .../relays/belt/BeltRenderer.java | 2 +- .../wrench/WrenchItemRenderer.java | 5 +- .../simibubi/create/events/ClientEvents.java | 2 + .../scrollvalue/ScrollValueHandler.java | 21 +++ .../foundation/utility/PhysicalFloat.java | 147 ++++++++++++++++++ .../resources/assets/create/shader/belt.vert | 2 +- 6 files changed, 174 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/PhysicalFloat.java diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java index bc98f8f84..c8b4c582e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltRenderer.java @@ -110,7 +110,7 @@ public class BeltRenderer extends SafeTileEntityRenderer { float spriteSize = spriteShift.getTarget().getMaxV() - spriteShift.getTarget().getMinV(); - double scroll = speed * time / (36 * 16) + (bottom ? 0.5 : 0.0); + double scroll = speed * time / (31.5 * 16) + (bottom ? 0.5 : 0.0); scroll = scroll - Math.floor(scroll); scroll = scroll * spriteSize * scrollMult; diff --git a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java index 03cc04bdf..01f60ce81 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/wrench/WrenchItemRenderer.java @@ -3,6 +3,7 @@ package com.simibubi.create.content.contraptions.wrench; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.foundation.block.render.CustomRenderedItemModelRenderer; import com.simibubi.create.foundation.item.PartialItemModelRenderer; +import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueHandler; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -16,11 +17,9 @@ public class WrenchItemRenderer extends CustomRenderedItemModelRenderer forces = new ArrayList<>(); + + public static PhysicalFloat create() { + return new PhysicalFloat(); + } + + public PhysicalFloat startAt(double value) { + previousValue = this.value = (float) value; + return this; + } + + public PhysicalFloat withDrag(double drag) { + return addForce(new DragForce((float) drag)); + } + + public PhysicalFloat zeroing(double g) { + return addForce(new ZeroingForce((float) g)); + } + + public void tick() { + previousValue = value; + + for (Force force : forces) + speed = force.apply(speed, value); + + forces.removeIf(Force::finished); + + value += speed; + } + + public PhysicalFloat addForce(Force f) { + forces.add(f); + return this; + } + + public PhysicalFloat bump(double force) { + return addForce(new Impulse((float) force)); + } + + public PhysicalFloat bump(int time, double force) { + return addForce(new ForceOverTime(time, (float) force)); + } + + public float getValue() { + return getValue(1); + } + + public float getValue(float partialTicks) { + return MathHelper.lerp(partialTicks, previousValue, value); + } + + public interface Force { + + float apply(float speed, float value); + + boolean finished(); + } + + public static class DragForce implements Force { + final float dragFactor; + + public DragForce(float dragFactor) { + this.dragFactor = dragFactor; + } + + @Override + public float apply(float speed, float value) { + return speed * dragFactor; + } + + @Override + public boolean finished() { + return false; + } + } + + public static class ZeroingForce implements Force { + final float g; + + public ZeroingForce(float g) { + this.g = g; + } + + @Override + public float apply(float speed, float value) { + return speed - MathHelper.clamp(g * Math.signum(value), -speed, speed); + } + + @Override + public boolean finished() { + return false; + } + } + + public static class Impulse implements Force { + + float force; + + public Impulse(float force) { + this.force = force; + } + + @Override + public float apply(float speed, float value) { + return speed + force; + } + + @Override + public boolean finished() { + return true; + } + } + + public static class ForceOverTime implements Force { + int timeRemaining; + float accel; + + public ForceOverTime(int time, float totalAcceleration) { + this.timeRemaining = time; + this.accel = totalAcceleration / (float) time; + } + + @Override + public float apply(float speed, float value) { + timeRemaining--; + return speed + accel; + } + + @Override + public boolean finished() { + return timeRemaining <= 0; + } + } +} diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/shader/belt.vert index 14921cb7a..81f9054d5 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/shader/belt.vert @@ -88,7 +88,7 @@ void main() { vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; float scrollSize = aScrollTexture.w - aScrollTexture.y; - float scroll = fract(aSpeed * uTime / (36. * 16.) + aOffset) * scrollSize * aScrollMult; + float scroll = fract(aSpeed * uTime / (31.5 * 16.) + aOffset) * scrollSize * aScrollMult; Diffuse = diffuse(norm); TexCoords = aTexCoords - aSourceTexture + aScrollTexture.xy + vec2(0, scroll); From d735d237ec3a6ccd95cab786ab2ae1e733b1a1a4 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Fri, 12 Mar 2021 20:20:14 -0800 Subject: [PATCH 102/124] Ghost blocks are less spooky. --- .../create/foundation/utility/ghost/GhostBlockRenderer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java index 361f524bb..34d304c64 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/utility/ghost/GhostBlockRenderer.java @@ -142,7 +142,8 @@ public abstract class GhostBlockRenderer { Vector3f vector3f = new Vector3f((float) vec3i.getX(), (float) vec3i.getY(), (float) vec3i.getZ()); Matrix4f matrix4f = p_227890_1_.getModel(); vector3f.transform(p_227890_1_.getNormal()); - int j = aint.length / 8; + int vertexSize = DefaultVertexFormats.BLOCK.getIntegerSize(); + int j = aint.length / vertexSize; try (MemoryStack memorystack = MemoryStack.stackPush()) { ByteBuffer bytebuffer = memorystack.malloc(DefaultVertexFormats.BLOCK.getSize()); @@ -150,7 +151,7 @@ public abstract class GhostBlockRenderer { for (int k = 0; k < j; ++k) { ((Buffer) intbuffer).clear(); - intbuffer.put(aint, k * 8, 8); + intbuffer.put(aint, k * vertexSize, vertexSize); float f = bytebuffer.getFloat(0); float f1 = bytebuffer.getFloat(4); float f2 = bytebuffer.getFloat(8); From a40d0f58c235ffbc8c9893ab231e6b7712077645 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sat, 13 Mar 2021 18:24:10 +0100 Subject: [PATCH 103/124] Pondering about sticky stuff - Scenes for chassis, super glue, stickers and redstone contact - Added a warning when players try to use experimental rendering while shaders are active --- .../chassis/StickerRenderer.java | 5 +- .../glue/SuperGlueEntity.java | 33 +- .../command/ConfigureConfigPacket.java | 24 +- .../create/foundation/ponder/PonderUI.java | 36 +- .../foundation/ponder/SceneBuilder.java | 6 + .../foundation/ponder/SceneBuildingUtil.java | 4 +- .../ponder/content/ChassisScenes.java | 570 ++++++++++++++++++ .../ponder/content/DebugScenes.java | 1 - .../ponder/content/PonderIndex.java | 13 + .../ponder/content/RedstoneScenes.java | 169 ++++++ .../ponder/chassis/linear_attachment.nbt | Bin 0 -> 548 bytes .../resources/ponder/chassis/linear_group.nbt | Bin 0 -> 474 bytes src/main/resources/ponder/chassis/radial.nbt | Bin 0 -> 561 bytes .../resources/ponder/redstone_contact.nbt | Bin 0 -> 536 bytes src/main/resources/ponder/sticker.nbt | Bin 0 -> 530 bytes src/main/resources/ponder/super_glue.nbt | Bin 0 -> 493 bytes 16 files changed, 832 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java create mode 100644 src/main/resources/ponder/chassis/linear_attachment.nbt create mode 100644 src/main/resources/ponder/chassis/linear_group.nbt create mode 100644 src/main/resources/ponder/chassis/radial.nbt create mode 100644 src/main/resources/ponder/redstone_contact.nbt create mode 100644 src/main/resources/ponder/sticker.nbt create mode 100644 src/main/resources/ponder/super_glue.nbt diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java index 91064b937..83679ee68 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerRenderer.java @@ -7,7 +7,6 @@ import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.AnimationTickHolder; -import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -30,9 +29,9 @@ public class StickerRenderer extends SafeTileEntityRenderer { BlockState state = te.getBlockState(); SuperByteBuffer head = AllBlockPartials.STICKER_HEAD.renderOn(state); - float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks()); + float offset = te.piston.getValue(AnimationTickHolder.getPartialTicks(te.getWorld())); - if (te.getWorld() != Minecraft.getInstance().world) + if (te.getWorld() != Minecraft.getInstance().world && !te.isVirtual()) offset = state.get(StickerBlock.EXTENDED) ? 1 : 0; Direction facing = state.get(StickerBlock.FACING); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java index 21af0fd87..7627845d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/glue/SuperGlueEntity.java @@ -1,5 +1,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.glue; +import javax.annotation.Nullable; + +import org.apache.commons.lang3.Validate; + import com.simibubi.create.AllBlocks; import com.simibubi.create.AllEntityTypes; import com.simibubi.create.AllItems; @@ -14,13 +18,19 @@ import com.simibubi.create.content.schematics.ItemRequirement.ItemUseType; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.BlockFace; +import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; + import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.DirectionalBlock; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.client.world.ClientWorld; -import net.minecraft.entity.*; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntitySize; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.MoverType; +import net.minecraft.entity.Pose; import net.minecraft.entity.effect.LightningBoltEntity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -29,10 +39,21 @@ import net.minecraft.nbt.CompoundNBT; import net.minecraft.network.IPacket; import net.minecraft.network.PacketBuffer; import net.minecraft.state.BooleanProperty; -import net.minecraft.util.*; +import net.minecraft.util.ActionResultType; +import net.minecraft.util.DamageSource; +import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; -import net.minecraft.util.math.*; +import net.minecraft.util.Hand; +import net.minecraft.util.Mirror; +import net.minecraft.util.Rotation; +import net.minecraft.util.SoundEvents; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockRayTraceResult; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult.Type; +import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -40,9 +61,6 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.registry.IEntityAdditionalSpawnData; import net.minecraftforge.fml.network.NetworkHooks; import net.minecraftforge.fml.network.PacketDistributor; -import org.apache.commons.lang3.Validate; - -import javax.annotation.Nullable; public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnData, ISpecialEntityItemRequirement { @@ -149,6 +167,9 @@ public class SuperGlueEntity extends Entity implements IEntityAdditionalSpawnDat public boolean isVisible() { if (!isAlive()) return false; + if (world instanceof WrappedWorld) + return true; + BlockPos pos = hangingPosition; BlockPos pos2 = pos.offset(getFacingDirection().getOpposite()); return isValidFace(world, pos2, getFacingDirection()) != isValidFace(world, pos, 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 8856abb0b..ce90a339d 100644 --- a/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java +++ b/src/main/java/com/simibubi/create/foundation/command/ConfigureConfigPacket.java @@ -1,5 +1,10 @@ package com.simibubi.create.foundation.command; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import org.apache.logging.log4j.LogManager; + import com.simibubi.create.Create; import com.simibubi.create.content.contraptions.goggles.GoggleConfigScreen; import com.simibubi.create.foundation.config.AllConfigs; @@ -9,6 +14,8 @@ import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.PonderUI; import com.simibubi.create.foundation.ponder.content.PonderIndexScreen; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.OptifineHandler; + import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; import net.minecraft.network.PacketBuffer; @@ -21,10 +28,6 @@ import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.ForgeConfig; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.network.NetworkEvent; -import org.apache.logging.log4j.LogManager; - -import java.util.function.Consumer; -import java.util.function.Supplier; public class ConfigureConfigPacket extends SimplePacketBase { @@ -112,10 +115,17 @@ public class ConfigureConfigPacket extends SimplePacketBase { return; } - AllConfigs.CLIENT.experimentalRendering.set(Boolean.parseBoolean(value)); - ITextComponent text = boolToText(AllConfigs.CLIENT.experimentalRendering.get()).appendSibling(new StringTextComponent(" Experimental Rendering").applyTextStyle(TextFormatting.WHITE)); - player.sendStatusMessage(text, false); + boolean parsedBoolean = Boolean.parseBoolean(value); + boolean cannotUseER = OptifineHandler.usingShaders() && parsedBoolean; + + AllConfigs.CLIENT.experimentalRendering.set(parsedBoolean); + + ITextComponent text = boolToText(AllConfigs.CLIENT.experimentalRendering.get()) + .appendSibling(new StringTextComponent(" Experimental Rendering").applyTextStyle(TextFormatting.WHITE)); + ITextComponent error = new StringTextComponent("Experimental Rendering does not support Optifine Shaders") + .applyTextStyle(TextFormatting.RED); + player.sendStatusMessage(cannotUseER ? error : text, false); FastRenderDispatcher.refresh(); } 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 52fd625c5..4f4d8323c 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,37 @@ 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.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; @@ -29,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 { 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 2190daabf..25e9c1cd0 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,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.SuperGlueEntity; 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; @@ -532,6 +533,11 @@ public class SceneBuilder { return itemEntity; }); } + + public ElementLink createGlueEntity(BlockPos pos, Direction face) { + effects.superGlue(pos, face, false); + return createEntity(world -> new SuperGlueEntity(world, pos, face.getOpposite())); + } public void createItemOnBeltLike(BlockPos location, Direction insertionSide, ItemStack stack) { addInstruction(scene -> { 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 58e7ebd0e..e0451e394 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuildingUtil.java @@ -105,8 +105,8 @@ public class SceneBuildingUtil { } 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())); + return cuboid(new BlockPos(0, y, 0), new Vec3i(sceneBounds.getXSize() - 1, + Math.min(sceneBounds.getYSize() - y, height) - 1, sceneBounds.getZSize() - 1)); } public Selection cuboid(BlockPos origin, Vec3i size) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java new file mode 100644 index 000000000..8ce8f0b6a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/ChassisScenes.java @@ -0,0 +1,570 @@ +package com.simibubi.create.foundation.ponder.content; + +import org.apache.commons.lang3.mutable.MutableObject; + +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.RadialChassisBlock; +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.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.Direction; +import net.minecraft.util.math.AxisAlignedBB; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class ChassisScenes { + + public static void linearGroup(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("linear_chassis_group", "Moving Linear Chassis in groups"); + 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); + + BlockPos centralChassis = util.grid.at(2, 2, 2); + ElementLink chassis = + scene.world.showIndependentSection(util.select.position(centralChassis), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(centralChassis.west()), Direction.EAST, chassis); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(centralChassis.east()), Direction.WEST, chassis); + scene.idle(4); + scene.world.showSectionAndMerge(util.select.position(centralChassis.east() + .north()), Direction.SOUTH, chassis); + scene.idle(3); + scene.world.showSectionAndMerge(util.select.position(centralChassis.up()), Direction.DOWN, chassis); + scene.idle(2); + scene.world.showSectionAndMerge(util.select.position(centralChassis.up() + .east()), Direction.DOWN, chassis); + scene.idle(10); + + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .text("Linear Chassis connect to identical Chassis blocks next to them") + .pointAt(util.vector.topOf(util.grid.at(2, 3, 2))); + scene.idle(90); + + BlockPos bearingPos = util.grid.at(2, 1, 2); + scene.world.moveSection(chassis, util.vector.of(0, -1 / 1024f, 0), 0); + scene.world.configureCenterOfRotation(chassis, util.vector.centerOf(bearingPos)); + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(chassis, 0, 360, 0, 80); + + scene.idle(20); + scene.overlay.showText(80) + .placeNearTarget() + .text("When one is moved by a Contraption, the others are dragged with it") + .pointAt(util.vector.topOf(util.grid.at(2, 3, 2))); + scene.idle(90); + + Selection wrong1 = util.select.position(2, 4, 2); + Selection wrong2 = util.select.position(0, 2, 2); + + scene.addKeyframe(); + scene.world.showSection(wrong2, Direction.EAST); + scene.idle(10); + scene.world.showSection(wrong1, Direction.DOWN); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.RED, wrong2, wrong2, 80); + scene.overlay.showSelectionWithText(wrong1, 80) + .colored(PonderPalette.RED) + .placeNearTarget() + .text("Chassis of a different type or facing another direction will not attach"); + scene.idle(40); + + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(chassis, 0, 360, 0, 80); + } + + public static void linearAttachement(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("linear_chassis_attachment", "Attaching blocks using Linear Chassis"); + scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos chassisPos = util.grid.at(2, 2, 2); + Selection chassis = util.select.position(chassisPos); + + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.world.showSection(chassis, Direction.DOWN); + scene.idle(10); + + InputWindowElement input = + new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); + scene.overlay.showControls(input, 30); + scene.idle(7); + scene.world.modifyBlock(chassisPos, s -> s.with(LinearChassisBlock.STICKY_BOTTOM, true), false); + scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.idle(30); + + scene.overlay.showText(60) + .text("The open faces of a Linear Chassis can be made Sticky") + .placeNearTarget() + .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + scene.idle(70); + + scene.overlay.showControls(input, 15); + scene.idle(7); + scene.world.modifyBlock(chassisPos, s -> s.with(LinearChassisBlock.STICKY_TOP, true), false); + scene.effects.superGlue(chassisPos, Direction.EAST, false); + scene.idle(15); + + scene.overlay.showText(60) + .text("Click again to make the opposite side sticky") + .placeNearTarget() + .pointAt(util.vector.topOf(chassisPos)); + scene.idle(10); + scene.rotateCameraY(60); + scene.idle(35); + scene.rotateCameraY(-60); + scene.idle(25); + + scene.overlay.showControls( + new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + .whileSneaking(), + 30); + scene.idle(7); + scene.world.modifyBlock(chassisPos, s -> s.with(LinearChassisBlock.STICKY_BOTTOM, false), false); + scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.idle(30); + + scene.overlay.showText(60) + .text("Sneak and Right-Click with an empty hand to remove the slime") + .placeNearTarget() + .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + scene.idle(70); + + scene.world.hideSection(chassis, Direction.UP); + + scene.idle(20); + ElementLink glassSection = + scene.world.showIndependentSection(util.select.position(chassisPos.up()), Direction.DOWN); + scene.world.moveSection(glassSection, util.vector.of(0, -1, 0), 0); + scene.idle(25); + scene.addKeyframe(); + scene.world.showSectionAndMerge(util.select.fromTo(2, 4, 2, 2, 5, 2), Direction.DOWN, glassSection); + ElementLink topGlassSection = + scene.world.showIndependentSection(util.select.position(2, 6, 2), Direction.DOWN); + scene.world.moveSection(topGlassSection, util.vector.of(0, -1, 0), 0); + scene.idle(30); + + Selection column1 = util.select.fromTo(2, 3, 2, 2, 3, 2); + Selection column2 = util.select.fromTo(2, 3, 2, 2, 4, 2); + Selection column3 = util.select.fromTo(2, 3, 2, 2, 5, 2); + + scene.overlay.showSelectionWithText(column3, 80) + .colored(PonderPalette.GREEN) + .text("Stickied faces of the Linear Chassis will attach a line of blocks in front of it") + .placeNearTarget(); + scene.idle(90); + + BlockPos bearingPos = util.grid.at(2, 1, 2); + scene.world.configureCenterOfRotation(glassSection, util.vector.centerOf(bearingPos)); + scene.world.rotateBearing(bearingPos, 180, 40); + scene.world.rotateSection(glassSection, 0, 180, 0, 40); + scene.world.rotateSection(topGlassSection, 0, 180, 0, 40); + scene.idle(50); + + Vec3d blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); + scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).scroll() + .withWrench(), 50); + + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column3, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column1, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 15); + scene.idle(10); + + scene.overlay.showText(60) + .pointAt(blockSurface) + .text("Using a Wrench, a precise Range can be specified for this chassis") + .placeNearTarget(); + scene.idle(70); + + scene.world.rotateBearing(bearingPos, 180, 40); + scene.world.rotateSection(glassSection, 0, 180, 0, 40); + scene.idle(50); + + scene.world.rotateSection(topGlassSection, 0, 180, 0, 0); + scene.world.showSectionAndMerge(util.select.position(1, 3, 2), Direction.UP, glassSection); + scene.world.showSectionAndMerge(util.select.position(3, 3, 2), Direction.UP, glassSection); + scene.world.showSectionAndMerge(util.select.fromTo(1, 4, 2, 1, 6, 2), Direction.DOWN, glassSection); + scene.world.showSectionAndMerge(util.select.fromTo(3, 4, 2, 3, 6, 2), Direction.DOWN, glassSection); + scene.addKeyframe(); + scene.idle(20); + + scene.overlay.showCenteredScrollInput(chassisPos, Direction.NORTH, 50); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.UP).whileCTRL() + .scroll() + .withWrench(), 50); + + column1 = util.select.fromTo(1, 3, 2, 3, 3, 2); + column2 = util.select.fromTo(1, 3, 2, 3, 4, 2); + column3 = util.select.fromTo(1, 3, 2, 3, 5, 2); + + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column1, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column2, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, column3, 15); + scene.idle(10); + + scene.overlay.showText(80) + .pointAt(blockSurface) + .text("Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks") + .placeNearTarget(); + scene.idle(90); + + scene.world.rotateBearing(bearingPos, 180, 40); + scene.world.rotateSection(glassSection, 0, 180, 0, 40); + scene.world.rotateSection(topGlassSection, 0, 180, 0, 40); + scene.idle(50); + + Vec3d glueSurface = util.vector.blockSurface(chassisPos.west(), Direction.NORTH); + scene.overlay.showText(80) + .attachKeyFrame() + .pointAt(glueSurface) + .text("Attaching blocks to any other side requires the use of Super Glue") + .placeNearTarget(); + scene.idle(90); + scene.overlay.showControls(new InputWindowElement(glueSurface, Pointing.DOWN).rightClick() + .withItem(AllItems.SUPER_GLUE.asStack()), 30); + scene.idle(7); + ElementLink glueEntity = scene.world.createGlueEntity(chassisPos.west(), Direction.NORTH); + scene.idle(20); + ElementLink gluedPlank = + scene.world.showIndependentSection(util.select.position(3, 3, 1), Direction.SOUTH); + scene.world.moveSection(gluedPlank, util.vector.of(-2, -1, 0), 0); + scene.idle(15); + scene.effects.superGlue(chassisPos.west(), Direction.NORTH, true); + scene.idle(20); + + scene.world.modifyEntity(glueEntity, Entity::remove); + scene.world.hideIndependentSection(glassSection, Direction.UP); + scene.world.hideIndependentSection(gluedPlank, Direction.UP); + scene.world.hideIndependentSection(topGlassSection, Direction.UP); + scene.idle(15); + + scene.addKeyframe(); + ElementLink chain = + scene.world.showIndependentSection(util.select.position(2, 7, 2), Direction.DOWN); + scene.world.configureCenterOfRotation(chain, util.vector.centerOf(bearingPos)); + scene.world.moveSection(chain, util.vector.of(0, -5, 0), 0); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.fromTo(2, 8, 2, 3, 9, 2), Direction.DOWN, chain); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.fromTo(3, 9, 1, 3, 9, 0), Direction.SOUTH, chain); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.fromTo(2, 9, 0, 1, 9, 0), Direction.EAST, chain); + scene.idle(20); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(chassisPos.up(2))) + .text("Using these mechanics, structures of any shape can move as a Contraption") + .placeNearTarget(); + scene.idle(30); + + scene.world.rotateBearing(bearingPos, 720, 160); + scene.world.rotateSection(chain, 0, 720, 0, 160); + } + + public static void radial(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("radial_chassis", "Attaching blocks using Radial Chassis"); + scene.configureBasePlate(0, 0, 5); + scene.setSceneOffsetY(-1); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + util.select.position(2, 4, 2); + + BlockPos chassisPos = util.grid.at(2, 2, 2); + Selection chassis = util.select.position(chassisPos); + + scene.world.showSection(util.select.layer(1), Direction.DOWN); + scene.idle(10); + ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(5); + ElementLink top = + scene.world.showIndependentSection(util.select.position(chassisPos.up()), Direction.DOWN); + scene.idle(10); + + scene.overlay.showText(50) + .attachKeyFrame() + .placeNearTarget() + .text("Radial Chassis connect to identical Chassis blocks in a row") + .pointAt(util.vector.topOf(chassisPos.up())); + scene.idle(60); + + BlockPos bearingPos = util.grid.at(2, 1, 2); + scene.world.moveSection(contraption, util.vector.of(0, -1 / 1024f, 0), 0); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(contraption, 0, 360, 0, 80); + scene.world.rotateSection(top, 0, 360, 0, 80); + + scene.idle(20); + scene.overlay.showText(70) + .placeNearTarget() + .text("When one is moved by a Contraption, the others are dragged with it") + .pointAt(util.vector.topOf(util.grid.at(2, 3, 2))); + scene.idle(80); + + scene.world.hideIndependentSection(top, Direction.UP); + scene.idle(15); + + scene.addKeyframe(); + InputWindowElement input = + new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + .withItem(new ItemStack(Items.SLIME_BALL)); + scene.overlay.showControls(input, 30); + scene.idle(7); + scene.world.modifyBlock(chassisPos, s -> s.with(RadialChassisBlock.STICKY_WEST, true), false); + scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.idle(30); + + scene.overlay.showText(60) + .text("The side faces of a Radial Chassis can be made Sticky") + .placeNearTarget() + .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + scene.idle(70); + + scene.overlay.showControls(input, 15); + scene.idle(7); + scene.world.modifyBlock(chassisPos, s -> s.with(RadialChassisBlock.STICKY_EAST, true) + .with(RadialChassisBlock.STICKY_NORTH, true) + .with(RadialChassisBlock.STICKY_SOUTH, true), false); + scene.effects.superGlue(chassisPos, Direction.EAST, false); + scene.effects.superGlue(chassisPos, Direction.SOUTH, false); + scene.effects.superGlue(chassisPos, Direction.NORTH, false); + scene.idle(15); + + scene.overlay.showText(60) + .text("Click again to make all other sides sticky") + .placeNearTarget() + .pointAt(util.vector.topOf(chassisPos)); + scene.idle(10); + scene.rotateCameraY(60); + scene.idle(35); + scene.rotateCameraY(-60); + scene.idle(25); + + scene.overlay.showControls( + new InputWindowElement(util.vector.blockSurface(chassisPos, Direction.WEST), Pointing.LEFT).rightClick() + .whileSneaking(), + 30); + scene.idle(7); + scene.world.modifyBlock(chassisPos, s -> s.with(RadialChassisBlock.STICKY_WEST, false), false); + scene.effects.superGlue(chassisPos, Direction.WEST, false); + scene.idle(30); + + scene.overlay.showText(60) + .text("Sneak and Right-Click with an empty hand to remove the slime") + .placeNearTarget() + .pointAt(util.vector.blockSurface(chassisPos, Direction.WEST)); + scene.idle(70); + + Selection s = util.select.position(chassisPos.north()); + Selection growing = s.copy(); + Selection r1 = util.select.fromTo(1, 2, 1, 3, 2, 3) + .substract(chassis); + Selection r2 = r1.copy() + .add(util.select.fromTo(0, 2, 1, 0, 2, 3)) + .add(util.select.fromTo(1, 2, 0, 3, 2, 0)) + .add(util.select.fromTo(1, 2, 4, 3, 2, 4)) + .add(util.select.fromTo(4, 2, 1, 4, 2, 3)); + Selection r3 = util.select.layer(2) + .add(util.select.fromTo(-1, 2, 1, 5, 2, 3)) + .add(util.select.fromTo(1, 2, -1, 3, 2, 5)) + .substract(chassis); + + scene.addKeyframe(); + scene.world.showSectionAndMerge(r1, Direction.DOWN, contraption); + ElementLink outer = scene.world.showIndependentSection(util.select.layer(2) + .substract(chassis) + .substract(r1), Direction.DOWN); + scene.world.showSection(util.select.fromTo(0, 3, 3, 1, 3, 4), Direction.DOWN); + scene.idle(10); + Vec3d blockSurface = util.vector.blockSurface(chassisPos, Direction.NORTH); + AxisAlignedBB bb = new AxisAlignedBB(blockSurface, blockSurface).grow(.501, .501, 0); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 60); + scene.overlay.showOutline(PonderPalette.WHITE, s, s, 80); + scene.overlay.showText(40) + .text("Whenever a Block is next to a sticky face...") + .placeNearTarget() + .pointAt(blockSurface.add(0, .5, 0)); + scene.idle(60); + + MutableObject obj = new MutableObject<>(growing); + r2.forEach(pos -> { + scene.idle(1); + Selection add = obj.getValue() + .copy() + .add(util.select.position(pos)); + scene.overlay.showOutline(PonderPalette.WHITE, s, add, 3); + obj.setValue(add); + }); + + scene.overlay.showSelectionWithText(obj.getValue(), 60) + .colored(PonderPalette.GREEN) + .text("...it will attach all reachable blocks within a radius on that layer"); + scene.idle(70); + + scene.world.configureCenterOfRotation(outer, util.vector.centerOf(bearingPos)); + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(contraption, 0, 360, 0, 80); + scene.world.rotateSection(outer, 0, 360, 0, 80); + scene.idle(90); + + scene.addKeyframe(); + blockSurface = util.vector.topOf(chassisPos); + scene.overlay.showCenteredScrollInput(chassisPos, Direction.UP, 50); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() + .withWrench(), 50); + + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, r2, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, r3, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, r2, 20); + scene.idle(10); + scene.overlay.showOutline(PonderPalette.WHITE, chassis, r1, 15); + scene.idle(10); + + scene.overlay.showText(60) + .pointAt(blockSurface) + .text("Using a Wrench, a precise Radius can be specified for this chassis") + .placeNearTarget(); + scene.idle(70); + + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(contraption, 0, 360, 0, 80); + scene.idle(90); + + scene.world.destroyBlock(util.grid.at(1, 2, 0)); + scene.idle(1); + scene.world.destroyBlock(util.grid.at(1, 2, 1)); + scene.idle(1); + scene.world.destroyBlock(util.grid.at(1, 2, 3)); + scene.idle(1); + scene.world.destroyBlock(util.grid.at(1, 2, 4)); + scene.idle(10); + + Selection ignored = util.select.fromTo(0, 2, 1, 0, 2, 3) + .add(util.select.position(1, 2, 2)); + scene.overlay.showOutline(PonderPalette.GREEN, r2, r2.copy() + .substract(util.select.fromTo(0, 2, 0, 1, 2, 4)), 80); + scene.markAsFinished(); + scene.overlay.showSelectionWithText(ignored, 80) + .colored(PonderPalette.RED) + .text("Blocks not reachable by any sticky face will not attach"); + } + + public static void superGlue(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("super_glue", "Attaching blocks using Super Glue"); + 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); + + BlockPos central = util.grid.at(2, 2, 2); + ElementLink plank = + scene.world.showIndependentSection(util.select.position(central), Direction.DOWN); + scene.idle(15); + Vec3d blockSurface = util.vector.blockSurface(central, Direction.NORTH); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).rightClick() + .withItem(AllItems.SUPER_GLUE.asStack()), 40); + scene.idle(7); + ElementLink glueEntity = scene.world.createGlueEntity(central, Direction.NORTH); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(blockSurface) + .placeNearTarget() + .text("Super Glue can be used between any two blocks") + .colored(PonderPalette.GREEN); + scene.idle(50); + + scene.world.glueBlockOnto(central.north(), Direction.SOUTH, plank); + scene.idle(20); + scene.world.modifyEntity(glueEntity, Entity::remove); + + BlockPos bearingPos = util.grid.at(2, 1, 2); + scene.world.configureCenterOfRotation(plank, util.vector.centerOf(bearingPos)); + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(plank, 0, 360, 0, 80); + scene.idle(30); + scene.overlay.showText(80) + .attachKeyFrame() + .pointAt(util.vector.topOf(central)) + .placeNearTarget() + .text("The attached blocks will move together when assembled into a Contraption"); + scene.idle(90); + + scene.overlay.showText(50) + .attachKeyFrame() + .pointAt(util.vector.topOf(central)) + .placeNearTarget() + .text("Whenever Super Glue is held in the off-hand..."); + scene.idle(60); + + scene.world.glueBlockOnto(central.south(), Direction.NORTH, plank); + scene.idle(5); + scene.world.glueBlockOnto(central.north() + .east(), Direction.WEST, plank); + scene.idle(5); + scene.world.glueBlockOnto(central.up(), Direction.DOWN, plank); + scene.idle(5); + scene.world.glueBlockOnto(central.south() + .west(), Direction.EAST, plank); + scene.idle(10); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(central) + .subtract(.5, 0, 0)) + .placeNearTarget() + .text("...added blocks will be glued to the face they were placed on automatically"); + scene.idle(90); + + scene.world.rotateBearing(bearingPos, 360, 80); + scene.world.rotateSection(plank, 0, 360, 0, 80); + scene.idle(90); + + glueEntity = scene.world.createGlueEntity(central, Direction.UP); + scene.world.destroyBlock(central.up()); + scene.idle(20); + scene.addKeyframe(); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(central), Pointing.DOWN).leftClick(), 40); + scene.idle(7); + scene.world.modifyEntity(glueEntity, Entity::remove); + scene.effects.superGlue(central, Direction.UP, false); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(util.vector.topOf(central)) + .placeNearTarget() + .text("Super Glue can be removed with Left-Click"); + } + +} 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 1f37322eb..0cb80253f 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 @@ -84,7 +84,6 @@ public class DebugScenes { scene.overlay.showSelectionWithText(zAxis, 20) .colored(PonderPalette.BLUE) .text("Das Z axis"); - scene.idle(10); } public static void blocksScene(SceneBuilder scene, SceneBuildingUtil util) { 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 67b6c5e68..d536dfce7 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 @@ -77,6 +77,17 @@ public class PonderIndex { .addStoryBoard("funnels/transposer", FunnelScenes::transposer); PonderRegistry.addStoryBoard(AllBlocks.ANDESITE_FUNNEL, "funnels/brass", FunnelScenes::brass); + // Chassis & Super Glue + PonderRegistry.forComponents(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) + .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup) + .addStoryBoard("chassis/linear_attachment", ChassisScenes::linearAttachement); + PonderRegistry.forComponents(AllBlocks.RADIAL_CHASSIS) + .addStoryBoard("chassis/radial", ChassisScenes::radial); + PonderRegistry.forComponents(AllItems.SUPER_GLUE) + .addStoryBoard("super_glue", ChassisScenes::superGlue); + PonderRegistry.forComponents(AllBlocks.STICKER) + .addStoryBoard("sticker", RedstoneScenes::sticker); + // Mechanical Piston PonderRegistry.forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) .addStoryBoard("mechanical_piston/anchor", PistonScenes::movement, PonderTag.KINETIC_APPLIANCES, @@ -128,6 +139,8 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, PonderTag.CONTRAPTION_ACTOR) .addStoryBoard("portable_interface/redstone", MovementActorScenes::psiRedstone); + PonderRegistry.forComponents(AllBlocks.REDSTONE_CONTACT) + .addStoryBoard("redstone_contact", RedstoneScenes::contact); // 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/RedstoneScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java new file mode 100644 index 000000000..c707e191b --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java @@ -0,0 +1,169 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; +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 net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; + +public class RedstoneScenes { + + public static void sticker(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("sticker", "Attaching blocks using the Sticker"); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + scene.idle(5); + + Selection redstone = util.select.fromTo(0, 2, 2, 2, 2, 2); + BlockPos stickerPos = util.grid.at(2, 2, 2); + Selection stickerSelect = util.select.position(stickerPos); + BlockPos buttonPos = util.grid.at(0, 2, 2); + BlockPos bearingPos = util.grid.at(2, 1, 2); + + scene.world.showSection(util.select.fromTo(2, 1, 2, 0, 2, 2) + .substract(stickerSelect), Direction.DOWN); + scene.idle(10); + ElementLink sticker = scene.world.showIndependentSection(stickerSelect, Direction.DOWN); + scene.idle(10); + ElementLink plank = + scene.world.showIndependentSection(util.select.position(2, 2, 1), Direction.SOUTH); + scene.world.configureCenterOfRotation(sticker, util.vector.centerOf(stickerPos)); + scene.world.configureCenterOfRotation(plank, util.vector.centerOf(stickerPos)); + scene.overlay.showText(60) + .text("Stickers are ideal for Redstone-controlled block attachment") + .attachKeyFrame() + .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.world.modifyBlock(stickerPos, s -> s.with(StickerBlock.EXTENDED, true), false); + scene.effects.indicateRedstone(buttonPos); + scene.world.modifyTileNBT(stickerSelect, StickerTileEntity.class, nbt -> { + }); + scene.idle(20); + + scene.world.toggleRedstonePower(redstone); + scene.idle(20); + + scene.overlay.showText(60) + .text("Upon receiving a signal, it will toggle its state") + .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.world.rotateBearing(bearingPos, 180 * 3, 80); + scene.world.rotateSection(sticker, 0, 180 * 3, 0, 80); + scene.world.rotateSection(plank, 0, 180 * 3, 0, 80); + scene.overlay.showText(70) + .text("If it is now moved in a contraption, the block will move with it") + .pointAt(util.vector.topOf(stickerPos)) + .placeNearTarget(); + scene.idle(90); + scene.addKeyframe(); + + scene.world.toggleRedstonePower(redstone); + scene.world.modifyBlock(stickerPos, s -> s.with(StickerBlock.EXTENDED, false), false); + scene.effects.indicateRedstone(buttonPos); + scene.world.modifyTileNBT(stickerSelect, StickerTileEntity.class, nbt -> { + }); + scene.idle(20); + + scene.world.toggleRedstonePower(redstone); + scene.idle(20); + + scene.overlay.showText(60) + .text("Toggled once again, the block is no longer attached") + .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) + .placeNearTarget(); + scene.idle(70); + + scene.world.rotateBearing(bearingPos, 180 * 3, 80); + scene.world.rotateSection(sticker, 0, 180 * 3, 0, 80); + } + + public static void contact(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("redstone_contact", "Redstone Contacts"); + scene.configureBasePlate(0, 0, 5); + scene.showBasePlate(); + scene.idle(5); + Selection contactAndRedstone = util.select.fromTo(1, 1, 0, 1, 1, 2); + Selection topContact = util.select.position(1, 2, 2); + + scene.world.toggleRedstonePower(contactAndRedstone); + scene.world.toggleRedstonePower(topContact); + scene.world.showSection(contactAndRedstone, Direction.DOWN); + + BlockPos bearingPos = util.grid.at(3, 1, 2); + scene.idle(25); + + ElementLink contact = scene.world.showIndependentSection(topContact, Direction.DOWN); + scene.idle(10); + scene.world.toggleRedstonePower(topContact); + scene.world.toggleRedstonePower(contactAndRedstone); + scene.effects.indicateRedstone(util.grid.at(1, 1, 2)); + scene.idle(10); + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.of(1, 2, 2.5)) + .text("Redstone Contacts facing each other will emit a redstone signal"); + scene.idle(70); + + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.fromTo(2, 2, 2, 4, 2, 2), Direction.DOWN, contact); + scene.idle(10); + scene.effects.superGlue(util.grid.at(1, 2, 2), Direction.EAST, true); + scene.world.configureCenterOfRotation(contact, util.vector.centerOf(bearingPos)); + + int speed = 2; + + scene.idle(10); + scene.world.rotateBearing(bearingPos, 10, speed); + scene.world.rotateSection(contact, 0, 10, 0, speed); + scene.idle(speed); + + scene.world.toggleRedstonePower(topContact); + scene.world.toggleRedstonePower(contactAndRedstone); + scene.effects.indicateRedstone(util.grid.at(1, 1, 2)); + scene.world.rotateBearing(bearingPos, 340, 34 * speed); + scene.world.rotateSection(contact, 0, 340, 0, 34 * speed); + scene.addKeyframe(); + scene.idle(34 * speed); + + scene.overlay.showText(100) + .placeNearTarget() + .pointAt(util.vector.of(1, 1.5, 2.5)) + .text("This still applies when one of them is part of a moving Contraption"); + + for (int i = 0; i < 5; i++) { + scene.world.toggleRedstonePower(topContact); + scene.world.toggleRedstonePower(contactAndRedstone); + scene.effects.indicateRedstone(util.grid.at(1, 1, 2)); + scene.world.rotateBearing(bearingPos, 20, 2 * speed); + scene.world.rotateSection(contact, 0, 20, 0, 2 * speed); + scene.idle(2 * speed); + + scene.world.toggleRedstonePower(topContact); + scene.world.toggleRedstonePower(contactAndRedstone); + scene.world.rotateBearing(bearingPos, 340, 34 * speed); + scene.world.rotateSection(contact, 0, 340, 0, 34 * speed); + scene.idle(34 * speed); + + if (i == 0) + scene.markAsFinished(); + } + + scene.world.toggleRedstonePower(topContact); + scene.world.toggleRedstonePower(contactAndRedstone); + scene.world.rotateBearing(bearingPos, 10, speed); + scene.world.rotateSection(contact, 0, 10, 0, speed); + } + +} diff --git a/src/main/resources/ponder/chassis/linear_attachment.nbt b/src/main/resources/ponder/chassis/linear_attachment.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f7ef01bc6033950d8639aa4b0d1300a7c0a18b9a GIT binary patch literal 548 zcmV+<0^9u`iwFP!000000JWCOZrd;rMMorMJ%YAbv_SF~U1wJy>!4`RYz11T9l|sz zh&1x}uzp`jTe1~Jkq5O(gRtSbbLNs73d{jAU{<~g3IJioe&*pjgH&iIofHjBS$+gF zD1yU~9NN>+0ZrD^e6)6gcjdM$|f`p$JW=HAB=o zrJ+bpdP36m-f7;z2zpI5;Mn3*SuawxwlV4k{ zrCz~1Bd|Ae-5A*jZ$-#6)+45qbaa=P`A<@DC7cuCx{{~B?)XN))kbPj)_m!1o*tzWMQOCB`=nO!^{BAg zJQce;&msEd7+opvW+=_@bx|p<*VeBq|5=+#)ZrGD!YAuwxqd0;#yPVA=IX8R0RHS3 z6+QcHXyVRP5HGp1M_b>TJy5<3uZwmodIe@nUWW5Uw$&kX>6h^K8U9lN-}blM@dr^`X|(V9Kkye&CEW~{3jhGC@CHu+ literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/chassis/linear_group.nbt b/src/main/resources/ponder/chassis/linear_group.nbt new file mode 100644 index 0000000000000000000000000000000000000000..cfde348fbf7183071035303c93f548ab6ebf0308 GIT binary patch literal 474 zcmV<00VVz)iwFP!000000JW9hYTGar#*ZaAaa=Zb(ZO~#*kkl=(Cac*)?1?}C#|R= z8A+jk9&FDyIhE7ky5@{z2Mlra>32STmQW3_01@;vascR_vVRs(p^Z9f4A9jAW=rGL zeW=sR_XY6Qg?`e$IFupEhM-^u-7{ zGeXW&98TZ}0%!jz2sv{?&Qlyt;0OYzFG0vz5OSX4Z~{k+a%$jq89AI?EANcCk!ITs z%qw7e1s|2iq`XjfG6Wq)x_0gkcN@#Z63XiqaRoakpRUr+u>0e8yGqI;jsLK>24BYK zzqZzDdkb%jz>ATu*~kWy6|0pr%@U>Wro2t780;qg-YP4~Dj`!3iQ=f-iV-3^ipWk* zNV*goIn)N)p*t*~SbvplTGzXZ0@aive0I07#T{9@q1Qir|sK*Q@OKr=Y zpT~!9GvJl=DXASCavx;CCZo$_15DOq7(s^!0>cT6ATVh#g2x!aV`Dm;pd$!6sfUcP_c4Ygj?f=Y@E9j}Y)pp} zbOb>s^@kHYHpXxQBM1y6y$-_%>bb_GAqZX-1h04Mn89QD|aX{0dtuDbhbiQpLPnEtYulhe0HeX+!2rTvTuA) zA#tt{6}?7YXSQoK zYe%-D6dsJ{!};2cQa891OHtzZKff8zOq?7b18T%CBmmG|$#l;kMQMc)Y>*ltSJ*?2BuzRaM=vs_7R~h(!tS zxkhJpc|?9-QgBukJ7l^uc^LPyKj;|K19&>XUyX2wHbxjvwwB$LJc~#?#Lcsa)Jyb# zIrCF&`-o}rMq-u-) z#CIFbziCyY?tTWTW2+Xm>lA8rgDGtGjCXa7oB9O07zBp~e)qH3DQneniiom%SH0*yg?wDMs)l6GDs#@;+tEqo(#Lc$)qLH-!1%8o zC^BP#N|&S5HH2#Hq5Hj;-ApRo&4xAF;!M~V0pgFJ&KW;9!YS#k(D)Ayhne5u=f692 a-`7`W*$rwVlyu$w8~y<3JZl`b2mk=L(fdXK literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/sticker.nbt b/src/main/resources/ponder/sticker.nbt new file mode 100644 index 0000000000000000000000000000000000000000..92063f49724377ccc8fcbf2407644de484687f96 GIT binary patch literal 530 zcmV+t0`2`DiwFP!000000F9N;j+-zL#s_Q?!b(+DRo(5akI?hpD)qdoy6Rq$A(O<4 zVp=Juv6R|U6wG|{oAG=CGJqX$Cx0UYfcBRR|2s%gd+8-QXx9!lg)-&Y zWwiOU16CO~B#nzf;=J(KXWVL{1x+;5!~q-@z~KR$VMQyPXhAdQ!~q-@z~KR$VZ{M+ zjsxbr#$f>*9>9UVr&~?D(DVN^qoo0Uu>il;I4pp}131It0eM@V!4NprA116 zykL0}T9!iP1q$1yygu99d)D`KMZM`!&dc(Qb|F8W<@0}NZlA4W!K*oEv*6WSvn9>8 z5(>S?_SKlCz@Nkg;o%}RmR216V{?)o^U`QK2_+4R_mjeD)8yUzb&P)Kk1g~bU6(Ih zJH8CEZ`M?3+gEc6n}aCZ+i_iusVl>uWp69fpe5IngHR49T%wKjr<6VdKRr?hgJP^P zcVz~?Yba=yIUaA|-2bYOz9Ytaa~VnRrZE_C&Ycp)oW`juB#bh~t~KpU?N8GLCvYKc zdCH5L3hP&J6wU+JMiZ(>47+X$!;UxD3Z2}yp{@ytK9A+@r*hPsqe_@J(qj9Jd=*~2 UpmmbUL;45)0_7bYYfRzlCd9(n z2s_GdAFR*UA%Sc}STvR_e&)=_jE`k9fDK5m|DphZekL?!f89WeHt3+yLq9gKDvT>@ zpV7nj4T#qHG3hb{BtEEsL&mixn$biPP0Zj321hbDRd9LeB}eZ`Ev1j8@E@N0=97#zvqM8o&4HR7G#1*3P#@KiE9UE&A^ zN6vCG5Vi;jBu_2k7EXDe9_iMfUi@jdq>NIC^%lOA9n#Z-*G+3MueHUX%b8N9+g&n0 zL-8NBGI)-!e;=&Xwj$)+Q`tFVo|QSAg6Dd^4fQlw?v>T0GI@cj>r-x*Fq&-DWT@!| zo}S?!2RNa<*M5d5Cd3tK)~zxa0`}+aItBTt8icP6tyI~mU3fU|b-=uImgtl;Dn7p{ zymiO?bZE~-ovQQJC|mnW^!_bcI9K~UnjQ6){pwtcUH>ac;qFK!cE(i|Eq=07#v`Sx z7wRi|xsXPGjq0kt$m+O9G*i}Ur^ Date: Sat, 13 Mar 2021 20:45:24 -0800 Subject: [PATCH 104/124] Lieutenant Scatterbrain. - User no longer has to manually add instances, new hook instead. - Use registrate for InstanceFactories. - Instanced levers. - Instanced hand cranks. - Reorganize PhysicalFloat and LerpedFloat. --- .../com/simibubi/create/AllTileEntities.java | 88 ++++++----- .../base/BackHalfShaftInstance.java | 5 - .../contraptions/base/HalfShaftInstance.java | 5 - .../base/HorizontalHalfShaftInstance.java | 4 - .../contraptions/base/KineticTileEntity.java | 8 - .../base/ShaftlessCogInstance.java | 4 - .../base/SingleRotatingInstance.java | 4 - .../components/actors/DrillInstance.java | 3 - .../PortableStorageInterfaceTileEntity.java | 2 +- .../crafter/MechanicalCrafterInstance.java | 4 - .../components/crank/HandCrankInstance.java | 78 ++++++++++ .../components/crank/HandCrankRenderer.java | 3 + .../components/fan/FanInstance.java | 4 - .../components/flywheel/FlyWheelInstance.java | 4 - .../flywheel/engine/EngineInstance.java | 4 - .../flywheel/engine/EngineTileEntity.java | 12 -- .../millstone/MillStoneCogInstance.java | 3 - .../components/mixer/MixerInstance.java | 4 - .../components/press/PressInstance.java | 4 - .../components/saw/SawInstance.java | 4 - .../chassis/StickerInstance.java | 4 - .../chassis/StickerTileEntity.java | 9 +- .../gantry/GantryCarriageInstance.java | 4 - .../contraptions/fluids/PipeConnection.java | 2 +- .../contraptions/fluids/PumpCogInstance.java | 4 - .../contraptions/fluids/PumpTileEntity.java | 4 +- .../fluids/actors/HosePulleyTileEntity.java | 2 +- .../fluids/pipes/FluidValveTileEntity.java | 4 +- .../TransparentStraightPipeRenderer.java | 2 +- .../processing/BasinTileEntity.java | 4 +- .../burner/BlazeBurnerTileEntity.java | 4 +- .../relays/belt/BeltInstance.java | 4 - .../relays/belt/BeltTileEntity.java | 4 +- .../belt/transport/BeltMovementHandler.java | 7 +- .../relays/encased/ShaftInstance.java | 5 - .../relays/encased/SplitShaftInstance.java | 4 - .../relays/gearbox/GearboxInstance.java | 4 - .../belts/tunnel/BeltTunnelInstance.java | 5 +- .../belts/tunnel/BeltTunnelTileEntity.java | 7 - .../block/funnel/FunnelInstance.java | 4 - .../block/funnel/FunnelTileEntity.java | 12 -- .../block/mechanicalArm/ArmInstance.java | 6 +- .../block/mechanicalArm/ArmTileEntity.java | 14 +- .../block/redstone/AnalogLeverInstance.java | 93 +++++++++++ .../block/redstone/AnalogLeverRenderer.java | 4 + .../block/redstone/AnalogLeverTileEntity.java | 10 +- .../block/redstone/StockpileSwitchScreen.java | 4 +- .../block/SchematicannonInstance.java | 4 - .../block/SchematicannonTileEntity.java | 12 -- .../foundation/data/CreateRegistrate.java | 18 ++- .../data/CreateTileEntityBuilder.java | 57 +++++++ .../foundation/gui/AbstractSimiScreen.java | 2 +- .../create/foundation/gui/ScreenOpener.java | 2 +- ...TileMixin.java => AddRemoveTileMixin.java} | 8 +- .../foundation/mixin/LightUpdateMixin.java | 11 +- .../foundation/ponder/PonderProgressBar.java | 2 +- .../create/foundation/ponder/PonderScene.java | 2 +- .../ponder/PonderTooltipHandler.java | 3 +- .../create/foundation/ponder/PonderUI.java | 4 +- .../elements/AnimatedOverlayElement.java | 2 +- .../ponder/elements/AnimatedSceneElement.java | 2 +- .../instructions/RotateSceneInstruction.java | 2 +- .../foundation/ponder/ui/PonderButton.java | 2 +- .../backend/instancing/IInstanceRendered.java | 4 +- .../instancing/InstancedTileRenderer.java | 10 ++ .../instancing/TileEntityInstance.java | 12 ++ .../fluid/SmartFluidTankBehaviour.java | 4 +- .../scrollvalue/ScrollValueHandler.java | 8 +- .../foundation/utility/PhysicalFloat.java | 147 ------------------ .../foundation/utility/animation/Force.java | 84 ++++++++++ .../utility/{ => animation}/LerpedFloat.java | 3 +- .../utility/animation/PhysicalFloat.java | 80 ++++++++++ src/main/resources/create.mixins.json | 2 +- 73 files changed, 558 insertions(+), 406 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java create mode 100644 src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java create mode 100644 src/main/java/com/simibubi/create/foundation/data/CreateTileEntityBuilder.java rename src/main/java/com/simibubi/create/foundation/mixin/{OnRemoveTileMixin.java => AddRemoveTileMixin.java} (81%) delete mode 100644 src/main/java/com/simibubi/create/foundation/utility/PhysicalFloat.java create mode 100644 src/main/java/com/simibubi/create/foundation/utility/animation/Force.java rename src/main/java/com/simibubi/create/foundation/utility/{ => animation}/LerpedFloat.java (96%) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 2951cb835..f65fa76ea 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.clock.CuckooClockTile import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterInstance; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterRenderer; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity; +import com.simibubi.create.content.contraptions.components.crank.HandCrankInstance; import com.simibubi.create.content.contraptions.components.crank.HandCrankRenderer; import com.simibubi.create.content.contraptions.components.crank.HandCrankTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity; @@ -119,9 +120,9 @@ public class AllTileEntities { // Schematics public static final TileEntityEntry SCHEMATICANNON = Create.registrate() .tileEntity("schematicannon", SchematicannonTileEntity::new) + .instance(() -> SchematicannonInstance::new) .validBlocks(AllBlocks.SCHEMATICANNON) .renderer(() -> SchematicannonRenderer::new) - .onRegister(SchematicannonInstance::register) .register(); public static final TileEntityEntry SCHEMATIC_TABLE = Create.registrate() @@ -132,44 +133,44 @@ public class AllTileEntities { // Kinetics public static final TileEntityEntry SIMPLE_KINETIC = Create.registrate() .tileEntity("simple_kinetic", SimpleKineticTileEntity::new) + .instance(() -> SingleRotatingInstance::new) .validBlocks(AllBlocks.SHAFT, AllBlocks.COGWHEEL, AllBlocks.LARGE_COGWHEEL) .renderer(() -> KineticTileEntityRenderer::new) - .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry MOTOR = Create.registrate() .tileEntity("motor", CreativeMotorTileEntity::new) + .instance(() -> HalfShaftInstance::new) .validBlocks(AllBlocks.CREATIVE_MOTOR) .renderer(() -> CreativeMotorRenderer::new) - .onRegister(HalfShaftInstance::register) .register(); public static final TileEntityEntry GEARBOX = Create.registrate() .tileEntity("gearbox", GearboxTileEntity::new) + .instance(() -> GearboxInstance::new) .validBlocks(AllBlocks.GEARBOX) .renderer(() -> GearboxRenderer::new) - .onRegister(GearboxInstance::register) .register(); public static final TileEntityEntry ENCASED_SHAFT = Create.registrate() .tileEntity("encased_shaft", EncasedShaftTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.ANDESITE_ENCASED_SHAFT, AllBlocks.BRASS_ENCASED_SHAFT, AllBlocks.ENCASED_CHAIN_DRIVE) .renderer(() -> EncasedShaftRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry ADJUSTABLE_PULLEY = Create.registrate() .tileEntity("adjustable_pulley", AdjustablePulleyTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .renderer(() -> EncasedShaftRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry ENCASED_FAN = Create.registrate() .tileEntity("encased_fan", EncasedFanTileEntity::new) + .instance(() -> FanInstance::new) .validBlocks(AllBlocks.ENCASED_FAN) .renderer(() -> EncasedFanRenderer::new) - .onRegister(FanInstance::register) .register(); public static final TileEntityEntry NOZZLE = Create.registrate() @@ -180,59 +181,59 @@ public class AllTileEntities { public static final TileEntityEntry CLUTCH = Create.registrate() .tileEntity("clutch", ClutchTileEntity::new) + .instance(() -> SplitShaftInstance::new) .validBlocks(AllBlocks.CLUTCH) .renderer(() -> SplitShaftRenderer::new) - .onRegister(SplitShaftInstance::register) .register(); public static final TileEntityEntry GEARSHIFT = Create.registrate() .tileEntity("gearshift", GearshiftTileEntity::new) + .instance(() -> SplitShaftInstance::new) .validBlocks(AllBlocks.GEARSHIFT) .renderer(() -> SplitShaftRenderer::new) - .onRegister(SplitShaftInstance::register) .register(); public static final TileEntityEntry TURNTABLE = Create.registrate() .tileEntity("turntable", TurntableTileEntity::new) + .instance(() -> SingleRotatingInstance::new) .validBlocks(AllBlocks.TURNTABLE) .renderer(() -> KineticTileEntityRenderer::new) - .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry HAND_CRANK = Create.registrate() .tileEntity("hand_crank", HandCrankTileEntity::new) + .instance(() -> HandCrankInstance::new) .validBlocks(AllBlocks.HAND_CRANK, AllBlocks.COPPER_VALVE_HANDLE) .validBlocks(AllBlocks.DYED_VALVE_HANDLES) .renderer(() -> HandCrankRenderer::new) - .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry CUCKOO_CLOCK = Create.registrate() .tileEntity("cuckoo_clock", CuckooClockTileEntity::new) + .instance(() -> HorizontalHalfShaftInstance::new) .validBlocks(AllBlocks.CUCKOO_CLOCK, AllBlocks.MYSTERIOUS_CUCKOO_CLOCK) .renderer(() -> CuckooClockRenderer::new) - .onRegister(HorizontalHalfShaftInstance::register) .register(); public static final TileEntityEntry GANTRY_SHAFT = Create.registrate() .tileEntity("gantry_shaft", GantryShaftTileEntity::new) + .instance(() -> SingleRotatingInstance::new) .validBlocks(AllBlocks.GANTRY_SHAFT) .renderer(() -> KineticTileEntityRenderer::new) - .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry GANTRY_PINION = Create.registrate() .tileEntity("gantry_pinion", GantryCarriageTileEntity::new) + .instance(() -> GantryCarriageInstance::new) .validBlocks(AllBlocks.GANTRY_CARRIAGE) .renderer(() -> GantryCarriageRenderer::new) - .onRegister(GantryCarriageInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PUMP = Create.registrate() .tileEntity("mechanical_pump", PumpTileEntity::new) + .instance(() -> PumpCogInstance::new) .validBlocks(AllBlocks.MECHANICAL_PUMP) .renderer(() -> PumpRenderer::new) - .onRegister(PumpCogInstance::register) .register(); public static final TileEntityEntry SMART_FLUID_PIPE = Create.registrate() @@ -259,9 +260,9 @@ public class AllTileEntities { public static final TileEntityEntry FLUID_VALVE = Create.registrate() .tileEntity("fluid_valve", FluidValveTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.FLUID_VALVE) .renderer(() -> FluidValveRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry FLUID_TANK = Create.registrate() @@ -278,9 +279,9 @@ public class AllTileEntities { public static final TileEntityEntry HOSE_PULLEY = Create.registrate() .tileEntity("hose_pulley", HosePulleyTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.HOSE_PULLEY) .renderer(() -> HosePulleyRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry SPOUT = Create.registrate() @@ -297,9 +298,9 @@ public class AllTileEntities { public static final TileEntityEntry BELT = Create.registrate() .tileEntity("belt", BeltTileEntity::new) + .instance(() -> BeltInstance::new) .validBlocks(AllBlocks.BELT) .renderer(() -> BeltRenderer::new) - .onRegister(BeltInstance::register) .register(); public static final TileEntityEntry CHUTE = Create.registrate() @@ -316,58 +317,58 @@ public class AllTileEntities { public static final TileEntityEntry ANDESITE_TUNNEL = Create.registrate() .tileEntity("andesite_tunnel", BeltTunnelTileEntity::new) + .instance(() -> BeltTunnelInstance::new) .validBlocks(AllBlocks.ANDESITE_TUNNEL) .renderer(() -> BeltTunnelRenderer::new) - .onRegister(BeltTunnelInstance::register) .register(); public static final TileEntityEntry BRASS_TUNNEL = Create.registrate() .tileEntity("brass_tunnel", BrassTunnelTileEntity::new) + .instance(() -> BeltTunnelInstance::new) .validBlocks(AllBlocks.BRASS_TUNNEL) .renderer(() -> BeltTunnelRenderer::new) - .onRegister(BeltTunnelInstance::register) .register(); public static final TileEntityEntry MECHANICAL_ARM = Create.registrate() .tileEntity("mechanical_arm", ArmTileEntity::new) + .instance(() -> ArmInstance::new) .validBlocks(AllBlocks.MECHANICAL_ARM) .renderer(() -> ArmRenderer::new) - .onRegister((type) -> DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> ArmInstance.register(type)))//ArmInstance line 142 -> Minecraft.getInstance().world causes ClientWorld to get loaded on the server .register(); public static final TileEntityEntry MECHANICAL_PISTON = Create.registrate() .tileEntity("mechanical_piston", MechanicalPistonTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) .renderer(() -> MechanicalPistonRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry WINDMILL_BEARING = Create.registrate() .tileEntity("windmill_bearing", WindmillBearingTileEntity::new) + .instance(() -> BackHalfShaftInstance::new) .validBlocks(AllBlocks.WINDMILL_BEARING) .renderer(() -> BearingRenderer::new) - .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry MECHANICAL_BEARING = Create.registrate() .tileEntity("mechanical_bearing", MechanicalBearingTileEntity::new) + .instance(() -> BackHalfShaftInstance::new) .validBlocks(AllBlocks.MECHANICAL_BEARING) .renderer(() -> BearingRenderer::new) - .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry CLOCKWORK_BEARING = Create.registrate() .tileEntity("clockwork_bearing", ClockworkBearingTileEntity::new) + .instance(() -> BackHalfShaftInstance::new) .validBlocks(AllBlocks.CLOCKWORK_BEARING) .renderer(() -> BearingRenderer::new) - .onRegister(BackHalfShaftInstance::register) .register(); public static final TileEntityEntry ROPE_PULLEY = Create.registrate() .tileEntity("rope_pulley", PulleyTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.ROPE_PULLEY) .renderer(() -> PulleyRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry CHASSIS = Create.registrate() @@ -378,23 +379,23 @@ public class AllTileEntities { public static final TileEntityEntry STICKER = Create.registrate() .tileEntity("sticker", StickerTileEntity::new) + .instance(() -> StickerInstance::new) .validBlocks(AllBlocks.STICKER) .renderer(() -> StickerRenderer::new) - .onRegister(StickerInstance::register) .register(); public static final TileEntityEntry DRILL = Create.registrate() .tileEntity("drill", DrillTileEntity::new) + .instance(() -> DrillInstance::new) .validBlocks(AllBlocks.MECHANICAL_DRILL) .renderer(() -> DrillRenderer::new) - .onRegister(DrillInstance::register) .register(); public static final TileEntityEntry SAW = Create.registrate() .tileEntity("saw", SawTileEntity::new) + .instance(() -> SawInstance::new) .validBlocks(AllBlocks.MECHANICAL_SAW) .renderer(() -> SawRenderer::new) - .onRegister(SawInstance::register) .register(); public static final TileEntityEntry HARVESTER = Create.registrate() @@ -418,30 +419,30 @@ public class AllTileEntities { public static final TileEntityEntry FLYWHEEL = Create.registrate() .tileEntity("flywheel", FlywheelTileEntity::new) + .instance(() -> FlyWheelInstance::new) .validBlocks(AllBlocks.FLYWHEEL) .renderer(() -> FlywheelRenderer::new) - .onRegister(FlyWheelInstance::register) .register(); public static final TileEntityEntry FURNACE_ENGINE = Create.registrate() .tileEntity("furnace_engine", FurnaceEngineTileEntity::new) + .instance(() -> EngineInstance::new) .validBlocks(AllBlocks.FURNACE_ENGINE) .renderer(() -> EngineRenderer::new) - .onRegister(EngineInstance::register) .register(); public static final TileEntityEntry MILLSTONE = Create.registrate() .tileEntity("millstone", MillstoneTileEntity::new) + .instance(() -> MillStoneCogInstance::new) .validBlocks(AllBlocks.MILLSTONE) .renderer(() -> MillstoneRenderer::new) - .onRegister(MillStoneCogInstance::register) .register(); public static final TileEntityEntry CRUSHING_WHEEL = Create.registrate() .tileEntity("crushing_wheel", CrushingWheelTileEntity::new) + .instance(() -> SingleRotatingInstance::new) .validBlocks(AllBlocks.CRUSHING_WHEEL) .renderer(() -> KineticTileEntityRenderer::new) - .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry CRUSHING_WHEEL_CONTROLLER = @@ -453,30 +454,30 @@ public class AllTileEntities { public static final TileEntityEntry WATER_WHEEL = Create.registrate() .tileEntity("water_wheel", WaterWheelTileEntity::new) + .instance(() -> SingleRotatingInstance::new) .validBlocks(AllBlocks.WATER_WHEEL) .renderer(() -> KineticTileEntityRenderer::new) - .onRegister(SingleRotatingInstance::register) .register(); public static final TileEntityEntry MECHANICAL_PRESS = Create.registrate() .tileEntity("mechanical_press", MechanicalPressTileEntity::new) + .instance(() -> PressInstance::new) .validBlocks(AllBlocks.MECHANICAL_PRESS) .renderer(() -> MechanicalPressRenderer::new) - .onRegister(PressInstance::register) .register(); public static final TileEntityEntry MECHANICAL_MIXER = Create.registrate() .tileEntity("mechanical_mixer", MechanicalMixerTileEntity::new) + .instance(() -> MixerInstance::new) .validBlocks(AllBlocks.MECHANICAL_MIXER) .renderer(() -> MechanicalMixerRenderer::new) - .onRegister(MixerInstance::register) .register(); public static final TileEntityEntry DEPLOYER = Create.registrate() .tileEntity("deployer", DeployerTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.DEPLOYER) .renderer(() -> DeployerRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry BASIN = Create.registrate() @@ -493,41 +494,42 @@ public class AllTileEntities { public static final TileEntityEntry MECHANICAL_CRAFTER = Create.registrate() .tileEntity("mechanical_crafter", MechanicalCrafterTileEntity::new) + .instance(() -> MechanicalCrafterInstance::new) .validBlocks(AllBlocks.MECHANICAL_CRAFTER) .renderer(() -> MechanicalCrafterRenderer::new) - .onRegister(MechanicalCrafterInstance::register) .register(); public static final TileEntityEntry SEQUENCED_GEARSHIFT = Create.registrate() .tileEntity("sequenced_gearshift", SequencedGearshiftTileEntity::new) + .instance(() -> SplitShaftInstance::new) .validBlocks(AllBlocks.SEQUENCED_GEARSHIFT) .renderer(() -> SplitShaftRenderer::new) - .onRegister(SplitShaftInstance::register) .register(); public static final TileEntityEntry ROTATION_SPEED_CONTROLLER = Create.registrate() .tileEntity("rotation_speed_controller", SpeedControllerTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.ROTATION_SPEED_CONTROLLER) .renderer(() -> SpeedControllerRenderer::new) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry SPEEDOMETER = Create.registrate() .tileEntity("speedometer", SpeedGaugeTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.SPEEDOMETER) .renderer(() -> GaugeRenderer::speed) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry STRESSOMETER = Create.registrate() .tileEntity("stressometer", StressGaugeTileEntity::new) + .instance(() -> ShaftInstance::new) .validBlocks(AllBlocks.STRESSOMETER) .renderer(() -> GaugeRenderer::stress) - .onRegister(ShaftInstance::register) .register(); public static final TileEntityEntry ANALOG_LEVER = Create.registrate() .tileEntity("analog_lever", AnalogLeverTileEntity::new) + .instance(() -> AnalogLeverInstance::new) .validBlocks(AllBlocks.ANALOG_LEVER) .renderer(() -> AnalogLeverRenderer::new) .register(); @@ -577,10 +579,10 @@ public class AllTileEntities { public static final TileEntityEntry FUNNEL = Create.registrate() .tileEntity("funnel", FunnelTileEntity::new) + .instance(() -> FunnelInstance::new) .validBlocks(AllBlocks.BRASS_FUNNEL, AllBlocks.BRASS_BELT_FUNNEL, AllBlocks.ANDESITE_FUNNEL, AllBlocks.ANDESITE_BELT_FUNNEL) .renderer(() -> FunnelRenderer::new) - .onRegister(FunnelInstance::register) .register(); public static final TileEntityEntry CONTENT_OBSERVER = Create.registrate() diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java index 909b380bc..8538b3411 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/BackHalfShaftInstance.java @@ -10,11 +10,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class BackHalfShaftInstance extends HalfShaftInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, BackHalfShaftInstance::new)); - } - public BackHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java index 6e70b9780..6002f3140 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HalfShaftInstance.java @@ -12,11 +12,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class HalfShaftInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, HalfShaftInstance::new)); - } - public HalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java index 958305113..af5bfec0f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/HorizontalHalfShaftInstance.java @@ -10,10 +10,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class HorizontalHalfShaftInstance extends HalfShaftInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, HorizontalHalfShaftInstance::new)); - } public HorizontalHalfShaftInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); 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 dd59c1a1c..b0b2d51f6 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 @@ -80,9 +80,6 @@ public abstract class KineticTileEntity extends SmartTileEntity } super.initialize(); - - if (world != null && world.isRemote) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); } @Override @@ -551,11 +548,6 @@ public abstract class KineticTileEntity extends SmartTileEntity } } - @Override - public void onChunkLightUpdate() { - CreateClient.kineticRenderer.onLightUpdate(this); - } - protected AxisAlignedBB cachedBoundingBox; @OnlyIn(Dist.CLIENT) public AxisAlignedBB getRenderBoundingBox() { diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java index 9c7e9ebee..66ae7c750 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/ShaftlessCogInstance.java @@ -10,10 +10,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class ShaftlessCogInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, ShaftlessCogInstance::new)); - } public ShaftlessCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index 10f342f0a..a84f620b6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -14,10 +14,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class SingleRotatingInstance extends KineticTileInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, SingleRotatingInstance::new)); - } protected InstanceKey rotatingModelKey; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index e19a70e74..72b85d279 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -17,9 +17,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class DrillInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, DrillInstance::new)); } public DrillInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); 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 9ea1408a7..37f2f9743 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 @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Con import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.entity.Entity; import net.minecraft.nbt.CompoundNBT; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java index 5313cdbef..3cdf21954 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterInstance.java @@ -18,10 +18,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class MechanicalCrafterInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, MechanicalCrafterInstance::new)); - } public MechanicalCrafterInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java new file mode 100644 index 000000000..cb5240516 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankInstance.java @@ -0,0 +1,78 @@ +package com.simibubi.create.content.contraptions.components.crank; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.SingleRotatingInstance; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverInstance; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.block.Block; +import net.minecraft.state.properties.BlockStateProperties; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class HandCrankInstance extends SingleRotatingInstance implements ITickableInstance { + + private InstanceKey crank; + private Direction facing; + + public HandCrankInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + super.init(); + + Block block = lastState.getBlock(); + AllBlockPartials renderedHandle = null; + if (block instanceof HandCrankBlock) + renderedHandle = ((HandCrankBlock) block).getRenderedHandle(); + if (renderedHandle == null) + return; + + facing = lastState.get(BlockStateProperties.FACING); + InstancedModel model = renderedHandle.renderOnDirectionalSouthModel(modelManager, lastState, facing.getOpposite()); + crank = model.createInstance(); + + updateLight(); + } + + @Override + public void tick() { + if (crank == null) return; + + HandCrankTileEntity crankTile = (HandCrankTileEntity) tile; + + Direction.Axis axis = facing.getAxis(); + float angle = (crankTile.independentAngle + AnimationTickHolder.getPartialTicks() * crankTile.chasingVelocity) / 360; + + MatrixStack ms = new MatrixStack(); + MatrixStacker.of(ms) + .translate(getFloatingPos()) + .centre() + .rotate(Direction.getFacingFromAxis(Direction.AxisDirection.POSITIVE, axis), angle) + .unCentre(); + + crank.getInstance().setTransformNoCopy(ms); + } + + @Override + public void remove() { + super.remove(); + if (crank != null) crank.delete(); + } + + @Override + public void updateLight() { + super.updateLight(); + if (crank != null) relight(pos, crank.getInstance()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java index ea2fbbda4..cf56281a5 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crank/HandCrankRenderer.java @@ -8,6 +8,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -26,6 +27,8 @@ public class HandCrankRenderer extends KineticTileEntityRenderer { int light, int overlay) { super.renderSafe(te, partialTicks, ms, buffer, light, overlay); + if (FastRenderDispatcher.available(te.getWorld())) return; + BlockState state = te.getBlockState(); Block block = state.getBlock(); AllBlockPartials renderedHandle = null; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java index 5e2aa0f7c..77f819913 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/fan/FanInstance.java @@ -20,10 +20,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class FanInstance extends KineticTileInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, FanInstance::new)); - } protected InstanceKey shaft; protected InstanceKey fan; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index 267e05572..0e8ff918d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -30,10 +30,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class FlyWheelInstance extends KineticTileInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, FlyWheelInstance::new)); - } protected Direction facing; protected boolean connectedLeft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java index dcffdd401..297016881 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java @@ -20,10 +20,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class EngineInstance extends TileEntityInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, EngineInstance::new)); - } protected InstanceKey frame; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java index b14e7e47e..c2004404a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineTileEntity.java @@ -104,16 +104,4 @@ public class EngineTileEntity extends SmartTileEntity implements IInstanceRender poweredWheel.setRotation(appliedSpeed, appliedCapacity); } - @Override - public void onChunkLightUpdate() { - CreateClient.kineticRenderer.onLightUpdate(this); - } - - @Override - public void initialize() { - super.initialize(); - - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); - } - } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java index 8bc4b2541..64f667c1b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/millstone/MillStoneCogInstance.java @@ -13,9 +13,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class MillStoneCogInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, MillStoneCogInstance::new)); } public MillStoneCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java index 4beadc933..0f49c8eb6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java @@ -21,10 +21,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class MixerInstance extends ShaftlessCogInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, MixerInstance::new)); - } private InstanceKey mixerHead; private InstanceKey mixerPole; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java index 53084bef4..8c4c1b89e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java @@ -18,10 +18,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class PressInstance extends ShaftInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, PressInstance::new)); - } private InstanceKey pressHead; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java index 5771f4ec5..7cff62d3a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/saw/SawInstance.java @@ -17,10 +17,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class SawInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, SawInstance::new)); - } public SawInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java index 4f5becd7c..b8ea44bf2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -16,10 +16,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class StickerInstance extends TileEntityInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, StickerInstance::new)); - } float lastOffset = Float.NaN; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java index 8d0886951..7a706797d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerTileEntity.java @@ -10,8 +10,8 @@ import com.simibubi.create.content.contraptions.components.structureMovement.glu import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.block.BlockState; import net.minecraft.client.Minecraft; @@ -43,7 +43,6 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende if (!world.isRemote) return; piston.startWithValue(isBlockStateExtended() ? 1 : 0); - CreateClient.kineticRenderer.add(this); } public boolean isBlockStateExtended() { @@ -94,8 +93,4 @@ public class StickerTileEntity extends SmartTileEntity implements IInstanceRende 0.35F, attach ? 0.75F : 0.2f); } - @Override - public void onChunkLightUpdate() { - CreateClient.kineticRenderer.onLightUpdate(this); - } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index c6d2b13a3..0d86bdd9a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -23,10 +23,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class GantryCarriageInstance extends ShaftInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, GantryCarriageInstance::new)); - } private InstanceKey gantryCogs; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java index efded06cf..507eefc09 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PipeConnection.java @@ -10,7 +10,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java index e4b699c89..b65306165 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpCogInstance.java @@ -13,10 +13,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class PumpCogInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, PumpCogInstance::new)); - } public PumpCogInstance(InstancedTileRenderer modelManager, KineticTileEntity tile) { super(modelManager, tile); diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java index 821d5f4ca..c57d228e8 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/PumpTileEntity.java @@ -19,8 +19,8 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.BlockFace; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.Pair; import net.minecraft.block.BlockState; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java index 5745d4c1d..0fd820231 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/actors/HosePulleyTileEntity.java @@ -6,7 +6,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import net.minecraft.nbt.CompoundNBT; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java index 72e0d86bf..90ac9dd51 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveTileEntity.java @@ -6,8 +6,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.fluids.pipes.StraightPipeTileEntity.StraightPipeFluidTransportBehaviour; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java index 243cc52d7..5fc575317 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/TransparentStraightPipeRenderer.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.fluid.FluidRenderer; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java index 726f9fdc0..541ecbb6e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/BasinTileEntity.java @@ -30,8 +30,8 @@ import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.IntAttached; import com.simibubi.create.foundation.utility.Iterate; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; diff --git a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java index c422b9699..611c523be 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/processing/burner/BlazeBurnerTileEntity.java @@ -10,8 +10,8 @@ import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; 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.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.Minecraft; import net.minecraft.client.entity.player.ClientPlayerEntity; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index 50b15124a..c318d18ed 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -26,10 +26,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class BeltInstance extends KineticTileInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, BeltInstance::new)); - } private boolean upward; private boolean diagonal; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java index a55c23825..49f3725d2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltTileEntity.java @@ -23,6 +23,7 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.ItemHandle import com.simibubi.create.content.contraptions.relays.belt.transport.TransportedItemStack; import com.simibubi.create.content.logistics.block.belts.tunnel.BrassTunnelTileEntity; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; +import com.simibubi.create.foundation.render.backend.light.ILightListener; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.DirectBeltInputBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.belt.TransportedItemStackHandlerBehaviour; @@ -56,7 +57,7 @@ import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -public class BeltTileEntity extends KineticTileEntity { +public class BeltTileEntity extends KineticTileEntity implements ILightListener { public Map passengers; public Optional color; @@ -515,7 +516,6 @@ public class BeltTileEntity extends KineticTileEntity { @Override public void onChunkLightUpdate() { - super.onChunkLightUpdate(); updateLight(); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java index 5902bb44a..864c58572 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/transport/BeltMovementHandler.java @@ -133,11 +133,12 @@ public class BeltMovementHandler { movement = movement.add(0, -Math.abs(axis.getCoordinate(movement.x, movement.y, movement.z)), 0); Vec3d centering = new Vec3d(centeringDirection).scale(diffCenter * Math.min(Math.abs(movementSpeed), .1f) * 4); - movement = movement.add(centering); - float step = entityIn.stepHeight; - if (!isPlayer) + + if (!isPlayer) { + movement = movement.add(centering); entityIn.stepHeight = 1; + } // Entity Collisions if (Math.abs(movementSpeed) < .5f) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java index de4093d09..9805e7f05 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/ShaftInstance.java @@ -12,11 +12,6 @@ import net.minecraftforge.fml.DistExecutor; public class ShaftInstance extends SingleRotatingInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, ShaftInstance::new)); - } - public ShaftInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { super(dispatcher, tile); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index be7574bbc..8547400b6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -19,10 +19,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class SplitShaftInstance extends KineticTileInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, SplitShaftInstance::new)); - } protected ArrayList> keys; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 9be02d612..60c4ec81f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -21,10 +21,6 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.fml.DistExecutor; public class GearboxInstance extends KineticTileInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, GearboxInstance::new)); - } protected EnumMap> keys; protected Direction sourceFacing; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java index b22a8437c..31b3dd558 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelInstance.java @@ -18,10 +18,7 @@ import java.util.EnumMap; import java.util.Map; public class BeltTunnelInstance extends TileEntityInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, BeltTunnelInstance::new)); - } + private Map>> tunnelFlaps; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index c6e805287..943b9eb69 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -154,8 +154,6 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe public void initialize() { super.initialize(); updateTunnelConnections(); - if (world != null && world.isRemote) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); } @Override @@ -198,9 +196,4 @@ public class BeltTunnelTileEntity extends SmartTileEntity implements IInstanceRe } return this.cap.cast(); } - - @Override - public void onChunkLightUpdate() { - CreateClient.kineticRenderer.onLightUpdate(this); - } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java index ca6283483..693e045b7 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelInstance.java @@ -14,10 +14,6 @@ import net.minecraftforge.fml.DistExecutor; import java.util.ArrayList; public class FunnelInstance extends TileEntityInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, FunnelInstance::new)); - } private ArrayList> flaps; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index c4d0516a1..63cf669d5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -386,16 +386,4 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn TooltipHelper.addHint(tooltip, "hint.horizontal_funnel"); return true; } - - @Override - public void initialize() { - super.initialize(); - if (world != null && world.isRemote) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); - } - - @Override - public void onChunkLightUpdate() { - CreateClient.kineticRenderer.onLightUpdate(this); - } } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index e4e00e69c..c8a527490 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -29,10 +29,7 @@ import java.util.ArrayList; import java.util.stream.Stream; public class ArmInstance extends SingleRotatingInstance implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, ArmInstance::new)); - } + private InstanceKey base; private InstanceKey lowerBody; private InstanceKey upperBody; @@ -67,6 +64,7 @@ public class ArmInstance extends SingleRotatingInstance implements ITickableInst clawGrips = Lists.newArrayList(clawGrip1, clawGrip2); models = Lists.newArrayList(base, lowerBody, upperBody, head, claw, clawGrip1, clawGrip2); + firstTick = true; tick(); updateLight(); } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java index f7f6fb803..ab7aaf009 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmTileEntity.java @@ -77,12 +77,16 @@ public class ArmTileEntity extends KineticTileEntity { interactionPointTag = new ListNBT(); heldItem = ItemStack.EMPTY; phase = Phase.SEARCH_INPUTS; - baseAngle = new InterpolatedAngle(); - lowerArmAngle = new InterpolatedAngle(); - upperArmAngle = new InterpolatedAngle(); - headAngle = new InterpolatedAngle(); - clawAngle = new InterpolatedAngle(); previousTarget = ArmAngleTarget.NO_TARGET; + baseAngle = new InterpolatedAngle(); + baseAngle.set(previousTarget.baseAngle); + lowerArmAngle = new InterpolatedAngle(); + lowerArmAngle.set(previousTarget.lowerArmAngle); + upperArmAngle = new InterpolatedAngle(); + upperArmAngle.set(previousTarget.upperArmAngle); + headAngle = new InterpolatedAngle(); + headAngle.set(previousTarget.headAngle); + clawAngle = new InterpolatedAngle(); previousBaseAngle = previousTarget.baseAngle; updateInteractionPoints = true; redstoneLocked = false; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java new file mode 100644 index 000000000..b14a2cef2 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverInstance.java @@ -0,0 +1,93 @@ +package com.simibubi.create.content.logistics.block.redstone; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.flywheel.FlyWheelInstance; +import com.simibubi.create.content.contraptions.components.flywheel.FlywheelTileEntity; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.state.properties.AttachFace; +import net.minecraft.tileentity.TileEntityType; +import net.minecraft.util.Direction; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; + +public class AnalogLeverInstance extends TileEntityInstance implements ITickableInstance { + + protected InstanceKey handle; + protected InstanceKey indicator; + + private float rX; + private float rY; + + public AnalogLeverInstance(InstancedTileRenderer modelManager, AnalogLeverTileEntity tile) { + super(modelManager, tile); + } + + @Override + protected void init() { + RenderMaterial> mat = modelManager.getMaterial(RenderMaterials.MODELS); + + handle = mat.getModel(AllBlockPartials.ANALOG_LEVER_HANDLE, lastState).createInstance(); + indicator = mat.getModel(AllBlockPartials.ANALOG_LEVER_INDICATOR, lastState).createInstance(); + + AttachFace face = lastState.get(AnalogLeverBlock.FACE); + rX = face == AttachFace.FLOOR ? 0 : face == AttachFace.WALL ? 90 : 180; + rY = AngleHelper.horizontalAngle(lastState.get(AnalogLeverBlock.HORIZONTAL_FACING)); + + setupModel(); + updateLight(); + } + + @Override + public void tick() { + if (!tile.clientState.settled()) + setupModel(); + } + + protected void setupModel() { + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()); + transform(msr); + + float state = tile.clientState.get(AnimationTickHolder.getPartialTicks()); + + int color = ColorHelper.mixColors(0x2C0300, 0xCD0000, state / 15f); + indicator.getInstance() + .setTransform(ms) + .setColor(color); + + float angle = (float) ((state / 15) * 90 / 180 * Math.PI); + msr.translate(1 / 2f, 1 / 16f, 1 / 2f) + .rotate(Direction.EAST, angle) + .translate(-1 / 2f, -1 / 16f, -1 / 2f); + + handle.getInstance() + .setTransformNoCopy(ms); + } + + @Override + public void remove() { + handle.delete(); + indicator.delete(); + } + + @Override + public void updateLight() { + relight(pos, handle.getInstance(), indicator.getInstance()); + } + + private void transform(MatrixStacker msr) { + msr.centre() + .rotate(Direction.UP, (float) (rY / 180 * Math.PI)) + .rotate(Direction.EAST, (float) (rX / 180 * Math.PI)) + .unCentre(); + } +} diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java index 7ed7acc93..cbde2d0e5 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverRenderer.java @@ -4,6 +4,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.vertex.IVertexBuilder; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.tileEntity.renderer.SafeTileEntityRenderer; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.ColorHelper; @@ -25,6 +26,9 @@ public class AnalogLeverRenderer extends SafeTileEntityRenderer implements ITickableInstance { - public static void register(TileEntityType type) { - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> - InstancedTileRenderRegistry.instance.register(type, SchematicannonInstance::new)); - } private InstanceKey connector; private InstanceKey pipe; diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java index b6da0bd34..77b8d69f4 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java @@ -937,18 +937,6 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC findInventories(); } - @Override - public void initialize() { - super.initialize(); - - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.add(this)); - } - - @Override - public void onChunkLightUpdate() { - CreateClient.kineticRenderer.onLightUpdate(this); - } - @Override public boolean shouldRenderAsTE() { return true; diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java index e3e37f4f4..e2c2f97be 100644 --- a/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java +++ b/src/main/java/com/simibubi/create/foundation/data/CreateRegistrate.java @@ -19,10 +19,7 @@ import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.render.CustomRenderedItemModel; import com.tterrag.registrate.AbstractRegistrate; -import com.tterrag.registrate.builders.BlockBuilder; -import com.tterrag.registrate.builders.Builder; -import com.tterrag.registrate.builders.FluidBuilder; -import com.tterrag.registrate.builders.ItemBuilder; +import com.tterrag.registrate.builders.*; import com.tterrag.registrate.util.NonNullLazyValue; import com.tterrag.registrate.util.entry.RegistryEntry; import com.tterrag.registrate.util.nullness.NonNullBiFunction; @@ -38,6 +35,8 @@ import net.minecraft.client.renderer.color.IItemColor; import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.fluid.Fluid; import net.minecraft.item.Item; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.IItemProvider; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -109,6 +108,17 @@ public class CreateRegistrate extends AbstractRegistrate { .collect(Collectors.toList()); } + public CreateTileEntityBuilder tileEntity(String name, NonNullFunction, ? extends T> factory) { + return this.tileEntity(this.self(), name, (NonNullFunction)factory); + } + + @Override + public CreateTileEntityBuilder tileEntity(P parent, String name, NonNullFunction, ? extends T> factory) { + return (CreateTileEntityBuilder) this.entry(name, (callback) -> { + return CreateTileEntityBuilder.create(this, parent, name, callback, factory); + }); + } + /* Palettes */ public BlockBuilder baseBlock(String name, diff --git a/src/main/java/com/simibubi/create/foundation/data/CreateTileEntityBuilder.java b/src/main/java/com/simibubi/create/foundation/data/CreateTileEntityBuilder.java new file mode 100644 index 000000000..c4aaba34a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/data/CreateTileEntityBuilder.java @@ -0,0 +1,57 @@ +package com.simibubi.create.foundation.data; + +import com.simibubi.create.CreateClient; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverInstance; +import com.simibubi.create.foundation.render.backend.instancing.IRendererFactory; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; +import com.tterrag.registrate.AbstractRegistrate; +import com.tterrag.registrate.builders.BuilderCallback; +import com.tterrag.registrate.builders.TileEntityBuilder; +import com.tterrag.registrate.util.OneTimeEventReceiver; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import net.minecraft.client.renderer.tileentity.TileEntityRenderer; +import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.tileentity.TileEntityType; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DistExecutor; +import net.minecraftforge.fml.client.registry.ClientRegistry; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; + +import javax.annotation.Nullable; +import java.util.function.Function; + +public class CreateTileEntityBuilder extends TileEntityBuilder { + + @Nullable + private NonNullSupplier> instanceFactory; + + public static TileEntityBuilder create(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction, ? extends T> factory) { + return new CreateTileEntityBuilder<>(owner, parent, name, callback, factory); + } + + protected CreateTileEntityBuilder(AbstractRegistrate owner, P parent, String name, BuilderCallback callback, NonNullFunction, ? extends T> factory) { + super(owner, parent, name, callback, factory); + } + + public CreateTileEntityBuilder instance(NonNullSupplier> instanceFactory) { + if (this.instanceFactory == null) { + DistExecutor.runWhenOn(Dist.CLIENT, () -> this::registerInstance); + } + + this.instanceFactory = instanceFactory; + + return this; + } + + protected void registerInstance() { + OneTimeEventReceiver.addModListener(FMLClientSetupEvent.class, ($) -> { + NonNullSupplier> instanceFactory = this.instanceFactory; + if (instanceFactory != null) { + InstancedTileRenderRegistry.instance.register(getEntry(), instanceFactory.get()); + } + + }); + } +} 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 fd3982b1b..1ce2335c8 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -11,7 +11,7 @@ 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 com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; 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 dbecc7e51..af19f8fda 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -8,7 +8,7 @@ import java.util.Optional; import javax.annotation.Nullable; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; diff --git a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java similarity index 81% rename from src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java rename to src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java index 355f9426a..d20b076ec 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/OnRemoveTileMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java @@ -6,6 +6,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import com.simibubi.create.CreateClient; @@ -18,7 +19,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) @Mixin(World.class) -public class OnRemoveTileMixin { +public class AddRemoveTileMixin { @Shadow @Final public boolean isRemote; @@ -31,4 +32,9 @@ public class OnRemoveTileMixin { private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { if (isRemote) CreateClient.kineticRenderer.remove(te); } + + @Inject(at = @At("TAIL"), method = "addTileEntity") + private void onAddTile(TileEntity te, CallbackInfoReturnable cir) { + if (isRemote) CreateClient.kineticRenderer.queueAdd(te); + } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index e2b97b148..1636c95bb 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.mixin; import java.util.Map; +import com.simibubi.create.CreateClient; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -42,10 +43,12 @@ public abstract class LightUpdateMixin extends AbstractChunkProvider { .entrySet() .stream() .filter(entry -> SectionPos.toChunk(entry.getKey().getY()) == sectionY) - .map(Map.Entry::getValue) - .filter(tile -> tile instanceof ILightListener) - .map(tile -> (ILightListener) tile) - .forEach(ILightListener::onChunkLightUpdate); + .map(Map.Entry::getValue).forEach(tile -> { + CreateClient.kineticRenderer.onLightUpdate(tile); + + if (tile instanceof ILightListener) + ((ILightListener) tile).onChunkLightUpdate(); + }); } ContraptionRenderDispatcher.notifyLightUpdate((ILightReader) thi.getWorld(), type, pos); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java index dd2863865..a1b43fe7f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderProgressBar.java @@ -4,7 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ColorHelper; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.SoundHandler; 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 f341d127f..3574609b6 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -26,7 +26,7 @@ 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.animation.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.VecHelper; 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 2f1abec45..d992305cf 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -7,10 +7,9 @@ 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; -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 com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; 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 4f4d8323c..20fddd704 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -27,8 +27,8 @@ 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; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pointing; 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 index ef2950bf0..8f2fc1375 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/AnimatedOverlayElement.java @@ -3,7 +3,7 @@ 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; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; public abstract class AnimatedOverlayElement extends PonderOverlayElement { 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 4c98c08aa..dbfb882d7 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 @@ -2,7 +2,7 @@ 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.animation.LerpedFloat; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.client.renderer.IRenderTypeBuffer; diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java index 04c49d793..9edec76fc 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/RotateSceneInstruction.java @@ -3,7 +3,7 @@ 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.PonderScene.SceneTransform; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; public class RotateSceneInstruction extends PonderInstruction { 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 defd97deb..c60da8df9 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 @@ -8,7 +8,7 @@ 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.ColorHelper; -import com.simibubi.create.foundation.utility.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.settings.KeyBinding; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java index a1558446f..05f3f35b5 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/IInstanceRendered.java @@ -1,8 +1,6 @@ package com.simibubi.create.foundation.render.backend.instancing; -import com.simibubi.create.foundation.render.backend.light.ILightListener; - -public interface IInstanceRendered extends ILightListener { +public interface IInstanceRendered { default boolean shouldRenderAsTE() { return false; } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index ef3a3aeea..21131fe32 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -19,6 +19,8 @@ import net.minecraft.world.IBlockReader; import net.minecraft.world.World; public abstract class InstancedTileRenderer

{ + protected ArrayList queuedAdditions = new ArrayList<>(64); + protected Map> instances = new HashMap<>(); protected Map tickableInstances = new HashMap<>(); @@ -44,6 +46,8 @@ public abstract class InstancedTileRenderer

{ } public void beginFrame(double cameraX, double cameraY, double cameraZ) { + queuedAdditions.forEach(this::add); + queuedAdditions.clear(); tickableInstances.values().forEach(ITickableInstance::tick); } @@ -112,6 +116,12 @@ public abstract class InstancedTileRenderer

{ } } + public void queueAdd(T tile) { + if (!Backend.canUseInstancing()) return; + + queuedAdditions.add(tile); + } + public void update(T tile) { if (!Backend.canUseInstancing()) return; diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index 32537476e..4e029f184 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -1,8 +1,10 @@ package com.simibubi.create.foundation.render.backend.instancing; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.LightType; import net.minecraft.world.World; public abstract class TileEntityInstance { @@ -57,4 +59,14 @@ public abstract class TileEntityInstance { public BlockPos getFloatingPos() { return pos.subtract(modelManager.getOriginCoordinate()); } + + protected void relight(BlockPos pos, ModelData... models) { + relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); + } + + protected void relight(int block, int sky, ModelData... models) { + for (ModelData model : models) { + model.setBlockLight(block).setSkyLight(sky); + } + } } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java index cabc60556..8775f16d3 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/fluid/SmartFluidTankBehaviour.java @@ -9,8 +9,8 @@ import com.simibubi.create.foundation.fluid.SmartFluidTank; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; -import com.simibubi.create.foundation.utility.LerpedFloat; -import com.simibubi.create.foundation.utility.LerpedFloat.Chaser; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.NBTHelper; import net.minecraft.nbt.CompoundNBT; diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java index 53b75af03..52b6ddf8e 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/scrollvalue/ScrollValueHandler.java @@ -7,7 +7,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.ValueBoxTransform.Sided; import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollValueBehaviour.StepContext; -import com.simibubi.create.foundation.utility.PhysicalFloat; +import com.simibubi.create.foundation.utility.animation.PhysicalFloat; import net.minecraft.client.Minecraft; import net.minecraft.client.world.ClientWorld; import net.minecraft.util.math.BlockPos; @@ -24,7 +24,7 @@ public class ScrollValueHandler { private static float lastPassiveScroll = 0.0f; private static float passiveScroll = 0.0f; private static float passiveScrollDirection = 1f; - private static final PhysicalFloat wrenchCog = PhysicalFloat.create().withDrag(0.7); + private static final PhysicalFloat wrenchCog = PhysicalFloat.create().withDrag(0.3); @OnlyIn(Dist.CLIENT) public static boolean onScroll(double delta) { @@ -43,8 +43,8 @@ public class ScrollValueHandler { if (!mc.player.isAllowEdit()) return false; - passiveScrollDirection = (float) delta; - wrenchCog.bump(3, delta * 10); + passiveScrollDirection = (float) -delta; + wrenchCog.bump(3, -delta * 10); if (scrolling.needsWrench && !AllItems.WRENCH.isIn(mc.player.getHeldItemMainhand())) return false; diff --git a/src/main/java/com/simibubi/create/foundation/utility/PhysicalFloat.java b/src/main/java/com/simibubi/create/foundation/utility/PhysicalFloat.java deleted file mode 100644 index 6328db6c2..000000000 --- a/src/main/java/com/simibubi/create/foundation/utility/PhysicalFloat.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.simibubi.create.foundation.utility; - -import net.minecraft.util.math.MathHelper; - -import java.util.ArrayList; - -public class PhysicalFloat { - - float previousValue; - float value; - - float speed; - - private final ArrayList forces = new ArrayList<>(); - - public static PhysicalFloat create() { - return new PhysicalFloat(); - } - - public PhysicalFloat startAt(double value) { - previousValue = this.value = (float) value; - return this; - } - - public PhysicalFloat withDrag(double drag) { - return addForce(new DragForce((float) drag)); - } - - public PhysicalFloat zeroing(double g) { - return addForce(new ZeroingForce((float) g)); - } - - public void tick() { - previousValue = value; - - for (Force force : forces) - speed = force.apply(speed, value); - - forces.removeIf(Force::finished); - - value += speed; - } - - public PhysicalFloat addForce(Force f) { - forces.add(f); - return this; - } - - public PhysicalFloat bump(double force) { - return addForce(new Impulse((float) force)); - } - - public PhysicalFloat bump(int time, double force) { - return addForce(new ForceOverTime(time, (float) force)); - } - - public float getValue() { - return getValue(1); - } - - public float getValue(float partialTicks) { - return MathHelper.lerp(partialTicks, previousValue, value); - } - - public interface Force { - - float apply(float speed, float value); - - boolean finished(); - } - - public static class DragForce implements Force { - final float dragFactor; - - public DragForce(float dragFactor) { - this.dragFactor = dragFactor; - } - - @Override - public float apply(float speed, float value) { - return speed * dragFactor; - } - - @Override - public boolean finished() { - return false; - } - } - - public static class ZeroingForce implements Force { - final float g; - - public ZeroingForce(float g) { - this.g = g; - } - - @Override - public float apply(float speed, float value) { - return speed - MathHelper.clamp(g * Math.signum(value), -speed, speed); - } - - @Override - public boolean finished() { - return false; - } - } - - public static class Impulse implements Force { - - float force; - - public Impulse(float force) { - this.force = force; - } - - @Override - public float apply(float speed, float value) { - return speed + force; - } - - @Override - public boolean finished() { - return true; - } - } - - public static class ForceOverTime implements Force { - int timeRemaining; - float accel; - - public ForceOverTime(int time, float totalAcceleration) { - this.timeRemaining = time; - this.accel = totalAcceleration / (float) time; - } - - @Override - public float apply(float speed, float value) { - timeRemaining--; - return speed + accel; - } - - @Override - public boolean finished() { - return timeRemaining <= 0; - } - } -} diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/Force.java b/src/main/java/com/simibubi/create/foundation/utility/animation/Force.java new file mode 100644 index 000000000..23e7d0080 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/Force.java @@ -0,0 +1,84 @@ +package com.simibubi.create.foundation.utility.animation; + +public interface Force { + + float get(float mass, float value, float speed); + + boolean finished(); + + class Drag implements Force { + final float dragFactor; + + public Drag(float dragFactor) { + this.dragFactor = dragFactor; + } + + @Override + public float get(float mass, float value, float speed) { + return -speed * dragFactor; + } + + @Override + public boolean finished() { + return false; + } + } + + class Zeroing implements Force { + final float g; + + public Zeroing(float g) { + this.g = g / 20; + } + + @Override + public float get(float mass, float value, float speed) { + return -Math.signum(value) * g * mass; + } + + @Override + public boolean finished() { + return false; + } + } + + class Impulse implements Force { + + float force; + + public Impulse(float force) { + this.force = force; + } + + @Override + public float get(float mass, float value, float speed) { + return force; + } + + @Override + public boolean finished() { + return true; + } + } + + class OverTime implements Force { + int timeRemaining; + float f; + + public OverTime(int time, float totalAcceleration) { + this.timeRemaining = time; + this.f = totalAcceleration / (float) time; + } + + @Override + public float get(float mass, float value, float speed) { + timeRemaining--; + return f; + } + + @Override + public boolean finished() { + return timeRemaining <= 0; + } + } +} diff --git a/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java similarity index 96% rename from src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java rename to src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java index 4c7b4fec4..b0f22f545 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/LerpedFloat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java @@ -1,5 +1,6 @@ -package com.simibubi.create.foundation.utility; +package com.simibubi.create.foundation.utility.animation; +import com.simibubi.create.foundation.utility.AngleHelper; import net.minecraft.nbt.CompoundNBT; import net.minecraft.util.math.MathHelper; diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java new file mode 100644 index 000000000..a710d8525 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/PhysicalFloat.java @@ -0,0 +1,80 @@ +package com.simibubi.create.foundation.utility.animation; + +import net.minecraft.util.math.MathHelper; + +import java.util.ArrayList; + +public class PhysicalFloat { + + float previousValue; + float value; + + float previousSpeed; + float speed; + + float mass; + + private final ArrayList forces = new ArrayList<>(); + + public static PhysicalFloat create() { + return new PhysicalFloat(1); + } + + public static PhysicalFloat create(float mass) { + return new PhysicalFloat(mass); + } + + public PhysicalFloat(float mass) { + this.mass = mass; + } + + public PhysicalFloat startAt(double value) { + previousValue = this.value = (float) value; + return this; + } + + public PhysicalFloat withDrag(double drag) { + return addForce(new Force.Drag((float) drag)); + } + + public PhysicalFloat zeroing(double g) { + return addForce(new Force.Zeroing((float) g)); + } + + public void tick() { + previousSpeed = speed; + previousValue = value; + + float totalImpulse = 0; + for (Force force : forces) + totalImpulse += force.get(mass, value, speed) / mass; + + speed += totalImpulse; + + forces.removeIf(Force::finished); + + value += speed; + } + + public PhysicalFloat addForce(Force f) { + forces.add(f); + return this; + } + + public PhysicalFloat bump(double force) { + return addForce(new Force.Impulse((float) force)); + } + + public PhysicalFloat bump(int time, double force) { + return addForce(new Force.OverTime(time, (float) force)); + } + + public float getValue() { + return getValue(1); + } + + public float getValue(float partialTicks) { + return MathHelper.lerp(partialTicks, previousValue, value); + } + +} diff --git a/src/main/resources/create.mixins.json b/src/main/resources/create.mixins.json index 6956226de..37137f8a6 100644 --- a/src/main/resources/create.mixins.json +++ b/src/main/resources/create.mixins.json @@ -4,7 +4,7 @@ "compatibilityLevel": "JAVA_8", "refmap": "create.refmap.json", "client": [ - "OnRemoveTileMixin", + "AddRemoveTileMixin", "ShaderCloseMixin", "CancelTileEntityRenderMixin", "LightUpdateMixin", From a8dc4f36229733e2c1c5e8e2784a32ea3eeb508d Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:12:02 +0100 Subject: [PATCH 105/124] Broken Breaking - Painful implementation of virtual block breaking overlay - Scenes for the Mechanical Drill --- .../create/foundation/ponder/PonderScene.java | 23 +- .../create/foundation/ponder/PonderUI.java | 2 +- .../create/foundation/ponder/PonderWorld.java | 16 ++ .../foundation/ponder/SceneBuilder.java | 17 +- .../ponder/content/MechanicalDrillScenes.java | 203 ++++++++++++++++++ .../ponder/content/MechanicalSawScenes.java | 38 ++++ .../ponder/content/PonderIndex.java | 26 ++- .../foundation/ponder/content/PonderTag.java | 7 +- .../ponder/content/TemplateScenes.java | 18 ++ .../ponder/elements/WorldSectionElement.java | 30 ++- .../ponder/mechanical_drill/breaker.nbt | Bin 0 -> 441 bytes .../ponder/mechanical_drill/contraption.nbt | Bin 0 -> 864 bytes .../ponder/mechanical_saw/breaker.nbt | Bin 0 -> 889 bytes .../ponder/mechanical_saw/contraption.nbt | Bin 0 -> 1276 bytes .../ponder/mechanical_saw/processing.nbt | Bin 0 -> 872 bytes 15 files changed, 365 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java create mode 100644 src/main/resources/ponder/mechanical_drill/breaker.nbt create mode 100644 src/main/resources/ponder/mechanical_drill/contraption.nbt create mode 100644 src/main/resources/ponder/mechanical_saw/breaker.nbt create mode 100644 src/main/resources/ponder/mechanical_saw/contraption.nbt create mode 100644 src/main/resources/ponder/mechanical_saw/processing.nbt 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 f341d127f..592e50574 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -90,6 +90,7 @@ public class PonderScene { int currentTime; public PonderScene(PonderWorld world, ResourceLocation component, Collection tags) { + world.scene = this; pointOfInterest = Vec3d.ZERO; textIndex = 1; @@ -234,6 +235,7 @@ public class PonderScene { world.renderEntities(ms, buffer, info, pt); world.renderParticles(ms, buffer, info, pt); outliner.renderOutlines(ms, buffer, pt); + ms.pop(); } @@ -301,7 +303,7 @@ public class PonderScene { } public void markKeyframe(int offset) { - if (!stoppedCounting) + if (!stoppedCounting) keyframeTimes.add(totalTime + offset); } @@ -409,10 +411,10 @@ public class PonderScene { } public MatrixStack apply(MatrixStack ms) { - return apply(ms, AnimationTickHolder.getPartialTicks(world)); + return apply(ms, AnimationTickHolder.getPartialTicks(world), false); } - public MatrixStack apply(MatrixStack ms, float pt) { + public MatrixStack apply(MatrixStack ms, float pt, boolean overlayCompatible) { ms.translate(width / 2, height / 2, 200 + offset); MatrixStacker.of(ms) @@ -428,9 +430,18 @@ public class PonderScene { float f = 30 * scaleFactor; - ms.scale(f, -f, f); - ms.translate((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, - (basePlateSize + basePlateOffsetZ) / -2f); + if (!overlayCompatible) { + ms.scale(f, -f, f); + ms.translate((basePlateSize + basePlateOffsetX) / -2f, -1f + yOffset, + (basePlateSize + basePlateOffsetZ) / -2f); + } else { + // For block breaking overlay; Don't ask + ms.scale(f, f, f); + ms.translate((basePlateSize + basePlateOffsetX) / -2f, -yOffset, + (basePlateSize + basePlateOffsetZ) / -2f); + float y = (float) (0.5065 * Math.pow(2.2975, Math.log(1 / scaleFactor) / Math.log(2))) / 30; + ms.scale(y, -y, -y); + } return ms; } 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 4f4d8323c..07f36ba04 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -366,7 +366,7 @@ public class PonderUI extends AbstractSimiScreen { ms.push(); story.transform.updateScreenParams(width, height, slide); - story.transform.apply(ms, partialTicks); + story.transform.apply(ms, partialTicks, false); 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 f9adefdfc..8f3e79564 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -47,8 +47,11 @@ import net.minecraftforge.registries.ForgeRegistries; public class PonderWorld extends SchematicWorld { + public PonderScene scene; + protected Map originalBlocks; protected Map originalTileEntities; + protected Map blockBreakingProgressions; protected List originalEntities; protected PonderWorldParticles particles; @@ -61,6 +64,7 @@ public class PonderWorld extends SchematicWorld { super(anchor, original); originalBlocks = new HashMap<>(); originalTileEntities = new HashMap<>(); + blockBreakingProgressions = new HashMap<>(); originalEntities = new ArrayList<>(); particles = new PonderWorldParticles(this); @@ -82,6 +86,7 @@ public class PonderWorld extends SchematicWorld { entities.clear(); blocks.clear(); tileEntities.clear(); + blockBreakingProgressions.clear(); renderedTileEntities.clear(); originalBlocks.forEach((k, v) -> blocks.put(k, v)); originalTileEntities.forEach((k, v) -> { @@ -225,6 +230,17 @@ public class PonderWorld extends SchematicWorld { } } } + + public void setBlockBreakingProgress(BlockPos pos, int damage) { + if (damage == 0) + blockBreakingProgressions.remove(pos); + else + blockBreakingProgressions.put(pos, damage - 1); + } + + public Map getBlockBreakingProgressions() { + return blockBreakingProgressions; + } public void addBlockDestroyEffects(BlockPos pos, BlockState state) { VoxelShape voxelshape = state.getShape(this, pos); 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 25e9c1cd0..b96b7a61d 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -370,6 +370,21 @@ public class SceneBuilder { public class WorldInstructions { + public void incrementBlockBreakingProgress(BlockPos pos) { + addInstruction(scene -> { + PonderWorld world = scene.getWorld(); + int progress = world.getBlockBreakingProgressions() + .getOrDefault(pos, -1) + 1; + if (progress == 9) { + world.addBlockDestroyEffects(pos, world.getBlockState(pos)); + world.destroyBlock(pos, false); + world.setBlockBreakingProgress(pos, 0); + scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); + } else + world.setBlockBreakingProgress(pos, progress + 1); + }); + } + public void showSection(Selection selection, Direction fadeInDirection) { addInstruction(new DisplayWorldSectionInstruction(15, fadeInDirection, selection, Optional.of(scene::getBaseWorldSection))); @@ -533,7 +548,7 @@ public class SceneBuilder { return itemEntity; }); } - + public ElementLink createGlueEntity(BlockPos pos, Direction face) { effects.superGlue(pos, face, false); return createEntity(world -> new SuperGlueEntity(world, pos, face.getOpposite())); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java new file mode 100644 index 000000000..bbfbc58f6 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java @@ -0,0 +1,203 @@ +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.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.entity.item.ItemEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class MechanicalDrillScenes { + + public static void breaker(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_drill", "Breaking Blocks with the Mechanical Drill"); + scene.configureBasePlate(0, 0, 5); + + scene.world.setKineticSpeed(util.select.layer(0), -8); + scene.world.setKineticSpeed(util.select.layer(1), 16); + + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(4, 1, 2, 5, 1, 2), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(3, 1, 2), Direction.EAST); + scene.idle(20); + + BlockPos breakingPos = util.grid.at(2, 1, 2); + + scene.world.showSection(util.select.position(2, 1, 2), Direction.DOWN); + scene.idle(5); + for (int i = 0; i < 10; i++) { + scene.idle(10); + scene.world.incrementBlockBreakingProgress(breakingPos); + if (i == 1) { + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(breakingPos)) + .text("When given Rotational Force, a Mechanical Drill will break blocks directly in front of it"); + } + } + + scene.world.hideSection(util.select.position(breakingPos), Direction.UP); + ElementLink plankEntity = scene.world.createItemEntity(util.vector.centerOf(breakingPos), + util.vector.of(0, .1f, 0), new ItemStack(Items.OAK_PLANKS)); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); + scene.effects.rotationSpeedIndicator(breakingPos.east(3)); + + scene.idle(20); + scene.world.modifyEntity(plankEntity, Entity::remove); + scene.world.setBlock(breakingPos, Blocks.OAK_PLANKS.getDefaultState(), false); + scene.world.showSection(util.select.position(breakingPos), Direction.DOWN); + + scene.idle(5); + for (int i = 0; i < 10; i++) { + scene.idle(3); + scene.world.incrementBlockBreakingProgress(breakingPos); + if (i == 2) { + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(breakingPos.east())) + .text("Its mining speed depends on the Rotational Input"); + } + } + + scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, .1f, 0), + new ItemStack(Items.OAK_PLANKS)); + } + + public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_drill_contraption", "Using Mechanical Drills on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.world.showSection(util.select.layer(0), Direction.UP); + + Selection kinetics = util.select.fromTo(5, 1, 2, 5, 1, 6); + + scene.idle(5); + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 2, 3, 4, 1, 2), Direction.DOWN); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); + scene.world.showSectionAndMerge(util.select.position(3, 2, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 2, 2), Direction.EAST, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(util.grid.at(3, 2, 3))) + .text("Whenever Drills are moved as part of an animated Contraption..."); + scene.idle(70); + + Selection drills = util.select.fromTo(3, 1, 2, 3, 2, 3); + + Selection planks = util.select.fromTo(1, 1, 2, 1, 2, 3); + scene.world.showSection(planks, Direction.DOWN); + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.setKineticSpeed(drills, 16); + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + scene.world.setKineticSpeed(drills, 64); + + BlockPos p1 = util.grid.at(1, 1, 2); + BlockPos p2 = util.grid.at(1, 1, 3); + BlockPos p3 = util.grid.at(1, 2, 2); + BlockPos p4 = util.grid.at(1, 2, 3); + + for (int i = 0; i < 10; i++) { + scene.idle(3); + scene.world.incrementBlockBreakingProgress(p1); + scene.world.incrementBlockBreakingProgress(p2); + scene.world.incrementBlockBreakingProgress(p3); + scene.world.incrementBlockBreakingProgress(p4); + if (i == 2) { + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.topOf(p3)) + .text("...they will break blocks the contraption runs them into"); + } + } + + Vec3d m = util.vector.of(-.1, 0, 0); + ItemStack item = new ItemStack(Items.OAK_PLANKS); + scene.world.createItemEntity(util.vector.centerOf(p1), m, item); + scene.world.createItemEntity(util.vector.centerOf(p2), m, item); + scene.world.createItemEntity(util.vector.centerOf(p3), m, item); + scene.world.createItemEntity(util.vector.centerOf(p4), m, item); + + scene.world.setKineticSpeed(drills, 16); + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + scene.world.setKineticSpeed(drills, 0); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(planks, Direction.UP); + scene.idle(40); + + scene.world.setBlocks(planks, Blocks.OAK_PLANKS.getDefaultState(), false); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.world.glueBlockOnto(util.grid.at(4, 3, 2), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(4, 3, 2), Direction.WEST)) + .text("Inventories attached to the Contraption will pick up their drops automatically"); + scene.idle(70); + + scene.world.showSection(planks, Direction.DOWN); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.setKineticSpeed(drills, 16); + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + + scene.idle(20); + scene.world.setKineticSpeed(drills, 64); + + for (int i = 0; i < 10; i++) { + scene.idle(3); + scene.world.incrementBlockBreakingProgress(p1); + scene.world.incrementBlockBreakingProgress(p2); + scene.world.incrementBlockBreakingProgress(p3); + scene.world.incrementBlockBreakingProgress(p4); + } + + scene.world.setKineticSpeed(drills, 16); + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + scene.world.setKineticSpeed(drills, 0); + scene.idle(10); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(2, 3, 2), Pointing.DOWN) + .withItem(new ItemStack(Blocks.OAK_PLANKS)), 60); + scene.idle(20); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java new file mode 100644 index 000000000..acac8c9a3 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -0,0 +1,38 @@ +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; +import net.minecraft.util.math.BlockPos; + +public class MechanicalSawScenes { + + public static void processing(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_saw_processing", "Processing Items on the Mechanical Saw"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos shaftPos = util.grid.at(2, 1, 3); + + scene.idle(5); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + } + + public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + } + + public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); + 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); + } + +} 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 d536dfce7..88309ec71 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 @@ -79,14 +79,14 @@ public class PonderIndex { // Chassis & Super Glue PonderRegistry.forComponents(AllBlocks.LINEAR_CHASSIS, AllBlocks.SECONDARY_LINEAR_CHASSIS) - .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup) + .addStoryBoard("chassis/linear_group", ChassisScenes::linearGroup, PonderTag.CONTRAPTION_ASSEMBLY) .addStoryBoard("chassis/linear_attachment", ChassisScenes::linearAttachement); PonderRegistry.forComponents(AllBlocks.RADIAL_CHASSIS) - .addStoryBoard("chassis/radial", ChassisScenes::radial); + .addStoryBoard("chassis/radial", ChassisScenes::radial, PonderTag.CONTRAPTION_ASSEMBLY); PonderRegistry.forComponents(AllItems.SUPER_GLUE) - .addStoryBoard("super_glue", ChassisScenes::superGlue); + .addStoryBoard("super_glue", ChassisScenes::superGlue, PonderTag.CONTRAPTION_ASSEMBLY); PonderRegistry.forComponents(AllBlocks.STICKER) - .addStoryBoard("sticker", RedstoneScenes::sticker); + .addStoryBoard("sticker", RedstoneScenes::sticker, PonderTag.CONTRAPTION_ASSEMBLY); // Mechanical Piston PonderRegistry.forComponents(AllBlocks.MECHANICAL_PISTON, AllBlocks.STICKY_MECHANICAL_PISTON) @@ -129,7 +129,6 @@ public class PonderIndex { PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); PonderRegistry.addStoryBoard(AllBlocks.GANTRY_CARRIAGE, "gantry/intro", GantryScenes::introForPinion, PonderTag.KINETIC_APPLIANCES, PonderTag.MOVEMENT_ANCHOR); - PonderRegistry.forComponents(AllBlocks.GANTRY_SHAFT, AllBlocks.GANTRY_CARRIAGE) .addStoryBoard("gantry/redstone", GantryScenes::redstone) .addStoryBoard("gantry/direction", GantryScenes::direction) @@ -141,6 +140,14 @@ public class PonderIndex { .addStoryBoard("portable_interface/redstone", MovementActorScenes::psiRedstone); PonderRegistry.forComponents(AllBlocks.REDSTONE_CONTACT) .addStoryBoard("redstone_contact", RedstoneScenes::contact); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_SAW) + .addStoryBoard("mechanical_saw/processing", MechanicalSawScenes::processing, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_saw/breaker", MechanicalSawScenes::treeCutting) + .addStoryBoard("mechanical_saw/contraption", MechanicalSawScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_DRILL) + .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, + PonderTag.CONTRAPTION_ACTOR); // Debug scenes, can be found in game via the Brass Hand if (EDITOR_MODE) @@ -273,6 +280,15 @@ public class PonderIndex { .add(AllBlocks.GANTRY_CARRIAGE) .add(AllBlocks.CART_ASSEMBLER); + PonderRegistry.tags.forTag(PonderTag.CONTRAPTION_ASSEMBLY) + .add(AllBlocks.LINEAR_CHASSIS) + .add(AllBlocks.SECONDARY_LINEAR_CHASSIS) + .add(AllBlocks.RADIAL_CHASSIS) + .add(AllItems.SUPER_GLUE) + .add(AllBlocks.STICKER) + .add(Blocks.SLIME_BLOCK) + .add(Blocks.field_226907_mc_); // honey block + PonderRegistry.tags.forTag(PonderTag.CONTRAPTION_ACTOR) .add(AllBlocks.MECHANICAL_HARVESTER) .add(AllBlocks.MECHANICAL_PLOUGH) 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 b0b7ba26c..bf649665d 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 @@ -2,6 +2,7 @@ package com.simibubi.create.foundation.ponder.content; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; import com.simibubi.create.foundation.gui.GuiGameElement; import com.simibubi.create.foundation.gui.IScreenRenderable; import com.simibubi.create.foundation.ponder.PonderLocalization; @@ -36,7 +37,7 @@ 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"), @@ -54,6 +55,10 @@ public class PonderTag implements IScreenRenderable { .defaultLang("Contraption Actors", "Components which expose special behaviour when attached to a moving contraption"), + CONTRAPTION_ASSEMBLY = new PonderTag("contraption_assembly").item(AllItems.SUPER_GLUE.get(), true, false) + .defaultLang("Block Attachment Utility", + "Tools and Components used to assemble structures moved as an animated Contraption"), + // FLUID_TRANSFER = new PonderTag("fluid_transfer").idAsIcon(), // // OPEN_INVENTORY = new PonderTag("open_inventory").item(AllBlocks.BASIN.get() diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java new file mode 100644 index 000000000..72fc1b7e5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/TemplateScenes.java @@ -0,0 +1,18 @@ +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 TemplateScenes { + + public static void templateMethod(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("", ""); + 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); + } + +} 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 f1e05c489..66569c7af 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,12 +2,16 @@ package com.simibubi.create.foundation.ponder.elements; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import java.util.Random; import org.lwjgl.opengl.GL11; import com.mojang.blaze3d.matrix.MatrixStack; import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.IVertexBuilder; +import com.mojang.blaze3d.vertex.MatrixApplyingVertexBuilder; import com.simibubi.create.CreateClient; import com.simibubi.create.foundation.ponder.PonderScene; import com.simibubi.create.foundation.ponder.PonderWorld; @@ -16,7 +20,6 @@ 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; @@ -33,6 +36,7 @@ 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.model.ModelBakery; import net.minecraft.client.renderer.texture.OverlayTexture; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.fluid.IFluidState; @@ -274,7 +278,31 @@ public class WorldSectionElement extends AnimatedSceneElement { transformMS(ms, pt); world.pushFakeLight(light); renderTileEntities(world, ms, buffer, pt); + renderBlockBreakingProgress(world, ms, buffer, pt); world.popLight(); + + Map blockBreakingProgressions = world.getBlockBreakingProgressions(); + MatrixStack overlayMS = null; + + for (Entry entry : blockBreakingProgressions.entrySet()) { + BlockPos pos = entry.getKey(); + if (!section.test(pos)) + continue; + if (overlayMS == null) { + overlayMS = new MatrixStack(); + world.scene.getTransform() + .apply(overlayMS, pt, true); + transformMS(overlayMS, pt); + } + ms.push(); + ms.translate(pos.getX(), pos.getY(), pos.getZ()); + IVertexBuilder builder = new MatrixApplyingVertexBuilder( + buffer.getBuffer(ModelBakery.BLOCK_DESTRUCTION_RENDER_LAYERS.get(entry.getValue())), overlayMS.peek()); + Minecraft.getInstance() + .getBlockRendererDispatcher() + .renderModel(world.getBlockState(BlockPos.ZERO), pos, world, ms, builder, EmptyModelData.INSTANCE); + ms.pop(); + } } protected void renderStructure(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, RenderType type, diff --git a/src/main/resources/ponder/mechanical_drill/breaker.nbt b/src/main/resources/ponder/mechanical_drill/breaker.nbt new file mode 100644 index 0000000000000000000000000000000000000000..8d3766251fa160e691ed05500913432f7b5c60ac GIT binary patch literal 441 zcmV;q0Y?5GiwFP!000000JW6eO2aS|$4{GdcAKCVieC93UVA+RKWPBNkya#8|^5jdQ{=`AJnIVJS@ z9ETA&oWM!DoQ^f=iMkkJ7K|{9a~wwCZ~~_{PM8HJ%;Fq}5jcF5GXrLpfkD2&U3gWp zYCSW^UTVbEzC_5Moh=>u{WDMCdJ#|j{`{?8MNX1Ks#b6*9md_`$|Wb+M0w zou=P*bg#Cx#-dUNgOVd94#V)j50j0A$^IwI@RCiU=AsrFL%{Z*y~u$t#1`Rx8yV7x zb$DzxDqtb4i9w=MuekY9cw?Jl|5=ZnT2U3X7N+vCrdb?*jjsLWbC|4!RHg*ppbrPv zyRMim%8f8e3SE5Pfr0nDi7KaUS;qEcYoR?xgxDz$$?ibwuaV!xTz-eR>JZYF%?9z8 jiS#ql!j)}1I~IfalL+D+ombWXm!hW)H9j7!pE)T_8Tc7m5GpckFYHKhgu}LTJPTCjd}B5k4V4oi0RN zSz!e?P_{0#Z>3H~riU-@yFhYnoYA}ypvE%GD~n}K(4YxwnwAHLcyK}w4)x%;7HrT2 z4Vt>ImIsG;a6%6b_29VH^2k@qBVU_1#Df!haHt0-sGem_t6|LBG(n}?#@VKEjd;`# z@u;6o9OA(VJvh{ZEw#nT0-gQ!FDQ}p(D?6eY??uH+hRhgY8fIK4h81yn_&qqd zV8)(L5}sS3RRrCSI?J`fGZfzaIjK5WSmdEq3sWb zhdtU-Xnz?D47VSei?$vP`i#k~Z@B-T+&a-Ew+r;M<=O1+GlLywLh+l3UBmU#R^E!b_HMI9_Zkpa)+}y))xp6tu*Q>|D zY@yVw4-Ce0bRXYpYjp;pE$%on*aTNVFu`P1{Z{8d2TYp9*j;WU4w4nITQ{4A7rCId zGyN04MsQSmikZ|ZjR&H@8PvS2J=f}v_QohHq)t;Tsu^VAohn_}Au{cKj@}J^lM5d! z+rJOGiqXTI;x;5RM9{w><{@Q8T2@Os9&)~tGe6d$+s__Dsb$NBYgz+y^4oPOiHDr^ qAMa-lep7)f8h00=IL8}PdGqZ7`HbBrO2}Hg$OCayTT!1YihMibqZWKtBU~Vtk?@#Jo^K z2`)jmAq?*GGM&o=|NIyNsY=-n+BE`^R7~+^#32({n808{4;|v6Lp}Xag9$BuOomwe zxO8-^$Rn1?*kZYK+7|TWC$KPPenJl&Vqs{(!@2J^Vnk z7B0^wWAkh>HqR~{>fuMn8hFGq8Jp)L2h+CD<4g#9>L;`?gN`~3J)Ld z7kz$03uD`ZE}ga!k8_?lYTjhbJxDxssDre4h^W@B>YaxjdUp z*E#R-*5<$7EtifE4#Cg6Ov5d;%L!=QsFMZaThI6C{HeLNS4hwC4ElQi?^D^YL61 zT#3{O6E(|l_=zxV!VrjW_*&hGbPgMI9~EDHsmrY9Qg)e0VDMSwiq~5=Cku?9)@-US znWzJZK9q|WIJv5- zT=2;jLZhc>E=6ym$nL~~|M{ieC)?M$V><K(jcgC0_3d zS(K~s<_fFRj0;)uTHkJCh$jL=6)A_{J#Gc;m)L`)!w~a zEz-6h%%K|Cw)DQl`YXLY6vC0orn&rPktl%=@2fv&hzF`R3aG0V#$8&5?o6;M?#`4iCv zPiL$UDa*%rtUS-)al6fCINj$-oHY`=*;(p^JuYjG^|It@Kh7v8+=-)4OtJ5JVafte P&foAC>2n literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/mechanical_saw/contraption.nbt b/src/main/resources/ponder/mechanical_saw/contraption.nbt new file mode 100644 index 0000000000000000000000000000000000000000..f8a1daa01b62e50793fe6352453970d6dd821014 GIT binary patch literal 1276 zcmVr6XO~%j)w6pczg?< zz=9{V;Hmv`IxwyQqucTf7`Mf*E}p=E(e;EDJdU#0#CQh3bc}ECtB=P~y8CSD7?Z6& zo;qJ{N1R;)rmYTLi#qJ$2`qR*3m#DR+#cU`j2=VRfC*Z1+Qs8r=mF(_pJp9n(yU`l zn)`TsOFf~59vx%SW5YA(!PNEaS@fSKCTyu^&!Yc$7X7D7PiVp8D&LxzfdS)MV7wj- zDBrxEIO`Zar>+5`+wv@Ud<#9GV%?`%$Cxzh7?b8c9^X<=XrV{PnDq4VI8dFPE+jOJoOp$E$%jc$NBOsczgqs(B8T5Mk595}hc zm1490b2dgEX9VGoER{5mz-41NoHI_7oJ`~eVYvgrYq8+cL8fOF?A5${02}+|hEbAJ z3cS(fBjLa zA63icgUSW}2H#9evLOVQlFkd2pZy4x8EM|6hT8}o+$6b3(+?zFY(iIQKT_J089@<+ zp>B1?kz#BHc?5@VNg>~?5}HXSIM&H)G0y}?zu~*z&SXw_k>dWdi?hn$`E~~|nJUD){l9U&?;VtD;IV&YPFnG7%90Lh^&Z?*}+EgyTSk;~$x+%pLCvDVfni8iMO;Y|s8L zXhT7JpS+;Go`N<-wciQpJK+*Bi8><|SP%Xst6vpg$!zB8JapF<-wgiC7(CL}F(TTgder#YTN z^WJETt(WkGg7Xc|aeR))Rh9!oqiZM;T(!jswe=`J$26{qcztLMJ^e z@XXz<<69x6m{$~AUsotvtxJ*Z6^=5HqIQzUbqnuSt%^OIi+g-(@e^?-|9&X7~CaqflXyi0dB_C~)AwTjWhmgQO9&t^#UIErmZNj@!4`E)s> zG<_V`aXngV7DJs+X#R0=R9URUxT%dT@t19>if5FJKi*l2y7j5CoM8yR_6 m2W*& literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/mechanical_saw/processing.nbt b/src/main/resources/ponder/mechanical_saw/processing.nbt new file mode 100644 index 0000000000000000000000000000000000000000..35d6a03f6f09d13defbe199a724e97dd17771b93 GIT binary patch literal 872 zcmV-u1DE_CiwFP!000000M(aEZ__{!$H%YKamwQW5=Rbv33`DNKtw{Jq6Gm0!q%Q9 zt2$n5cS}l7{Zw2Ld@^PeI}hW8O$lndQsva1`R~qe#XXpWd`3s6`qX{8q znrn^<%xFU6FctB!is+vQP4IG|N~h`YAW)iVEIj6IoEjUaV&huqcosUog-$t~6*^9h zO;yLW(D5vEd<&g&xE7pU3(l)_JPRG)LT8!^3(lSe=T$nMg^q8bQx4yPvv0w9m5yhj zqiKo(PoNgeek=ly3ZnL?28i_<5C9)wmWJjOa_gYnDzC*Ac$bAi+UvFaR6bP zelT1%=FOqZqAV<1gJkNqAzC zqpCUJL;P`WcG+n1*xcB?Kfk(YAxm{#u$mNqL)GrCTkTbcYgFw{T^p`~4K~zb{~7Eh zw^+Z1O~aDSM%H$>eEaw?PqBAQufFE--&@F%jyAvbZ`E|PD;CG+WldmJ9M>Tq-u28! zZ&^O(k7r>ej-Th39!GgNd052pW!aH7n2V!%_3}}TV`)Bug}Q3OR?bq?8qF7M6jJMD zLxg*?gT!dSHTGhW(K5)Xw74^~P?;F@#-G7v2c>;IM`^y0sh`J_ejXgLR3W+MOlt5j zOX%4V(J;M!gi43Brj-038VJeHsHL-XI@LlGwwl2NDD}qXC{)~&JcQfql&c;~Mb_^f zajA4M^;D@$*AU|Y%XrMv9-WUaxNc+{XH%j7PcyVe^hBnj-^XM&jUfci*;L_Hp%9Dy yXn>erOl7-#4F*(m7n3MclQP*iC0#6s&aO|HW^Yj{E;4%UzQb< Date: Sun, 14 Mar 2021 23:26:05 +0100 Subject: [PATCH 106/124] hotfix - Oops. That didn't compile --- .../create/foundation/ponder/elements/WorldSectionElement.java | 1 - 1 file changed, 1 deletion(-) 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 66569c7af..87f2b03d4 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 @@ -278,7 +278,6 @@ public class WorldSectionElement extends AnimatedSceneElement { transformMS(ms, pt); world.pushFakeLight(light); renderTileEntities(world, ms, buffer, pt); - renderBlockBreakingProgress(world, ms, buffer, pt); world.popLight(); Map blockBreakingProgressions = world.getBlockBreakingProgressions(); From f1b940ea188d35ea2f299188af9dbdb110387401 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 15 Mar 2021 05:49:29 +0100 Subject: [PATCH 107/124] Cutting imaginary trees - Fixed TEs not ticking properly when wrap-around-skipping to a keyframe - Added a block restoration instruction - Scenes for the Saw - runData catching up --- src/generated/resources/.cache/cache | 28 +- .../create/blockstates/radial_chassis.json | 72 ++-- .../resources/assets/create/lang/en_us.json | 131 ++++++ .../assets/create/lang/unfinished/de_de.json | 133 ++++++- .../assets/create/lang/unfinished/es_es.json | 133 ++++++- .../assets/create/lang/unfinished/es_mx.json | 133 ++++++- .../assets/create/lang/unfinished/fr_fr.json | 133 ++++++- .../assets/create/lang/unfinished/it_it.json | 133 ++++++- .../assets/create/lang/unfinished/ja_jp.json | 133 ++++++- .../assets/create/lang/unfinished/ko_kr.json | 133 ++++++- .../assets/create/lang/unfinished/nl_nl.json | 133 ++++++- .../assets/create/lang/unfinished/pt_br.json | 133 ++++++- .../assets/create/lang/unfinished/ru_ru.json | 133 ++++++- .../assets/create/lang/unfinished/zh_cn.json | 133 ++++++- .../assets/create/lang/unfinished/zh_tw.json | 133 ++++++- .../data/create/advancements/aesthetics.json | 4 +- .../foundation/ponder/PonderElement.java | 2 + .../create/foundation/ponder/PonderScene.java | 9 +- .../create/foundation/ponder/PonderWorld.java | 16 +- .../foundation/ponder/SceneBuilder.java | 33 +- .../ponder/content/MechanicalDrillScenes.java | 10 +- .../ponder/content/MechanicalSawScenes.java | 372 +++++++++++++++++- .../foundation/ponder/content/SharedText.java | 1 + .../ponder/elements/WorldSectionElement.java | 41 +- .../foundation/utility/BlockHelper.java | 3 +- .../ponder/mechanical_saw/breaker.nbt | Bin 889 -> 886 bytes 26 files changed, 2217 insertions(+), 101 deletions(-) diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index c9b19a220..670bb1770 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 @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -70c01b50697866652585552dca5c9216934b93e3 assets/create/lang/en_us.json -8723f59cbb46b42a85996195a10b4d68b748b839 assets/create/lang/unfinished/de_de.json -680047cc58a781b0a4fcec0ca36b1194082c6679 assets/create/lang/unfinished/es_es.json -c78a6aa75c3a7afdabb98cfb71d6f5f57d994d04 assets/create/lang/unfinished/es_mx.json -3ee909ec33725d9bfeb8a32e81707b5ad53bfae1 assets/create/lang/unfinished/fr_fr.json -dbd795f8b92e38de488bde470644c92de590c6c4 assets/create/lang/unfinished/it_it.json -b1d41b49c118e588aad2c8edf0e08acf9e14f20a assets/create/lang/unfinished/ja_jp.json -7546ffae02cbda0c17fe77ad6e72a6959303591a assets/create/lang/unfinished/ko_kr.json -030af4ddbc9eaef3f7aafb988e7dac960e232149 assets/create/lang/unfinished/nl_nl.json -3e2dfe4b4d915c48d9e0e130bcb823296310fad9 assets/create/lang/unfinished/pt_br.json -5f423b6846ef1344c7c517af8d7909c6fc284c2e assets/create/lang/unfinished/ru_ru.json -a766c823e582e861782698cc7dba4e52c63e085a assets/create/lang/unfinished/zh_cn.json -25f61a27cc6a48e29fb5db421ce3306b55923cd1 assets/create/lang/unfinished/zh_tw.json +6d00aa2e085c5754a9b7f5fffdea8702c474f5a6 assets/create/lang/en_us.json +be6252adfc657c2ee9f0f30bcca3155dc9ca98d8 assets/create/lang/unfinished/de_de.json +64baba74aa6a1e980dc4a7d469dba660a308e42c assets/create/lang/unfinished/es_es.json +e5fa6c5ad75b424382ae0d202547908bab13f569 assets/create/lang/unfinished/es_mx.json +945e755bdfa2996060129e6edad5ef6a3ed171e0 assets/create/lang/unfinished/fr_fr.json +bb0cc8cc01bf99b33f8c42c333ecac5e65f0c134 assets/create/lang/unfinished/it_it.json +37d0b9d5ccb0072b52f1896f836cea8d042a9156 assets/create/lang/unfinished/ja_jp.json +c380bc0d1933a41fdf64d323775a43dfe6ac92b1 assets/create/lang/unfinished/ko_kr.json +d003e93a08a630e803293612793a9ecd3b38017a assets/create/lang/unfinished/nl_nl.json +0c3c6e0c574c22e4e39a1ee88e13e0c2c677845d assets/create/lang/unfinished/pt_br.json +a376c60e64007b73f034ebd2f46551f7d4f63237 assets/create/lang/unfinished/ru_ru.json +20530fd24391fcd010d2d20965ed1797142c0ec4 assets/create/lang/unfinished/zh_cn.json +ee78cba92550be14a61bc862d5ae63d31258cc75 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 097193486..3307f8347 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1819,6 +1819,8 @@ "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.storage_on_contraption": "Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "8 RPM", "create.ponder.shared.ctrl_and": "Ctrl +", "create.ponder.shared.rpm16_source": "Source: 16 RPM", @@ -1829,6 +1831,8 @@ "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.contraption_assembly": "Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "Tools and Components used to assemble structures moved as an animated Contraption", "create.ponder.tag.logistics": "Item Transportation", "create.ponder.tag.logistics.description": "Components which help moving items around", "create.ponder.tag.movement_anchor": "Movement Anchors", @@ -1846,6 +1850,10 @@ "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1889,6 +1897,16 @@ "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.clockwork_bearing.header": "Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "3:00", + "create.ponder.clockwork_bearing.text_4": "4:00", + "create.ponder.clockwork_bearing.text_5": "Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "The Second Structure will now rotate as the Minute Hand", + "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", @@ -1991,6 +2009,61 @@ "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.linear_chassis_attachment.header": "Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "Piston Extension Poles", + "create.ponder.piston_pole.text_1": "Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "The Length of pole added at its back determines the Extension Range", + "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.", @@ -2004,12 +2077,59 @@ "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.radial_chassis.header": "Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "Redstone Contacts", + "create.ponder.redstone_contact.text_1": "Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "Super Glue can be removed with Left-Click", + "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", @@ -2023,6 +2143,17 @@ "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", + "create.ponder.windmill_source.header": "Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 8ef6a2ebb..690fa404f 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: 1155", + "_": "Missing Localizations: 1263", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 4df84e931..a8c5d3c4a 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: 186", + "_": "Missing Localizations: 294", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 0b112ec5a..b3d1c305d 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: 1085", + "_": "Missing Localizations: 1193", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 eae6e162c..60960800a 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: 867", + "_": "Missing Localizations: 975", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 c2eefe3dc..a5e05faa6 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: 203", + "_": "Missing Localizations: 311", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 da469281b..163a2c7e0 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: 210", + "_": "Missing Localizations: 318", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 137d78e83..c0d1e71cc 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: 256", + "_": "Missing Localizations: 364", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 7f9b5a584..4933193e5 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: 1354", + "_": "Missing Localizations: 1462", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 a6d4d4d11..098d5ea60 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: 1420", + "_": "Missing Localizations: 1528", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 04fdb8e05..ee7c4ce98 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: 206", + "_": "Missing Localizations: 314", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 2d472fd71..166f470d3 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: 204", + "_": "Missing Localizations: 312", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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 f18894ed3..100ff16ac 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: 209", + "_": "Missing Localizations: 317", "_": "->------------------------] Game Elements [------------------------<-", @@ -1820,6 +1820,8 @@ "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.storage_on_contraption": "UNLOCALIZED: Inventories attached to the Contraption will pick up their drops automatically", + "create.ponder.shared.behaviour_modify_wrench": "UNLOCALIZED: This behaviour can be modified using a Wrench", "create.ponder.shared.rpm8": "UNLOCALIZED: 8 RPM", "create.ponder.shared.ctrl_and": "UNLOCALIZED: Ctrl +", "create.ponder.shared.rpm16_source": "UNLOCALIZED: Source: 16 RPM", @@ -1830,6 +1832,8 @@ "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.contraption_assembly": "UNLOCALIZED: Block Attachment Utility", + "create.ponder.tag.contraption_assembly.description": "UNLOCALIZED: Tools and Components used to assemble structures moved as an animated Contraption", "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", @@ -1847,6 +1851,10 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", + "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", + "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", + "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 the casing", @@ -1890,6 +1898,16 @@ "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.clockwork_bearing.header": "UNLOCALIZED: Animating Structures using Clockwork Bearings", + "create.ponder.clockwork_bearing.text_1": "UNLOCALIZED: Clockwork Bearings attach to blocks in front of them", + "create.ponder.clockwork_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, the structure will be rotated according to the hour of the day", + "create.ponder.clockwork_bearing.text_3": "UNLOCALIZED: 3:00", + "create.ponder.clockwork_bearing.text_4": "UNLOCALIZED: 4:00", + "create.ponder.clockwork_bearing.text_5": "UNLOCALIZED: Right-Click the bearing to start or stop animating the structure", + "create.ponder.clockwork_bearing.text_6": "UNLOCALIZED: In front of the Hour Hand, a second structure can be added", + "create.ponder.clockwork_bearing.text_7": "UNLOCALIZED: Ensure the two Structures are not attached to each other through super glue or similar", + "create.ponder.clockwork_bearing.text_8": "UNLOCALIZED: The Second Structure will now rotate as the Minute Hand", + "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", @@ -1992,6 +2010,61 @@ "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.linear_chassis_attachment.header": "UNLOCALIZED: Attaching blocks using Linear Chassis", + "create.ponder.linear_chassis_attachment.text_1": "UNLOCALIZED: The open faces of a Linear Chassis can be made Sticky", + "create.ponder.linear_chassis_attachment.text_2": "UNLOCALIZED: Click again to make the opposite side sticky", + "create.ponder.linear_chassis_attachment.text_3": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.linear_chassis_attachment.text_4": "UNLOCALIZED: Stickied faces of the Linear Chassis will attach a line of blocks in front of it", + "create.ponder.linear_chassis_attachment.text_5": "UNLOCALIZED: Using a Wrench, a precise Range can be specified for this chassis", + "create.ponder.linear_chassis_attachment.text_6": "UNLOCALIZED: Holding CTRL and scrolling adjusts the range of all attached Chassis Blocks", + "create.ponder.linear_chassis_attachment.text_7": "UNLOCALIZED: Attaching blocks to any other side requires the use of Super Glue", + "create.ponder.linear_chassis_attachment.text_8": "UNLOCALIZED: Using these mechanics, structures of any shape can move as a Contraption", + + "create.ponder.linear_chassis_group.header": "UNLOCALIZED: Moving Linear Chassis in groups", + "create.ponder.linear_chassis_group.text_1": "UNLOCALIZED: Linear Chassis connect to identical Chassis blocks next to them", + "create.ponder.linear_chassis_group.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.linear_chassis_group.text_3": "UNLOCALIZED: Chassis of a different type or facing another direction will not attach", + + "create.ponder.mechanical_bearing.header": "UNLOCALIZED: Movings Structures using the Mechanical Bearing", + "create.ponder.mechanical_bearing.text_1": "UNLOCALIZED: Mechanical Bearings attach to the block in front of them", + "create.ponder.mechanical_bearing.text_2": "UNLOCALIZED: Upon receiving Rotational Force, it will assemble it into a Rotating Contraption", + + "create.ponder.mechanical_drill.header": "UNLOCALIZED: Breaking Blocks with the Mechanical Drill", + "create.ponder.mechanical_drill.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Drill will break blocks directly in front of it", + "create.ponder.mechanical_drill.text_2": "UNLOCALIZED: Its mining speed depends on the Rotational Input", + + "create.ponder.mechanical_drill_contraption.header": "UNLOCALIZED: Using Mechanical Drills on Contraptions", + "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", + "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", + "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", + "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", + "create.ponder.mechanical_piston.text_3": "UNLOCALIZED: Sticky Mechanical Pistons can pull the attached blocks back", + + "create.ponder.mechanical_piston_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Piston", + "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", + "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", + "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", + "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", + + "create.ponder.mechanical_saw_contraption.header": "UNLOCALIZED: Using Mechanical Saws on Contraptions", + "create.ponder.mechanical_saw_contraption.text_1": "UNLOCALIZED: Whenever Saws are moved as part of an animated Contraption...", + "create.ponder.mechanical_saw_contraption.text_2": "UNLOCALIZED: ...they will cut any trees the contraption runs them into", + + "create.ponder.mechanical_saw_processing.header": "UNLOCALIZED: Processing Items on the Mechanical Saw", + "create.ponder.mechanical_saw_processing.text_1": "UNLOCALIZED: Upward facing Mechanical Saws can process a variety of items", + "create.ponder.mechanical_saw_processing.text_2": "UNLOCALIZED: The processed item always moves against the rotational input to the saw", + "create.ponder.mechanical_saw_processing.text_3": "UNLOCALIZED: Saws can work in-line with Mechanical Belts", + "create.ponder.mechanical_saw_processing.text_4": "UNLOCALIZED: When an ingredient has multiple possible outcomes, the filter slot can specify it", + "create.ponder.mechanical_saw_processing.text_5": "UNLOCALIZED: Without filter, the Saw would cycle through all outcomes instead", + + "create.ponder.piston_pole.header": "UNLOCALIZED: Piston Extension Poles", + "create.ponder.piston_pole.text_1": "UNLOCALIZED: Without attached Poles, a Mechanical Piston cannot move", + "create.ponder.piston_pole.text_2": "UNLOCALIZED: The Length of pole added at its back determines the Extension Range", + "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.", @@ -2005,12 +2078,59 @@ "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.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", + "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", + "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", + "create.ponder.radial_chassis.text_3": "UNLOCALIZED: The side faces of a Radial Chassis can be made Sticky", + "create.ponder.radial_chassis.text_4": "UNLOCALIZED: Click again to make all other sides sticky", + "create.ponder.radial_chassis.text_5": "UNLOCALIZED: Sneak and Right-Click with an empty hand to remove the slime", + "create.ponder.radial_chassis.text_6": "UNLOCALIZED: Whenever a Block is next to a sticky face...", + "create.ponder.radial_chassis.text_7": "UNLOCALIZED: ...it will attach all reachable blocks within a radius on that layer", + "create.ponder.radial_chassis.text_8": "UNLOCALIZED: Using a Wrench, a precise Radius can be specified for this chassis", + "create.ponder.radial_chassis.text_9": "UNLOCALIZED: Blocks not reachable by any sticky face will not attach", + + "create.ponder.redstone_contact.header": "UNLOCALIZED: Redstone Contacts", + "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", + "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", + "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", + "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", + + "create.ponder.rope_pulley_attachment.header": "UNLOCALIZED: Moving Pulleys as part of a Contraption", + "create.ponder.rope_pulley_attachment.text_1": "UNLOCALIZED: Whenever Pulleys are themselves being moved by a Contraption...", + "create.ponder.rope_pulley_attachment.text_2": "UNLOCALIZED: ...its attached structure will be dragged with it", + "create.ponder.rope_pulley_attachment.text_3": "UNLOCALIZED: Mind that pulleys are only movable while stopped", + + "create.ponder.rope_pulley_modes.header": "UNLOCALIZED: Movement Modes of the Rope Pulley", + "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", + "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", "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.stabilized_bearings.header": "UNLOCALIZED: Stabilized Contraptions", + "create.ponder.stabilized_bearings.text_1": "UNLOCALIZED: Whenever Mechanical Bearings are themselves part of a moving Structure..", + "create.ponder.stabilized_bearings.text_2": "UNLOCALIZED: ..they will attempt to keep themselves upright", + "create.ponder.stabilized_bearings.text_3": "UNLOCALIZED: Once again, the bearing will attach to the block in front of it", + "create.ponder.stabilized_bearings.text_4": "UNLOCALIZED: As a result, the entire sub-Contraption will stay upright", + + "create.ponder.sticker.header": "UNLOCALIZED: Attaching blocks using the Sticker", + "create.ponder.sticker.text_1": "UNLOCALIZED: Stickers are ideal for Redstone-controlled block attachment", + "create.ponder.sticker.text_2": "UNLOCALIZED: Upon receiving a signal, it will toggle its state", + "create.ponder.sticker.text_3": "UNLOCALIZED: If it is now moved in a contraption, the block will move with it", + "create.ponder.sticker.text_4": "UNLOCALIZED: Toggled once again, the block is no longer attached", + + "create.ponder.super_glue.header": "UNLOCALIZED: Attaching blocks using Super Glue", + "create.ponder.super_glue.text_1": "UNLOCALIZED: Super Glue can be used between any two blocks", + "create.ponder.super_glue.text_2": "UNLOCALIZED: The attached blocks will move together when assembled into a Contraption", + "create.ponder.super_glue.text_3": "UNLOCALIZED: Whenever Super Glue is held in the off-hand...", + "create.ponder.super_glue.text_4": "UNLOCALIZED: ...added blocks will be glued to the face they were placed on automatically", + "create.ponder.super_glue.text_5": "UNLOCALIZED: Super Glue can be removed with Left-Click", + "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", @@ -2024,6 +2144,17 @@ "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", + "create.ponder.windmill_source.header": "UNLOCALIZED: Generating Rotational Force using Windmill Bearings", + "create.ponder.windmill_source.text_1": "UNLOCALIZED: Windmill Bearings attach to the block in front of them", + "create.ponder.windmill_source.text_2": "UNLOCALIZED: If enough Sail-like blocks are attached to the block, it can act as a Windmill", + "create.ponder.windmill_source.text_3": "UNLOCALIZED: Activated with Right-Click, the Windmill Bearing will start providing Rotational Force", + "create.ponder.windmill_source.text_4": "UNLOCALIZED: The Amount of Sail Blocks determine its Rotation Speed", + "create.ponder.windmill_source.text_5": "UNLOCALIZED: Use a Wrench to configure its rotation direction", + "create.ponder.windmill_source.text_6": "UNLOCALIZED: Right-click the Bearing anytime to stop and edit the Structure again", + + "create.ponder.windmill_structure.header": "UNLOCALIZED: Windmill Contraptions", + "create.ponder.windmill_structure.text_1": "UNLOCALIZED: Any Structure can count as a valid Windmill, as long as it contains at least 8 sail-like Blocks.", + "_": "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/PonderElement.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java index 9c482406e..7d1c61f71 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderElement.java @@ -4,6 +4,8 @@ public class PonderElement { boolean visible = true; + public void whileSkipping(PonderScene scene) {} + public void tick(PonderScene scene) {} public void reset(PonderScene 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 b513d40cc..679854274 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderScene.java @@ -26,10 +26,10 @@ 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.animation.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.animation.LerpedFloat; import com.simibubi.create.foundation.utility.outliner.Outliner; import net.minecraft.block.BlockState; @@ -90,7 +90,9 @@ public class PonderScene { int currentTime; public PonderScene(PonderWorld world, ResourceLocation component, Collection tags) { - world.scene = this; + if (world != null) + world.scene = this; + pointOfInterest = Vec3d.ZERO; textIndex = 1; @@ -289,8 +291,11 @@ public class PonderScene { throw new IllegalStateException("Cannot seek backwards. Rewind first."); while (currentTime < time && !finished) { + forEach(e -> e.whileSkipping(this)); tick(); } + + forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } public void addToSceneTime(int time) { 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 8f3e79564..ec5a41f0f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -48,7 +48,7 @@ import net.minecraftforge.registries.ForgeRegistries; public class PonderWorld extends SchematicWorld { public PonderScene scene; - + protected Map originalBlocks; protected Map originalTileEntities; protected Map blockBreakingProgressions; @@ -101,6 +101,13 @@ public class PonderWorld extends SchematicWorld { fixVirtualTileEntities(); } + public void restoreBlocks(Selection selection) { + selection.forEach(p -> { + if (originalBlocks.containsKey(p)) + blocks.put(p, originalBlocks.get(p)); + }); + } + public void pushFakeLight(int light) { this.overrideLight = light; } @@ -184,6 +191,9 @@ public class PonderWorld extends SchematicWorld { entity.lastTickPosZ = entity.getZ(); entity.tick(); + if (entity.getY() <= -.5f) + entity.remove(); + if (!entity.isAlive()) iterator.remove(); } @@ -230,14 +240,14 @@ public class PonderWorld extends SchematicWorld { } } } - + public void setBlockBreakingProgress(BlockPos pos, int damage) { if (damage == 0) blockBreakingProgressions.remove(pos); else blockBreakingProgressions.put(pos, damage - 1); } - + public Map getBlockBreakingProgressions() { return blockBreakingProgressions; } 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 b96b7a61d..e628ae1f3 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -25,8 +25,27 @@ import com.simibubi.create.foundation.ponder.elements.ParrotElement.ParrotPose; import com.simibubi.create.foundation.ponder.elements.ParrotElement.SpinOnComponentPose; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; -import com.simibubi.create.foundation.ponder.instructions.*; +import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction; +import com.simibubi.create.foundation.ponder.instructions.AnimateTileEntityInstruction; +import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; +import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; +import com.simibubi.create.foundation.ponder.instructions.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.HighlightValueBoxInstruction; +import com.simibubi.create.foundation.ponder.instructions.KeyframeInstruction; +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; +import com.simibubi.create.foundation.ponder.instructions.ReplaceBlocksInstruction; +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; @@ -315,6 +334,12 @@ public class SceneBuilder { expands, duration)); } + public void showFilterSlotInput(Vec3d location, int duration) { + float s = .1f; + Vec3d expands = new Vec3d(s, s, s); + addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); + } + public void showLine(PonderPalette color, Vec3d start, Vec3d end, int duration) { addInstruction(new LineInstruction(color, start, end, duration)); } @@ -428,6 +453,10 @@ public class SceneBuilder { addInstruction(new FadeOutOfSceneInstruction<>(15, fadeOutDirection, link)); } + public void restoreBlocks(Selection selection) { + addInstruction(scene -> scene.world.restoreBlocks(selection)); + } + public ElementLink makeSectionIndependent(Selection selection) { WorldSectionElement worldSectionElement = new WorldSectionElement(selection); ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); @@ -608,7 +637,7 @@ public class SceneBuilder { BeltTileEntity beltTileEntity = (BeltTileEntity) tileEntity; TransportedItemStackHandlerBehaviour transporter = beltTileEntity.getBehaviour(TransportedItemStackHandlerBehaviour.TYPE); - transporter.handleProcessingOnAllItems(tis -> TransportedResult.removeItem()); + transporter.handleCenteredProcessingOnAllItems(.52f, tis -> TransportedResult.removeItem()); }); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java index bbfbc58f6..6815fc3c2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalDrillScenes.java @@ -54,12 +54,12 @@ public class MechanicalDrillScenes { ElementLink plankEntity = scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, .1f, 0), new ItemStack(Items.OAK_PLANKS)); scene.idle(20); - + scene.idle(15); + + scene.world.modifyEntity(plankEntity, Entity::remove); scene.world.modifyKineticSpeed(util.select.everywhere(), f -> 4 * f); scene.effects.rotationSpeedIndicator(breakingPos.east(3)); - - scene.idle(20); - scene.world.modifyEntity(plankEntity, Entity::remove); + scene.idle(5); scene.world.setBlock(breakingPos, Blocks.OAK_PLANKS.getDefaultState(), false); scene.world.showSection(util.select.position(breakingPos), Direction.DOWN); @@ -169,7 +169,7 @@ public class MechanicalDrillScenes { .attachKeyFrame() .placeNearTarget() .pointAt(util.vector.blockSurface(util.grid.at(4, 3, 2), Direction.WEST)) - .text("Inventories attached to the Contraption will pick up their drops automatically"); + .sharedText("storage_on_contraption"); scene.idle(70); scene.world.showSection(planks, Direction.DOWN); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index acac8c9a3..fb6aa603f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -1,10 +1,26 @@ package com.simibubi.create.foundation.ponder.content; +import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; +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.WorldSectionElement; +import com.simibubi.create.foundation.utility.Pointing; +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.util.Direction; +import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; public class MechanicalSawScenes { @@ -12,27 +28,367 @@ public class MechanicalSawScenes { scene.title("mechanical_saw_processing", "Processing Items on the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); scene.world.showSection(util.select.layer(0), Direction.UP); - + BlockPos shaftPos = util.grid.at(2, 1, 3); - + scene.world.setBlock(shaftPos, AllBlocks.SHAFT.getDefaultState() + .with(ShaftBlock.AXIS, Axis.Z), false); + + BlockPos sawPos = util.grid.at(2, 1, 2); + Selection sawSelect = util.select.position(sawPos); + scene.world.modifyTileNBT(sawSelect, SawTileEntity.class, nbt -> nbt.putInt("RecipeIndex", 0)); + scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 5), Direction.DOWN); + scene.idle(10); + scene.effects.rotationDirectionIndicator(shaftPos); + scene.world.showSection(sawSelect, Direction.DOWN); + scene.idle(10); + scene.overlay.showText(50) + .attachKeyFrame() + .text("Upward facing Mechanical Saws can process a variety of items") + .pointAt(util.vector.blockSurface(sawPos, Direction.WEST)) + .placeNearTarget(); + scene.idle(45); + + ItemStack log = new ItemStack(Items.OAK_LOG); + ItemStack strippedLog = new ItemStack(Items.STRIPPED_OAK_LOG); + ItemStack planks = new ItemStack(Items.OAK_PLANKS); + + Vec3d itemSpawn = util.vector.centerOf(sawPos.up() + .west()); + ElementLink logItem = scene.world.createItemEntity(itemSpawn, util.vector.of(0, 0, 0), log); + scene.idle(12); + + scene.overlay.showControls(new InputWindowElement(itemSpawn, Pointing.DOWN).withItem(log), 20); + scene.idle(10); + + scene.world.modifyEntity(logItem, e -> e.setMotion(util.vector.of(0.05, 0.2, 0))); + scene.idle(12); + + scene.world.modifyEntity(logItem, Entity::remove); + scene.world.createItemOnBeltLike(sawPos, Direction.WEST, log); + scene.idle(30); + + logItem = scene.world.createItemEntity(util.vector.topOf(sawPos) + .add(0.5, -.1, 0), util.vector.of(0.05, 0.18, 0), strippedLog); + scene.idle(12); + scene.overlay.showControls(new InputWindowElement(itemSpawn.add(2, 0, 0), Pointing.DOWN).withItem(strippedLog), + 20); + scene.idle(30); + + scene.overlay.showText(60) + .attachKeyFrame() + .text("The processed item always moves against the rotational input to the saw") + .pointAt(util.vector.blockSurface(sawPos, Direction.UP)) + .placeNearTarget(); + scene.idle(70); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.effects.rotationDirectionIndicator(shaftPos); + scene.world.modifyEntity(logItem, e -> e.setMotion(util.vector.of(-0.05, 0.2, 0))); + scene.idle(12); + + scene.world.modifyEntity(logItem, Entity::remove); + scene.world.createItemOnBeltLike(sawPos, Direction.EAST, strippedLog); + scene.idle(40); + + logItem = scene.world.createItemEntity(util.vector.topOf(sawPos) + .add(-0.5, -.1, 0), util.vector.of(-0.05, 0.18, 0), planks); + scene.idle(22); + + Selection otherBelt = util.select.fromTo(3, 1, 3, 4, 1, 2); + Selection belt = util.select.fromTo(0, 1, 2, 1, 1, 3); + + scene.world.setKineticSpeed(otherBelt, 0); + scene.world.setKineticSpeed(belt, 0); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.modifyEntity(logItem, Entity::remove); + scene.world.setBlock(shaftPos, AllBlocks.COGWHEEL.getDefaultState() + .with(ShaftBlock.AXIS, Axis.Z), true); + scene.idle(3); + scene.addKeyframe(); + + ElementLink beltSection = scene.world.showIndependentSection(belt, Direction.EAST); + scene.world.moveSection(beltSection, util.vector.of(0, 100, 0), 0); + scene.idle(1); + scene.world.removeItemsFromBelt(util.grid.at(1, 1, 2)); + scene.idle(1); + scene.world.setKineticSpeed(belt, -64); + scene.idle(1); + scene.world.moveSection(beltSection, util.vector.of(0, -100, 0), 0); + scene.idle(3); + + ElementLink otherBeltSection = + scene.world.showIndependentSection(otherBelt, Direction.WEST); + scene.world.moveSection(otherBeltSection, util.vector.of(0, 100, 0), 0); + scene.idle(1); + scene.world.removeItemsFromBelt(util.grid.at(3, 1, 2)); + scene.idle(1); + scene.world.setKineticSpeed(otherBelt, -64); + scene.idle(1); + scene.world.moveSection(otherBeltSection, util.vector.of(0, -100, 0), 0); + scene.idle(3); + + ItemStack stone = new ItemStack(Blocks.STONE); + BlockPos firstBelt = util.grid.at(0, 1, 2); + scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); + scene.overlay.showText(60) + .text("Saws can work in-line with Mechanical Belts") + .pointAt(util.vector.blockSurface(firstBelt, Direction.WEST)) + .placeNearTarget(); + scene.idle(60); + scene.rotateCameraY(-90); + scene.idle(20); + + Vec3d filter = util.vector.of(2.5, 1 + 13 / 16f, 2.75); + scene.overlay.showFilterSlotInput(filter, 80); + ItemStack bricks = new ItemStack(Blocks.STONE_BRICKS); + scene.overlay.showControls(new InputWindowElement(filter, Pointing.DOWN).withItem(bricks), 80); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.idle(7); + scene.world.setFilterData(util.select.position(sawPos), SawTileEntity.class, bricks); + scene.idle(10); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("When an ingredient has multiple possible outcomes, the filter slot can specify it") + .pointAt(filter) + .placeNearTarget(); + scene.idle(90); + + scene.rotateCameraY(90); + scene.world.createItemOnBelt(firstBelt, Direction.WEST, stone); + scene.idle(20); + + scene.markAsFinished(); + scene.overlay.showText(100) + .text("Without filter, the Saw would cycle through all outcomes instead") + .colored(PonderPalette.RED) + .pointAt(filter) + .placeNearTarget(); + scene.idle(65); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); } public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(3, 1, 1)) + .add(util.select.position(1, 1, 2)), Direction.UP); + + scene.world.setKineticSpeed(util.select.position(5, 0, 1), -8); + scene.world.setKineticSpeed(util.select.fromTo(3, 1, 2, 5, 1, 2), 16); + scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + scene.world.showSection(util.select.fromTo(4, 1, 2, 5, 1, 2), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(3, 1, 2), Direction.DOWN); + + scene.idle(20); + scene.world.showSection(util.select.fromTo(2, 1, 2, 2, 3, 2), Direction.UP); + scene.world.showSection(util.select.layersFrom(4), Direction.UP); + + BlockPos breakingPos = util.grid.at(2, 1, 2); + scene.idle(5); + for (int i = 0; i < 10; i++) { + scene.idle(10); + scene.world.incrementBlockBreakingProgress(breakingPos); + if (i == 1) { + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(breakingPos, Direction.WEST)) + .text("When given Rotational Force, a Mechanical Saw will cut trees directly in front of it"); + } + } + + scene.world.replaceBlocks(util.select.fromTo(2, 2, 2, 2, 6, 2), Blocks.AIR.getDefaultState(), true); + + scene.world.destroyBlock(util.grid.at(3, 5, 0)); + scene.world.destroyBlock(util.grid.at(0, 4, 1)); + scene.world.destroyBlock(util.grid.at(2, 6, 1)); + scene.world.destroyBlock(util.grid.at(1, 4, 0)); + scene.world.destroyBlock(util.grid.at(1, 6, 2)); + scene.world.destroyBlock(util.grid.at(1, 5, 3)); + scene.world.destroyBlock(util.grid.at(0, 4, 3)); + + scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.getDefaultState(), false); + + for (int i = 0; i < 5; i++) { + Vec3d dropPos = util.vector.centerOf(breakingPos.up(i)); + float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); + scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); + } + + scene.idle(35); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world.hideSection(util.select.layersFrom(2) + .add(util.select.fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.idle(15); + scene.world.setBlocks(util.select.fromTo(2, 1, 2, 1, 20, 3), Blocks.JUNGLE_LOG.getDefaultState(), false); + scene.world.showSection(util.select.layersFrom(2) + .add(util.select.fromTo(2, 1, 2, 1, 1, 3)), Direction.UP); + scene.idle(15); + + scene.world.hideSection(util.select.fromTo(2, 1, 2, 1, 1, 3) + .substract(util.select.position(breakingPos)), Direction.WEST); + scene.idle(10); + scene.overlay.showSelectionWithText(util.select.position(breakingPos), 90) + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .placeNearTarget() + .text("In order to cut the tree fully, the Saw has to break the last block connecting it to the ground"); + + scene.idle(25); + for (int i = 0; i < 10; i++) { + scene.idle(10); + scene.world.incrementBlockBreakingProgress(breakingPos); + } + + for (int i = 0; i < 30; i++) { + scene.world.replaceBlocks(util.select.fromTo(2, i + 1, 2, 1, i + 1, 3), Blocks.AIR.getDefaultState(), true); + for (int x = 1; x <= 2; x++) { + for (int z = 2; z <= 3; z++) { + Vec3d dropPos = util.vector.centerOf(x, i + 1, z); + float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); + scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), + new ItemStack(Items.JUNGLE_LOG)); + } + } + scene.idle(1); + } } public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); - scene.configureBasePlate(0, 0, 5); - scene.world.showSection(util.select.layer(0), Direction.UP); + scene.configureBasePlate(1, 0, 6); + scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(3, 1, 1)) + .add(util.select.position(1, 1, 2)) + .add(util.select.position(2, 1, 4)), Direction.UP); + + Selection kinetics = util.select.fromTo(6, 1, 2, 6, 1, 6); + scene.idle(5); - scene.world.showSection(util.select.layersFrom(1), Direction.DOWN); + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(6, 1, 1, 8, 1, 1), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 3, 5, 1, 2), Direction.DOWN); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(4, 1, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(4, 1, 2), Direction.EAST, contraption); + scene.idle(5); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(util.grid.at(4, 1, 3))) + .text("Whenever Saws are moved as part of an animated Contraption..."); + scene.idle(70); + + Selection saws = util.select.fromTo(4, 1, 2, 4, 1, 3); + + Selection tree = util.select.fromTo(2, 1, 3, 2, 7, 3) + .add(util.select.layersFrom(3)); + scene.world.showSection(tree, Direction.UP); + scene.world.setKineticSpeed(util.select.position(5, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.setKineticSpeed(saws, 16); + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + + BlockPos breakingPos = util.grid.at(2, 1, 3); + + for (int i = 0; i < 10; i++) { + scene.idle(3); + scene.world.incrementBlockBreakingProgress(breakingPos); + if (i == 2) { + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.blockSurface(breakingPos, Direction.WEST)) + .text("...they will cut any trees the contraption runs them into"); + } + } + + scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.getDefaultState(), true); + scene.world.destroyBlock(util.grid.at(4, 5, 1)); + scene.world.destroyBlock(util.grid.at(1, 4, 2)); + scene.world.destroyBlock(util.grid.at(3, 6, 2)); + scene.world.destroyBlock(util.grid.at(2, 4, 1)); + scene.world.destroyBlock(util.grid.at(2, 6, 3)); + scene.world.destroyBlock(util.grid.at(2, 5, 2)); + scene.world.destroyBlock(util.grid.at(1, 4, 2)); + scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.getDefaultState(), false); + + for (int i = 0; i < 5; i++) { + Vec3d dropPos = util.vector.centerOf(breakingPos.up(i)); + float distance = (float) dropPos.distanceTo(util.vector.centerOf(breakingPos)); + scene.world.createItemEntity(dropPos, util.vector.of(-distance / 20, 0, 0), new ItemStack(Items.OAK_LOG)); + } + + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + scene.world.setKineticSpeed(saws, 0); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(tree, Direction.UP); + scene.idle(40); + + scene.world.restoreBlocks(tree); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.world.glueBlockOnto(util.grid.at(5, 2, 2), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(5, 2, 2), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(70); + + scene.world.showSection(tree, Direction.DOWN); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.setKineticSpeed(saws, 16); + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + + for (int i = 0; i < 10; i++) { + scene.idle(3); + scene.world.incrementBlockBreakingProgress(breakingPos); + } + + scene.world.replaceBlocks(util.select.fromTo(2, 2, 3, 2, 6, 3), Blocks.AIR.getDefaultState(), true); + scene.world.destroyBlock(util.grid.at(4, 5, 1)); + scene.world.destroyBlock(util.grid.at(1, 4, 2)); + scene.world.destroyBlock(util.grid.at(3, 6, 2)); + scene.world.destroyBlock(util.grid.at(2, 4, 1)); + scene.world.destroyBlock(util.grid.at(2, 6, 3)); + scene.world.destroyBlock(util.grid.at(2, 5, 2)); + scene.world.destroyBlock(util.grid.at(1, 4, 2)); + scene.world.replaceBlocks(util.select.layersFrom(4), Blocks.AIR.getDefaultState(), false); + + scene.world.moveSection(pistonHead, util.vector.of(-1, 0, 0), 20); + scene.world.moveSection(contraption, util.vector.of(-1, 0, 0), 20); + scene.idle(20); + scene.world.setKineticSpeed(saws, 0); + scene.idle(10); + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(3, 2, 2), Pointing.DOWN).withItem(new ItemStack(Blocks.OAK_LOG)), + 60); + scene.idle(20); } } 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 73d233ba2..bd83c5bd6 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 @@ -17,6 +17,7 @@ public class SharedText { add("movement_anchors", "With the help of Chassis or Super Glue, larger structures can be moved."); add("behaviour_modify_wrench", "This behaviour can be modified using a Wrench"); + add("storage_on_contraption", "Inventories attached to the Contraption will pick up their drops automatically"); } 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 87f2b03d4..31ed6efb0 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 @@ -253,13 +253,34 @@ public class WorldSectionElement extends AnimatedSceneElement { prevAnimatedRotation = animatedRotation; if (!isVisible()) return; - if (renderedTileEntities == null) - return; + loadTEsIfMissing(scene.getWorld()); + renderedTileEntities.removeIf(te -> scene.getWorld() + .getTileEntity(te.getPos()) != te); renderedTileEntities.forEach(te -> { if (te instanceof ITickableTileEntity) ((ITickableTileEntity) te).tick(); }); } + + @Override + public void whileSkipping(PonderScene scene) { + if (redraw) + renderedTileEntities = null; + redraw = false; + } + + protected void loadTEsIfMissing(PonderWorld world) { + if (renderedTileEntities != null) + return; + renderedTileEntities = new ArrayList<>(); + section.forEach(pos -> { + TileEntity tileEntity = world.getTileEntity(pos); + if (tileEntity == null) + return; + renderedTileEntities.add(tileEntity); + tileEntity.updateContainingBlockInfo(); + }); + } @Override protected void renderLayer(PonderWorld world, IRenderTypeBuffer buffer, RenderType type, MatrixStack ms, float fade, @@ -299,7 +320,7 @@ public class WorldSectionElement extends AnimatedSceneElement { buffer.getBuffer(ModelBakery.BLOCK_DESTRUCTION_RENDER_LAYERS.get(entry.getValue())), overlayMS.peek()); Minecraft.getInstance() .getBlockRendererDispatcher() - .renderModel(world.getBlockState(BlockPos.ZERO), pos, world, ms, builder, EmptyModelData.INSTANCE); + .renderModel(world.getBlockState(pos), pos, world, ms, builder, EmptyModelData.INSTANCE); ms.pop(); } } @@ -341,23 +362,11 @@ public class WorldSectionElement extends AnimatedSceneElement { RenderSystem.disableTexture(); WorldRenderer.drawBox(ms, buffer.getBuffer(RenderType.getLines()), shape.getBoundingBox() .offset(selectedBlock), 1, 1, 1, 0.6f); -// if (buffer instanceof SuperRenderTypeBuffer) -// ((SuperRenderTypeBuffer) buffer).draw(RenderType.getLines()); ms.pop(); } private void renderTileEntities(PonderWorld world, MatrixStack ms, IRenderTypeBuffer buffer, float pt) { - if (renderedTileEntities == null) { - renderedTileEntities = new ArrayList<>(); - section.forEach(pos -> { - TileEntity tileEntity = world.getTileEntity(pos); - if (tileEntity == null) - return; - renderedTileEntities.add(tileEntity); - tileEntity.updateContainingBlockInfo(); - }); - } else - renderedTileEntities.removeIf(te -> world.getTileEntity(te.getPos()) != te); + loadTEsIfMissing(world); TileEntityRenderHelper.renderTileEntities(world, renderedTileEntities, ms, new MatrixStack(), buffer, pt); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java index 6f3eaa605..e516b3c6d 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/BlockHelper.java @@ -164,13 +164,14 @@ public class BlockHelper { public static void destroyBlock(World world, BlockPos pos, float effectChance, Consumer droppedItemCallback) { + IFluidState ifluidstate = world.getFluidState(pos); BlockState state = world.getBlockState(pos); if (world.rand.nextFloat() < effectChance) world.playEvent(2001, pos, Block.getStateId(state)); TileEntity tileentity = state.hasTileEntity() ? world.getTileEntity(pos) : null; - if (world.getGameRules() + if (world instanceof ServerWorld && world.getGameRules() .getBoolean(GameRules.DO_TILE_DROPS) && !world.restoringBlockSnapshots) { for (ItemStack itemStack : Block.getDrops(state, (ServerWorld) world, pos, tileentity)) droppedItemCallback.accept(itemStack); diff --git a/src/main/resources/ponder/mechanical_saw/breaker.nbt b/src/main/resources/ponder/mechanical_saw/breaker.nbt index 214b86e21c56ec7ab406eccf2965ce4cdc79fb3d..f9d4b030c9ac89d5dea6bcd55830d3ee86e98b2d 100644 GIT binary patch literal 886 zcmV-+1Bv_}iwFP!000000JWE0Z<{a_h7Vv;ApP1$rTvY4T=lNnG^sb$w067LP2>`X zSRsIHw@G)kU$xu)wb=oZ$hEQ6Zb(Rp{rEjE$Hy3F04X3&f076Q)IE~-D|yE$B%~5l zP{Ki7DU5E*I$!Wi{`rwY)YQBmw7nvTxxj*SBlelVzyul-dgw$RI>^%x(wNZTM`t2~ zAD51b6???e8B;8mPJaah`3Ve+o}bXbAj@0~G04E^exTz5M-FvH&rfJzV#|CD=^zh3 z(9MO*v(A`2>x{{>O9y%QQL#oIv2@1d`M|;SSLpFh2nXsXG%zDe9flt7gdsm+=V_lg zFfgG96FC^@JcR=}3=E7uU!j4~V?`c1$iokGHRkfHGbYbEWAg0ML7sj_9)5Jj=^zh3 z(AA;Kv(DJ|0+(l(4)XBR*Sss1&e-aCi0Lonu@|6$+6X;#A`czpq0`qGa^z5FY~P1N zI>^AJmilq|(HYw}q|1-aq>w>W-HI6E>xPgiY&@M_$)9}F@U59jGDsk#Q#i{Rk^jy) zT{b0|ENDdp&9yLbHx2ur5m^@|g5-*<#SP6Dut9fGW!D#07mRRjGm*jQGc5&St(&8z zjGr?+6X%$+0OF7JT_pmkbl74SOVyy%+5uT_AFm=9e$YnJpYuH#!FROcbII7u0 z07n;1Q&KW*A!+njn#-j(S`{~RN&fs&?z6UAHMEa_uH~UiiKP%<3bN!~E*?*o{y{SS z_Y;8(VGjS#eCuJ3EKj^&6UUM{XmCk{AnNpak^s8GGLvt1^SYW-K_+=!Nh5MlPrTj{ zysB4|%@I}=nVh7CFm<|3AemAbs>%rj?-R&mJC_Y|f+3#ak{i`(yqJ^(-^Fc0&WGihS$4ncEwv_R;U^(R&zp1U28PMxm?qLR)mWLPL;|8mvvQ4W|VOO zNU%HdNOVc^Ij(4q%ZYrOJk8)?zq;n~ai1n}(n)NeZrh=il3an~PgvmZD)V(E--y5A MFVudS>L(Ha0D8WySO5S3 literal 889 zcmV-<1BUz`iwFP!000000JWFPZrd;rMMom#$Z}o<8lbZ7`HbBrO2}Hg$OCayTT!1YihMibqZWKtBU~Vtk?@#Jo^K z2`)jmAq?*GGM&o=|NIyNsY=-n+BE`^R7~+^#32({n808{4;|v6Lp}Xag9$BuOomwe zxO8-^$Rn1?*kZYK+7|TWC$KPPenJl&Vqs{(!@2J^Vnk z7B0^wWAkh>HqR~{>fuMn8hFGq8Jp)L2h+CD<4g#9>L;`?gN`~3J)Ld z7kz$03uD`ZE}ga!k8_?lYTjhbJxDxssDre4h^W@B>YaxjdUp z*E#R-*5<$7EtifE4#Cg6Ov5d;%L!=QsFMZaThI6C{HeLNS4hwC4ElQi?^D^YL61 zT#3{O6E(|l_=zxV!VrjW_*&hGbPgMI9~EDHsmrY9Qg)e0VDMSwiq~5=Cku?9)@-US znWzJZK9q|WIJv5- zT=2;jLZhc>E=6ym$nL~~|M{ieC)?M$V><K(jcgC0_3d zS(K~s<_fFRj0;)uTHkJCh$jL=6)A_{J#Gc;m)L`)!w~a zEz-6h%%K|Cw)DQl`YXLY6vC0orn&rPktl%=@2fv&hzF`R3aG0V#$8&5?o6;M?#`4iCv zPiL$UDa*%rtUS-)al6fCINj$-oHY`=*;(p^JuYjG^|It@Kh7v8+=-)4OtJ5JVafte P&foAC>2n From 0ca388141cb322e709e7f5bb872a2001f3ff5491 Mon Sep 17 00:00:00 2001 From: Snownee Date: Mon, 15 Mar 2021 13:00:55 +0800 Subject: [PATCH 108/124] Better line breaking --- .../create/foundation/item/TooltipHelper.java | 25 +----- .../create/foundation/ponder/PonderUI.java | 3 +- .../ponder/content/PonderTagScreen.java | 3 +- .../ponder/elements/TextWindowElement.java | 5 +- .../create/foundation/utility/FontHelper.java | 85 +++++++++++++++++++ 5 files changed, 94 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/utility/FontHelper.java diff --git a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java index 94d292b7a..39d191611 100644 --- a/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java +++ b/src/main/java/com/simibubi/create/foundation/item/TooltipHelper.java @@ -21,6 +21,7 @@ import com.simibubi.create.content.contraptions.components.flywheel.engine.Engin import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.content.curiosities.tools.AllToolTiers; import com.simibubi.create.foundation.item.ItemDescription.Palette; +import com.simibubi.create.foundation.utility.FontHelper; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.client.Minecraft; @@ -88,30 +89,8 @@ public class TooltipHelper { words.add(word); } - // Apply hard wrap FontRenderer font = Minecraft.getInstance().fontRenderer; - List lines = new LinkedList<>(); - StringBuilder currentLine = new StringBuilder(); - int width = 0; - for (String word : words) { - int newWidth = font.getStringWidth(word); - if (width + newWidth > maxWidthPerLine) { - if (width > 0) { - String line = currentLine.toString(); - lines.add(line); - currentLine = new StringBuilder(); - width = 0; - } else { - lines.add(word); - continue; - } - } - currentLine.append(word); - width += newWidth; - } - if (width > 0) { - lines.add(currentLine.toString()); - } + List lines = FontHelper.cutString(font, markedUp, maxWidthPerLine); // Format String lineStart = Strings.repeat(" ", indent); 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 f4f9d5d38..229be5f19 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -25,6 +25,7 @@ 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.ColorHelper; +import com.simibubi.create.foundation.utility.FontHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.animation.LerpedFloat; @@ -486,7 +487,7 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.translated(x, y, 0); RenderSystem.rotatef(indexDiff * -75, 1, 0, 0); RenderSystem.translated(0, 0, 5); - font.drawSplitString(title, 0, 0, left.x - 51, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + FontHelper.drawSplitString(font, title, 0, 0, left.x - 51, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); RenderSystem.popMatrix(); if (chapter != null) { 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 a443af1f2..09abfaadb 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 @@ -16,6 +16,7 @@ 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.FontHelper; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.block.Block; @@ -197,7 +198,7 @@ public class PonderTagScreen extends AbstractSimiScreen { PonderUI.renderBox(x - 3, y - 3, w + 6, h + 6, false); RenderSystem.translated(0, 0, 100); - font.drawSplitString(desc, x, y, w, 0xeeeeee); + FontHelper.drawSplitString(font, desc, x, y, w, 0xeeeeee); RenderSystem.popMatrix(); } 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 615169fee..b41861a36 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 @@ -10,6 +10,7 @@ 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.FontHelper; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec2f; @@ -120,8 +121,8 @@ public class TextWindowElement extends AnimatedOverlayElement { RenderSystem.popMatrix(); } - screen.getFontRenderer() - .drawSplitString(bakedText, targetX - 10, 3, textWidth, ColorHelper.applyAlpha(brighterColor, fade)); + FontHelper.drawSplitString(screen.getFontRenderer(), bakedText, targetX - 10, 3, textWidth, + ColorHelper.applyAlpha(brighterColor, fade)); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java b/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java new file mode 100644 index 000000000..a22218685 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/utility/FontHelper.java @@ -0,0 +1,85 @@ +package com.simibubi.create.foundation.utility; + +import java.text.BreakIterator; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.Matrix4f; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.TransformationMatrix; +import net.minecraftforge.client.MinecraftForgeClient; + +public final class FontHelper { + + private FontHelper() { + } + + public static List cutString(FontRenderer font, String text, int maxWidthPerLine) { + // Split words + List words = new LinkedList<>(); + BreakIterator iterator = BreakIterator.getLineInstance(MinecraftForgeClient.getLocale()); + iterator.setText(text); + int start = iterator.first(); + for (int end = iterator.next(); end != BreakIterator.DONE; start = end, end = iterator.next()) { + String word = text.substring(start, end); + words.add(word); + } + // Apply hard wrap + List lines = new LinkedList<>(); + StringBuilder currentLine = new StringBuilder(); + int width = 0; + for (String word : words) { + int newWidth = font.getStringWidth(word); + if (width + newWidth > maxWidthPerLine) { + if (width > 0) { + String line = currentLine.toString(); + lines.add(line); + currentLine = new StringBuilder(); + width = 0; + } else { + lines.add(word); + continue; + } + } + currentLine.append(word); + width += newWidth; + } + if (width > 0) { + lines.add(currentLine.toString()); + } + return lines; + } + + public static void drawSplitString(FontRenderer font, String text, int x, int y, int width, int color) { + List list = cutString(font, text, width); + Matrix4f matrix4f = TransformationMatrix.identity().getMatrix(); + + for (String s : list) { + float f = (float) x; + if (font.getBidiFlag()) { + int i = font.getStringWidth(font.bidiReorder(s)); + f += (float) (width - i); + } + + draw(font, s, f, (float) y, color, matrix4f, false); + y += 9; + } + } + + private static int draw(FontRenderer font, String p_228078_1_, float p_228078_2_, float p_228078_3_, + int p_228078_4_, Matrix4f p_228078_5_, boolean p_228078_6_) { + if (p_228078_1_ == null) { + return 0; + } else { + IRenderTypeBuffer.Impl irendertypebuffer$impl = IRenderTypeBuffer + .immediate(Tessellator.getInstance().getBuffer()); + int i = font.draw(p_228078_1_, p_228078_2_, p_228078_3_, p_228078_4_, p_228078_6_, p_228078_5_, + irendertypebuffer$impl, false, 0, 15728880); + irendertypebuffer$impl.draw(); + return i; + } + } + +} From 8281c5746a7fed01faa36539331187ca45093a2d Mon Sep 17 00:00:00 2001 From: Snownee Date: Mon, 15 Mar 2021 17:00:42 +0800 Subject: [PATCH 109/124] Fix ponder particles weirdness --- .../simibubi/create/foundation/ponder/PonderWorld.java | 10 ++++++++++ .../create/foundation/ponder/PonderWorldParticles.java | 10 +++++----- 2 files changed, 15 insertions(+), 5 deletions(-) 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 ec5a41f0f..330799f15 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -281,4 +281,14 @@ public class PonderWorld extends SchematicWorld { } } + @Override + public boolean chunkExists(int x, int y) { + return true; // fix particle lighting + } + + @Override + public boolean isBlockPresent(BlockPos pos) { + return true; // fix particle lighting + } + } 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 1f121ba1e..49efd996c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorldParticles.java @@ -59,11 +59,11 @@ public class PonderWorldParticles { } } - public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo p_228345_4_, float p_228345_5_) { + public void renderParticles(MatrixStack ms, IRenderTypeBuffer buffer, ActiveRenderInfo renderInfo, float pt) { Minecraft mc = Minecraft.getInstance(); - LightTexture p_228345_3_ = mc.gameRenderer.getLightmapTextureManager(); + LightTexture lightTexture = mc.gameRenderer.getLightmapTextureManager(); - p_228345_3_.enableLightmap(); + lightTexture.enableLightmap(); Runnable enable = () -> { RenderSystem.enableAlphaTest(); RenderSystem.defaultAlphaFunc(); @@ -87,7 +87,7 @@ public class PonderWorldParticles { iparticlerendertype.beginRender(bufferbuilder, mc.textureManager); for (Particle particle : iterable) - particle.buildGeometry(bufferbuilder, p_228345_4_, p_228345_5_); + particle.buildGeometry(bufferbuilder, renderInfo, pt); iparticlerendertype.finishRender(tessellator); } @@ -97,7 +97,7 @@ public class PonderWorldParticles { RenderSystem.depthMask(true); RenderSystem.disableBlend(); RenderSystem.defaultAlphaFunc(); - p_228345_3_.disableLightmap(); + lightTexture.disableLightmap(); RenderSystem.disableFog(); } From a534d2230c5160fdef615ba1d69a7775c428480a Mon Sep 17 00:00:00 2001 From: Snownee Date: Tue, 16 Mar 2021 00:26:00 +0800 Subject: [PATCH 110/124] Implement extra area for schematic table --- .../com/simibubi/create/compat/jei/CreateJEI.java | 7 +++++-- .../com/simibubi/create/compat/jei/SlotMover.java | 5 ++--- .../schematics/block/SchematicTableScreen.java | 11 ++++++++++- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index de757db48..33606b4da 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -40,6 +40,7 @@ import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipe import com.simibubi.create.content.contraptions.processing.BasinRecipe; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; +import com.simibubi.create.content.schematics.block.SchematicTableScreen; import com.simibubi.create.content.schematics.block.SchematicannonScreen; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.config.CRecipes; @@ -226,8 +227,10 @@ public class CreateJEI implements IModPlugin { @Override public void registerGuiHandlers(IGuiHandlerRegistration registration) { - registration.addGuiContainerHandler(AdjustableCrateScreen.class, new SlotMover<>()); - registration.addGuiContainerHandler(SchematicannonScreen.class, new SlotMover<>()); + SlotMover slotMover = new SlotMover(); + registration.addGuiContainerHandler(AdjustableCrateScreen.class, slotMover); + registration.addGuiContainerHandler(SchematicannonScreen.class, slotMover); + registration.addGuiContainerHandler(SchematicTableScreen.class, slotMover); registration.addGhostIngredientHandler(AbstractFilterScreen.class, new FilterGhostIngredientHandler()); } diff --git a/src/main/java/com/simibubi/create/compat/jei/SlotMover.java b/src/main/java/com/simibubi/create/compat/jei/SlotMover.java index 3188e3324..427735ca7 100644 --- a/src/main/java/com/simibubi/create/compat/jei/SlotMover.java +++ b/src/main/java/com/simibubi/create/compat/jei/SlotMover.java @@ -6,17 +6,16 @@ import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; import mezz.jei.api.gui.handlers.IGuiContainerHandler; import net.minecraft.client.renderer.Rectangle2d; -import net.minecraft.inventory.container.Container; /** * Allows a {@link AbstractSimiContainerScreen} to specify an area in getExtraArea() that will be avoided by JEI * * Name is taken from CoFHCore's 1.12 implementation. */ -public class SlotMover implements IGuiContainerHandler> { +public class SlotMover implements IGuiContainerHandler> { @Override - public List getGuiExtraAreas(AbstractSimiContainerScreen containerScreen) { + public List getGuiExtraAreas(AbstractSimiContainerScreen containerScreen) { return containerScreen.getExtraAreas(); } } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java index 9d89dd340..afc1aaaba 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicTableScreen.java @@ -4,6 +4,7 @@ import static com.simibubi.create.foundation.gui.AllGuiTextures.SCHEMATIC_TABLE; import static com.simibubi.create.foundation.gui.AllGuiTextures.SCHEMATIC_TABLE_PROGRESS; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.List; import com.mojang.blaze3d.systems.RenderSystem; @@ -21,6 +22,7 @@ import com.simibubi.create.foundation.gui.widgets.SelectionScrollInput; import com.simibubi.create.foundation.utility.Lang; import net.minecraft.client.gui.IHasContainer; +import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.item.ItemStack; import net.minecraft.util.Util; @@ -35,6 +37,7 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen extraAreas; private final String title = Lang.translate("gui.schematicTable.title"); private final String uploading = Lang.translate("gui.schematicTable.uploading"); @@ -87,12 +90,14 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen(); + extraAreas.add(new Rectangle2d(mainLeft, mainTop, SCHEMATIC_TABLE.width, SCHEMATIC_TABLE.height)); } @Override protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) { super.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY); - } @Override @@ -212,4 +217,8 @@ public class SchematicTableScreen extends AbstractSimiContainerScreen getExtraAreas() { + return extraAreas; + } } From 52eed2bab38d5415a1615f9cb6e555f5f9c96030 Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 15 Mar 2021 14:20:13 -0700 Subject: [PATCH 111/124] Instanced Gauges and Valves, DRY lighting. --- .../com/simibubi/create/AllTileEntities.java | 7 +- .../contraptions/base/KineticData.java | 5 +- .../base/KineticTileInstance.java | 6 - .../base/SingleRotatingInstance.java | 6 +- .../components/fan/FanInstance.java | 13 +- .../components/flywheel/FlyWheelInstance.java | 14 +- .../flywheel/engine/EngineInstance.java | 5 +- .../components/mixer/MixerInstance.java | 9 +- .../components/press/PressInstance.java | 4 +- .../chassis/StickerInstance.java | 4 +- .../gantry/GantryCarriageInstance.java | 4 +- .../fluids/pipes/FluidValveBlock.java | 7 +- .../fluids/pipes/FluidValveInstance.java | 91 +++++++++ .../fluids/pipes/FluidValveRenderer.java | 4 + .../relays/belt/BeltInstance.java | 11 +- .../relays/encased/SplitShaftInstance.java | 7 +- .../relays/gauge/GaugeInstance.java | 173 ++++++++++++++++++ .../relays/gauge/GaugeRenderer.java | 9 +- .../relays/gearbox/GearboxInstance.java | 9 +- .../block/mechanicalArm/ArmInstance.java | 9 +- .../block/SchematicannonInstance.java | 11 +- .../backend/instancing/InstancedModel.java | 8 + .../instancing/InstancedTileRenderer.java | 6 + .../instancing/TileEntityInstance.java | 20 +- .../backend/instancing/impl/IFlatLight.java | 26 +++ .../backend/instancing/impl/ModelData.java | 4 +- .../create/foundation/utility/Couple.java | 5 + .../foundation/utility/MatrixStacker.java | 9 + .../utility/animation/LerpedFloat.java | 4 + 29 files changed, 383 insertions(+), 107 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/IFlatLight.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index f65fa76ea..256d46aa9 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -77,6 +77,7 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltRenderer; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.elementary.SimpleKineticTileEntity; import com.simibubi.create.content.contraptions.relays.encased.*; +import com.simibubi.create.content.contraptions.relays.gauge.GaugeInstance; import com.simibubi.create.content.contraptions.relays.gauge.GaugeRenderer; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.StressGaugeTileEntity; @@ -260,7 +261,7 @@ public class AllTileEntities { public static final TileEntityEntry FLUID_VALVE = Create.registrate() .tileEntity("fluid_valve", FluidValveTileEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> FluidValveInstance::new) .validBlocks(AllBlocks.FLUID_VALVE) .renderer(() -> FluidValveRenderer::new) .register(); @@ -515,14 +516,14 @@ public class AllTileEntities { public static final TileEntityEntry SPEEDOMETER = Create.registrate() .tileEntity("speedometer", SpeedGaugeTileEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> GaugeInstance.Speed::new) .validBlocks(AllBlocks.SPEEDOMETER) .renderer(() -> GaugeRenderer::speed) .register(); public static final TileEntityEntry STRESSOMETER = Create.registrate() .tileEntity("stressometer", StressGaugeTileEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> GaugeInstance.Stress::new) .validBlocks(AllBlocks.STRESSOMETER) .renderer(() -> GaugeRenderer::stress) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java index 36ce074fd..944223f5c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticData.java @@ -4,12 +4,13 @@ import java.nio.ByteBuffer; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight; import com.simibubi.create.foundation.utility.ColorHelper; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; -public class KineticData> extends InstanceData { +public class KineticData> extends InstanceData implements IFlatLight { private float x; private float y; private float z; @@ -65,11 +66,13 @@ public class KineticData> extends InstanceData { return (D) this; } + @Override public D setBlockLight(int blockLight) { this.blockLight = (byte) ((blockLight & 0xF) << 4); return (D) this; } + @Override public D setSkyLight(int skyLight) { this.skyLight = (byte) ((skyLight & 0xF) << 4); return (D) this; diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java index 71cdb735d..be44b81f3 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/KineticTileInstance.java @@ -36,12 +36,6 @@ public abstract class KineticTileInstance extends T return key; } - protected final void relight(InstanceKey> key) { - key.getInstance() - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); - } - protected float getRotationOffset(final Direction.Axis axis) { float offset = CogWheelBlock.isLargeCog(lastState) ? 11.25f : 0; double d = (((axis == Direction.Axis.X) ? 0 : pos.getX()) + ((axis == Direction.Axis.Y) ? 0 : pos.getY()) diff --git a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java index a84f620b6..44e9c93d0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/base/SingleRotatingInstance.java @@ -4,14 +4,10 @@ import static com.simibubi.create.content.contraptions.base.KineticTileEntityRen import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import net.minecraft.block.BlockState; -import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; public class SingleRotatingInstance extends KineticTileInstance { @@ -35,7 +31,7 @@ public class SingleRotatingInstance extends KineticTileInstance { final Direction direction = lastState.get(FACING); BlockPos behind = pos.offset(direction.getOpposite()); - putLight(shaft, behind); + relight(behind, shaft.getInstance()); BlockPos inFront = pos.offset(direction); - putLight(fan, inFront); - } - - private void putLight(InstanceKey key, BlockPos pos) { - int blockLight = world.getLightLevel(LightType.BLOCK, pos); - int skyLight = world.getLightLevel(LightType.SKY, pos); - - key.getInstance() - .setBlockLight(blockLight) - .setSkyLight(skyLight); + relight(inFront, fan.getInstance()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java index 0e8ff918d..bb2279a6f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlyWheelInstance.java @@ -150,20 +150,10 @@ public class FlyWheelInstance extends KineticTileInstance im @Override public void updateLight() { - int block = world.getLightLevel(LightType.BLOCK, pos); - int sky = world.getLightLevel(LightType.SKY, pos); - - shaft.getInstance().setBlockLight(block).setSkyLight(sky); - wheel.getInstance().setBlockLight(block).setSkyLight(sky); + relight(pos, shaft.getInstance(), wheel.getInstance()); if (connection != null) { - BlockPos pos = this.pos.offset(connection); - - int connectionBlock = world.getLightLevel(LightType.BLOCK, pos); - int connectionSky = world.getLightLevel(LightType.SKY, pos); - connectors.stream() - .map(InstanceKey::getInstance) - .forEach(data -> data.setBlockLight(connectionBlock).setSkyLight(connectionSky)); + relight(this.pos.offset(connection), connectors.stream().map(InstanceKey::getInstance)); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java index 297016881..cac76a426 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/engine/EngineInstance.java @@ -66,9 +66,6 @@ public class EngineInstance extends TileEntityInstance { @Override public void updateLight() { - int block = world.getLightLevel(LightType.BLOCK, pos); - int sky = world.getLightLevel(LightType.SKY, pos); - - frame.getInstance().setBlockLight(block).setSkyLight(sky); + relight(pos, frame.getInstance()); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java index 0f49c8eb6..d8325b5b0 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/mixer/MixerInstance.java @@ -92,14 +92,9 @@ public class MixerInstance extends ShaftlessCogInstance implements ITickableInst public void updateLight() { super.updateLight(); - BlockPos down = pos.down(); - mixerHead.getInstance() - .setBlockLight(world.getLightLevel(LightType.BLOCK, down)) - .setSkyLight(world.getLightLevel(LightType.SKY, down)); + relight(pos.down(), mixerHead.getInstance()); - mixerPole.getInstance() - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + relight(pos, mixerPole.getInstance()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java index 8c4c1b89e..8af6fa19f 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/press/PressInstance.java @@ -67,9 +67,7 @@ public class PressInstance extends ShaftInstance implements ITickableInstance { public void updateLight() { super.updateLight(); - pressHead.getInstance() - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + relight(pos, pressHead.getInstance()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java index b8ea44bf2..6e692fcb9 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/chassis/StickerInstance.java @@ -63,9 +63,7 @@ public class StickerInstance extends TileEntityInstance imple @Override public void updateLight() { - head.getInstance() - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + relight(pos, head.getInstance()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java index 0d86bdd9a..1b9cc2e27 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/gantry/GantryCarriageInstance.java @@ -81,9 +81,7 @@ public class GantryCarriageInstance extends ShaftInstance implements ITickableIn @Override public void updateLight() { - gantryCogs.getInstance() - .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) - .setSkyLight(world.getLightLevel(LightType.SKY, pos)); + relight(pos, gantryCogs.getInstance()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java index aa93364de..ad9a85022 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveBlock.java @@ -25,6 +25,8 @@ import net.minecraft.world.TickPriority; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; +import javax.annotation.Nonnull; + public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxisPipe { public static final BooleanProperty ENABLED = BooleanProperty.create("enabled"); @@ -60,9 +62,10 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi return AllTileEntities.FLUID_VALVE.create(); } + @Nonnull public static Axis getPipeAxis(BlockState state) { if (!(state.getBlock() instanceof FluidValveBlock)) - return null; + throw new IllegalStateException("Provided BlockState is for a different block."); Direction facing = state.get(FACING); boolean alongFirst = !state.get(AXIS_ALONG_FIRST_COORDINATE); for (Axis axis : Iterate.axes) { @@ -74,7 +77,7 @@ public class FluidValveBlock extends DirectionalAxisKineticBlock implements IAxi } return axis; } - return null; + throw new IllegalStateException("Impossible axis."); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java new file mode 100644 index 000000000..fac0a31ca --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveInstance.java @@ -0,0 +1,91 @@ +package com.simibubi.create.content.contraptions.fluids.pipes; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; + +public class FluidValveInstance extends ShaftInstance implements ITickableInstance { + + protected InstanceKey pointer; + + protected double xRot; + protected double yRot; + protected int pointerRotationOffset; + + public FluidValveInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + Direction facing = lastState.get(FluidValveBlock.FACING); + + yRot = AngleHelper.horizontalAngle(facing); + xRot = facing == Direction.UP ? 0 : facing == Direction.DOWN ? 180 : 90; + + Direction.Axis pipeAxis = FluidValveBlock.getPipeAxis(lastState); + Direction.Axis shaftAxis = KineticTileEntityRenderer.getRotationAxisOf(tile); + + pointerRotationOffset = 0; + if (pipeAxis.isHorizontal() && shaftAxis == Direction.Axis.Z || pipeAxis.isVertical()) + pointerRotationOffset = 90; + + pointer = modelManager.basicMaterial().getModel(AllBlockPartials.FLUID_VALVE_POINTER, lastState).createInstance(); + + updateLight(); + transformPointer((FluidValveTileEntity) tile); + } + + @Override + public void tick() { + + FluidValveTileEntity valve = (FluidValveTileEntity) tile; + + if (valve.pointer.settled()) return; + + transformPointer(valve); + } + + private void transformPointer(FluidValveTileEntity valve) { + float pointerRotation = MathHelper.lerp(valve.pointer.getValue(AnimationTickHolder.getPartialTicks()), 0, -90); + + MatrixStack ms = new MatrixStack(); + MatrixStacker.of(ms) + .translate(getFloatingPos()) + .centre() + .rotateY(yRot) + .rotateX(xRot) + .rotateY(pointerRotationOffset + pointerRotation) + .unCentre(); + + pointer.getInstance().setTransform(ms); + } + + @Override + public void updateLight() { + super.updateLight(); + relight(pos, pointer.getInstance()); + } + + @Override + public void remove() { + super.remove(); + pointer.delete(); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java index 729d37d7d..14439f84a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/fluids/pipes/FluidValveRenderer.java @@ -5,6 +5,7 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.MatrixStacker; @@ -25,6 +26,9 @@ public class FluidValveRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (FastRenderDispatcher.available(te.getWorld())) return; + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState blockState = te.getBlockState(); SuperByteBuffer pointer = AllBlockPartials.FLUID_VALVE_POINTER.renderOn(blockState); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index c318d18ed..ed4794e76 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -1,29 +1,24 @@ package com.simibubi.create.content.contraptions.relays.belt; import java.util.ArrayList; -import java.util.function.Consumer; import java.util.function.Supplier; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlocks; +import com.simibubi.create.content.contraptions.base.KineticData; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; import net.minecraft.item.DyeColor; -import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; public class BeltInstance extends KineticTileInstance { @@ -103,9 +98,9 @@ public class BeltInstance extends KineticTileInstance { @Override public void updateLight() { - keys.forEach(this::relight); + relight(pos, keys.stream().map(InstanceKey::getInstance)); - if (pulleyKey != null) relight(pulleyKey); + if (pulleyKey != null) relight(pos, pulleyKey.getInstance()); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java index 8547400b6..641d72a68 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/encased/SplitShaftInstance.java @@ -4,19 +4,16 @@ import java.util.ArrayList; import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.IRotate; +import com.simibubi.create.content.contraptions.base.KineticData; import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.RotatingData; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderRegistry; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.Block; -import net.minecraft.tileentity.TileEntityType; import net.minecraft.util.Direction; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.fml.DistExecutor; public class SplitShaftInstance extends KineticTileInstance { @@ -59,7 +56,7 @@ public class SplitShaftInstance extends KineticTileInstance relight(pos, ((InstanceKey>) key).getInstance())); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java new file mode 100644 index 000000000..b7352809b --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeInstance.java @@ -0,0 +1,173 @@ +package com.simibubi.create.content.contraptions.relays.gauge; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.backend.RenderMaterials; +import com.simibubi.create.foundation.render.backend.instancing.ITickableInstance; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.*; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; + +import java.util.ArrayList; + +public abstract class GaugeInstance extends ShaftInstance implements ITickableInstance { + + protected ArrayList faces; + + protected MatrixStack ms; + + protected GaugeInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + faces = new ArrayList<>(2); + + GaugeTileEntity gaugeTile = (GaugeTileEntity) tile; + GaugeBlock gaugeBlock = (GaugeBlock) lastState.getBlock(); + + InstancedModel dialModel = modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.GAUGE_DIAL, lastState); + InstancedModel headModel = getHeadModel(); + + ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + msr.translate(getFloatingPos()); + + float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState); + + for (Direction facing : Iterate.directions) { + if (!gaugeBlock.shouldRenderHeadOnFace(world, pos, lastState, facing)) + continue; + + DialFace face = makeFace(facing, dialModel, headModel); + + faces.add(face); + + face.setupTransform(msr, progress); + } + + updateLight(); + } + + private DialFace makeFace(Direction face, InstancedModel dialModel, InstancedModel headModel) { + return new DialFace(face, dialModel.createInstance(), headModel.createInstance()); + } + + @Override + public void tick() { + GaugeTileEntity gaugeTile = (GaugeTileEntity) tile; + + if (MathHelper.epsilonEquals(gaugeTile.prevDialState, gaugeTile.dialState)) + return; + + float progress = MathHelper.lerp(AnimationTickHolder.getPartialTicks(), gaugeTile.prevDialState, gaugeTile.dialState); + + MatrixStacker msr = MatrixStacker.of(ms); + + for (DialFace faceEntry : faces) { + faceEntry.updateTransform(msr, progress); + } + } + + @Override + public void updateLight() { + super.updateLight(); + + relight(pos, faces.stream() + .flatMap(Couple::stream) + .map(InstanceKey::getInstance)); + } + + @Override + public void remove() { + super.remove(); + + faces.forEach(DialFace::delete); + } + + protected abstract InstancedModel getHeadModel(); + + private class DialFace extends Couple> { + + Direction face; + + public DialFace(Direction face, InstanceKey first, InstanceKey second) { + super(first, second); + this.face = face; + } + + private void setupTransform(MatrixStacker msr, float progress) { + float dialPivot = 5.75f / 16; + + ms.push(); + rotateToFace(msr); + + getSecond().getInstance().setTransform(ms); + + msr.translate(0, dialPivot, dialPivot) + .rotate(Direction.EAST, (float) (Math.PI / 2 * -progress)) + .translate(0, -dialPivot, -dialPivot); + + getFirst().getInstance().setTransform(ms); + + ms.pop(); + } + + private void updateTransform(MatrixStacker msr, float progress) { + float dialPivot = 5.75f / 16; + + ms.push(); + + rotateToFace(msr) + .translate(0, dialPivot, dialPivot) + .rotate(Direction.EAST, (float) (Math.PI / 2 * -progress)) + .translate(0, -dialPivot, -dialPivot); + + getFirst().getInstance().setTransform(ms); + + ms.pop(); + } + + protected MatrixStacker rotateToFace(MatrixStacker msr) { + return msr.centre() + .rotate(Direction.UP, (float) ((-face.getHorizontalAngle() - 90) / 180 * Math.PI)) + .unCentre(); + } + + private void delete() { + getFirst().delete(); + getSecond().delete(); + } + } + + public static class Speed extends GaugeInstance { + public Speed(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected InstancedModel getHeadModel() { + return modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.GAUGE_HEAD_SPEED, lastState); + } + } + + public static class Stress extends GaugeInstance { + public Stress(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected InstancedModel getHeadModel() { + return modelManager.getMaterial(RenderMaterials.MODELS).getModel(AllBlockPartials.GAUGE_HEAD_STRESS, lastState); + } + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java index 3085dae58..bc89519bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gauge/GaugeRenderer.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.relays.gauge.GaugeBlock.Type; import com.simibubi.create.foundation.render.SuperByteBuffer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.Iterate; import net.minecraft.block.BlockState; @@ -37,6 +38,8 @@ public class GaugeRenderer extends KineticTileEntityRenderer { @Override protected void renderSafe(KineticTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + if (FastRenderDispatcher.available(te.getWorld())) return; + super.renderSafe(te, partialTicks, ms, buffer, light, overlay); BlockState gaugeState = te.getBlockState(); GaugeTileEntity gaugeTE = (GaugeTileEntity) te; @@ -47,14 +50,14 @@ public class GaugeRenderer extends KineticTileEntityRenderer { .renderOn(gaugeState); SuperByteBuffer dialBuffer = AllBlockPartials.GAUGE_DIAL.renderOn(gaugeState); + float dialPivot = 5.75f / 16; + float progress = MathHelper.lerp(partialTicks, gaugeTE.prevDialState, gaugeTE.dialState); + for (Direction facing : Iterate.directions) { if (!((GaugeBlock) gaugeState.getBlock()).shouldRenderHeadOnFace(te.getWorld(), te.getPos(), gaugeState, facing)) continue; - float dialPivot = 5.75f / 16; - float progress = MathHelper.lerp(partialTicks, gaugeTE.prevDialState, gaugeTE.dialState); - IVertexBuilder vb = buffer.getBuffer(RenderType.getSolid()); rotateBufferTowards(dialBuffer, facing).translate(0, dialPivot, dialPivot) .rotate(Direction.EAST, (float) (Math.PI / 2 * -progress)) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java index 60c4ec81f..ec75b02a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/gearbox/GearboxInstance.java @@ -99,14 +99,7 @@ public class GearboxInstance extends KineticTileInstance { @Override public void updateLight() { - int blockLight = tile.getWorld().getLightLevel(LightType.BLOCK, pos); - int skyLight = tile.getWorld().getLightLevel(LightType.SKY, pos); - - for (InstanceKey key : keys.values()) { - key.getInstance() - .setBlockLight(blockLight) - .setSkyLight(skyLight); - } + relight(pos, keys.values().stream().map(InstanceKey::getInstance)); } @Override diff --git a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java index c8a527490..7a504c7b1 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/mechanicalArm/ArmInstance.java @@ -73,7 +73,7 @@ public class ArmInstance extends SingleRotatingInstance implements ITickableInst public void tick() { ArmTileEntity arm = (ArmTileEntity) tile; - boolean settled = Stream.of(arm.baseAngle, arm.lowerArmAngle, arm.upperArmAngle, arm.headAngle).allMatch(InterpolatedValue::settled); + boolean settled = arm.baseAngle.settled() && arm.lowerArmAngle.settled() && arm.upperArmAngle.settled() && arm.headAngle.settled(); boolean rave = arm.phase == ArmTileEntity.Phase.DANCING; if (!settled || rave || firstTick) @@ -154,13 +154,8 @@ public class ArmInstance extends SingleRotatingInstance implements ITickableInst @Override public void updateLight() { super.updateLight(); - int block = world.getLightLevel(LightType.BLOCK, pos); - int sky = world.getLightLevel(LightType.SKY, pos); - - models.stream() - .map(InstanceKey::getInstance) - .forEach(data -> data.setSkyLight(sky).setBlockLight(block)); + relight(pos, models.stream().map(InstanceKey::getInstance)); } @Override diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java index 307a8e6b1..97f27b930 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonInstance.java @@ -81,15 +81,6 @@ public class SchematicannonInstance extends TileEntityInstance extends BufferedMod protected int minIndexChanged = -1; protected int maxIndexChanged = -1; + protected boolean anyToRemove; + public InstancedModel(InstancedTileRenderer renderer, BufferBuilder buf) { super(buf); this.renderer = renderer; @@ -73,6 +75,8 @@ public abstract class InstancedModel extends BufferedMod verifyKey(key); key.invalidate(); + + anyToRemove = true; } public D getInstance(InstanceKey key) { @@ -161,6 +165,8 @@ public abstract class InstancedModel extends BufferedMod // copied from ArrayList#removeIf protected boolean doRemoval() { + if (!anyToRemove) return false; + // figure out which elements are to be removed // any exception thrown from the filter predicate at this stage // will leave the collection unmodified @@ -198,6 +204,8 @@ public abstract class InstancedModel extends BufferedMod maxIndexChanged = newSize - 1; } + this.anyToRemove = false; + return anyToRemove; } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java index 21131fe32..5871c5d8e 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/InstancedTileRenderer.java @@ -6,8 +6,10 @@ import javax.annotation.Nullable; import com.simibubi.create.foundation.ponder.PonderWorld; import com.simibubi.create.foundation.render.backend.Backend; +import com.simibubi.create.foundation.render.backend.RenderMaterials; import com.simibubi.create.foundation.render.backend.gl.BasicProgram; import com.simibubi.create.foundation.render.backend.gl.shader.ShaderCallback; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import com.simibubi.create.foundation.utility.AnimationTickHolder; import net.minecraft.client.Minecraft; @@ -67,6 +69,10 @@ public abstract class InstancedTileRenderer

{ return (RenderMaterial) materials.get(materialType); } + public RenderMaterial> basicMaterial() { + return getMaterial(RenderMaterials.MODELS); + } + @Nullable public TileEntityInstance getInstance(T tile) { return getInstance(tile, true); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java index 4e029f184..b5241999c 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/TileEntityInstance.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.render.backend.instancing; +import com.simibubi.create.foundation.render.backend.instancing.impl.IFlatLight; import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; import net.minecraft.block.BlockState; import net.minecraft.tileentity.TileEntity; @@ -7,6 +8,9 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.LightType; import net.minecraft.world.World; +import java.util.Arrays; +import java.util.stream.Stream; + public abstract class TileEntityInstance { protected final InstancedTileRenderer modelManager; @@ -60,13 +64,19 @@ public abstract class TileEntityInstance { return pos.subtract(modelManager.getOriginCoordinate()); } - protected void relight(BlockPos pos, ModelData... models) { + protected > void relight(BlockPos pos, IFlatLight... models) { relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); } - protected void relight(int block, int sky, ModelData... models) { - for (ModelData model : models) { - model.setBlockLight(block).setSkyLight(sky); - } + protected > void relight(BlockPos pos, Stream> models) { + relight(world.getLightLevel(LightType.BLOCK, pos), world.getLightLevel(LightType.SKY, pos), models); + } + + protected > void relight(int block, int sky, IFlatLight... models) { + relight(block, sky, Arrays.stream(models)); + } + + protected > void relight(int block, int sky, Stream> models) { + models.forEach(model -> model.setBlockLight(block).setSkyLight(sky)); } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/IFlatLight.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/IFlatLight.java new file mode 100644 index 000000000..7dea998b1 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/IFlatLight.java @@ -0,0 +1,26 @@ +package com.simibubi.create.foundation.render.backend.instancing.impl; + +import com.simibubi.create.foundation.render.backend.instancing.InstanceData; + +/** + * An interface that implementors of {@link InstanceData} should also implement + * if they wish to make use of Flywheel's provided light update methods. + * + * This only covers flat lighting, smooth lighting is still TODO. + * @param The name of the class that implements this interface. + */ +public interface IFlatLight> { + /** + * @param blockLight An integer in the range [0, 15] representing the + * amount of block light this instance should receive. + * @return this + */ + D setBlockLight(int blockLight); + + /** + * @param skyLight An integer in the range [0, 15] representing the + * amount of sky light this instance should receive. + * @return this + */ + D setSkyLight(int skyLight); +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java index 350c8e4ad..4b0a93a9a 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/instancing/impl/ModelData.java @@ -9,7 +9,7 @@ import net.minecraft.client.renderer.Matrix4f; import java.nio.ByteBuffer; -public class ModelData extends InstanceData { +public class ModelData extends InstanceData implements IFlatLight { private static final Matrix4f IDENT4 = new Matrix4f(); private static final Matrix3f IDENT3 = new Matrix3f(); static { @@ -54,11 +54,13 @@ public class ModelData extends InstanceData { return this; } + @Override public ModelData setBlockLight(int blockLight) { this.blockLight = (byte) (blockLight << 4); return this; } + @Override public ModelData setSkyLight(int skyLight) { this.skyLight = (byte) (skyLight << 4); return this; diff --git a/src/main/java/com/simibubi/create/foundation/utility/Couple.java b/src/main/java/com/simibubi/create/foundation/utility/Couple.java index 9c36c903f..1c0cf6153 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/Couple.java +++ b/src/main/java/com/simibubi/create/foundation/utility/Couple.java @@ -6,6 +6,7 @@ import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; +import java.util.stream.Stream; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; @@ -104,6 +105,10 @@ public class Couple extends Pair implements Iterable { return new Couplerator<>(this); } + public Stream stream() { + return Stream.of(first, second); + } + private static class Couplerator implements Iterator { int state; diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 0323a1ebb..8ebc71b26 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -24,6 +24,15 @@ public class MatrixStacker { return instance; } + public MatrixStacker restoreIdentity() { + MatrixStack.Entry entry = ms.peek(); + + entry.getModel().loadIdentity(); + entry.getNormal().loadIdentity(); + + return this; + } + public MatrixStacker rotate(Direction axis, float radians) { if (radians == 0) return this; diff --git a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java index b0f22f545..7e99e39cb 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java +++ b/src/main/java/com/simibubi/create/foundation/utility/animation/LerpedFloat.java @@ -81,6 +81,10 @@ public class LerpedFloat { return MathHelper.lerp(partialTicks, previousValue, value); } + public boolean settled() { + return MathHelper.epsilonEquals(previousValue, value); + } + public float getChaseTarget() { return chaseTarget; } From d9027c1d9990fc0b30a5a02d7f7410b83ed13667 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Mon, 15 Mar 2021 23:20:24 +0100 Subject: [PATCH 112/124] Logic Thinking - Ponder scenes for various redstone components --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 40 ++ .../assets/create/lang/unfinished/de_de.json | 42 +- .../assets/create/lang/unfinished/es_es.json | 42 +- .../assets/create/lang/unfinished/es_mx.json | 42 +- .../assets/create/lang/unfinished/fr_fr.json | 42 +- .../assets/create/lang/unfinished/it_it.json | 42 +- .../assets/create/lang/unfinished/ja_jp.json | 42 +- .../assets/create/lang/unfinished/ko_kr.json | 42 +- .../assets/create/lang/unfinished/nl_nl.json | 42 +- .../assets/create/lang/unfinished/pt_br.json | 42 +- .../assets/create/lang/unfinished/ru_ru.json | 42 +- .../assets/create/lang/unfinished/zh_cn.json | 42 +- .../assets/create/lang/unfinished/zh_tw.json | 42 +- .../block/redstone/AnalogLeverTileEntity.java | 1 - .../content/schematics/SchematicWorld.java | 29 +- .../create/foundation/ponder/PonderWorld.java | 5 + .../foundation/ponder/SceneBuilder.java | 18 + .../ponder/content/PonderIndex.java | 18 + .../ponder/content/RedstoneScenes.java | 662 +++++++++++++++++- .../ponder/adjustable_pulse_repeater.nbt | Bin 0 -> 453 bytes .../resources/ponder/adjustable_repeater.nbt | Bin 0 -> 447 bytes src/main/resources/ponder/analog_lever.nbt | Bin 0 -> 514 bytes src/main/resources/ponder/nixie_tube.nbt | Bin 0 -> 467 bytes src/main/resources/ponder/powered_latch.nbt | Bin 0 -> 443 bytes .../resources/ponder/powered_toggle_latch.nbt | Bin 0 -> 409 bytes src/main/resources/ponder/pulse_repeater.nbt | Bin 0 -> 400 bytes src/main/resources/ponder/redstone_link.nbt | Bin 0 -> 564 bytes 28 files changed, 1265 insertions(+), 40 deletions(-) create mode 100644 src/main/resources/ponder/adjustable_pulse_repeater.nbt create mode 100644 src/main/resources/ponder/adjustable_repeater.nbt create mode 100644 src/main/resources/ponder/analog_lever.nbt create mode 100644 src/main/resources/ponder/nixie_tube.nbt create mode 100644 src/main/resources/ponder/powered_latch.nbt create mode 100644 src/main/resources/ponder/powered_toggle_latch.nbt create mode 100644 src/main/resources/ponder/pulse_repeater.nbt create mode 100644 src/main/resources/ponder/redstone_link.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 670bb1770..08e29ebe9 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -6d00aa2e085c5754a9b7f5fffdea8702c474f5a6 assets/create/lang/en_us.json -be6252adfc657c2ee9f0f30bcca3155dc9ca98d8 assets/create/lang/unfinished/de_de.json -64baba74aa6a1e980dc4a7d469dba660a308e42c assets/create/lang/unfinished/es_es.json -e5fa6c5ad75b424382ae0d202547908bab13f569 assets/create/lang/unfinished/es_mx.json -945e755bdfa2996060129e6edad5ef6a3ed171e0 assets/create/lang/unfinished/fr_fr.json -bb0cc8cc01bf99b33f8c42c333ecac5e65f0c134 assets/create/lang/unfinished/it_it.json -37d0b9d5ccb0072b52f1896f836cea8d042a9156 assets/create/lang/unfinished/ja_jp.json -c380bc0d1933a41fdf64d323775a43dfe6ac92b1 assets/create/lang/unfinished/ko_kr.json -d003e93a08a630e803293612793a9ecd3b38017a assets/create/lang/unfinished/nl_nl.json -0c3c6e0c574c22e4e39a1ee88e13e0c2c677845d assets/create/lang/unfinished/pt_br.json -a376c60e64007b73f034ebd2f46551f7d4f63237 assets/create/lang/unfinished/ru_ru.json -20530fd24391fcd010d2d20965ed1797142c0ec4 assets/create/lang/unfinished/zh_cn.json -ee78cba92550be14a61bc862d5ae63d31258cc75 assets/create/lang/unfinished/zh_tw.json +212de32a4245c53011c14d5a449cc9845ba8a897 assets/create/lang/en_us.json +68692dcac5364521de8437c653b64791e962628a assets/create/lang/unfinished/de_de.json +ea0fb50d4198972c4c7865d2471cdbc75977cc70 assets/create/lang/unfinished/es_es.json +5a54f2e9ad6264bdbb41fe6390b6674904219bfe assets/create/lang/unfinished/es_mx.json +a1a8a74c61650c1bb59a4187864d952f534100c7 assets/create/lang/unfinished/fr_fr.json +07992e28b58ec1bc837a80ab633dca672ad236e4 assets/create/lang/unfinished/it_it.json +8b84abd9b61ab88fdbbf9c0cc1979e95b34b3580 assets/create/lang/unfinished/ja_jp.json +fcd3bde020b3e904d5a31032c01e2e5b9c05a702 assets/create/lang/unfinished/ko_kr.json +2e4780fe25cef72f9bb3b43be76a379e3dde9f00 assets/create/lang/unfinished/nl_nl.json +edd45f6e468d4976d2bcd714066ae3284fc27ddb assets/create/lang/unfinished/pt_br.json +8c27872585a9a180ede3ccdd1d07014863501b89 assets/create/lang/unfinished/ru_ru.json +dead3a1a62323e91d41a8e8864b7179fd2f30583 assets/create/lang/unfinished/zh_cn.json +41faa5ab5d3f812e46d8d0e1580e83cd9f2f4bb3 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 3307f8347..0060f63ea 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1850,6 +1850,23 @@ "create.ponder.tag.fluids": "Fluid Manipulators", "create.ponder.tag.fluids.description": "Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2077,6 +2094,21 @@ "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.powered_latch.header": "Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "...on and back off", + "create.ponder.powered_toggle_latch.text_4": "Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "When one is moved by a Contraption, the others are dragged with it", @@ -2092,6 +2124,14 @@ "create.ponder.redstone_contact.text_1": "Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "Using Redstone Links", + "create.ponder.redstone_link.text_1": "Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "Direction and Speed of movement depend on the Rotational Input", 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 690fa404f..f727142a9 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: 1263", + "_": "Missing Localizations: 1296", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 a8c5d3c4a..58b16e83f 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: 294", + "_": "Missing Localizations: 327", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 b3d1c305d..ed7c04672 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: 1193", + "_": "Missing Localizations: 1226", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 60960800a..533355d03 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: 975", + "_": "Missing Localizations: 1008", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 a5e05faa6..d08d07d00 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: 311", + "_": "Missing Localizations: 344", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 163a2c7e0..a5958565a 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: 318", + "_": "Missing Localizations: 351", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 c0d1e71cc..64125ad90 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: 364", + "_": "Missing Localizations: 397", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 4933193e5..e90aa4a1e 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: 1462", + "_": "Missing Localizations: 1495", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 098d5ea60..495da0f25 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: 1528", + "_": "Missing Localizations: 1561", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 ee7c4ce98..59f6535e0 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: 314", + "_": "Missing Localizations: 347", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 166f470d3..314b568f1 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: 312", + "_": "Missing Localizations: 345", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", 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 100ff16ac..e900c1e46 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: 317", + "_": "Missing Localizations: 350", "_": "->------------------------] Game Elements [------------------------<-", @@ -1851,6 +1851,23 @@ "create.ponder.tag.fluids": "UNLOCALIZED: Fluid Manipulators", "create.ponder.tag.fluids.description": "UNLOCALIZED: Components which help relaying and making use of Fluids", + "create.ponder.adjustable_pulse_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Pulse Repeaters", + "create.ponder.adjustable_pulse_repeater.text_1": "UNLOCALIZED: Adjustable Pulse Repeaters emit a short pulse at a delay", + "create.ponder.adjustable_pulse_repeater.text_2": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_pulse_repeater.text_3": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.adjustable_repeater.header": "UNLOCALIZED: Controlling signals using Adjustable Repeaters", + "create.ponder.adjustable_repeater.text_1": "UNLOCALIZED: Adjustable Repeaters behave similarly to regular Repeaters", + "create.ponder.adjustable_repeater.text_2": "UNLOCALIZED: They charge up for a set time...", + "create.ponder.adjustable_repeater.text_3": "UNLOCALIZED: ...and cool down for the same duration", + "create.ponder.adjustable_repeater.text_4": "UNLOCALIZED: Using the mouse wheel, the charge time can be configured", + "create.ponder.adjustable_repeater.text_5": "UNLOCALIZED: Configured delays can range up to 30 minutes", + + "create.ponder.analog_lever.header": "UNLOCALIZED: Controlling signals using the Analog Lever", + "create.ponder.analog_lever.text_1": "UNLOCALIZED: Analog Levers make for a compact and precise source of redstone power", + "create.ponder.analog_lever.text_2": "UNLOCALIZED: Right-click to increase its analog power output", + "create.ponder.analog_lever.text_3": "UNLOCALIZED: Right-click while Sneaking to decrease the power output again", + "create.ponder.bearing_modes.header": "UNLOCALIZED: Movement Modes of the Mechanical Bearing", "create.ponder.bearing_modes.text_1": "UNLOCALIZED: When Stopped, the Bearing will place the structure at the nearest grid-aligned Angle", "create.ponder.bearing_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only near the angle it started at", @@ -2078,6 +2095,21 @@ "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.powered_latch.header": "UNLOCALIZED: Controlling signals using the Powered Latch", + "create.ponder.powered_latch.text_1": "UNLOCALIZED: Powered Latches are redstone controllable Levers", + "create.ponder.powered_latch.text_2": "UNLOCALIZED: Signals at the back switch it on", + "create.ponder.powered_latch.text_3": "UNLOCALIZED: Signals from the side switch it back off", + "create.ponder.powered_latch.text_4": "UNLOCALIZED: Powered latches can also be toggled manually", + + "create.ponder.powered_toggle_latch.header": "UNLOCALIZED: Controlling signals using the Powered Toggle Latch", + "create.ponder.powered_toggle_latch.text_1": "UNLOCALIZED: Powered Toggle Latches are redstone controllable Levers", + "create.ponder.powered_toggle_latch.text_2": "UNLOCALIZED: Signals at the back will toggle its state", + "create.ponder.powered_toggle_latch.text_3": "UNLOCALIZED: ...on and back off", + "create.ponder.powered_toggle_latch.text_4": "UNLOCALIZED: Powered toggle latches can also be toggled manually", + + "create.ponder.pulse_repeater.header": "UNLOCALIZED: Controlling signals using Pulse Repeaters", + "create.ponder.pulse_repeater.text_1": "UNLOCALIZED: Pulse Repeaters will shorten any redstone signal to a single pulse", + "create.ponder.radial_chassis.header": "UNLOCALIZED: Attaching blocks using Radial Chassis", "create.ponder.radial_chassis.text_1": "UNLOCALIZED: Radial Chassis connect to identical Chassis blocks in a row", "create.ponder.radial_chassis.text_2": "UNLOCALIZED: When one is moved by a Contraption, the others are dragged with it", @@ -2093,6 +2125,14 @@ "create.ponder.redstone_contact.text_1": "UNLOCALIZED: Redstone Contacts facing each other will emit a redstone signal", "create.ponder.redstone_contact.text_2": "UNLOCALIZED: This still applies when one of them is part of a moving Contraption", + "create.ponder.redstone_link.header": "UNLOCALIZED: Using Redstone Links", + "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", + "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", + "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", "create.ponder.rope_pulley.text_2": "UNLOCALIZED: Direction and Speed of movement depend on the Rotational Input", diff --git a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java index 233c8b441..d98c89f5f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/redstone/AnalogLeverTileEntity.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.redstone; import java.util.List; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.goggles.IHaveGoggleInformation; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.render.backend.instancing.IInstanceRendered; 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 06abab70c..1b6c7e5ab 100644 --- a/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java +++ b/src/main/java/com/simibubi/create/content/schematics/SchematicWorld.java @@ -11,6 +11,7 @@ import java.util.function.Predicate; import com.simibubi.create.Create; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; +import net.minecraft.block.AbstractFurnaceBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; @@ -39,14 +40,14 @@ public class SchematicWorld extends WrappedWorld { protected List renderedTileEntities; protected List entities; protected MutableBoundingBox bounds; - + public BlockPos anchor; public boolean renderMode; public SchematicWorld(World original) { this(BlockPos.ZERO, original); } - + public SchematicWorld(BlockPos anchor, World original) { super(original); this.blocks = new HashMap<>(); @@ -111,12 +112,8 @@ public class SchematicWorld extends WrappedWorld { if (pos.getY() - bounds.minY == -1 && !renderMode) return Blocks.GRASS_BLOCK.getDefaultState(); - if (getBounds().isVecInside(pos) && blocks.containsKey(pos)) { - BlockState blockState = blocks.get(pos); - if (blockState.has(BlockStateProperties.LIT)) - blockState = blockState.with(BlockStateProperties.LIT, false); - return blockState; - } + if (getBounds().isVecInside(pos) && blocks.containsKey(pos)) + return processBlockStateForPrinting(blocks.get(pos)); return Blocks.AIR.getDefaultState(); } @@ -177,21 +174,23 @@ public class SchematicWorld extends WrappedWorld { @Override public boolean setBlockState(BlockPos pos, BlockState arg1, int arg2) { - pos = pos.subtract(anchor); + pos = pos.toImmutable() + .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())) { + if (!tileEntity.getType() + .isValidBlock(arg1.getBlock())) { tileEntities.remove(pos); renderedTileEntities.remove(tileEntity); } } - + TileEntity tileEntity = getTileEntity(pos); if (tileEntity != null) tileEntities.put(pos, tileEntity); - + return true; } @@ -213,4 +212,10 @@ public class SchematicWorld extends WrappedWorld { return renderedTileEntities; } + protected BlockState processBlockStateForPrinting(BlockState state) { + if (state.getBlock() instanceof AbstractFurnaceBlock && state.has(BlockStateProperties.LIT)) + state = state.with(BlockStateProperties.LIT, false); + return state; + } + } 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 ec5a41f0f..298b01d8f 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -280,5 +280,10 @@ public class PonderWorld extends SchematicWorld { } } } + + @Override + protected BlockState processBlockStateForPrinting(BlockState state) { + return 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 e628ae1f3..811aa75a9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -55,11 +55,13 @@ import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.RedstoneTorchBlock; 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.state.IProperty; import net.minecraft.state.properties.BlockStateProperties; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Direction; @@ -334,6 +336,15 @@ public class SceneBuilder { expands, duration)); } + public void showRepeaterScrollInput(BlockPos pos, int duration) { + float s = 1 / 16f; + float q = 1 / 6f; + Vec3d expands = new Vec3d(q, s, q); + addInstruction( + new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, Direction.DOWN) + .add(0, 3 / 16f, 0), expands, duration)); + } + public void showFilterSlotInput(Vec3d location, int duration) { float s = .1f; Vec3d expands = new Vec3d(s, s, s); @@ -523,6 +534,11 @@ public class SceneBuilder { modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), stateFunc, spawnParticles); } + public void cycleBlockProperty(BlockPos pos, IProperty property) { + modifyBlocks(scene.getSceneBuildingUtil().select.position(pos), + s -> s.has(property) ? s.cycle(property) : s, false); + } + public void modifyBlocks(Selection selection, UnaryOperator stateFunc, boolean spawnParticles) { addInstruction(new ReplaceBlocksInstruction(selection, stateFunc, false, spawnParticles)); } @@ -533,6 +549,8 @@ public class SceneBuilder { 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); + if (s.has(RedstoneTorchBlock.LIT)) + s = s.cycle(RedstoneTorchBlock.LIT); return s; }, false); } 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 88309ec71..d1c4b0a5d 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 @@ -149,6 +149,24 @@ public class PonderIndex { .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + // Redstone + PonderRegistry.forComponents(AllBlocks.PULSE_REPEATER) + .addStoryBoard("pulse_repeater", RedstoneScenes::pulseRepeater); + PonderRegistry.forComponents(AllBlocks.ADJUSTABLE_REPEATER) + .addStoryBoard("adjustable_repeater", RedstoneScenes::adjustableRepeater); + PonderRegistry.forComponents(AllBlocks.ADJUSTABLE_PULSE_REPEATER) + .addStoryBoard("adjustable_pulse_repeater", RedstoneScenes::adjustablePulseRepeater); + PonderRegistry.forComponents(AllBlocks.POWERED_LATCH) + .addStoryBoard("powered_latch", RedstoneScenes::poweredLatch); + PonderRegistry.forComponents(AllBlocks.POWERED_TOGGLE_LATCH) + .addStoryBoard("powered_toggle_latch", RedstoneScenes::poweredToggleLatch); + PonderRegistry.forComponents(AllBlocks.ANALOG_LEVER) + .addStoryBoard("analog_lever", RedstoneScenes::analogLever); + PonderRegistry.forComponents(AllBlocks.NIXIE_TUBE) + .addStoryBoard("nixie_tube", RedstoneScenes::nixieTube); + PonderRegistry.forComponents(AllBlocks.REDSTONE_LINK) + .addStoryBoard("redstone_link", RedstoneScenes::redstoneLink); + // 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/RedstoneScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java index c707e191b..4d98b7d3c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java @@ -2,14 +2,36 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerBlock; import com.simibubi.create.content.contraptions.components.structureMovement.chassis.StickerTileEntity; +import com.simibubi.create.content.logistics.block.diodes.AdjustablePulseRepeaterTileEntity; +import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterBlock; +import com.simibubi.create.content.logistics.block.diodes.AdjustableRepeaterTileEntity; +import com.simibubi.create.content.logistics.block.diodes.PoweredLatchBlock; +import com.simibubi.create.content.logistics.block.diodes.PulseRepeaterBlock; +import com.simibubi.create.content.logistics.block.diodes.ToggleLatchBlock; +import com.simibubi.create.content.logistics.block.redstone.AnalogLeverTileEntity; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; +import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkBlock; +import com.simibubi.create.content.logistics.block.redstone.RedstoneLinkTileEntity; 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.ParrotElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.block.RedstoneWireBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.state.IntegerProperty; 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.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; public class RedstoneScenes { @@ -82,7 +104,7 @@ public class RedstoneScenes { .pointAt(util.vector.blockSurface(stickerPos, Direction.WEST)) .placeNearTarget(); scene.idle(70); - + scene.world.rotateBearing(bearingPos, 180 * 3, 80); scene.world.rotateSection(sticker, 0, 180 * 3, 0, 80); } @@ -166,4 +188,642 @@ public class RedstoneScenes { scene.world.rotateSection(contact, 0, 10, 0, speed); } + public static void pulseRepeater(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("pulse_repeater", "Controlling signals using Pulse Repeaters"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos circuitPos = util.grid.at(2, 1, 2); + BlockPos leverPos = util.grid.at(4, 1, 2); + + scene.world.showSection(util.select.layersFrom(1) + .substract(util.select.position(circuitPos)), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.idle(20); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, PulseRepeaterBlock.PULSING); + scene.idle(3); + scene.world.cycleBlockProperty(circuitPos, PulseRepeaterBlock.PULSING); + scene.world.toggleRedstonePower(util.select.position(1, 1, 2)); + scene.idle(2); + scene.world.toggleRedstonePower(util.select.position(0, 1, 2)); + + scene.idle(15); + scene.overlay.showText(70) + .text("Pulse Repeaters will shorten any redstone signal to a single pulse") + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.topOf(util.grid.at(0, 1, 2))); + scene.idle(60); + + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(20); + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, PulseRepeaterBlock.PULSING); + scene.idle(3); + scene.world.cycleBlockProperty(circuitPos, PulseRepeaterBlock.PULSING); + scene.world.toggleRedstonePower(util.select.position(1, 1, 2)); + scene.idle(2); + scene.world.toggleRedstonePower(util.select.position(0, 1, 2)); + } + + public static void adjustableRepeater(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("adjustable_repeater", "Controlling signals using Adjustable Repeaters"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos circuitPos = util.grid.at(2, 1, 2); + BlockPos leverPos = util.grid.at(4, 1, 2); + + scene.world.modifyTileNBT(util.select.position(circuitPos), AdjustableRepeaterTileEntity.class, + nbt -> nbt.putInt("ScrollValue", 30)); + scene.world.showSection(util.select.layersFrom(1) + .substract(util.select.position(circuitPos)), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.idle(20); + + Vec3d circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + .add(0, 3 / 16f, 0); + scene.overlay.showText(70) + .text("Adjustable Repeaters behave similarly to regular Repeaters") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(60); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(30); + scene.world.cycleBlockProperty(circuitPos, AdjustableRepeaterBlock.POWERING); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(15); + + scene.overlay.showText(40) + .text("They charge up for a set time...") + .placeNearTarget() + .pointAt(util.vector.topOf(util.grid.at(0, 1, 2))); + scene.idle(50); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(30); + scene.world.cycleBlockProperty(circuitPos, AdjustableRepeaterBlock.POWERING); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(15); + + scene.overlay.showText(40) + .text("...and cool down for the same duration") + .placeNearTarget() + .pointAt(util.vector.topOf(util.grid.at(0, 1, 2))); + scene.idle(50); + + scene.overlay.showRepeaterScrollInput(circuitPos, 60); + scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).scroll(), 60); + scene.idle(10); + scene.overlay.showText(60) + .text("Using the mouse wheel, the charge time can be configured") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop); + scene.world.modifyTileNBT(util.select.position(circuitPos), AdjustableRepeaterTileEntity.class, + nbt -> nbt.putInt("ScrollValue", 120)); + scene.idle(70); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(60); + scene.overlay.showText(50) + .text("Configured delays can range up to 30 minutes") + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(60); + scene.world.cycleBlockProperty(circuitPos, AdjustableRepeaterBlock.POWERING); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(15); + + } + + public static void adjustablePulseRepeater(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("adjustable_pulse_repeater", "Controlling signals using Adjustable Pulse Repeaters"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos circuitPos = util.grid.at(2, 1, 2); + BlockPos leverPos = util.grid.at(4, 1, 2); + + scene.world.modifyTileNBT(util.select.position(circuitPos), AdjustablePulseRepeaterTileEntity.class, + nbt -> nbt.putInt("ScrollValue", 30)); + scene.world.showSection(util.select.layersFrom(1) + .substract(util.select.position(circuitPos)), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.idle(20); + + Vec3d circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + .add(0, 3 / 16f, 0); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(30); + scene.world.cycleBlockProperty(circuitPos, AdjustableRepeaterBlock.POWERING); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(3); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(15); + + scene.overlay.showText(60) + .text("Adjustable Pulse Repeaters emit a short pulse at a delay") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop); + + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(70); + + scene.overlay.showRepeaterScrollInput(circuitPos, 60); + scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).scroll(), 60); + scene.idle(10); + scene.overlay.showText(60) + .text("Using the mouse wheel, the charge time can be configured") + .attachKeyFrame() + .placeNearTarget() + .pointAt(circuitTop); + scene.world.modifyTileNBT(util.select.position(circuitPos), AdjustablePulseRepeaterTileEntity.class, + nbt -> nbt.putInt("ScrollValue", 120)); + scene.idle(70); + + scene.effects.indicateRedstone(leverPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 2, 1, 2)); + scene.idle(60); + scene.overlay.showText(50) + .text("Configured delays can range up to 30 minutes") + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(60); + scene.world.cycleBlockProperty(circuitPos, AdjustableRepeaterBlock.POWERING); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + scene.idle(3); + scene.world.toggleRedstonePower(util.select.fromTo(1, 1, 2, 0, 1, 2)); + } + + public static void poweredLatch(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("powered_latch", "Controlling signals using the Powered Latch"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos circuitPos = util.grid.at(2, 1, 2); + BlockPos buttonPos = util.grid.at(4, 1, 2); + Vec3d circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + .add(0, 3 / 16f, 0); + + scene.world.showSection(util.select.layersFrom(1) + .substract(util.select.position(circuitPos)), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.idle(20); + + scene.overlay.showText(40) + .attachKeyFrame() + .text("Powered Latches are redstone controllable Levers") + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(50); + + scene.effects.indicateRedstone(buttonPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.idle(30); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); + + AxisAlignedBB bb = new AxisAlignedBB(circuitPos).grow(-.48f, -.45f, -.05f) + .offset(.575, -.45, 0); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .text("Signals at the back switch it on") + .placeNearTarget() + .pointAt(bb.getCenter()); + scene.idle(60); + + scene.effects.indicateRedstone(util.grid.at(2, 1, 0)); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 0, 2, 1, 1)); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.idle(30); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 0, 2, 1, 1)); + + bb = new AxisAlignedBB(circuitPos).grow(-.05f, -.45f, -.48f) + .offset(0, -.45, .575); + AxisAlignedBB bb2 = new AxisAlignedBB(circuitPos).grow(-.05f, -.45f, -.48f) + .offset(0, -.45, -.575); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb2, bb2, 40); + scene.overlay.showText(40) + .colored(PonderPalette.RED) + .text("Signals from the side switch it back off") + .placeNearTarget() + .pointAt(bb2.getCenter()); + scene.idle(50); + + scene.addKeyframe(); + scene.idle(10); + scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.idle(10); + + scene.overlay.showText(50) + .text("Powered latches can also be toggled manually") + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(60); + + scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, PoweredLatchBlock.POWERING); + scene.idle(10); + } + + public static void poweredToggleLatch(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("powered_toggle_latch", "Controlling signals using the Powered Toggle Latch"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos circuitPos = util.grid.at(2, 1, 2); + BlockPos buttonPos = util.grid.at(4, 1, 2); + Vec3d circuitTop = util.vector.blockSurface(circuitPos, Direction.DOWN) + .add(0, 3 / 16f, 0); + + scene.world.showSection(util.select.layersFrom(1) + .substract(util.select.position(circuitPos)), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.position(circuitPos), Direction.DOWN); + scene.idle(20); + + scene.overlay.showText(40) + .attachKeyFrame() + .text("Powered Toggle Latches are redstone controllable Levers") + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(50); + + scene.effects.indicateRedstone(buttonPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.idle(30); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); + + AxisAlignedBB bb = new AxisAlignedBB(circuitPos).grow(-.48f, -.45f, -.05f) + .offset(.575, -.45, 0); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.GREEN, bb, bb, 40); + scene.overlay.showText(40) + .colored(PonderPalette.GREEN) + .text("Signals at the back will toggle its state") + .placeNearTarget() + .pointAt(bb.getCenter()); + scene.idle(60); + + scene.effects.indicateRedstone(buttonPos); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.idle(30); + scene.world.toggleRedstonePower(util.select.fromTo(4, 1, 2, 3, 1, 2)); + scene.overlay.chaseBoundingBoxOutline(PonderPalette.RED, bb, bb, 40); + scene.overlay.showText(30) + .colored(PonderPalette.RED) + .text("...on and back off") + .placeNearTarget() + .pointAt(bb.getCenter()); + scene.idle(50); + + scene.addKeyframe(); + scene.idle(10); + scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.idle(10); + + scene.overlay.showText(50) + .text("Powered toggle latches can also be toggled manually") + .placeNearTarget() + .pointAt(circuitTop); + scene.idle(60); + + scene.overlay.showControls(new InputWindowElement(circuitTop, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 0, 1, 2)); + scene.world.cycleBlockProperty(circuitPos, ToggleLatchBlock.POWERING); + scene.idle(10); + } + + public static void analogLever(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("analog_lever", "Controlling signals using the Analog Lever"); + scene.configureBasePlate(0, 0, 5); + + BlockPos[] wireLocations = new BlockPos[] { util.grid.at(2, 1, 1), util.grid.at(2, 1, 0), util.grid.at(1, 1, 0), + util.grid.at(0, 1, 0), util.grid.at(0, 1, 1), util.grid.at(0, 1, 2), util.grid.at(0, 1, 3), + util.grid.at(0, 1, 4), util.grid.at(1, 1, 4), util.grid.at(2, 1, 4), util.grid.at(3, 1, 4), + util.grid.at(4, 1, 4), util.grid.at(4, 1, 3), util.grid.at(4, 1, 2), util.grid.at(4, 1, 1) }; + + Selection leverSelection = util.select.fromTo(2, 1, 2, 2, 2, 2); + Selection lamp = util.select.position(4, 1, 0); + BlockPos leverPos = util.grid.at(2, 2, 2); + Vec3d leverVec = util.vector.centerOf(leverPos) + .add(0, -.25, 0); + + scene.world.showSection(util.select.layersFrom(0) + .substract(lamp) + .substract(leverSelection), Direction.UP); + scene.idle(5); + scene.world.showSection(lamp, Direction.DOWN); + scene.idle(10); + + scene.world.showSection(leverSelection, Direction.DOWN); + scene.idle(20); + + scene.overlay.showText(60) + .text("Analog Levers make for a compact and precise source of redstone power") + .placeNearTarget() + .attachKeyFrame() + .pointAt(leverVec); + scene.idle(70); + + IntegerProperty power = RedstoneWireBlock.POWER; + scene.overlay.showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + for (int i = 0; i < 7; i++) { + scene.idle(2); + final int state = i + 1; + scene.world.modifyTileNBT(leverSelection, AnalogLeverTileEntity.class, nbt -> nbt.putInt("State", state)); + scene.world.modifyBlock(wireLocations[i], s -> s.with(power, 7 - state), false); + scene.effects.indicateRedstone(wireLocations[i]); + } + scene.idle(20); + + scene.overlay.showText(60) + .attachKeyFrame() + .text("Right-click to increase its analog power output") + .placeNearTarget() + .pointAt(leverVec); + scene.idle(70); + + scene.overlay.showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick() + .whileSneaking(), 40); + scene.idle(7); + for (int i = 7; i > 0; i--) { + scene.idle(2); + final int state = i - 1; + if (i > 3) { + scene.world.modifyTileNBT(leverSelection, AnalogLeverTileEntity.class, + nbt -> nbt.putInt("State", state)); + scene.effects.indicateRedstone(wireLocations[i]); + } + scene.world.modifyBlock(wireLocations[i], s -> s.with(power, state > 2 ? 0 : 3 - state), false); + } + scene.world.modifyBlock(wireLocations[0], s -> s.with(power, 3), false); + scene.idle(20); + + scene.overlay.showText(60) + .attachKeyFrame() + .text("Right-click while Sneaking to decrease the power output again") + .placeNearTarget() + .pointAt(leverVec); + scene.idle(70); + + scene.overlay.showControls(new InputWindowElement(leverVec, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + for (int i = 0; i < 15; i++) { + scene.idle(2); + final int state = i + 1; + if (i >= 4) { + scene.world.modifyTileNBT(leverSelection, AnalogLeverTileEntity.class, + nbt -> nbt.putInt("State", state)); + scene.effects.indicateRedstone(wireLocations[i]); + } + scene.world.modifyBlock(wireLocations[i], s -> s.with(power, 15 - state), false); + } + + scene.world.toggleRedstonePower(lamp); + scene.effects.indicateRedstone(leverPos); + scene.effects.indicateRedstone(util.grid.at(4, 1, 1)); + scene.idle(20); + } + + public static void nixieTube(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("analog_lever", "Using Nixie Tubes"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0) + .add(util.select.fromTo(2, 1, 1, 2, 1, 2)), Direction.UP); + scene.idle(10); + scene.world.showSection(util.select.position(2, 1, 3), Direction.DOWN); + scene.idle(20); + + Selection tubes = util.select.fromTo(3, 1, 3, 1, 1, 3); + + scene.effects.indicateRedstone(util.grid.at(2, 1, 1)); + scene.world.modifyTileNBT(util.select.position(2, 1, 1), AnalogLeverTileEntity.class, + nbt -> nbt.putInt("State", 11)); + scene.world.modifyBlock(util.grid.at(2, 1, 2), s -> s.with(RedstoneWireBlock.POWER, 11), false); + scene.world.modifyTileNBT(tubes, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 11)); + scene.idle(20); + + Vec3d centerTube = util.vector.centerOf(2, 1, 3); + + scene.overlay.showText(60) + .attachKeyFrame() + .text("When powered by Redstone, Nixie Tubes will display the redstone signals' strength") + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 3), Direction.WEST)); + scene.idle(70); + + scene.world.hideSection(util.select.position(2, 1, 3), Direction.UP); + scene.idle(5); + scene.world.hideSection(util.select.fromTo(2, 1, 1, 2, 1, 2), Direction.NORTH); + scene.idle(10); + scene.world.modifyTileNBT(tubes, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world.showSection(tubes, Direction.DOWN); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(centerTube.add(0, .35, 0), Pointing.DOWN).rightClick() + .withItem(new ItemStack(Items.NAME_TAG)), 40); + scene.idle(7); + + ITextComponent component = new StringTextComponent("CREATE"); + for (int i = 0; i < 3; i++) { + final int index = i; + scene.world.modifyTileNBT(util.select.position(3 - i, 1, 3), NixieTubeTileEntity.class, nbt -> { + nbt.putString("RawCustomText", component.getFormattedText()); + nbt.putString("CustomText", ITextComponent.Serializer.toJson(component)); + nbt.putInt("CustomTextIndex", index); + }); + } + + scene.idle(10); + scene.world.showSection(util.select.position(4, 1, 3), Direction.DOWN); + scene.idle(10); + scene.special.createBirb(util.vector.topOf(util.grid.at(0, 0, 3)), ParrotElement.DancePose::new); + + scene.idle(20); + scene.overlay.showText(80) + .attachKeyFrame() + .text("Using name tags edited with an anvil, custom text can be displayed") + .pointAt(util.vector.topOf(util.grid.at(2, 1, 3)) + .add(.25, -.05f, 0)); + scene.idle(70); + } + + public static void redstoneLink(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("redstone_link", "Using Redstone Links"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0) + .add(util.select.fromTo(3, 1, 1, 2, 1, 1)), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(4, 1, 3, 0, 2, 3), Direction.DOWN); + scene.idle(10); + + Selection redstone = util.select.fromTo(3, 1, 1, 1, 1, 1); + BlockPos leverPos = util.grid.at(3, 1, 1); + BlockPos link1Pos = util.grid.at(1, 1, 1); + BlockPos link2Pos = util.grid.at(1, 2, 2); + BlockPos link3Pos = util.grid.at(3, 2, 2); + Selection link1Select = util.select.position(link1Pos); + Selection link2Select = util.select.position(link2Pos); + Selection link3Select = util.select.position(link3Pos); + Vec3d link1Vec = util.vector.blockSurface(link1Pos, Direction.DOWN) + .add(0, 3 / 16f, 0); + Vec3d link2Vec = util.vector.blockSurface(link2Pos, Direction.SOUTH) + .add(0, 0, -3 / 16f); + Vec3d link3Vec = util.vector.blockSurface(link3Pos, Direction.SOUTH) + .add(0, 0, -3 / 16f); + + scene.world.showSection(link1Select, Direction.DOWN); + scene.idle(5); + scene.world.showSection(link2Select, Direction.DOWN); + scene.idle(5); + scene.world.showSection(link3Select, Direction.DOWN); + scene.idle(10); + + scene.overlay.showText(50) + .attachKeyFrame() + .text("Redstone Links can transmit redstone signals wirelessly") + .placeNearTarget() + .pointAt(link1Vec); + scene.idle(60); + + scene.overlay.showControls(new InputWindowElement(link2Vec, Pointing.UP).rightClick() + .whileSneaking(), 40); + scene.idle(7); + scene.world.modifyBlock(link2Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); + scene.idle(10); + scene.overlay.showText(50) + .text("Right-click while Sneaking to toggle receive mode") + .placeNearTarget() + .pointAt(link2Vec); + scene.idle(60); + + scene.overlay.showControls(new InputWindowElement(link3Vec, Pointing.UP).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.world.modifyBlock(link3Pos, s -> s.cycle(RedstoneLinkBlock.RECEIVER), true); + scene.idle(10); + scene.overlay.showText(50) + .text("A simple Right-click with a Wrench can do the same") + .placeNearTarget() + .pointAt(link3Vec); + scene.idle(70); + + scene.addKeyframe(); + scene.idle(10); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(5); + scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2)); + scene.effects.indicateRedstone(link2Pos); + scene.effects.indicateRedstone(link3Pos); + + scene.idle(10); + scene.overlay.showText(70) + .colored(PonderPalette.GREEN) + .text("Receivers will emit the redstone power of transmitters within a range of 128 blocks") + .placeNearTarget() + .pointAt(link2Vec); + scene.idle(80); + scene.world.toggleRedstonePower(redstone); + scene.idle(5); + scene.world.toggleRedstonePower(util.select.fromTo(3, 2, 3, 1, 2, 2)); + scene.idle(20); + + Vec3d frontSlot = link1Vec.add(.18, -.05, -.15); + Vec3d backSlot = link1Vec.add(.18, -.05, .15); + Vec3d top2Slot = link2Vec.add(-.09, .15, 0); + Vec3d bottom2Slot = link2Vec.add(-.09, -.2, 0); + Vec3d top3Slot = link3Vec.add(-.09, .15, 0); + Vec3d bottom3Slot = link3Vec.add(-.09, -.2, 0); + + scene.addKeyframe(); + scene.idle(10); + scene.overlay.showFilterSlotInput(frontSlot, 100); + scene.overlay.showFilterSlotInput(backSlot, 100); + scene.idle(10); + + scene.overlay.showText(50) + .text("Placing items in the two slots can specify a Frequency") + .placeNearTarget() + .pointAt(backSlot); + scene.idle(60); + + ItemStack iron = new ItemStack(Items.IRON_INGOT); + ItemStack gold = new ItemStack(Items.GOLD_INGOT); + ItemStack sapling = new ItemStack(Items.OAK_SAPLING); + + scene.overlay.showControls(new InputWindowElement(backSlot, Pointing.DOWN).withItem(iron), 40); + scene.idle(7); + scene.overlay.showControls(new InputWindowElement(frontSlot, Pointing.UP).withItem(sapling), 40); + scene.world.modifyTileNBT(link1Select, RedstoneLinkTileEntity.class, + nbt -> nbt.put("FrequencyLast", iron.write(new CompoundNBT()))); + scene.idle(7); + scene.world.modifyTileNBT(link1Select, RedstoneLinkTileEntity.class, + nbt -> nbt.put("FrequencyFirst", sapling.write(new CompoundNBT()))); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(top2Slot, Pointing.DOWN).withItem(iron), 40); + scene.idle(7); + scene.overlay.showControls(new InputWindowElement(bottom2Slot, Pointing.UP).withItem(sapling), 40); + scene.world.modifyTileNBT(link2Select, RedstoneLinkTileEntity.class, + nbt -> nbt.put("FrequencyLast", iron.write(new CompoundNBT()))); + scene.idle(7); + scene.world.modifyTileNBT(link2Select, RedstoneLinkTileEntity.class, + nbt -> nbt.put("FrequencyFirst", sapling.write(new CompoundNBT()))); + scene.idle(20); + + scene.overlay.showControls(new InputWindowElement(top3Slot, Pointing.DOWN).withItem(gold), 40); + scene.idle(7); + scene.overlay.showControls(new InputWindowElement(bottom3Slot, Pointing.UP).withItem(sapling), 40); + scene.world.modifyTileNBT(link3Select, RedstoneLinkTileEntity.class, + nbt -> nbt.put("FrequencyLast", gold.write(new CompoundNBT()))); + scene.idle(7); + scene.world.modifyTileNBT(link3Select, RedstoneLinkTileEntity.class, + nbt -> nbt.put("FrequencyFirst", sapling.write(new CompoundNBT()))); + scene.idle(20); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(5); + scene.world.toggleRedstonePower(util.select.fromTo(1, 2, 2, 1, 2, 3)); + scene.effects.indicateRedstone(link2Pos); + scene.overlay.showText(90) + .attachKeyFrame() + .text("Only the links with matching Frequency combinations will communicate") + .placeNearTarget() + .pointAt(link2Vec); + scene.idle(100); + } + } diff --git a/src/main/resources/ponder/adjustable_pulse_repeater.nbt b/src/main/resources/ponder/adjustable_pulse_repeater.nbt new file mode 100644 index 0000000000000000000000000000000000000000..bac67f6a1da1b6c12495a2a25141dd4c6c639dd9 GIT binary patch literal 453 zcmV;$0XqI4iwFP!000000Hu`8PUA2T$0xB<(sJN}#GVk3u;*TP&nqM(u92Hesae;K zYIvm#j6 zRmVGy+P1p)u0@}&zY>Je5sIy%7MvV!&W;|N5S_)!sC_&3EnC;2Pn~}Ul$2?DgU#v1 zVyo&Tkf=gD1^9Xhqe$=WbelKCEP^}49Y{-g(at)5-pLM=us=Fx1KH2n$~x`wyYYJA v|Hq>?AvMi7=V!XuXEM;Q&UAzSC^CKYzg1L^=!13^pnQcl0#*5N2L}KEl9$&; literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/adjustable_repeater.nbt b/src/main/resources/ponder/adjustable_repeater.nbt new file mode 100644 index 0000000000000000000000000000000000000000..feb3414774597c8daa1e5448964f50831b470991 GIT binary patch literal 447 zcmV;w0YLsAiwFP!000000Hu`8PUA2T$0xB<(sJN}1mdvIuxGAtMo36pD>s=^@49wm zyF}u_cs|A@X;2iR5sYL-cK-95uf!{WCCH%PPyj$$1+6?imr$aOI%*7%Yzd2van=8@ zqRpQrh{lE9>0|06QWiy;?LNn&%431!MB!kmi&ggT_ z=<^&$FgTLIfi9=7n*5u(1Y;J0F^f5lU~nXZ)0LNaDC#}N#UoaC%P*iFo!yxS@N zqU}riC7$}%0?wZ*?~Hj?=5U0Tkn0+5Dvu<&RrS9Eu{H+R9-DOJC$b+;S4?zatdSEH zjy1(Zg=5WvG-r)67$c^O>8u3#p!NvYdu_4uY8!9cosPJ!oTaMBsaISMieO#4KHhHB zu+^h?4f=HPl^~3cP;8Y6gX7iU=&=sbSzH^nZ^pi5<688o=bwO*GEFB~pAHsVRV9H$ z72+wtT>D2cJ{{=>uZdO!cZfTXmNKH9b$-~%7L%}hb<6{@zq2*9+T(BIb;6&=qXr?h p%Q)v}`qyRB(=P_P!B>h*ANswD>KT2|&H|M0@B!wabyWKX006Ky+x`Fm literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/analog_lever.nbt b/src/main/resources/ponder/analog_lever.nbt new file mode 100644 index 0000000000000000000000000000000000000000..07bfc5e2974a9090056cc10409936094f4897023 GIT binary patch literal 514 zcmV+d0{#6TiwFP!000000L7Khj?*v@#wWJZO|ozT0q?+t^IqYMkU(53Z#r!)QaiE@ zk$5nk52qWa*{l-=@ny_Nw}b+xp) z!>f<+6^HA$N2w3^NuAL4Zwg>)2hVDYL2@ItY|LTX;J5Ja!>O`aD@CF#^P`t1$}-n% z7Pie)bG6_#Ju<}tXR0X|J{MC>wcy28yaYiLIh?>*(?rg+-Pa3s7KA#lX*fY65}GGL zbJfZQy~qA$d0K#YFHZ=sPD*2K<=)?PN9A!_8y&V^NQ#Q*7lqTN+n%qd(3I+fH7(ly z<|=?U%0s@Fjk_eiyd+xOId3#>8+mF+!HaR9@6esSrBnJaXN$e8F~A#RYyq1P^&)}N z`4N>oGIP#3BV5BfEJ9_>SAQHMZEPRuFvlS5uovD1d271B%HFK5t5X(9egib+HwgdK zZ*cha`u>C8UG#VBdEf7TJ^#Jmy**q!}$Y#0v0xsK?(~1 E0KT{K6951J literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/nixie_tube.nbt b/src/main/resources/ponder/nixie_tube.nbt new file mode 100644 index 0000000000000000000000000000000000000000..7d858b35f140a88d926cea864e9ddba15e2dc154 GIT binary patch literal 467 zcmV;^0WAI>iwFP!000000JW9DZrmUchQ|hPyxU8wRBCTI8ZX3i-yI4pz1GdM$( z89tX8KA+;S3=YrWj9Zc6Gt2P#6o+MScm`((p5Zgk@c9&nWpH?svjS$;fx7O8E(V`& zcG7I|LG97So*GKEf%C>8Nv@@l+HQr$7kc~mRO6D4k6$?s@%blie6R-ZgF~|oyNUhf zz&7etp$N}wOc+(n3}^p@T>dvQOOn&0A0K|6*tj{TBF$MRHHLukE?v~Xf5<(;_q{UM zIN65ley0M8#u}O^6%C57lfoO@i;oML7QDK1wnG>1YLd3HL8w}7t*c={nKE18D18_~ z$pbOtoHeL)EUj9pJx-{~SVwLStc02K8GVe+4edouKG}*f7 zDz3(nzD>(_hrJcOa+5!olc2L???z~)--K;N*r9llTH{;%NN#12kLbLzhK|HU^`CRj(dcid)|54X;+joca25~N>U;1 z!S;L$Z77IRWUaG=km2v2zoKLSDR8U4kpV#aB>supcM1Y4r<_6yt);M7m%8|}nRlL2 zV70bg(8(Ai)=7sUVyKBGG|@;C6F7{(;RH@+(F`Y=(2O}Tfx`$KPT+JF6XqNf<~+w? z1P&)~Ak;L}#25Nvgk3PgF6KClz~KZ=XPmGLPT0j9hY>iOz=^w>1{!ujGdzcUqOb8z zlM9@oW--y%ShJkyYpfAov#e!_&S85Ur2_b?+#x*fRE33+8@Fn<%3)sUsxat-I>lYD zu$6A|!<_~hWN${-Xxi&e04tS)WFt%42R`(H20yIR73QVf)#F&ckp=qTQfni8mAXN% z4>SP_|65g`z8AfB+Y|l1r>~VMw)uMRe2OzTO6!1EKDp=+{`&rCy-J(j;|&gkhaw<) zo^7U41~23b8A84Q4f&4VKjjmL$isZXyv_!A8$RT1QD>jBRU)q1~)I#$#*nXc^AYF`~qY}_2AV9003+J&T{|& literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/powered_toggle_latch.nbt b/src/main/resources/ponder/powered_toggle_latch.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e17715e41ad4ad944cdde610a7129a487ec78686 GIT binary patch literal 409 zcmV;K0cQRmiwFP!000000Hu_{YQr!LhLzZDlk7US!C=p@bI&`EopudwsL_WUxdX| z4x+KXPr8JFg(pSWWn62L2~9H6qzsN=a3q7%M>4}nCNyJC%HRkFM>05lq>MhNj6TnC z1cM_P9Oyhi&5Bp zYHW)RlIPj;TJ3OrUUtsZX5SgkLTBO*ZZ8|lovNbX$69~DV`xlh=ekpuWcT|z)XAT*!km{l zjKJXp4h){oHTf@nF~TkwVHZmrM&NJ)XADl*1t;uciNgpSPT*uSyI?bZQVpN+lWK|? zKdELFH0w?%^d93gvMzx?iUY#!L27KR*!fMrmmZte=+gWUFdCaGSV+6y2AHxGlPo<;l(prCyfRuKj8~{O=o|j1^@t+1iQrm literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/redstone_link.nbt b/src/main/resources/ponder/redstone_link.nbt new file mode 100644 index 0000000000000000000000000000000000000000..6535d7930f62e90e67f38775c0aa647b423b2975 GIT binary patch literal 564 zcmV-40?Yj$iwFP!000000L_-)Yuhjo$Iq6WI4)foly(2W-uIk6cJyUqlri=iRQuA1 zI+7s}d!3PMo)z0dv7`JxP90o=;p$N-@JB;k7jDJmzOL<{v= z!0e{f`JK)D=G_8VrEM_k7K6k(;jpzBYN8QMbfk$197f=90w=6!f)kBsjyW-b!w4Ks z;Di+u>Kqg5JjG!I4kvKBqaf6o5$Zg}VFV5*aG;H8sEJ2neoPY+G>o9(#CYN(4IAAkwv*3UYv8ei2ig;*AFo*VQomj(;#w8B*>)m;X!t_=Rzp~`<53 zJ>5!$xe;r(6w*YHT2kq`B>lh^L1)em&pa4PWU&i?+x3(CIkqv3o>o;CaX7nD64 z&3=5s4EtmDz=RoU=3X+AR!yh^?ZIAHscwBGvTLI&H1&ld1y=fFOV*;aJ@}#r_ca&W>ezN(={f;_e&;MX2N*lL%8lIzXg8IT$cu->X&I7pe>NMcm9pB?XcnAuj z_midCON0OT^Rc3jywuu^Bo|U?!V2)S9$sRdIfIjr!in!_?BOj*|G;0~=jKm23IG6b CFCB{j literal 0 HcmV?d00001 From e1c16d869d37c8434950bac6b889b5dc9e412acd Mon Sep 17 00:00:00 2001 From: JozsefA Date: Mon, 15 Mar 2021 15:58:41 -0700 Subject: [PATCH 113/124] Some semblance of immersive portals compat. - Each world gets its own KineticRenderer now. --- .../com/simibubi/create/CreateClient.java | 24 +++++++++++++--- .../contraptions/base/KineticTileEntity.java | 6 ---- .../simibubi/create/events/ClientEvents.java | 7 +++-- .../foundation/mixin/AddRemoveTileMixin.java | 26 +++++++++++++++-- .../foundation/mixin/LightUpdateMixin.java | 9 ++++-- .../foundation/mixin/RenderHooksMixin.java | 10 +++++-- .../foundation/render/AllProgramSpecs.java | 8 +++--- .../foundation/render/KineticRenderer.java | 28 +++++++++---------- .../render/backend/FastRenderDispatcher.java | 14 ++++++---- .../foundation/utility/WorldAttached.java | 5 ++++ 10 files changed, 92 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/simibubi/create/CreateClient.java b/src/main/java/com/simibubi/create/CreateClient.java index c411a9e26..cd696310b 100644 --- a/src/main/java/com/simibubi/create/CreateClient.java +++ b/src/main/java/com/simibubi/create/CreateClient.java @@ -14,10 +14,13 @@ import com.simibubi.create.foundation.item.CustomItemModels; import com.simibubi.create.foundation.item.CustomRenderedItems; import com.simibubi.create.foundation.ponder.content.PonderIndex; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.render.AllProgramSpecs; import com.simibubi.create.foundation.render.KineticRenderer; import com.simibubi.create.foundation.render.SuperByteBufferCache; import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.OptifineHandler; +import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.utility.WorldAttached; import com.simibubi.create.foundation.utility.ghost.GhostBlocks; import com.simibubi.create.foundation.utility.outliner.Outliner; import net.minecraft.block.Block; @@ -30,6 +33,7 @@ import net.minecraft.item.Item; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.util.ResourceLocation; +import net.minecraft.world.IWorld; import net.minecraftforge.client.event.ModelBakeEvent; import net.minecraftforge.client.event.ModelRegistryEvent; import net.minecraftforge.client.event.TextureStitchEvent; @@ -37,6 +41,7 @@ import net.minecraftforge.client.model.ModelLoader; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -48,7 +53,7 @@ public class CreateClient { public static SchematicHandler schematicHandler; public static SchematicAndQuillHandler schematicAndQuillHandler; public static SuperByteBufferCache bufferCache; - public static KineticRenderer kineticRenderer; + public static WorldAttached kineticRenderer; public static final Outliner outliner = new Outliner(); public static GhostBlocks ghostBlocks; @@ -70,7 +75,8 @@ public class CreateClient { } public static void clientInit(FMLClientSetupEvent event) { - kineticRenderer = new KineticRenderer(); + AllProgramSpecs.init(); + kineticRenderer = new WorldAttached<>(KineticRenderer::new); schematicSender = new ClientSchematicLoader(); schematicHandler = new SchematicHandler(); @@ -192,8 +198,18 @@ public class CreateClient { } public static void invalidateRenderers() { - CreateClient.bufferCache.invalidate(); - CreateClient.kineticRenderer.invalidate(); + invalidateRenderers(null); + } + + public static void invalidateRenderers(@Nullable IWorld world) { + bufferCache.invalidate(); + + if (world != null) { + kineticRenderer.get(world).invalidate(); + } else { + kineticRenderer.forEach(InstancedTileRenderer::invalidate); + } + ContraptionRenderDispatcher.invalidateAll(); } } 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 b0b2d51f6..c0984e491 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 @@ -534,12 +534,6 @@ public abstract class KineticTileEntity extends SmartTileEntity return block.hasIntegratedCogwheel(world, pos, state); } - @Override - public void onChunkUnloaded() { - if (world != null && world.isRemote) - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> CreateClient.kineticRenderer.remove(this)); - } - @Override public void requestModelDataUpdate() { super.requestModelDataUpdate(); diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index 5a5f384af..3c19cdde8 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -27,6 +27,7 @@ import com.simibubi.create.foundation.item.TooltipHelper; 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.render.KineticRenderer; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.render.backend.RenderWork; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; @@ -125,7 +126,9 @@ public class ClientEvents { if (world.isRemote() && world instanceof ClientWorld) { CreateClient.invalidateRenderers(); AnimationTickHolder.reset(); - ((ClientWorld) world).loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); + KineticRenderer renderer = CreateClient.kineticRenderer.get(world); + renderer.invalidate(); + ((ClientWorld) world).loadedTileEntityList.forEach(renderer::add); } /* @@ -139,7 +142,7 @@ public class ClientEvents { @SubscribeEvent public static void onUnloadWorld(WorldEvent.Unload event) { if (event.getWorld().isRemote()) { - CreateClient.invalidateRenderers(); + CreateClient.invalidateRenderers(event.getWorld()); AnimationTickHolder.reset(); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java index d20b076ec..24321c5ad 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/AddRemoveTileMixin.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.mixin; +import com.simibubi.create.foundation.render.KineticRenderer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -17,12 +18,16 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import java.util.Set; + @OnlyIn(Dist.CLIENT) @Mixin(World.class) public class AddRemoveTileMixin { @Shadow @Final public boolean isRemote; + @Shadow @Final protected Set tileEntitiesToBeRemoved; + /** * JUSTIFICATION: This method is called whenever a tile entity is removed due * to a change in block state, even on the client. By hooking into this method, @@ -30,11 +35,28 @@ public class AddRemoveTileMixin { */ @Inject(at = @At(value = "INVOKE_ASSIGN", target = "Lnet/minecraft/world/World;getTileEntity(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/tileentity/TileEntity;"), method = "removeTileEntity", locals = LocalCapture.CAPTURE_FAILHARD) private void onRemoveTile(BlockPos pos, CallbackInfo ci, TileEntity te) { - if (isRemote) CreateClient.kineticRenderer.remove(te); + if (isRemote) { + World thi = (World)(Object) this; + CreateClient.kineticRenderer.get(thi).remove(te); + } } @Inject(at = @At("TAIL"), method = "addTileEntity") private void onAddTile(TileEntity te, CallbackInfoReturnable cir) { - if (isRemote) CreateClient.kineticRenderer.queueAdd(te); + if (isRemote) { + World thi = (World)(Object) this; + CreateClient.kineticRenderer.get(thi).queueAdd(te); + } + } + + @Inject(at = @At(value = "INVOKE", target = "Ljava/util/Set;clear()V", ordinal = 0), method = "tickBlockEntities") + private void onChunkUnload(CallbackInfo ci) { + if (isRemote) { + World thi = (World)(Object) this; + KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(thi); + for (TileEntity tile : tileEntitiesToBeRemoved) { + kineticRenderer.remove(tile); + } + } } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java index 1636c95bb..d55539c7c 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/LightUpdateMixin.java @@ -3,6 +3,7 @@ package com.simibubi.create.foundation.mixin; import java.util.Map; import com.simibubi.create.CreateClient; +import net.minecraft.client.world.ClientWorld; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -33,6 +34,7 @@ public abstract class LightUpdateMixin extends AbstractChunkProvider { @Inject(at = @At("HEAD"), method = "markLightChanged") private void onLightUpdate(LightType type, SectionPos pos, CallbackInfo ci) { ClientChunkProvider thi = ((ClientChunkProvider) (Object) this); + ClientWorld world = (ClientWorld) thi.getWorld(); Chunk chunk = thi.getChunk(pos.getSectionX(), pos.getSectionZ(), false); @@ -43,14 +45,15 @@ public abstract class LightUpdateMixin extends AbstractChunkProvider { .entrySet() .stream() .filter(entry -> SectionPos.toChunk(entry.getKey().getY()) == sectionY) - .map(Map.Entry::getValue).forEach(tile -> { - CreateClient.kineticRenderer.onLightUpdate(tile); + .map(Map.Entry::getValue) + .forEach(tile -> { + CreateClient.kineticRenderer.get(world).onLightUpdate(tile); if (tile instanceof ILightListener) ((ILightListener) tile).onChunkLightUpdate(); }); } - ContraptionRenderDispatcher.notifyLightUpdate((ILightReader) thi.getWorld(), type, pos); + ContraptionRenderDispatcher.notifyLightUpdate(world, type, pos); } } diff --git a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java index 89310489c..2bdf89fb7 100644 --- a/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java +++ b/src/main/java/com/simibubi/create/foundation/mixin/RenderHooksMixin.java @@ -1,5 +1,6 @@ package com.simibubi.create.foundation.mixin; +import com.simibubi.create.foundation.render.KineticRenderer; import net.minecraft.client.renderer.*; import net.minecraft.util.math.Vec3d; import org.lwjgl.opengl.GL20; @@ -52,17 +53,20 @@ public class RenderHooksMixin { double camY = cameraPos.getY(); double camZ = cameraPos.getZ(); - CreateClient.kineticRenderer.beginFrame(camX, camY, camZ); + CreateClient.kineticRenderer.get(world).beginFrame(camX, camY, camZ); ContraptionRenderDispatcher.beginFrame(camX, camY, camZ); } @Inject(at = @At("TAIL"), method = "loadRenderers") private void refresh(CallbackInfo ci) { - CreateClient.kineticRenderer.invalidate(); ContraptionRenderDispatcher.invalidateAll(); OptifineHandler.refresh(); Backend.refresh(); - if (Backend.canUseInstancing() && world != null) world.loadedTileEntityList.forEach(CreateClient.kineticRenderer::add); + if (Backend.canUseInstancing() && world != null) { + KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); + kineticRenderer.invalidate(); + world.loadedTileEntityList.forEach(kineticRenderer::add); + } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index a07a85727..916d8c478 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -19,6 +19,10 @@ import com.simibubi.create.foundation.render.backend.gl.shader.ShaderConstants; import net.minecraft.util.ResourceLocation; public class AllProgramSpecs { + public static void init() { + // noop, make sure the static field are loaded. + } + public static final ProgramSpec MODEL = register(ProgramSpec.builder("model", BasicProgram::new) .addAttributes(ModelVertexAttributes.class) .addAttributes(InstanceVertexAttributes.class) @@ -90,10 +94,6 @@ public class AllProgramSpecs { .setFrag(Locations.CONTRAPTION) .createProgramSpec()); - public static class Contraption { - - } - public static class Locations { public static final ResourceLocation MODEL_FRAG = loc("model.frag"); diff --git a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java index d9c8f74d6..d41890d0d 100644 --- a/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java +++ b/src/main/java/com/simibubi/create/foundation/render/KineticRenderer.java @@ -19,6 +19,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; public class KineticRenderer extends InstancedTileRenderer { public static int MAX_ORIGIN_DISTANCE = 100; @@ -40,30 +41,27 @@ public class KineticRenderer extends InstancedTileRenderer { } @Override - public void tick() { - super.tick(); + public void beginFrame(double cameraX, double cameraY, double cameraZ) { + int cX = MathHelper.floor(cameraX); + int cY = MathHelper.floor(cameraY); + int cZ = MathHelper.floor(cameraZ); - Minecraft mc = Minecraft.getInstance(); - Entity renderViewEntity = mc.renderViewEntity; - - if (renderViewEntity == null) return; - - BlockPos renderViewPosition = renderViewEntity.getPosition(); - - int dX = Math.abs(renderViewPosition.getX() - originCoordinate.getX()); - int dY = Math.abs(renderViewPosition.getY() - originCoordinate.getY()); - int dZ = Math.abs(renderViewPosition.getZ() - originCoordinate.getZ()); + int dX = Math.abs(cX - originCoordinate.getX()); + int dY = Math.abs(cY - originCoordinate.getY()); + int dZ = Math.abs(cZ - originCoordinate.getZ()); if (dX > MAX_ORIGIN_DISTANCE || - dY > MAX_ORIGIN_DISTANCE || - dZ > MAX_ORIGIN_DISTANCE) { + dY > MAX_ORIGIN_DISTANCE || + dZ > MAX_ORIGIN_DISTANCE) { - originCoordinate = renderViewPosition; + originCoordinate = new BlockPos(cX, cY, cZ); ArrayList instancedTiles = new ArrayList<>(instances.keySet()); invalidate(); instancedTiles.forEach(this::add); } + + super.beginFrame(cameraX, cameraY, cameraZ); } @Override diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java index 6f096d888..08e31dcc1 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/FastRenderDispatcher.java @@ -2,13 +2,11 @@ package com.simibubi.create.foundation.render.backend; import java.util.concurrent.ConcurrentHashMap; -import org.lwjgl.opengl.GL11; +import com.simibubi.create.foundation.render.KineticRenderer; import com.mojang.blaze3d.matrix.MatrixStack; -import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.KineticDebugger; -import com.simibubi.create.content.schematics.SchematicWorld; import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.WorldAttached; @@ -41,14 +39,15 @@ public class FastRenderDispatcher { public static void tick() { ClientWorld world = Minecraft.getInstance().world; - CreateClient.kineticRenderer.tick(); + KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); + kineticRenderer.tick(); ConcurrentHashMap.KeySetView map = queuedUpdates.get(world); map .forEach(te -> { map.remove(te); - CreateClient.kineticRenderer.update(te); + kineticRenderer.update(te); }); } @@ -71,9 +70,12 @@ public class FastRenderDispatcher { public static void renderLayer(RenderType layer, Matrix4f viewProjection, double cameraX, double cameraY, double cameraZ) { if (!Backend.canUseInstancing()) return; + ClientWorld world = Minecraft.getInstance().world; + KineticRenderer kineticRenderer = CreateClient.kineticRenderer.get(world); + layer.startDrawing(); - CreateClient.kineticRenderer.render(layer, viewProjection, cameraX, cameraY, cameraZ); + kineticRenderer.render(layer, viewProjection, cameraX, cameraY, cameraZ); layer.endDrawing(); } diff --git a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java index 99a84db53..c457bea5e 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java +++ b/src/main/java/com/simibubi/create/foundation/utility/WorldAttached.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -39,5 +40,9 @@ public class WorldAttached { public void put(IWorld world, T entry) { attached.put(world, entry); } + + public void forEach(Consumer consumer) { + attached.values().forEach(consumer); + } } From 27eaf55b451b51bcab54baae756998bc0cb97c6a Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Mar 2021 03:24:34 +0100 Subject: [PATCH 114/124] Another UI reshuffle - 'Backstepping' is now a button - Added little labels for hovered buttons at the bottom - Moved ponder/transition-specific logic out of the generic screen class --- src/generated/resources/.cache/cache | 26 +- .../resources/assets/create/lang/en_us.json | 6 + .../assets/create/lang/unfinished/de_de.json | 8 +- .../assets/create/lang/unfinished/es_es.json | 8 +- .../assets/create/lang/unfinished/es_mx.json | 8 +- .../assets/create/lang/unfinished/fr_fr.json | 8 +- .../assets/create/lang/unfinished/it_it.json | 8 +- .../assets/create/lang/unfinished/ja_jp.json | 8 +- .../assets/create/lang/unfinished/ko_kr.json | 8 +- .../assets/create/lang/unfinished/nl_nl.json | 8 +- .../assets/create/lang/unfinished/pt_br.json | 8 +- .../assets/create/lang/unfinished/ru_ru.json | 8 +- .../assets/create/lang/unfinished/zh_cn.json | 8 +- .../assets/create/lang/unfinished/zh_tw.json | 8 +- .../foundation/gui/AbstractSimiScreen.java | 161 +----------- .../create/foundation/gui/ScreenOpener.java | 13 +- .../ponder/NavigatableSimiScreen.java | 231 ++++++++++++++++++ .../foundation/ponder/PonderLocalization.java | 7 + .../ponder/PonderTooltipHandler.java | 6 +- .../create/foundation/ponder/PonderUI.java | 54 ++-- .../ponder/content/PonderIndexScreen.java | 22 +- .../ponder/content/PonderTagScreen.java | 17 +- .../ponder/content/RedstoneScenes.java | 4 +- .../ponder/elements/TextWindowElement.java | 2 +- 24 files changed, 419 insertions(+), 226 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 08e29ebe9..1ec53cafb 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -212de32a4245c53011c14d5a449cc9845ba8a897 assets/create/lang/en_us.json -68692dcac5364521de8437c653b64791e962628a assets/create/lang/unfinished/de_de.json -ea0fb50d4198972c4c7865d2471cdbc75977cc70 assets/create/lang/unfinished/es_es.json -5a54f2e9ad6264bdbb41fe6390b6674904219bfe assets/create/lang/unfinished/es_mx.json -a1a8a74c61650c1bb59a4187864d952f534100c7 assets/create/lang/unfinished/fr_fr.json -07992e28b58ec1bc837a80ab633dca672ad236e4 assets/create/lang/unfinished/it_it.json -8b84abd9b61ab88fdbbf9c0cc1979e95b34b3580 assets/create/lang/unfinished/ja_jp.json -fcd3bde020b3e904d5a31032c01e2e5b9c05a702 assets/create/lang/unfinished/ko_kr.json -2e4780fe25cef72f9bb3b43be76a379e3dde9f00 assets/create/lang/unfinished/nl_nl.json -edd45f6e468d4976d2bcd714066ae3284fc27ddb assets/create/lang/unfinished/pt_br.json -8c27872585a9a180ede3ccdd1d07014863501b89 assets/create/lang/unfinished/ru_ru.json -dead3a1a62323e91d41a8e8864b7179fd2f30583 assets/create/lang/unfinished/zh_cn.json -41faa5ab5d3f812e46d8d0e1580e83cd9f2f4bb3 assets/create/lang/unfinished/zh_tw.json +f7bdf2fb1af4cae8bca1735861d603cce0870985 assets/create/lang/en_us.json +f83d2acecd5ce6ebe8dfddffde3c5c3a68abd492 assets/create/lang/unfinished/de_de.json +35e50f9ba61af0ef900154213b0b25d1dc5469d3 assets/create/lang/unfinished/es_es.json +98c26496201d8f12be5f6fc0ddaf919d9098f825 assets/create/lang/unfinished/es_mx.json +161ac9821b2445c96c6d594885c2d32cd784e8c5 assets/create/lang/unfinished/fr_fr.json +0c1baeb251ff32329a8d34a7200101de2cb724c4 assets/create/lang/unfinished/it_it.json +b0ccadbcc765e7ddee1089b3ca65414f5aa1ad95 assets/create/lang/unfinished/ja_jp.json +9551b6b6df919ff7e2b7e14361e8061b65cd4857 assets/create/lang/unfinished/ko_kr.json +552b3ef71a2898d7e263035ade5b47fb0bcfec23 assets/create/lang/unfinished/nl_nl.json +1661f76a0ba088209fcd837a8a1676dbed186368 assets/create/lang/unfinished/pt_br.json +621af99986c9e334d224f9a356c25d7468a1ef47 assets/create/lang/unfinished/ru_ru.json +6340ad62aedc1fec27abb6b490c36b1fd1317214 assets/create/lang/unfinished/zh_cn.json +56a1fedad3d453a36c456085c836fcfbf9740b1d assets/create/lang/unfinished/zh_tw.json 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 0060f63ea..f9fdd6089 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1816,6 +1816,12 @@ "create.ponder.pondering": "Pondering about...", "create.ponder.identify_mode": "Identify mode active.\nUnpause with [%1$s]", "create.ponder.associated": "Associated Entries", + "create.ponder.close": "Close", + "create.ponder.identify": "Identify", + "create.ponder.next": "Next Scene", + "create.ponder.previous": "Previous Scene", + "create.ponder.replay": "Replay", + "create.ponder.think_back": "Think Back", "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 +", 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 f727142a9..d3f057fa5 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: 1296", + "_": "Missing Localizations: 1302", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 58b16e83f..0b0652617 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: 327", + "_": "Missing Localizations: 333", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 ed7c04672..e232209e0 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: 1226", + "_": "Missing Localizations: 1232", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 533355d03..061ec4e47 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: 1008", + "_": "Missing Localizations: 1014", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 d08d07d00..871dae9bd 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: 344", + "_": "Missing Localizations: 350", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 a5958565a..e08d19db8 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: 351", + "_": "Missing Localizations: 357", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 64125ad90..0de6cbdc1 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: 397", + "_": "Missing Localizations: 403", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 e90aa4a1e..6f11b4c0e 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: 1495", + "_": "Missing Localizations: 1501", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 495da0f25..4316c6e3e 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: 1561", + "_": "Missing Localizations: 1567", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 59f6535e0..d891d5922 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: 347", + "_": "Missing Localizations: 353", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 314b568f1..d806010de 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: 345", + "_": "Missing Localizations: 351", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 e900c1e46..691488640 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: 350", + "_": "Missing Localizations: 356", "_": "->------------------------] Game Elements [------------------------<-", @@ -1817,6 +1817,12 @@ "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.close": "UNLOCALIZED: Close", + "create.ponder.identify": "UNLOCALIZED: Identify", + "create.ponder.next": "UNLOCALIZED: Next Scene", + "create.ponder.previous": "UNLOCALIZED: Previous Scene", + "create.ponder.replay": "UNLOCALIZED: Replay", + "create.ponder.think_back": "UNLOCALIZED: Think Back", "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 +", 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 1ce2335c8..a6cd30944 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/gui/AbstractSimiScreen.java @@ -2,18 +2,10 @@ package com.simibubi.create.foundation.gui; import java.util.ArrayList; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableInt; -import org.lwjgl.glfw.GLFW; import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.widgets.AbstractSimiWidget; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.Widget; @@ -26,19 +18,11 @@ 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); 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) { @@ -48,12 +32,6 @@ public abstract class AbstractSimiScreen extends Screen { guiTop = (this.height - sHeight) / 2; } - @Override - public void tick() { - super.tick(); - transition.tickChaser(); - } - @Override public void render(int mouseX, int mouseY, float partialTicks) { partialTicks = partialTicks == 10 ? 0 @@ -62,72 +40,19 @@ public abstract class AbstractSimiScreen extends Screen { RenderSystem.pushMatrix(); - renderTransition(mouseX, mouseY, partialTicks); - + renderWindowBackground(mouseX, mouseY, partialTicks); renderWindow(mouseX, mouseY, partialTicks); for (Widget widget : widgets) widget.render(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) { - renderBackground(); - return; - } - + + protected void renderWindowBackground(int mouseX, int mouseY, float partialTicks) { 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.translated(0, 0, -1000); - UIRenderHelper.framebuffer.bindFramebuffer(true); - lastScreen.render(mouseX, mouseY, 10); - RenderSystem.popMatrix();// 2 - - // 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(-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 @@ -144,12 +69,6 @@ public abstract class AbstractSimiScreen extends Screen { for (Widget widget : widgets) if (widget.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_)) return true; - - if (code == GLFW.GLFW_KEY_BACKSPACE) { - ScreenOpener.openPreviousScreen(this, Optional.empty()); - return true; - } - return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); } @@ -188,12 +107,6 @@ public abstract class AbstractSimiScreen extends Screen { return true; } - @Override - public void onClose() { - ScreenOpener.clearStack(); - super.onClose(); - } - @Override public boolean isPauseScreen() { return false; @@ -201,56 +114,6 @@ 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); - - 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); - 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 "<"; - } - - protected String getBreadcrumbTitle() { - return this.getClass() - .getSimpleName(); - } - protected void renderWindowForeground(int mouseX, int mouseY, float partialTicks) { for (Widget widget : widgets) { if (!widget.isHovered()) @@ -263,22 +126,4 @@ 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); - } - - public boolean isEquivalentTo(AbstractSimiScreen other) { - return false; - } - - public void shareContextWith(AbstractSimiScreen other) {} - } 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 af19f8fda..2d7c65352 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java +++ b/src/main/java/com/simibubi/create/foundation/gui/ScreenOpener.java @@ -8,6 +8,7 @@ import java.util.Optional; import javax.annotation.Nullable; +import com.simibubi.create.foundation.ponder.NavigatableSimiScreen; import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.client.Minecraft; @@ -35,13 +36,13 @@ public class ScreenOpener { openScreen(toOpen); } - public static void openPreviousScreen(Screen current, Optional screenWithContext) { + public static void openPreviousScreen(Screen current, Optional screenWithContext) { if (backStack.isEmpty()) return; backSteppedFrom = current; Screen previousScreen = backStack.pop(); - if (previousScreen instanceof AbstractSimiScreen) { - AbstractSimiScreen previousAbstractSimiScreen = (AbstractSimiScreen) previousScreen; + if (previousScreen instanceof NavigatableSimiScreen) { + NavigatableSimiScreen previousAbstractSimiScreen = (NavigatableSimiScreen) previousScreen; screenWithContext.ifPresent(s -> s.shareContextWith(previousAbstractSimiScreen)); previousAbstractSimiScreen.transition.startWithValue(-0.1) .chase(-1, .4f, LerpedFloat.Chaser.EXP); @@ -51,7 +52,7 @@ 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) { + public static void transitionTo(NavigatableSimiScreen screen) { if (tryBackTracking(screen)) return; screen.transition.startWithValue(0.1) @@ -59,14 +60,14 @@ public class ScreenOpener { open(screen); } - private static boolean tryBackTracking(AbstractSimiScreen screen) { + private static boolean tryBackTracking(NavigatableSimiScreen 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)) + if (!screen.isEquivalentTo((NavigatableSimiScreen) previouslyRenderedScreen)) return false; openPreviousScreen(Minecraft.getInstance().currentScreen, Optional.of(screen)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java new file mode 100644 index 000000000..4226aded7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java @@ -0,0 +1,231 @@ +package com.simibubi.create.foundation.ponder; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; +import org.lwjgl.glfw.GLFW; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.IScreenRenderable; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.ponder.content.PonderTagScreen; +import com.simibubi.create.foundation.ponder.ui.PonderButton; +import com.simibubi.create.foundation.utility.Lang; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.minecraft.client.MainWindow; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.item.ItemStack; + +public abstract class NavigatableSimiScreen extends AbstractSimiScreen { + + public static final String THINK_BACK = PonderLocalization.LANG_PREFIX + "think_back"; + + protected int depthPointX, depthPointY; + public final LerpedFloat transition = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .1f, LerpedFloat.Chaser.LINEAR); + protected PonderButton backTrack; + + public NavigatableSimiScreen() { + MainWindow window = Minecraft.getInstance() + .getWindow(); + depthPointX = window.getScaledWidth() / 2; + depthPointY = window.getScaledHeight() / 2; + } + + @Override + public void onClose() { + ScreenOpener.clearStack(); + super.onClose(); + } + + @Override + public void tick() { + super.tick(); + transition.tickChaser(); + } + + @Override + protected void init() { + super.init(); + List screenHistory = ScreenOpener.getScreenHistory(); + if (screenHistory.isEmpty()) + return; + if (!(screenHistory.get(0) instanceof NavigatableSimiScreen)) + return; + + Screen screen = screenHistory.get(0); + IScreenRenderable icon = null; + ItemStack altIcon = null; + + if (screen instanceof PonderUI) + altIcon = ((PonderUI) screen).stack; + if (screen instanceof PonderTagScreen) + icon = ((PonderTagScreen) screen).getTag(); + + widgets.add(backTrack = new PonderButton(31, height - 31 - PonderButton.SIZE, () -> { + ScreenOpener.openPreviousScreen(this, Optional.empty()); + }).fade(0, -1)); + backTrack.fade(1); + + if (icon != null) + backTrack.showing(icon); + if (altIcon != null) + backTrack.showing(altIcon); + } + + @Override + public void render(int mouseX, int mouseY, float partialTicks) { + super.render(mouseX, mouseY, partialTicks); +// renderZeloBreadcrumbs(mouseX, mouseY, partialTicks); + if (backTrack == null) + return; + + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 500); + if (backTrack.isHovered()) + drawString(font, Lang.translate(THINK_BACK), 15, height - 16, 0xffa3a3a3); + RenderSystem.popMatrix(); + } + + @Override + protected void renderWindowBackground(int mouseX, int mouseY, float partialTicks) { + 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.translated(0, 0, -1000); + UIRenderHelper.framebuffer.bindFramebuffer(true); + lastScreen.render(mouseX, mouseY, 10); + RenderSystem.popMatrix();// 2 + + // 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 = ((NavigatableSimiScreen) lastScreen).depthPointX; + dpy = ((NavigatableSimiScreen) 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(-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); + + if (backTrack != null) { + UIRenderHelper.breadcrumbArrow(21, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); + UIRenderHelper.breadcrumbArrow(-19, height - 51, 40, 20, 5, 0x40aa9999, 0x10aa9999); + } + } + + @Override + public boolean keyPressed(int code, int p_keyPressed_2_, int p_keyPressed_3_) { + if (code == GLFW.GLFW_KEY_BACKSPACE) { + ScreenOpener.openPreviousScreen(this, Optional.empty()); + return true; + } + return super.keyPressed(code, p_keyPressed_2_, p_keyPressed_3_); + } + + 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); + } + + public boolean isEquivalentTo(NavigatableSimiScreen other) { + return false; + } + + public void shareContextWith(NavigatableSimiScreen other) {} + + protected void renderZeloBreadcrumbs(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(NavigatableSimiScreen::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); + + 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, 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 NavigatableSimiScreen) + return ((NavigatableSimiScreen) screen).getBreadcrumbTitle(); + return "<"; + } + + protected String getBreadcrumbTitle() { + return this.getClass() + .getSimpleName(); + } +} 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 b6e7eae6c..62e359ab2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderLocalization.java @@ -73,6 +73,13 @@ public class PonderLocalization { addGeneral(object, PonderUI.PONDERING, "Pondering about..."); addGeneral(object, PonderUI.IDENTIFY_MODE, "Identify mode active.\nUnpause with [%1$s]"); addGeneral(object, PonderTagScreen.ASSOCIATED, "Associated Entries"); + + addGeneral(object, PonderUI.CLOSE, "Close"); + addGeneral(object, PonderUI.IDENTIFY, "Identify"); + addGeneral(object, PonderUI.NEXT, "Next Scene"); + addGeneral(object, PonderUI.PREVIOUS, "Previous Scene"); + addGeneral(object, PonderUI.REPLAY, "Replay"); + addGeneral(object, PonderUI.THINK_BACK, "Think Back"); shared.forEach((k, v) -> object.addProperty(Create.ID + "." + langKeyForShared(k), v)); tag.forEach((k, v) -> { 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 d992305cf..4c144bf30 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderTooltipHandler.java @@ -3,7 +3,6 @@ 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; @@ -79,9 +78,8 @@ public class PonderTooltipHandler { if (!subject && InputMappings.isKeyDown(window, keyCode)) { if (value >= 1) { - if (currentScreen instanceof AbstractSimiScreen) - ((AbstractSimiScreen) currentScreen).centerScalingOnMouse(); - + if (currentScreen instanceof NavigatableSimiScreen) + ((NavigatableSimiScreen) 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 229be5f19..545dfbd1b 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -10,7 +10,6 @@ import org.lwjgl.opengl.GL11; 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.GuiGameElement; @@ -28,10 +27,10 @@ import com.simibubi.create.foundation.utility.ColorHelper; import com.simibubi.create.foundation.utility.FontHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Lang; -import com.simibubi.create.foundation.utility.animation.LerpedFloat; -import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pointing; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; +import com.simibubi.create.foundation.utility.animation.LerpedFloat.Chaser; import net.minecraft.client.ClipboardHelper; import net.minecraft.client.GameSettings; @@ -54,7 +53,7 @@ import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.fml.client.gui.GuiUtils; import net.minecraftforge.registries.ForgeRegistries; -public class PonderUI extends AbstractSimiScreen { +public class PonderUI extends NavigatableSimiScreen { public static int ponderTicks; public static float ponderPartialTicksPaused; @@ -62,6 +61,11 @@ 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"; + public static final String IDENTIFY = PonderLocalization.LANG_PREFIX + "identify"; + public static final String PREVIOUS = PonderLocalization.LANG_PREFIX + "previous"; + public static final String CLOSE = PonderLocalization.LANG_PREFIX + "close"; + public static final String NEXT = PonderLocalization.LANG_PREFIX + "next"; + public static final String REPLAY = PonderLocalization.LANG_PREFIX + "replay"; private List scenes; private List tags; @@ -83,7 +87,7 @@ public class PonderUI extends AbstractSimiScreen { private int index = 0; private PonderTag referredToByTag; - private PonderButton left, right, scan, chap, userMode; + private PonderButton left, right, scan, chap, userMode, close, replay; private PonderProgressBar progressBar; private int skipCooling = 0; @@ -133,8 +137,8 @@ public class PonderUI extends AbstractSimiScreen { @Override protected void init() { - super.init(); widgets.clear(); + super.init(); tagButtons = new ArrayList<>(); tagFades = new ArrayList<>(); @@ -187,7 +191,7 @@ public class PonderUI extends AbstractSimiScreen { .fade(0, -1)); if (PonderIndex.EDITOR_MODE) { - widgets.add(userMode = new PonderButton(31, bY, () -> { + widgets.add(userMode = new PonderButton(width - 20 - 31, bY, () -> { userViewMode = !userViewMode; }).showing(AllIcons.I_MTD_USER_MODE) .fade(0, -1)); @@ -199,7 +203,7 @@ public class PonderUI extends AbstractSimiScreen { .fade(0, -1)); bX += 20 + spacing; - widgets.add(new PonderButton(bX, bY, this::onClose).showing(AllIcons.I_MTD_CLOSE) + widgets.add(close = new PonderButton(bX, bY, this::onClose).showing(AllIcons.I_MTD_CLOSE) .shortcut(bindings.keyBindInventory) .fade(0, -1)); @@ -209,7 +213,7 @@ public class PonderUI extends AbstractSimiScreen { .fade(0, -1)); bX += 50 + spacing; - widgets.add(new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) + widgets.add(replay = new PonderButton(bX, bY, this::replay).showing(AllIcons.I_MTD_REPLAY) .shortcut(bindings.keyBindBack) .fade(0, -1)); } @@ -460,6 +464,7 @@ public class PonderUI extends AbstractSimiScreen { for (Widget widget : widgets) noWidgetsHovered &= !widget.isMouseOver(mouseX, mouseY); + int tooltipColor = 0xffa3a3a3; { // Chapter title RenderSystem.pushMatrix(); @@ -480,14 +485,15 @@ public class PonderUI extends AbstractSimiScreen { .scale(2) .render(); - drawString(font, Lang.translate(PONDERING), x, y - 6, 0xffa3a3a3); + drawString(font, Lang.translate(PONDERING), x, y - 6, tooltipColor); y += 8; x += 0; // RenderSystem.translated(0, 3 * (indexDiff), 0); RenderSystem.translated(x, y, 0); RenderSystem.rotatef(indexDiff * -75, 1, 0, 0); RenderSystem.translated(0, 0, 5); - FontHelper.drawSplitString(font, title, 0, 0, left.x - 51, ColorHelper.applyAlpha(textColor, 1 - indexDiff)); + FontHelper.drawSplitString(font, title, 0, 0, left.x - 51, + ColorHelper.applyAlpha(textColor, 1 - indexDiff)); RenderSystem.popMatrix(); if (chapter != null) { @@ -496,12 +502,17 @@ public class PonderUI extends AbstractSimiScreen { 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(IN_CHAPTER), 0, 0, tooltipColor); drawRightAlignedString(font, Lang.translate(PonderLocalization.LANG_PREFIX + "chapter." + chapter.getId()), 0, 12, 0xffeeeeee); RenderSystem.popMatrix(); } + + UIRenderHelper.breadcrumbArrow(width / 2 - 20, height - 51, 20, 20, 5, 0x40aa9999, 0x20aa9999); + UIRenderHelper.breadcrumbArrow(width / 2 + 20, height - 51, -20, 20, -5, 0x40aa9999, 0x20aa9999); + UIRenderHelper.breadcrumbArrow(width / 2 - 90, height - 51, 70, 20, 5, 0x40aa9999, 0x10aa9999); + UIRenderHelper.breadcrumbArrow(width / 2 + 90, height - 51, -70, 20, -5, 0x40aa9999, 0x10aa9999); } if (identifyMode) { @@ -612,6 +623,21 @@ public class PonderUI extends AbstractSimiScreen { RenderSystem.popMatrix(); }); + + RenderSystem.pushMatrix(); + RenderSystem.translated(0, 0, 500); + int tooltipY = height - 16; + if (scan.isHovered()) + drawCenteredString(font, Lang.translate(IDENTIFY), scan.x + 10, tooltipY, tooltipColor); + if (index != 0 && left.isHovered()) + drawCenteredString(font, Lang.translate(PREVIOUS), left.x + 10, tooltipY, tooltipColor); + if (close.isHovered()) + drawCenteredString(font, Lang.translate(CLOSE), close.x + 10, tooltipY, tooltipColor); + if (index != scenes.size() - 1 && right.isHovered()) + drawCenteredString(font, Lang.translate(NEXT), right.x + 10, tooltipY, tooltipColor); + if (replay.isHovered()) + drawCenteredString(font, Lang.translate(REPLAY), replay.x + 10, tooltipY, tooltipColor); + RenderSystem.popMatrix(); } protected void lowerButtonGroup(int index, int mouseX, int mouseY, float fade, AllIcons icon, KeyBinding key) { @@ -838,14 +864,14 @@ public class PonderUI extends AbstractSimiScreen { } @Override - public boolean isEquivalentTo(AbstractSimiScreen other) { + public boolean isEquivalentTo(NavigatableSimiScreen other) { if (other instanceof PonderUI) return stack.isItemEqual(((PonderUI) other).stack); return super.isEquivalentTo(other); } @Override - public void shareContextWith(AbstractSimiScreen other) { + public void shareContextWith(NavigatableSimiScreen other) { if (other instanceof PonderUI) { PonderUI ponderUI = (PonderUI) other; ponderUI.referredToByTag = referredToByTag; 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 15f3e70f8..5ca5d0d16 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 @@ -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.AllBlocks; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; -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.NavigatableSimiScreen; 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; @@ -20,13 +27,8 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; import net.minecraftforge.registries.ForgeRegistries; -import org.apache.commons.lang3.mutable.MutableBoolean; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -public class PonderIndexScreen extends AbstractSimiScreen { +public class PonderIndexScreen extends NavigatableSimiScreen { protected final List chapters; private final double chapterXmult = 0.5; @@ -47,10 +49,8 @@ public class PonderIndexScreen extends AbstractSimiScreen { @Override protected void init() { - super.init(); - - // populate lists widgets.clear(); + super.init(); chapters.clear(); // chapters.addAll(PonderRegistry.chapters.getAllChapters()); @@ -210,7 +210,7 @@ public class PonderIndexScreen extends AbstractSimiScreen { } @Override - public boolean isEquivalentTo(AbstractSimiScreen other) { + public boolean isEquivalentTo(NavigatableSimiScreen other) { return other instanceof PonderIndexScreen; } 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 09abfaadb..2ad235153 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 @@ -7,9 +7,9 @@ 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.ScreenOpener; import com.simibubi.create.foundation.gui.UIRenderHelper; +import com.simibubi.create.foundation.ponder.NavigatableSimiScreen; import com.simibubi.create.foundation.ponder.PonderLocalization; import com.simibubi.create.foundation.ponder.PonderRegistry; import com.simibubi.create.foundation.ponder.PonderUI; @@ -28,11 +28,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.math.MathHelper; import net.minecraftforge.registries.ForgeRegistries; -public class PonderTagScreen extends AbstractSimiScreen { +public class PonderTagScreen extends NavigatableSimiScreen { public static final String ASSOCIATED = PonderLocalization.LANG_PREFIX + "associated"; - protected final PonderTag tag; + private final PonderTag tag; protected final List items; private final double itemXmult = 0.5; protected Rectangle2d itemArea; @@ -52,8 +52,8 @@ public class PonderTagScreen extends AbstractSimiScreen { @Override protected void init() { - super.init(); widgets.clear(); + super.init(); // items items.clear(); @@ -146,6 +146,8 @@ public class PonderTagScreen extends AbstractSimiScreen { double mouseX = minecraft.mouseHelper.getMouseX() * w.getScaledWidth() / w.getWidth(); double mouseY = minecraft.mouseHelper.getMouseY() * w.getScaledHeight() / w.getHeight(); for (Widget widget : widgets) { + if (widget == backTrack) + continue; if (widget instanceof PonderButton) if (widget.isMouseOver(mouseX, mouseY)) { hoveredItem = ((PonderButton) widget).getItem(); @@ -200,6 +202,7 @@ public class PonderTagScreen extends AbstractSimiScreen { RenderSystem.translated(0, 0, 100); FontHelper.drawSplitString(font, desc, x, y, w, 0xeeeeee); RenderSystem.popMatrix(); + } protected void renderItems(int mouseX, int mouseY, float partialTicks) { @@ -293,7 +296,7 @@ public class PonderTagScreen extends AbstractSimiScreen { } @Override - public boolean isEquivalentTo(AbstractSimiScreen other) { + public boolean isEquivalentTo(NavigatableSimiScreen other) { if (other instanceof PonderTagScreen) return tag == ((PonderTagScreen) other).tag; return super.isEquivalentTo(other); @@ -304,4 +307,8 @@ public class PonderTagScreen extends AbstractSimiScreen { return true; } + public PonderTag getTag() { + return tag; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java index 4d98b7d3c..a0f2f3543 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/RedstoneScenes.java @@ -751,7 +751,7 @@ public class RedstoneScenes { scene.idle(10); scene.overlay.showText(70) .colored(PonderPalette.GREEN) - .text("Receivers will emit the redstone power of transmitters within a range of 128 blocks") + .text("Receivers emit the redstone power of transmitters within 128 blocks") .placeNearTarget() .pointAt(link2Vec); scene.idle(80); @@ -820,7 +820,7 @@ public class RedstoneScenes { scene.effects.indicateRedstone(link2Pos); scene.overlay.showText(90) .attachKeyFrame() - .text("Only the links with matching Frequency combinations will communicate") + .text("Only the links with matching Frequencies will communicate") .placeNearTarget() .pointAt(link2Vec); scene.idle(100); 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 b41861a36..2423c420e 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 @@ -103,7 +103,7 @@ public class TextWindowElement extends AnimatedOverlayElement { boxWidth = Math.max(boxWidth, screen.getFontRenderer() .getStringWidth(string)); int boxHeight = screen.getFontRenderer() - .getWordWrappedHeight(bakedText, textWidth); + .getWordWrappedHeight(bakedText, boxWidth); RenderSystem.pushMatrix(); RenderSystem.translatef(0, sceneToScreen.y, 400); From ddb5aa9a3d26114e26d8fec7adfc86c3899b71e9 Mon Sep 17 00:00:00 2001 From: Snownee Date: Tue, 16 Mar 2021 15:38:20 +0800 Subject: [PATCH 115/124] Human friendly schematic selection --- .../schematics/ClientSchematicLoader.java | 51 +++++++++++++++++++ .../gui/widgets/SelectionScrollInput.java | 12 +++++ 2 files changed, 63 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java index 3eea730d0..cbb4dc930 100644 --- a/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java +++ b/src/main/java/com/simibubi/create/content/schematics/ClientSchematicLoader.java @@ -9,6 +9,7 @@ import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -142,6 +143,56 @@ public class ClientSchematicLoader { e.printStackTrace(); } + Collections.sort(availableSchematics, (a, b) -> { + if (a.endsWith(".nbt")) + a = a.substring(0, a.length() - 4); + if (b.endsWith(".nbt")) + b = b.substring(0, b.length() - 4); + int aLength = a.length(); + int bLength = b.length(); + int minSize = Math.min(aLength, bLength); + char aChar, bChar; + boolean aNumber, bNumber; + boolean asNumeric = false; + int lastNumericCompare = 0; + for (int i = 0; i < minSize; i++) { + aChar = a.charAt(i); + bChar = b.charAt(i); + aNumber = aChar >= '0' && aChar <= '9'; + bNumber = bChar >= '0' && bChar <= '9'; + if (asNumeric) + if (aNumber && bNumber) { + if (lastNumericCompare == 0) + lastNumericCompare = aChar - bChar; + } else if (aNumber) + return 1; + else if (bNumber) + return -1; + else if (lastNumericCompare == 0) { + if (aChar != bChar) + return aChar - bChar; + asNumeric = false; + } else + return lastNumericCompare; + else if (aNumber && bNumber) { + asNumeric = true; + if (lastNumericCompare == 0) + lastNumericCompare = aChar - bChar; + } else if (aChar != bChar) + return aChar - bChar; + } + if (asNumeric) + if (aLength > bLength && a.charAt(bLength) >= '0' && a.charAt(bLength) <= '9') // as number + return 1; // a has bigger size, thus b is smaller + else if (bLength > aLength && b.charAt(aLength) >= '0' && b.charAt(aLength) <= '9') // as number + return -1; // b has bigger size, thus a is smaller + else if (lastNumericCompare == 0) + return aLength - bLength; + else + return lastNumericCompare; + else + return aLength - bLength; + }); } public List getAvailableSchematics() { diff --git a/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java b/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java index b3e528baa..b190190ee 100644 --- a/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java +++ b/src/main/java/com/simibubi/create/foundation/gui/widgets/SelectionScrollInput.java @@ -38,6 +38,16 @@ public class SelectionScrollInput extends ScrollInput { protected void updateTooltip() { toolTip.clear(); toolTip.add(TextFormatting.BLUE + title); + int min = Math.min(this.max - 16, state - 7); + int max = Math.max(this.min + 16, state + 8); + min = Math.max(min, this.min); + max = Math.min(max, this.max); + if (this.min + 1 == min) + min--; + if (min > this.min) + toolTip.add(TextFormatting.GRAY + "> ..."); + if (this.max - 1 == max) + max++; for (int i = min; i < max; i++) { StringBuilder result = new StringBuilder(); if (i == state) @@ -46,6 +56,8 @@ public class SelectionScrollInput extends ScrollInput { result.append(TextFormatting.GRAY).append("> ").append(options.get(i)); toolTip.add(result.toString()); } + if (max < this.max) + toolTip.add(TextFormatting.GRAY + "> ..."); toolTip.add(TextFormatting.DARK_GRAY + "" + TextFormatting.ITALIC + scrollToSelect); } From e3394a89072138691c1fe36fdd0675114eaa7060 Mon Sep 17 00:00:00 2001 From: Snownee Date: Tue, 16 Mar 2021 21:56:04 +0800 Subject: [PATCH 116/124] Allow attribute filter screen to have space to show JEI bookmarks --- .../simibubi/create/compat/jei/CreateJEI.java | 4 ++++ .../item/filter/AbstractFilterContainer.java | 2 +- .../item/filter/AbstractFilterScreen.java | 22 ++++++++++++++----- .../item/filter/AttributeFilterContainer.java | 4 ++-- .../item/filter/AttributeFilterScreen.java | 4 ++-- .../item/filter/FilterContainer.java | 2 +- 6 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java index 33606b4da..b66b93999 100644 --- a/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java +++ b/src/main/java/com/simibubi/create/compat/jei/CreateJEI.java @@ -40,6 +40,8 @@ import com.simibubi.create.content.contraptions.fluids.recipe.PotionMixingRecipe import com.simibubi.create.content.contraptions.processing.BasinRecipe; import com.simibubi.create.content.logistics.block.inventories.AdjustableCrateScreen; import com.simibubi.create.content.logistics.item.filter.AbstractFilterScreen; +import com.simibubi.create.content.logistics.item.filter.AttributeFilterScreen; +import com.simibubi.create.content.logistics.item.filter.FilterScreen; import com.simibubi.create.content.schematics.block.SchematicTableScreen; import com.simibubi.create.content.schematics.block.SchematicannonScreen; import com.simibubi.create.foundation.config.AllConfigs; @@ -231,6 +233,8 @@ public class CreateJEI implements IModPlugin { registration.addGuiContainerHandler(AdjustableCrateScreen.class, slotMover); registration.addGuiContainerHandler(SchematicannonScreen.class, slotMover); registration.addGuiContainerHandler(SchematicTableScreen.class, slotMover); + registration.addGuiContainerHandler(FilterScreen.class, slotMover); + registration.addGuiContainerHandler(AttributeFilterScreen.class, slotMover); registration.addGhostIngredientHandler(AbstractFilterScreen.class, new FilterGhostIngredientHandler()); } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java index 611401b98..1bd54d34d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterContainer.java @@ -54,7 +54,7 @@ public abstract class AbstractFilterContainer extends Container { protected abstract void saveData(ItemStack filterItem); protected void addPlayerSlots() { - int x = 58; + int x = 8; int y = 28 + getInventoryOffset(); for (int hotbarSlot = 0; hotbarSlot < 9; ++hotbarSlot) diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java index ae138ce3d..21ba7976d 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AbstractFilterScreen.java @@ -6,6 +6,7 @@ import static net.minecraft.util.text.TextFormatting.GRAY; import java.util.Collections; import java.util.List; +import com.google.common.collect.ImmutableList; import com.simibubi.create.content.logistics.item.filter.FilterScreenPacket.Option; import com.simibubi.create.foundation.gui.AbstractSimiContainerScreen; import com.simibubi.create.foundation.gui.AllGuiTextures; @@ -19,6 +20,7 @@ import com.simibubi.create.foundation.item.TooltipHelper; import com.simibubi.create.foundation.networking.AllPackets; import net.minecraft.client.gui.widget.Widget; +import net.minecraft.client.renderer.Rectangle2d; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.util.text.ITextComponent; @@ -26,6 +28,7 @@ import net.minecraft.util.text.ITextComponent; public abstract class AbstractFilterScreen extends AbstractSimiContainerScreen { protected AllGuiTextures background; + private List extraAreas = Collections.EMPTY_LIST; private IconButton resetButton; private IconButton confirmButton; @@ -37,12 +40,15 @@ public abstract class AbstractFilterScreen ex @Override protected void init() { - setWindowSize(background.width + 80, background.height + PLAYER_INVENTORY.height + 20); + setWindowSize(PLAYER_INVENTORY.width, background.height + PLAYER_INVENTORY.height + 20); super.init(); widgets.clear(); + int x = guiLeft - 50; + int offset = guiTop < 30 ? 30 - guiTop : 0; + extraAreas = ImmutableList.of(new Rectangle2d(x, guiTop + offset, background.width + 70, background.height - offset)); - resetButton = new IconButton(guiLeft + background.width - 62, guiTop + background.height - 24, AllIcons.I_TRASH); - confirmButton = new IconButton(guiLeft + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); + resetButton = new IconButton(x + background.width - 62, guiTop + background.height - 24, AllIcons.I_TRASH); + confirmButton = new IconButton(x + background.width - 33, guiTop + background.height - 24, AllIcons.I_CONFIRM); widgets.add(resetButton); widgets.add(confirmButton); @@ -50,11 +56,11 @@ public abstract class AbstractFilterScreen ex @Override protected void renderWindow(int mouseX, int mouseY, float partialTicks) { - int x = guiLeft; + int x = guiLeft - 50; int y = guiTop; background.draw(this, x, y); - int invX = x + 50; + int invX = guiLeft; int invY = y + background.height + 10; PLAYER_INVENTORY.draw(this, invX, invY); @@ -62,7 +68,7 @@ public abstract class AbstractFilterScreen ex font.drawStringWithShadow(I18n.format(container.filterItem.getTranslationKey()), x + 15, y + 3, 0xdedede); GuiGameElement.of(container.filterItem) - .at(guiLeft + background.width, guiTop +background.height -60) + .at(x + background.width, guiTop +background.height -60) .scale(5) .render(); @@ -150,4 +156,8 @@ public abstract class AbstractFilterScreen ex AllPackets.channel.sendToServer(new FilterScreenPacket(option)); } + @Override + public List getExtraAreas() { + return extraAreas; + } } diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java index 54e945ca9..3f768d574 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterContainer.java @@ -62,8 +62,8 @@ public class AttributeFilterContainer extends AbstractFilterContainer { } protected void addFilterSlots() { - this.addSlot(new SlotItemHandler(filterInventory, 0, 16, 22)); - this.addSlot(new SlotItemHandler(filterInventory, 1, 22, 57) { + this.addSlot(new SlotItemHandler(filterInventory, 0, -34, 22)); + this.addSlot(new SlotItemHandler(filterInventory, 1, -28, 57) { @Override public boolean canTakeStack(PlayerEntity playerIn) { return false; diff --git a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java index d23c2fa57..ddf6fe7c3 100644 --- a/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java +++ b/src/main/java/com/simibubi/create/content/logistics/item/filter/AttributeFilterScreen.java @@ -60,7 +60,7 @@ public class AttributeFilterScreen extends AbstractFilterScreen Date: Tue, 16 Mar 2021 17:21:32 +0100 Subject: [PATCH 117/124] funnel extraction - allow funnels to extract items when part of a contraption - also include a little animation for the new backtrack button --- .../block/funnel/FunnelMovementBehaviour.java | 68 +++++++++++++++++-- .../ponder/NavigatableSimiScreen.java | 38 +++++++---- 2 files changed, 88 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java index f6a4ceaf8..52ab6fb44 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelMovementBehaviour.java @@ -1,19 +1,23 @@ package com.simibubi.create.content.logistics.block.funnel; -import java.util.List; - import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.logistics.item.filter.FilterItem; - +import com.simibubi.create.foundation.config.AllConfigs; +import com.simibubi.create.foundation.item.ItemHelper; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.util.Direction; +import net.minecraft.util.SoundCategory; +import net.minecraft.util.SoundEvents; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.items.ItemHandlerHelper; +import java.util.List; + public class FunnelMovementBehaviour extends MovementBehaviour { private final boolean hasFilter; @@ -32,14 +36,67 @@ public class FunnelMovementBehaviour extends MovementBehaviour { @Override public Vec3d getActiveAreaOffset(MovementContext context) { - return new Vec3d(FunnelBlock.getFunnelFacing(context.state) - .getDirectionVec()).scale(.65); + Direction facing = FunnelBlock.getFunnelFacing(context.state); + Vec3d vec = new Vec3d(facing.getDirectionVec()); + if (facing != Direction.UP) + return vec.scale(context.state.get(FunnelBlock.EXTRACTING) ? .15 : .65); + + return vec.scale(.65); } @Override public void visitNewPosition(MovementContext context, BlockPos pos) { super.visitNewPosition(context, pos); + if (context.state.get(FunnelBlock.EXTRACTING)) + extract(context, pos); + else + succ(context, pos); + + + } + + private void extract(MovementContext context, BlockPos pos) { + World world = context.world; + + Vec3d entityPos = context.position; + if (context.state.get(FunnelBlock.FACING) != Direction.DOWN) + entityPos = entityPos.add(0, -.5f, 0); + + if (!world.getBlockState(pos).getCollisionShape(world, pos).isEmpty()) + return;//only drop items if the target block is a empty space + + if (!world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(new BlockPos(entityPos))).isEmpty()) + return;//don't drop items if there already are any in the target block space + + ItemStack filter = getFilter(context); + int filterAmount = context.tileData.getInt("FilterAmount"); + if (filterAmount <= 0) + filterAmount = hasFilter ? AllConfigs.SERVER.logistics.defaultExtractionLimit.get() : 1; + + ItemStack extract = ItemHelper.extract( + context.contraption.inventory, + s -> FilterItem.test(world, s, filter), + ItemHelper.ExtractionCountMode.UPTO, + filterAmount, + false); + + if (extract.isEmpty()) + return; + + if (world.isRemote) + return; + + + + ItemEntity entity = new ItemEntity(world, entityPos.x, entityPos.y, entityPos.z, extract); + entity.setMotion(Vec3d.ZERO); + entity.setPickupDelay(5); + world.playSound(null, pos, SoundEvents.ENTITY_ITEM_PICKUP, SoundCategory.BLOCKS, 1/16f, .1f); + world.addEntity(entity); + } + + private void succ(MovementContext context, BlockPos pos) { World world = context.world; List items = world.getEntitiesWithinAABB(ItemEntity.class, new AxisAlignedBB(pos)); ItemStack filter = getFilter(context); @@ -61,7 +118,6 @@ public class FunnelMovementBehaviour extends MovementBehaviour { item.setItem(remainder); } - } private ItemStack getFilter(MovementContext context) { diff --git a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java index 4226aded7..d99d115b1 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/NavigatableSimiScreen.java @@ -1,13 +1,5 @@ package com.simibubi.create.foundation.ponder; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.mutable.MutableBoolean; -import org.apache.commons.lang3.mutable.MutableInt; -import org.lwjgl.glfw.GLFW; - import com.mojang.blaze3d.systems.RenderSystem; import com.simibubi.create.foundation.gui.AbstractSimiScreen; import com.simibubi.create.foundation.gui.IScreenRenderable; @@ -17,11 +9,18 @@ import com.simibubi.create.foundation.ponder.content.PonderTagScreen; import com.simibubi.create.foundation.ponder.ui.PonderButton; import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.animation.LerpedFloat; - import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screen.Screen; import net.minecraft.item.ItemStack; +import net.minecraft.util.math.MathHelper; +import org.apache.commons.lang3.mutable.MutableBoolean; +import org.apache.commons.lang3.mutable.MutableInt; +import org.lwjgl.glfw.GLFW; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; public abstract class NavigatableSimiScreen extends AbstractSimiScreen { @@ -31,6 +30,9 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public final LerpedFloat transition = LerpedFloat.linear() .startWithValue(0) .chase(0, .1f, LerpedFloat.Chaser.LINEAR); + protected final LerpedFloat arrowAnimation = LerpedFloat.linear() + .startWithValue(0) + .chase(0, 0.075f, LerpedFloat.Chaser.LINEAR); protected PonderButton backTrack; public NavigatableSimiScreen() { @@ -50,6 +52,7 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { public void tick() { super.tick(); transition.tickChaser(); + arrowAnimation.tickChaser(); } @Override @@ -90,8 +93,13 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { RenderSystem.pushMatrix(); RenderSystem.translated(0, 0, 500); - if (backTrack.isHovered()) + if (backTrack.isHovered()) { drawString(font, Lang.translate(THINK_BACK), 15, height - 16, 0xffa3a3a3); + if (MathHelper.epsilonEquals(arrowAnimation.getValue(), arrowAnimation.getChaseTarget())) { + arrowAnimation.setValue(1); + arrowAnimation.setValue(1);//called twice to also set the previous value to 1 + } + } RenderSystem.popMatrix(); } @@ -149,8 +157,14 @@ public abstract class NavigatableSimiScreen extends AbstractSimiScreen { RenderSystem.translated(-depthPointX, -depthPointY, 0); if (backTrack != null) { - UIRenderHelper.breadcrumbArrow(21, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); - UIRenderHelper.breadcrumbArrow(-19, height - 51, 40, 20, 5, 0x40aa9999, 0x10aa9999); + int x = (int) MathHelper.lerp(arrowAnimation.getValue(partialTicks), -9, 21); + int maxX = backTrack.x + backTrack.getWidth(); + + if (x + 30 < backTrack.x) + UIRenderHelper.breadcrumbArrow(x + 30, height - 51, maxX - (x + 30), 20, 5, 0x40aa9999, 0x10aa9999); + + UIRenderHelper.breadcrumbArrow(x, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); + UIRenderHelper.breadcrumbArrow(x - 30, height - 51, 30, 20, 5, 0x40aa9999, 0x10aa9999); } } From a897b5e78bff19fd21aa923251765cdbcf19f4fb Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Tue, 16 Mar 2021 21:04:42 +0100 Subject: [PATCH 118/124] Scene machine - Fix funnels not rendering filter slot items - Ponder scenes for the Deployer, Harvester and Plough - Fixed uvs on Deployer model - Ploughs can now harvest snow layers --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 45 +- .../assets/create/lang/unfinished/de_de.json | 47 +- .../assets/create/lang/unfinished/es_es.json | 47 +- .../assets/create/lang/unfinished/es_mx.json | 47 +- .../assets/create/lang/unfinished/fr_fr.json | 47 +- .../assets/create/lang/unfinished/it_it.json | 47 +- .../assets/create/lang/unfinished/ja_jp.json | 47 +- .../assets/create/lang/unfinished/ko_kr.json | 47 +- .../assets/create/lang/unfinished/nl_nl.json | 47 +- .../assets/create/lang/unfinished/pt_br.json | 47 +- .../assets/create/lang/unfinished/ru_ru.json | 47 +- .../assets/create/lang/unfinished/zh_cn.json | 47 +- .../assets/create/lang/unfinished/zh_tw.json | 47 +- .../data/create/advancements/aesthetics.json | 4 +- .../actors/PloughMovementBehaviour.java | 18 + .../components/deployer/DeployerRenderer.java | 11 +- .../deployer/DeployerTileEntity.java | 35 +- .../block/funnel/FunnelTileEntity.java | 11 +- .../foundation/ponder/PonderRegistry.java | 6 +- .../create/foundation/ponder/PonderWorld.java | 6 +- .../foundation/ponder/SceneBuilder.java | 6 +- .../ponder/content/DeployerScenes.java | 460 ++++++++++++++++++ .../ponder/content/MechanicalSawScenes.java | 2 + .../ponder/content/MovementActorScenes.java | 317 ++++++++++++ .../ponder/content/PonderIndex.java | 11 +- .../ponder/elements/TextWindowElement.java | 17 +- .../AnimateTileEntityInstruction.java | 15 +- .../models/block/deployer/hand_holding.json | 11 +- .../models/block/deployer/hand_pointing.json | 9 +- .../models/block/deployer/hand_punching.json | 28 +- .../resources/ponder/deployer/contraption.nbt | Bin 0 -> 870 bytes src/main/resources/ponder/deployer/filter.nbt | Bin 0 -> 785 bytes src/main/resources/ponder/deployer/modes.nbt | Bin 0 -> 508 bytes .../resources/ponder/deployer/redstone.nbt | Bin 0 -> 726 bytes src/main/resources/ponder/harvester.nbt | Bin 0 -> 624 bytes src/main/resources/ponder/plough.nbt | Bin 0 -> 974 bytes 37 files changed, 1493 insertions(+), 111 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java create mode 100644 src/main/resources/ponder/deployer/contraption.nbt create mode 100644 src/main/resources/ponder/deployer/filter.nbt create mode 100644 src/main/resources/ponder/deployer/modes.nbt create mode 100644 src/main/resources/ponder/deployer/redstone.nbt create mode 100644 src/main/resources/ponder/harvester.nbt create mode 100644 src/main/resources/ponder/plough.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 1ec53cafb..24769c6d2 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -f7bdf2fb1af4cae8bca1735861d603cce0870985 assets/create/lang/en_us.json -f83d2acecd5ce6ebe8dfddffde3c5c3a68abd492 assets/create/lang/unfinished/de_de.json -35e50f9ba61af0ef900154213b0b25d1dc5469d3 assets/create/lang/unfinished/es_es.json -98c26496201d8f12be5f6fc0ddaf919d9098f825 assets/create/lang/unfinished/es_mx.json -161ac9821b2445c96c6d594885c2d32cd784e8c5 assets/create/lang/unfinished/fr_fr.json -0c1baeb251ff32329a8d34a7200101de2cb724c4 assets/create/lang/unfinished/it_it.json -b0ccadbcc765e7ddee1089b3ca65414f5aa1ad95 assets/create/lang/unfinished/ja_jp.json -9551b6b6df919ff7e2b7e14361e8061b65cd4857 assets/create/lang/unfinished/ko_kr.json -552b3ef71a2898d7e263035ade5b47fb0bcfec23 assets/create/lang/unfinished/nl_nl.json -1661f76a0ba088209fcd837a8a1676dbed186368 assets/create/lang/unfinished/pt_br.json -621af99986c9e334d224f9a356c25d7468a1ef47 assets/create/lang/unfinished/ru_ru.json -6340ad62aedc1fec27abb6b490c36b1fd1317214 assets/create/lang/unfinished/zh_cn.json -56a1fedad3d453a36c456085c836fcfbf9740b1d assets/create/lang/unfinished/zh_tw.json +14e0e7784c59a76deddf3bfc32e334ce043396fe assets/create/lang/en_us.json +9d0c4eb5b8fcf787b1bbdd35dcb2efd37b7b9f9c assets/create/lang/unfinished/de_de.json +7e78635390f2802b325aec510ebef35345e2c9a4 assets/create/lang/unfinished/es_es.json +f87b6f876dbb50c37ebbd67d9f636f70c5e4e7f2 assets/create/lang/unfinished/es_mx.json +866086d9a9fe1f4c39208bf592b75145dd67bb47 assets/create/lang/unfinished/fr_fr.json +2f32a7fbbfaa1d78c6f9975c4aa121def52280b7 assets/create/lang/unfinished/it_it.json +2041ea4e1e516f7953be44b06092b144df0359b3 assets/create/lang/unfinished/ja_jp.json +e5057798e54fe5485a36f71b7298c6b2c73cd1b4 assets/create/lang/unfinished/ko_kr.json +e4bdb059ad70595c66c84ebfc3cac6a3929e97c4 assets/create/lang/unfinished/nl_nl.json +849db8c87d521cdf0ce8dc21652f8d95eea47194 assets/create/lang/unfinished/pt_br.json +cdafda2402e1c3259eba15fdd55a446117fece83 assets/create/lang/unfinished/ru_ru.json +8063b79a864f2a1a56c30aabe6df4bd616c938c2 assets/create/lang/unfinished/zh_cn.json +bd9961903c4e125cd3029dad62a4a7fd690149aa assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json +0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index f9fdd6089..6cfdb91aa 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1947,6 +1947,37 @@ "create.ponder.creative_motor.text_1": "Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "Using the Deployer", + "create.ponder.deployer.text_1": "Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "Items can also be inserted automatically", + "create.ponder.deployer.text_12": "Deployers carry a filter slot", + "create.ponder.deployer.text_13": "When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "Deployers can:", + "create.ponder.deployer.text_5": "Place Blocks,", + "create.ponder.deployer.text_6": "Use Items,", + "create.ponder.deployer.text_7": "Activate Blocks,", + "create.ponder.deployer.text_8": "Harvest blocks", + "create.ponder.deployer.text_9": "and Attack Mobs", + + "create.ponder.deployer_contraption.header": "Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "Strength and Direction of Flow depends on the Rotational Input", @@ -2059,6 +2090,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "Speed and direction of movement depend on the Rotational Input", @@ -2068,6 +2103,12 @@ "create.ponder.mechanical_piston_modes.text_1": "Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2134,9 +2175,9 @@ "create.ponder.redstone_link.text_1": "Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index d3f057fa5..892ea386e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1302", + "_": "Missing Localizations: 1337", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index 0b0652617..bf6a5fb5d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 333", + "_": "Missing Localizations: 368", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index e232209e0..53e129369 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1232", + "_": "Missing Localizations: 1267", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 061ec4e47..2218aae58 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1014", + "_": "Missing Localizations: 1049", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 871dae9bd..369acaf8d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 350", + "_": "Missing Localizations: 385", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index e08d19db8..5db9138b5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 357", + "_": "Missing Localizations: 392", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 0de6cbdc1..9471b7f33 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 403", + "_": "Missing Localizations: 438", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 6f11b4c0e..a4da4b57e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1501", + "_": "Missing Localizations: 1536", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 4316c6e3e..40031e472 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1567", + "_": "Missing Localizations: 1602", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index d891d5922..e30cc25d8 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 353", + "_": "Missing Localizations: 388", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index d806010de..fcfec2f15 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 351", + "_": "Missing Localizations: 386", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 691488640..1b8b2c0d9 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 356", + "_": "Missing Localizations: 391", "_": "->------------------------] Game Elements [------------------------<-", @@ -1948,6 +1948,37 @@ "create.ponder.creative_motor.text_1": "UNLOCALIZED: Creative motors are a compact and configurable source of Rotational Force", "create.ponder.creative_motor.text_2": "UNLOCALIZED: Scrolling on the back panel changes the RPM of the motors' rotational output", + "create.ponder.deployer.header": "UNLOCALIZED: Using the Deployer", + "create.ponder.deployer.text_1": "UNLOCALIZED: Given Rotational Force, a Deployer can imitate player interactions", + "create.ponder.deployer.text_10": "UNLOCALIZED: Right-click the front to give it an Item to use", + "create.ponder.deployer.text_11": "UNLOCALIZED: Items can also be inserted automatically", + "create.ponder.deployer.text_12": "UNLOCALIZED: Deployers carry a filter slot", + "create.ponder.deployer.text_13": "UNLOCALIZED: When a filter is set, it activates only while holding a matching item", + "create.ponder.deployer.text_14": "UNLOCALIZED: Only items matching the filter can now be inserted...", + "create.ponder.deployer.text_15": "UNLOCALIZED: ...and only non-matching items will be extracted", + "create.ponder.deployer.text_2": "UNLOCALIZED: It will always interact with the position 2 blocks in front of itself", + "create.ponder.deployer.text_3": "UNLOCALIZED: Blocks directly in front will not obstruct it", + "create.ponder.deployer.text_4": "UNLOCALIZED: Deployers can:", + "create.ponder.deployer.text_5": "UNLOCALIZED: Place Blocks,", + "create.ponder.deployer.text_6": "UNLOCALIZED: Use Items,", + "create.ponder.deployer.text_7": "UNLOCALIZED: Activate Blocks,", + "create.ponder.deployer.text_8": "UNLOCALIZED: Harvest blocks", + "create.ponder.deployer.text_9": "UNLOCALIZED: and Attack Mobs", + + "create.ponder.deployer_contraption.header": "UNLOCALIZED: Using Deployers on Contraptions", + "create.ponder.deployer_contraption.text_1": "UNLOCALIZED: Whenever Deployers are moved as part of an animated Contraption...", + "create.ponder.deployer_contraption.text_2": "UNLOCALIZED: They activate at each visited location, using items from inventories anywhere on the contraption", + "create.ponder.deployer_contraption.text_3": "UNLOCALIZED: The Filter slot can be used to specify which items to pull", + + "create.ponder.deployer_modes.header": "UNLOCALIZED: Modes of the Deployer", + "create.ponder.deployer_modes.text_1": "UNLOCALIZED: By default, a Deployer imitates a Right-click interaction", + "create.ponder.deployer_modes.text_2": "UNLOCALIZED: Using a Wrench, it can be set to imitate a Left-click instead", + + "create.ponder.deployer_redstone.header": "UNLOCALIZED: Controlling Deployers with Redstone", + "create.ponder.deployer_redstone.text_1": "UNLOCALIZED: When powered by Redstone, Deployers will not activate", + "create.ponder.deployer_redstone.text_2": "UNLOCALIZED: Before stopping, the Deployer will finish any started cycles", + "create.ponder.deployer_redstone.text_3": "UNLOCALIZED: Thus, a negative pulse can be used to trigger exactly one activation cycle", + "create.ponder.fan_direction.header": "UNLOCALIZED: Air flow of Encased Fans", "create.ponder.fan_direction.text_1": "UNLOCALIZED: Encased Fans use Rotational Force to create an Air Current", "create.ponder.fan_direction.text_2": "UNLOCALIZED: Strength and Direction of Flow depends on the Rotational Input", @@ -2060,6 +2091,10 @@ "create.ponder.mechanical_drill_contraption.text_1": "UNLOCALIZED: Whenever Drills are moved as part of an animated Contraption...", "create.ponder.mechanical_drill_contraption.text_2": "UNLOCALIZED: ...they will break blocks the contraption runs them into", + "create.ponder.mechanical_harvester.header": "UNLOCALIZED: Using Mechanical Harvesters on Contraptions", + "create.ponder.mechanical_harvester.text_1": "UNLOCALIZED: Whenever Harvesters are moved as part of an animated Contraption...", + "create.ponder.mechanical_harvester.text_2": "UNLOCALIZED: They will harvest and reset any mature crops on their way", + "create.ponder.mechanical_piston.header": "UNLOCALIZED: Moving Structures using Mechanical Pistons", "create.ponder.mechanical_piston.text_1": "UNLOCALIZED: Mechanical Pistons can move blocks in front of them", "create.ponder.mechanical_piston.text_2": "UNLOCALIZED: Speed and direction of movement depend on the Rotational Input", @@ -2069,6 +2104,12 @@ "create.ponder.mechanical_piston_modes.text_1": "UNLOCALIZED: Whenever Pistons stop moving, the moved structure reverts to blocks", "create.ponder.mechanical_piston_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.mechanical_plough.header": "UNLOCALIZED: Using Mechanical Ploughs on Contraptions", + "create.ponder.mechanical_plough.text_1": "UNLOCALIZED: Whenever Ploughs are moved as part of an animated Contraption...", + "create.ponder.mechanical_plough.text_2": "UNLOCALIZED: ...they will break blocks without a solid collision hitbox", + "create.ponder.mechanical_plough.text_3": "UNLOCALIZED: Additionally, ploughs can create farmland", + "create.ponder.mechanical_plough.text_4": "UNLOCALIZED: ...they can also launch entities without hurting them", + "create.ponder.mechanical_saw_breaker.header": "UNLOCALIZED: Cutting Trees with the Mechanical Saw", "create.ponder.mechanical_saw_breaker.text_1": "UNLOCALIZED: When given Rotational Force, a Mechanical Saw will cut trees directly in front of it", "create.ponder.mechanical_saw_breaker.text_2": "UNLOCALIZED: In order to cut the tree fully, the Saw has to break the last block connecting it to the ground", @@ -2135,9 +2176,9 @@ "create.ponder.redstone_link.text_1": "UNLOCALIZED: Redstone Links can transmit redstone signals wirelessly", "create.ponder.redstone_link.text_2": "UNLOCALIZED: Right-click while Sneaking to toggle receive mode", "create.ponder.redstone_link.text_3": "UNLOCALIZED: A simple Right-click with a Wrench can do the same", - "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers will emit the redstone power of transmitters within a range of 128 blocks", + "create.ponder.redstone_link.text_4": "UNLOCALIZED: Receivers emit the redstone power of transmitters within 128 blocks", "create.ponder.redstone_link.text_5": "UNLOCALIZED: Placing items in the two slots can specify a Frequency", - "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequency combinations will communicate", + "create.ponder.redstone_link.text_6": "UNLOCALIZED: Only the links with matching Frequencies will communicate", "create.ponder.rope_pulley.header": "UNLOCALIZED: Moving Structures using Rope Pulleys", "create.ponder.rope_pulley.text_1": "UNLOCALIZED: Rope Pulleys can move blocks vertically when given Rotational Force", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index 59a86f429..d723cbe38 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:large_cogwheel", - "create:cogwheel" + "create:cogwheel", + "create:large_cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java index 6f5216b79..527dc6f4b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/PloughMovementBehaviour.java @@ -7,6 +7,7 @@ import com.simibubi.create.content.contraptions.components.structureMovement.Mov import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; import net.minecraft.block.FarmlandBlock; import net.minecraft.block.FlowingFluidBlock; import net.minecraft.item.ItemStack; @@ -22,6 +23,9 @@ import net.minecraft.util.math.RayTraceResult.Type; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraft.world.server.ServerWorld; +import net.minecraft.world.storage.loot.LootContext; +import net.minecraft.world.storage.loot.LootParameter; +import net.minecraft.world.storage.loot.LootParameters; public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour { @@ -75,6 +79,20 @@ public class PloughMovementBehaviour extends BlockBreakingMovementBehaviour { .getBlock() instanceof FarmlandBlock); } + @Override + protected void onBlockBroken(MovementContext context, BlockPos pos, BlockState brokenState) { + super.onBlockBroken(context, pos, brokenState); + + if (brokenState.getBlock() == Blocks.SNOW && context.world instanceof ServerWorld) { + ServerWorld world = (ServerWorld) context.world; + brokenState.getDrops(new LootContext.Builder(world).withParameter(LootParameters.BLOCK_STATE, brokenState) + .withParameter(LootParameters.POSITION, pos) + .withParameter(LootParameters.THIS_ENTITY, getPlayer(context)) + .withParameter(LootParameters.TOOL, new ItemStack(Items.IRON_SHOVEL))) + .forEach(s -> dropItem(context, s)); + } + } + @Override public void stopMoving(MovementContext context) { super.stopMoving(context); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 267763ce0..17aca279a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -9,7 +9,6 @@ import com.simibubi.create.AllBlockPartials; import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.base.KineticTileEntityRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.Mode; -import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity.State; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionRenderDispatcher; import com.simibubi.create.foundation.render.SuperByteBuffer; @@ -123,15 +122,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer } protected Vec3d getHandOffset(DeployerTileEntity te, float partialTicks, BlockState blockState) { - float progress = 0; - if (te.state == State.EXPANDING) - progress = 1 - (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - if (te.state == State.RETRACTING) - progress = (te.timer - partialTicks * te.getTimerSpeed()) / 1000f; - - float handLength = te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 - : te.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; - float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (te.reach + handLength), 21 / 16f); + float distance = te.getHandOffset(partialTicks); Vec3d offset = new Vec3d(blockState.get(FACING) .getDirectionVec()).scale(distance); return offset; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java index 4af470f72..531411595 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerTileEntity.java @@ -15,6 +15,7 @@ import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; import com.simibubi.create.foundation.tileEntity.behaviour.filtering.FilteringBehaviour; import com.simibubi.create.foundation.utility.NBTHelper; import com.simibubi.create.foundation.utility.VecHelper; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.item.ItemStack; @@ -53,6 +54,8 @@ public class DeployerTileEntity extends KineticTileEntity { private LazyOptional invHandler; private ListNBT deferredInventoryList; + private LerpedFloat animatedOffset; + enum State { WAITING, EXPANDING, RETRACTING, DUMPING; } @@ -67,6 +70,8 @@ public class DeployerTileEntity extends KineticTileEntity { mode = Mode.USE; heldItem = ItemStack.EMPTY; redstoneLocked = false; + animatedOffset = LerpedFloat.linear() + .startWithValue(0); } @Override @@ -106,7 +111,7 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public void tick() { super.tick(); - + if (getSpeed() == 0) return; if (!world.isRemote && player != null && player.blockBreakingProgress != null) { @@ -365,11 +370,11 @@ public class DeployerTileEntity extends KineticTileEntity { @Override public LazyOptional getCapability(Capability cap, Direction side) { - if (isItemHandlerCap(cap) && invHandler != null) + if (isItemHandlerCap(cap) && invHandler != null) return invHandler.cast(); return super.getCapability(cap, side); } - + @Override public boolean addToTooltip(List tooltip, boolean isPlayerSneaking) { if (super.addToTooltip(tooltip, isPlayerSneaking)) @@ -386,4 +391,28 @@ public class DeployerTileEntity extends KineticTileEntity { public boolean shouldRenderAsTE() { return true; } + + public float getHandOffset(float partialTicks) { + if (isVirtual()) + return animatedOffset.getValue(partialTicks); + + float progress = 0; + int timerSpeed = getTimerSpeed(); + AllBlockPartials handPose = getHandPose(); + + if (state == State.EXPANDING) + progress = 1 - (timer - partialTicks * timerSpeed) / 1000f; + if (state == State.RETRACTING) + progress = (timer - partialTicks * timerSpeed) / 1000f; + float handLength = handPose == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : handPose == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (reach + handLength), 21 / 16f); + + return distance; + } + + public void setAnimatedOffset(float offset) { + animatedOffset.setValue(offset); + } + } diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java index 63cf669d5..b32718469 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/FunnelTileEntity.java @@ -4,7 +4,6 @@ import java.lang.ref.WeakReference; import java.util.List; import com.simibubi.create.AllBlocks; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.contraptions.components.saw.SawTileEntity; import com.simibubi.create.content.contraptions.goggles.IHaveHoveringInformation; import com.simibubi.create.content.contraptions.relays.belt.BeltHelper; @@ -13,7 +12,6 @@ import com.simibubi.create.content.contraptions.relays.belt.transport.Transporte import com.simibubi.create.content.logistics.block.chute.ChuteTileEntity; import com.simibubi.create.content.logistics.block.funnel.BeltFunnelBlock.Shape; import com.simibubi.create.content.logistics.packet.FunnelFlapPacket; -import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.item.TooltipHelper; @@ -42,7 +40,6 @@ import net.minecraft.util.math.Vec3d; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.fml.DistExecutor; -import net.minecraftforge.fml.network.PacketDistributor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -332,7 +329,7 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn extractionCooldown = compound.getInt("TransferCooldown"); if (clientPacket) - DistExecutor.runWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); + DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> FastRenderDispatcher.enqueueUpdate(this)); } @Override @@ -386,4 +383,10 @@ public class FunnelTileEntity extends SmartTileEntity implements IHaveHoveringIn TooltipHelper.addHint(tooltip, "hint.horizontal_funnel"); return true; } + + @Override + public boolean shouldRenderAsTE() { + return true; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java index 6c7bf9cbb..9c2d866f9 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderRegistry.java @@ -109,8 +109,10 @@ public class PonderRegistry { String filepath = "ponder/" + path + ".nbt"; InputStream resourceAsStream = Create.class.getClassLoader() .getResourceAsStream(filepath); - if (resourceAsStream == null) - throw new IllegalStateException("Could not find ponder schematic: " + filepath); + if (resourceAsStream == null) { + Create.logger.error("Ponder schematic missing: " + path); + return t; + } try (DataInputStream stream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(resourceAsStream)))) { CompoundNBT nbt = CompressedStreamTools.read(stream, new NBTSizeTracker(0x20000000L)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java index 1edc3b83d..bed230311 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderWorld.java @@ -12,6 +12,7 @@ import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.relays.belt.BeltBlock; import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.schematics.SchematicWorld; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; import com.simibubi.create.foundation.tileEntity.SmartTileEntity; @@ -106,6 +107,7 @@ public class PonderWorld extends SchematicWorld { if (originalBlocks.containsKey(p)) blocks.put(p, originalBlocks.get(p)); }); + scene.forEach(WorldSectionElement.class, WorldSectionElement::queueRedraw); } public void pushFakeLight(int light) { @@ -280,7 +282,7 @@ public class PonderWorld extends SchematicWorld { } } } - + @Override protected BlockState processBlockStateForPrinting(BlockState state) { return state; @@ -295,5 +297,5 @@ public class PonderWorld extends SchematicWorld { public boolean isBlockPresent(BlockPos pos) { return true; // fix particle lighting } - + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 811aa75a9..84fc8560a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -177,7 +177,7 @@ public class SceneBuilder { public void showBasePlate() { world.showSection( scene.getSceneBuildingUtil().select.cuboid(new BlockPos(scene.basePlateOffsetX, 0, scene.basePlateOffsetZ), - new Vec3i(scene.basePlateSize, 0, scene.basePlateSize)), + new Vec3i(scene.basePlateSize - 1, 0, scene.basePlateSize - 1)), Direction.UP); } @@ -513,6 +513,10 @@ public class SceneBuilder { public void movePulley(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); } + + public void moveDeployer(BlockPos pos, float distance, int duration) { + addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); + } public void setBlocks(Selection selection, BlockState state, boolean spawnParticles) { addInstruction(new ReplaceBlocksInstruction(selection, $ -> state, true, spawnParticles)); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java new file mode 100644 index 000000000..720bd870d --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/DeployerScenes.java @@ -0,0 +1,460 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityType; +import net.minecraft.entity.passive.SheepEntity; +import net.minecraft.item.DyeColor; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.BlockParticleData; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class DeployerScenes { + + public static void filter(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer", "Using the Deployer"); + scene.configureBasePlate(0, 0, 5); + + BlockPos potPosition = util.grid.at(1, 1, 2); + BlockPos deployerPos = util.grid.at(3, 1, 2); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.setBlock(potPosition, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(util.select.layer(0) + .add(util.select.position(1, 1, 2)), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + scene.world.showSection(deployerSelection, Direction.SOUTH); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.topOf(deployerPos)) + .text("Given Rotational Force, a Deployer can imitate player interactions"); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(44); + + scene.overlay.showSelectionWithText(util.select.position(deployerPos.west(2)), 60) + .text("It will always interact with the position 2 blocks in front of itself") + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .attachKeyFrame(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.DOWN); + scene.idle(24); + + scene.overlay.showText(50) + .pointAt(util.vector.topOf(deployerPos.west())) + .text("Blocks directly in front will not obstruct it") + .placeNearTarget(); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(34); + scene.world.hideSection(util.select.fromTo(2, 1, 3, 2, 1, 1), Direction.UP); + scene.idle(20); + + String[] actions = + new String[] { "Place Blocks,", "Use Items,", "Activate Blocks,", "Harvest blocks", "and Attack Mobs" }; + + scene.overlay.showText(80) + .attachKeyFrame() + .independent(40) + .placeNearTarget() + .text("Deployers can:"); + + int y = 60; + for (String s : actions) { + scene.idle(15); + scene.overlay.showText(50) + .colored(PonderPalette.MEDIUM) + .placeNearTarget() + .independent(y) + .text(s); + y += 16; + } + scene.idle(50); + + ItemStack pot = new ItemStack(Items.FLOWER_POT); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.DOWN).rightClick() + .withItem(pot), 40); + scene.idle(7); + Class teType = DeployerTileEntity.class; + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", pot.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(frontVec) + .text("Right-click the front to give it an Item to use"); + scene.idle(40); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.restoreBlocks(util.select.position(potPosition)); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(20); + + scene.world.showSection(util.select.position(deployerPos.up()), Direction.DOWN); + + ItemStack tulip = new ItemStack(Items.RED_TULIP); + Vec3d entitySpawn = util.vector.topOf(deployerPos.up(3)); + + ElementLink entity1 = + scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), tulip); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", tulip.serializeNBT())); + scene.idle(10); + scene.overlay.showText(40) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Items can also be inserted automatically"); + scene.idle(30); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.setBlock(potPosition, Blocks.POTTED_RED_TULIP.getDefaultState(), false); + scene.world.modifyTileNBT(deployerSelection, teType, + nbt -> nbt.put("HeldItem", ItemStack.EMPTY.serializeNBT())); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(25); + scene.world.hideSection(util.select.position(potPosition), Direction.UP); + scene.world.hideSection(util.select.position(deployerPos.up()), Direction.EAST); + scene.idle(20); + + Vec3d filterSlot = frontVec.add(0.375, 0.25, 0); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(40) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("Deployers carry a filter slot"); + scene.idle(50); + + ItemStack shears = new ItemStack(Items.SHEARS); + + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).rightClick() + .withItem(shears), 40); + scene.idle(7); + scene.world.setFilterData(deployerSelection, teType, shears); + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(filterSlot) + .text("When a filter is set, it activates only while holding a matching item"); + scene.idle(70); + + ElementLink sheep = scene.world.createEntity(w -> { + SheepEntity entity = EntityType.SHEEP.create(w); + entity.setFleeceColor(DyeColor.PINK); + Vec3d p = util.vector.topOf(util.grid.at(1, 0, 2)); + entity.setPosition(p.x, p.y, p.z); + entity.prevPosX = p.x; + entity.prevPosY = p.y; + entity.prevPosZ = p.z; + entity.limbSwing = 0; + entity.prevRotationYaw = 210; + entity.rotationYaw = 210; + entity.prevRotationYawHead = 210; + entity.rotationYawHead = 210; + return entity; + }); + scene.idle(20); + scene.world.showSection(util.select.position(deployerPos.up()), Direction.WEST); + entity1 = scene.world.createItemEntity(entitySpawn, util.vector.of(0, 0.2, 0), shears); + scene.idle(17); + scene.world.modifyEntity(entity1, Entity::remove); + scene.world.modifyTileNBT(deployerSelection, teType, nbt -> nbt.put("HeldItem", shears.serializeNBT())); + scene.idle(10); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.of(3, 2.5, 3)) + .text("Only items matching the filter can now be inserted..."); + + scene.idle(70); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.modifyEntity(sheep, e -> ((SheepEntity) e).setSheared(true)); + scene.effects.emitParticles(util.vector.topOf(deployerPos.west(2)) + .add(0, -.25, 0), + Emitter.withinBlockSpace(new BlockParticleData(ParticleTypes.BLOCK, Blocks.PINK_WOOL.getDefaultState()), + util.vector.of(0, 0, 0)), + 25, 1); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.world.showSection(util.select.position(deployerPos.north()), Direction.SOUTH); + scene.idle(25); + + scene.overlay.showText(80) + .placeNearTarget() + .pointAt(util.vector.of(3.5, 1.25, 1.25)) + .text("...and only non-matching items will be extracted"); + scene.world.flapFunnel(deployerPos.north(), true); + scene.world.createItemEntity(util.vector.centerOf(deployerPos.north()) + .subtract(0, .45, 0), util.vector.of(0, 0, -0.1), new ItemStack(Items.PINK_WOOL)); + + scene.markAsFinished(); + for (int i = 0; i < 10; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(26); + } + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_modes", "Modes of the Deployer"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 3, 3, 1, 5), Direction.DOWN); + scene.idle(10); + + BlockPos deployerPos = util.grid.at(3, 1, 2); + Vec3d frontVec = util.vector.blockSurface(deployerPos, Direction.WEST) + .add(-.125, 0, 0); + Selection grassBlock = util.select.position(1, 1, 2); + + Selection deployerSelection = util.select.position(deployerPos); + scene.world.showSection(deployerSelection, Direction.DOWN); + scene.idle(10); + scene.world.showSection(grassBlock, Direction.DOWN); + scene.idle(10); + + ItemStack tool = new ItemStack(Items.GOLDEN_HOE); + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(deployerPos), Pointing.DOWN).withItem(tool), + 30); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, + nbt -> nbt.put("HeldItem", tool.serializeNBT())); + scene.idle(45); + + scene.world.setKineticSpeed(util.select.position(2, 0, 5), 16); + scene.world.setKineticSpeed(util.select.layer(1), -32); + scene.world.moveDeployer(deployerPos, 1, 25); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("By default, a Deployer imitates a Right-click interaction"); + + scene.idle(26); + scene.world.replaceBlocks(grassBlock, Blocks.FARMLAND.getDefaultState(), false); + scene.world.moveDeployer(deployerPos, -1, 25); + scene.idle(46); + + scene.overlay.showControls(new InputWindowElement(frontVec, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.world.modifyTileNBT(deployerSelection, DeployerTileEntity.class, nbt -> nbt.putString("Mode", "PUNCH")); + scene.idle(45); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(1, 1, 2)) + .text("Using a Wrench, it can be set to imitate a Left-click instead"); + + BlockPos breakingPos = deployerPos.west(2); + for (int i = 0; i < 4; i++) { + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 25); + scene.idle(26); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.incrementBlockBreakingProgress(breakingPos); + scene.world.moveDeployer(deployerPos, -1, 25); + if (i == 3) + scene.world.createItemEntity(util.vector.centerOf(breakingPos), util.vector.of(0, 0, 0), + new ItemStack(Blocks.DIRT)); + scene.idle(26); + + if (i == 0) + scene.markAsFinished(); + } + } + + public static void redstone(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_redstone", "Controlling Deployers with Redstone"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 5, 3, 1, 3), Direction.DOWN); + + BlockPos deployerPos = util.grid.at(3, 1, 3); + Selection redstone = util.select.fromTo(3, 1, 1, 3, 1, 2); + BlockPos leverPos = util.grid.at(3, 1, 1); + + scene.world.toggleRedstonePower(redstone); + + scene.idle(26); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + scene.world.showSection(redstone, Direction.SOUTH); + scene.idle(31); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(60) + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("When powered by Redstone, Deployers will not activate"); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(10); + scene.world.moveDeployer(deployerPos, 1f, 30); + scene.idle(10); + + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.idle(21); + + scene.overlay.showText(60) + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Before stopping, the Deployer will finish any started cycles"); + + scene.world.moveDeployer(deployerPos, -1f, 30); + scene.idle(70); + + scene.world.toggleRedstonePower(redstone); + scene.idle(3); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(leverPos); + scene.world.moveDeployer(deployerPos, 1, 30); + scene.overlay.showText(100) + .colored(PonderPalette.GREEN) + .attachKeyFrame() + .pointAt(util.vector.topOf(deployerPos)) + .placeNearTarget() + .text("Thus, a negative pulse can be used to trigger exactly one activation cycle"); + scene.idle(31); + scene.world.moveDeployer(deployerPos, -1, 30); + + } + + public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("deployer_contraption", "Using Deployers on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + Selection flowers = util.select.fromTo(4, 1, 1, 1, 1, 1); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 3); + BlockPos deployerPos = util.grid.at(4, 1, 3); + Selection deployerSelection = util.select.position(deployerPos); + + scene.world.showSection(util.select.layer(0) + .add(flowers), Direction.UP); + scene.idle(5); + + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 2, 8, 1, 2), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.world.showSection(kinetics, Direction.DOWN); + scene.idle(5); + + ElementLink contraption = + scene.world.showIndependentSection(deployerSelection, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(util.grid.at(4, 2, 3), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(deployerPos, Direction.WEST)) + .text("Whenever Deployers are moved as part of an animated Contraption..."); + scene.idle(70); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.restoreBlocks(util.select.position(4 - x, 1, 1)); + scene.idle(18); + } + + scene.overlay.showSelectionWithText(flowers, 90) + .attachKeyFrame() + .colored(PonderPalette.GREEN) + .text("They activate at each visited location, using items from inventories anywhere on the contraption"); + scene.idle(100); + + scene.world.hideSection(flowers, Direction.UP); + scene.idle(15); + scene.world.replaceBlocks(flowers, Blocks.AIR.getDefaultState(), false); + scene.world.showSection(flowers, Direction.UP); + + Vec3d frontVec = util.vector.blockSurface(deployerPos.west(3), Direction.NORTH) + .add(0, 0, -.125); + Vec3d filterSlot = frontVec.add(0, 0.25, 0.375); + scene.overlay.showFilterSlotInput(filterSlot, 80); + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(filterSlot) + .text("The Filter slot can be used to specify which items to pull"); + scene.idle(70); + + ItemStack poppy = new ItemStack(Items.POPPY); + scene.overlay.showControls(new InputWindowElement(filterSlot, Pointing.DOWN).withItem(poppy), 30); + scene.idle(7); + scene.world.setFilterData(deployerSelection, DeployerTileEntity.class, poppy); + scene.idle(25); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(kinetics, -16); + scene.world.moveSection(pistonHead, util.vector.of(3, 0, 0), 100); + scene.world.moveSection(contraption, util.vector.of(3, 0, 0), 100); + + for (int x = 0; x < 4; x++) { + scene.world.moveDeployer(deployerPos, 1, 9); + scene.idle(10); + scene.world.moveDeployer(deployerPos, -1, 9); + scene.world.setBlock(util.grid.at(1 + x, 1, 1), Blocks.POPPY.getDefaultState(), false); + scene.idle(18); + } + + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java index fb6aa603f..aa8d10831 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MechanicalSawScenes.java @@ -173,6 +173,7 @@ public class MechanicalSawScenes { public static void treeCutting(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_breaker", "Cutting Trees with the Mechanical Saw"); scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 2), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) @@ -265,6 +266,7 @@ public class MechanicalSawScenes { public static void contraption(SceneBuilder scene, SceneBuildingUtil util) { scene.title("mechanical_saw_contraption", "Using Mechanical Saws on Contraptions"); scene.configureBasePlate(1, 0, 6); + scene.scaleSceneView(.9f); scene.world.setBlock(util.grid.at(2, 0, 3), Blocks.GRASS_BLOCK.getDefaultState(), false); scene.world.showSection(util.select.layer(0) .add(util.select.position(3, 1, 1)) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java index 8c262ceca..20b35a35a 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/MovementActorScenes.java @@ -1,19 +1,27 @@ package com.simibubi.create.foundation.ponder.content; import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.actors.HarvesterTileEntity; import com.simibubi.create.content.contraptions.components.actors.PortableItemInterfaceTileEntity; +import com.simibubi.create.content.contraptions.components.structureMovement.chassis.LinearChassisBlock; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement; +import com.simibubi.create.foundation.ponder.elements.ParrotElement.FlappyPose; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; import com.simibubi.create.foundation.utility.Pointing; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.CropsBlock; import net.minecraft.entity.Entity; import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; @@ -189,4 +197,313 @@ public class MovementActorScenes { scene.markAsFinished(); } + public static void harvester(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_harvester", "Using Mechanical Harvesters on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection crops = util.select.fromTo(4, 1, 2, 3, 1, 2) + .add(util.select.fromTo(3, 1, 1, 2, 1, 1) + .add(util.select.position(2, 1, 3)) + .add(util.select.position(1, 1, 2))); + + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos bearingPos = util.grid.at(4, 1, 4); + + scene.idle(5); + scene.world.showSection(crops, Direction.UP); + scene.world.showSection(util.select.position(bearingPos), Direction.DOWN); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 2, 4, 2, 2, 5) + .add(util.select.fromTo(2, 1, 5, 0, 1, 5)), Direction.DOWN); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.idle(10); + + for (int i = 0; i < 3; i++) { + scene.world.showSectionAndMerge(util.select.position(i, 1, 4), Direction.SOUTH, contraption); + scene.idle(5); + } + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 4), Direction.SOUTH)) + .text("Whenever Harvesters are moved as part of an animated Contraption..."); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + BlockState harvested = Blocks.WHEAT.getDefaultState(); + ItemStack wheatItem = new ItemStack(Items.WHEAT); + + scene.idle(5); + BlockPos current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(0, 0.3, -.2), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.1, 0.3, -.1), wheatItem); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.world.createItemEntity(util.vector.centerOf(current), util.vector.of(.2, 0.3, 0), wheatItem); + + scene.overlay.showText(80) + .pointAt(util.vector.topOf(1, 0, 2)) + .text("They will harvest and reset any mature crops on their way") + .placeNearTarget(); + + scene.idle(101); + scene.world.hideSection(crops, Direction.DOWN); + scene.idle(15); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + scene.world.setBlocks(crops, Blocks.WHEAT.getDefaultState() + .with(CropsBlock.AGE, 7), false); + scene.world.showSection(crops, Direction.UP); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + scene.idle(10); + + scene.world.cycleBlockProperty(util.grid.at(1, 1, 5), LinearChassisBlock.STICKY_TOP); + scene.world.glueBlockOnto(util.grid.at(1, 2, 5), Direction.DOWN, contraption); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 2, 5), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(70); + + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(-150)); + scene.world.rotateBearing(bearingPos, -360, 140); + scene.world.rotateSection(contraption, 0, -360, 0, 140); + + scene.idle(5); + current = util.grid.at(2, 1, 3); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(1, 1, 2); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 2); + scene.world.setBlock(current, harvested, true); + current = util.grid.at(2, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(3, 1, 1); + scene.world.setBlock(current, harvested, true); + scene.idle(5); + current = util.grid.at(4, 1, 2); + scene.world.setBlock(current, harvested, true); + + scene.idle(116); + scene.overlay + .showControls(new InputWindowElement(util.vector.topOf(1, 2, 5), Pointing.DOWN).withItem(wheatItem), 50); + for (int i = 0; i < 3; i++) + scene.world.modifyTileEntity(util.grid.at(i, 1, 4), HarvesterTileEntity.class, + hte -> hte.setAnimatedSpeed(0)); + } + + public static void plough(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("mechanical_plough", "Using Mechanical Ploughs on Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(0.9f); + + Selection garbage = util.select.fromTo(2, 1, 3, 1, 1, 2); + Selection kinetics = util.select.fromTo(5, 1, 6, 5, 1, 2); + Selection dynamic = util.select.fromTo(4, 0, 6, 5, 1, 6); + + scene.showBasePlate(); + ElementLink cogs = + scene.world.showIndependentSection(util.select.fromTo(4, 0, 6, 5, 1, 6), Direction.UP); + scene.idle(5); + scene.world.showSection(kinetics.substract(dynamic), Direction.DOWN); + ElementLink pistonHead = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 7, 1, 1), Direction.DOWN); + scene.world.moveSection(pistonHead, util.vector.of(0, 0, 1), 0); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(4, 1, 3, 4, 1, 2), Direction.DOWN); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 1, 3), Direction.EAST, contraption); + scene.idle(5); + scene.world.showSectionAndMerge(util.select.position(3, 1, 2), Direction.EAST, contraption); + scene.idle(20); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Whenever Ploughs are moved as part of an animated Contraption..."); + scene.idle(50); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), -8); + scene.world.setKineticSpeed(kinetics, 16); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + + Vec3d m = util.vector.of(-0.1, .2, 0); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 3), m, new ItemStack(Items.LEVER)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(2, 1, 2), m, new ItemStack(Items.TORCH)); + + scene.idle(30); + + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 3), m, new ItemStack(Items.RAIL)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.world.createItemEntity(util.vector.centerOf(1, 1, 2), m, new ItemStack(Items.REDSTONE)); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.EAST)) + .text("...they will break blocks without a solid collision hitbox"); + scene.idle(50); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.world.hideSection(garbage, Direction.UP); + scene.idle(40); + scene.world.setBlocks(garbage, Blocks.SNOW.getDefaultState(), false); + scene.world.modifyEntities(ItemEntity.class, Entity::remove); + ElementLink chest = + scene.world.showIndependentSection(util.select.position(4, 2, 2), Direction.DOWN); + + scene.overlay.showText(60) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.blockSurface(util.grid.at(4, 2, 2), Direction.WEST)) + .sharedText("storage_on_contraption"); + scene.idle(15); + scene.effects.superGlue(util.grid.at(4, 2, 2), Direction.DOWN, true); + scene.idle(45); + scene.world.showSection(garbage, Direction.EAST); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.destroyBlock(util.grid.at(2, 1, 3)); + scene.world.destroyBlock(util.grid.at(2, 1, 2)); + scene.idle(30); + scene.world.destroyBlock(util.grid.at(1, 1, 3)); + scene.world.destroyBlock(util.grid.at(1, 1, 2)); + scene.idle(15); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(2, 2, 2), Pointing.DOWN).withItem(new ItemStack(Items.SNOWBALL)), + 40); + scene.idle(40); + scene.world.hideIndependentSection(chest, Direction.UP); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + scene.idle(40); + + Selection dirt = util.select.fromTo(2, 0, 3, 1, 0, 2); + scene.world.hideSection(dirt, Direction.DOWN); + scene.idle(15); + scene.world.setBlocks(dirt, Blocks.GRASS_BLOCK.getDefaultState(), false); + scene.world.showSection(dirt, Direction.UP); + scene.overlay.showText(60) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(3, 1, 3), Direction.EAST)) + .text("Additionally, ploughs can create farmland"); + scene.idle(30); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 60); + scene.world.moveSection(chest, util.vector.of(-2, 0, 0), 60); + scene.idle(15); + scene.world.setBlocks(util.select.fromTo(2, 0, 2, 2, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(30); + scene.world.setBlocks(util.select.fromTo(1, 0, 2, 1, 0, 3), Blocks.FARMLAND.getDefaultState(), true); + scene.idle(20); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -f); + scene.world.moveSection(pistonHead, util.vector.of(2, 0, 0), 40); + scene.world.moveSection(contraption, util.vector.of(2, 0, 0), 40); + + scene.idle(50); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.world.hideSection(kinetics.substract(dynamic), Direction.EAST); + scene.world.hideSection(dirt, Direction.DOWN); + scene.world.hideIndependentSection(pistonHead, Direction.EAST); + scene.world.moveSection(cogs, util.vector.of(-1, 0, 0), 15); + scene.idle(15); + scene.world.restoreBlocks(dirt); + scene.world.showSection(dirt, Direction.UP); + scene.world.showSection(util.select.fromTo(4, 1, 6, 4, 3, 4), Direction.NORTH); + scene.idle(15); + scene.world.showSectionAndMerge(util.select.fromTo(4, 3, 3, 4, 2, 3), Direction.DOWN, contraption); + scene.idle(15); + + BlockPos bearingPos = util.grid.at(4, 3, 4); + scene.addKeyframe(); + + scene.world.setKineticSpeed(util.select.position(4, 0, 6), 8); + scene.world.setKineticSpeed(util.select.position(5, 1, 6), -16); + scene.world.setKineticSpeed(util.select.position(4, 3, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 1, 5), -16); + scene.world.setKineticSpeed(util.select.position(4, 2, 5), 16); + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + scene.world.rotateSection(contraption, 0, 0, 90, 20); + scene.world.rotateBearing(bearingPos, 90, 20); + + scene.idle(10); + ElementLink birb = scene.special.createBirb(util.vector.topOf(3, 0, 2) + .add(0, 0, 0.5), FlappyPose::new); + scene.idle(11); + + scene.world.modifyKineticSpeed(util.select.everywhere(), f -> -2 * f); + scene.world.rotateSection(contraption, 0, 0, -135, 10); + scene.world.rotateBearing(bearingPos, -135, 10); + scene.idle(7); + scene.special.moveParrot(birb, util.vector.of(-20, 15, 0), 20); + scene.special.rotateParrot(birb, 0, 360, 0, 20); + scene.idle(3); + scene.world.setKineticSpeed(util.select.everywhere(), 0); + scene.idle(20); + + scene.overlay.showText(60) + .placeNearTarget() + .pointAt(util.vector.centerOf(util.grid.at(1, 3, 2))) + .text("...they can also launch entities without hurting them"); + scene.idle(30); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index d1c4b0a5d..e24c22914 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -148,6 +148,15 @@ public class PonderIndex { .addStoryBoard("mechanical_drill/breaker", MechanicalDrillScenes::breaker, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("mechanical_drill/contraption", MechanicalDrillScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.DEPLOYER) + .addStoryBoard("deployer/filter", DeployerScenes::filter, PonderTag.KINETIC_APPLIANCES) + .addStoryBoard("deployer/modes", DeployerScenes::modes) + .addStoryBoard("deployer/redstone", DeployerScenes::redstone) + .addStoryBoard("deployer/contraption", DeployerScenes::contraption, PonderTag.CONTRAPTION_ACTOR); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_HARVESTER) + .addStoryBoard("harvester", MovementActorScenes::harvester); + PonderRegistry.forComponents(AllBlocks.MECHANICAL_PLOUGH) + .addStoryBoard("plough", MovementActorScenes::plough); // Redstone PonderRegistry.forComponents(AllBlocks.PULSE_REPEATER) @@ -208,6 +217,7 @@ public class PonderIndex { .add(AllBlocks.MECHANICAL_CRAFTER) .add(AllBlocks.MECHANICAL_DRILL) .add(AllBlocks.MECHANICAL_SAW) + .add(AllBlocks.DEPLOYER) .add(AllBlocks.MECHANICAL_PUMP) .add(AllBlocks.MECHANICAL_ARM) .add(AllBlocks.MECHANICAL_PISTON) @@ -320,7 +330,6 @@ public class PonderIndex { .add(AllBlocks.BRASS_FUNNEL) .add(AllBlocks.SEATS[0]) .add(AllBlocks.REDSTONE_CONTACT) - .add(AllBlocks.SAIL) .add(Blocks.BELL) .add(Blocks.DISPENSER) .add(Blocks.DROPPER); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java index 2423c420e..cb985822c 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/TextWindowElement.java @@ -24,9 +24,9 @@ public class TextWindowElement extends AnimatedOverlayElement { // from 0 to 200 int y; - + Vec3d vec; - + boolean nearScene = false; int color = PonderPalette.WHITE.getColor(); @@ -52,7 +52,7 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.y = y; return this; } - + public Builder independent() { return independent(0); } @@ -71,12 +71,13 @@ public class TextWindowElement extends AnimatedOverlayElement { TextWindowElement.this.nearScene = true; return this; } - + public Builder attachKeyFrame() { - scene.builder().addLazyKeyframe(); + scene.builder() + .addLazyKeyframe(); return this; } - + } @Override @@ -86,7 +87,7 @@ public class TextWindowElement extends AnimatedOverlayElement { if (fade < 1 / 16f) return; Vec2f sceneToScreen = vec != null ? scene.getTransform() - .sceneToScreen(vec) : new Vec2f(0, (screen.height - 200) / 2 + y - 8); + .sceneToScreen(vec) : new Vec2f(screen.width / 2, (screen.height - 200) / 2 + y - 8); float yDiff = (screen.height / 2 - sceneToScreen.y - 10) / 100f; int targetX = (int) (screen.width * MathHelper.lerp(yDiff * yDiff, 6f / 8, 5f / 8)); @@ -122,7 +123,7 @@ public class TextWindowElement extends AnimatedOverlayElement { } FontHelper.drawSplitString(screen.getFontRenderer(), bakedText, targetX - 10, 3, textWidth, - ColorHelper.applyAlpha(brighterColor, fade)); + ColorHelper.applyAlpha(brighterColor, fade)); RenderSystem.popMatrix(); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java index fd788e53d..273d520b2 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateTileEntityInstruction.java @@ -4,6 +4,7 @@ import java.util.Optional; import java.util.function.BiConsumer; import java.util.function.Function; +import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.bearing.IBearingTileEntity; import com.simibubi.create.content.contraptions.components.structureMovement.pulley.PulleyTileEntity; import com.simibubi.create.foundation.ponder.PonderScene; @@ -36,6 +37,14 @@ public class AnimateTileEntityInstruction extends TickingInstruction { .orElse(0f)); } + public static AnimateTileEntityInstruction deployer(BlockPos location, float totalDelta, int ticks) { + return new AnimateTileEntityInstruction(location, totalDelta, ticks, + (w, f) -> castIfPresent(w, location, DeployerTileEntity.class) + .ifPresent(deployer -> deployer.setAnimatedOffset(f)), + (w) -> castIfPresent(w, location, DeployerTileEntity.class).map(deployer -> deployer.getHandOffset(1)) + .orElse(0f)); + } + protected AnimateTileEntityInstruction(BlockPos location, float totalDelta, int ticks, BiConsumer setter, Function getter) { super(false, ticks); @@ -57,7 +66,11 @@ public class AnimateTileEntityInstruction extends TickingInstruction { public void tick(PonderScene scene) { super.tick(scene); PonderWorld world = scene.getWorld(); - setter.accept(world, (float) (remainingTicks == 0 ? target : getter.apply(world) + deltaPerTick)); + float current = getter.apply(world); + float next = (float) (remainingTicks == 0 ? target : current + deltaPerTick); + setter.accept(world, next); + if (remainingTicks == 0) // lock interpolation + setter.accept(world, next); } private static Optional castIfPresent(PonderWorld world, BlockPos pos, Class teType) { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_holding.json b/src/main/resources/assets/create/models/block/deployer/hand_holding.json index 9a585fb63..0548e608e 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_holding.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_holding.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,15 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 16], + "to": [10, 10, 16], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 5, 4], "rotation": 180, "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 2, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 5, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 5, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [3, 0, 5, 4], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json index 09d55a11b..b0b91369a 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_pointing.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_pointing.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -51,15 +50,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 18], + "to": [10, 9.95, 18], "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 5]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, + "west": {"uv": [3, 0, 7, 4], "texture": "#mechanical_press_head"}, "up": {"uv": [0, 0, 4, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 4, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "down": {"uv": [4, 8, 8, 12], "rotation": 90, "texture": "#mechanical_press_head"} } }, { diff --git a/src/main/resources/assets/create/models/block/deployer/hand_punching.json b/src/main/resources/assets/create/models/block/deployer/hand_punching.json index e60304921..2cde3a6ae 100644 --- a/src/main/resources/assets/create/models/block/deployer/hand_punching.json +++ b/src/main/resources/assets/create/models/block/deployer/hand_punching.json @@ -4,7 +4,6 @@ "ambientocclusion": false, "textures": { "18": "create:block/deployer", - "particle": "create:block/gearbox_top", "mechanical_press_head": "create:block/mechanical_press_head", "mechanical_press_pole": "create:block/mechanical_press_pole" }, @@ -25,14 +24,15 @@ }, { "from": [6, 6, 14], - "to": [10, 9, 17], + "to": [10.05, 9.95, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 0]}, "faces": { "north": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "east": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, + "east": {"uv": [4, 0, 7, 4], "texture": "#mechanical_press_head"}, "south": {"uv": [0, 0, 4, 3], "texture": "#mechanical_press_head"}, - "west": {"uv": [0, 0, 3, 3], "texture": "#mechanical_press_head"}, - "up": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#mechanical_press_head"}, - "down": {"uv": [0, 0, 3, 4], "rotation": 90, "texture": "#mechanical_press_head"} + "west": {"uv": [3, 0, 6, 4], "texture": "#mechanical_press_head"}, + "up": {"uv": [3, 0, 6, 4], "rotation": 270, "texture": "#mechanical_press_head"}, + "down": {"uv": [4, 8, 7, 12], "rotation": 270, "texture": "#mechanical_press_head"} } }, { @@ -88,28 +88,28 @@ } }, { - "from": [9, 8, 16], + "from": [9, 8, 15], "to": [11, 10, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { "north": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, - "east": {"uv": [0, 3, 2, 4], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 2, 2, 4], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 8, 2, 10], "rotation": 180, "texture": "#18"}, "west": {"uv": [0, 0, 1, 2], "rotation": 180, "texture": "#18"}, - "up": {"uv": [0, 0, 1, 2], "rotation": 90, "texture": "#18"}, + "up": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#18"}, "down": {"uv": [0, 0, 1, 2], "rotation": 270, "texture": "#18"} } }, { "from": [5, 7, 15], - "to": [9, 10, 17], + "to": [10, 11, 17], "rotation": {"angle": 0, "axis": "x", "origin": [7, 8, 8]}, "faces": { - "north": {"uv": [0, 3, 4, 6], "texture": "#18"}, - "east": {"uv": [1, 2, 3, 5], "texture": "#18"}, + "north": {"uv": [6, 1, 10, 6], "rotation": 90, "texture": "#18"}, + "east": {"uv": [0, 6, 3, 8], "rotation": 90, "texture": "#18"}, "south": {"uv": [0, 0, 3, 4], "rotation": 270, "texture": "#18"}, - "west": {"uv": [0, 2, 2, 5], "texture": "#18"}, - "up": {"uv": [0, 0, 2, 4], "rotation": 90, "texture": "#18"}, + "west": {"uv": [0, 2, 2, 6], "texture": "#18"}, + "up": {"uv": [0, 0, 2, 5], "rotation": 90, "texture": "#18"}, "down": {"uv": [1, 4, 3, 8], "rotation": 270, "texture": "#18"} } } diff --git a/src/main/resources/ponder/deployer/contraption.nbt b/src/main/resources/ponder/deployer/contraption.nbt new file mode 100644 index 0000000000000000000000000000000000000000..e92a1a98b3b4bc8a2dedd033de2a3b0ac6ce5473 GIT binary patch literal 870 zcmV-s1DX6EiwFP!000000JWCiPunmM$K57w(*gr&W8z_Z;Sbp*vrv%$XC}PU+XxY1IKsZPzTO3r4IS>*7)i=a6AW&@4%rB zoO1XM`SKm|wT|OCaC`?2b>NhPI^>HwMV*O6WxfFd}oioiqGt z<`1s25i0YNyyPk9g+=c>7Z!9tx_m^oQZ6CVY-|r1*BwHS)I{122@pB=(!cq7a(Qz0 zBOv}yH3H&YT^xI4bHVtU=IR`~plwGQ(CBaknNTx8UjJN8LFY?*8gi$0{Je&6hGgrM z8GHN?L1wv<0T~>rG*c2U3G(^RzST?`f%f}{`wQm>@q`~RV<5d1vjZp%52QNh#wvNP z1epE5EgQ9c{9r*EG<r+a%92M)7+hC6_TSapNM=N{DMFCQt>wR|K9ylrYI7Cc{u;QA&FGA!K=!ISm?qpp7%7QKK%-Le zu2LAOrs4cu5;tmiu2lv)f6c^JmruM5R%U7&1R``?HqsSJKs4ziH}eRVL@-fK?v!eo6oHd z@*t5^QV>Xw4r*P-EVvTBTD6U^g(MR46J;B##>T4H*akR`0S-36DTcKJ z$EvZZ;@Ac_jsXrfz$u1pptEhD^DZ3600$f3Y*JyMvtyw1E*!@I2OHoN0~_d!4Rqdx z;~3!JS{xra$)$8qZ_G&|BH#nY;*e#@-NV)g8cX0FvT2B(%xMAvCy_iNlv~Ihutg#* zg??~n)}QMQeKJ1~a8QnpqD7KGT*Fz%U#?X<=i?%GlmdkB);7JN`YYBO7ip+0Ef3+( zECl3Sj81C2E8Ziv;DKsL*4Nc)^;^x~)c%p0zpMF;zSCnm2d)+~!zew)X-(5VKN+9* z2jkP>M<2C^AT!3VT;vT%N&+fxJ}q@{c%&Mlf^WH~+YdtsN0NgO$4i|F`!rmw{wxvh z9lDC^`pICc+tXaP5Ym|4fFjX8V;OJ=>k@BOE|2rTNwq6{uwhb7#JpF!7dbmY=V=U+ zD;1oi!F>hswn^9W1$Q5R9LG&@;2m-NTt0Xlzw$T^^EmoVjoU57(RzIOsK(Klk8&LC znpmri(W`lJRPTMK0jF%^H`tWxysK>5DTzT!(BEkXs@o399MG$6tH@?l!X#jcl0_XV zES_&IM8dMk`eRQy_0KpH~vzO?d{Ijg<>ZkBsGc2M^{k>m?-L795x Pdq2=$qa)G&qYVH6Vq1LH literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/deployer/modes.nbt b/src/main/resources/ponder/deployer/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..da15f4de6e2b074565da28cf843c4ab47efcea8b GIT binary patch literal 508 zcmVoIL2WC93H?K77yqJ59q})4h!J$gPaAh z=FugP+_i`$YdbFDt4{b?GKXUi7M$HKI|2?(Otf|X6V$5TccYv{sy9H^Pip}SqWwL*2}%M zGQ!%!-gG4j*;K$gv@U}S@kiQRDBV=~N*e2?)ajH?d1oDcHA+_%m9zJf)l(sQ*-_4i yQm*NEZ$k{-P{LHca8pAK0N5T<_o+8p z5MgSB5vako7BnsrIk?nq8a!!1kV(CoRI~s>ZMebZjIze7(RdY&@4yKhILv{wYTg!( zSEH$Nd^tOn8z*q!Fb7Ui3Wq!g4td_j2^=`gf#WTES>tbri#gPS zIn-hsCvf1fT232+^umM?_A`V{oXuvx==q7>AJFqNJzv;;b|xmMmg)r{0$;>%Zz570C_Xd?TqqC1 zBa8JQBA@1NHa~Pu&Q7{-+R*Hx$)&msAv)q29|&{x_QpoXdUQe&It*c_6UP|$j6$ss zZ*189Nj#hV{tj$!KO{%zUyiIJ3;Xv63dzhtj9DVDkUVIf${ZEOb*raZ^}sQMF3#WT z>cge0T1>J8`ZI_RQ!Tvy|6b?;VDITm9I+b~U ze!Ek8+owuqsO-g0(p1tE?`cF<7P|(*Ax|_$&=#pSYC55R2@qXyjWG@C=oV2=Zw#p} z=?GYk+C;F&zY5*wiA+cRp-|c^Z57b!Uasd2cl@>Ckh58Nt0LbLt IooxyL08qfW#dVH{7fctKHkmP2JX7 z$Bt~5QXY)w!)fBSxM>*Fj#TyFe?HH6rsEU{O%QeRmmmnC<~54%6O;?>rI*5?#wKVq zQ>J`&Mfmbzf=F##blMw1%z5rb=W(pbdNf(0!2k{ca43Mo0Gw#qfF|qFqcbQxth)dw~fo`>8CM~ zE~XQB-ojsY@PKwsx*j4H8Pddh9c#utoPTNJq{M)DhBOqQiCv2UF%M}d zKoifI0M3vkoN>*S@Lm*c;psiE1bTbu_{~asF)fV_-4L9j;`Kq{wAoB|Pl%zRif`7` z!Zr_&IT|f^*-SB}jrFU&@B7nvcbLLw5O`hh{Rie{;{C#TSw3&4GvmFf5Lm+e&dgPyGmA{^fFeT+5JAa}9mro<9leq|u@3ztJBk K?xy7q3;+OzpEAJ! literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/plough.nbt b/src/main/resources/ponder/plough.nbt new file mode 100644 index 0000000000000000000000000000000000000000..24f190e64f683f0466aa069d80f44153d54fbf18 GIT binary patch literal 974 zcmV;<12Oy`iwFP!000000KHe+j@vd6r7pB(Z}t+PX;Ywm*$-IsIR%0iZ5|2)=^{bX zM}d~dGO-jXkaWD8qQ8~z>&OzdiY$4#+iVEv!RE|4oH?TzYEHa*3|khE88yTaX4FUW3f-x;kP&rf)Y=a+#C8U`ZY9^Cs8=FkHzqCem`phQ5C@ z98Bm-$>h(~%7Fc4xB&aruCQBSs-?zG?%GR;;N(+kFqlwlW*ei6B%JLDQl zYK{M_!8g1p1*BIPfaTdp8oD%-|9$Xq6Z`P6e);^Y=VLQ{A6Gt_ic^`26Er#WQ42RU`|K4x;AGcTv3l}S~3CFLiKI*G$HXD zRseZ^J5jc4ZXwN-M4`~hS$uPAVWiroyAP~(_uEEQCYNA#{>)SjWKQOnT9u%yZ?l9P z8`S#hCS53NRYB;A2?L11uCdPsAF*H?1FOnrx214}Bk&wdr>;Bq7$z&0RmAZY=VIa_ zpA_l?{+p1qiYaA6$vjdEc$y(^*? z|Hm;+(>1W={drp89~$5W4cy%^E%B1s$Bh9mvLu#xcdhDDZBQ5Yt5&J`RdcwlQf)z# z;HQ@KyW8r~*kO?v(k<76NJ)eVi;t}uxlYtkR- Date: Tue, 16 Mar 2021 15:52:37 -0700 Subject: [PATCH 119/124] Better contraption actor instancing. - Promoted actor instance creation to the ActorInstance class. - Drills and Harvesters' rotational speed is based on their movement speed with Flywheel on. - Deployers now use Flywheel. --- .../com/simibubi/create/AllTileEntities.java | 3 +- .../actors/ActorVertexAttributes.java | 1 + .../actors/ContraptionActorData.java | 8 ++ .../components/actors/DrillActorInstance.java | 53 +++++++ .../components/actors/DrillInstance.java | 17 --- .../actors/DrillMovementBehaviour.java | 9 +- .../components/actors/DrillRenderer.java | 2 +- .../actors/HarvesterActorInstance.java | 49 +++++++ .../actors/HarvesterMovementBehaviour.java | 9 +- .../components/actors/HarvesterRenderer.java | 21 --- .../deployer/DeployerActorInstance.java | 98 +++++++++++++ .../components/deployer/DeployerInstance.java | 132 ++++++++++++++++++ .../deployer/DeployerMovementBehaviour.java | 18 ++- .../components/deployer/DeployerRenderer.java | 13 +- .../structureMovement/MovementBehaviour.java | 10 +- .../render/ActorInstance.java | 29 ++++ .../render/ContraptionKineticRenderer.java | 55 +++++++- .../render/RenderedContraption.java | 19 +-- .../foundation/utility/MatrixStacker.java | 14 ++ .../create/foundation/utility/VecHelper.java | 3 +- .../create/shader/contraption_actor.vert | 6 +- 21 files changed, 498 insertions(+), 71 deletions(-) create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerActorInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java create mode 100644 src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java diff --git a/src/main/java/com/simibubi/create/AllTileEntities.java b/src/main/java/com/simibubi/create/AllTileEntities.java index 256d46aa9..88b073b28 100644 --- a/src/main/java/com/simibubi/create/AllTileEntities.java +++ b/src/main/java/com/simibubi/create/AllTileEntities.java @@ -12,6 +12,7 @@ import com.simibubi.create.content.contraptions.components.crank.HandCrankRender import com.simibubi.create.content.contraptions.components.crank.HandCrankTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelControllerTileEntity; import com.simibubi.create.content.contraptions.components.crusher.CrushingWheelTileEntity; +import com.simibubi.create.content.contraptions.components.deployer.DeployerInstance; import com.simibubi.create.content.contraptions.components.deployer.DeployerRenderer; import com.simibubi.create.content.contraptions.components.deployer.DeployerTileEntity; import com.simibubi.create.content.contraptions.components.fan.EncasedFanRenderer; @@ -476,7 +477,7 @@ public class AllTileEntities { public static final TileEntityEntry DEPLOYER = Create.registrate() .tileEntity("deployer", DeployerTileEntity::new) - .instance(() -> ShaftInstance::new) + .instance(() -> DeployerInstance::new) .validBlocks(AllBlocks.DEPLOYER) .renderer(() -> DeployerRenderer::new) .register(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java index f707b0532..a118962b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java @@ -12,6 +12,7 @@ public enum ActorVertexAttributes implements IVertexAttrib { AXIS("aAxis", CommonAttributes.NORMAL), INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), ROTATION_CENTER("aRotationCenter", CommonAttributes.NORMAL), + SPEED("aSpeed", CommonAttributes.FLOAT), ; private final String name; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index 56853e9d1..6e41d205c 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -30,6 +30,8 @@ public class ContraptionActorData extends InstanceData { private byte rotationCenterY = 64; private byte rotationCenterZ = 64; + private float speed; + protected ContraptionActorData(InstancedModel owner) { super(owner); } @@ -57,6 +59,11 @@ public class ContraptionActorData extends InstanceData { return this; } + public ContraptionActorData setSpeed(float speed) { + this.speed = speed; + return this; + } + public ContraptionActorData setRotationAxis(Vector3f axis) { setRotationAxis(axis.getX(), axis.getY(), axis.getZ()); return this; @@ -101,6 +108,7 @@ public class ContraptionActorData extends InstanceData { putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); putVec3(buf, localRotationX, localRotationY, localRotationZ); putVec3(buf, rotationCenterX, rotationCenterY, rotationCenterZ); + put(buf, speed); } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java new file mode 100644 index 000000000..958670ede --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java @@ -0,0 +1,53 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.block.BlockState; +import net.minecraft.util.Direction; + +public class DrillActorInstance extends ActorInstance { + + InstanceKey drillHead; + private Direction facing; + + public DrillActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> renderMaterial = modelManager.getActorMaterial(); + + BlockState state = context.state; + + facing = state.get(DrillBlock.FACING); + float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); + float eulerY = facing.getHorizontalAngle(); + + drillHead = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state).createInstance(); + + drillHead.getInstance() + .setPosition(context.localPos) + .setBlockLight(localBlockLight()) + .setRotationOffset(0) + .setRotationAxis(0, 0, 1) + .setLocalRotation(eulerX, eulerY, 0) + .setSpeed(getSpeed(facing)); + } + + @Override + protected void tick() { + drillHead.getInstance().setSpeed(getSpeed(facing)); + } + + @Override + protected float getSpeed(Direction facing) { + if (context.contraption.stalled || !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite())) + return context.getAnimationSpeed(); + return 0; + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java index 72b85d279..cb9a66d2d 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillInstance.java @@ -22,23 +22,6 @@ public class DrillInstance extends SingleRotatingInstance { super(modelManager, tile); } - public static void addInstanceForContraption(RenderedContraption contraption, MovementContext context) { - RenderMaterial> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state); - - Direction facing = state.get(DrillBlock.FACING); - float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); - float eulerY = facing.getHorizontalAngle(); - model.getInstance(model.createInstance()) - .setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationAxis(0, 0, 1) - .setLocalRotation(eulerX, eulerY, 0); - } - @Override protected InstancedModel getModel() { return AllBlockPartials.DRILL_HEAD.renderOnDirectionalSouthRotating(modelManager, tile.getBlockState()); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java index 965d6c3c0..fd9a3959a 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import com.simibubi.create.foundation.utility.VecHelper; @@ -15,6 +17,8 @@ import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import javax.annotation.Nullable; + public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { @Override @@ -42,9 +46,10 @@ public class DrillMovementBehaviour extends BlockBreakingMovementBehaviour { return true; } + @Nullable @Override - public void addInstance(RenderedContraption contraption, MovementContext context) { - DrillInstance.addInstanceForContraption(contraption, context); + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new DrillActorInstance(kr, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java index ad434c4eb..825ba510e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillRenderer.java @@ -42,7 +42,7 @@ public class DrillRenderer extends KineticTileEntityRenderer { Direction facing = state.get(DrillBlock.FACING); float speed = (float) (context.contraption.stalled - || !VecHelper.isVecPointingTowards(context.relativeMotion, state.get(FACING) + || !VecHelper.isVecPointingTowards(context.relativeMotion, facing .getOpposite()) ? context.getAnimationSpeed() : 0); float time = AnimationTickHolder.getRenderTime() / 20; float angle = (float) (((time * speed) % 360)); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java new file mode 100644 index 000000000..f0431d63a --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -0,0 +1,49 @@ +package com.simibubi.create.content.contraptions.components.actors; + +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; +import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.Vector3f; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; + +import static net.minecraft.state.properties.BlockStateProperties.HORIZONTAL_FACING; + +public class HarvesterActorInstance extends ActorInstance { + + InstanceKey harvester; + private Direction facing; + + public HarvesterActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> renderMaterial = modelManager.getActorMaterial(); + + BlockState state = context.state; + + facing = state.get(HORIZONTAL_FACING); + float originOffset = 1 / 16f; + Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); + + harvester = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance(); + + harvester.getInstance() + .setPosition(context.localPos) + .setBlockLight(localBlockLight()) + .setRotationOffset(0) + .setRotationCenter(rotOffset) + .setRotationAxis(-1, 0, 0) + .setLocalRotation(0, facing.getHorizontalAngle(), 0) + .setSpeed(getSpeed(facing)); + } + + @Override + protected void tick() { + harvester.getInstance().setSpeed(getSpeed(facing)); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java index ea53b2b2c..2878d19da 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterMovementBehaviour.java @@ -2,6 +2,8 @@ package com.simibubi.create.content.contraptions.components.actors; import static net.minecraft.block.HorizontalBlock.HORIZONTAL_FACING; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import org.apache.commons.lang3.mutable.MutableBoolean; import com.mojang.blaze3d.matrix.MatrixStack; @@ -29,6 +31,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; import net.minecraftforge.common.IPlantable; +import javax.annotation.Nullable; + public class HarvesterMovementBehaviour extends MovementBehaviour { @Override @@ -42,9 +46,10 @@ public class HarvesterMovementBehaviour extends MovementBehaviour { return true; } + @Nullable @Override - public void addInstance(RenderedContraption contraption, MovementContext context) { - HarvesterRenderer.addInstanceForContraption(contraption, context); + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new HarvesterActorInstance(kr, context); } @Override diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java index cd130936c..b22a1ba12 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterRenderer.java @@ -43,24 +43,6 @@ public class HarvesterRenderer extends SafeTileEntityRenderer> renderMaterial = contraption.getActorMaterial(); - - BlockState state = context.state; - InstancedModel model = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state); - - Direction facing = state.get(HORIZONTAL_FACING); - float originOffset = 1 / 16f; - Vector3f rotOffset = new Vector3f(0.5f, -2 * originOffset + 0.5f, originOffset + 0.5f); - model.getInstance(model.createInstance()) - .setPosition(context.localPos) - .setBlockLight(contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos)) - .setRotationOffset(0) - .setRotationCenter(rotOffset) - .setRotationAxis(-1, 0, 0) - .setLocalRotation(0, facing.getHorizontalAngle(), 0); - } - public static void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { BlockState blockState = context.state; @@ -90,7 +72,4 @@ public class HarvesterRenderer extends SafeTileEntityRenderer pole; + InstanceKey hand; + InstanceKey shaft; + + public DeployerActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + super(modelManager, context); + + RenderMaterial> mat = modelManager.basicMaterial(); + + BlockState state = context.state; + DeployerTileEntity.Mode mode = NBTHelper.readEnum(context.tileData, "Mode", DeployerTileEntity.Mode.class); + AllBlockPartials handPose = DeployerRenderer.getHandPose(mode); + + stationaryTimer = context.data.contains("StationaryTimer"); + facing = state.get(FACING); + + boolean rotatePole = state.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + yRot = AngleHelper.horizontalAngle(facing); + zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + zRotPole = rotatePole ? 90 : 0; + + pole = mat.getModel(AllBlockPartials.DEPLOYER_POLE, state).createInstance(); + hand = mat.getModel(handPose, state).createInstance(); + + Direction.Axis axis = ((IRotate) state.getBlock()).getRotationAxis(state); + shaft = modelManager.getMaterial(KineticRenderMaterials.ROTATING) + .getModel(KineticTileEntityRenderer.KINETIC_TILE, KineticTileInstance.shaft(axis)) + .createInstance(); + + int blockLight = localBlockLight(); + + shaft.getInstance() + .setBlockLight(blockLight) + .setRotationAxis(axis) + .setPosition(context.localPos); + + pole.getInstance().setBlockLight(blockLight); + hand.getInstance().setBlockLight(blockLight); + } + + @Override + protected void tick() { + double factor; + if (context.contraption.stalled || context.position == null || context.data.contains("StationaryTimer")) { + factor = MathHelper.sin(AnimationTickHolder.getRenderTime() * .5f) * .25f + .25f; + } else { + Vec3d center = VecHelper.getCenterOf(new BlockPos(context.position)); + double distance = context.position.distanceTo(center); + double nextDistance = context.position.add(context.motion) + .distanceTo(center); + factor = .5f - MathHelper.clamp(MathHelper.lerp(AnimationTickHolder.getPartialTicks(), distance, nextDistance), 0, 1); + } + + Vec3d offset = new Vec3d(facing.getDirectionVec()).scale(factor); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(context.localPos) + .translate(offset); + + DeployerInstance.transformModel(msr, pole, hand, yRot, zRot, zRotPole); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java new file mode 100644 index 000000000..8ac245d1c --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -0,0 +1,132 @@ +package com.simibubi.create.content.contraptions.components.deployer; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.AllBlockPartials; +import com.simibubi.create.content.contraptions.base.KineticTileEntity; +import com.simibubi.create.content.contraptions.relays.encased.ShaftInstance; +import com.simibubi.create.foundation.render.backend.instancing.*; +import com.simibubi.create.foundation.render.backend.instancing.impl.ModelData; +import com.simibubi.create.foundation.utility.AngleHelper; +import com.simibubi.create.foundation.utility.AnimationTickHolder; +import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.util.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +import static com.simibubi.create.content.contraptions.base.DirectionalAxisKineticBlock.AXIS_ALONG_FIRST_COORDINATE; +import static com.simibubi.create.content.contraptions.base.DirectionalKineticBlock.FACING; + +public class DeployerInstance extends ShaftInstance implements ITickableInstance { + + DeployerTileEntity tile; + + Direction facing; + + InstanceKey pole; + + AllBlockPartials currentHand; + InstanceKey hand; + + float yRot; + float zRot; + float zRotPole; + + public DeployerInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { + super(dispatcher, tile); + } + + @Override + protected void init() { + super.init(); + + this.tile = (DeployerTileEntity) super.tile; + facing = lastState.get(FACING); + + boolean rotatePole = lastState.get(AXIS_ALONG_FIRST_COORDINATE) ^ facing.getAxis() == Direction.Axis.Z; + + yRot = AngleHelper.horizontalAngle(facing); + zRot = facing == Direction.UP ? 270 : facing == Direction.DOWN ? 90 : 0; + zRotPole = rotatePole ? 90 : 0; + + pole = modelManager.basicMaterial().getModel(AllBlockPartials.DEPLOYER_POLE, lastState).createInstance(); + + updateHandPose(); + relight(pos, pole.getInstance()); + } + + @Override + public void tick() { + + updateHandPose(); + + MatrixStack ms = new MatrixStack(); + MatrixStacker msr = MatrixStacker.of(ms); + + msr.translate(getFloatingPos()) + .translate(getHandOffset(AnimationTickHolder.getPartialTicks())); + + transformModel(msr, pole, hand, yRot, zRot, zRotPole); + + } + + @Override + public void updateLight() { + super.updateLight(); + relight(pos, hand.getInstance(), pole.getInstance()); + } + + @Override + public void remove() { + super.remove(); + hand.delete(); + pole.delete(); + currentHand = null; // updateHandPose() uses an invalid key after a block update otherwise. + hand = null; + } + + private boolean updateHandPose() { + AllBlockPartials handPose = tile.getHandPose(); + + if (currentHand == handPose) return false; + currentHand = handPose; + + if (hand != null) hand.delete(); + + hand = modelManager.basicMaterial().getModel(currentHand, lastState).createInstance(); + + relight(pos, hand.getInstance()); + + return true; + } + + protected Vec3d getHandOffset(float partialTicks) { + float progress = 0; + if (tile.state == DeployerTileEntity.State.EXPANDING) + progress = 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + if (tile.state == DeployerTileEntity.State.RETRACTING) + progress = (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + + float handLength = tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 + : tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; + float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f); + Vec3d offset = new Vec3d(facing.getDirectionVec()).scale(distance); + return offset; + } + + static void transformModel(MatrixStacker msr, InstanceKey pole, InstanceKey hand, float yRot, float zRot, float zRotPole) { + + msr.centre(); + msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); + msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI)); + + msr.push(); + msr.rotate(Direction.SOUTH, (float) ((zRotPole) / 180 * Math.PI)); + msr.unCentre(); + pole.getInstance().setTransform(msr.unwrap()); + msr.pop(); + + msr.unCentre(); + + hand.getInstance().setTransform(msr.unwrap()); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java index aa8f4240e..83738f6dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerMovementBehaviour.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.contraptions.components.deployer; import java.util.Arrays; import java.util.List; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; +import com.simibubi.create.foundation.render.backend.FastRenderDispatcher; import org.apache.commons.lang3.tuple.Pair; import com.mojang.blaze3d.matrix.MatrixStack; @@ -24,6 +27,8 @@ import net.minecraft.util.math.Vec3d; import net.minecraft.world.server.ServerWorld; import net.minecraftforge.common.util.Constants.NBT; +import javax.annotation.Nullable; + public class DeployerMovementBehaviour extends MovementBehaviour { @Override @@ -167,7 +172,18 @@ public class DeployerMovementBehaviour extends MovementBehaviour { @Override public void renderInContraption(MovementContext context, MatrixStack ms, MatrixStack msLocal, IRenderTypeBuffer buffers) { - DeployerRenderer.renderInContraption(context, ms, msLocal, buffers); + if (!FastRenderDispatcher.available()) + DeployerRenderer.renderInContraption(context, ms, msLocal, buffers); } + @Override + public boolean hasSpecialInstancedRendering() { + return true; + } + + @Nullable + @Override + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return new DeployerActorInstance(kr, context); + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java index 267763ce0..8088de8cc 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerRenderer.java @@ -50,11 +50,17 @@ public class DeployerRenderer extends SafeTileEntityRenderer int light, int overlay) { renderItem(te, partialTicks, ms, buffer, light, overlay); FilteringRenderer.renderOnTileEntity(te, partialTicks, ms, buffer, light, overlay); + + if (FastRenderDispatcher.available(te.getWorld())) return; + renderComponents(te, partialTicks, ms, buffer, light, overlay); } protected void renderItem(DeployerTileEntity te, float partialTicks, MatrixStack ms, IRenderTypeBuffer buffer, int light, int overlay) { + + if (te.heldItem.isEmpty()) return; + BlockState deployerState = te.getBlockState(); Vec3d offset = getHandOffset(te, partialTicks, deployerState).add(VecHelper.getCenterOf(BlockPos.ZERO)); ms.push(); @@ -166,8 +172,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer BlockPos pos = BlockPos.ZERO; Mode mode = NBTHelper.readEnum(context.tileData, "Mode", Mode.class); World world = context.world; - AllBlockPartials handPose = - mode == Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; + AllBlockPartials handPose = getHandPose(mode); SuperByteBuffer pole = AllBlockPartials.DEPLOYER_POLE.renderOn(blockState); SuperByteBuffer hand = handPose.renderOn(blockState); @@ -198,4 +203,8 @@ public class DeployerRenderer extends SafeTileEntityRenderer .renderInto(ms, builder); } + static AllBlockPartials getHandPose(DeployerTileEntity.Mode mode) { + return mode == DeployerTileEntity.Mode.PUNCH ? AllBlockPartials.DEPLOYER_HAND_PUNCHING : AllBlockPartials.DEPLOYER_HAND_POINTING; + } + } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java index 062a1601a..17a7c0af2 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/MovementBehaviour.java @@ -1,6 +1,8 @@ package com.simibubi.create.content.contraptions.components.structureMovement; import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ActorInstance; +import com.simibubi.create.content.contraptions.components.structureMovement.render.ContraptionKineticRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.render.RenderedContraption; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -8,10 +10,13 @@ import net.minecraft.entity.item.ItemEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; +import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.items.ItemHandlerHelper; +import javax.annotation.Nullable; + public abstract class MovementBehaviour { public boolean isActive(MovementContext context) { @@ -61,7 +66,10 @@ public abstract class MovementBehaviour { IRenderTypeBuffer buffer) {} @OnlyIn(Dist.CLIENT) - public void addInstance(RenderedContraption contraption, MovementContext context) {} + @Nullable + public ActorInstance createInstance(ContraptionKineticRenderer kr, MovementContext context) { + return null; + } public void onSpeedChanged(MovementContext context, Vec3d oldMotion, Vec3d motion) { diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java new file mode 100644 index 000000000..97d7ecc34 --- /dev/null +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ActorInstance.java @@ -0,0 +1,29 @@ +package com.simibubi.create.content.contraptions.components.structureMovement.render; + +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; +import com.simibubi.create.foundation.utility.VecHelper; +import net.minecraft.util.Direction; +import net.minecraft.world.LightType; + +public abstract class ActorInstance { + protected final ContraptionKineticRenderer modelManager; + protected final MovementContext context; + + public ActorInstance(ContraptionKineticRenderer modelManager, MovementContext context) { + this.modelManager = modelManager; + this.context = context; + } + + protected void tick() { } + + protected float getSpeed(Direction facing) { + if (context.contraption.stalled) + return 0; + + return !VecHelper.isVecPointingTowards(context.relativeMotion, facing.getOpposite()) ? context.getAnimationSpeed() : 0; + } + + protected int localBlockLight() { + return modelManager.contraption.renderWorld.getLightLevel(LightType.BLOCK, context.localPos); + } +} diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java index 8413118f7..56d968c93 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/ContraptionKineticRenderer.java @@ -1,20 +1,41 @@ package com.simibubi.create.content.contraptions.components.structureMovement.render; +import com.simibubi.create.AllMovementBehaviours; import com.simibubi.create.content.contraptions.base.KineticRenderMaterials; import com.simibubi.create.content.contraptions.base.RotatingInstancedModel; +import com.simibubi.create.content.contraptions.components.actors.ContraptionActorData; import com.simibubi.create.content.contraptions.components.actors.RotatingActorModel; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementBehaviour; +import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.relays.belt.BeltInstancedModel; import com.simibubi.create.content.logistics.block.FlapInstancedModel; import com.simibubi.create.foundation.render.AllProgramSpecs; +import com.simibubi.create.foundation.render.backend.Backend; import com.simibubi.create.foundation.render.backend.RenderMaterials; -import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; -import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; +import com.simibubi.create.foundation.render.backend.instancing.*; import com.simibubi.create.foundation.render.backend.instancing.impl.BasicInstancedModel; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.gen.feature.template.Template; +import org.apache.commons.lang3.tuple.MutablePair; +import org.apache.commons.lang3.tuple.Pair; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; public class ContraptionKineticRenderer extends InstancedTileRenderer { + protected ArrayList actors = new ArrayList<>(); + + public final RenderedContraption contraption; + + ContraptionKineticRenderer(RenderedContraption contraption) { + this.contraption = contraption; + } + @Override public void registerMaterials() { materials.put(RenderMaterials.MODELS, new RenderMaterial<>(this, AllProgramSpecs.C_MODEL, BasicInstancedModel::new)); @@ -25,6 +46,36 @@ public class ContraptionKineticRenderer extends InstancedTileRenderer(this, AllProgramSpecs.C_ACTOR, RotatingActorModel::new)); } + + @Override + public void beginFrame(double cameraX, double cameraY, double cameraZ) { + super.beginFrame(cameraX, cameraY, cameraZ); + + actors.forEach(ActorInstance::tick); + } + + @Nullable + public ActorInstance createActor(Pair actor) { + Template.BlockInfo blockInfo = actor.getLeft(); + MovementContext context = actor.getRight(); + + MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); + + if (movementBehaviour != null && movementBehaviour.hasSpecialInstancedRendering()) { + ActorInstance instance = movementBehaviour.createInstance(this, context); + + actors.add(instance); + + return instance; + } + + return null; + } + + public RenderMaterial> getActorMaterial() { + return getMaterial(KineticRenderMaterials.ACTORS); + } + @Override public BlockPos getOriginCoordinate() { return BlockPos.ZERO; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java index 23cdc0c55..9beb21f64 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/render/RenderedContraption.java @@ -64,7 +64,7 @@ public class RenderedContraption { public RenderedContraption(World world, Contraption contraption) { this.contraption = contraption; this.lighter = contraption.makeLighter(); - this.kinetics = new ContraptionKineticRenderer(); + this.kinetics = new ContraptionKineticRenderer(this); this.renderWorld = setupRenderWorld(world, contraption); buildLayers(); @@ -86,10 +86,6 @@ public class RenderedContraption { return lighter; } - public RenderMaterial> getActorMaterial() { - return kinetics.getMaterial(KineticRenderMaterials.ACTORS); - } - public void doRenderLayer(RenderType layer, ContraptionProgram shader) { ContraptionModel structure = renderLayers.get(layer); if (structure != null) { @@ -172,18 +168,7 @@ public class RenderedContraption { } private void buildActors() { - List> actors = contraption.getActors(); - - for (MutablePair actor : actors) { - Template.BlockInfo blockInfo = actor.left; - MovementContext context = actor.right; - - MovementBehaviour movementBehaviour = AllMovementBehaviours.of(blockInfo.state); - - if (movementBehaviour != null) { - movementBehaviour.addInstance(this, context); - } - } + contraption.getActors().forEach(kinetics::createActor); } private static ContraptionModel buildStructureModel(PlacementSimulationWorld renderWorld, Contraption c, RenderType layer) { diff --git a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java index 8ebc71b26..e9610c6fe 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java +++ b/src/main/java/com/simibubi/create/foundation/utility/MatrixStacker.java @@ -109,4 +109,18 @@ public class MatrixStacker { return this; } + public MatrixStacker push() { + ms.push(); + return this; + } + + public MatrixStacker pop() { + ms.pop(); + return this; + } + + public MatrixStack unwrap() { + return ms; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java index 7610ea984..611bbe2d0 100644 --- a/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java +++ b/src/main/java/com/simibubi/create/foundation/utility/VecHelper.java @@ -60,7 +60,8 @@ public class VecHelper { } public static boolean isVecPointingTowards(Vec3d vec, Direction direction) { - return new Vec3d(direction.getDirectionVec()).distanceTo(vec.normalize()) < .75; + return new Vec3d(direction.getDirectionVec()).dotProduct(vec.normalize()) > 0; + //return new Vec3d(direction.getDirectionVec()).distanceTo(vec.normalize()) < .75; } public static Vec3d getCenterOf(Vec3i pos) { diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert index cc31d18ed..31cdd6799 100644 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ b/src/main/resources/assets/create/shader/contraption_actor.vert @@ -12,6 +12,7 @@ attribute float aOffset; attribute vec3 aAxis; attribute vec3 aInstanceRot; attribute vec3 aRotationCenter; +attribute float aSpeed; varying float Diffuse; @@ -57,11 +58,10 @@ mat4 rotation(vec3 rot) { } mat4 kineticRotation() { - const float speed = -20.; - float degrees = aOffset + uTime * speed * -3./10.; + float degrees = aOffset + uTime * aSpeed / 20.; float angle = fract(degrees / 360.) * PI * 2.; - return rotate(normalize(aAxis), angle); + return rotate(normalize(aAxis), -angle); } void main() { From 1d3e057dda27673f8c40a00644d85fb319dac316 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Wed, 17 Mar 2021 01:23:16 +0100 Subject: [PATCH 120/124] Last kinetic relays and generators - Fixed transparency depth sorting inside ponder UI - Scenes for Seq. Gearshift, Furnace Engine/Flywheel and Rotation Speed Controllers --- src/generated/resources/.cache/cache | 28 +- .../resources/assets/create/lang/en_us.json | 16 + .../assets/create/lang/unfinished/de_de.json | 18 +- .../assets/create/lang/unfinished/es_es.json | 18 +- .../assets/create/lang/unfinished/es_mx.json | 18 +- .../assets/create/lang/unfinished/fr_fr.json | 18 +- .../assets/create/lang/unfinished/it_it.json | 18 +- .../assets/create/lang/unfinished/ja_jp.json | 18 +- .../assets/create/lang/unfinished/ko_kr.json | 18 +- .../assets/create/lang/unfinished/nl_nl.json | 18 +- .../assets/create/lang/unfinished/pt_br.json | 18 +- .../assets/create/lang/unfinished/ru_ru.json | 18 +- .../assets/create/lang/unfinished/zh_cn.json | 18 +- .../assets/create/lang/unfinished/zh_tw.json | 18 +- .../data/create/advancements/aesthetics.json | 4 +- .../flywheel/FlywheelTileEntity.java | 3 +- .../advanced/SpeedControllerRenderer.java | 3 +- .../advanced/SpeedControllerTileEntity.java | 5 + .../SequencedGearshiftTileEntity.java | 2 + .../create/foundation/ponder/PonderUI.java | 7 + .../ponder/content/KineticsScenes.java | 314 +++++++++++++++++- .../ponder/content/PonderIndex.java | 8 + .../renderState/SuperRenderTypeBuffer.java | 20 +- src/main/resources/ponder/furnace_engine.nbt | Bin 0 -> 600 bytes .../resources/ponder/sequenced_gearshift.nbt | Bin 0 -> 1021 bytes .../resources/ponder/speed_controller.nbt | Bin 0 -> 674 bytes 26 files changed, 594 insertions(+), 32 deletions(-) create mode 100644 src/main/resources/ponder/furnace_engine.nbt create mode 100644 src/main/resources/ponder/sequenced_gearshift.nbt create mode 100644 src/main/resources/ponder/speed_controller.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 24769c6d2..63087dd59 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -14e0e7784c59a76deddf3bfc32e334ce043396fe assets/create/lang/en_us.json -9d0c4eb5b8fcf787b1bbdd35dcb2efd37b7b9f9c assets/create/lang/unfinished/de_de.json -7e78635390f2802b325aec510ebef35345e2c9a4 assets/create/lang/unfinished/es_es.json -f87b6f876dbb50c37ebbd67d9f636f70c5e4e7f2 assets/create/lang/unfinished/es_mx.json -866086d9a9fe1f4c39208bf592b75145dd67bb47 assets/create/lang/unfinished/fr_fr.json -2f32a7fbbfaa1d78c6f9975c4aa121def52280b7 assets/create/lang/unfinished/it_it.json -2041ea4e1e516f7953be44b06092b144df0359b3 assets/create/lang/unfinished/ja_jp.json -e5057798e54fe5485a36f71b7298c6b2c73cd1b4 assets/create/lang/unfinished/ko_kr.json -e4bdb059ad70595c66c84ebfc3cac6a3929e97c4 assets/create/lang/unfinished/nl_nl.json -849db8c87d521cdf0ce8dc21652f8d95eea47194 assets/create/lang/unfinished/pt_br.json -cdafda2402e1c3259eba15fdd55a446117fece83 assets/create/lang/unfinished/ru_ru.json -8063b79a864f2a1a56c30aabe6df4bd616c938c2 assets/create/lang/unfinished/zh_cn.json -bd9961903c4e125cd3029dad62a4a7fd690149aa assets/create/lang/unfinished/zh_tw.json +73cd8748a2a6277ec1ec1e4c0af4fe9cffbda8ce assets/create/lang/en_us.json +9777ac3724ec7d626437b12b67b533f6894afd29 assets/create/lang/unfinished/de_de.json +91e44b23201b2165b64837d9a8d0f3d5313a8058 assets/create/lang/unfinished/es_es.json +c859cb5f44c409adcdfa3de65642eb1f6c8fd5bc assets/create/lang/unfinished/es_mx.json +512e8b757d5a6b511a946f3cb56ce90653885f04 assets/create/lang/unfinished/fr_fr.json +af6c1fdea2304970eacaf8413e85fab5c0731918 assets/create/lang/unfinished/it_it.json +96063374af85f0f269b64262c319b3bde9623d45 assets/create/lang/unfinished/ja_jp.json +b5f1962be245e0042255d23c18de532f84a3b0fa assets/create/lang/unfinished/ko_kr.json +14b0b2b88be1d3d9d064f26a36b28e6762522809 assets/create/lang/unfinished/nl_nl.json +a8f5e1dcb5db76b2daffb056841fd0b785af5597 assets/create/lang/unfinished/pt_br.json +d06fb4feed18286366ed958044ab82d1bf2d15b8 assets/create/lang/unfinished/ru_ru.json +3498b6288bce0184992a2a4051c9416d76ad1a13 assets/create/lang/unfinished/zh_cn.json +8c26a0392f613db72705d56f46e8fdaa7e117dc6 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json @@ -1585,7 +1585,7 @@ d080b1b25e5bc8baf5aee68691b08c7f12ece3b0 assets/create/models/item/windmill_bear 9f9455ccb5fc9e3cbfce73862b46078346a522a5 assets/create/models/item/zinc_nugget.json b1689617190c05ef34bd18456b0c7ae09bb3210f assets/create/models/item/zinc_ore.json e76041b7ae829fdd7dc0524f6ca4d2f89fca51bb assets/create/sounds.json -0f1b4b980afba9bf2caf583b88e261bba8b10313 data/create/advancements/aesthetics.json +5d0cc4c0255dc241e61c173b31ddca70c88d08e4 data/create/advancements/aesthetics.json 187921fa131b06721bfaf63f2623a28c141aae9a data/create/advancements/andesite_alloy.json 0ea2db7173b5be28b289ea7c9a6a0cf5805c60c7 data/create/advancements/andesite_casing.json 356f4855a2a6c65be3fb51d7d1aabf2ca6034d42 data/create/advancements/arm_blaze_burner.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 6cfdb91aa..9aa47e056 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -2020,6 +2020,11 @@ "create.ponder.funnel_transfer.text_2": "Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "Gantry setups can move attached Blocks.", @@ -2192,6 +2197,17 @@ "create.ponder.rope_pulley_modes.text_1": "Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index 892ea386e..bf4699ed0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1337", + "_": "Missing Localizations: 1350", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index bf6a5fb5d..e4d4a4f6c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 368", + "_": "Missing Localizations: 381", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 53e129369..7a61f13be 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1267", + "_": "Missing Localizations: 1280", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 2218aae58..19f3255d0 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1049", + "_": "Missing Localizations: 1062", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index 369acaf8d..a4706944c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 385", + "_": "Missing Localizations: 398", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 5db9138b5..4549c93b4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 392", + "_": "Missing Localizations: 405", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index 9471b7f33..a1d30849c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 438", + "_": "Missing Localizations: 451", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index a4da4b57e..905e5b4c4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1536", + "_": "Missing Localizations: 1549", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 40031e472..0f0960a19 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1602", + "_": "Missing Localizations: 1615", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index e30cc25d8..571fe933e 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 388", + "_": "Missing Localizations: 401", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index fcfec2f15..9d5f52646 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 386", + "_": "Missing Localizations: 399", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index 1b8b2c0d9..b67952a4c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 391", + "_": "Missing Localizations: 404", "_": "->------------------------] Game Elements [------------------------<-", @@ -2021,6 +2021,11 @@ "create.ponder.funnel_transfer.text_2": "UNLOCALIZED: Chutes or Smart chutes might be more suitable for such purposes.", "create.ponder.funnel_transfer.text_3": "UNLOCALIZED: Same applies for horizontal movement.\nA mechanical belt should help here.", + "create.ponder.furnace_engine.header": "UNLOCALIZED: Generating Rotational Force using the Furnace Engine", + "create.ponder.furnace_engine.text_1": "UNLOCALIZED: Furnace Engines generate Rotational Force while their attached Furnace is running", + "create.ponder.furnace_engine.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.furnace_engine.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.gantry_carriage.header": "UNLOCALIZED: Using Gantry Carriages", "create.ponder.gantry_carriage.text_1": "UNLOCALIZED: Gantry Carriages can mount to and slide along a Gantry Shaft.", "create.ponder.gantry_carriage.text_2": "UNLOCALIZED: Gantry setups can move attached Blocks.", @@ -2193,6 +2198,17 @@ "create.ponder.rope_pulley_modes.text_1": "UNLOCALIZED: Whenever Pulleys stop moving, the moved structure reverts to blocks", "create.ponder.rope_pulley_modes.text_2": "UNLOCALIZED: It can be configured never to revert to solid blocks, or only at the location it started at", + "create.ponder.rotation_speed_controller.header": "UNLOCALIZED: Using the Rotational Speed Controller", + "create.ponder.rotation_speed_controller.text_1": "UNLOCALIZED: Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them", + "create.ponder.rotation_speed_controller.text_2": "UNLOCALIZED: Using the scroll input on its side, the conveyed speed can be configured", + + "create.ponder.sequenced_gearshift.header": "UNLOCALIZED: Controlling Rotational Speed using Sequenced Gearshifts", + "create.ponder.sequenced_gearshift.text_1": "UNLOCALIZED: Seq. Gearshifts relay rotation by following a timed list of instructions", + "create.ponder.sequenced_gearshift.text_2": "UNLOCALIZED: Right-click it to open the Configuration UI", + "create.ponder.sequenced_gearshift.text_3": "UNLOCALIZED: Upon receiving a Redstone Signal, it will start running its configured sequence", + "create.ponder.sequenced_gearshift.text_4": "UNLOCALIZED: Once finished, it waits for the next Redstone Signal and starts over", + "create.ponder.sequenced_gearshift.text_5": "UNLOCALIZED: A redstone comparator can be used to read the current progress", + "create.ponder.shaft.header": "UNLOCALIZED: Relaying rotational force using Shafts", "create.ponder.shaft.text_1": "UNLOCALIZED: Shafts will relay rotation in a straight line.", diff --git a/src/generated/resources/data/create/advancements/aesthetics.json b/src/generated/resources/data/create/advancements/aesthetics.json index d723cbe38..59a86f429 100644 --- a/src/generated/resources/data/create/advancements/aesthetics.json +++ b/src/generated/resources/data/create/advancements/aesthetics.json @@ -28,8 +28,8 @@ "trigger": "create:bracket_apply", "conditions": { "accepted_entries": [ - "create:cogwheel", - "create:large_cogwheel" + "create:large_cogwheel", + "create:cogwheel" ] } }, diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java index 2dab48a50..07dedf3b1 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/flywheel/FlywheelTileEntity.java @@ -76,7 +76,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity { super.tick(); if (world.isRemote) { - visualSpeed.target(getGeneratedSpeed()); + float targetSpeed = isVirtual() ? speed : getGeneratedSpeed(); + visualSpeed.target(targetSpeed); visualSpeed.tick(); angle += visualSpeed.value * 3 / 10f; angle %= 360; diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java index f4e324071..786a4b8b4 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/advanced/SpeedControllerRenderer.java @@ -41,11 +41,12 @@ public class SpeedControllerRenderer extends SmartTileEntityRenderer 1 / 512f) @@ -897,4 +898,10 @@ public class PonderUI extends NavigatableSimiScreen { skipCooling = 15; } + @Override + public void removed() { + super.removed(); + SuperRenderTypeBuffer.vertexSortingOrigin = BlockPos.ZERO; + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index 03ab44c64..e2d9fcab8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -1,23 +1,32 @@ package com.simibubi.create.foundation.ponder.content; +import java.io.File; + import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; +import com.simibubi.create.content.contraptions.relays.advanced.sequencer.SequencedGearshiftBlock; import com.simibubi.create.content.contraptions.relays.elementary.CogWheelBlock; import com.simibubi.create.content.contraptions.relays.elementary.ShaftBlock; import com.simibubi.create.content.contraptions.relays.encased.EncasedShaftBlock; +import com.simibubi.create.content.logistics.block.redstone.NixieTubeTileEntity; import com.simibubi.create.foundation.ponder.ElementLink; import com.simibubi.create.foundation.ponder.SceneBuilder; import com.simibubi.create.foundation.ponder.SceneBuildingUtil; import com.simibubi.create.foundation.ponder.Selection; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; import com.simibubi.create.foundation.utility.Pointing; import com.tterrag.registrate.util.entry.BlockEntry; import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.block.FurnaceBlock; +import net.minecraft.block.RedstoneWireBlock; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.AxisAlignedBB; @@ -280,7 +289,7 @@ public class KineticsScenes { scene.title("gearbox", "Relaying rotational force using Gearboxes"); scene.configureBasePlate(1, 1, 5); scene.setSceneOffsetY(-1); - + scene.world.showSection(util.select.layer(0), Direction.UP); scene.world.showSection(util.select.fromTo(4, 1, 6, 3, 2, 5), Direction.UP); scene.idle(10); @@ -689,4 +698,307 @@ public class KineticsScenes { scene.idle(90); } + public static void sequencedGearshift(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("sequenced_gearshift", "Controlling Rotational Speed using Sequenced Gearshifts"); + scene.configureBasePlate(1, 0, 5); + scene.showBasePlate(); + + Selection redstone = util.select.fromTo(3, 1, 0, 3, 1, 1); + + scene.world.showSection(util.select.position(6, 0, 3) + .add(redstone), Direction.UP); + scene.idle(5); + scene.world.showSection(util.select.fromTo(6, 1, 2, 4, 1, 2), Direction.DOWN); + + BlockPos gearshiftPos = util.grid.at(3, 1, 2); + Selection gearshiftSelection = util.select.position(gearshiftPos); + BlockPos bearingPos = util.grid.at(1, 1, 2); + BlockPos buttonPos = util.grid.at(3, 1, 0); + Selection outputKinetics = util.select.fromTo(3, 1, 2, 1, 1, 2); + + scene.world.setKineticSpeed(gearshiftSelection, 0); + scene.idle(10); + + scene.world.showSection(gearshiftSelection, Direction.DOWN); + scene.idle(10); + + scene.world.showSection(util.select.fromTo(2, 1, 2, 1, 1, 2), Direction.EAST); + scene.idle(10); + + Vec3d top = util.vector.topOf(gearshiftPos); + scene.overlay.showText(60) + .text("Seq. Gearshifts relay rotation by following a timed list of instructions") + .attachKeyFrame() + .pointAt(top) + .placeNearTarget(); + scene.idle(80); + + scene.overlay.showControls(new InputWindowElement(top, Pointing.DOWN).rightClick(), 40); + scene.idle(7); + scene.overlay.showSelectionWithText(gearshiftSelection, 50) + .colored(PonderPalette.BLUE) + .text("Right-click it to open the Configuration UI") + .pointAt(top) + .placeNearTarget(); + scene.idle(60); + + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(0, 3, 2, 0, 0, 2), Direction.EAST); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(bearingPos)); + + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(buttonPos); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.idle(20); + + scene.overlay.showText(80) + .text("Upon receiving a Redstone Signal, it will start running its configured sequence") + .attachKeyFrame() + .pointAt(top); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, -32); + scene.world.rotateBearing(bearingPos, -180, 40); + scene.world.rotateSection(contraption, -180, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + scene.idle(20); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + + scene.idle(20); + scene.overlay.showText(70) + .text("Once finished, it waits for the next Redstone Signal and starts over") + .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + scene.idle(80); + + scene.idle(20); + scene.world.toggleRedstonePower(redstone); + scene.effects.indicateRedstone(buttonPos); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.idle(20); + + scene.overlay.showText(60) + .text("A redstone comparator can be used to read the current progress") + .attachKeyFrame() + .pointAt(util.vector.topOf(util.grid.at(3, 0, 1))); + + scene.world.hideSection(redstone, Direction.NORTH); + scene.idle(15); + + BlockPos wire = util.grid.at(5, 1, 0); + Selection nixie = util.select.position(4, 1, 0); + ElementLink comparator = + scene.world.showIndependentSection(util.select.fromTo(5, 1, 1, 4, 1, 0), Direction.SOUTH); + scene.world.moveSection(comparator, util.vector.of(-2, 0, 0), 0); + scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 1)); + + scene.idle(5); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, -32); + scene.world.rotateBearing(bearingPos, -180, 40); + scene.world.rotateSection(contraption, -180, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 2)); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 0); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 3)); + scene.idle(20); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.setKineticSpeed(outputKinetics, 16); + scene.world.rotateBearing(bearingPos, 90, 40); + scene.world.rotateSection(contraption, 90, 0, 0, 40); + scene.effects.rotationDirectionIndicator(gearshiftPos.west()); + scene.world.cycleBlockProperty(wire, RedstoneWireBlock.POWER); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 4)); + scene.idle(40); + + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.cycleBlockProperty(gearshiftPos, SequencedGearshiftBlock.STATE); + scene.world.modifyBlock(wire, s -> s.with(RedstoneWireBlock.POWER, 0), false); + scene.world.toggleRedstonePower(util.select.position(5, 1, 1)); + scene.world.modifyTileNBT(nixie, NixieTubeTileEntity.class, nbt -> nbt.putInt("RedstoneStrength", 0)); + scene.world.setKineticSpeed(outputKinetics, 0); + } + + public static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("furnace_engine", "Generating Rotational Force using the Furnace Engine"); + scene.configureBasePlate(0, 0, 6); + scene.world.showSection(util.select.layer(0), Direction.UP); + + BlockPos furnacePos = util.grid.at(4, 1, 3); + BlockPos cogPos = util.grid.at(1, 1, 2); + BlockPos gaugePos = util.grid.at(1, 1, 1); + + scene.idle(5); + Selection furnaceSelect = util.select.position(furnacePos); + scene.world.showSection(furnaceSelect, Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(furnacePos.west()), Direction.DOWN); + scene.idle(10); + scene.world.showSection(util.select.position(furnacePos.west(3)), Direction.EAST); + scene.idle(10); + + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .pointAt(util.vector.topOf(furnacePos.west())) + .text("Furnace Engines generate Rotational Force while their attached Furnace is running"); + scene.idle(90); + + scene.overlay.showControls( + new InputWindowElement(util.vector.topOf(furnacePos), Pointing.DOWN).withItem(new ItemStack(Items.OAK_LOG)), + 30); + scene.idle(5); + scene.overlay + .showControls(new InputWindowElement(util.vector.blockSurface(furnacePos, Direction.NORTH), Pointing.RIGHT) + .withItem(new ItemStack(Items.COAL)), 30); + scene.idle(7); + scene.world.cycleBlockProperty(furnacePos, FurnaceBlock.LIT); + scene.effects.emitParticles(util.vector.of(4.5, 1.2, 2.9), Emitter.simple(ParticleTypes.LAVA, Vec3d.ZERO), 4, + 1); + scene.world.setKineticSpeed(util.select.fromTo(1, 1, 3, 1, 1, 1), 16); + scene.idle(40); + + scene.world.showSection(util.select.position(cogPos), Direction.SOUTH); + scene.idle(15); + scene.effects.rotationSpeedIndicator(cogPos); + scene.world.showSection(util.select.position(gaugePos), Direction.SOUTH); + scene.idle(15); + + scene.overlay.showText(80) + .attachKeyFrame() + .placeNearTarget() + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(gaugePos, Direction.WEST)) + .text("The provided Rotational Force has a very large stress capacity"); + scene.idle(90); + + ElementLink engine = + scene.world.makeSectionIndependent(util.select.fromTo(3, 1, 3, 1, 1, 1)); + scene.world.moveSection(engine, util.vector.of(0, 1, 0), 15); + scene.idle(10); + scene.world.hideSection(furnaceSelect, Direction.NORTH); + scene.idle(15); + scene.world.setBlock(furnacePos, Blocks.BLAST_FURNACE.getDefaultState() + .with(FurnaceBlock.FACING, Direction.NORTH) + .with(FurnaceBlock.LIT, true), false); + scene.world.showSection(furnaceSelect, Direction.NORTH); + scene.idle(10); + scene.world.moveSection(engine, util.vector.of(0, -1, 0), 15); + scene.idle(10); + scene.world.setKineticSpeed(util.select.fromTo(1, 1, 3, 1, 1, 1), 32); + scene.idle(5); + scene.effects.rotationSpeedIndicator(cogPos); + + scene.overlay.showText(80) + .placeNearTarget() + .colored(PonderPalette.MEDIUM) + .pointAt(util.vector.topOf(furnacePos.west())) + .text("Using a Blast Furnace will double the efficiency of the Engine"); + + } + + public static void speedController(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("rotation_speed_controller", "Using the Rotational Speed Controller"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos cogPos = util.grid.at(1, 2, 1); + Selection gaugeSelect = util.select.position(1, 2, 3); + + scene.world.multiplyKineticSpeed(util.select.everywhere(), 0.5f); + scene.world.setKineticSpeed(gaugeSelect, 0); + scene.world.showSection(util.select.fromTo(5, 1, 1, 2, 1, 1), Direction.DOWN); + scene.world.showSection(util.select.fromTo(1, 1, 3, 1, 2, 3), Direction.DOWN); + scene.idle(10); + ElementLink rsc = + scene.world.showIndependentSection(util.select.position(0, 1, 1), Direction.DOWN); + scene.world.moveSection(rsc, util.vector.of(1, 0, 0), 0); + ElementLink rsc2 = + scene.world.showIndependentSection(util.select.position(1, 1, 1), Direction.DOWN); + scene.world.moveSection(rsc2, util.vector.of(0, -100, 0), 0); + scene.idle(10); + scene.world.showSection(util.select.position(1, 2, 1), Direction.DOWN); + scene.idle(15); + scene.effects.indicateSuccess(cogPos); + scene.world.moveSection(rsc2, util.vector.of(0, 100, 0), 0); + scene.world.moveSection(rsc, util.vector.of(0, -100, 0), 0); + scene.idle(5); + scene.world.showSection(util.select.position(1, 2, 2), Direction.DOWN); + scene.idle(10); + scene.world.setKineticSpeed(gaugeSelect, 8); + scene.effects.indicateSuccess(util.grid.at(1, 2, 3)); + + scene.overlay.showText(90) + .placeNearTarget() + .attachKeyFrame() + .pointAt(util.vector.blockSurface(cogPos, Direction.NORTH)) + .text("Rot. Speed Controllers relay rotation from their axis to a Large Cogwheel above them"); + scene.idle(100); + + Vec3d inputVec = util.vector.of(1.5, 1.75, 1); + scene.overlay.showFilterSlotInput(inputVec, 60); + + scene.overlay.showText(70) + .placeNearTarget() + .attachKeyFrame() + .pointAt(inputVec) + .text("Using the scroll input on its side, the conveyed speed can be configured"); + scene.idle(80); + + InputWindowElement input = new InputWindowElement(inputVec, Pointing.UP).scroll(); + scene.overlay.showControls(input, 40); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(55); + scene.markAsFinished(); + + scene.overlay.showControls(input, 30); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(55); + + scene.overlay.showControls(input, 30); + scene.idle(15); + scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), -.05f); + scene.effects.rotationSpeedIndicator(cogPos); + scene.idle(35); + } + } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index e24c22914..d73c72246 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -45,6 +45,9 @@ public class PonderIndex { PonderRegistry.addStoryBoard(AllBlocks.GEARSHIFT, "gearshift", KineticsScenes::gearshift, PonderTag.KINETIC_RELAYS); + PonderRegistry.forComponents(AllBlocks.SEQUENCED_GEARSHIFT) + .addStoryBoard("sequenced_gearshift", KineticsScenes::sequencedGearshift); + PonderRegistry.forComponents(AllBlocks.ENCASED_FAN) .addStoryBoard("fan/direction", FanScenes::direction, PonderTag.KINETIC_APPLIANCES) .addStoryBoard("fan/processing", FanScenes::processing) @@ -67,6 +70,11 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); + PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE, AllBlocks.FLYWHEEL) + .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); + PonderRegistry.forComponents(AllBlocks.ROTATION_SPEED_CONTROLLER) + .addStoryBoard("speed_controller", KineticsScenes::speedController); + // Funnels PonderRegistry.addStoryBoard(AllBlocks.BRASS_FUNNEL, "funnels/brass", FunnelScenes::brass); PonderRegistry.forComponents(AllBlocks.ANDESITE_FUNNEL, AllBlocks.BRASS_FUNNEL) diff --git a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java index 6c2eb5e87..66cefb99d 100644 --- a/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java +++ b/src/main/java/com/simibubi/create/foundation/renderState/SuperRenderTypeBuffer.java @@ -1,5 +1,7 @@ package com.simibubi.create.foundation.renderState; +import java.util.Objects; +import java.util.Optional; import java.util.SortedMap; import com.mojang.blaze3d.systems.RenderSystem; @@ -13,9 +15,11 @@ import net.minecraft.client.renderer.RegionRenderCacheBuilder; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.model.ModelBakery; import net.minecraft.util.Util; +import net.minecraft.util.math.BlockPos; public class SuperRenderTypeBuffer implements IRenderTypeBuffer { + public static BlockPos vertexSortingOrigin = BlockPos.ZERO; static SuperRenderTypeBuffer instance; public static SuperRenderTypeBuffer getInstance() { @@ -65,6 +69,7 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { // Visible clones from net.minecraft.client.renderer.RenderTypeBuffers static final RegionRenderCacheBuilder blockBuilders = new RegionRenderCacheBuilder(); + static final SortedMap createEntityBuilders() { return Util.make(new Object2ObjectLinkedOpenHashMap<>(), (map) -> { map.put(Atlases.getEntitySolid(), blockBuilders.get(RenderType.getSolid())); @@ -86,7 +91,6 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { }); }); } - private static void assign(Object2ObjectLinkedOpenHashMap map, RenderType type) { map.put(type, new BufferBuilder(type.getExpectedBufferSize())); @@ -96,6 +100,20 @@ public class SuperRenderTypeBuffer implements IRenderTypeBuffer { super(new BufferBuilder(256), createEntityBuilders()); } + public void draw(RenderType p_228462_1_) { + BlockPos v = vertexSortingOrigin; + BufferBuilder bufferbuilder = layerBuffers.getOrDefault(p_228462_1_, this.fallbackBuffer); + boolean flag = Objects.equals(this.currentLayer, p_228462_1_.asOptional()); + if (flag || bufferbuilder != this.fallbackBuffer) { + if (this.activeConsumers.remove(bufferbuilder)) { + p_228462_1_.draw(bufferbuilder, v.getX(), v.getY(), v.getZ()); + if (flag) { + this.currentLayer = Optional.empty(); + } + } + } + } + } } diff --git a/src/main/resources/ponder/furnace_engine.nbt b/src/main/resources/ponder/furnace_engine.nbt new file mode 100644 index 0000000000000000000000000000000000000000..fe916ecc784b5195a8482e1a2a2e3a7ce1d5661f GIT binary patch literal 600 zcmV-e0;l~SiwFP!000000F9N~irX*{h9{Pkb+WX(TUzKV^c8y96iRQF(mmW7tuuB+ z6v;>m?(T#2`6@fHlR8eA0pkNR-~8iWLUVu_aIfBw0YGz2~r6bv@Lk(wME4!JzUpZH~7ZBeoIn{s$U# z@p;)N3b^Y(E@UNh6<(o*rVDHJ($?ni8*cUz3;kNJ5cL^x$NPov#r;2Hv2{k~n4u}- zm?O(!h!K0tPS*NSZE&yhTSRrQGY~%mZg!_)0yn=gR~7mv9|w*HX*b5*CN|BTEJ7!Q z!MhIoXoJ*e7T{3TH0E4YQez0%oV`~m@Ov4xd_HujS1MqZTN6i*MP0_nLxwlD&e{V! z4mtnjY=y2l+f$ep(GOEXvaM3Mm4B4aq_(Ea3gvtNQAq6%$gxE_0AANI!D(BT(fwU{ ztZu+CdFw%)OIo_JkzVf1J|j+eyA7)p=5fY2Qc%_a*I0y}cd~5Gka&$goTwPAl|e1j mD)f`|l8kj>)ss&Bj*eb`mq9+G^Nn6e|H41EBOs1(2><|+VHkq| literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/sequenced_gearshift.nbt b/src/main/resources/ponder/sequenced_gearshift.nbt new file mode 100644 index 0000000000000000000000000000000000000000..3d91ad4850a4fcc44778e7166a1590f8e5ea5c51 GIT binary patch literal 1021 zcmVb~jr#w|3pfAy%2kA8(S(GElvO{E30fsDd=9_PZpJwPGAp=4+{|y2{ zNcrjGhvFw3kO+j~hJz;MH6XodCX=Ne;=>mM668|XP9CvWKtgSp0qfDU@jGn1mQCP* zLmhBJ2b`L-cL2xluxaB24mi{SCv?E6Ir|QE_8sbc2!}f0gbp}0=fI)PfkT}S;ZO&h z&;h6BOdaY>9qN1thdSVdoj5}hh^Yz4(=nvlNC6Y0K+MgeT#Sg%Q}RKg0L@PXzv2*^ zVhSD6H`z9jeT!T{e6->M62)fbB$2C}DQ2V!$nnd<SJI@K195wC?@$D4CL5*uD9nS(0-0z{;r0ME*K70y_uAtJpQmb-iw zQsJ4S2J1L-w2ytY{F;Eu-Bk89&ND4{Z9S^NKZqqOnfKOtlYcnJ&1c*x{_7dA91dI!~nUE?b#!cm= zZfiA-BimI=ul5K$4cEZq@cRHM3r9bC<$#;&EI3Yj>s1{330KmRm z`8Mc4n?f!0|pqlpgj%U%aaDs_>x9s~kynBjRwImWAr@hUOC1BW5`@h|bB z4!xibz1YMd4jfv`34tVMCV-%qaz1#r%IhBEN4@&tbvnREFNB?AZst-=0%#wxltse4 zdvR{Tw1*c5Oxva4zZ_)QuaDqA*$<%AGm7hrO9O%3UZi9kpRjmlgS&0;#Q+{giX;9& zNjx4QlfJh5>_;*&HkzvtF>$(BieZIbk^ zPx3v(GA`)&yRQ34Q= z&#&F1@nYr`=Saz;Rq^RsUea{%wUe@#8^i6YK5PR$W>XFirdYyAv7tGb zkA>m(ZidHzNkzonKM^{S^Zx45VEym?{D4_9;ChwMv`9u+%kY(wDOdKX0)yE?Xz&*6 zyvBQJm9RU(Y*DYy zTKq@W(yc(PAx>ayo Date: Wed, 17 Mar 2021 23:31:30 +0100 Subject: [PATCH 121/124] Ponder on Tracks - Ponder scenes for the Cart Assembler --- src/generated/resources/.cache/cache | 26 +- .../resources/assets/create/lang/en_us.json | 25 + .../assets/create/lang/unfinished/de_de.json | 27 +- .../assets/create/lang/unfinished/es_es.json | 27 +- .../assets/create/lang/unfinished/es_mx.json | 27 +- .../assets/create/lang/unfinished/fr_fr.json | 27 +- .../assets/create/lang/unfinished/it_it.json | 27 +- .../assets/create/lang/unfinished/ja_jp.json | 27 +- .../assets/create/lang/unfinished/ko_kr.json | 27 +- .../assets/create/lang/unfinished/nl_nl.json | 27 +- .../assets/create/lang/unfinished/pt_br.json | 27 +- .../assets/create/lang/unfinished/ru_ru.json | 27 +- .../assets/create/lang/unfinished/zh_cn.json | 27 +- .../assets/create/lang/unfinished/zh_tw.json | 27 +- .../create/foundation/ponder/PonderUI.java | 36 +- .../foundation/ponder/SceneBuilder.java | 41 +- .../ponder/content/CartAssemblerScenes.java | 534 ++++++++++++++++++ .../ponder/content/KineticsScenes.java | 21 +- .../ponder/content/PonderIndex.java | 11 +- .../ponder/elements/MinecartElement.java | 113 ++++ .../ponder/elements/ParrotElement.java | 19 +- .../AnimateElementInstruction.java | 1 + .../AnimateMinecartInstruction.java | 28 + .../CreateMinecartInstruction.java | 18 + .../FadeIntoSceneInstruction.java | 8 +- .../ponder/cart_assembler/anchor.nbt | Bin 0 -> 560 bytes .../resources/ponder/cart_assembler/dual.nbt | Bin 0 -> 588 bytes .../resources/ponder/cart_assembler/modes.nbt | Bin 0 -> 561 bytes .../resources/ponder/cart_assembler/rails.nbt | Bin 0 -> 662 bytes 29 files changed, 1162 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java create mode 100644 src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java create mode 100644 src/main/resources/ponder/cart_assembler/anchor.nbt create mode 100644 src/main/resources/ponder/cart_assembler/dual.nbt create mode 100644 src/main/resources/ponder/cart_assembler/modes.nbt create mode 100644 src/main/resources/ponder/cart_assembler/rails.nbt diff --git a/src/generated/resources/.cache/cache b/src/generated/resources/.cache/cache index 63087dd59..4c93571f0 100644 --- a/src/generated/resources/.cache/cache +++ b/src/generated/resources/.cache/cache @@ -402,19 +402,19 @@ a3a11524cd3515fc01d905767b4b7ea782adaf03 assets/create/blockstates/yellow_seat.j 7f39521b211441f5c3e06d60c5978cebe16cacfb assets/create/blockstates/zinc_block.json b7181bcd8182b2f17088e5aa881f374c9c65470c assets/create/blockstates/zinc_ore.json 2b12f3cf99e498899207a8c4855210e7b5dc55cd assets/create/lang/en_ud.json -73cd8748a2a6277ec1ec1e4c0af4fe9cffbda8ce assets/create/lang/en_us.json -9777ac3724ec7d626437b12b67b533f6894afd29 assets/create/lang/unfinished/de_de.json -91e44b23201b2165b64837d9a8d0f3d5313a8058 assets/create/lang/unfinished/es_es.json -c859cb5f44c409adcdfa3de65642eb1f6c8fd5bc assets/create/lang/unfinished/es_mx.json -512e8b757d5a6b511a946f3cb56ce90653885f04 assets/create/lang/unfinished/fr_fr.json -af6c1fdea2304970eacaf8413e85fab5c0731918 assets/create/lang/unfinished/it_it.json -96063374af85f0f269b64262c319b3bde9623d45 assets/create/lang/unfinished/ja_jp.json -b5f1962be245e0042255d23c18de532f84a3b0fa assets/create/lang/unfinished/ko_kr.json -14b0b2b88be1d3d9d064f26a36b28e6762522809 assets/create/lang/unfinished/nl_nl.json -a8f5e1dcb5db76b2daffb056841fd0b785af5597 assets/create/lang/unfinished/pt_br.json -d06fb4feed18286366ed958044ab82d1bf2d15b8 assets/create/lang/unfinished/ru_ru.json -3498b6288bce0184992a2a4051c9416d76ad1a13 assets/create/lang/unfinished/zh_cn.json -8c26a0392f613db72705d56f46e8fdaa7e117dc6 assets/create/lang/unfinished/zh_tw.json +e371fd4fccf90c4ee6f2fbea91ea5d70e3d6c652 assets/create/lang/en_us.json +610a33e7074c3fb8e88370bed76549bfcfe0eddb assets/create/lang/unfinished/de_de.json +29339e0bf9743251639a2598d17f194cd406602c assets/create/lang/unfinished/es_es.json +e7138596de0babd4fc90a4b8ffb8fdea13088086 assets/create/lang/unfinished/es_mx.json +a95f57787534ae5d4920fe8e4825fe3012fdcd70 assets/create/lang/unfinished/fr_fr.json +7956b67df2d19a9f890f893c9d736516cc6e8629 assets/create/lang/unfinished/it_it.json +95394f8cc9d53397e030c46a9abef4fa4348e2ad assets/create/lang/unfinished/ja_jp.json +edcd5ffe8239f13cedbd63ab11c8334a38b90c90 assets/create/lang/unfinished/ko_kr.json +1749d2d020f02a2ccca4698d85bfdc4dcf849e3f assets/create/lang/unfinished/nl_nl.json +83c43209c295b3d3d85f7bebaa9a8ce7b79d47da assets/create/lang/unfinished/pt_br.json +a1a67295a2fe537080254fc8b353699d4d30989a assets/create/lang/unfinished/ru_ru.json +a525852b4f3aa0af52816e02e5cf4181de0c60c5 assets/create/lang/unfinished/zh_cn.json +51242fa9de9994103e9373e5c8dd6941438ec9a8 assets/create/lang/unfinished/zh_tw.json 846200eb548d3bfa2e77b41039de159b4b6cfb45 assets/create/models/block/acacia_window.json 1930fa3a3c98d53dd19e4ee7f55bc27fd47aa281 assets/create/models/block/acacia_window_pane_noside.json 1763ea2c9b981d187f5031ba608f3d5d3be3986a assets/create/models/block/acacia_window_pane_noside_alt.json diff --git a/src/generated/resources/assets/create/lang/en_us.json b/src/generated/resources/assets/create/lang/en_us.json index 9aa47e056..5b572a2a7 100644 --- a/src/generated/resources/assets/create/lang/en_us.json +++ b/src/generated/resources/assets/create/lang/en_us.json @@ -1907,6 +1907,26 @@ "create.ponder.brass_funnel.text_3": "Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "All shafts connected like this will rotate in the same direction", @@ -1996,6 +2016,11 @@ "create.ponder.fan_source.text_1": "Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "Funnel compatibility", "create.ponder.funnel_compat.text_1": "Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/de_de.json b/src/generated/resources/assets/create/lang/unfinished/de_de.json index bf4699ed0..82ea9ce8f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/de_de.json +++ b/src/generated/resources/assets/create/lang/unfinished/de_de.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1350", + "_": "Missing Localizations: 1370", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_es.json b/src/generated/resources/assets/create/lang/unfinished/es_es.json index e4d4a4f6c..477c1075f 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_es.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_es.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 381", + "_": "Missing Localizations: 401", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/es_mx.json b/src/generated/resources/assets/create/lang/unfinished/es_mx.json index 7a61f13be..5b8a24ac5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/es_mx.json +++ b/src/generated/resources/assets/create/lang/unfinished/es_mx.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1280", + "_": "Missing Localizations: 1300", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json index 19f3255d0..54fec9d1c 100644 --- a/src/generated/resources/assets/create/lang/unfinished/fr_fr.json +++ b/src/generated/resources/assets/create/lang/unfinished/fr_fr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1062", + "_": "Missing Localizations: 1082", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/it_it.json b/src/generated/resources/assets/create/lang/unfinished/it_it.json index a4706944c..8f188d3ce 100644 --- a/src/generated/resources/assets/create/lang/unfinished/it_it.json +++ b/src/generated/resources/assets/create/lang/unfinished/it_it.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 398", + "_": "Missing Localizations: 418", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json index 4549c93b4..6a407c0a5 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ja_jp.json +++ b/src/generated/resources/assets/create/lang/unfinished/ja_jp.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 405", + "_": "Missing Localizations: 425", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json index a1d30849c..735d654f7 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ko_kr.json +++ b/src/generated/resources/assets/create/lang/unfinished/ko_kr.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 451", + "_": "Missing Localizations: 471", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json index 905e5b4c4..f3dbea0b4 100644 --- a/src/generated/resources/assets/create/lang/unfinished/nl_nl.json +++ b/src/generated/resources/assets/create/lang/unfinished/nl_nl.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1549", + "_": "Missing Localizations: 1569", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/pt_br.json b/src/generated/resources/assets/create/lang/unfinished/pt_br.json index 0f0960a19..659fc213b 100644 --- a/src/generated/resources/assets/create/lang/unfinished/pt_br.json +++ b/src/generated/resources/assets/create/lang/unfinished/pt_br.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 1615", + "_": "Missing Localizations: 1635", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json index 571fe933e..bbfb96413 100644 --- a/src/generated/resources/assets/create/lang/unfinished/ru_ru.json +++ b/src/generated/resources/assets/create/lang/unfinished/ru_ru.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 401", + "_": "Missing Localizations: 421", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json index 9d5f52646..68ae1cb13 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_cn.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_cn.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 399", + "_": "Missing Localizations: 419", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json index b67952a4c..fff451d2d 100644 --- a/src/generated/resources/assets/create/lang/unfinished/zh_tw.json +++ b/src/generated/resources/assets/create/lang/unfinished/zh_tw.json @@ -1,5 +1,5 @@ { - "_": "Missing Localizations: 404", + "_": "Missing Localizations: 424", "_": "->------------------------] Game Elements [------------------------<-", @@ -1908,6 +1908,26 @@ "create.ponder.brass_funnel.text_3": "UNLOCALIZED: Scrolling on the filter slot allows for precise control over the extracted stack size.", "create.ponder.brass_funnel.text_4": "UNLOCALIZED: Using items on the filter slot will restrict the funnel to only transfer matching stacks.", + "create.ponder.cart_assembler.header": "UNLOCALIZED: Moving Structures using Cart Assemblers", + "create.ponder.cart_assembler.text_1": "UNLOCALIZED: Powered Cart Assemblers mount attached structures to passing Minecarts", + "create.ponder.cart_assembler.text_2": "UNLOCALIZED: Without a redstone signal, it disassembles passing cart contraptions back into blocks", + "create.ponder.cart_assembler.text_3": "UNLOCALIZED: Using a Wrench on the Minecart will let you carry the Contraption elsewhere", + + "create.ponder.cart_assembler_dual.header": "UNLOCALIZED: Assembling Carriage Contraptions", + "create.ponder.cart_assembler_dual.text_1": "UNLOCALIZED: Whenever two Cart Assembers share an attached structure...", + "create.ponder.cart_assembler_dual.text_2": "UNLOCALIZED: Powering either of them will create a Carriage Contraption", + "create.ponder.cart_assembler_dual.text_3": "UNLOCALIZED: The carts will behave like those connected via Minecart Coupling", + + "create.ponder.cart_assembler_modes.header": "UNLOCALIZED: Orientation Settings for Minecart Contraptions", + "create.ponder.cart_assembler_modes.text_1": "UNLOCALIZED: Cart Contraptions will rotate to face towards their carts' motion", + "create.ponder.cart_assembler_modes.text_2": "UNLOCALIZED: If the Assembler is set to Lock Rotation, the contraptions' orientation will never change", + + "create.ponder.cart_assembler_rails.header": "UNLOCALIZED: Other types of Minecarts and Rails", + "create.ponder.cart_assembler_rails.text_1": "UNLOCALIZED: Cart Assemblers on Regular Tracks will not affect the passing carts' motion", + "create.ponder.cart_assembler_rails.text_2": "UNLOCALIZED: When on Powered or Controller Rail, the carts will be held in place until it's Powered", + "create.ponder.cart_assembler_rails.text_3": "UNLOCALIZED: Other types of Minecarts can be used as the anchor", + "create.ponder.cart_assembler_rails.text_4": "UNLOCALIZED: Furnace Carts will keep themselves powered, pulling fuel from any attached inventories", + "create.ponder.chain_drive.header": "UNLOCALIZED: Relaying rotational force with Chain Drives", "create.ponder.chain_drive.text_1": "UNLOCALIZED: Chain Drives relay rotation to each other in a row", "create.ponder.chain_drive.text_2": "UNLOCALIZED: All shafts connected like this will rotate in the same direction", @@ -1997,6 +2017,11 @@ "create.ponder.fan_source.text_1": "UNLOCALIZED: Fans facing down into a source of heat can provide Rotational Force", "create.ponder.fan_source.text_2": "UNLOCALIZED: When given a Redstone Signal, the Fans will start providing power", + "create.ponder.flywheel.header": "UNLOCALIZED: Generating Rotational Force using the Flywheel", + "create.ponder.flywheel.text_1": "UNLOCALIZED: Flywheels are required for generating rotational force with the Furnace Engine", + "create.ponder.flywheel.text_2": "UNLOCALIZED: The provided Rotational Force has a very large stress capacity", + "create.ponder.flywheel.text_3": "UNLOCALIZED: Using a Blast Furnace will double the efficiency of the Engine", + "create.ponder.funnel_compat.header": "UNLOCALIZED: Funnel compatibility", "create.ponder.funnel_compat.text_1": "UNLOCALIZED: Funnels should also interact nicely with a handful of other components.", "create.ponder.funnel_compat.text_2": "UNLOCALIZED: Vertical Saws", diff --git a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java index 82b2f4379..b9feddb16 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/PonderUI.java @@ -83,6 +83,9 @@ public class PonderUI extends NavigatableSimiScreen { private ClipboardHelper clipboardHelper; private BlockPos copiedBlockPos; + private LerpedFloat finishingFlash; + private int finishingFlashWarmup = 0; + private LerpedFloat lazyIndex; private int index = 0; private PonderTag referredToByTag; @@ -133,6 +136,9 @@ public class PonderUI extends NavigatableSimiScreen { .startWithValue(0) .chase(1, .1f, Chaser.EXP); clipboardHelper = new ClipboardHelper(); + finishingFlash = LerpedFloat.linear() + .startWithValue(0) + .chase(0, .1f, Chaser.EXP); } @Override @@ -250,10 +256,22 @@ public class PonderUI extends NavigatableSimiScreen { if (skipCooling == 0) activeScene.tick(); } + lazyIndex.tickChaser(); fadeIn.tickChaser(); + finishingFlash.tickChaser(); progressBar.tick(); + if (activeScene.currentTime == activeScene.totalTime - 1) + finishingFlashWarmup = 30; + if (finishingFlashWarmup > 0) { + finishingFlashWarmup--; + if (finishingFlashWarmup == 0) { + finishingFlash.setValue(1); + finishingFlash.setValue(1); + } + } + if (!identifyMode) { float lazyIndexValue = lazyIndex.getValue(); if (Math.abs(lazyIndexValue - index) > 1 / 512f) @@ -389,10 +407,26 @@ public class PonderUI extends NavigatableSimiScreen { RenderSystem.pushMatrix(); RenderSystem.translated(story.basePlateOffsetX, 0, story.basePlateOffsetZ); RenderSystem.scaled(1, -1, 1); + + float flash = finishingFlash.getValue(partialTicks) * .9f; + float alpha = flash; + flash *= flash; + flash = ((flash * 2) - 1); + flash *= flash; + flash = 1 - flash; + for (int f = 0; f < 4; f++) { RenderSystem.translated(story.basePlateSize, 0, 0); RenderSystem.pushMatrix(); - RenderSystem.translated(0, 0, 1 / 1024f); + RenderSystem.translated(0, 0, -1 / 1024f); + if (flash > 0) { + RenderSystem.pushMatrix(); + RenderSystem.scaled(1, .5 + flash * .75, 1); + GuiUtils.drawGradientRect(0, 0, -1, -story.basePlateSize, 0, 0x00_c6ffc9, + ColorHelper.applyAlpha(0xaa_c6ffc9, alpha)); + RenderSystem.popMatrix(); + } + RenderSystem.translated(0, 0, 2 / 1024f); GuiUtils.drawGradientRect(0, 0, 0, -story.basePlateSize, 4, 0x66_000000, 0x00_000000); RenderSystem.popMatrix(); RenderSystem.rotatef(-90, 0, 1, 0); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java index 84fc8560a..92450e9d8 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/SceneBuilder.java @@ -17,18 +17,23 @@ import com.simibubi.create.content.contraptions.relays.belt.BeltTileEntity; import com.simibubi.create.content.contraptions.relays.gauge.SpeedGaugeTileEntity; import com.simibubi.create.content.logistics.block.funnel.FunnelTileEntity; import com.simibubi.create.foundation.ponder.content.PonderPalette; +import com.simibubi.create.foundation.ponder.elements.AnimatedSceneElement; import com.simibubi.create.foundation.ponder.elements.BeltItemElement; import com.simibubi.create.foundation.ponder.elements.EntityElement; import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement.MinecartConstructor; import com.simibubi.create.foundation.ponder.elements.ParrotElement; import com.simibubi.create.foundation.ponder.elements.ParrotElement.ParrotPose; import com.simibubi.create.foundation.ponder.elements.ParrotElement.SpinOnComponentPose; import com.simibubi.create.foundation.ponder.elements.TextWindowElement; import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.AnimateMinecartInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateTileEntityInstruction; import com.simibubi.create.foundation.ponder.instructions.AnimateWorldSectionInstruction; import com.simibubi.create.foundation.ponder.instructions.ChaseAABBInstruction; +import com.simibubi.create.foundation.ponder.instructions.CreateMinecartInstruction; import com.simibubi.create.foundation.ponder.instructions.CreateParrotInstruction; import com.simibubi.create.foundation.ponder.instructions.DelayInstruction; import com.simibubi.create.foundation.ponder.instructions.DisplayWorldSectionInstruction; @@ -328,12 +333,15 @@ public class SceneBuilder { } public void showCenteredScrollInput(BlockPos pos, Direction side, int duration) { + showScrollInput(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), side, duration); + } + + public void showScrollInput(Vec3d location, Direction side, int duration) { Axis axis = side.getAxis(); float s = 1 / 16f; float q = 1 / 4f; Vec3d expands = new Vec3d(axis == Axis.X ? s : q, axis == Axis.Y ? s : q, axis == Axis.Z ? s : q); - addInstruction(new HighlightValueBoxInstruction(scene.getSceneBuildingUtil().vector.blockSurface(pos, side), - expands, duration)); + addInstruction(new HighlightValueBoxInstruction(location, expands, duration)); } public void showRepeaterScrollInput(BlockPos pos, int duration) { @@ -359,6 +367,10 @@ public class SceneBuilder { addInstruction(new OutlineSelectionInstruction(color, slot, selection, duration)); } + public void hideElement(ElementLink link, Direction direction) { + addInstruction(new FadeOutOfSceneInstruction<>(15, direction, link)); + } + } public class SpecialInstructions { @@ -402,6 +414,22 @@ public class SceneBuilder { addInstruction(AnimateParrotInstruction.move(link, offset, duration)); } + public ElementLink createCart(Vec3d location, float angle, MinecartConstructor type) { + ElementLink link = new ElementLink<>(MinecartElement.class); + MinecartElement cart = new MinecartElement(location, angle, type); + addInstruction(new CreateMinecartInstruction(10, Direction.DOWN, cart)); + addInstruction(scene -> scene.linkElement(cart, link)); + return link; + } + + public void rotateCart(ElementLink link, float yRotation, int duration) { + addInstruction(AnimateMinecartInstruction.rotate(link, yRotation, duration)); + } + + public void moveCart(ElementLink link, Vec3d offset, int duration) { + addInstruction(AnimateMinecartInstruction.move(link, offset, duration)); + } + } public class WorldInstructions { @@ -445,6 +473,13 @@ public class SceneBuilder { return instruction.createLink(scene); } + public ElementLink showIndependentSectionImmediately(Selection selection) { + DisplayWorldSectionInstruction instruction = + new DisplayWorldSectionInstruction(0, Direction.DOWN, selection, Optional.empty()); + addInstruction(instruction); + return instruction.createLink(scene); + } + public void hideSection(Selection selection, Direction fadeOutDirection) { WorldSectionElement worldSectionElement = new WorldSectionElement(selection); ElementLink elementLink = new ElementLink<>(WorldSectionElement.class); @@ -513,7 +548,7 @@ public class SceneBuilder { public void movePulley(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.pulley(pos, distance, duration)); } - + public void moveDeployer(BlockPos pos, float distance, int duration) { addInstruction(AnimateTileEntityInstruction.deployer(pos, distance, duration)); } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java new file mode 100644 index 000000000..037078293 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/CartAssemblerScenes.java @@ -0,0 +1,534 @@ +package com.simibubi.create.foundation.ponder.content; + +import com.simibubi.create.AllBlocks; +import com.simibubi.create.AllItems; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssembleRailType; +import com.simibubi.create.content.contraptions.components.structureMovement.mounted.CartAssemblerBlock; +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.SceneBuilder; +import com.simibubi.create.foundation.ponder.SceneBuildingUtil; +import com.simibubi.create.foundation.ponder.Selection; +import com.simibubi.create.foundation.ponder.elements.EntityElement; +import com.simibubi.create.foundation.ponder.elements.InputWindowElement; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; +import com.simibubi.create.foundation.ponder.elements.WorldSectionElement; +import com.simibubi.create.foundation.ponder.instructions.EmitParticlesInstruction.Emitter; +import com.simibubi.create.foundation.utility.Pointing; + +import net.minecraft.block.Blocks; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.minecart.ChestMinecartEntity; +import net.minecraft.entity.item.minecart.FurnaceMinecartEntity; +import net.minecraft.entity.item.minecart.MinecartEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.particles.ParticleTypes; +import net.minecraft.state.properties.RailShape; +import net.minecraft.util.Direction; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; + +public class CartAssemblerScenes { + + public static void anchor(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler", "Moving Structures using Cart Assemblers"); + scene.configureBasePlate(0, 0, 5); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + BlockPos assemblerPos = util.grid.at(2, 1, 2); + scene.world.setBlock(assemblerPos, Blocks.RAIL.getDefaultState(), false); + for (int z = 0; z < 5; z++) { + scene.world.showSection(util.select.position(2, 1, z), Direction.DOWN); + scene.idle(2); + } + + BlockPos leverPos = util.grid.at(0, 1, 2); + Selection toggle = util.select.fromTo(assemblerPos, leverPos); + + scene.idle(10); + + scene.overlay + .showControls(new InputWindowElement(util.vector.centerOf(assemblerPos), Pointing.DOWN).rightClick() + .withItem(AllBlocks.CART_ASSEMBLER.asStack()), 30); + scene.idle(7); + scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.NORTH_SOUTH) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(20); + scene.world.showSection(util.select.fromTo(0, 1, 2, 1, 1, 2), Direction.EAST); + scene.idle(20); + scene.world.toggleRedstonePower(toggle); + scene.effects.indicateRedstone(leverPos); + scene.idle(10); + + scene.overlay.showText(70) + .text("Powered Cart Assemblers mount attached structures to passing Minecarts") + .attachKeyFrame() + .pointAt(util.vector.topOf(assemblerPos)) + .placeNearTarget(); + scene.idle(80); + + ElementLink cart = + scene.special.createCart(util.vector.topOf(2, 0, 4), 90, MinecartEntity::new); + scene.world.showSection(util.select.position(assemblerPos.up()), Direction.DOWN); + scene.idle(10); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + ElementLink plank = + scene.world.makeSectionIndependent(util.select.position(assemblerPos.up())); + ElementLink anchor = + scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.east())); + scene.world.moveSection(anchor, util.vector.of(-1, 0, 0), 0); + scene.effects.indicateSuccess(assemblerPos); + scene.idle(1); + scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); + scene.world.moveSection(plank, util.vector.of(0, 0, -2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + + scene.world.toggleRedstonePower(toggle); + scene.idle(10); + + scene.overlay.showText(70) + .text("Without a redstone signal, it disassembles passing cart contraptions back into blocks") + .colored(PonderPalette.RED) + .attachKeyFrame() + .pointAt(util.vector.topOf(assemblerPos)) + .placeNearTarget(); + scene.idle(80); + + scene.world.rotateSection(anchor, 0, 180, 0, 6); + scene.world.rotateSection(plank, 0, 180, 0, 6); + scene.idle(3); + + scene.world.moveSection(anchor, util.vector.of(0, 0, 2), 20); + scene.world.moveSection(plank, util.vector.of(0, 0, 2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.idle(21); + scene.world.moveSection(anchor, util.vector.of(0, -2, 0), 0); + scene.special.moveCart(cart, util.vector.of(0, 0, 2), 20); + scene.idle(30); + + scene.world.destroyBlock(assemblerPos.up()); + scene.idle(5); + ElementLink contraption = + scene.world.showIndependentSection(util.select.fromTo(1, 4, 2, 3, 3, 2), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(0, -1, 0), 0); + scene.idle(10); + scene.world.showSectionAndMerge(util.select.position(3, 3, 1), Direction.SOUTH, contraption); + scene.idle(15); + scene.effects.superGlue(util.grid.at(3, 2, 1), Direction.SOUTH, true); + scene.overlay.showText(80) + .attachKeyFrame() + .sharedText("movement_anchors") + .pointAt(util.vector.blockSurface(util.grid.at(1, 3, 2), Direction.NORTH)) + .placeNearTarget(); + scene.idle(80); + scene.world.toggleRedstonePower(toggle); + scene.effects.indicateRedstone(leverPos); + + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(20); + scene.world.moveSection(anchor, util.vector.of(0, 2, 0), 0); + scene.idle(1); + scene.world.moveSection(anchor, util.vector.of(0, 0, -2), 20); + scene.world.moveSection(contraption, util.vector.of(0, 0, -2), 20); + scene.special.moveCart(cart, util.vector.of(0, 0, -2), 20); + scene.idle(25); + + Vec3d cartCenter = util.vector.centerOf(assemblerPos.north(2)); + scene.overlay.showControls(new InputWindowElement(cartCenter, Pointing.LEFT).rightClick() + .withWrench(), 40); + scene.idle(7); + scene.special.moveCart(cart, util.vector.of(0, -100, 4), 0); + scene.world.moveSection(anchor, util.vector.of(0, -100, 4), 0); + scene.world.moveSection(contraption, util.vector.of(0, -100, 4), 0); + ItemStack asStack = AllItems.MINECART_CONTRAPTION.asStack(); + ElementLink itemEntity = + scene.world.createItemEntity(cartCenter, util.vector.of(0, .1, 0), asStack); + scene.idle(40); + scene.overlay.showText(80) + .attachKeyFrame() + .text("Using a Wrench on the Minecart will let you carry the Contraption elsewhere") + .pointAt(cartCenter) + .placeNearTarget(); + scene.idle(80); + scene.world.modifyEntity(itemEntity, Entity::remove); + + scene.overlay.showControls(new InputWindowElement(cartCenter.add(0, 0, 4), Pointing.DOWN).rightClick() + .withItem(asStack), 20); + scene.idle(20); + scene.special.moveCart(cart, util.vector.of(0, 100.5, 0), 0); + scene.world.moveSection(anchor, util.vector.of(0, 100.5, 0), 0); + scene.world.moveSection(contraption, util.vector.of(0, 100.5, 0), 0); + scene.idle(1); + scene.special.moveCart(cart, util.vector.of(0, -.5, 0), 5); + scene.world.moveSection(anchor, util.vector.of(0, -.5, 0), 5); + scene.world.moveSection(contraption, util.vector.of(0, -.5, 0), 5); + } + + public static void modes(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_modes", "Orientation Settings for Minecart Contraptions"); + scene.configureBasePlate(0, 0, 5); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int z = 0; z < 4; z++) { + scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.idle(2); + } + for (int x = 2; x < 5; x++) { + scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.idle(2); + } + + BlockPos assemblerPos = util.grid.at(3, 1, 3); + scene.idle(5); + scene.world.setBlock(assemblerPos, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(5); + scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(3, 2, 3), Direction.DOWN); + scene.idle(10); + scene.world.glueBlockOnto(util.grid.at(2, 2, 3), Direction.EAST, contraption); + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.idle(10); + + ElementLink cart = + scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, MinecartEntity::new); + scene.idle(20); + scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.idle(10); + ElementLink anchor = + scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.idle(16); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.world.rotateSection(anchor, 0, -90, 0, 12); + scene.world.rotateSection(contraption, 0, -90, 0, 12); + scene.idle(9); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.idle(15); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("Cart Contraptions will rotate to face towards their carts' motion") + .pointAt(util.vector.of(1.5, 2.5, 0)) + .placeNearTarget(); + scene.idle(90); + + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.world.hideIndependentSection(anchor, Direction.UP); + scene.overlay.hideElement(cart, Direction.UP); + scene.idle(25); + + Vec3d blockSurface = util.vector.blockSurface(assemblerPos, Direction.NORTH) + .add(0, 0, -2 / 16f); + scene.overlay.showScrollInput(blockSurface, Direction.NORTH, 60); + scene.overlay.showControls(new InputWindowElement(blockSurface, Pointing.DOWN).scroll() + .withWrench(), 60); + scene.idle(10); + scene.overlay.showText(60) + .pointAt(util.vector.of(3, 1.5, 3)) + .placeNearTarget() + .sharedText("behaviour_modify_wrench"); + scene.idle(70); + + contraption = scene.world.showIndependentSection(util.select.fromTo(3, 2, 3, 2, 2, 3), Direction.DOWN); + cart = scene.special.createCart(util.vector.topOf(util.grid.at(4, 0, 3)), 0, MinecartEntity::new); + scene.idle(10); + scene.special.moveCart(cart, util.vector.of(-1, 0, 0), 10); + scene.idle(10); + anchor = scene.world.showIndependentSectionImmediately(util.select.position(assemblerPos.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.special.moveCart(cart, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-1.5, 0, 0), 15); + scene.world.moveSection(contraption, util.vector.of(-1.5, 0, 0), 15); + scene.idle(16); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(anchor, util.vector.of(-.5, 0, -.5), 8); + scene.world.moveSection(contraption, util.vector.of(-.5, 0, -.5), 8); + scene.idle(9); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1.5), 15); + scene.world.moveSection(contraption, util.vector.of(0, 0, -1.5), 15); + scene.idle(15); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + + scene.overlay.showText(80) + .attachKeyFrame() + .text("If the Assembler is set to Lock Rotation, the contraptions' orientation will never change") + .pointAt(util.vector.of(0, 2.5, 1.5)) + .placeNearTarget(); + scene.idle(90); + } + + public static void dual(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_dual", "Assembling Carriage Contraptions"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int z = 0; z < 5; z++) { + scene.world.showSection(util.select.position(1, 1, z), Direction.DOWN); + scene.idle(2); + } + for (int x = 2; x < 6; x++) { + scene.world.showSection(util.select.position(x, 1, 4), Direction.DOWN); + scene.idle(2); + } + + BlockPos assembler1 = util.grid.at(2, 1, 4); + BlockPos assembler2 = util.grid.at(5, 1, 4); + Selection chassis = util.select.fromTo(5, 2, 4, 2, 2, 4); + + scene.idle(5); + scene.world.showSection(util.select.fromTo(2, 1, 3, 2, 1, 2), Direction.SOUTH); + scene.idle(5); + ElementLink cart = + scene.special.createCart(util.vector.topOf(assembler1.down()), 0, MinecartEntity::new); + ElementLink cart2 = + scene.special.createCart(util.vector.topOf(assembler2.down()), 0, ChestMinecartEntity::new); + scene.idle(15); + scene.world.setBlock(assembler1, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.CONTROLLER_RAIL), true); + scene.idle(5); + scene.world.setBlock(assembler2, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(5); + + ElementLink contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(15); + scene.overlay.showOutline(PonderPalette.GREEN, new Object(), util.select.position(assembler2), 60); + scene.overlay.showSelectionWithText(util.select.position(assembler1), 60) + .colored(PonderPalette.GREEN) + .pointAt(util.vector.blockSurface(util.grid.at(2, 2, 4), Direction.NORTH)) + .placeNearTarget() + .text("Whenever two Cart Assembers share an attached structure...") + .attachKeyFrame(); + scene.idle(70); + + scene.overlay.showText(60) + .pointAt(util.vector.blockSurface(util.grid.at(2, 1, 4), Direction.NORTH)) + .placeNearTarget() + .text("Powering either of them will create a Carriage Contraption"); + scene.idle(70); + + scene.effects.indicateRedstone(util.grid.at(2, 1, 2)); + scene.world.toggleRedstonePower(util.select.fromTo(2, 1, 2, 2, 1, 4)); + ElementLink anchors = + scene.world.showIndependentSectionImmediately(util.select.fromTo(assembler1.south(), assembler2.south())); + scene.world.moveSection(anchors, util.vector.of(0, 0, -1), 0); + scene.world.configureCenterOfRotation(anchors, util.vector.centerOf(util.grid.at(2, 2, 5))); + scene.world.configureCenterOfRotation(contraption, util.vector.centerOf(util.grid.at(2, 2, 4))); + scene.idle(5); + + Vec3d m = util.vector.of(-0.5, 0, 0); + scene.special.moveCart(cart, m, 5); + scene.special.moveCart(cart2, m, 5); + scene.world.moveSection(contraption, m, 5); + scene.world.moveSection(anchors, m, 5); + scene.idle(5); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart2, util.vector.of(-.3, 0, 0), 8); + m = util.vector.of(-.5, 0, -.5); + scene.special.moveCart(cart, m, 8); + scene.world.moveSection(anchors, m, 8); + scene.world.moveSection(contraption, m, 8); + scene.world.rotateSection(anchors, 0, -10, 0, 8); + scene.world.rotateSection(contraption, 0, -10, 0, 8); + scene.idle(8); + scene.special.rotateCart(cart, -45, 2); + scene.special.moveCart(cart2, util.vector.of(-.4, 0, 0), 5); + m = util.vector.of(0, 0, -3.5); + scene.special.moveCart(cart, m, 25); + scene.world.moveSection(anchors, m, 25); + scene.world.moveSection(contraption, m, 25); + scene.world.rotateSection(anchors, 0, -33, 0, 10); + scene.world.rotateSection(contraption, 0, -33, 0, 10); + scene.idle(5); + scene.special.moveCart(cart2, util.vector.of(-0.8, 0, 0), 5); + scene.idle(5); + scene.special.moveCart(cart2, util.vector.of(-1.5, 0, 0), 9); + scene.world.rotateSection(anchors, 0, -42, 0, 9); + scene.world.rotateSection(contraption, 0, -42, 0, 9); + scene.idle(9); + m = util.vector.of(-.5, 0, -.5); + scene.special.moveCart(cart2, m, 2); + scene.special.rotateCart(cart2, -45, 2); + scene.world.rotateSection(anchors, 0, -5, 0, 5); + scene.world.rotateSection(contraption, 0, -5, 0, 5); + scene.idle(2); + scene.special.moveCart(cart2, util.vector.of(0, 0, -.5), 5); + scene.special.rotateCart(cart2, -45, 2); + scene.idle(10); + + scene.overlay.showText(70) + .attachKeyFrame() + .pointAt(util.vector.blockSurface(util.grid.at(1, 1, 3), Direction.WEST)) + .placeNearTarget() + .text("The carts will behave like those connected via Minecart Coupling"); + scene.idle(80); + + } + + public static void rails(SceneBuilder scene, SceneBuildingUtil util) { + scene.title("cart_assembler_rails", "Other types of Minecarts and Rails"); + scene.configureBasePlate(0, 0, 6); + scene.scaleSceneView(.9f); + scene.world.showSection(util.select.layer(0), Direction.UP); + scene.idle(5); + + for (int x = 0; x < 6; x++) { + scene.world.showSection(util.select.position(x, 1, 3), Direction.DOWN); + scene.idle(2); + } + + BlockPos assembler = util.grid.at(3, 1, 3); + + Selection chassis = util.select.fromTo(4, 2, 3, 2, 2, 3); + + scene.idle(5); + scene.overlay.showText(70) + .attachKeyFrame() + .pointAt(util.vector.blockSurface(assembler, Direction.DOWN)) + .placeNearTarget() + .text("Cart Assemblers on Regular Tracks will not affect the passing carts' motion"); + scene.idle(10); + scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.REGULAR), true); + scene.idle(70); + + ElementLink cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, MinecartEntity::new); + ElementLink anchor = + scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + ElementLink contraption = + scene.world.showIndependentSection(util.select.position(assembler.south() + .up()), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); + scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.idle(10); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); + scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); + scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 25); + scene.idle(30); + scene.overlay.hideElement(cart, Direction.UP); + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.world.moveSection(anchor, util.vector.of(0, -3, 0), 0); + scene.idle(30); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler), Pointing.DOWN) + .withItem(new ItemStack(Items.POWERED_RAIL)), 50); + scene.idle(7); + scene.world.setBlock(assembler, AllBlocks.CART_ASSEMBLER.getDefaultState() + .with(CartAssemblerBlock.RAIL_SHAPE, RailShape.EAST_WEST) + .with(CartAssemblerBlock.RAIL_TYPE, CartAssembleRailType.POWERED_RAIL), true); + scene.overlay.showText(100) + .attachKeyFrame() + .pointAt(util.vector.topOf(assembler)) + .placeNearTarget() + .text("When on Powered or Controller Rail, the carts will be held in place until it's Powered"); + scene.idle(110); + + scene.world.hideIndependentSection(anchor, Direction.DOWN); + cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, MinecartEntity::new); + anchor = scene.world.showIndependentSection(util.select.position(assembler.south()), Direction.DOWN); + contraption = scene.world.showIndependentSection(util.select.position(assembler.south() + .up()), Direction.DOWN); + scene.world.moveSection(contraption, util.vector.of(2, 0, -1), 0); + scene.world.moveSection(anchor, util.vector.of(2, 0, -1), 0); + scene.idle(10); + scene.world.moveSection(contraption, util.vector.of(-2, 0, 0), 10); + scene.world.moveSection(anchor, util.vector.of(-2, 0, 0), 10); + scene.special.moveCart(cart, util.vector.of(-2, 0, 0), 10); + scene.world.showSection(util.select.fromTo(3, 1, 1, 3, 1, 2), Direction.SOUTH); + scene.idle(30); + + scene.world.toggleRedstonePower(util.select.fromTo(3, 1, 1, 3, 1, 3)); + scene.effects.indicateRedstone(util.grid.at(3, 1, 1)); + scene.idle(5); + + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 15); + scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 15); + scene.special.moveCart(cart, util.vector.of(-3, 0, 0), 15); + + scene.idle(30); + scene.overlay.hideElement(cart, Direction.UP); + scene.world.hideIndependentSection(anchor, Direction.UP); + scene.world.hideIndependentSection(contraption, Direction.UP); + scene.idle(20); + + cart = scene.special.createCart(util.vector.topOf(assembler.east(2) + .down()), 0, FurnaceMinecartEntity::new); + scene.idle(10); + scene.overlay.showText(50) + .attachKeyFrame() + .pointAt(util.vector.topOf(assembler.east(2))) + .placeNearTarget() + .text("Other types of Minecarts can be used as the anchor"); + scene.idle(50); + contraption = scene.world.showIndependentSection(chassis, Direction.DOWN); + scene.idle(5); + scene.world.glueBlockOnto(assembler.up(2), Direction.DOWN, contraption); + scene.idle(15); + + scene.overlay.showControls(new InputWindowElement(util.vector.topOf(assembler.up()), Pointing.UP) + .withItem(new ItemStack(Items.CHARCOAL)), 40); + scene.idle(7); + scene.overlay.showText(80) + .pointAt(util.vector.blockSurface(assembler.up(2), Direction.WEST)) + .placeNearTarget() + .text("Furnace Carts will keep themselves powered, pulling fuel from any attached inventories"); + scene.idle(85); + + Emitter smoke = Emitter.simple(ParticleTypes.LARGE_SMOKE, util.vector.of(0, 0, 0)); + + scene.special.moveCart(cart, util.vector.of(-5, 0, 0), 50); + scene.idle(20); + anchor = scene.world.showIndependentSectionImmediately(util.select.position(assembler.south())); + scene.world.moveSection(anchor, util.vector.of(0, 0, -1), 0); + scene.idle(1); + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 32); + scene.world.moveSection(contraption, util.vector.of(-3, 0, 0), 30); + scene.world.moveSection(anchor, util.vector.of(-3, 0, 0), 30); + + Vec3d vec = util.vector.centerOf(assembler) + .add(.25, .25, -0.5); + for (int i = 0; i < 7; i++) { + scene.effects.emitParticles(vec = vec.add(-.5, 0, 0), smoke, 2, 1); + scene.idle(5); + } + + scene.world.setKineticSpeed(util.select.position(2, 2, 3), 0); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java index e2d9fcab8..2e6dfe173 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/KineticsScenes.java @@ -1,7 +1,5 @@ package com.simibubi.create.foundation.ponder.content; -import java.io.File; - import com.simibubi.create.AllBlocks; import com.simibubi.create.content.contraptions.components.crank.ValveHandleBlock; import com.simibubi.create.content.contraptions.components.waterwheel.WaterWheelBlock; @@ -854,7 +852,16 @@ public class KineticsScenes { } public static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util) { - scene.title("furnace_engine", "Generating Rotational Force using the Furnace Engine"); + furnaceEngine(scene, util, false); + } + + public static void flywheel(SceneBuilder scene, SceneBuildingUtil util) { + furnaceEngine(scene, util, true); + } + + private static void furnaceEngine(SceneBuilder scene, SceneBuildingUtil util, boolean flywheel) { + scene.title(flywheel ? "flywheel" : "furnace_engine", + "Generating Rotational Force using the " + (flywheel ? "Flywheel" : "Furnace Engine")); scene.configureBasePlate(0, 0, 6); scene.world.showSection(util.select.layer(0), Direction.UP); @@ -871,11 +878,13 @@ public class KineticsScenes { scene.world.showSection(util.select.position(furnacePos.west(3)), Direction.EAST); scene.idle(10); + String text = flywheel ? "Flywheels are required for generating rotational force with the Furnace Engine" + : "Furnace Engines generate Rotational Force while their attached Furnace is running"; scene.overlay.showText(80) .attachKeyFrame() .placeNearTarget() - .pointAt(util.vector.topOf(furnacePos.west())) - .text("Furnace Engines generate Rotational Force while their attached Furnace is running"); + .pointAt(util.vector.topOf(furnacePos.west(flywheel ? 3 : 1))) + .text(text); scene.idle(90); scene.overlay.showControls( @@ -993,7 +1002,7 @@ public class KineticsScenes { scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), 4); scene.effects.rotationSpeedIndicator(cogPos); scene.idle(55); - + scene.overlay.showControls(input, 30); scene.idle(15); scene.world.multiplyKineticSpeed(util.select.fromTo(1, 2, 1, 1, 2, 3), -.05f); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java index d73c72246..fa3411878 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/content/PonderIndex.java @@ -70,8 +70,10 @@ public class PonderIndex { PonderRegistry.forComponents(AllBlocks.ENCASED_CHAIN_DRIVE, AllBlocks.ADJUSTABLE_CHAIN_GEARSHIFT) .addStoryBoard("chain_drive/gearshift", ChainDriveScenes::adjustableChainGearshift); - PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE, AllBlocks.FLYWHEEL) + PonderRegistry.forComponents(AllBlocks.FURNACE_ENGINE) .addStoryBoard("furnace_engine", KineticsScenes::furnaceEngine); + PonderRegistry.forComponents(AllBlocks.FLYWHEEL) + .addStoryBoard("furnace_engine", KineticsScenes::flywheel); PonderRegistry.forComponents(AllBlocks.ROTATION_SPEED_CONTROLLER) .addStoryBoard("speed_controller", KineticsScenes::speedController); @@ -142,6 +144,13 @@ public class PonderIndex { .addStoryBoard("gantry/direction", GantryScenes::direction) .addStoryBoard("gantry/subgantry", GantryScenes::subgantry); + // Cart Assembler + PonderRegistry.forComponents(AllBlocks.CART_ASSEMBLER) + .addStoryBoard("cart_assembler/anchor", CartAssemblerScenes::anchor, PonderTag.MOVEMENT_ANCHOR) + .addStoryBoard("cart_assembler/modes", CartAssemblerScenes::modes) + .addStoryBoard("cart_assembler/dual", CartAssemblerScenes::dual) + .addStoryBoard("cart_assembler/rails", CartAssemblerScenes::rails); + // Movement Actors PonderRegistry.forComponents(AllBlocks.PORTABLE_STORAGE_INTERFACE) .addStoryBoard("portable_interface/transfer", MovementActorScenes::psiTransfer, PonderTag.CONTRAPTION_ACTOR) diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java new file mode 100644 index 000000000..e121895b9 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/MinecartElement.java @@ -0,0 +1,113 @@ +package com.simibubi.create.foundation.ponder.elements; + +import com.mojang.blaze3d.matrix.MatrixStack; +import com.simibubi.create.foundation.ponder.PonderScene; +import com.simibubi.create.foundation.ponder.PonderWorld; +import com.simibubi.create.foundation.utility.MatrixStacker; +import com.simibubi.create.foundation.utility.animation.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.IRenderTypeBuffer; +import net.minecraft.client.renderer.entity.EntityRendererManager; +import net.minecraft.entity.item.minecart.AbstractMinecartEntity; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; +import net.minecraft.world.World; + +public class MinecartElement extends AnimatedSceneElement { + + private Vec3d location; + private LerpedFloat rotation; + private AbstractMinecartEntity entity; + private MinecartConstructor constructor; + private float initialRotation; + + public interface MinecartConstructor { + AbstractMinecartEntity create(World w, double x, double y, double z); + } + + public MinecartElement(Vec3d location, float rotation, MinecartConstructor constructor) { + initialRotation = rotation; + this.location = location.add(0, 1 / 16f, 0); + this.constructor = constructor; + this.rotation = LerpedFloat.angular() + .startWithValue(rotation); + } + + @Override + public void reset(PonderScene scene) { + super.reset(scene); + entity.setPos(0, 0, 0); + entity.prevPosX = 0; + entity.prevPosY = 0; + entity.prevPosZ = 0; + entity.lastTickPosX = 0; + entity.lastTickPosY = 0; + entity.lastTickPosZ = 0; + rotation.startWithValue(initialRotation); + } + + @Override + public void tick(PonderScene scene) { + super.tick(scene); + if (entity == null) + entity = constructor.create(scene.getWorld(), 0, 0, 0); + + entity.ticksExisted++; + entity.onGround = true; + entity.prevPosX = entity.getX(); + entity.prevPosY = entity.getY(); + entity.prevPosZ = entity.getZ(); + entity.lastTickPosX = entity.getX(); + entity.lastTickPosY = entity.getY(); + entity.lastTickPosZ = entity.getZ(); + } + + public void setPositionOffset(Vec3d position, boolean immediate) { + if (entity == null) + return; + entity.setPosition(position.x, position.y, position.z); + if (!immediate) + return; + entity.prevPosX = position.x; + entity.prevPosY = position.y; + entity.prevPosZ = position.z; + } + + public void setRotation(float angle, boolean immediate) { + if (entity == null) + return; + rotation.setValue(angle); + if (!immediate) + return; + rotation.startWithValue(angle); + } + + public Vec3d getPositionOffset() { + return entity != null ? entity.getPositionVec() : Vec3d.ZERO; + } + + public Vec3d getRotation() { + return new Vec3d(0, rotation.getValue(), 0); + } + + @Override + protected void renderLast(PonderWorld world, IRenderTypeBuffer buffer, MatrixStack ms, float fade, float pt) { + EntityRendererManager entityrenderermanager = Minecraft.getInstance() + .getRenderManager(); + if (entity == null) + entity = constructor.create(world, 0, 0, 0); + + ms.push(); + ms.translate(location.x, location.y, location.z); + ms.translate(MathHelper.lerp(pt, entity.prevPosX, entity.getX()), + MathHelper.lerp(pt, entity.prevPosY, entity.getY()), MathHelper.lerp(pt, entity.prevPosZ, entity.getZ())); + + MatrixStacker.of(ms) + .rotateY(rotation.getValue(pt)); + + entityrenderermanager.render(entity, 0, 0, 0, 0, pt, ms, buffer, lightCoordsFromFade(fade)); + ms.pop(); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java index c2ea78695..99d8081aa 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/elements/ParrotElement.java @@ -50,13 +50,17 @@ public class ParrotElement extends AnimatedSceneElement { entity.lastTickPosX = 0; entity.lastTickPosY = 0; entity.lastTickPosZ = 0; + entity.prevRotationPitch = entity.rotationPitch = 0; + entity.prevRotationYaw = entity.rotationYaw = 180; } @Override public void tick(PonderScene scene) { super.tick(scene); - if (entity == null) - return; + if (entity == null) { + entity = pose.create(scene.getWorld()); + entity.prevRotationYaw = entity.rotationYaw = 180; + } entity.ticksExisted++; entity.prevRotationYawHead = entity.rotationYawHead; @@ -112,8 +116,10 @@ public class ParrotElement extends AnimatedSceneElement { EntityRendererManager entityrenderermanager = Minecraft.getInstance() .getRenderManager(); - if (entity == null) + if (entity == null) { entity = pose.create(world); + entity.prevRotationYaw = entity.rotationYaw = 180; + } ms.push(); ms.translate(location.x, location.y, location.z); @@ -209,10 +215,13 @@ public class ParrotElement extends AnimatedSceneElement { double d1 = p_200602_2_.y - vec3d.y; double d2 = p_200602_2_.z - vec3d.z; double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - entity.rotationPitch = + float targetPitch = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d1, d3) * (double) (180F / (float) Math.PI))); - entity.rotationYaw = + float targetYaw = MathHelper.wrapDegrees((float) -(MathHelper.atan2(d2, d0) * (double) (180F / (float) Math.PI)) + 90); + + entity.rotationPitch = AngleHelper.angleLerp(.4f, entity.rotationPitch, targetPitch); + entity.rotationYaw = AngleHelper.angleLerp(.4f, entity.rotationYaw, targetYaw); } protected abstract Vec3d getFacedVec(PonderScene scene); diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java index 629f31085..d2352b082 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateElementInstruction.java @@ -47,6 +47,7 @@ public class AnimateElementInstruction extends Tic if (element == null) return; if (remainingTicks == 0) { + setter.accept(element, target); setter.accept(element, target); return; } diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java new file mode 100644 index 000000000..8c23c2db7 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/AnimateMinecartInstruction.java @@ -0,0 +1,28 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import java.util.function.BiConsumer; +import java.util.function.Function; + +import com.simibubi.create.foundation.ponder.ElementLink; +import com.simibubi.create.foundation.ponder.elements.MinecartElement; + +import net.minecraft.util.math.Vec3d; + +public class AnimateMinecartInstruction extends AnimateElementInstruction { + + public static AnimateMinecartInstruction rotate(ElementLink link, float rotation, int ticks) { + return new AnimateMinecartInstruction(link, new Vec3d(0, rotation, 0), ticks, + (wse, v) -> wse.setRotation((float) v.y, ticks == 0), MinecartElement::getRotation); + } + + public static AnimateMinecartInstruction move(ElementLink link, Vec3d offset, int ticks) { + return new AnimateMinecartInstruction(link, offset, ticks, (wse, v) -> wse.setPositionOffset(v, ticks == 0), + MinecartElement::getPositionOffset); + } + + protected AnimateMinecartInstruction(ElementLink link, Vec3d totalDelta, int ticks, + BiConsumer setter, Function getter) { + super(link, totalDelta, ticks, setter, getter); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java new file mode 100644 index 000000000..a6216f177 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/CreateMinecartInstruction.java @@ -0,0 +1,18 @@ +package com.simibubi.create.foundation.ponder.instructions; + +import com.simibubi.create.foundation.ponder.elements.MinecartElement; + +import net.minecraft.util.Direction; + +public class CreateMinecartInstruction extends FadeIntoSceneInstruction { + + public CreateMinecartInstruction(int fadeInTicks, Direction fadeInFrom, MinecartElement element) { + super(fadeInTicks, fadeInFrom, element); + } + + @Override + protected Class getElementClass() { + return MinecartElement.class; + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java index bad0f79b9..bb184144e 100644 --- a/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java +++ b/src/main/java/com/simibubi/create/foundation/ponder/instructions/FadeIntoSceneInstruction.java @@ -23,6 +23,7 @@ public abstract class FadeIntoSceneInstruction e protected void firstTick(PonderScene scene) { super.firstTick(scene); scene.addElement(element); + element.setVisible(true); element.setFade(0); element.setFadeVec(new Vec3d(fadeInFrom.getDirectionVec()).scale(.5f)); if (elementLink != null) @@ -32,10 +33,13 @@ public abstract class FadeIntoSceneInstruction e @Override public void tick(PonderScene scene) { super.tick(scene); - float fade = (remainingTicks / (float) totalTicks); + float fade = totalTicks == 0 ? 1 : (remainingTicks / (float) totalTicks); element.setFade(1 - fade * fade); - if (remainingTicks == 0) + if (remainingTicks == 0) { + if (totalTicks == 0) + element.setFade(1); element.setFade(1); + } } public ElementLink createLink(PonderScene scene) { diff --git a/src/main/resources/ponder/cart_assembler/anchor.nbt b/src/main/resources/ponder/cart_assembler/anchor.nbt new file mode 100644 index 0000000000000000000000000000000000000000..de8bc0bd15d445b01dc1a243e106846d3826f478 GIT binary patch literal 560 zcmV-00?+*)iwFP!000000IikJj@uv*#>a*vwxez@{r3nx_Ppnwt4fvjY7u9$Mj>Fq zr0MR1_4$h3*vUHBLfS>*fcWM&!+h8j06B0cpOFDTI~V=TAwx})BsyqE4$F-))!r3; z@ihn57}p04gTca)AUsE0Ym$H_8EMi84vXOM2u?qe8BP+=j5%ophedFBB!`VO>BPCx z2rtqIFXlKbg2N*?X+LMq#UeC=?Gc``2v6rYEP}%$IQ`%ee(?yu<~S^Z!-JdxnBEYB z^{>hrr5=Pjb{iR_atj|Ti(YwO2}`AL4i6iJHc((PGLTJyv;W|`9$b5>bb+?85s|-& zn7%oY1&E7RpPJv)81D7;4{$l5NoF(<@N5;RXROHrT^MWfiF#N>&3vR;H9{c~wr^9B z0skQm2wx6TV`asT?oYKOEGwgZXMIqw_;67;ZBAwPz=d{=*q4nGdhfh-#ZPM*wC&62 z&uN8JB|S9=D~pduC2Z!)F(L-|fr=(8$g zLhW7pZK)r9h8NKH7pTJDw>{-390AuxcNTTA{i-XnU-1*RLMONFR+k-;Z$qBXSH<|Y{tMaw literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cart_assembler/dual.nbt b/src/main/resources/ponder/cart_assembler/dual.nbt new file mode 100644 index 0000000000000000000000000000000000000000..b7110b5810ad7ed5adf6c79f28b42dec9d24258a GIT binary patch literal 588 zcmV-S0<--eiwFP!000000IinKj+-zL#s_R?fvDR{|2;-8z3jQ?s#2xBA_peL3b7;G zTekaPeZCqt5K4d@sXG#ikiYrO*xv*>14w~8^@I!n+Go@MrjVfa$}4oxMhcrb?Z~{jVIDJGbnrKEdtrZhEjKJXpjv#RQ zhzWkh1i#iejKJXpjv#ObO9_54f?sPKM&NJ)M-VuDaDrc);MW?55jdQ{5d=;jg5Z}R z__fAi1P&)~#4INRrgxsf_D5k&UEj<4pk>laq@7i^yJ` z$X}f(W{KC{cm9twY(WzdH1Ucip3(3H4kK{J8nM6`?|rkt8EbB4e4c8O8RuTo2!f{X zXFT`m0%xkZImsHm$M))wCBVPQBf_Vn(pXrz_jgUDJm!VbVPZm3uXuM+IBlA|yMKhC z%f4H4Lfc+V5_sdhDh|K%o$=lrLF{GiFc9Qp7`f;vf$S{s=5$^i3cNp0XdUWEoA-k{ zsUTb>PY7FWtgmus9(*+rZZ9obsp@Ge-^&6+)!G=FgkvxbS}cbqH(^=npTJQ%KQP~3 zm^J=Fdj;*(TpNvTb6r3ETi0WIqbu7pXmBL#ibM2ysPl2uJC@D|S>7m%3;WNW_y13; zFKqvunYKB3+svqqFkd@a92#j$H}&O1|K%{+w;vX?ISEg;<#{+BuL^c)()wKLqB1rN a_4cdu@*b^IMu$JeANULV-~VVc3jhGv0vEsl literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cart_assembler/modes.nbt b/src/main/resources/ponder/cart_assembler/modes.nbt new file mode 100644 index 0000000000000000000000000000000000000000..a287d78be02d3c9376c40ca33313dea24740ec5a GIT binary patch literal 561 zcmV-10?z#(iwFP!000000F{+ZkDD+MhR4`sfvws-RJ;8Hz4yH5UV4ct_2Y^hm@L*3 z8`*A&`osGBY9M?p0oHXCMULNjJo9=C2|x_Yh(AaHp!tUVZwwJiE37~R&4^)lC{^}s z5;yr61Fe+lgN8vNG?rVuL`*egK|^Mmz=K0QILw3753<1_3z|76@ZeAn4)fsjBk=G! z@bGzyLp?amgEJh3htJf*=PeHP;4lwPKbVKl%){p`4)x%$MNR@#9xR1uk7xT`WY5i? zA%x#5#JnvLqOV##X*BH>CUCcRE2drlQRR+9A_zndZ!(Q;_Lyr?mJ2lmGrxk%-Z6w< zES|atM2EUN35l8JNBel-TH_o?7jSgJTGACTXxNH|Y-s3$CS2hJ9-OIWx5Am$b+cgQ zTobMAwWVSI!I`#9>^?UYFVR|Tp5jRaY|l>!AI3wg3t=(MlyoiOf_laKQDLO2)Am*1 zx*%~4R-ta*5)tfSdGRGp%0hlI$>6DDKcKBU7xK)hf--#K)EhIJSmo0|iw_~v8;wqH61ki0*Dy1W5l&Vp?i_~Q>sSf$1x_2Y9#NVi| zpskuoC9z4a&8MHWIX17~+|4@E`lWVrAfHATC%L;jY@IBvg~pZoldk?3slHPFB{FVe z(ibQAns59p43P7nzwb}H3FF$PTxNyRt|xClbIX6CHbP0)vwz_q^2!9~fd~KqGffT_ literal 0 HcmV?d00001 diff --git a/src/main/resources/ponder/cart_assembler/rails.nbt b/src/main/resources/ponder/cart_assembler/rails.nbt new file mode 100644 index 0000000000000000000000000000000000000000..783075672ad7036741efce223c0d5cb23664bbf1 GIT binary patch literal 662 zcmV;H0%`ppiwFP!000000Hv1Aa?>yrg|96swNof8_rtKCL=#2w zNGfT0FrJTVCr*s(hRdLg$K&YeyRy%b>^VRQGMb+#0H8f)bjbExLV+%sWH3V8N|@bR zU$5hwEP+lHsm6dqy+dVa_Jf zn2l-`6KVXLCTC~_Ln9d)^$)d%E3u^CS)(ncgzZazUVyyR8-x!>Kej8Au&TWyziCjf zcym-l=eJe&DlJgRWMB~7q? zxunJ0^ZQ9F=R;Z%Fg-R1vq=BhV}U1m9-$>skeJr{P>=E6q>Z1snS w7XyMePps=bI_Tf^p0~qvNR@W=$_L8q`4^q^4TfmEqfGyT-_^r@ Date: Thu, 18 Mar 2021 18:43:25 +0800 Subject: [PATCH 122/124] Add extra item capability checks Many mods does not invalidate their capabilities, so fix it on our end --- .../crafter/MechanicalCrafterBlock.java | 10 ++++++ .../belts/tunnel/BeltTunnelTileEntity.java | 1 - .../block/chute/AbstractChuteBlock.java | 6 ++-- .../block/chute/ChuteTileEntity.java | 1 + .../block/funnel/AbstractFunnelBlock.java | 3 ++ .../block/funnel/FunnelTileEntity.java | 3 -- .../inventories/AdjustableCrateBlock.java | 2 +- .../block/redstone/ContentObserverBlock.java | 9 ++++++ .../redstone/StockpileSwitchTileEntity.java | 1 + .../schematics/block/SchematicannonBlock.java | 6 ++++ .../block/SchematicannonTileEntity.java | 31 ++++++++++++------- .../tileEntity/TileEntityBehaviour.java | 3 +- .../inventory/InvManipulationBehaviour.java | 9 +++++- 13 files changed, 63 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java index a8de2ec50..7f4c9d899 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/crafter/MechanicalCrafterBlock.java @@ -8,6 +8,8 @@ import com.simibubi.create.content.contraptions.base.KineticTileEntity; import com.simibubi.create.content.contraptions.components.crafter.ConnectedInputHandler.ConnectedInput; import com.simibubi.create.content.contraptions.components.crafter.MechanicalCrafterTileEntity.Phase; import com.simibubi.create.foundation.block.ITE; +import com.simibubi.create.foundation.tileEntity.TileEntityBehaviour; +import com.simibubi.create.foundation.tileEntity.behaviour.inventory.InvManipulationBehaviour; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.Pointing; @@ -234,6 +236,14 @@ public class MechanicalCrafterBlock extends HorizontalKineticBlock implements IT return ActionResultType.PASS; } + @Override + public void neighborChanged(BlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos, + boolean isMoving) { + InvManipulationBehaviour behaviour = TileEntityBehaviour.get(worldIn, pos, InvManipulationBehaviour.TYPE); + if (behaviour != null) + behaviour.onNeighborChanged(fromPos); + } + @Override public float getParticleTargetRadius() { return .85f; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java index 943b9eb69..c1a58610f 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/belts/tunnel/BeltTunnelTileEntity.java @@ -2,7 +2,6 @@ package com.simibubi.create.content.logistics.block.belts.tunnel; import java.util.*; -import com.simibubi.create.CreateClient; import com.simibubi.create.content.logistics.packet.TunnelFlapPacket; import com.simibubi.create.foundation.gui.widgets.InterpolatedChasingValue; import com.simibubi.create.foundation.networking.AllPackets; diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java index 513a0c454..33c5c818b 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/AbstractChuteBlock.java @@ -29,6 +29,7 @@ import net.minecraft.world.IWorld; import net.minecraft.world.World; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.util.LazyOptional; public abstract class AbstractChuteBlock extends Block implements IWrenchable, ITE { @@ -156,9 +157,10 @@ public abstract class AbstractChuteBlock extends Block implements IWrenchable, I @Override public void neighborChanged(BlockState p_220069_1_, World world, BlockPos pos, Block p_220069_4_, BlockPos neighbourPos, boolean p_220069_6_) { - if (pos.down() - .equals(neighbourPos)) + if (pos.down().equals(neighbourPos)) withTileEntityDo(world, pos, ChuteTileEntity::blockBelowChanged); + else if (pos.up().equals(neighbourPos)) + withTileEntityDo(world, pos, chute -> chute.capAbove = LazyOptional.empty()); } public abstract BlockState updateChuteState(BlockState state, BlockState above, IBlockReader world, BlockPos pos); diff --git a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java index fac939e92..605e2e19e 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/chute/ChuteTileEntity.java @@ -272,6 +272,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor public void blockBelowChanged() { updateAirFlow = true; + capBelow = LazyOptional.empty(); } private void spawnParticles(float itemMotion) { diff --git a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java index 1b7ec9b39..68c43bc22 100644 --- a/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java +++ b/src/main/java/com/simibubi/create/content/logistics/block/funnel/AbstractFunnelBlock.java @@ -59,6 +59,9 @@ public abstract class AbstractFunnelBlock extends Block implements ITE te.neighbourCheckCooldown = 0); + } + } diff --git a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java index 77b8d69f4..e3317d9aa 100644 --- a/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java +++ b/src/main/java/com/simibubi/create/content/schematics/block/SchematicannonTileEntity.java @@ -1,5 +1,6 @@ package com.simibubi.create.content.schematics.block; +import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -9,7 +10,6 @@ import com.simibubi.create.AllBlocks; import com.simibubi.create.AllItems; import com.simibubi.create.AllSoundEvents; import com.simibubi.create.AllTags.AllBlockTags; -import com.simibubi.create.CreateClient; 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.BeltSlope; @@ -65,10 +65,10 @@ import net.minecraft.world.gen.feature.template.Template; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.util.LazyOptional; -import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.EmptyHandler; public class SchematicannonTileEntity extends SmartTileEntity implements INamedContainerProvider, IInstanceRendered { @@ -102,7 +102,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC public BlockPos target; public BlockPos previousTarget; - public List attachedInventories; + public LinkedHashSet> attachedInventories; public List flyingBlocks; public MaterialChecklist checklist; @@ -137,14 +137,13 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC public SchematicannonTileEntity(TileEntityType tileEntityTypeIn) { super(tileEntityTypeIn); setLazyTickRate(30); - attachedInventories = new LinkedList<>(); + attachedInventories = new LinkedHashSet<>(); flyingBlocks = new LinkedList<>(); inventory = new SchematicannonInventory(this); statusMsg = "idle"; state = State.STOPPED; printingEntityIndex = -1; replaceMode = 2; - neighbourCheckCooldown = NEIGHBOUR_CHECKING; checklist = new MaterialChecklist(); } @@ -164,7 +163,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC LazyOptional capability = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, facing.getOpposite()); if (capability.isPresent()) { - attachedInventories.add(capability.orElse(null)); + attachedInventories.add(capability); } } } @@ -288,7 +287,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC public void tick() { super.tick(); - if (neighbourCheckCooldown-- <= 0) { + if (state != State.STOPPED && neighbourCheckCooldown-- <= 0) { neighbourCheckCooldown = NEIGHBOUR_CHECKING; findInventories(); } @@ -577,9 +576,12 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (hasCreativeCrate) return true; + attachedInventories.removeIf(cap -> !cap.isPresent()); + // Find and apply damage if (usage == ItemUseType.DAMAGE) { - for (IItemHandler iItemHandler : attachedInventories) { + for (LazyOptional cap : attachedInventories) { + IItemHandler iItemHandler = cap.orElse(EmptyHandler.INSTANCE); for (int slot = 0; slot < iItemHandler.getSlots(); slot++) { ItemStack extractItem = iItemHandler.extractItem(slot, 1, true); if (!ItemRequirement.validate(required, extractItem)) @@ -608,8 +610,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC boolean success = false; if (usage == ItemUseType.CONSUME) { int amountFound = 0; - for (IItemHandler iItemHandler : attachedInventories) { - + for (LazyOptional cap : attachedInventories) { + IItemHandler iItemHandler = cap.orElse(EmptyHandler.INSTANCE); amountFound += ItemHelper .extract(iItemHandler, s -> ItemRequirement.validate(required, s), ExtractionCountMode.UPTO, required.getCount(), true) @@ -625,7 +627,8 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC if (!simulate && success) { int amountFound = 0; - for (IItemHandler iItemHandler : attachedInventories) { + for (LazyOptional cap : attachedInventories) { + IItemHandler iItemHandler = cap.orElse(EmptyHandler.INSTANCE); amountFound += ItemHelper .extract(iItemHandler, s -> ItemRequirement.validate(required, s), ExtractionCountMode.UPTO, required.getCount(), false) @@ -916,7 +919,11 @@ public class SchematicannonTileEntity extends SmartTileEntity implements INamedC } } checklist.gathered.clear(); - for (IItemHandler inventory : attachedInventories) { + findInventories(); + for (LazyOptional cap : attachedInventories) { + if (!cap.isPresent()) + continue; + IItemHandler inventory = cap.orElse(EmptyHandler.INSTANCE); for (int slot = 0; slot < inventory.getSlots(); slot++) { ItemStack stackInSlot = inventory.getStackInSlot(slot); if (inventory.extractItem(slot, 1, true) diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java index af79b9005..859346c4a 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/TileEntityBehaviour.java @@ -5,7 +5,6 @@ import com.simibubi.create.foundation.tileEntity.behaviour.BehaviourType; import net.minecraft.block.BlockState; import net.minecraft.nbt.CompoundNBT; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Direction; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockReader; import net.minecraft.world.World; @@ -47,7 +46,7 @@ public abstract class TileEntityBehaviour { } - public void onNeighborChanged(Direction direction) { + public void onNeighborChanged(BlockPos neighborPos) { } diff --git a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java index 04e57538d..2741bbaa1 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/behaviour/inventory/InvManipulationBehaviour.java @@ -138,6 +138,13 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { findNewNextTick = true; } + @Override + public void onNeighborChanged(BlockPos neighborPos) { + BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState()); + if (targetBlockFace.getConnectedPos().equals(neighborPos)) + onHandlerInvalidated(targetCapability); + } + protected void onHandlerInvalidated(LazyOptional handler) { findNewNextTick = true; targetCapability = LazyOptional.empty(); @@ -167,7 +174,7 @@ public class InvManipulationBehaviour extends TileEntityBehaviour { return amount; } - protected void findNewCapability() { + public void findNewCapability() { BlockFace targetBlockFace = target.getTarget(getWorld(), tileEntity.getPos(), tileEntity.getBlockState()) .getOpposite(); BlockPos pos = targetBlockFace.getPos(); From 7954aed0fd67f5d42f7274af504d2f632c615294 Mon Sep 17 00:00:00 2001 From: Snownee Date: Thu, 18 Mar 2021 23:26:15 +0800 Subject: [PATCH 123/124] Disassemble contraption when bearing block being rotated by wrench --- .../structureMovement/bearing/BearingBlock.java | 14 ++++++++++++++ .../bearing/ClockworkBearingBlock.java | 9 +++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java index e35a06e2d..66e55acbe 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/BearingBlock.java @@ -3,6 +3,9 @@ package com.simibubi.create.content.contraptions.components.structureMovement.be import com.simibubi.create.content.contraptions.base.DirectionalKineticBlock; import net.minecraft.block.BlockState; +import net.minecraft.item.ItemUseContext; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ActionResultType; import net.minecraft.util.Direction; import net.minecraft.util.Direction.Axis; import net.minecraft.util.math.BlockPos; @@ -29,4 +32,15 @@ public abstract class BearingBlock extends DirectionalKineticBlock { return true; } + @Override + public ActionResultType onWrenched(BlockState state, ItemUseContext context) { + ActionResultType resultType = super.onWrenched(state, context); + if (!context.getWorld().isRemote && resultType.isAccepted()) { + TileEntity te = context.getWorld().getTileEntity(context.getPos()); + if (te instanceof MechanicalBearingTileEntity) { + ((MechanicalBearingTileEntity) te).disassemble(); + } + } + return resultType; + } } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java index 18112fbfa..125950656 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/structureMovement/bearing/ClockworkBearingBlock.java @@ -5,6 +5,7 @@ import com.simibubi.create.foundation.block.ITE; import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.item.ItemUseContext; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ActionResultType; import net.minecraft.util.Hand; @@ -51,4 +52,12 @@ public class ClockworkBearingBlock extends BearingBlock implements ITE Date: Thu, 18 Mar 2021 14:36:37 -0700 Subject: [PATCH 124/124] Includes, quaternions, and frames. - Shaders can now reference other files with #flwinclude <"...">. - Shaders are now located in assets/flywheel/shaders. - Include paths are namespaced (a la ResourceLocation) and relative to the flywheel shaders root folder. - Optimized glsl rotations using quaternions (when applicable) and vectorized matrix construction. - Vectorize diffuse lighting calculations. - Micro optimization in SmartTileEntity.java --- .../actors/ActorVertexAttributes.java | 2 +- .../actors/ContraptionActorData.java | 24 +-- .../components/actors/DrillActorInstance.java | 14 +- .../actors/HarvesterActorInstance.java | 4 +- .../components/deployer/DeployerInstance.java | 28 ++- .../contraptions/relays/belt/BeltData.java | 19 +- .../relays/belt/BeltInstance.java | 17 +- .../relays/belt/BeltVertexAttributes.java | 2 +- .../foundation/render/AllProgramSpecs.java | 2 +- .../foundation/render/backend/Backend.java | 88 +------- .../render/backend/ShaderLoader.java | 202 ++++++++++++++++++ .../backend/ShaderLoadingException.java | 23 ++ .../backend/gl/attrib/CommonAttributes.java | 1 + .../render/backend/gl/shader/GlShader.java | 9 +- .../tileEntity/SmartTileEntity.java | 4 +- .../{shader => flywheel/shaders}/belt.vert | 54 ++--- .../shaders}/contraption.frag | 0 .../flywheel/shaders/contraption_actor.vert | 71 ++++++ .../shaders}/contraption_structure.vert | 21 +- .../create/flywheel/shaders/core/diffuse.glsl | 5 + .../flywheel/shaders/core/matutils.glsl | 42 ++++ .../flywheel/shaders/core/quaternion.glsl | 56 +++++ .../{shader => flywheel/shaders}/flap.vert | 45 ++-- .../{shader => flywheel/shaders}/model.frag | 0 .../{shader => flywheel/shaders}/model.vert | 20 +- .../create/flywheel/shaders/rotating.vert | 82 +++++++ .../create/shader/contraption_actor.vert | 94 -------- .../assets/create/shader/rotating.vert | 108 ---------- 28 files changed, 590 insertions(+), 447 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java create mode 100644 src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java rename src/main/resources/assets/create/{shader => flywheel/shaders}/belt.vert (52%) rename src/main/resources/assets/create/{shader => flywheel/shaders}/contraption.frag (100%) create mode 100644 src/main/resources/assets/create/flywheel/shaders/contraption_actor.vert rename src/main/resources/assets/create/{shader => flywheel/shaders}/contraption_structure.vert (56%) create mode 100644 src/main/resources/assets/create/flywheel/shaders/core/diffuse.glsl create mode 100644 src/main/resources/assets/create/flywheel/shaders/core/matutils.glsl create mode 100644 src/main/resources/assets/create/flywheel/shaders/core/quaternion.glsl rename src/main/resources/assets/create/{shader => flywheel/shaders}/flap.vert (54%) rename src/main/resources/assets/create/{shader => flywheel/shaders}/model.frag (100%) rename src/main/resources/assets/create/{shader => flywheel/shaders}/model.vert (73%) create mode 100644 src/main/resources/assets/create/flywheel/shaders/rotating.vert delete mode 100644 src/main/resources/assets/create/shader/contraption_actor.vert delete mode 100644 src/main/resources/assets/create/shader/rotating.vert diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java index a118962b4..ff633d817 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ActorVertexAttributes.java @@ -10,7 +10,7 @@ public enum ActorVertexAttributes implements IVertexAttrib { LIGHT("aModelLight", CommonAttributes.LIGHT), OFFSET("aOffset", CommonAttributes.FLOAT), AXIS("aAxis", CommonAttributes.NORMAL), - INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), + INSTANCE_ROTATION("aInstanceRot", CommonAttributes.QUATERNION), ROTATION_CENTER("aRotationCenter", CommonAttributes.NORMAL), SPEED("aSpeed", CommonAttributes.FLOAT), ; diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java index 6e41d205c..719825e17 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/ContraptionActorData.java @@ -6,6 +6,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstanceData; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.Quaternion; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.math.BlockPos; @@ -23,9 +24,10 @@ public class ContraptionActorData extends InstanceData { private byte rotationAxisX; private byte rotationAxisY; private byte rotationAxisZ; - private float localRotationX; - private float localRotationY; - private float localRotationZ; + private float qX; + private float qY; + private float qZ; + private float qW; private byte rotationCenterX = 64; private byte rotationCenterY = 64; private byte rotationCenterZ = 64; @@ -88,15 +90,11 @@ public class ContraptionActorData extends InstanceData { return this; } - public ContraptionActorData setLocalRotation(Vector3f axis) { - setLocalRotation(axis.getX(), axis.getY(), axis.getZ()); - return this; - } - - public ContraptionActorData setLocalRotation(float localRotationX, float localRotationY, float localRotationZ) { - this.localRotationX = localRotationX; - this.localRotationY = localRotationY; - this.localRotationZ = localRotationZ; + public ContraptionActorData setLocalRotation(Quaternion q) { + this.qX = q.getX(); + this.qY = q.getY(); + this.qZ = q.getZ(); + this.qW = q.getW(); return this; } @@ -106,7 +104,7 @@ public class ContraptionActorData extends InstanceData { putVec2(buf, blockLight, skyLight); put(buf, rotationOffset); putVec3(buf, rotationAxisX, rotationAxisY, rotationAxisZ); - putVec3(buf, localRotationX, localRotationY, localRotationZ); + putVec4(buf, qX, qY, qZ, qW); putVec3(buf, rotationCenterX, rotationCenterY, rotationCenterZ); put(buf, speed); diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java index 958670ede..525b3e4bb 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/DrillActorInstance.java @@ -10,6 +10,7 @@ import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.VecHelper; import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.Quaternion; import net.minecraft.util.Direction; public class DrillActorInstance extends ActorInstance { @@ -25,8 +26,15 @@ public class DrillActorInstance extends ActorInstance { BlockState state = context.state; facing = state.get(DrillBlock.FACING); - float eulerX = AngleHelper.verticalAngle(facing) + ((facing.getAxis() == Direction.Axis.Y) ? 180 : 0); - float eulerY = facing.getHorizontalAngle(); + + Direction.Axis axis = facing.getAxis(); + float eulerX = AngleHelper.verticalAngle(facing); + + float eulerY; + if (axis == Direction.Axis.Y) + eulerY = 0; + else + eulerY = facing.getHorizontalAngle() + ((axis == Direction.Axis.X) ? 180 : 0); drillHead = renderMaterial.getModel(AllBlockPartials.DRILL_HEAD, state).createInstance(); @@ -35,7 +43,7 @@ public class DrillActorInstance extends ActorInstance { .setBlockLight(localBlockLight()) .setRotationOffset(0) .setRotationAxis(0, 0, 1) - .setLocalRotation(eulerX, eulerY, 0) + .setLocalRotation(new Quaternion(eulerX, eulerY, 0, true)) .setSpeed(getSpeed(facing)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java index f0431d63a..16a07d2a6 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/actors/HarvesterActorInstance.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.RenderMaterial; import net.minecraft.block.BlockState; +import net.minecraft.client.renderer.Quaternion; import net.minecraft.client.renderer.Vector3f; import net.minecraft.util.Direction; import net.minecraft.world.LightType; @@ -32,13 +33,14 @@ public class HarvesterActorInstance extends ActorInstance { harvester = renderMaterial.getModel(AllBlockPartials.HARVESTER_BLADE, state).createInstance(); + float horizontalAngle = facing.getHorizontalAngle() + ((facing.getAxis() == Direction.Axis.X) ? 180 : 0); harvester.getInstance() .setPosition(context.localPos) .setBlockLight(localBlockLight()) .setRotationOffset(0) .setRotationCenter(rotOffset) .setRotationAxis(-1, 0, 0) - .setLocalRotation(0, facing.getHorizontalAngle(), 0) + .setLocalRotation(new Quaternion(Vector3f.POSITIVE_Y, horizontalAngle, true)) .setSpeed(getSpeed(facing)); } diff --git a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java index 8ac245d1c..bb12c93dd 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/components/deployer/DeployerInstance.java @@ -31,6 +31,8 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance float zRot; float zRotPole; + float progress = Float.NaN; + public DeployerInstance(InstancedTileRenderer dispatcher, KineticTileEntity tile) { super(dispatcher, tile); } @@ -57,13 +59,19 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance @Override public void tick() { - updateHandPose(); + boolean newHand = updateHandPose(); + + float newProgress = getProgress(AnimationTickHolder.getPartialTicks()); + + if (!newHand && MathHelper.epsilonEquals(newProgress, progress)) return; + + progress = newProgress; MatrixStack ms = new MatrixStack(); MatrixStacker msr = MatrixStacker.of(ms); msr.translate(getFloatingPos()) - .translate(getHandOffset(AnimationTickHolder.getPartialTicks())); + .translate(getHandOffset()); transformModel(msr, pole, hand, yRot, zRot, zRotPole); @@ -99,13 +107,7 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance return true; } - protected Vec3d getHandOffset(float partialTicks) { - float progress = 0; - if (tile.state == DeployerTileEntity.State.EXPANDING) - progress = 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; - if (tile.state == DeployerTileEntity.State.RETRACTING) - progress = (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; - + protected Vec3d getHandOffset() { float handLength = tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_POINTING ? 0 : tile.getHandPose() == AllBlockPartials.DEPLOYER_HAND_HOLDING ? 4 / 16f : 3 / 16f; float distance = Math.min(MathHelper.clamp(progress, 0, 1) * (tile.reach + handLength), 21 / 16f); @@ -113,6 +115,14 @@ public class DeployerInstance extends ShaftInstance implements ITickableInstance return offset; } + private float getProgress(float partialTicks) { + if (tile.state == DeployerTileEntity.State.EXPANDING) + return 1 - (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + if (tile.state == DeployerTileEntity.State.RETRACTING) + return (tile.timer - partialTicks * tile.getTimerSpeed()) / 1000f; + return 0; + } + static void transformModel(MatrixStacker msr, InstanceKey pole, InstanceKey hand, float yRot, float zRot, float zRotPole) { msr.centre(); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java index 9f6db3daf..610b71f4e 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltData.java @@ -8,6 +8,7 @@ import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexFormat; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; +import net.minecraft.client.renderer.Quaternion; import net.minecraft.client.renderer.texture.TextureAtlasSprite; public class BeltData extends KineticData { @@ -16,9 +17,10 @@ public class BeltData extends KineticData { .addAttributes(BeltVertexAttributes.class) .build(); - private float rotX; - private float rotY; - private float rotZ; + private float qX; + private float qY; + private float qZ; + private float qW; private float sourceU; private float sourceV; private float minU; @@ -31,10 +33,11 @@ public class BeltData extends KineticData { super(owner); } - public BeltData setRotation(float rotX, float rotY, float rotZ) { - this.rotX = rotX; - this.rotY = rotY; - this.rotZ = rotZ; + public BeltData setRotation(Quaternion q) { + this.qX = q.getX(); + this.qY = q.getY(); + this.qZ = q.getZ(); + this.qW = q.getW(); return this; } @@ -61,7 +64,7 @@ public class BeltData extends KineticData { public void write(ByteBuffer buf) { super.write(buf); - putVec3(buf, rotX, rotY, rotZ); + putVec4(buf, qX, qY, qZ, qW); putVec2(buf, sourceU, sourceV); putVec4(buf, minU, minV, maxU, maxV); diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java index ed4794e76..1891a7a2b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltInstance.java @@ -13,9 +13,11 @@ import com.simibubi.create.foundation.block.render.SpriteShiftEntry; import com.simibubi.create.foundation.render.backend.instancing.InstanceKey; import com.simibubi.create.foundation.render.backend.instancing.InstancedModel; import com.simibubi.create.foundation.render.backend.instancing.InstancedTileRenderer; +import com.simibubi.create.foundation.utility.AngleHelper; import com.simibubi.create.foundation.utility.Iterate; import com.simibubi.create.foundation.utility.MatrixStacker; +import net.minecraft.client.renderer.Quaternion; import net.minecraft.item.DyeColor; import net.minecraft.util.Direction; import net.minecraft.world.LightType; @@ -114,10 +116,10 @@ public class BeltInstance extends KineticTileInstance { private float getScrollSpeed() { float speed = tile.getSpeed(); if (((facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ^ upward) ^ - ((alongX && !diagonal) || (alongZ && diagonal)) ^ (vertical && facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE)) { + ((alongX && !diagonal) || (alongZ && diagonal))) { speed = -speed; } - if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST)) + if (sideways && (facing == Direction.SOUTH || facing == Direction.WEST) || (vertical && facing == Direction.EAST)) speed = -speed; return speed; @@ -155,15 +157,18 @@ public class BeltInstance extends KineticTileInstance { } private InstanceKey setup(InstanceKey key, boolean bottom, SpriteShiftEntry spriteShift) { - float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (beltSlope == BeltSlope.DOWNWARD ? 180 : 0); - float rotY = facing.getHorizontalAngle() + (upward ? 180 : 0) + (sideways ? 90 : 0); - float rotZ = sideways ? 90 : ((vertical && facing.getAxisDirection() == Direction.AxisDirection.NEGATIVE) ? 180 : 0); + boolean downward = beltSlope == BeltSlope.DOWNWARD; + float rotX = (!diagonal && beltSlope != BeltSlope.HORIZONTAL ? 90 : 0) + (downward ? 180 : 0) + (sideways ? 90 : 0) + (vertical && alongZ ? 180 : 0); + float rotY = facing.getHorizontalAngle() + ((diagonal ^ alongX) && !downward ? 180 : 0) + (sideways && alongZ ? 180 : 0) + (vertical && alongX ? 90 : 0); + float rotZ = (sideways ? 90 : 0) + (vertical && alongX ? 90 : 0); + + Quaternion q = new Quaternion(rotX, rotY, rotZ, true); key.getInstance() .setTileEntity(tile) .setBlockLight(world.getLightLevel(LightType.BLOCK, pos)) .setSkyLight(world.getLightLevel(LightType.SKY, pos)) - .setRotation(rotX, rotY, rotZ) + .setRotation(q) .setRotationalSpeed(getScrollSpeed()) .setRotationOffset(bottom ? 0.5f : 0f) .setScrollTexture(spriteShift) diff --git a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java index 678b29c73..b5888c49b 100644 --- a/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java +++ b/src/main/java/com/simibubi/create/content/contraptions/relays/belt/BeltVertexAttributes.java @@ -6,7 +6,7 @@ import com.simibubi.create.foundation.render.backend.gl.attrib.IVertexAttrib; import com.simibubi.create.foundation.render.backend.gl.attrib.VertexAttribSpec; public enum BeltVertexAttributes implements IVertexAttrib { - INSTANCE_ROTATION("aInstanceRot", CommonAttributes.VEC3), + INSTANCE_ROTATION("aInstanceRot", CommonAttributes.QUATERNION), SOURCE_TEX("aSourceTexture", CommonAttributes.UV), SCROLL_TEX("aScrollTexture", CommonAttributes.VEC4), SCROLL_MULT("aScrollMult", CommonAttributes.NORMALIZED_BYTE), diff --git a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java index 916d8c478..485eb3889 100644 --- a/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java +++ b/src/main/java/com/simibubi/create/foundation/render/AllProgramSpecs.java @@ -108,7 +108,7 @@ public class AllProgramSpecs { private static ResourceLocation loc(String name) { - return new ResourceLocation(Create.ID, "shader/" + name); + return new ResourceLocation(Create.ID, name); } } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java index 9d718384e..3c3891c17 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/Backend.java @@ -1,36 +1,26 @@ package com.simibubi.create.foundation.render.backend; -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; import java.nio.FloatBuffer; -import java.util.EnumMap; import java.util.HashMap; import java.util.Map; -import java.util.function.Predicate; import com.simibubi.create.foundation.render.backend.gl.GlFog; -import com.simibubi.create.foundation.render.backend.gl.GlFogMode; import com.simibubi.create.foundation.render.backend.gl.shader.*; import com.simibubi.create.foundation.render.backend.gl.versioned.GlFeatureCompat; import com.simibubi.create.foundation.render.backend.instancing.IFlywheelWorld; import net.minecraft.world.World; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.lwjgl.opengl.GL; import org.lwjgl.opengl.GLCapabilities; import org.lwjgl.system.MemoryUtil; import com.simibubi.create.foundation.config.AllConfigs; import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.resources.IReloadableResourceManager; import net.minecraft.resources.IResourceManager; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.resource.IResourceType; import net.minecraftforge.resource.ISelectiveResourceReloadListener; -import net.minecraftforge.resource.VanillaResourceType; public class Backend { public static final Boolean SHADER_DEBUG_OUTPUT = true; @@ -38,8 +28,8 @@ public class Backend { public static final Logger log = LogManager.getLogger(Backend.class); public static final FloatBuffer MATRIX_BUFFER = MemoryUtil.memAllocFloat(16); - private static final Map> registry = new HashMap<>(); - private static final Map, ProgramGroup> programs = new HashMap<>(); + static final Map> registry = new HashMap<>(); + static final Map, ProgramGroup> programs = new HashMap<>(); private static boolean enabled; @@ -102,85 +92,13 @@ public class Backend { IResourceManager manager = mc.getResourceManager(); if (manager instanceof IReloadableResourceManager) { - ISelectiveResourceReloadListener listener = Backend::onResourceManagerReload; + ISelectiveResourceReloadListener listener = ShaderLoader::onResourceManagerReload; ((IReloadableResourceManager) manager).addReloadListener(listener); } } - private static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { - if (predicate.test(VanillaResourceType.SHADERS)) { - capabilities = GL.createCapabilities(); - compat = new GlFeatureCompat(capabilities); - - OptifineHandler.refresh(); - refresh(); - - if (gl20()) { - - programs.values().forEach(ProgramGroup::delete); - programs.clear(); - for (ProgramSpec shader : registry.values()) { - loadProgram(manager, shader); - } - - log.info("Loaded all shader programs."); - } - } - } - public static void refresh() { enabled = AllConfigs.CLIENT.experimentalRendering.get() && !OptifineHandler.usingShaders(); } - private static

> void loadProgram(IResourceManager manager, S programSpec) { - try { - Map programGroup = new EnumMap<>(GlFogMode.class); - - for (GlFogMode fogMode : GlFogMode.values()) { - programGroup.put(fogMode, loadProgram(manager, programSpec, fogMode)); - } - - programs.put(programSpec, new ProgramGroup<>(programGroup)); - - log.debug("Loaded program {}", programSpec.name); - } catch (IOException ex) { - log.error("Failed to load program {}", programSpec.name, ex); - return; - } - } - - private static

> P loadProgram(IResourceManager manager, S programSpec, GlFogMode fogMode) throws IOException { - GlShader vert = null; - GlShader frag = null; - try { - ShaderConstants defines = new ShaderConstants(programSpec.defines); - - defines.defineAll(fogMode.getDefines()); - - vert = loadShader(manager, programSpec.getVert(), ShaderType.VERTEX, defines); - frag = loadShader(manager, programSpec.getFrag(), ShaderType.FRAGMENT, defines); - - GlProgram.Builder builder = GlProgram.builder(programSpec.name, fogMode).attachShader(vert).attachShader(frag); - - programSpec.attributes.forEach(builder::addAttribute); - - return builder.build(programSpec.factory); - - } finally { - if (vert != null) vert.delete(); - if (frag != null) frag.delete(); - } - } - - private static GlShader loadShader(IResourceManager manager, ResourceLocation name, ShaderType type, GlShader.PreProcessor preProcessor) throws IOException { - try (InputStream is = new BufferedInputStream(manager.getResource(name).getInputStream())) { - String source = TextureUtil.func_225687_b_(is); - - if (source == null) { - throw new IOException("Could not load program " + name); - } else { - return new GlShader(type, name, source, preProcessor); - } - } - } } diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java new file mode 100644 index 000000000..a9a4119e5 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoader.java @@ -0,0 +1,202 @@ +package com.simibubi.create.foundation.render.backend; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.render.backend.gl.GlFogMode; +import com.simibubi.create.foundation.render.backend.gl.shader.*; +import com.simibubi.create.foundation.render.backend.gl.versioned.GlFeatureCompat; +import net.minecraft.resources.IResource; +import net.minecraft.resources.IResourceManager; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.resource.IResourceType; +import net.minecraftforge.resource.VanillaResourceType; +import org.lwjgl.opengl.GL; +import org.lwjgl.system.MemoryUtil; + +import java.io.*; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; +import java.util.*; +import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ShaderLoader { + public static final String SHADER_DIR = "flywheel/shaders/"; + public static final ArrayList EXTENSIONS = Lists.newArrayList(".vert", ".vsh", ".frag", ".fsh", ".glsl"); + + static final Map shaderSource = new HashMap<>(); + + static void onResourceManagerReload(IResourceManager manager, Predicate predicate) { + if (predicate.test(VanillaResourceType.SHADERS)) { + Backend.capabilities = GL.createCapabilities(); + Backend.compat = new GlFeatureCompat(Backend.capabilities); + + OptifineHandler.refresh(); + Backend.refresh(); + + if (Backend.gl20()) { + shaderSource.clear(); + loadShaderSources(manager); + + Backend.programs.values().forEach(ProgramGroup::delete); + Backend.programs.clear(); + Backend.registry.values().forEach(ShaderLoader::loadProgram); + + Backend.log.info("Loaded all shader programs."); + } + } + } + + private static void loadShaderSources(IResourceManager manager){ + Collection allShaders = manager.getAllResourceLocations(SHADER_DIR, s -> { + for (String ext : EXTENSIONS) { + if (s.endsWith(ext)) return true; + } + return false; + }); + + for (ResourceLocation location : allShaders) { + try { + IResource resource = manager.getResource(location); + + String file = readToString(resource.getInputStream()); + + ResourceLocation name = new ResourceLocation(location.getNamespace(), + location.getPath().substring(SHADER_DIR.length())); + + shaderSource.put(name, file); + } catch (IOException e) { + + } + } + } + + static

> void loadProgram(S programSpec) { + Map programGroup = new EnumMap<>(GlFogMode.class); + + for (GlFogMode fogMode : GlFogMode.values()) { + programGroup.put(fogMode, loadProgram(programSpec, fogMode)); + } + + Backend.programs.put(programSpec, new ProgramGroup<>(programGroup)); + + Backend.log.debug("Loaded program {}", programSpec.name); + } + + private static

> P loadProgram(S programSpec, GlFogMode fogMode) { + GlShader vert = null; + GlShader frag = null; + try { + ShaderConstants defines = new ShaderConstants(programSpec.defines); + + defines.defineAll(fogMode.getDefines()); + + vert = loadShader(programSpec.getVert(), ShaderType.VERTEX, defines); + frag = loadShader(programSpec.getFrag(), ShaderType.FRAGMENT, defines); + + GlProgram.Builder builder = GlProgram.builder(programSpec.name, fogMode).attachShader(vert).attachShader(frag); + + programSpec.attributes.forEach(builder::addAttribute); + + return builder.build(programSpec.factory); + + } finally { + if (vert != null) vert.delete(); + if (frag != null) frag.delete(); + } + } + + private static final Pattern includePattern = Pattern.compile("#flwinclude <\"([\\w\\d_]+:[\\w\\d_./]+)\">"); + + private static String processIncludes(ResourceLocation baseName, String source) { + HashSet seen = new HashSet<>(); + seen.add(baseName); + + return includeRecursive(source, seen).collect(Collectors.joining("\n")); + } + + private static Stream includeRecursive(String source, Set seen) { + return new BufferedReader(new StringReader(source)).lines().flatMap(line -> { + + Matcher matcher = includePattern.matcher(line); + + if (matcher.find()) { + String includeName = matcher.group(1); + + ResourceLocation include = new ResourceLocation(includeName); + + if (seen.add(include)) { + String includeSource = shaderSource.get(include); + + if (includeSource != null) { + return includeRecursive(includeSource, seen); + } + } + } + + return Stream.of(line); + }); + } + + private static GlShader loadShader(ResourceLocation name, ShaderType type, ShaderConstants defines) { + String source = shaderSource.get(name); + + source = processIncludes(name, source); + + if (defines != null) + source = defines.process(source); + + + return new GlShader(type, name, source); + } + + public static String readToString(InputStream is) { + RenderSystem.assertThread(RenderSystem::isOnRenderThread); + ByteBuffer bytebuffer = null; + + try { + bytebuffer = readToBuffer(is); + int i = bytebuffer.position(); + ((Buffer)bytebuffer).rewind(); + return MemoryUtil.memASCII(bytebuffer, i); + } catch (IOException e) { + + } finally { + if (bytebuffer != null) { + MemoryUtil.memFree(bytebuffer); + } + + } + + return null; + } + + public static ByteBuffer readToBuffer(InputStream is) throws IOException { + ByteBuffer bytebuffer; + if (is instanceof FileInputStream) { + FileInputStream fileinputstream = (FileInputStream)is; + FileChannel filechannel = fileinputstream.getChannel(); + bytebuffer = MemoryUtil.memAlloc((int)filechannel.size() + 1); + + while (filechannel.read(bytebuffer) != -1) { } + } else { + bytebuffer = MemoryUtil.memAlloc(8192); + ReadableByteChannel readablebytechannel = Channels.newChannel(is); + + while (readablebytechannel.read(bytebuffer) != -1) { + if (bytebuffer.remaining() == 0) { + bytebuffer = MemoryUtil.memRealloc(bytebuffer, bytebuffer.capacity() * 2); + } + } + } + + return bytebuffer; + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java new file mode 100644 index 000000000..50b1c916a --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/render/backend/ShaderLoadingException.java @@ -0,0 +1,23 @@ +package com.simibubi.create.foundation.render.backend; + +public class ShaderLoadingException extends RuntimeException { + + public ShaderLoadingException() { + } + + public ShaderLoadingException(String message) { + super(message); + } + + public ShaderLoadingException(String message, Throwable cause) { + super(message, cause); + } + + public ShaderLoadingException(Throwable cause) { + super(cause); + } + + public ShaderLoadingException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java index f6daa58c6..acc24f822 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/attrib/CommonAttributes.java @@ -9,6 +9,7 @@ public class CommonAttributes { public static final VertexAttribSpec VEC2 = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); public static final VertexAttribSpec FLOAT = new VertexAttribSpec(GlPrimitiveType.FLOAT, 1); + public static final VertexAttribSpec QUATERNION = new VertexAttribSpec(GlPrimitiveType.FLOAT, 4); public static final VertexAttribSpec NORMAL = new VertexAttribSpec(GlPrimitiveType.BYTE, 3, true); public static final VertexAttribSpec UV = new VertexAttribSpec(GlPrimitiveType.FLOAT, 2); diff --git a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java index dae037bdb..922b81b47 100644 --- a/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java +++ b/src/main/java/com/simibubi/create/foundation/render/backend/gl/shader/GlShader.java @@ -12,18 +12,11 @@ public class GlShader extends GlObject { public final ResourceLocation name; public final ShaderType type; - public GlShader(ShaderType type, ResourceLocation name, String source, PreProcessor preProcessor) { + public GlShader(ShaderType type, ResourceLocation name, String source) { this.type = type; this.name = name; int handle = GL20.glCreateShader(type.glEnum); - if (preProcessor != null) { - source = preProcessor.process(source); - - if (Backend.SHADER_DEBUG_OUTPUT) - Backend.log.debug("Preprocessor run on " + name);// + ":\n" + source); - } - GL20.glShaderSource(handle, source); GL20.glCompileShader(handle); 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 57d2c92b0..9404b3544 100644 --- a/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java +++ b/src/main/java/com/simibubi/create/foundation/tileEntity/SmartTileEntity.java @@ -147,9 +147,7 @@ public abstract class SmartTileEntity extends SyncedTileEntity implements ITicka @SuppressWarnings("unchecked") public T getBehaviour(BehaviourType type) { - if (behaviours.containsKey(type)) - return (T) behaviours.get(type); - return null; + return (T) behaviours.get(type); } protected boolean isItemHandlerCap(Capability cap) { diff --git a/src/main/resources/assets/create/shader/belt.vert b/src/main/resources/assets/create/flywheel/shaders/belt.vert similarity index 52% rename from src/main/resources/assets/create/shader/belt.vert rename to src/main/resources/assets/create/flywheel/shaders/belt.vert index 81f9054d5..08e776ef6 100644 --- a/src/main/resources/assets/create/shader/belt.vert +++ b/src/main/resources/assets/create/flywheel/shaders/belt.vert @@ -1,6 +1,10 @@ #version 110 #define PI 3.1415926538 +#flwinclude <"create:core/quaternion.glsl"> +#flwinclude <"create:core/matutils.glsl"> +#flwinclude <"create:core/diffuse.glsl"> + attribute vec3 aPos; attribute vec3 aNormal; attribute vec2 aTexCoords; @@ -10,7 +14,7 @@ attribute vec2 aLight; attribute vec3 aNetworkTint; attribute float aSpeed; attribute float aOffset; -attribute vec3 aInstanceRot; +attribute vec4 aInstanceRot; attribute vec2 aSourceTexture; attribute vec4 aScrollTexture; attribute float aScrollMult; @@ -38,54 +42,24 @@ uniform vec3 uCameraPos; varying float FragDistance; #endif -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1. - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); -} - -mat4 rotation(vec3 rot) { - return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); -} - -mat4 localRotation() { - vec3 rot = fract(aInstanceRot / 360.) * PI * 2.; - return rotation(rot); -} - void main() { - mat4 localRotation = localRotation(); - vec4 worldPos = localRotation * vec4(aPos - .5, 1.) + vec4(aInstancePos + .5, 0.); + vec3 rotated = rotateVertexByQuat(aPos - .5, aInstanceRot) + aInstancePos + .5; - #ifdef CONTRAPTION + vec4 worldPos = vec4(rotated, 1.); + + vec3 norm = rotateVertexByQuat(aNormal, aInstanceRot); + +#ifdef CONTRAPTION worldPos = uModel * worldPos; - mat4 normalMat = uModel * localRotation; + norm = normalize(modelToNormal(uModel) * norm); BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; #if defined(USE_FOG) FragDistance = length(worldPos.xyz); #endif - #else - mat4 normalMat = localRotation; - - #if defined(USE_FOG) +#elif defined(USE_FOG) FragDistance = length(worldPos.xyz - uCameraPos); - #endif - #endif - - vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; +#endif float scrollSize = aScrollTexture.w - aScrollTexture.y; float scroll = fract(aSpeed * uTime / (31.5 * 16.) + aOffset) * scrollSize * aScrollMult; diff --git a/src/main/resources/assets/create/shader/contraption.frag b/src/main/resources/assets/create/flywheel/shaders/contraption.frag similarity index 100% rename from src/main/resources/assets/create/shader/contraption.frag rename to src/main/resources/assets/create/flywheel/shaders/contraption.frag diff --git a/src/main/resources/assets/create/flywheel/shaders/contraption_actor.vert b/src/main/resources/assets/create/flywheel/shaders/contraption_actor.vert new file mode 100644 index 000000000..b58a4df0e --- /dev/null +++ b/src/main/resources/assets/create/flywheel/shaders/contraption_actor.vert @@ -0,0 +1,71 @@ +#version 110 +#define PI 3.1415926538 + +#flwinclude <"create:core/matutils.glsl"> +#flwinclude <"create:core/quaternion.glsl"> +#flwinclude <"create:core/diffuse.glsl"> + +// model data +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; + +// instance data +attribute vec3 aInstancePos; +attribute vec2 aModelLight; +attribute float aOffset; +attribute vec3 aAxis; +attribute vec4 aInstanceRot; +attribute vec3 aRotationCenter; +attribute float aSpeed; + + +varying float Diffuse; +varying vec2 TexCoords; +varying vec4 Color; +varying vec3 BoxCoord; +varying vec2 Light; + +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; + +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; + +uniform vec3 uCameraPos; + +#if defined(USE_FOG) +varying float FragDistance; +#endif + +void main() { + float degrees = aOffset + uTime * aSpeed / 20.; + //float angle = fract(degrees / 360.) * PI * 2.; + + vec4 kineticRot = quat(aAxis, degrees); + vec3 rotated = rotateVertexByQuat(aPos - aRotationCenter, kineticRot) + aRotationCenter; + vec3 localPos = rotateVertexByQuat(rotated - .5, aInstanceRot) + aInstancePos + .5; + + vec4 worldPos = uModel * vec4(localPos, 1.); + + vec3 norm = rotateVertexByQuat(rotateVertexByQuat(aNormal, kineticRot), aInstanceRot); + norm = modelToNormal(uModel) * norm; + + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + Diffuse = diffuse(norm); + TexCoords = aTexCoords; + Light = aModelLight; + gl_Position = uViewProjection * worldPos; + + #if defined(USE_FOG) + FragDistance = length(worldPos.xyz); + #endif + + if (uDebug == 2) { + Color = vec4(norm, 1.); + } else { + Color = vec4(1.); + } +} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_structure.vert b/src/main/resources/assets/create/flywheel/shaders/contraption_structure.vert similarity index 56% rename from src/main/resources/assets/create/shader/contraption_structure.vert rename to src/main/resources/assets/create/flywheel/shaders/contraption_structure.vert index 0e053db27..dbcf4a595 100644 --- a/src/main/resources/assets/create/shader/contraption_structure.vert +++ b/src/main/resources/assets/create/flywheel/shaders/contraption_structure.vert @@ -1,6 +1,9 @@ #version 110 #define PI 3.1415926538 +#flwinclude <"create:core/matutils.glsl"> +#flwinclude <"create:core/diffuse.glsl"> + attribute vec3 aPos; attribute vec3 aNormal; attribute vec2 aTexCoords; @@ -27,24 +30,6 @@ uniform vec3 uCameraPos; varying float FragDistance; #endif -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1. - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); -} - void main() { vec4 viewPos = uModel * vec4(aPos, 1.); diff --git a/src/main/resources/assets/create/flywheel/shaders/core/diffuse.glsl b/src/main/resources/assets/create/flywheel/shaders/core/diffuse.glsl new file mode 100644 index 000000000..bc5792231 --- /dev/null +++ b/src/main/resources/assets/create/flywheel/shaders/core/diffuse.glsl @@ -0,0 +1,5 @@ + +float diffuse(vec3 normal) { + vec3 n2 = normal * normal * vec3(.6, .25, .8); + return min(n2.x + n2.y * (3. + normal.y) + n2.z, 1.); +} diff --git a/src/main/resources/assets/create/flywheel/shaders/core/matutils.glsl b/src/main/resources/assets/create/flywheel/shaders/core/matutils.glsl new file mode 100644 index 000000000..f7c846e71 --- /dev/null +++ b/src/main/resources/assets/create/flywheel/shaders/core/matutils.glsl @@ -0,0 +1,42 @@ + +//mat4 rotate(vec3 axis, float angle) { +// float s = sin(angle); +// float c = cos(angle); +// float oc = 1. - c; +// +// return mat4( +// oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., +// oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., +// oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., +// 0., 0., 0., 1. +// ); +//} + +mat4 rotate(vec3 axis, float angle) { + float s = sin(angle); + float c = cos(angle); + float oc = 1. - c; + + vec3 sa = axis * s; + + mat4 mr = mat4(1.); + mr[0].xyz = oc * axis.xxz * axis.xyx + vec3(c, sa.z, -sa.y); + mr[1].xyz = oc * axis.xyy * axis.yyz + vec3(-sa.z, c, sa.x); + mr[2].xyz = oc * axis.zyz * axis.xzz + vec3(sa.y, -sa.x, c); + + return mr; +} + +mat4 rotation(vec3 rot) { + return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); +} + +mat3 modelToNormal(mat4 mat) { + // Discard the edges. This won't be accurate for scaled or skewed matrices, + // but we don't have to work with those often. + mat3 m; + m[0] = mat[0].xyz; + m[1] = mat[1].xyz; + m[2] = mat[2].xyz; + return m; +} \ No newline at end of file diff --git a/src/main/resources/assets/create/flywheel/shaders/core/quaternion.glsl b/src/main/resources/assets/create/flywheel/shaders/core/quaternion.glsl new file mode 100644 index 000000000..cbfff38ee --- /dev/null +++ b/src/main/resources/assets/create/flywheel/shaders/core/quaternion.glsl @@ -0,0 +1,56 @@ + +#define PIOVER2 1.5707963268 + +vec4 quat(vec3 axis, float angle) { + float halfAngle = angle * PIOVER2 / 180.0; + vec2 cs = sin(vec2(PIOVER2 - halfAngle, halfAngle)); // compute sin and cos in one instruction + return vec4(axis.xyz * cs.y, cs.x); +} + +vec4 quatMult(vec4 q1, vec4 q2) { + // disgustingly vectorized quaternion multiplication + vec4 a = q1.w * q2.xyzw; + vec4 b = q1.x * q2.wzxy * vec4(1., -1., 1., -1.); + vec4 c = q1.y * q2.zwxy * vec4(1., 1., -1., -1.); + vec4 d = q1.z * q2.yxwz * vec4(-1., 1., 1., -1.); + + return a + b + c + d; +} +// +//vec4 exp(vec4 q) { +// vec3 i = q.xyz; +// float r = sqrt(dot(i, i)); +// float et = exp(q.w); +// float s = et * sin(r) / r; +// +// vec4 qr; +// qr.w = et * cos(r); +// qr.xyz = i * s; +// +// return qr; +//} +// +//vec4 ln(vec4 q) { +// vec3 i = q.xyz; +// float r = sqrt(dot(i, i)); +// float t = atan(r, q.w) / r; +// +// vec4 qr; +// qr.w = log(dot(q, q)) * 0.5; +// qr.xyz = i * t; +// +// return qr; +//} +// +//vec4 pow(vec4 q, float n) { +// return exp(ln(q) * n); +//} + +vec3 rotateVertexByQuat(vec3 v, vec4 q) { + vec3 i = q.xyz; + return v + 2.0 * cross(i, cross(i, v) + q.w * v); +} + +vec3 rotateAbout(vec3 v, vec3 axis, float angle) { + return rotateVertexByQuat(v, quat(axis, angle)); +} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/flap.vert b/src/main/resources/assets/create/flywheel/shaders/flap.vert similarity index 54% rename from src/main/resources/assets/create/shader/flap.vert rename to src/main/resources/assets/create/flywheel/shaders/flap.vert index a70fdf1ad..496051288 100644 --- a/src/main/resources/assets/create/shader/flap.vert +++ b/src/main/resources/assets/create/flywheel/shaders/flap.vert @@ -1,6 +1,10 @@ #version 110 #define PI 3.1415926538 +#flwinclude <"create:core/matutils.glsl"> +#flwinclude <"create:core/quaternion.glsl"> +#flwinclude <"create:core/diffuse.glsl"> + attribute vec3 aPos; attribute vec3 aNormal; attribute vec2 aTexCoords; @@ -40,24 +44,6 @@ uniform vec3 uCameraPos; varying float FragDistance; #endif -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); -} - -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1. - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); -} - float toRad(float degrees) { return fract(degrees / 360.) * PI * 2.; } @@ -72,35 +58,32 @@ float getFlapAngle() { float which = step(0., aFlapness); float degrees = which * halfAngle + (1. - which) * angle; // branchless conditional multiply - return -toRad(degrees); + return degrees; } void main() { float flapAngle = getFlapAngle(); - mat4 orientation = rotate(vec3(0., 1., 0.), toRad(aHorizontalAngle)); - mat4 flapRotation = rotate(vec3(1., 0., 0.), flapAngle); + vec4 orientation = quat(vec3(0., 1., 0.), -aHorizontalAngle); + vec4 flapRotation = quat(vec3(1., 0., 0.), flapAngle); - vec4 worldPos = flapRotation * vec4(aPos - aPivot, 1.) + vec4(aPivot + aSegmentOffset, 0.); - worldPos = orientation * vec4(worldPos.xyz - .5, 1.) + vec4(aInstancePos + .5, 0.); + vec3 rotated = rotateVertexByQuat(aPos - aPivot, flapRotation) + aPivot + aSegmentOffset; + rotated = rotateVertexByQuat(rotated - .5, orientation) + aInstancePos + .5; + + vec4 worldPos = vec4(rotated, 1.); + vec3 norm = rotateVertexByQuat(rotateVertexByQuat(aNormal, flapRotation), orientation); #ifdef CONTRAPTION worldPos = uModel * worldPos; - mat4 normalMat = uModel * orientation * flapRotation; + norm = modelToNormal(uModel) * norm; BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; #if defined(USE_FOG) FragDistance = length(worldPos.xyz); #endif - #else - mat4 normalMat = orientation * flapRotation; - - #if defined(USE_FOG) + #elif defined(USE_FOG) FragDistance = length(worldPos.xyz - uCameraPos); #endif - #endif - - vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; Diffuse = diffuse(norm); TexCoords = aTexCoords; diff --git a/src/main/resources/assets/create/shader/model.frag b/src/main/resources/assets/create/flywheel/shaders/model.frag similarity index 100% rename from src/main/resources/assets/create/shader/model.frag rename to src/main/resources/assets/create/flywheel/shaders/model.frag diff --git a/src/main/resources/assets/create/shader/model.vert b/src/main/resources/assets/create/flywheel/shaders/model.vert similarity index 73% rename from src/main/resources/assets/create/shader/model.vert rename to src/main/resources/assets/create/flywheel/shaders/model.vert index 54bf4ba4b..9767a122c 100644 --- a/src/main/resources/assets/create/shader/model.vert +++ b/src/main/resources/assets/create/flywheel/shaders/model.vert @@ -1,5 +1,8 @@ #version 110 +#flwinclude <"create:core/matutils.glsl"> +#flwinclude <"create:core/diffuse.glsl"> + attribute vec3 aPos; attribute vec3 aNormal; attribute vec2 aTexCoords; @@ -32,23 +35,6 @@ uniform vec3 uCameraPos; varying float FragDistance; #endif -mat3 modelToNormal(mat4 mat) { - // Discard the edges. This won't be accurate for scaled or skewed matrices, - // but we don't have to work with those often. - mat3 m; - m[0] = mat[0].xyz; - m[1] = mat[1].xyz; - m[2] = mat[2].xyz; - return m; -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); -} - void main() { vec4 worldPos = aTransform * vec4(aPos, 1.); diff --git a/src/main/resources/assets/create/flywheel/shaders/rotating.vert b/src/main/resources/assets/create/flywheel/shaders/rotating.vert new file mode 100644 index 000000000..53d258bfd --- /dev/null +++ b/src/main/resources/assets/create/flywheel/shaders/rotating.vert @@ -0,0 +1,82 @@ +#version 110 +#define PI 3.1415926538 + +#flwinclude <"create:core/quaternion.glsl"> +#flwinclude <"create:core/matutils.glsl"> +#flwinclude <"create:core/diffuse.glsl"> + +attribute vec3 aPos; +attribute vec3 aNormal; +attribute vec2 aTexCoords; + +attribute vec3 aInstancePos; +attribute vec2 aLight; +attribute vec3 aNetworkTint; +attribute float aSpeed; +attribute float aOffset; +attribute vec3 aAxis; + +varying vec2 TexCoords; +varying vec4 Color; +varying float Diffuse; +varying vec2 Light; + +#if defined(CONTRAPTION) +varying vec3 BoxCoord; + +uniform vec3 uLightBoxSize; +uniform vec3 uLightBoxMin; +uniform mat4 uModel; +#endif + +uniform float uTime; +uniform mat4 uViewProjection; +uniform int uDebug; + +uniform vec3 uCameraPos; + +#if defined(USE_FOG) +varying float FragDistance; +#endif + +void main() { + float degrees = aOffset + uTime * aSpeed * 3./10.; + vec4 kineticRot = quat(aAxis, degrees); + + vec4 worldPos = vec4(rotateVertexByQuat(aPos - .5, kineticRot) + aInstancePos + .5, 1.); + + vec3 norm = rotateVertexByQuat(aNormal, kineticRot); + + #ifdef CONTRAPTION + worldPos = uModel * worldPos; + norm = modelToNormal(uModel) * norm; + + BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; + #if defined(USE_FOG) + FragDistance = length(worldPos.xyz); + #endif + #elif defined(USE_FOG) + FragDistance = length(worldPos.xyz - uCameraPos); + #endif + + Diffuse = diffuse(norm); + TexCoords = aTexCoords; + Light = aLight; + gl_Position = uViewProjection * worldPos; + + #ifdef CONTRAPTION + if (uDebug == 2) { + Color = vec4(norm, 1.); + } else { + Color = vec4(1.); + } + #else + if (uDebug == 1) { + Color = vec4(aNetworkTint, 1.); + } else if (uDebug == 2) { + Color = vec4(norm, 1.); + } else { + Color = vec4(1.); + } + #endif +} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/contraption_actor.vert b/src/main/resources/assets/create/shader/contraption_actor.vert deleted file mode 100644 index 31cdd6799..000000000 --- a/src/main/resources/assets/create/shader/contraption_actor.vert +++ /dev/null @@ -1,94 +0,0 @@ -#version 110 -#define PI 3.1415926538 -// model data -attribute vec3 aPos; -attribute vec3 aNormal; -attribute vec2 aTexCoords; - -// instance data -attribute vec3 aInstancePos; -attribute vec2 aModelLight; -attribute float aOffset; -attribute vec3 aAxis; -attribute vec3 aInstanceRot; -attribute vec3 aRotationCenter; -attribute float aSpeed; - - -varying float Diffuse; -varying vec2 TexCoords; -varying vec4 Color; -varying vec3 BoxCoord; -varying vec2 Light; - -uniform vec3 uLightBoxSize; -uniform vec3 uLightBoxMin; -uniform mat4 uModel; - -uniform float uTime; -uniform mat4 uViewProjection; -uniform int uDebug; - -uniform vec3 uCameraPos; - -#if defined(USE_FOG) -varying float FragDistance; -#endif - -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1. - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); -} - -mat4 rotation(vec3 rot) { - return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); -} - -mat4 kineticRotation() { - float degrees = aOffset + uTime * aSpeed / 20.; - float angle = fract(degrees / 360.) * PI * 2.; - - return rotate(normalize(aAxis), -angle); -} - -void main() { - mat4 kineticRotation = kineticRotation(); - vec4 localPos = kineticRotation * vec4(aPos - aRotationCenter, 1.) + vec4(aRotationCenter, 0.); - - vec3 rot = fract(aInstanceRot / 360.) * PI * 2.; - mat4 localRot = rotation(rot); - localPos = localRot * vec4(localPos.xyz - .5, 1.) + vec4(aInstancePos + .5, 0.); - - vec4 worldPos = uModel * localPos; - - vec3 norm = normalize(uModel * localRot * kineticRotation * vec4(aNormal, 0.)).xyz; - - BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; - Diffuse = diffuse(norm); - TexCoords = aTexCoords; - Light = aModelLight; - gl_Position = uViewProjection * worldPos; - - #if defined(USE_FOG) - FragDistance = length(worldPos.xyz); - #endif - - if (uDebug == 2) { - Color = vec4(norm, 1.); - } else { - Color = vec4(1.); - } -} \ No newline at end of file diff --git a/src/main/resources/assets/create/shader/rotating.vert b/src/main/resources/assets/create/shader/rotating.vert deleted file mode 100644 index afa32c38c..000000000 --- a/src/main/resources/assets/create/shader/rotating.vert +++ /dev/null @@ -1,108 +0,0 @@ -#version 110 -#define PI 3.1415926538 -attribute vec3 aPos; -attribute vec3 aNormal; -attribute vec2 aTexCoords; - -attribute vec3 aInstancePos; -attribute vec2 aLight; -attribute vec3 aNetworkTint; -attribute float aSpeed; -attribute float aOffset; -attribute vec3 aAxis; - -varying vec2 TexCoords; -varying vec4 Color; -varying float Diffuse; -varying vec2 Light; - -#if defined(CONTRAPTION) -varying vec3 BoxCoord; - -uniform vec3 uLightBoxSize; -uniform vec3 uLightBoxMin; -uniform mat4 uModel; -#endif - -uniform float uTime; -uniform mat4 uViewProjection; -uniform int uDebug; - -uniform vec3 uCameraPos; - -#if defined(USE_FOG) -varying float FragDistance; -#endif - -mat4 rotate(vec3 axis, float angle) { - float s = sin(angle); - float c = cos(angle); - float oc = 1. - c; - - return mat4(oc * axis.x * axis.x + c, oc * axis.x * axis.y - axis.z * s, oc * axis.z * axis.x + axis.y * s, 0., - oc * axis.x * axis.y + axis.z * s, oc * axis.y * axis.y + c, oc * axis.y * axis.z - axis.x * s, 0., - oc * axis.z * axis.x - axis.y * s, oc * axis.y * axis.z + axis.x * s, oc * axis.z * axis.z + c, 0., - 0., 0., 0., 1.); -} - -float diffuse(vec3 normal) { - float x = normal.x; - float y = normal.y; - float z = normal.z; - return min(x * x * .6 + y * y * ((3. + y) / 4.) + z * z * .8, 1.); -} - -mat4 rotation(vec3 rot) { - return rotate(vec3(0., 1., 0.), rot.y) * rotate(vec3(0., 0., 1.), rot.z) * rotate(vec3(1., 0., 0.), rot.x); -} - -mat4 kineticRotation() { - float degrees = aOffset + uTime * aSpeed * -3./10.; - float angle = fract(degrees / 360.) * PI * 2.; - - return rotate(aAxis, angle); -} - -void main() { - mat4 kineticRotation = kineticRotation(); - vec4 worldPos = kineticRotation * vec4(aPos - .5, 1.) + vec4(aInstancePos + .5, 0.); - - #ifdef CONTRAPTION - worldPos = uModel * worldPos; - mat4 normalMat = uModel * kineticRotation; - - BoxCoord = (worldPos.xyz - uLightBoxMin) / uLightBoxSize; - #if defined(USE_FOG) - FragDistance = length(worldPos.xyz); - #endif - #else - mat4 normalMat = kineticRotation; - - #if defined(USE_FOG) - FragDistance = length(worldPos.xyz - uCameraPos); - #endif - #endif - - vec3 norm = normalize(normalMat * vec4(aNormal, 0.)).xyz; - - Diffuse = diffuse(norm); - TexCoords = aTexCoords; - Light = aLight; - gl_Position = uViewProjection * worldPos; - - #ifdef CONTRAPTION - if (uDebug == 2) { - Color = vec4(norm, 1.); - } else { - Color = vec4(1.); - } - #else - if (uDebug == 1) { - Color = vec4(aNetworkTint, 1.); - } else if (uDebug == 2) { - Color = vec4(norm, 1.); - } else { - Color = vec4(1.); - } - #endif -} \ No newline at end of file