diff options
| author | shedaniel <daniel@shedaniel.me> | 2020-01-20 22:00:51 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2020-01-20 22:00:51 +0800 |
| commit | c0b54fae494fcd8bba476eb0153c8689a85231cc (patch) | |
| tree | f5b7266225093fa811e05e2f6dcf320c7e0ae146 /src/main/java | |
| parent | c683eb4cf0b621c5ac176915e3aeea604cea26fd (diff) | |
| download | RoughlyEnoughItems-c0b54fae494fcd8bba476eb0153c8689a85231cc.tar.gz RoughlyEnoughItems-c0b54fae494fcd8bba476eb0153c8689a85231cc.tar.bz2 RoughlyEnoughItems-c0b54fae494fcd8bba476eb0153c8689a85231cc.zip | |
Fix #246
Diffstat (limited to 'src/main/java')
12 files changed, 351 insertions, 61 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/ConfigObject.java b/src/main/java/me/shedaniel/rei/api/ConfigObject.java index 9f9229d7a..18ea62bc4 100644 --- a/src/main/java/me/shedaniel/rei/api/ConfigObject.java +++ b/src/main/java/me/shedaniel/rei/api/ConfigObject.java @@ -125,9 +125,11 @@ public interface ConfigObject { ModifierKeyCode getCopyRecipeIdentifierKeybind(); + ModifierKeyCode getExportImageKeybind(); + double getEntrySize(); - @Deprecated + @ApiStatus.Internal ConfigObjectImpl.General getGeneral(); boolean isUsingCompactTabs(); diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java b/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java new file mode 100644 index 000000000..4852f01c8 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/gui/RecipeDisplayExporter.java @@ -0,0 +1,201 @@ +/* + * Roughly Enough Items by Danielshe. + * Licensed under the MIT License. + */ + +package me.shedaniel.rei.gui; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.math.api.Rectangle; +import me.shedaniel.rei.gui.widget.Widget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gl.Framebuffer; +import net.minecraft.client.gui.Element; +import net.minecraft.client.render.DiffuseLighting; +import net.minecraft.client.render.OverlayTexture; +import net.minecraft.client.render.VertexConsumerProvider; +import net.minecraft.client.render.model.BakedModel; +import net.minecraft.client.render.model.json.ModelTransformation; +import net.minecraft.client.texture.NativeImage; +import net.minecraft.client.texture.SpriteAtlasTexture; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.resource.ResourceImpl; +import org.jetbrains.annotations.ApiStatus; +import org.lwjgl.opengl.GL11; + +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +@ApiStatus.Internal +@ApiStatus.Experimental +public final class RecipeDisplayExporter extends Widget { + private static final RecipeDisplayExporter INSTANCE = new RecipeDisplayExporter(); + + private RecipeDisplayExporter() {} + + public static void exportRecipeDisplay(Rectangle rectangle, List<Widget> widgets) { + INSTANCE.exportRecipe(rectangle, widgets); + } + + private void exportRecipe(Rectangle rectangle, List<Widget> widgets) { + Framebuffer framebuffer = new Framebuffer(rectangle.width * 8, rectangle.height * 8, true, MinecraftClient.IS_SYSTEM_MAC); + framebuffer.setClearColor(0, 0, 0, 0); + // int color = ScreenHelper.isDarkModeEnabled() ? -13750738 : -3750202; + // framebuffer.setClearColor(((color >> 16) & 0xFF) / 255f, ((color >> 8) & 0xFF) / 255f, (color & 0xFF) / 255f, ((color >> 24) & 0xFF) / 255f); + framebuffer.clear(MinecraftClient.IS_SYSTEM_MAC); + RenderSystem.pushMatrix(); + // RenderSystem.clear(16640, MinecraftClient.IS_SYSTEM_MAC); + framebuffer.beginWrite(true); + + // Fresh matrices + // RenderSystem.clear(256, MinecraftClient.IS_SYSTEM_MAC); + RenderSystem.matrixMode(GL11.GL_PROJECTION); + RenderSystem.pushMatrix(); + RenderSystem.loadIdentity(); + // RenderSystem.ortho(0.0D, rectangle.width * 8, rectangle.height * 8, 0.0D, -1, 1); + // RenderSystem.scalef(1, -1,0); + // RenderSystem.ortho(-1, 1, 1, -1, -1, 1); + // RenderSystem.ortho(-1, 1, 1, -1, -1, 1); + RenderSystem.matrixMode(GL11.GL_MODELVIEW); + RenderSystem.pushMatrix(); + RenderSystem.loadIdentity(); + // RenderSystem.translatef(0.0F, 0.0F, -2000.0F); + // RenderSystem.rotatef(180, 1, 0, 0); + RenderSystem.scalef(2f / rectangle.width, -2f / rectangle.height, 0); + // RenderSystem.scalef(1f / rectangle.width, -1f / rectangle.height, 0); + // RenderSystem.translatef(10,10,0); + RenderSystem.translatef(-rectangle.x, -rectangle.y, 0); + // RenderSystem.translatef(rectangle.x, rectangle.y, 0); + RenderSystem.translatef(-rectangle.width / 2f, -rectangle.height / 2f, 0); + + // RenderSystem.enableAlphaTest(); + // RenderSystem.alphaFunc(516, 0.1F); + // RenderSystem.enableBlend(); + // RenderSystem.blendFuncSeparate(GlStateManager.SrcFactor.ONE_MINUS_DST_ALPHA, GlStateManager.DstFactor.DST_ALPHA, GlStateManager.SrcFactor.ONE, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.enableAlphaTest(); + RenderSystem.defaultAlphaFunc(); + RenderSystem.enableBlend(); + RenderSystem.enableDepthTest(); + RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); + RenderSystem.depthMask(false); + RenderSystem.disableCull(); + RenderSystem.pushLightingAttributes(); + for (Widget widget : widgets) { + widget.render(-1, -1, minecraft.getTickDelta()); + } + { + ItemStack stack = new ItemStack(Items.OAK_STAIRS); + final BakedModel model = minecraft.getItemRenderer().getHeldItemModel(stack, minecraft.world, minecraft.player); + minecraft.getTextureManager().bindTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX); + minecraft.getTextureManager().getTexture(SpriteAtlasTexture.BLOCK_ATLAS_TEX).setFilter(false, false); + + RenderSystem.enableRescaleNormal(); + RenderSystem.enableAlphaTest(); + RenderSystem.defaultAlphaFunc(); + RenderSystem.enableBlend(); + RenderSystem.enableDepthTest(); + RenderSystem.blendFunc(GlStateManager.SrcFactor.SRC_ALPHA, GlStateManager.DstFactor.ONE_MINUS_SRC_ALPHA); + + RenderSystem.color4f(1.0F, 1.0F, 1.0F, 1.0F); + MatrixStack matrixStack = new MatrixStack(); + + matrixStack.translate(rectangle.x + 8, rectangle.y + 8, 0); + matrixStack.scale(16, -16, 1F); + + boolean disableGuiLight = !model.hasDepthInGui(); + if (disableGuiLight) { + DiffuseLighting.disableGuiDepthLighting(); + } + + VertexConsumerProvider.Immediate immediate = MinecraftClient.getInstance().getBufferBuilders().getEntityVertexConsumers(); + minecraft.getItemRenderer().renderItem(stack, ModelTransformation.Type.GUI, false, matrixStack, immediate, 15728880, OverlayTexture.DEFAULT_UV, model); + immediate.draw(); + + RenderSystem.enableDepthTest(); + + if (disableGuiLight) { + DiffuseLighting.enableGuiDepthLighting(); + } + + RenderSystem.disableAlphaTest(); + RenderSystem.disableRescaleNormal(); + } + // fillGradient(0, 0, 10, 10, -1, -1); + // fillGradient(rectangle.x, rectangle.y, rectangle.x + 10, rectangle.y + 10, -16777216, -16777216); + RenderSystem.depthMask(true); + RenderSystem.disableAlphaTest(); + RenderSystem.disableRescaleNormal(); + RenderSystem.disableDepthTest(); + // RenderSystem.disableAlphaTest(); + // RenderSystem.disableBlend(); + + // Reset matrices + RenderSystem.matrixMode(GL11.GL_PROJECTION); + RenderSystem.popMatrix(); + RenderSystem.matrixMode(GL11.GL_MODELVIEW); + RenderSystem.popMatrix(); + + framebuffer.endWrite(); + RenderSystem.popMatrix(); + RenderSystem.viewport(0, 0, minecraft.getWindow().getFramebufferWidth(), minecraft.getWindow().getFramebufferHeight()); + + NativeImage nativeImage = new NativeImage(rectangle.width * 8, rectangle.height * 8, false); + RenderSystem.bindTexture(framebuffer.colorAttachment); + nativeImage.loadFromTextureImage(0, false); + { + int width = rectangle.width * 8; + int height = rectangle.height * 8; + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + if (x > 24 && x < width - 24 && y > 24 && y < height - 24) + nativeImage.setPixelRgba(x, y, nativeImage.getPixelRgba(x, y) | 255 << NativeImage.Format.RGBA.getAlphaChannelOffset()); + } + } + } + + nativeImage.mirrorVertically(); + ResourceImpl.RESOURCE_IO_EXECUTOR.execute(() -> { + try { + File export = new File(minecraft.runDirectory, "export"); + //noinspection ResultOfMethodCallIgnored + export.mkdirs(); + nativeImage.writeFile(getExportFilename(export)); + } catch (IOException e) { + e.printStackTrace(); + } finally { + nativeImage.close(); + RenderSystem.recordRenderCall(framebuffer::delete); + } + }); + } + + private static File getExportFilename(File directory) { + String string = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date()); + int i = 1; + + while (true) { + File file = new File(directory, "REI_" + string + (i == 1 ? "" : "_" + i) + ".png"); + if (!file.exists()) { + return file; + } + + ++i; + } + } + + @Override + public void render(int mouseX, int mouseY, float delta) { + + } + + @Override + public List<? extends Element> children() { + return null; + } +} diff --git a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java index d9fab6dca..91dd7da2b 100644 --- a/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java +++ b/src/main/java/me/shedaniel/rei/gui/RecipeViewingScreen.java @@ -6,7 +6,9 @@ package me.shedaniel.rei.gui; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import com.mojang.blaze3d.systems.RenderSystem; +import me.shedaniel.clothconfig2.api.ModifierKeyCode; import me.shedaniel.math.api.Point; import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; @@ -17,9 +19,14 @@ import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.Element; import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.render.Tessellator; +import net.minecraft.client.render.VertexConsumerProvider; import net.minecraft.client.resource.language.I18n; import net.minecraft.client.sound.PositionedSoundInstance; +import net.minecraft.client.util.InputUtil; import net.minecraft.client.util.Window; +import net.minecraft.client.util.math.Matrix4f; +import net.minecraft.client.util.math.MatrixStack; import net.minecraft.sound.SoundEvents; import net.minecraft.text.LiteralText; import net.minecraft.util.Formatting; @@ -37,6 +44,7 @@ public class RecipeViewingScreen extends Screen { public static final Identifier CHEST_GUI_TEXTURE = new Identifier("roughlyenoughitems", "textures/gui/recipecontainer.png"); private final List<Widget> preWidgets; private final List<Widget> widgets; + private final Map<Rectangle, List<Widget>> recipeBounds; private final List<TabWidget> tabs; private final Map<RecipeCategory<?>, List<RecipeDisplay>> categoriesMap; private final List<RecipeCategory<?>> categories; @@ -58,6 +66,7 @@ public class RecipeViewingScreen extends Screen { this.categoryPages = 0; this.preWidgets = Lists.newArrayList(); this.widgets = Lists.newArrayList(); + this.recipeBounds = Maps.newHashMap(); Window window = MinecraftClient.getInstance().getWindow(); this.bounds = new Rectangle(window.getScaledWidth() / 2 - guiWidth / 2, window.getScaledHeight() / 2 - guiHeight / 2, 176, 150); this.categoriesMap = categoriesMap; @@ -150,6 +159,7 @@ public class RecipeViewingScreen extends Screen { boolean isCompactTabs = ConfigObject.getInstance().isUsingCompactTabs(); int tabSize = isCompactTabs ? 24 : 28; this.children.clear(); + this.recipeBounds.clear(); this.tabs.clear(); this.preWidgets.clear(); this.widgets.clear(); @@ -313,12 +323,13 @@ public class RecipeViewingScreen extends Screen { int recipeHeight = selectedCategory.getDisplayHeight(); List<RecipeDisplay> currentDisplayed = getCurrentDisplayed(); for (int i = 0; i < currentDisplayed.size(); i++) { - int finalI = i; - final Supplier<RecipeDisplay> displaySupplier = () -> currentDisplayed.get(finalI); + final RecipeDisplay display = currentDisplayed.get(i); + final Supplier<RecipeDisplay> displaySupplier = () -> display; int displayWidth = selectedCategory.getDisplayWidth(displaySupplier.get()); final Rectangle displayBounds = new Rectangle(getBounds().getCenterX() - displayWidth / 2, getBounds().y - 2 + 36 + recipeHeight * i + 4 * i, displayWidth, recipeHeight); List<Widget> setupDisplay = selectedCategory.setupDisplay(displaySupplier, displayBounds); transformNotice(setupDisplay, mainStackToNotice); + recipeBounds.put(displayBounds, setupDisplay); this.widgets.addAll(setupDisplay); if (supplier.isPresent() && supplier.get().get(displayBounds) != null) this.widgets.add(new AutoCraftingButtonWidget(displayBounds, supplier.get().get(displayBounds), supplier.get().getButtonText(), displaySupplier, setupDisplay, selectedCategory)); @@ -429,6 +440,28 @@ public class RecipeViewingScreen extends Screen { } ScreenHelper.getLastOverlay().render(mouseX, mouseY, delta); ScreenHelper.getLastOverlay().lateRender(mouseX, mouseY, delta); + { + ModifierKeyCode export = ConfigObject.getInstance().getExportImageKeybind(); + if (export.matchesCurrentKey()) { + for (Map.Entry<Rectangle, List<Widget>> entry : recipeBounds.entrySet()) { + Rectangle bounds = entry.getKey(); + setBlitOffset(470); + if (bounds.contains(mouseX, mouseY)) { + fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 1744822402, 1744822402); + String s = I18n.translate("text.rei.release_export", export.getLocalizedName()); + MatrixStack matrixStack_1 = new MatrixStack(); + VertexConsumerProvider.Immediate immediate = VertexConsumerProvider.immediate(Tessellator.getInstance().getBuffer()); + matrixStack_1.translate(0.0D, 0.0D, 480); + Matrix4f matrix4f_1 = matrixStack_1.peek().getModel(); + font.draw(s, bounds.getCenterX() - font.getStringWidth(s) / 2f, bounds.getCenterY() - 4.5f, 0xff000000, false, matrix4f_1, immediate, false, 0, 15728880); + immediate.draw(); + } else { + fillGradient(bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 1744830463, 1744830463); + } + setBlitOffset(0); + } + } + } if (choosePageActivated) { setBlitOffset(500); this.fillGradient(0, 0, this.width, this.height, -1072689136, -804253680); @@ -437,6 +470,21 @@ public class RecipeViewingScreen extends Screen { } } + @Override + public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + ModifierKeyCode export = ConfigObject.getInstance().getExportImageKeybind(); + if (export.matchesKey(keyCode, scanCode)) { + for (Map.Entry<Rectangle, List<Widget>> entry : recipeBounds.entrySet()) { + Rectangle bounds = entry.getKey(); + if (bounds.contains(PointHelper.fromMouse())) { + RecipeDisplayExporter.exportRecipeDisplay(bounds, entry.getValue()); + break; + } + } + } + return super.keyReleased(keyCode, scanCode, modifiers); + } + public int getTotalPages(RecipeCategory<RecipeDisplay> category) { return MathHelper.ceil(categoriesMap.get(category).size() / (double) (getRecipesPerPage() + 1)); } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java index c0d37da28..062eddfdc 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java @@ -12,35 +12,22 @@ import me.shedaniel.math.api.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.*; import me.shedaniel.rei.gui.toast.CopyRecipeIdentifierToast; +import me.shedaniel.rei.impl.ClientHelperImpl; import me.shedaniel.rei.impl.ScreenHelper; -import net.minecraft.client.MinecraftClient; +import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; import net.minecraft.client.resource.language.I18n; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; -import net.minecraft.util.Lazy; import org.jetbrains.annotations.ApiStatus; -import java.time.LocalDateTime; import java.util.List; import java.util.Optional; -import java.util.UUID; import java.util.function.Supplier; -import java.util.stream.Collectors; @ApiStatus.Internal public class AutoCraftingButtonWidget extends ButtonWidget { - private static final Lazy<Boolean> IS_YOG = new Lazy<>(() -> { - try { - if (MinecraftClient.getInstance().getSession().getProfile().getId().equals(UUID.fromString("f9546389-9415-4358-9c29-2c26b25bff5b"))) - return true; - LocalDateTime now = LocalDateTime.now(); - return now.getMonthValue() == 4 && now.getDayOfMonth() == 1; - } catch (Throwable throwable) { - return false; - } - }); private final Supplier<RecipeDisplay> displaySupplier; private String extraTooltip; private List<String> errorTooltip; @@ -156,14 +143,14 @@ public class AutoCraftingButtonWidget extends ButtonWidget { public Optional<String> getTooltips() { String str = ""; if (errorTooltip == null) { - if (IS_YOG.get()) + if (((ClientHelperImpl) ClientHelper.getInstance()).isYog.get()) str += I18n.translate("text.auto_craft.move_items.yog"); else str += I18n.translate("text.auto_craft.move_items"); } else { if (errorTooltip.size() > 1) str += Formatting.RED.toString() + I18n.translate("error.rei.multi.errors") + "\n"; - str += errorTooltip.stream().map(s -> Formatting.RED.toString() + (errorTooltip.size() > 1 ? "- " : "") + I18n.translate(s)).collect(Collectors.joining("\n")); + str += CollectionUtils.mapAndJoinToString(errorTooltip, s -> Formatting.RED.toString() + (errorTooltip.size() > 1 ? "- " : "") + I18n.translate(s), "\n"); } if (this.minecraft.options.advancedItemTooltips) { str += extraTooltip; diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index 6dd48e5ec..294c7aec6 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -247,10 +247,12 @@ public class EntryListWidget extends WidgetWithBounds { if (notSteppingOnExclusionZones(entry.getBounds().x, entry.getBounds().y, innerBounds)) { entry.entry(stack); entry.isFavorites = false; - size++; - long l = System.nanoTime(); - entry.render(mouseX, mouseY, delta); - time += (System.nanoTime() - l); + if (!entry.getCurrentEntry().isEmpty()) { + size++; + long l = System.nanoTime(); + entry.render(mouseX, mouseY, delta); + time += (System.nanoTime() - l); + } nextIndex++; break; } else { @@ -339,13 +341,14 @@ public class EntryListWidget extends WidgetWithBounds { if (first instanceof OptimalEntryStack) { OptimalEntryStack firstStack = (OptimalEntryStack) first; firstStack.optimisedRenderStart(delta); - size += list.size(); long l = System.nanoTime(); for (EntryListEntry listEntry : list) { EntryStack currentEntry = listEntry.getCurrentEntry(); currentEntry.setZ(100); listEntry.drawBackground(mouseX, mouseY, delta); ((OptimalEntryStack) currentEntry).optimisedRenderBase(listEntry.getInnerBounds(), mouseX, mouseY, delta); + if (!currentEntry.isEmpty()) + size++; } for (EntryListEntry listEntry : list) { EntryStack currentEntry = listEntry.getCurrentEntry(); @@ -359,6 +362,8 @@ public class EntryListWidget extends WidgetWithBounds { firstStack.optimisedRenderEnd(delta); } else { for (EntryListEntry listEntry : list) { + if (listEntry.getCurrentEntry().isEmpty()) + continue; size++; long l = System.nanoTime(); listEntry.render(mouseX, mouseY, delta); @@ -368,6 +373,8 @@ public class EntryListWidget extends WidgetWithBounds { } } else { for (EntryListEntry entry : entries) { + if (entry.getCurrentEntry().isEmpty()) + continue; size++; long l = System.nanoTime(); entry.render(mouseX, mouseY, delta); @@ -418,12 +425,16 @@ public class EntryListWidget extends WidgetWithBounds { firstStack.optimisedRenderEnd(delta); } else { for (EntryListEntry listEntry : list) { + if (listEntry.getCurrentEntry().isEmpty()) + continue; listEntry.render(mouseX, mouseY, delta); } } } } else { for (EntryListEntry listEntry : entries) { + if (listEntry.getCurrentEntry().isEmpty()) + continue; listEntry.render(mouseX, mouseY, delta); } } diff --git a/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java index e05e6b004..7dcdc069c 100644 --- a/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java @@ -5,9 +5,9 @@ package me.shedaniel.rei.impl; -import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; import io.netty.buffer.Unpooled; +import me.sargunvohra.mcmods.autoconfig1u.annotation.ConfigEntry; import me.shedaniel.clothconfig2.api.FakeModifierKeyCodeAdder; import me.shedaniel.clothconfig2.api.ModifierKeyCode; import me.shedaniel.rei.RoughlyEnoughItemsCore; @@ -31,21 +31,41 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.text.TranslatableText; -import net.minecraft.util.DefaultedList; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; +import net.minecraft.util.Lazy; import net.minecraft.util.PacketByteBuf; import net.minecraft.util.registry.Registry; import org.jetbrains.annotations.ApiStatus; import java.lang.reflect.Field; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.UUID; @ApiStatus.Internal public class ClientHelperImpl implements ClientHelper, ClientModInitializer { + @ApiStatus.Internal public final Lazy<Boolean> isYog = new Lazy<>(() -> { + try { + if (MinecraftClient.getInstance().getSession().getProfile().getId().equals(UUID.fromString("f9546389-9415-4358-9c29-2c26b25bff5b"))) + return true; + } catch (Throwable ignored) { + } + return false; + }); + @ApiStatus.Internal public final Lazy<Boolean> ok = new Lazy<>(() -> { + try { + if (isYog.get()) + return true; + LocalDateTime now = LocalDateTime.now(); + return now.getMonthValue() == 4 && now.getDayOfMonth() == 1; + } catch (Throwable ignored) { + } + return false; + }); public static ClientHelperImpl instance; private final Map<String, String> modNameCache = Maps.newHashMap(); @@ -150,12 +170,9 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer { @Override public List<ItemStack> getInventoryItemsTypes() { - List<DefaultedList<ItemStack>> field_7543 = ImmutableList.of(MinecraftClient.getInstance().player.inventory.main, MinecraftClient.getInstance().player.inventory.armor, MinecraftClient.getInstance().player.inventory.offHand); - List<ItemStack> inventoryStacks = new ArrayList<>(); - field_7543.forEach(itemStacks -> itemStacks.forEach(itemStack -> { - if (!itemStack.isEmpty()) - inventoryStacks.add(itemStack); - })); + List<ItemStack> inventoryStacks = new ArrayList<>(MinecraftClient.getInstance().player.inventory.main); + inventoryStacks.addAll(MinecraftClient.getInstance().player.inventory.armor); + inventoryStacks.addAll(MinecraftClient.getInstance().player.inventory.offHand); return inventoryStacks; } @@ -233,9 +250,9 @@ public class ClientHelperImpl implements ClientHelper, ClientModInitializer { if (!FabricLoader.getInstance().isModLoaded("amecs")) { try { ConfigObjectImpl.General general = ConfigObject.getInstance().getGeneral(); - ConfigObjectImpl.General instance = general.getClass().newInstance(); + ConfigObjectImpl.General instance = general.getClass().getConstructor().newInstance(); for (Field declaredField : general.getClass().getDeclaredFields()) { - if (declaredField.getType() == ModifierKeyCode.class) { + if (declaredField.getType() == ModifierKeyCode.class && !declaredField.isAnnotationPresent(ConfigEntry.Gui.Excluded.class)) { declaredField.setAccessible(true); FakeModifierKeyCodeAdder.INSTANCE.registerModifierKeyCode(category, "config.roughlyenoughitems." + declaredField.getName(), () -> { try { diff --git a/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java b/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java index b51eaa871..07049ac62 100644 --- a/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java @@ -11,6 +11,7 @@ import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import io.github.prospector.modmenu.ModMenu; import me.sargunvohra.mcmods.autoconfig1u.AutoConfig; +import me.sargunvohra.mcmods.autoconfig1u.annotation.ConfigEntry; import me.sargunvohra.mcmods.autoconfig1u.gui.ConfigScreenProvider; import me.sargunvohra.mcmods.autoconfig1u.gui.registry.GuiRegistry; import me.sargunvohra.mcmods.autoconfig1u.serializer.JanksonConfigSerializer; @@ -96,23 +97,19 @@ public class ConfigManagerImpl implements ConfigManager { // return Collections.singletonList(entry); // }, field -> field.getType() == InputUtil.KeyCode.class); guiRegistry.registerPredicateProvider((i13n, field, config, defaults, guiProvider) -> { + if (field.isAnnotationPresent(ConfigEntry.Gui.Excluded.class)) + return Collections.emptyList(); KeyCodeEntry entry = ConfigEntryBuilder.create().startModifierKeyCodeField(i13n, getUnsafely(field, config, ModifierKeyCode.unknown())).setModifierDefaultValue(() -> getUnsafely(field, defaults)).setModifierSaveConsumer(newValue -> setUnsafely(field, config, newValue)).build(); entry.setAllowMouse(false); return Collections.singletonList(entry); }, field -> field.getType() == ModifierKeyCode.class); guiRegistry.registerAnnotationProvider((i13n, field, config, defaults, guiProvider) -> { - KeyCodeEntry entry = ConfigEntryBuilder.create().startModifierKeyCodeField(i13n, getUnsafely(field, config, ModifierKeyCode.unknown())).setModifierDefaultValue(() -> getUnsafely(field, defaults)).setModifierSaveConsumer(newValue -> setUnsafely(field, config, newValue)).build(); - entry.setAllowMouse(false); - return Collections.singletonList(entry); - }, field -> field.getType() == ModifierKeyCode.class, ConfigObject.UsePercentage.class); - guiRegistry.registerAnnotationProvider((i13n, field, config, defaults, guiProvider) -> { ConfigObject.UsePercentage bounds = field.getAnnotation(ConfigObject.UsePercentage.class); return Collections.singletonList(ConfigEntryBuilder.create().startIntSlider(i13n, MathHelper.ceil(Utils.getUnsafely(field, config, 0.0) * 100), MathHelper.ceil(bounds.min() * 100), MathHelper.ceil(bounds.max() * 100)).setDefaultValue(() -> MathHelper.ceil((double) Utils.getUnsafely(field, defaults) * 100)).setSaveConsumer((newValue) -> { Utils.setUnsafely(field, config, newValue / 100d); }).setTextGetter(integer -> String.format("Size: %d%%", integer)).build()); }, (field) -> field.getType() == Double.TYPE || field.getType() == Double.class, ConfigObject.UsePercentage.class); - guiRegistry.registerAnnotationProvider((i13n, field, config, defaults, guiProvider) -> { int width = 220; return Collections.singletonList(new TooltipListEntry<RecipeScreenType>(i13n, null) { diff --git a/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java index 595809acc..9e9f05bc3 100644 --- a/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java @@ -253,6 +253,11 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { } @Override + public ModifierKeyCode getExportImageKeybind() { + return general.exportImageKeybind == null ? ModifierKeyCode.unknown() : general.exportImageKeybind; + } + + @Override public double getEntrySize() { return appearance.entrySize; } @@ -281,6 +286,7 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { private ModifierKeyCode focusSearchFieldKeybind = ModifierKeyCode.unknown(); private ModifierKeyCode copyRecipeIdentifierKeybind = ModifierKeyCode.unknown(); private ModifierKeyCode favoriteKeybind = ModifierKeyCode.of(InputUtil.Type.KEYSYM.createFromCode(65), Modifier.none()); + @ConfigEntry.Gui.Excluded private ModifierKeyCode exportImageKeybind = ModifierKeyCode.unknown(); } public static class Appearance { diff --git a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java index ca33abdd5..4c5bbd0f9 100644 --- a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java @@ -13,7 +13,6 @@ import me.shedaniel.rei.gui.widget.QueuedTooltip; import net.minecraft.client.MinecraftClient; import net.minecraft.client.render.OverlayTexture; import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.item.ItemRenderer; import net.minecraft.client.render.model.BakedModel; import net.minecraft.client.render.model.json.ModelTransformation; import net.minecraft.client.texture.SpriteAtlasTexture; @@ -31,8 +30,7 @@ import java.util.Optional; @ApiStatus.Internal public class ItemEntryStack extends AbstractEntryStack implements OptimalEntryStack { - private static final MatrixStack matrices = new MatrixStack(); - private final ItemRenderer itemRenderer = MinecraftClient.getInstance().getItemRenderer(); + private static final MatrixStack MATRICES = new MatrixStack(); private ItemStack itemStack; |
