307 lines
11 KiB
Java
307 lines
11 KiB
Java
package lel.flummi.skilloverlay.overlays;
|
|
|
|
import net.minecraft.client.MinecraftClient;
|
|
import net.minecraft.client.util.math.MatrixStack;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NbtCompound;
|
|
import net.minecraft.util.Formatting;
|
|
import net.minecraft.client.gui.DrawableHelper;
|
|
import com.mojang.blaze3d.systems.RenderSystem;
|
|
|
|
//import lel.flummi.skilloverlay.skilloverlay;
|
|
import lel.flummi.skilloverlay.utils.LerpUtils;
|
|
import net.fabricmc.api.EnvType;
|
|
import net.fabricmc.api.Environment;
|
|
|
|
import java.text.NumberFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.Collections;
|
|
import java.util.LinkedList;
|
|
|
|
@Environment(EnvType.CLIENT)
|
|
public class FarmingOverlay extends DrawableHelper {
|
|
private MinecraftClient client;
|
|
private MatrixStack matrixStack;
|
|
|
|
private long lastUpdate = -1;
|
|
private final LinkedList<Long> counterQueue = new LinkedList<>();
|
|
private int cultivatingTier = -1;
|
|
private String cultivatingTierAmount = "1";
|
|
private long counter = -1;
|
|
private int cultivating = -1;
|
|
private int cultivatingLast = -1;
|
|
private float cropsPerSecondLast = 0;
|
|
private float cropsPerSecond = 0;
|
|
private ArrayList<Float> cropsOverLastXSeconds = new ArrayList<>();
|
|
private String cropName;
|
|
|
|
public FarmingOverlay() {
|
|
/*HudRenderCallback.EVENT.register((matrixStack, tickDelta) -> {
|
|
if(client.player == null)
|
|
return;
|
|
this.render(matrixStack, client);
|
|
});*/
|
|
}
|
|
|
|
public void render(MatrixStack matrixStack, MinecraftClient client) {
|
|
if (client.player == null)
|
|
return;
|
|
|
|
this.matrixStack = matrixStack;
|
|
this.client = MinecraftClient.getInstance();
|
|
|
|
RenderSystem.enableBlend();
|
|
this.renderOverlay();
|
|
|
|
this.client.getProfiler().pop();
|
|
}
|
|
|
|
public void renderOverlay() {
|
|
this.lastUpdate = System.currentTimeMillis();
|
|
ItemStack heldItem = client.player.getMainHandStack();
|
|
String internalName = "";
|
|
this.counter = 0;
|
|
boolean holdingFarmItem = false;
|
|
this.cultivatingLast = cultivating;
|
|
this.cultivating = 0;
|
|
|
|
//System.out.println(skilloverlay.PROFILE.data().skills().get("farming").level());
|
|
|
|
if (heldItem != null) {
|
|
NbtCompound tag = heldItem.getNbt();
|
|
|
|
if (tag != null && tag.contains("ExtraAttributes", 10)) {
|
|
NbtCompound ea = tag.getCompound("ExtraAttributes");
|
|
internalName = ea.getString("id");
|
|
|
|
for (CropType crop : CropType.values()) {
|
|
if (internalName.startsWith(crop.toolName)) {
|
|
this.cropName = crop.item;
|
|
holdingFarmItem = true;
|
|
}
|
|
}
|
|
if(holdingFarmItem) {
|
|
if (ea.contains("mined_crops", 99)) {
|
|
this.counter = ea.getLong("mined_crops");
|
|
cultivating = ea.getInt("farmed_cultivating");
|
|
this.counterQueue.add(0, this.counter);
|
|
} else if (ea.contains("farmed_cultivating", 99)) {
|
|
this.counter = ea.getInt("farmed_cultivating");
|
|
cultivating = ea.getInt("farmed_cultivating");
|
|
this.counterQueue.add(0, this.counter);
|
|
}
|
|
}
|
|
else
|
|
holdingFarmItem = false;
|
|
}
|
|
|
|
if (this.cultivating < 1000) {
|
|
this.cultivatingTier = 1;
|
|
this.cultivatingTierAmount = "1,000";
|
|
} else if (this.cultivating < 5000) {
|
|
this.cultivatingTier = 2;
|
|
this.cultivatingTierAmount = "5,000";
|
|
} else if (this.cultivating < 25000) {
|
|
this.cultivatingTier = 3;
|
|
this.cultivatingTierAmount = "25,000";
|
|
} else if (this.cultivating < 100000) {
|
|
this.cultivatingTier = 4;
|
|
this.cultivatingTierAmount = "100,000";
|
|
} else if (this.cultivating < 300000) {
|
|
this.cultivatingTier = 5;
|
|
this.cultivatingTierAmount = "300,000";
|
|
} else if (this.cultivating < 1500000) {
|
|
this.cultivatingTier = 6;
|
|
this.cultivatingTierAmount = "1,500,000";
|
|
} else if (this.cultivating < 5000000) {
|
|
this.cultivatingTier = 7;
|
|
this.cultivatingTierAmount = "5,000,000";
|
|
} else if (this.cultivating < 20000000) {
|
|
this.cultivatingTier = 8;
|
|
this.cultivatingTierAmount = "20,000,000";
|
|
} else if (this.cultivating < 100000000) {
|
|
this.cultivatingTier = 9;
|
|
this.cultivatingTierAmount = "100,000,000";
|
|
} else if (this.cultivating > 100000000) {
|
|
this.cultivatingTier = 10;
|
|
this.cultivatingTierAmount = "Maxed";
|
|
}
|
|
}
|
|
|
|
while (this.counterQueue.size() >= 4) {
|
|
this.counterQueue.removeLast();
|
|
}
|
|
|
|
if (this.counterQueue.isEmpty()) {
|
|
this.cropsPerSecond = -1;
|
|
this.cropsPerSecondLast = 0;
|
|
} else {
|
|
this.cropsPerSecondLast = this.cropsPerSecond;
|
|
long last = this.counterQueue.getLast();
|
|
long first = this.counterQueue.getFirst();
|
|
while (this.cropsOverLastXSeconds.size() > 60) {
|
|
this.cropsOverLastXSeconds.remove(0);
|
|
}
|
|
if ((first - last) / 2f != 0) {
|
|
this.cropsOverLastXSeconds.add((first - last) / 2f);
|
|
} else {
|
|
if (this.cropsPerSecondLast == 0) {
|
|
int i = 12;
|
|
while (i > 0) {
|
|
i--;
|
|
if (this.cropsOverLastXSeconds.size() > 0) {
|
|
this.cropsOverLastXSeconds.remove(0);
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!holdingFarmItem) {
|
|
this.cropsOverLastXSeconds.clear();
|
|
this.cropsPerSecond = -1;
|
|
this.cropsPerSecondLast = 0;
|
|
}
|
|
|
|
ArrayList<Float> temp = new ArrayList<>(cropsOverLastXSeconds);
|
|
if (this.cropsOverLastXSeconds.size() >= 3) {
|
|
temp.remove(Collections.min(temp));
|
|
}
|
|
if (this.cropsOverLastXSeconds.size() >= 6) {
|
|
temp.remove(Collections.min(temp));
|
|
temp.remove(Collections.max(temp));
|
|
}
|
|
if (this.cropsOverLastXSeconds.size() >= 10) {
|
|
temp.remove(Collections.max(temp));
|
|
}
|
|
|
|
float cropsOverLastXSecondsTotal = 0;
|
|
for (Float crops : temp) {
|
|
cropsOverLastXSecondsTotal += crops;
|
|
}
|
|
this.cropsPerSecond = temp.size() != 0 && cropsOverLastXSecondsTotal != 0
|
|
? cropsOverLastXSecondsTotal / temp.size()
|
|
: 0;
|
|
}
|
|
|
|
ArrayList<OverlayString> overlayStringList = new ArrayList<>();
|
|
NumberFormat format = NumberFormat.getIntegerInstance();
|
|
|
|
// Add all the lines to the array
|
|
if (this.counter >= 0 && this.cultivating != this.counter) {
|
|
overlayStringList.add(new OverlayString("Counter", format.format(this.counter)));
|
|
}
|
|
|
|
if (this.counter >= 0) {
|
|
if (this.cropsPerSecondLast == this.cropsPerSecond && this.cropsPerSecond <= 0) {
|
|
overlayStringList.add(new OverlayString(this.cropName + "/m", "N/A"));
|
|
} else {
|
|
float cpsInterp = interp(this.cropsPerSecond, this.cropsPerSecondLast);
|
|
overlayStringList.add(new OverlayString(this.cropName + "/m", String.format("%,.2f", cpsInterp * 60 * 30)));
|
|
}
|
|
}
|
|
|
|
if (this.cultivatingTier <= 9 && this.cultivating > 0) {
|
|
int counterInterp = (int) interp(this.cultivating, this.cultivatingLast);
|
|
overlayStringList.add(new OverlayString("Cultivating", format.format(counterInterp) + "/" + this.cultivatingTierAmount));
|
|
}
|
|
if (this.cultivatingTier == 10) {
|
|
int counterInterp = (int) interp(this.cultivating, this.cultivatingLast);
|
|
overlayStringList.add(new OverlayString("Cultivating", format.format(counterInterp)));
|
|
}
|
|
|
|
float yaw = client.player.getYaw();
|
|
float pitch = client.player.getPitch();
|
|
yaw %= 360;
|
|
if (yaw < 0)
|
|
yaw += 360;
|
|
if (yaw > 180)
|
|
yaw -= 360;
|
|
pitch %= 360;
|
|
if (pitch < 0)
|
|
pitch += 360;
|
|
if (pitch > 180)
|
|
pitch -= 360;
|
|
|
|
overlayStringList.add(new OverlayString("Yaw", String.format("%.2f", yaw) + Formatting.BOLD + "\u1D52"));
|
|
overlayStringList.add(new OverlayString("Pitch", String.format("%.2f", pitch) + Formatting.BOLD + "\u1D52"));
|
|
|
|
if (!holdingFarmItem) {
|
|
overlayStringList.clear();
|
|
}
|
|
|
|
// Draw HUD
|
|
int xAxis = 10;
|
|
int yAxis = 200;
|
|
|
|
// Get the longest string in the array
|
|
int longestString = 0;
|
|
int BoxWidth = 0;
|
|
for (OverlayString s : overlayStringList) {
|
|
String combined = s.toString();
|
|
if (combined.length() > longestString) {
|
|
longestString = combined.length();
|
|
BoxWidth = this.client.textRenderer.getWidth(combined);
|
|
}
|
|
}
|
|
|
|
int lineHeight = this.client.textRenderer.fontHeight + 2;
|
|
|
|
DrawableHelper.fill(matrixStack, xAxis, yAxis, xAxis + BoxWidth + 10,
|
|
yAxis + ((lineHeight + 1) * overlayStringList.size()), 0x64000000);
|
|
|
|
for (OverlayString line : overlayStringList) {
|
|
int offset = 5;
|
|
|
|
this.client.textRenderer.drawWithShadow(this.matrixStack, line.toString(), xAxis + offset, yAxis + offset, 0xFFFFFF);
|
|
yAxis += lineHeight;
|
|
}
|
|
}
|
|
|
|
private float interp(float now, float last) {
|
|
float interp = now;
|
|
if (last >= 0 && last != now) {
|
|
float factor = (System.currentTimeMillis() - this.lastUpdate) / 1000f;
|
|
factor = LerpUtils.clampZeroOne(factor);
|
|
interp = last + (now - last) * factor;
|
|
}
|
|
return interp;
|
|
}
|
|
|
|
private enum CropType {
|
|
WHEAT("THEORETICAL_HOE_WHEAT", "Wheat"),
|
|
NETHER_WART("THEORETICAL_HOE_WARTS", "Warts"),
|
|
SUGAR_CANE("THEORETICAL_HOE_CANE", "Sugar"),
|
|
CARROT("THEORETICAL_HOE_CARROT", "Carrots"),
|
|
POTATO("THEORETICAL_HOE_POTATO", "Potatoes"),
|
|
COCOA_BEANS("COCO_CHOPPER", "Cocoas"),
|
|
PUMPKIN("PUMPKIN_DICER", "Pumpkins"),
|
|
MELON("MELON_DICER", "Melons"),
|
|
CACTUS("CACTUS_KNIFE", "Cactus"),
|
|
;
|
|
|
|
private final String toolName;
|
|
private final String item;
|
|
|
|
CropType(String toolName, String item) {
|
|
this.toolName = toolName;
|
|
this.item = item;
|
|
}
|
|
}
|
|
|
|
private class OverlayString {
|
|
final String type;
|
|
final String text;
|
|
|
|
private OverlayString(String type, String text) {
|
|
this.type = type;
|
|
this.text = text;
|
|
}
|
|
|
|
public String toString() {
|
|
return Formatting.AQUA + this.type + ": " + Formatting.YELLOW + this.text;
|
|
}
|
|
}
|
|
}
|