Skip to content

Commit

Permalink
Fix #553 Improve stability of tooltip gathering at startup.
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Oct 31, 2016
1 parent 4da735e commit 6501bef
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package mezz.jei.plugins.vanilla.ingredients;

import javax.annotation.Nullable;
import java.util.Collections;
import java.util.List;

import mezz.jei.api.ingredients.IIngredientRenderer;
import mezz.jei.util.ErrorUtil;
import mezz.jei.util.FakeClientPlayer;
import mezz.jei.util.Log;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;

Expand All @@ -26,7 +31,24 @@ public void render(Minecraft minecraft, int xPosition, int yPosition, @Nullable

@Override
public List<String> getTooltip(Minecraft minecraft, ItemStack ingredient) {
List<String> list = ingredient.getTooltip(minecraft.thePlayer, minecraft.gameSettings.advancedItemTooltips);
EntityPlayer player = minecraft.thePlayer;
if (player == null) {
player = FakeClientPlayer.getInstance();
}

List<String> list;
try {
list = ingredient.getTooltip(player, minecraft.gameSettings.advancedItemTooltips);
} catch (RuntimeException e) {
String itemStackInfo = ErrorUtil.getItemStackInfo(ingredient);
Log.error("Failed to get tooltip: {}", itemStackInfo, e);
return Collections.emptyList();
} catch (LinkageError e) {
String itemStackInfo = ErrorUtil.getItemStackInfo(ingredient);
Log.error("Failed to get tooltip: {}", itemStackInfo, e);
return Collections.emptyList();
}

for (int k = 0; k < list.size(); ++k) {
if (k == 0) {
list.set(k, ingredient.getRarity().rarityColor + list.get(k));
Expand Down
31 changes: 31 additions & 0 deletions src/main/java/mezz/jei/util/FakeClientPlayer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package mezz.jei.util;

import java.util.UUID;

import com.mojang.authlib.GameProfile;
import net.minecraft.entity.player.EntityPlayer;

public class FakeClientPlayer extends EntityPlayer {
public static FakeClientPlayer INSTANCE;

public static FakeClientPlayer getInstance() {
if (INSTANCE == null) {
INSTANCE = new FakeClientPlayer();
}
return INSTANCE;
}

private FakeClientPlayer() {
super(FakeClientWorld.getInstance(), new GameProfile(new UUID(0, 0), "JEI_Fake"));
}

@Override
public boolean isSpectator() {
return false;
}

@Override
public boolean isCreative() {
return false;
}
}
81 changes: 81 additions & 0 deletions src/main/java/mezz/jei/util/FakeClientWorld.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package mezz.jei.util;

import javax.annotation.Nullable;

import net.minecraft.profiler.Profiler;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.DimensionType;
import net.minecraft.world.GameType;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldSettings;
import net.minecraft.world.WorldType;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.EmptyChunk;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.storage.ISaveHandler;
import net.minecraft.world.storage.SaveDataMemoryStorage;
import net.minecraft.world.storage.SaveHandlerMP;
import net.minecraft.world.storage.WorldInfo;

public class FakeClientWorld extends World {
private static final WorldSettings worldSettings = new WorldSettings(0, GameType.SURVIVAL, false, false, WorldType.DEFAULT);
private static final WorldInfo worldInfo = new WorldInfo(worldSettings, "jei_fake");
private static final ISaveHandler saveHandler = new SaveHandlerMP();
private static final WorldProvider worldProvider = new WorldProvider() {
@Override
public DimensionType getDimensionType() {
return DimensionType.OVERWORLD;
}
};
private static FakeClientWorld INSTANCE;

public static FakeClientWorld getInstance() {
if (INSTANCE == null) {
INSTANCE = new FakeClientWorld();
}
return INSTANCE;
}

private FakeClientWorld() {
super(saveHandler, worldInfo, worldProvider, new Profiler(), true);
this.provider.registerWorld(this);
this.mapStorage = new SaveDataMemoryStorage();
}

@Override
public BlockPos getSpawnPoint() {
return new BlockPos(0, 0, 0);
}

@Override
protected IChunkProvider createChunkProvider() {
return new IChunkProvider() {
@Nullable
@Override
public Chunk getLoadedChunk(int x, int z) {
return new EmptyChunk(FakeClientWorld.this, x, z);
}

@Override
public Chunk provideChunk(int x, int z) {
return new EmptyChunk(FakeClientWorld.this, x, z);
}

@Override
public boolean unloadQueuedChunks() {
return false;
}

@Override
public String makeString() {
return "";
}
};
}

@Override
protected boolean isChunkLoaded(int x, int z, boolean allowEmpty) {
return false;
}
}
10 changes: 1 addition & 9 deletions src/main/java/mezz/jei/util/IngredientListElement.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,15 +120,7 @@ protected IngredientListElement(V ingredient, IIngredientHelper<V> ingredientHel
}

private static <T> String getTooltipString(T ingredient, IIngredientRenderer<T> ingredientRenderer, String modId, String modName, String displayName) {
List<String> tooltip;
try {
tooltip = ingredientRenderer.getTooltip(Minecraft.getMinecraft(), ingredient);
} catch (RuntimeException ignored) {
return "";
} catch (LinkageError ignored) {
return "";
}

List<String> tooltip = ingredientRenderer.getTooltip(Minecraft.getMinecraft(), ingredient);
String tooltipString = Joiner.on(' ').join(tooltip).toLowerCase();
tooltipString = removeChatFormatting(tooltipString);
tooltipString = tooltipString.replace(modId, "");
Expand Down

0 comments on commit 6501bef

Please sign in to comment.