aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRarityBackgrounds.java
blob: b6020e6e9f79548aeca7c72c49d88dee2a328a60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package me.xmrvizzy.skyblocker.skyblock.item;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;

import com.google.common.collect.ImmutableMap;
import com.mojang.blaze3d.systems.RenderSystem;

import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap;
import me.xmrvizzy.skyblocker.SkyblockerMod;
import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.item.TooltipContext;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.texture.Sprite;
import net.minecraft.item.ItemStack;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;

public class ItemRarityBackgrounds {
	private static final Identifier RARITY_BG_TEX = new Identifier(SkyblockerMod.NAMESPACE, "item_rarity_background");
	private static final Supplier<Sprite> SPRITE = () -> MinecraftClient.getInstance().getGuiAtlasManager().getSprite(RARITY_BG_TEX);
	private static final ImmutableMap<String, SkyblockItemRarity> LORE_RARITIES = ImmutableMap.ofEntries(
			Map.entry("ADMIN", SkyblockItemRarity.ADMIN),
			Map.entry("SPECIAL", SkyblockItemRarity.SPECIAL), //Very special is the same color so this will cover it
			Map.entry("DIVINE", SkyblockItemRarity.DIVINE),
			Map.entry("MYTHIC", SkyblockItemRarity.MYTHIC),
			Map.entry("LEGENDARY", SkyblockItemRarity.LEGENDARY),
			Map.entry("LEGENJERRY", SkyblockItemRarity.LEGENDARY),
			Map.entry("EPIC", SkyblockItemRarity.EPIC),
			Map.entry("RARE", SkyblockItemRarity.RARE),
			Map.entry("UNCOMMON", SkyblockItemRarity.UNCOMMON),
			Map.entry("COMMON", SkyblockItemRarity.COMMON));
	
	private static final Int2ReferenceOpenHashMap<SkyblockItemRarity> CACHE = new Int2ReferenceOpenHashMap<>();
	
	public static void init() {
		//Clear the cache every 5 minutes, ints are very compact!
		Scheduler.INSTANCE.scheduleCyclic(() -> CACHE.clear(), 4800);
	}
	
	public static void tryDraw(ItemStack stack, DrawContext context, int x, int y) {
		MinecraftClient client = MinecraftClient.getInstance();
		
		if (client.player != null) {
			SkyblockItemRarity itemRarity = getItemRarity(stack, client.player);
			
			if (itemRarity != null) draw(context, x, y, itemRarity);
		}
	}
	
	private static SkyblockItemRarity getItemRarity(ItemStack stack, ClientPlayerEntity player) {
		if (stack == null || stack.isEmpty()) return null;
		
		int hashCode = System.identityHashCode(stack);
		if (CACHE.containsKey(hashCode)) return CACHE.get(hashCode);
				
		List<Text> tooltip = stack.getTooltip(player, TooltipContext.BASIC);
		String[] stringifiedTooltip = tooltip.stream().map(Text::getString).toArray(String[]::new);
		
		for (String rarity : LORE_RARITIES.keySet()) {
			if (Arrays.stream(stringifiedTooltip).anyMatch(line -> line.contains(rarity))) {
				SkyblockItemRarity foundRarity = LORE_RARITIES.get(rarity);
				
				CACHE.put(hashCode, foundRarity);
				return LORE_RARITIES.get(rarity);
			}
		}
		
		CACHE.put(hashCode, null);
		return null;
	}
	
	private static void draw(DrawContext context, int x, int y, SkyblockItemRarity rarity) {
		//Enable blending to handle HUD translucency
		RenderSystem.enableBlend();
		RenderSystem.defaultBlendFunc();
		
		context.drawSprite(x, y, 0, 16, 16, SPRITE.get(), rarity.r, rarity.g, rarity.b, 1f);
		
		RenderSystem.disableBlend();
	}
}