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; }