Made error handling for rendering grid stacks a bit more robust

This commit is contained in:
raoulvdberge
2019-10-28 12:52:14 +01:00
parent db076b7b8d
commit dd76961f8e
3 changed files with 91 additions and 63 deletions

View File

@@ -25,6 +25,8 @@ import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.client.config.GuiCheckBox; import net.minecraftforge.fml.client.config.GuiCheckBox;
import net.minecraftforge.fml.client.config.GuiUtils; import net.minecraftforge.fml.client.config.GuiUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -36,6 +38,8 @@ public abstract class BaseScreen<T extends Container> extends ContainerScreen<T>
private static final Map<String, ResourceLocation> TEXTURE_CACHE = new HashMap<>(); private static final Map<String, ResourceLocation> TEXTURE_CACHE = new HashMap<>();
private static final Map<Class, Queue<Consumer>> ACTIONS = new HashMap<>(); private static final Map<Class, Queue<Consumer>> ACTIONS = new HashMap<>();
private Logger logger = LogManager.getLogger(getClass());
private int sideButtonY; private int sideButtonY;
public BaseScreen(T container, int xSize, int ySize, PlayerInventory inventory, ITextComponent title) { public BaseScreen(T container, int xSize, int ySize, PlayerInventory inventory, ITextComponent title) {
@@ -227,39 +231,27 @@ public abstract class BaseScreen<T extends Container> extends ContainerScreen<T>
} }
public void renderItem(int x, int y, ItemStack stack) { public void renderItem(int x, int y, ItemStack stack) {
renderItem(x, y, stack, false); renderItem(x, y, stack, false, null);
} }
public void renderItem(int x, int y, ItemStack stack, boolean withOverlay) { public void renderItem(int x, int y, ItemStack stack, boolean overlay, @Nullable String text) {
renderItem(x, y, stack, withOverlay, null); try {
}
public void renderItem(int x, int y, ItemStack stack, boolean withOverlay, @Nullable String text) {
itemRenderer.zLevel = 200.0F; itemRenderer.zLevel = 200.0F;
try {
itemRenderer.renderItemIntoGUI(stack, x, y); itemRenderer.renderItemIntoGUI(stack, x, y);
} catch (Throwable t) {
// NO OP
}
if (withOverlay) { if (overlay) {
renderItemOverlay(stack, text, x, y);
}
itemRenderer.zLevel = 0.0F;
}
public void renderItemOverlay(ItemStack stack, @Nullable String text, int x, int y) {
try {
this.itemRenderer.renderItemOverlayIntoGUI(font, stack, x, y, ""); this.itemRenderer.renderItemOverlayIntoGUI(font, stack, x, y, "");
} catch (Throwable t) {
// NO OP
} }
if (text != null) { if (text != null) {
renderQuantity(x, y, text); renderQuantity(x, y, text);
} }
itemRenderer.zLevel = 0.0F;
} catch (Throwable t) {
logger.warn("Couldn't render stack: " + stack.getItem().toString(), t);
}
} }
public void renderQuantity(int x, int y, String qty) { public void renderQuantity(int x, int y, String qty) {

View File

@@ -7,18 +7,25 @@ import com.raoulvdberge.refinedstorage.screen.BaseScreen;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.UUID; import java.util.UUID;
public class FluidGridStack implements IGridStack { public class FluidGridStack implements IGridStack {
private Logger logger = LogManager.getLogger(getClass());
private UUID id; private UUID id;
private FluidStack stack; private FluidStack stack;
@Nullable @Nullable
private StorageTrackerEntry entry; private StorageTrackerEntry entry;
private boolean craftable; private boolean craftable;
private String modId;
private String modName; private String cachedName;
private String cachedTooltip;
private String cachedModId;
private String cachedModName;
public FluidGridStack(UUID id, FluidStack stack, @Nullable StorageTrackerEntry entry, boolean craftable) { public FluidGridStack(UUID id, FluidStack stack, @Nullable StorageTrackerEntry entry, boolean craftable) {
this.id = id; this.id = id;
@@ -43,35 +50,45 @@ public class FluidGridStack implements IGridStack {
@Override @Override
public String getName() { public String getName() {
return stack.getDisplayName().getFormattedText(); if (cachedName == null) {
try {
cachedName = stack.getDisplayName().getFormattedText();
} catch (Throwable t) {
logger.warn("Could not retrieve fluid name of " + stack.getFluid().getRegistryName().toString(), t);
cachedName = "<Error>";
}
}
return cachedName;
} }
@Override @Override
public String getModId() { public String getModId() {
if (modId == null) { if (cachedModId == null) {
ResourceLocation registryName = stack.getFluid().getRegistryName(); ResourceLocation registryName = stack.getFluid().getRegistryName();
if (registryName != null) { if (registryName != null) {
modId = registryName.getNamespace(); cachedModId = registryName.getNamespace();
} else { } else {
modId = "???"; cachedModId = "<Error>";
} }
} }
return modId; return cachedModId;
} }
@Override @Override
public String getModName() { public String getModName() {
if (modName == null) { if (cachedModName == null) {
modName = ItemGridStack.getModNameByModId(getModId()); cachedModName = ItemGridStack.getModNameByModId(getModId());
if (modName == null) { if (cachedModName == null) {
modName = "???"; cachedModName = "<Error>";
} }
} }
return modName; return cachedModName;
} }
@Override @Override
@@ -82,7 +99,17 @@ public class FluidGridStack implements IGridStack {
@Override @Override
public String getTooltip() { public String getTooltip() {
return stack.getDisplayName().getFormattedText(); if (cachedTooltip == null) {
try {
cachedTooltip = stack.getDisplayName().getFormattedText();
} catch (Throwable t) {
cachedTooltip = "<Error>";
logger.warn("Could not retrieve fluid tooltip of " + stack.getFluid().getRegistryName().toString(), t);
}
}
return cachedTooltip;
} }
@Override @Override

View File

@@ -8,6 +8,8 @@ import net.minecraft.client.resources.I18n;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.ModContainer;
import net.minecraftforge.fml.ModList; import net.minecraftforge.fml.ModList;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.Optional; import java.util.Optional;
@@ -15,6 +17,8 @@ import java.util.UUID;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class ItemGridStack implements IGridStack { public class ItemGridStack implements IGridStack {
private Logger logger = LogManager.getLogger(getClass());
private UUID id; private UUID id;
private ItemStack stack; private ItemStack stack;
private String cachedName; private String cachedName;
@@ -22,9 +26,10 @@ public class ItemGridStack implements IGridStack {
private String[] oreIds = null; private String[] oreIds = null;
@Nullable @Nullable
private StorageTrackerEntry entry; private StorageTrackerEntry entry;
private String modId;
private String modName; private String cachedModId;
private String tooltip; private String cachedModName;
private String cachedTooltip;
public ItemGridStack(ItemStack stack) { public ItemGridStack(ItemStack stack) {
this.stack = stack; this.stack = stack;
@@ -60,41 +65,43 @@ public class ItemGridStack implements IGridStack {
@Override @Override
public String getName() { public String getName() {
try {
if (cachedName == null) { if (cachedName == null) {
try {
cachedName = stack.getDisplayName().getFormattedText(); cachedName = stack.getDisplayName().getFormattedText();
} catch (Throwable t) {
logger.warn("Could not retrieve item name of " + stack.getItem().toString(), t);
cachedName = "<Error>";
}
} }
return cachedName; return cachedName;
} catch (Throwable t) {
return "";
}
} }
@Override @Override
public String getModId() { public String getModId() {
if (modId == null) { if (cachedModId == null) {
modId = stack.getItem().getCreatorModId(stack); cachedModId = stack.getItem().getCreatorModId(stack);
if (modId == null) { if (cachedModId == null) {
modId = "???"; cachedModId = "<Error>";
} }
} }
return modId; return cachedModId;
} }
@Override @Override
public String getModName() { public String getModName() {
if (modName == null) { if (cachedModName == null) {
modName = getModNameByModId(getModId()); cachedModName = getModNameByModId(getModId());
if (modName == null) { if (cachedModName == null) {
modName = "???"; cachedModName = "<Error>";
} }
} }
return modName; return cachedModName;
} }
@Override @Override
@@ -113,15 +120,17 @@ public class ItemGridStack implements IGridStack {
@Override @Override
public String getTooltip() { public String getTooltip() {
if (tooltip == null) { if (cachedTooltip == null) {
try { try {
tooltip = RenderUtils.getTooltipFromItem(stack).stream().collect(Collectors.joining("\n")); cachedTooltip = RenderUtils.getTooltipFromItem(stack).stream().collect(Collectors.joining("\n"));
} catch (Throwable t) { } catch (Throwable t) {
tooltip = ""; logger.warn("Could not retrieve item tooltip of " + stack.getItem().toString(), t);
cachedTooltip = "<Error>";
} }
} }
return tooltip; return cachedTooltip;
} }
@Override @Override