summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorLorenz <lo.scherf@gmail.com>2022-08-06 11:46:08 +0200
committerLorenz <lo.scherf@gmail.com>2022-08-06 11:46:08 +0200
commitbfa53ca5b4cb9a0ef31256746612cb6289b06a49 (patch)
tree949cf71ede55fbb7ee33bfec0fcf9ec32873b8d5 /src/main/java
parent283a986d3d0f84afc5c38fb4c8465abc5de0d2b2 (diff)
downloadskyhanni-bfa53ca5b4cb9a0ef31256746612cb6289b06a49.tar.gz
skyhanni-bfa53ca5b4cb9a0ef31256746612cb6289b06a49.tar.bz2
skyhanni-bfa53ca5b4cb9a0ef31256746612cb6289b06a49.zip
Merge branch 'master' of C:\Users\Lorenz\IdeaProjects\SkyHanni with conflicts.
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java55
-rw-r--r--src/main/java/at/hannibal2/skyhanni/chat/ChatFilter.kt19
-rw-r--r--src/main/java/at/hannibal2/skyhanni/chat/NewChatFilter.kt18
-rw-r--r--src/main/java/at/hannibal2/skyhanni/config/gui/commands/Commands.java10
-rw-r--r--src/main/java/at/hannibal2/skyhanni/diana/GriffinBurrowFinder.kt159
-rw-r--r--src/main/java/at/hannibal2/skyhanni/dungeon/damageindicator/DungeonBossFinder.kt2
-rw-r--r--src/main/java/at/hannibal2/skyhanni/items/abilitycooldown/ItemAbilityCooldown.kt3
-rw-r--r--src/main/java/at/hannibal2/skyhanni/misc/CurrentPetDisplay.kt1
-rw-r--r--src/main/java/at/hannibal2/skyhanni/test/GriffinJavaUtils.java353
-rw-r--r--src/main/java/at/hannibal2/skyhanni/test/GriffinUtils.kt116
-rw-r--r--src/main/java/at/hannibal2/skyhanni/test/LorenzTest.kt81
-rw-r--r--src/main/java/at/hannibal2/skyhanni/utils/LorenzVec.kt24
12 files changed, 782 insertions, 59 deletions
diff --git a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
index 179f24faa..a1cc397f5 100644
--- a/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
+++ b/src/main/java/at/hannibal2/skyhanni/SkyHanniMod.java
@@ -5,9 +5,11 @@ import at.hannibal2.skyhanni.bazaar.BazaarBestSellMethod;
import at.hannibal2.skyhanni.bazaar.BazaarOrderHelper;
import at.hannibal2.skyhanni.chat.ChatFilter;
import at.hannibal2.skyhanni.chat.ChatManager;
+import at.hannibal2.skyhanni.chat.NewChatFilter;
import at.hannibal2.skyhanni.chat.PlayerChatFilter;
import at.hannibal2.skyhanni.config.Features;
import at.hannibal2.skyhanni.config.gui.commands.Commands;
+import at.hannibal2.skyhanni.diana.GriffinBurrowFinder;
import at.hannibal2.skyhanni.dungeon.*;
import at.hannibal2.skyhanni.dungeon.damageindicator.DungeonBossDamageIndicator;
import at.hannibal2.skyhanni.fishing.SeaCreatureManager;
@@ -16,13 +18,14 @@ import at.hannibal2.skyhanni.fishing.TrophyFishMessages;
import at.hannibal2.skyhanni.inventory.anvil.AnvilCombineHelper;
import at.hannibal2.skyhanni.items.HideNotClickableItems;
import at.hannibal2.skyhanni.items.ItemDisplayOverlayFeatures;
-import at.hannibal2.skyhanni.items.VanillaItemManager;
import at.hannibal2.skyhanni.items.abilitycooldown.ItemAbilityCooldown;
import at.hannibal2.skyhanni.misc.*;
import at.hannibal2.skyhanni.repo.RepoManager;
import at.hannibal2.skyhanni.test.LorenzTest;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraftforge.common.MinecraftForge;
@@ -32,9 +35,6 @@ import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;
-import java.io.*;
-import java.nio.charset.StandardCharsets;
-
@Mod(modid = SkyHanniMod.MODID, version = SkyHanniMod.VERSION)
public class SkyHanniMod {
@@ -51,11 +51,7 @@ public class SkyHanniMod {
@EventHandler
public void preInit(FMLPreInitializationEvent event) {
- loading("BazaarApi");
new BazaarApi();
- doneLoading();
-
- loading("MinecraftForge.EVENT_BUS");
MinecraftForge.EVENT_BUS.register(this);
MinecraftForge.EVENT_BUS.register(new ChatManager());
MinecraftForge.EVENT_BUS.register(new HypixelData());
@@ -63,10 +59,10 @@ public class SkyHanniMod {
MinecraftForge.EVENT_BUS.register(new ScoreboardData());
MinecraftForge.EVENT_BUS.register(new ApiData());
MinecraftForge.EVENT_BUS.register(new SeaCreatureManager());
- MinecraftForge.EVENT_BUS.register(new VanillaItemManager());
MinecraftForge.EVENT_BUS.register(new BazaarOrderHelper());
MinecraftForge.EVENT_BUS.register(new ChatFilter());
+ MinecraftForge.EVENT_BUS.register(new NewChatFilter());
MinecraftForge.EVENT_BUS.register(new PlayerChatFilter());
MinecraftForge.EVENT_BUS.register(new DungeonChatFilter());
MinecraftForge.EVENT_BUS.register(new HideNotClickableItems());
@@ -84,67 +80,35 @@ public class SkyHanniMod {
MinecraftForge.EVENT_BUS.register(new BazaarBestSellMethod());
MinecraftForge.EVENT_BUS.register(new AnvilCombineHelper());
MinecraftForge.EVENT_BUS.register(new SeaCreatureMessageShortener());
- doneLoading();
+ MinecraftForge.EVENT_BUS.register(new GriffinBurrowFinder());
- loading("Commands.init");
Commands.init();
- doneLoading();
- loading("more MinecraftForge.EVENT_BUS");
MinecraftForge.EVENT_BUS.register(new LorenzTest());
MinecraftForge.EVENT_BUS.register(new ButtonOnPause());
- doneLoading();
- loading("config");
configDirectory = new File("config/skyhanni");
try {
//noinspection ResultOfMethodCallIgnored
configDirectory.mkdir();
- } catch (Exception ignored) {
- }
+ } catch (Exception ignored) {}
configFile = new File(configDirectory, "config.json");
if (configFile.exists()) {
try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(configFile), StandardCharsets.UTF_8))) {
feature = gson.fromJson(reader, Features.class);
- } catch (Exception ignored) {
- }
+ } catch (Exception ignored) {}
}
- doneLoading();
- loading("features");
if (feature == null) {
feature = new Features();
saveConfig();
}
- doneLoading();
-
- loading("addShutdownHook");
Runtime.getRuntime().addShutdownHook(new Thread(this::saveConfig));
- doneLoading();
- loading("Repo");
repo = new RepoManager(configDirectory);
repo.loadRepoInformation();
- doneLoading();
- }
-
- private long startLoadTime = 0;
-
- private String lastLoad = "";
-
- private void loading(String text) {
- lastLoad = text;
- System.out.println(" ");
- System.out.println("SkyHanni starts loading '" + lastLoad + "'");
- startLoadTime = System.currentTimeMillis();
- }
-
- private void doneLoading() {
- long duration = System.currentTimeMillis() - startLoadTime;
- System.out.println("Done (took " + duration + " ms)");
- System.out.println(" ");
}
public void saveConfig() {
@@ -155,8 +119,7 @@ public class SkyHanniMod {
try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(configFile), StandardCharsets.UTF_8))) {
writer.write(gson.toJson(feature));
}
- } catch (IOException ignored) {
- }
+ } catch (IOException ignored) {}
}
public static GuiScreen screenToOpen = null;
diff --git a/src/main/java/at/hannibal2/skyhanni/chat/ChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/chat/ChatFilter.kt
index fc245405c..7efbf2ff6 100644
--- a/src/main/java/at/hannibal2/skyhanni/chat/ChatFilter.kt
+++ b/src/main/java/at/hannibal2/skyhanni/chat/ChatFilter.kt
@@ -37,11 +37,28 @@ class ChatFilter {
winterIsland(message) && SkyHanniMod.feature.chat.others -> "winter_island"
uselessWarning(message) && SkyHanniMod.feature.chat.others -> "useless_warning"
friendJoin(message) && SkyHanniMod.feature.chat.others -> "friend_join"
+ annoyingSpam(message) && SkyHanniMod.feature.chat.others -> "annoying_spam"
+ else -> ""
+ }
+ //TODO split into others
+ private fun annoyingSpam(message: String): Boolean {
+ if (message.matchRegex("§7Your Implosion hit (.*) for §r§c(.*) §r§7damage.")) return true
+ if (message.matchRegex("§7Your Molten Wave hit (.*) for §r§c(.*) §r§7damage.")) return true
+ if (message == "§cThere are blocks in the way!") return true
+ if (message == "§aYour Blessing enchant got you double drops!") return true
+ if (message == "§cYou can't use the wardrobe in combat!") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§fFish Bait§r§b.") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§aGrand Experience Bottle§r§b.") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§aBlessed Bait§r§b.") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§fDark Bait§r§b.") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§fLight Bait§r§b.") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§aHot Bait§r§b.") return true
+ if (message == "§6§lGOOD CATCH! §r§bYou found a §r§fSpooky Bait§r§b.") return true
- else -> ""
+ return false
}
private fun friendJoin(message: String): Boolean {
diff --git a/src/main/java/at/hannibal2/skyhanni/chat/NewChatFilter.kt b/src/main/java/at/hannibal2/skyhanni/chat/NewChatFilter.kt
new file mode 100644
index 000000000..b72f4fd4b
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/chat/NewChatFilter.kt
@@ -0,0 +1,18 @@
+package at.hannibal2.skyhanni.chat
+
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.utils.LorenzUtils
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+
+class NewChatFilter {
+
+ @SubscribeEvent
+ fun onChatMessage(event: LorenzChatEvent) {
+ if (!LorenzUtils.isOnHypixel) return
+
+// val blockReason = block(event.message)
+// if (blockReason != "") {
+// event.blockedReason = blockReason
+// }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/config/gui/commands/Commands.java b/src/main/java/at/hannibal2/skyhanni/config/gui/commands/Commands.java
index b9260b71a..72e6c0ea1 100644
--- a/src/main/java/at/hannibal2/skyhanni/config/gui/commands/Commands.java
+++ b/src/main/java/at/hannibal2/skyhanni/config/gui/commands/Commands.java
@@ -56,5 +56,15 @@ public class Commands {
}
)
);
+ ClientCommandHandler.instance.registerCommand(
+ new SimpleCommand(
+ "testhanni",
+ new SimpleCommand.ProcessCommandRunnable() {
+ public void processCommand(ICommandSender sender, String[] args) {
+ LorenzTest.Companion.testCommand();
+ }
+ }
+ )
+ );
}
}
diff --git a/src/main/java/at/hannibal2/skyhanni/diana/GriffinBurrowFinder.kt b/src/main/java/at/hannibal2/skyhanni/diana/GriffinBurrowFinder.kt
new file mode 100644
index 000000000..9cbabfa2f
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/diana/GriffinBurrowFinder.kt
@@ -0,0 +1,159 @@
+package at.hannibal2.skyhanni.diana
+
+import at.hannibal2.skyhanni.events.LorenzChatEvent
+import at.hannibal2.skyhanni.events.PacketEvent
+import at.hannibal2.skyhanni.test.GriffinUtils.draw3DLine
+import at.hannibal2.skyhanni.test.GriffinUtils.drawWaypoint
+import at.hannibal2.skyhanni.utils.*
+import at.hannibal2.skyhanni.utils.ItemUtils.cleanName
+import net.minecraft.client.Minecraft
+import net.minecraft.entity.item.EntityArmorStand
+import net.minecraft.network.play.server.S29PacketSoundEffect
+import net.minecraft.network.play.server.S2APacketParticles
+import net.minecraftforge.client.event.RenderWorldLastEvent
+import net.minecraftforge.event.world.WorldEvent
+import net.minecraftforge.fml.common.eventhandler.EventPriority
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent
+import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent
+import java.util.*
+
+class GriffinBurrowFinder {
+
+ private var ticks = 0
+ val list = mutableListOf<UUID>()
+ var lastArrowLine: Line? = null
+
+ @SubscribeEvent
+ fun onClientTick(event: ClientTickEvent?) {
+ if (!LorenzUtils.inSkyblock) return
+ ticks++
+ if (ticks % 5 == 0) {
+ checkEntities()
+ }
+ }
+
+ @SubscribeEvent
+ fun onWorldChange(event: WorldEvent.Load) {
+ lastArrowLine = null
+ }
+
+ @SubscribeEvent
+ fun onChatMessage(event: LorenzChatEvent) {
+ val message = event.message
+ if (message.startsWith("§eYou dug out a Griffin Burrow!") ||
+ message == "§eYou finished the Griffin burrow chain! §r§7(4/4)"
+ ) {
+ lastArrowLine = null
+ }
+ }
+
+ @SubscribeEvent
+ fun onWorldRender(event: RenderWorldLastEvent) {
+ if (lastArrowLine != null) {
+ var start = lastArrowLine!!.start
+ val y = (Minecraft.getMinecraft().thePlayer.position.y - 1).toDouble()
+ start = LorenzVec(start.x, y, start.z)
+ val direction = lastArrowLine!!.direction
+
+ event.drawWaypoint(start, LorenzColor.WHITE)
+ val nextPoint = start.add(direction.multiply(10))
+// event.drawWaypoint(nextPoint, LorenzColor.YELLOW)
+
+ event.draw3DLine(start, start.add(direction.multiply(400)), LorenzColor.YELLOW, 3, true)
+ }
+ }
+
+ var lastHarpTime = 0L
+ var lastHarpPitch = 0f
+ var lastHarpDistance = 0.0
+
+ @SubscribeEvent(priority = EventPriority.LOW, receiveCanceled = true)
+ fun onChatPacket(event: PacketEvent.ReceiveEvent) {
+ val packet = event.packet
+ if (packet is S2APacketParticles) {
+ val x = packet.xCoordinate
+ val y = packet.yCoordinate
+ val z = packet.zCoordinate
+ val distance = LorenzVec(x, y, z).distance(Minecraft.getMinecraft().thePlayer.getLorenzVec())
+ if (distance < 20) {
+// LorenzDebug.log("")
+// LorenzDebug.log("S2APacketParticles close")
+// var particleType = packet.particleType
+// var particleID = particleType.particleID
+// LorenzDebug.log("particleType: $particleType")
+// LorenzDebug.log("particleID: $particleID")
+// LorenzDebug.log("distance: $distance")
+// LorenzDebug.log("")
+
+ } else {
+// LorenzDebug.log("S2APacketParticles far")
+ }
+ }
+ if (packet is S29PacketSoundEffect) {
+ val x = packet.x
+ val y = packet.y
+ val z = packet.z
+ val distance = LorenzVec(x, y, z).distance(Minecraft.getMinecraft().thePlayer.getLorenzVec())
+ if (distance < 20) {
+ val soundName = packet.soundName
+ val pitch = packet.pitch
+ val volume = packet.volume
+ if (soundName == "game.player.hurt" && volume == 0f) return
+
+ if (soundName == "note.harp") {
+
+ LorenzDebug.log("harp pitch: $pitch")
+ LorenzDebug.log("distance: $distance")
+ val now = System.currentTimeMillis()
+ if (lastHarpTime != 0L) {
+ LorenzDebug.log("")
+ val diffTime = now - lastHarpTime
+ LorenzDebug.log("diffTime: $diffTime")
+ val diffPitch = pitch - lastHarpPitch
+ LorenzDebug.log("diffPitch: $diffPitch")
+ val diffDistance = distance - lastHarpDistance
+ LorenzDebug.log("diffDistance: $diffDistance")
+ }
+ lastHarpTime = now
+ lastHarpPitch = pitch
+ lastHarpDistance = distance
+ LorenzDebug.log("")
+ return
+ }
+
+ LorenzDebug.log("")
+ LorenzDebug.log("S29PacketSoundEffect close")
+
+ LorenzDebug.log("soundName: $soundName")
+ LorenzDebug.log("pitch: $pitch")
+ LorenzDebug.log("volume: $volume")
+ LorenzDebug.log("")
+ } else {
+// LorenzDebug.log("S29PacketSoundEffect far")
+ }
+ }
+ }
+
+ private fun checkEntities() {
+ val playerLocation = Minecraft.getMinecraft().thePlayer.position.toLorenzVec()
+ for (entity in Minecraft.getMinecraft().theWorld.loadedEntityList) {
+ if (list.contains(entity.uniqueID)) continue
+ if (entity !is EntityArmorStand) continue
+ val distance = entity.getLorenzVec().distance(playerLocation)
+ if (distance > 10) continue
+
+
+ val itemStack = entity.inventory[0] ?: continue
+ if (itemStack.cleanName() != "Arrow") continue
+
+ val rotationYaw = entity.rotationYaw
+ val direction = LorenzVec.getFromYawPitch(rotationYaw.toDouble(), 0.0)
+
+ lastArrowLine = Line(entity.getLorenzVec(), direction)
+ list.add(entity.uniqueID)
+ LorenzDebug.log("distance: $distance")
+ }
+ }
+
+ class Line(val start: LorenzVec, val direction: LorenzVec)
+} \ No newline at end of file
diff --git a/src/main/java/at/hannibal2/skyhanni/dungeon/damageindicator/DungeonBossFinder.kt b/src/main/java/at/hannibal2/skyhanni/dungeon/damageindicator/DungeonBossFinder.kt
index 1d30a9d24..02538673f 100644
--- a/src/main/java/at/hannibal2/skyhanni/dungeon/damageindicator/DungeonBossFinder.kt
+++ b/src/main/java/at/hannibal2/skyhanni/dungeon/damageindicator/DungeonBossFinder.kt
@@ -152,8 +152,6 @@ class DungeonBossFinder {
if (DungeonData.isOneOf("F4", "M4")) {
if (entity is EntityGhast) {
val health = LorenzUtils.formatDouble(entity.health.toDouble())
- LorenzTest.enabled = true
- LorenzTest.text = "thorn has $health hp!"
return EntityResult(ignoreBlocks = true, finalBoss = true)
}
diff --git a/src/main/java/at/hannibal2/skyhanni/items/abilitycooldown/ItemAbilityCooldown.kt b/src/main/java/at/hannibal2/skyhanni/items/abilitycooldown/ItemAbilityCooldown.kt
index 726c3172f..90ef95d4d 100644
--- a/src/main/java/at/hannibal2/skyhanni/items/abilitycooldown/ItemAbilityCooldown.kt
+++ b/src/main/java/at/hannibal2/skyhanni/items/abilitycooldown/ItemAbilityCooldown.kt
@@ -167,7 +167,8 @@ class ItemAbilityCooldown {
ENDSTONE_SWORD("Extreme Focus", 5, "End Stone Sword"),
PIGMAN_SWORD("Burning Souls", 5, "Pigman Sword"),
- SOULWARD("Soulward", 20, "Soul Esoward");
+ SOULWARD("Soulward", 20, "Soul Esoward"),
+ ECHO("Echo", 3, "Ancestral Spade");
fun click() {
lastClick = System.currentTimeMillis()
diff --git a/src/main/java/at/hannibal2/skyhanni/misc/CurrentPetDisplay.kt b/src/main/java/at/hannibal2/skyhanni/misc/CurrentPetDisplay.kt
index 06284c7c9..9266dd4f5 100644
--- a/src/main/java/at/hannibal2/skyhanni/misc/CurrentPetDisplay.kt
+++ b/src/main/java/at/hannibal2/skyhanni/misc/CurrentPetDisplay.kt
@@ -36,7 +36,6 @@ class CurrentPetDisplay {
}
}
-
@SubscribeEvent
fun renderOverlay(event: RenderGameOverlayEvent.Post) {
if (!LorenzUtils.inSkyblock) return
diff --git a/src/main/java/at/hannibal2/skyhanni/test/GriffinJavaUtils.java b/src/main/java/at/hannibal2/skyhanni/test/GriffinJavaUtils.java
new file mode 100644
index 000000000..431cfbe6f
--- /dev/null
+++ b/src/main/java/at/hannibal2/skyhanni/test/GriffinJavaUtils.java
@@ -0,0 +1,353 @@
+package at.hannibal2.skyhanni.test;
+
+import at.hannibal2.skyhanni.utils.LorenzVec;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.WorldRenderer;
+import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.entity.Entity;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.AxisAlignedBB;
+import org.lwjgl.opengl.GL11;
+
+import java.awt.*;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.List;
+import java.util.function.Function;
+
+public class GriffinJavaUtils {
+ public static <T> void permute(ArrayList<ArrayList<T>> result, T[] a, int k) {
+ if (k == a.length) {
+ ArrayList<T> subResult = new ArrayList<>();
+ result.add(subResult);
+ Collections.addAll(subResult, a);
+ } else {
+ for (int i = k; i < a.length; i++) {
+ T temp = a[k];
+ a[k] = a[i];
+ a[i] = temp;
+
+ permute(result, a, k + 1);
+
+ temp = a[k];
+ a[k] = a[i];
+ a[i] = temp;
+ }
+ }
+ }
+
+// public static <T> ArrayList<T> sortLocationListC(LorenzVec start, Map<T, LorenzVec> map, boolean brokenMath) {
+// Map<T, Double> fastestWithout = new HashMap<>();
+// for (T without : map.keySet()) {
+//
+// ArrayList<ArrayList<T>> variants = new ArrayList<>();
+// ArrayList<T> values = new ArrayList<>(map.keySet());
+//
+// values.remove(without);
+// T[] array = (T[]) values.toArray();
+//
+// permute(variants, array, 0);
+//
+// LinkedHashMap<ArrayList<T>, Double> distances = new LinkedHashMap<>();
+//
+// for (ArrayList<T> list : variants) {
+//
+// double distance = 0;
+// LorenzVec last = start;
+//
+// for (T t : list) {
+// LorenzVec location = map.get(t);
+// distance += last.distanceSq(location);
+// last = location;
+// }
+//
+// distances.put(list, distance);
+// }
+//
+// Map<ArrayList<T>, Double> sort;
+// if (brokenMath) {
+// sort = sortByValue(distances);
+// } else {
+// sort = sortByValueAsc(distances);
+// }
+//
+// double fastestDistance = sort.values().iterator().next();
+// fastestWithout.put(without, fastestDistance);
+// }
+//
+// T skip = sortByValueAsc(fastestWithout).keySet().iterator().next();
+//
+//
+// map.remove(skip);
+// ArrayList<T> result = sortLocationListB(start, map, brokenMath, false, T -> false, 0);
+// result.add(skip);
+//
+// return result;
+// }
+
+ public static <T> ArrayList<LorenzVec> sortLocationListB(LorenzVec start, Map<T, LorenzVec> map, boolean brokenMath,
+ boolean skipWorst, Function<T, Boolean> shouldAddToHostile, int addToHostileLastValue) {
+
+// if (skipWorst) {
+// return sortLocationListC(start, map, brokenMath);
+// }
+ ArrayList<ArrayList<T>> variants = new ArrayList<>();
+ Set<T> values = map.keySet();
+ T[] array = (T[]) values.toArray();
+
+ permute(variants, array, 0);
+
+ LinkedHashMap<ArrayList<T>, Double> distances = new LinkedHashMap<>();
+
+ int with = 0;
+ int without = 0;
+
+ for (ArrayList<T> list : variants) {
+
+ double distance = 0;
+ LorenzVec last = start;
+ T lastT = null;
+
+ for (T t : list) {
+ LorenzVec location = map.get(t);
+ distance += last.distanceSq(location);
+ last = location;
+ lastT = t;
+ }
+ if (shouldAddToHostile.apply(lastT)) {
+ distance += addToHostileLastValue;
+ with++;
+ } else {
+ without++;
+ }
+
+ distances.put(list, distance);
+ }
+// LorenzUtils.Companion.chat("with: " + with);
+// LorenzUtils.Companion.chat("without: " + without);
+
+ Map<ArrayList<T>, Double> sort;
+ if (brokenMath) {
+ sort = sortByValue(distances);
+ } else {
+ sort = sortByValueAsc(distances);
+ }
+ ArrayList<T> result = sort.keySet().iterator().next();
+ ArrayList<LorenzVec> resultList = new ArrayList<>();
+ for (T t : result) {
+ resultList.add(map.get(t));
+ }
+
+ return resultList;
+ }
+
+ //descending
+ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
+ List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
+ list.sort(Map.Entry.comparingByValue());
+ Collections.reverse(list);
+
+ Map<K, V> result = new LinkedHashMap<>();
+ for (Map.Entry<K, V> entry : list) {
+ result.put(entry.getKey(), entry.getValue());
+ }
+
+ return result;
+ }
+
+ //ascending
+ public static <K, V extends Comparable<? super V>> Map<K, V> sortByValueAsc(Map<K, V> map) {
+ List<Map.Entry<K, V>> list = new ArrayList<>(map.entrySet());
+ list.sort(Map.Entry.comparingByValue());
+
+ Map<K, V> result = new LinkedHashMap<>();
+ for (Map.Entry<K, V> entry : list) {
+ result.put(entry.getKey(), entry.getValue());
+ }
+
+ return result;
+ }
+
+ public static String formatInteger(int i) {
+ return new DecimalFormat("#,##0").format(i).replace(',', '.');
+ }
+
+ public static List<ItemStack> getItemsInInventory() {
+ return getItemsInInventory(false);
+ }
+
+ public static List<ItemStack> getItemsInInventory(boolean withCursorItem) {
+ List<ItemStack> list = new ArrayList<>();
+
+// EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;
+ EntityPlayerSP player = Minecraft.getMinecraft().thePlayer;
+ if (player == null) {
+ System.err.println("loadCurrentInventory: player is null!");
+ return list;
+ }
+
+ InventoryPlayer inventory = player.inventory;
+ ItemStack[] mainInventory = inventory.mainInventory;
+
+ ArrayList<ItemStack> helpList = new ArrayList<>();
+ helpList.addAll(Arrays.asList(mainInventory));
+
+ if (withCursorItem) {
+ helpList.add(inventory.getItemStack());
+ }
+
+ for (ItemStack item : helpList) {
+ if (item == null) continue;
+ String name = item.getDisplayName();
+ if (name.equalsIgnoreCase("air")) continue;
+ if (name.equalsIgnoreCase("luft")) continue;
+ list.add(item);
+ }
+
+ return list;
+ }
+
+ public static void drawWaypoint(LorenzVec pos, float partialTicks, Color color, boolean beacon) {
+ drawWaypoint(pos, partialTicks, color, beacon, false);
+ }
+
+ public static void drawWaypoint(LorenzVec pos, float partialTicks, Color color, boolean beacon, boolean forceBeacon) {
+ Entity viewer = Minecraft.getMinecraft().getRenderViewEntity();
+ double viewerX = viewer.lastTickPosX + (viewer.posX - viewer.lastTickPosX) * partialTicks;
+ double viewerY = viewer.lastTickPosY + (viewer.posY - viewer.lastTickPosY) * partialTicks;
+ double viewerZ = viewer.lastTickPosZ + (viewer.posZ - viewer.lastTickPosZ) * partialTicks;
+
+ double x = pos.getX() - viewerX;
+ double y = pos.getY() - viewerY;
+ double z = pos.getZ() - viewerZ;
+
+
+ GlStateManager.disableDepth();
+ GlStateManager.disableCull();
+ GlStateManager.disableTexture2D();
+ if (beacon) {
+ double distSq = x * x + y * y + z * z;
+ if (distSq > 5 * 5 || forceBeacon) {
+ //TODO add beacon
+// GriffinUtils.renderBeaconBeam(x, y, z, color.getRGB(), 1.0f, partialTicks);
+ }
+ }
+// BlockPos a = pos.toBlocPos();
+// BlockPos b = pos.add(1, 1, 1).toBlocPos();
+// draw3DBox(new AxisAlignedBB(a, b), color, partialTicks);
+
+ AxisAlignedBB aabb = new AxisAlignedBB(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1);
+
+ draw3DBox(aabb, color, partialTicks);
+ GlStateManager.disableLighting();
+ GlStateManager.enableTexture2D();
+ GlStateManager.enableDepth();
+
+ }
+
+ public static void draw3DLine(LorenzVec p1, LorenzVec p2, Color color, int lineWidth, boolean depth, float partialTicks) {
+ GlStateManager.disableDepth();
+ GlStateManager.disableCull();
+
+// Vec3 pos1 = new Vec3(p1.getX(), p1.getY(), p1.getZ());
+// Vec3 pos2 = new Vec3(p2.getX(), p2.getY(), p2.getZ());
+
+ Entity render = Minecraft.getMinecraft().getRenderViewEntity();
+ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
+
+ double realX = render.lastTickPosX + (render.posX - render.lastTickPosX) * partialTicks;
+ double realY = render.lastTickPosY + (render.posY - render.lastTickPosY) * partialTicks;
+ double realZ = render.lastTickPosZ + (render.posZ - render.lastTickPosZ) * partialTicks;
+
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(-realX, -realY, -realZ);
+ GlStateManager.disableTexture2D();
+ GlStateManager.enableBlend();
+ GlStateManager.disableAlpha();
+ GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
+ GL11.glLineWidth(lineWidth);
+
+
+ if (!depth) {
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GlStateManager.depthMask(false);
+ }
+ GlStateManager.color(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, color.getAlpha() / 255f);
+ worldRenderer.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION);
+
+ worldRenderer.pos(p1.getX(), p1.getY(), p1.getZ()).endVertex();
+ worldRenderer.pos(p2.getX(), p2.getY(), p2.getZ()).endVertex();
+ Tessellator.getInstance().draw();
+
+ GlStateManager.translate(realX, realY, realZ);
+ if (!depth) {
+ GL11.glEnable(GL11.GL_DEPTH_TEST);
+ GlStateManager.depthMask(true);
+ }
+
+
+ GlStateManager.disableBlend();
+ GlStateManager.enableAlpha();
+ GlStateManager.enableTexture2D();
+ GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+ GlStateManager.popMatrix();
+
+
+ GlStateManager.disableLighting();
+ GlStateManager.enableDepth();
+ }
+
+ public static void draw3DBox(AxisAlignedBB aabb, Color colour, float partialTicks) {
+ Entity render = Minecraft.getMinecraft().getRenderViewEntity();
+ WorldRenderer worldRenderer = Tessellator.getInstance().getWorldRenderer();
+
+ double realX = render.lastTickPosX + (render.posX - render.lastTickPosX) * partialTicks;
+ double realY = render.lastTickPosY + (render.posY - render.lastTickPosY) * partialTicks;
+ double realZ = render.lastTickPosZ + (render.posZ - render.lastTickPosZ) * partialTicks;
+
+ GlStateManager.pushMatrix();
+ GlStateManager.translate(-realX, -realY, -realZ);
+ GlStateManager.disableTexture2D();
+ GlStateManager.enableBlend();
+ GlStateManager.disableAlpha();
+ GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
+ GL11.glLineWidth(2);
+ GlStateManager.color(colour.getRed() / 255f, colour.getGreen() / 255f, colour.getBlue() / 255f, colour.getAlpha() / 255f);
+ worldRenderer.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION);
+
+ worldRenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex();
+ worldRenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex();
+ worldRenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex();
+ Tessellator.getInstance().draw();
+ worldRenderer.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION);
+ worldRenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex();
+ worldRenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex();
+ worldRenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex();
+ Tessellator.getInstance().draw();
+ worldRenderer.begin(GL11.GL_LINE_STRIP, DefaultVertexFormats.POSITION);
+ worldRenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex();
+ worldRenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVerte