diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-06-20 21:54:39 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-06-20 21:54:39 +0800 |
| commit | 06c695df2c1ae92ddd71dfa23491d7554387156c (patch) | |
| tree | 77b10b982eaeedf38553833cf6c60a730fcfcf56 | |
| parent | 0239bf2fb623863164da37df7f059d29805ed1b9 (diff) | |
| download | RoughlyEnoughItems-06c695df2c1ae92ddd71dfa23491d7554387156c.tar.gz RoughlyEnoughItems-06c695df2c1ae92ddd71dfa23491d7554387156c.tar.bz2 RoughlyEnoughItems-06c695df2c1ae92ddd71dfa23491d7554387156c.zip | |
Improve crash reports, fluid rendering return missing sprite, add more util methods to EntryStacks and EntryIngredients
11 files changed, 220 insertions, 29 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java index 153473352..207bd118b 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/Renderer.java @@ -27,8 +27,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; import org.jetbrains.annotations.Nullable; public interface Renderer { @@ -44,4 +47,12 @@ public interface Renderer { int getZ(); void setZ(int z); + + default void fillCrashReport(CrashReport report, CrashReportCategory category) { + category.setDetail("Renderer name", () -> getClass().getCanonicalName()); + category.setDetail("Z level", () -> String.valueOf(getZ())); + if (this instanceof WidgetWithBounds widget) { + category.setDetail("Bounds", () -> String.valueOf(widget.getBounds())); + } + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java index 555149b8e..81e2a93dd 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryDefinition.java @@ -29,6 +29,8 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagContainer; @@ -75,5 +77,9 @@ public interface EntryDefinition<T> { default <O> EntryDefinition<O> cast() { return (EntryDefinition<O>) this; } + + default void fillCrashReport(CrashReport report, CrashReportCategory category, EntryStack<T> entry) { + category.setDetail("Entry definition class name", () -> getClass().getCanonicalName()); + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java index dc34584c2..9af0218ec 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryIngredients.java @@ -49,6 +49,10 @@ public final class EntryIngredients { return EntryIngredient.of(EntryStacks.of(stack)); } + public static EntryIngredient of(ItemLike stack, int amount) { + return EntryIngredient.of(EntryStacks.of(stack, amount)); + } + public static EntryIngredient of(ItemStack stack) { return EntryIngredient.of(EntryStacks.of(stack)); } @@ -80,11 +84,15 @@ public final class EntryIngredients { } public static EntryIngredient ofItems(Collection<ItemLike> stacks) { + return ofItems(stacks, 1); + } + + public static EntryIngredient ofItems(Collection<ItemLike> stacks, int amount) { if (stacks.size() == 0) return EntryIngredient.empty(); - if (stacks.size() == 1) return EntryIngredient.of(EntryStacks.of(stacks.iterator().next())); + if (stacks.size() == 1) return EntryIngredient.of(EntryStacks.of(stacks.iterator().next(), amount)); EntryIngredient.Builder result = EntryIngredient.builder(stacks.size()); for (ItemLike stack : stacks) { - result.add(EntryStacks.of(stack)); + result.add(EntryStacks.of(stack, amount)); } return result.build(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java index 827db488c..10c3aaa6d 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/util/EntryStacks.java @@ -61,6 +61,10 @@ public final class EntryStacks { return of(new ItemStack(item)); } + public static EntryStack<ItemStack> of(ItemLike item, int amount) { + return of(new ItemStack(item, amount)); + } + /** * Compares equality under the provided {@code context}. * Prioritizes {@link me.shedaniel.rei.api.common.entry.type.EntryDefinition#equals(Object, Object, ComparisonContext)} then compares diff --git a/gradle.properties b/gradle.properties index 877337dee..a989f9f6e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,13 +2,13 @@ org.gradle.jvmargs=-Xmx3G base_version=6.0 unstable=true supported_version=1.17 -minecraft_version=1.17-pre2 +minecraft_version=1.17 forgeEnabled=false forge_version=36.0.43 -fabricloader_version=0.11.3 +fabricloader_version=0.11.6 cloth_config_version=5.0.34 -modmenu_version=2.0.0-beta.7 -fabric_api=0.34.8+1.17 -architectury_version=2.0.5 +modmenu_version=2.0.2 +fabric_api=0.35.2+1.17 +architectury_version=2.0.9 api_exculde= #api_include=me.shedaniel.cloth:cloth-events,me.shedaniel.cloth:config-2,me.sargunvohra.mcmods:autoconfig1u,org.jetbrains:annotations,net.fabricmc.fabric-api:fabric diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java index 29bfeef7b..1fcd50f82 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java @@ -31,6 +31,9 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.renderer.BatchedEntryRenderer; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.util.CrashReportUtils; +import net.minecraft.CrashReport; +import net.minecraft.ReportedException; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import org.apache.commons.lang3.mutable.MutableInt; @@ -131,31 +134,55 @@ public class BatchedEntryRendererManager { MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); int i = 0; for (T entry : entries) { - entry.drawBackground(matrices, mouseX, mouseY, delta); + try { + entry.drawBackground(matrices, mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry background"); + CrashReportUtils.renderer(report, entry); + throw new ReportedException(report); + } } firstRenderer.startBatch(first, extraData[0], matrices, delta); for (T entry : entries) { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = entry.getCurrentEntry(); - currentEntry.setZ(100); - firstRenderer.renderBase(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); - if (debugTime && !currentEntry.isEmpty()) size.increment(); + try { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = entry.getCurrentEntry(); + currentEntry.setZ(100); + firstRenderer.renderBase(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); + if (debugTime && !currentEntry.isEmpty()) size.increment(); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry base"); + CrashReportUtils.renderer(report, entry); + throw new ReportedException(report); + } } immediate.endBatch(); firstRenderer.afterBase(first, extraData[0], matrices, delta); i = 0; for (T entry : entries) { - @SuppressWarnings("rawtypes") - EntryStack currentEntry = entry.getCurrentEntry(); - firstRenderer.renderOverlay(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); + try { + @SuppressWarnings("rawtypes") + EntryStack currentEntry = entry.getCurrentEntry(); + firstRenderer.renderOverlay(currentEntry, extraData[i++], matrices, immediate, entry.getInnerBounds(), mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry base"); + CrashReportUtils.renderer(report, entry); + throw new ReportedException(report); + } } immediate.endBatch(); for (T entry : entries) { - if (entry.containsMouse(mouseX, mouseY)) { - entry.queueTooltip(matrices, mouseX, mouseY, delta); - entry.drawHighlighted(matrices, mouseX, mouseY, delta); + try { + if (entry.containsMouse(mouseX, mouseY)) { + entry.queueTooltip(matrices, mouseX, mouseY, delta); + entry.drawHighlighted(matrices, mouseX, mouseY, delta); + } + entry.drawExtra(matrices, mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry extra"); + CrashReportUtils.renderer(report, entry); + throw new ReportedException(report); } - entry.drawExtra(matrices, mouseX, mouseY, delta); } if (debugTime) time.add(System.nanoTime() - l); firstRenderer.endBatch(first, extraData[0], matrices, delta); @@ -165,12 +192,18 @@ public class BatchedEntryRendererManager { for (T entry : entries) { if (entry.getCurrentEntry().isEmpty()) continue; - if (debugTime) { - size.increment(); - long l = System.nanoTime(); - entry.render(matrices, mouseX, mouseY, delta); - time.add(System.nanoTime() - l); - } else entry.render(matrices, mouseX, mouseY, delta); + try { + if (debugTime) { + size.increment(); + long l = System.nanoTime(); + entry.render(matrices, mouseX, mouseY, delta); + time.add(System.nanoTime() - l); + } else entry.render(matrices, mouseX, mouseY, delta); + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry"); + CrashReportUtils.renderer(report, entry); + throw new ReportedException(report); + } } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index a26a6fbc2..781db8d0c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -43,6 +43,8 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; @@ -482,4 +484,20 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { render(matrices, mouseX, mouseY, delta); getBounds().setBounds(clone); } + + @Override + public void fillCrashReport(CrashReport report, CrashReportCategory category) { + super.fillCrashReport(report, category); + category.setDetail("Notice mark", () -> String.valueOf(getNoticeMark())); + category.setDetail("Interactable", () -> String.valueOf(isInteractable())); + category.setDetail("Interactable favorites", () -> String.valueOf(isInteractableFavorites())); + category.setDetail("Highlight enabled", () -> String.valueOf(isHighlightEnabled())); + category.setDetail("Tooltip enabled", () -> String.valueOf(isTooltipsEnabled())); + category.setDetail("Background enabled", () -> String.valueOf(isBackgroundEnabled())); + category.setDetail("Entries count", () -> String.valueOf(entryStacks.size())); + EntryStack<?> currentEntry = getCurrentEntry(); + + CrashReportCategory entryCategory = report.addCategory("Current Rendering Entry"); + currentEntry.fillCrashReport(report, entryCategory); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java new file mode 100644 index 000000000..c3c66ab13 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java @@ -0,0 +1,57 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021 shedaniel + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.shedaniel.rei.impl.client.util; + +import me.shedaniel.rei.api.client.gui.Renderer; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; + +public class CrashReportUtils { + public static CrashReport essential(Throwable throwable, String task) { + CrashReport report = CrashReport.forThrowable(throwable, "Rendering background of entry"); + screen(report, Minecraft.getInstance().screen); + return report; + } + + private static void screen(CrashReport report, Screen screen) { + if (screen != null) { + CrashReportCategory category = report.addCategory("Screen details"); + String screenName = screen.getClass().getCanonicalName(); + category.setDetail("Screen name", () -> screenName); + } + } + + public static void renderer(CrashReport report, Renderer renderer) { + if (renderer != null) { + CrashReportCategory category = report.addCategory("Renderer details"); + try { + renderer.fillCrashReport(report, category); + } catch (Throwable throwable) { + category.setDetailError("Filling Report", throwable); + } + } + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java index ae09bcd7e..20194e7a7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java @@ -38,6 +38,8 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; @@ -200,4 +202,19 @@ public abstract class AbstractEntryStack<A> extends AbstractRenderer implements public Component asFormattedText() { return getDefinition().asFormattedText(this, getValue()); } + + @Override + public void fillCrashReport(CrashReport report, CrashReportCategory category) { + super.fillCrashReport(report, category); + category.setDetail("Entry type", () -> String.valueOf(getType().getId())); + category.setDetail("Is empty", () -> String.valueOf(isEmpty())); + category.setDetail("Entry identifier", () -> String.valueOf(getIdentifier())); + + CrashReportCategory rendererCategory = report.addCategory("Entry Renderer"); + try { + getDefinition().fillCrashReport(report, rendererCategory, this); + } catch (Throwable throwable) { + rendererCategory.setDetailError("Filling Report", throwable); + } + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java index 121c49c18..90e1da0bd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.plugin.client.entry; +import com.google.common.base.Suppliers; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import dev.architectury.fluid.FluidStack; @@ -47,10 +48,14 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlas; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.resources.language.I18n; import net.minecraft.core.Registry; @@ -69,6 +74,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -174,7 +180,21 @@ public class FluidEntryDefinition implements EntryDefinition<FluidStack>, EntryS return collection == null ? Collections.emptyList() : collection.getMatchingTags(value.getFluid()); } + @Override + public void fillCrashReport(CrashReport report, CrashReportCategory category, EntryStack<FluidStack> entry) { + EntryDefinition.super.fillCrashReport(report, category, entry); + FluidStack stack = entry.getValue(); + category.setDetail("Fluid Type", () -> String.valueOf(Registry.FLUID.getKey(stack.getFluid()))); + category.setDetail("Fluid Amount", () -> String.valueOf(stack.getAmount())); + category.setDetail("Fluid NBT", () -> String.valueOf(stack.getTag())); + } + public static class FluidEntryRenderer extends AbstractEntryRenderer<FluidStack> implements BatchedEntryRenderer<FluidStack, TextureAtlasSprite> { + private static final Supplier<TextureAtlasSprite> MISSING_SPRITE = Suppliers.memoize(() -> { + TextureAtlas atlas = Minecraft.getInstance().getModelManager().getAtlas(TextureAtlas.LOCATION_BLOCKS); + return atlas.getSprite(MissingTextureAtlasSprite.getLocation()); + }); + @Override public TextureAtlasSprite getExtraData(EntryStack<FluidStack> entry) { FluidStack stack = entry.getValue(); @@ -182,6 +202,10 @@ public class FluidEntryDefinition implements EntryDefinition<FluidStack>, EntryS return FluidStackHooks.getStillTexture(stack); } + private TextureAtlasSprite missingTexture() { + return MISSING_SPRITE.get(); + } + @Override public int getBatchIdentifier(EntryStack<FluidStack> entry, Rectangle bounds, TextureAtlasSprite extraData) { return 0; @@ -192,16 +216,17 @@ public class FluidEntryDefinition implements EntryDefinition<FluidStack>, EntryS @Override public void renderBase(EntryStack<FluidStack> entry, TextureAtlasSprite sprite, PoseStack matrices, MultiBufferSource.BufferSource immediate, Rectangle bounds, int mouseX, int mouseY, float delta) { + TextureAtlasSprite s = sprite == null ? missingTexture() : sprite; SpriteRenderer.beginPass() .setup(immediate, RenderType.solid()) - .sprite(sprite) - .color(FluidStackHooks.getColor(entry.getValue())) + .sprite(s) + .color(sprite == null ? 0xFFFFFF : FluidStackHooks.getColor(entry.getValue())) .light(0x00f000f0) .overlay(OverlayTexture.NO_OVERLAY) .alpha(0xff) .normal(matrices.last().normal(), 0, 0, 0) .position(matrices.last().pose(), bounds.x, bounds.getMaxY() - bounds.height * Mth.clamp(entry.get(EntryStack.Settings.FLUID_RENDER_RATIO), 0, 1), bounds.getMaxX(), bounds.getMaxY(), entry.getZ()) - .next(InventoryMenu.BLOCK_ATLAS); + .next(s.atlas().location()); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java index cc3a57941..ba5e0c08f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java @@ -48,6 +48,8 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.CrashReport; +import net.minecraft.CrashReportCategory; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.block.model.ItemTransforms; @@ -194,6 +196,16 @@ public class ItemEntryDefinition implements EntryDefinition<ItemStack>, EntrySer return Lists.newArrayList(asFormattedText(entry, value)); } + @Override + public void fillCrashReport(CrashReport report, CrashReportCategory category, EntryStack<ItemStack> entry) { + EntryDefinition.super.fillCrashReport(report, category, entry); + ItemStack stack = entry.getValue(); + category.setDetail("Item Type", () -> String.valueOf(stack.getItem())); + category.setDetail("Item Damage", () -> String.valueOf(stack.getDamageValue())); + category.setDetail("Item NBT", () -> String.valueOf(stack.getTag())); + category.setDetail("Item Foil", () -> String.valueOf(stack.hasFoil())); + } + @Environment(EnvType.CLIENT) public class ItemEntryRenderer extends AbstractEntryRenderer<ItemStack> implements BatchedEntryRenderer<ItemStack, BakedModel> { private static final float SCALE = 20.0F; |
