aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/thatgravyboat/skyblockhud/tracker
diff options
context:
space:
mode:
authorLorenz <ESs95s3P5z8Pheb>2022-07-07 00:31:50 +0200
committerLorenz <ESs95s3P5z8Pheb>2022-07-07 00:31:50 +0200
commit99773d6a593c444151503de315f127bea6f74d49 (patch)
tree9ee1ae505e5f82aba62f10c882af85a3acd6e483 /src/main/java/com/thatgravyboat/skyblockhud/tracker
downloadskyhanni-99773d6a593c444151503de315f127bea6f74d49.tar.gz
skyhanni-99773d6a593c444151503de315f127bea6f74d49.tar.bz2
skyhanni-99773d6a593c444151503de315f127bea6f74d49.zip
init lorenz mod
Diffstat (limited to 'src/main/java/com/thatgravyboat/skyblockhud/tracker')
-rw-r--r--src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerFileLoader.java136
-rw-r--r--src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerHandler.java111
-rw-r--r--src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerObject.java97
3 files changed, 344 insertions, 0 deletions
diff --git a/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerFileLoader.java b/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerFileLoader.java
new file mode 100644
index 000000000..7401dd8c1
--- /dev/null
+++ b/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerFileLoader.java
@@ -0,0 +1,136 @@
+package com.thatgravyboat.skyblockhud.tracker;
+
+import com.google.gson.*;
+import com.thatgravyboat.skyblockhud.SkyblockHud;
+import com.thatgravyboat.skyblockhud.location.Locations;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Locale;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.ResourceLocation;
+
+public class TrackerFileLoader {
+
+ private static final Gson gson = new GsonBuilder().create();
+
+ private static void loadTrackers(JsonObject object) {
+ for (JsonElement element : object.get("trackers").getAsJsonArray()) {
+ JsonObject tracker = element.getAsJsonObject();
+ EnumSet<Locations> locations = EnumSet.noneOf(Locations.class);
+ tracker
+ .get("location")
+ .getAsJsonArray()
+ .forEach(l -> {
+ Locations location = Locations.get(l.getAsString().toUpperCase(Locale.ENGLISH));
+ if (location != Locations.DEFAULT) {
+ locations.add(location);
+ }
+ });
+ if (tracker.has("drops")) {
+ for (JsonElement drop : tracker.get("drops").getAsJsonArray()) {
+ TrackerHandler.trackerObjects.add(new TrackerObject(drop.getAsJsonObject(), locations));
+ }
+ }
+ if (tracker.has("mobs")) {
+ for (JsonElement mob : tracker.get("mobs").getAsJsonArray()) {
+ TrackerHandler.trackerObjects.add(new TrackerObject(mob.getAsJsonObject(), locations));
+ }
+ }
+ }
+
+ for (TrackerObject trackerObject : TrackerHandler.trackerObjects) {
+ for (Locations location : trackerObject.getLocations()) {
+ if (TrackerHandler.trackers.containsKey(location)) {
+ TrackerHandler.trackers.get(location).put(trackerObject.getInternalId(), trackerObject);
+ } else {
+ HashMap<String, TrackerObject> value = new HashMap<>();
+ value.put(trackerObject.getInternalId(), trackerObject);
+ TrackerHandler.trackers.put(location, value);
+ }
+ }
+ }
+ }
+
+ public static void loadTrackersFile() {
+ TrackerHandler.trackers.clear();
+ TrackerHandler.trackerObjects.clear();
+ try {
+ ResourceLocation trackers = new ResourceLocation("skyblockhud:data/trackers.json");
+ InputStream is = Minecraft.getMinecraft().getResourceManager().getResource(trackers).getInputStream();
+
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) {
+ loadTrackers(gson.fromJson(reader, JsonObject.class));
+ }
+ } catch (Exception ignored) {}
+ }
+
+ private static JsonElement getTrackerFile() {
+ JsonArray stats = new JsonArray();
+ TrackerHandler.trackerObjects.forEach(trackerObject -> {
+ if (trackerObject.getCount() > 0) {
+ JsonObject jsonObject = new JsonObject();
+ JsonArray locations = new JsonArray();
+ trackerObject.getLocations().forEach(l -> locations.add(new JsonPrimitive(l.toString().toUpperCase(Locale.ENGLISH))));
+ jsonObject.add("id", new JsonPrimitive(trackerObject.getInternalId()));
+ jsonObject.add("locations", locations);
+ jsonObject.add("count", new JsonPrimitive(trackerObject.getCount()));
+ stats.add(jsonObject);
+ }
+ });
+ return stats;
+ }
+
+ public static boolean loadTrackerStatsFile() {
+ File configFile = new File(SkyblockHud.configDirectory, "sbh-trackers-stats.json");
+
+ try {
+ if (configFile.createNewFile()) {
+ return true;
+ }
+
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8))) {
+ JsonObject json = gson.fromJson(reader, JsonObject.class);
+ if (json.has("trackerStats")) {
+ json
+ .getAsJsonArray("trackerStats")
+ .forEach(element -> {
+ if (element.isJsonObject()) {
+ JsonObject object = element.getAsJsonObject();
+ JsonArray locations = object.get("locations").getAsJsonArray();
+ Locations firstLocation = null;
+ for (JsonElement location : locations) {
+ firstLocation = Locations.get(location.getAsString());
+ if (!firstLocation.equals(Locations.DEFAULT)) break;
+ }
+
+ if (firstLocation != null && !firstLocation.equals(Locations.DEFAULT)) {
+ TrackerHandler.trackers.get(firstLocation).get(object.get("id").getAsString()).setCount(object.get("count").getAsInt());
+ }
+ }
+ });
+
+ TrackerHandler.trackers.forEach((location, map) -> {
+ TrackerHandler.trackers.put(location, TrackerHandler.sortTrackers(map, (entry1, entry2) -> Integer.compare(entry2.getValue().getCount(), entry1.getValue().getCount())));
+ });
+ }
+ }
+ } catch (Exception ignored) {}
+ return false;
+ }
+
+ public static void saveTrackerStatsFile() {
+ File configFile = new File(SkyblockHud.configDirectory, "sbh-trackers-stats.json");
+
+ try {
+ configFile.createNewFile();
+
+ try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8))) {
+ JsonObject json = new JsonObject();
+ json.add("trackerStats", getTrackerFile());
+ writer.write(gson.toJson(json));
+ }
+ } catch (IOException ignored) {}
+ }
+}
diff --git a/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerHandler.java b/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerHandler.java
new file mode 100644
index 000000000..f8eaba306
--- /dev/null
+++ b/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerHandler.java
@@ -0,0 +1,111 @@
+package com.thatgravyboat.skyblockhud.tracker;
+
+import com.thatgravyboat.skyblockhud.SkyblockHud;
+import com.thatgravyboat.skyblockhud.api.events.SkyBlockEntityKilled;
+import com.thatgravyboat.skyblockhud.core.config.Position;
+import com.thatgravyboat.skyblockhud.location.LocationHandler;
+import com.thatgravyboat.skyblockhud.location.Locations;
+import com.thatgravyboat.skyblockhud.utils.Utils;
+import java.util.*;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.Gui;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.entity.RenderItem;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.client.event.RenderGameOverlayEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+
+public class TrackerHandler extends Gui {
+
+ public static Set<TrackerObject> trackerObjects = new HashSet<>();
+ public static LinkedHashMap<Locations, Map<String, TrackerObject>> trackers = new LinkedHashMap<>();
+
+ public static <K, V> Map<K, V> sortTrackers(Map<K, V> map, Comparator<? super Map.Entry<K, V>> comparator) {
+ List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
+ list.sort(comparator);
+
+ Map<K, V> result = new LinkedHashMap<>();
+ for (Map.Entry<K, V> entry : list) {
+ result.put(entry.getKey(), entry.getValue());
+ }
+
+ return result;
+ }
+
+ public static void onItemAdded(String id, int amount, String specialId, int number) {
+ if (SkyblockHud.hasSkyblockScoreboard() && trackers.containsKey(LocationHandler.getCurrentLocation())) {
+ Map<String, TrackerObject> trackerMap = trackers.get(LocationHandler.getCurrentLocation());
+ String dropId = id;
+ if (specialId != null) {
+ dropId = specialId.toUpperCase() + ";" + number;
+ }
+
+ if (trackerMap != null && trackerMap.containsKey(dropId)) {
+ TrackerObject object = trackerMap.get(dropId);
+ object.increaseCount(amount);
+ trackers.put(LocationHandler.getCurrentLocation(), sortTrackers(trackerMap, (entry1, entry2) -> Integer.compare(entry2.getValue().getCount(), entry1.getValue().getCount())));
+ }
+ }
+ }
+
+ public static void drawItemStack(ItemStack stack, int x, int y) {
+ if (stack == null) return;
+ RenderItem itemRender = Minecraft.getMinecraft().getRenderItem();
+ RenderHelper.enableGUIStandardItemLighting();
+ itemRender.zLevel = -145;
+ itemRender.renderItemAndEffectIntoGUI(stack, x, y);
+ itemRender.zLevel = 0;
+ RenderHelper.disableStandardItemLighting();
+ }
+
+ @SubscribeEvent
+ public void onSbEntityDeath(SkyBlockEntityKilled event) {
+ if (SkyblockHud.hasSkyblockScoreboard() && trackers.containsKey(LocationHandler.getCurrentLocation())) {
+ Map<String, TrackerObject> trackerMap = trackers.get(LocationHandler.getCurrentLocation());
+ if (trackerMap.containsKey("ENTITY:" + event.id)) {
+ TrackerObject object = trackerMap.get("ENTITY:" + event.id);
+ object.increaseCount();
+ trackers.put(LocationHandler.getCurrentLocation(), sortTrackers(trackerMap, (entry1, entry2) -> Integer.compare(entry2.getValue().getCount(), entry1.getValue().getCount())));
+ }
+ }
+ }
+
+ @SubscribeEvent
+ public void renderOverlay(RenderGameOverlayEvent.Post event) {
+ if (Utils.overlayShouldRender(event.type, SkyblockHud.hasSkyblockScoreboard(), trackers.containsKey(LocationHandler.getCurrentLocation()), !SkyblockHud.config.trackers.hideTracker)) {
+ Map<String, TrackerObject> tracker = trackers.get(LocationHandler.getCurrentLocation());
+ Minecraft mc = Minecraft.getMinecraft();
+
+ if (tracker != null) {
+ Position pos = SkyblockHud.config.trackers.trackerPosition;
+ int startPos = pos.getAbsX(event.resolution, (tracker.size() >= 6 ? 130 : tracker.size() * 20));
+ int y = pos.getAbsY(event.resolution, (int) (10 + Math.ceil(tracker.size() / 5d) * 20));
+
+ Gui.drawRect(startPos, y, startPos + 130, y + 10, -1072689136);
+ mc.fontRendererObj.drawString("Tracker", startPos + 4, y + 1, 0xffffff, false);
+ y += 10;
+ Gui.drawRect(startPos, y, startPos + (tracker.size() >= 6 ? 130 : (tracker.size() * 20) + 10), (int) (y + (Math.ceil(tracker.size() / 5d) * 20)), 1610612736);
+ int x = startPos + 5;
+ for (TrackerObject object : tracker.values()) {
+ String s = Utils.formattedNumber(object.getCount(), 1000);
+ GlStateManager.disableLighting();
+ GlStateManager.enableDepth();
+ drawItemStack(object.getDisplayStack(), x, y);
+ GlStateManager.disableDepth();
+ GlStateManager.disableBlend();
+ mc.fontRendererObj.drawStringWithShadow(s, (float) (x + 19 - 2 - mc.fontRendererObj.getStringWidth(s)), (float) (y + 9), object.getCount() < 1 ? 16733525 : 16777215);
+ GlStateManager.enableBlend();
+ GlStateManager.enableDepth();
+
+ if ((x - startPos + 5) / 20 == 5) {
+ x = startPos + 5;
+ y += 20;
+ } else {
+ x += 20;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerObject.java b/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerObject.java
new file mode 100644
index 000000000..1c6e54d43
--- /dev/null
+++ b/src/main/java/com/thatgravyboat/skyblockhud/tracker/TrackerObject.java
@@ -0,0 +1,97 @@
+package com.thatgravyboat.skyblockhud.tracker;
+
+import com.google.gson.JsonObject;
+import com.thatgravyboat.skyblockhud.location.Locations;
+import java.util.EnumSet;
+import java.util.Locale;
+import net.minecraft.item.Item;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTBase;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.nbt.NBTTagList;
+import net.minecraft.util.ResourceLocation;
+
+public class TrackerObject {
+
+ private final ItemStack stack;
+ private final String internalId;
+ private final EnumSet<Locations> locations;
+ private final boolean isEntity;
+ private int count;
+
+ public TrackerObject(JsonObject jsonObject, EnumSet<Locations> locations) {
+ this.stack = decodeToItemStack(jsonObject);
+ this.internalId = jsonObject.get("id").getAsString();
+ this.isEntity = jsonObject.get("id").getAsString().contains("entity:");
+ this.locations = locations;
+ }
+
+ public static ItemStack decodeToItemStack(JsonObject jsonObject) {
+ jsonObject = jsonObject.getAsJsonObject("displayItem");
+ int meta = jsonObject.get("meta").getAsInt();
+ ResourceLocation itemid = new ResourceLocation(jsonObject.get("item").getAsString());
+ ItemStack stack = new ItemStack(Item.itemRegistry.getObject(itemid), 0, meta);
+ if (jsonObject.has("displayName")) stack.setStackDisplayName(jsonObject.get("displayName").getAsString());
+ if (jsonObject.has("skullData") && itemid.getResourcePath().equals("skull") && meta == 3) {
+ stack.setTagInfo("SkullOwner", getSkullTag(jsonObject.getAsJsonObject("skullData")));
+ }
+ if (jsonObject.has("enchanted") && jsonObject.get("enchanted").getAsBoolean()) {
+ stack.setTagInfo("ench", new NBTTagList());
+ }
+ if (!jsonObject.get("id").getAsString().contains("entity:")) {
+ NBTTagCompound extraAttributes = new NBTTagCompound();
+ extraAttributes.setString("id", jsonObject.get("id").getAsString());
+ stack.setTagInfo("ExtraAttributes", extraAttributes);
+ }
+ return stack;
+ }
+
+ public static NBTBase getSkullTag(JsonObject skullObject) {
+ NBTTagCompound skullOwner = new NBTTagCompound();
+ NBTTagCompound properties = new NBTTagCompound();
+ NBTTagList textures = new NBTTagList();
+ NBTTagCompound value = new NBTTagCompound();
+
+ skullOwner.setString("Id", skullObject.get("id").getAsString());
+
+ value.setString("Value", skullObject.get("texture").getAsString());
+ textures.appendTag(value);
+
+ properties.setTag("textures", textures);
+
+ skullOwner.setTag("Properties", properties);
+ return skullOwner;
+ }
+
+ public void increaseCount(int amount) {
+ count += amount;
+ }
+
+ public void increaseCount() {
+ count++;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
+
+ public int getCount() {
+ return count;
+ }
+
+ public ItemStack getDisplayStack() {
+ return stack;
+ }
+
+ public EnumSet<Locations> getLocations() {
+ return locations;
+ }
+
+ public String getInternalId() {
+ return internalId.toUpperCase(Locale.ENGLISH);
+ }
+
+ public boolean isEntity() {
+ return isEntity;
+ }
+}