diff --git a/gradle.properties b/gradle.properties index 663e6a0..9a68825 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_name = Hytils Reborn mod_id = hytils-reborn -mod_version = 1.6.2 +mod_version = 1.7.0 # Sets the name of the jar file that you put in your 'mods' folder. mod_archives_name=Hytils Reborn diff --git a/src/dummy/java/club/sk1er/lobbysounds/config/Sounds.java b/src/dummy/java/club/sk1er/lobbysounds/config/Sounds.java new file mode 100644 index 0000000..befb866 --- /dev/null +++ b/src/dummy/java/club/sk1er/lobbysounds/config/Sounds.java @@ -0,0 +1,58 @@ +/* + * Hytils Reborn - Hypixel focused Quality of Life mod. + * Copyright (C) 2020, 2021, 2022, 2023 Polyfrost, Sk1er LLC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package club.sk1er.lobbysounds.config; + +public class Sounds { + + public static boolean DISABLE_SLIME_SOUNDS; + + public static boolean DISABLE_DRAGON_SOUNDS; + + public static boolean DISABLE_WITHER_SOUNDS; + + public static boolean DISABLE_ITEM_PICKUP_SOUNDS; + + public static boolean DISABLE_EXPERIENCE_SOUNDS; + + public static boolean DISABLE_TNT_PRIME_SOUNDS; + + public static boolean DISABLE_EXPLOSION_SOUNDS; + + public static boolean DISABLE_DELIVERY_MAN_SOUNDS; + + public static boolean DISABLE_NOTE_SOUNDS; + + public static boolean DISABLE_FIREWORKS_SOUNDS; + + public static boolean DISABLE_LEVELUP_SOUNDS; + + public static boolean DISABLE_STEP_SOUNDS; + + public static boolean DISABLE_ARROW_SOUNDS; + + public static boolean DISABLE_BAT_SOUNDS; + + public static boolean DISABLE_FIRE_SOUNDS; + + public static boolean DISABLE_ENDERMEN_SOUNDS; + + public void markDirty() {} + + public void writeData() {} +} diff --git a/src/dummy/java/club/sk1er/mods/autogg/AutoGG.java b/src/dummy/java/club/sk1er/mods/autogg/AutoGG.java new file mode 100644 index 0000000..e21f9c7 --- /dev/null +++ b/src/dummy/java/club/sk1er/mods/autogg/AutoGG.java @@ -0,0 +1,29 @@ +/* + * Hytils Reborn - Hypixel focused Quality of Life mod. + * Copyright (C) 2020, 2021, 2022, 2023 Polyfrost, Sk1er LLC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package club.sk1er.mods.autogg; + +import club.sk1er.mods.autogg.config.AutoGGConfig; + +public class AutoGG { + public static AutoGG INSTANCE = new AutoGG(); + + public AutoGGConfig getAutoGGConfig() { + return new AutoGGConfig(); + } +} diff --git a/src/dummy/java/club/sk1er/mods/autogg/config/AutoGGConfig.java b/src/dummy/java/club/sk1er/mods/autogg/config/AutoGGConfig.java new file mode 100644 index 0000000..da715fa --- /dev/null +++ b/src/dummy/java/club/sk1er/mods/autogg/config/AutoGGConfig.java @@ -0,0 +1,72 @@ +/* + * Hytils Reborn - Hypixel focused Quality of Life mod. + * Copyright (C) 2020, 2021, 2022, 2023 Polyfrost, Sk1er LLC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package club.sk1er.mods.autogg.config; + +public class AutoGGConfig { + + private boolean autoGGEnabled = true; + private boolean casualAutoGGEnabled; + private boolean antiGGEnabled; + private boolean antiKarmaEnabled; + private int autoGGDelay = 1; + private int autoGGPhrase = 0; + private boolean secondaryEnabled; + private int autoGGPhrase2 = 0; + private int secondaryDelay = 1; + + public boolean isModEnabled() { + return autoGGEnabled; + } + + public boolean isCasualAutoGGEnabled() { + return casualAutoGGEnabled; + } + + public boolean isAntiGGEnabled() { + return antiGGEnabled; + } + + public boolean isAntiKarmaEnabled() { + return antiKarmaEnabled; + } + + public int getAutoGGDelay() { + return autoGGDelay; + } + + public int getAutoGGPhrase() { + return autoGGPhrase; + } + + public boolean isSecondaryEnabled() { + return secondaryEnabled; + } + + public int getAutoGGPhrase2() { + return autoGGPhrase2; + } + + public int getSecondaryDelay() { + return secondaryDelay; + } + + public void markDirty() {} + + public void writeData() {} +} diff --git a/src/main/java/org/polyfrost/hytils/HytilsReborn.java b/src/main/java/org/polyfrost/hytils/HytilsReborn.java index 9f87b89..a0f98f1 100644 --- a/src/main/java/org/polyfrost/hytils/HytilsReborn.java +++ b/src/main/java/org/polyfrost/hytils/HytilsReborn.java @@ -97,6 +97,7 @@ public class HytilsReborn { public boolean isPatcher; public boolean isChatting; + public boolean isSk1erAutoGG; private boolean loadedCall; private RankType rank; diff --git a/src/main/java/org/polyfrost/hytils/config/HytilsConfig.java b/src/main/java/org/polyfrost/hytils/config/HytilsConfig.java index 81f457a..6605a7d 100644 --- a/src/main/java/org/polyfrost/hytils/config/HytilsConfig.java +++ b/src/main/java/org/polyfrost/hytils/config/HytilsConfig.java @@ -19,6 +19,7 @@ package org.polyfrost.hytils.config; import cc.polyfrost.oneconfig.config.Config; +import cc.polyfrost.oneconfig.config.annotations.Checkbox; import cc.polyfrost.oneconfig.config.annotations.*; import cc.polyfrost.oneconfig.config.core.OneColor; import cc.polyfrost.oneconfig.config.data.InfoType; @@ -26,20 +27,25 @@ import cc.polyfrost.oneconfig.config.data.ModType; import cc.polyfrost.oneconfig.config.data.PageLocation; import cc.polyfrost.oneconfig.config.migration.VigilanceMigrator; -import org.polyfrost.hytils.HytilsReborn; -import org.polyfrost.hytils.handlers.chat.modules.modifiers.GameStartCompactor; -import org.polyfrost.hytils.util.DarkColorUtils; +import cc.polyfrost.oneconfig.utils.Notifications; +import club.sk1er.lobbysounds.config.Sounds; +import club.sk1er.mods.autogg.AutoGG; import com.google.common.collect.Lists; import net.minecraft.client.Minecraft; import org.apache.commons.io.FileUtils; +import org.polyfrost.hytils.HytilsReborn; +import org.polyfrost.hytils.handlers.chat.modules.modifiers.GameStartCompactor; +import org.polyfrost.hytils.util.DarkColorUtils; import java.awt.Color; import java.io.File; +import java.lang.reflect.Field; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.Arrays; +import java.util.function.Supplier; @SuppressWarnings("unused") public class HytilsConfig extends Config { @@ -128,6 +134,66 @@ public class HytilsConfig extends Config { // Chat + @Switch( + name = "Auto GG", + description = "Send a \"gg\" message at the end of a game.", + category = "Chat", subcategory = "Automatic" + ) + public static boolean autoGG = true; + + @Switch( + name = "Auto GG Second Message", + description = "Enable a secondary message to send after your first GG.", + category = "Chat", subcategory = "Automatic" + ) + public static boolean autoGGSecondMessage; + + @Switch( + name = "Casual Auto GG", + description = "Send a \"gg\" message at the end of minigames/events that don't give out Karma, such as SkyBlock and The Pit events.", + category = "Chat", subcategory = "Automatic" + ) + public static boolean casualAutoGG = true; + + @Switch( + name = "Anti GG", + description = "Remove GG messages from chat.", + category = "Chat", subcategory = "Automatic" + ) + public static boolean antiGG; + + @Dropdown( + name = "Auto GG First Message", + description = "Choose what message is said on game completion.", + category = "Chat", subcategory = "Automatic", + options = {"gg", "GG", "gf", "Good Game", "Good Fight", "Good Round! :D"} + ) + public static int autoGGMessage = 0; + + @Slider( + name = "Auto GG First Phrase Delay", + description = "Delay after the game ends to say the first message in seconds.", + category = "Chat", subcategory = "Automatic", + min = 0, max = 5 + ) + public static int autoGGFirstPhraseDelay = 1; + + @Dropdown( + name = "Auto GG Second Message", + description = "Send a secondary message sent after the first GG message.", + category = "Chat", subcategory = "Automatic", + options = {"Have a good day!", "<3", "AutoGG By Hytils Reborn!", "gf", "Good Fight", "Good Round", ":D", "Well played!", "wp"} + ) + public static int autoGGMessage2 = 0; + + @Slider( + name = "Auto GG Second Phrase Delay", + description = "Delay after the game ends to say the second message in seconds.", + category = "Chat", subcategory = "Automatic", + min = 0, max = 5 + ) + public static int autoGGSecondPhraseDelay = 1; + @Switch( name = "Auto GL", description = "Send a message 5 seconds before a Hypixel game starts.", @@ -339,6 +405,13 @@ public class HytilsConfig extends Config { ) public static boolean preventShoutingOnCooldown = true; + @Switch( + name = "Remove Karma Messages", + description = "Remove Karma messages from the chat.", + category = "Chat", subcategory = "Toggles" + ) + public static boolean hideKarmaMessages; + @Switch( name = "Hide Locraw Messages", description = "Hide locraw messages in chat (e.g {\"server\": \"something\"}).", @@ -1164,7 +1237,6 @@ public class HytilsConfig extends Config { public HytilsConfig() { super(new Mod("Hytils Reborn", ModType.HYPIXEL, "/assets/hytils/hypixel.png", new VigilanceMigrator(new File(HytilsReborn.INSTANCE.oldModDir, "hytilsreborn.toml").getAbsolutePath())), "hytilsreborn.json"); - initialize(); try { File modDir = HytilsReborn.INSTANCE.oldModDir; File oldModDir = new File(modDir.getParentFile(), "Hytilities Reborn"); @@ -1179,11 +1251,159 @@ public HytilsConfig() { e.printStackTrace(); } - if (configNumber != 2) { // Config version has not been set or is outdated + initialize(); + Class autoGGClass = null; + try { + autoGGClass = Class.forName("club.sk1er.mods.autogg.config.AutoGGConfig"); + + HytilsReborn.INSTANCE.isSk1erAutoGG = true; + } catch (ClassNotFoundException ignored) { + } + + if (configNumber != 3) { // Config version has not been set or is outdated if (configNumber == 1) { overlayAmount = 300; } - configNumber = 2; // set this to the current config version + if (configNumber <= 2) { + if (autoGGClass != null) { + if (AutoGG.INSTANCE.getAutoGGConfig().isModEnabled()) { + autoGG = true; + } + if (AutoGG.INSTANCE.getAutoGGConfig().isSecondaryEnabled()) { + autoGGSecondMessage = true; + } + if (AutoGG.INSTANCE.getAutoGGConfig().isCasualAutoGGEnabled()) { + casualAutoGG = true; + } + if (AutoGG.INSTANCE.getAutoGGConfig().getAutoGGPhrase() != 0) { + autoGGMessage = AutoGG.INSTANCE.getAutoGGConfig().getAutoGGPhrase(); + } + if (AutoGG.INSTANCE.getAutoGGConfig().getAutoGGDelay() != 1) { + autoGGFirstPhraseDelay = AutoGG.INSTANCE.getAutoGGConfig().getAutoGGDelay(); + } + if (AutoGG.INSTANCE.getAutoGGConfig().getAutoGGPhrase2() != 0) { + autoGGMessage2 = AutoGG.INSTANCE.getAutoGGConfig().getAutoGGPhrase2(); + } + if (AutoGG.INSTANCE.getAutoGGConfig().getSecondaryDelay() != 1) { + autoGGSecondPhraseDelay = AutoGG.INSTANCE.getAutoGGConfig().getSecondaryDelay(); + } + if (AutoGG.INSTANCE.getAutoGGConfig().isAntiGGEnabled()) { + antiGG = true; + } + if (AutoGG.INSTANCE.getAutoGGConfig().isAntiKarmaEnabled()) { + hideKarmaMessages = true; + } + + try { + Field sk1erEnabled = autoGGClass.getDeclaredField("autoGGEnabled"); + sk1erEnabled.setAccessible(true); + sk1erEnabled.set(AutoGG.INSTANCE.getAutoGGConfig(), false); + + AutoGG.INSTANCE.getAutoGGConfig().markDirty(); + AutoGG.INSTANCE.getAutoGGConfig().writeData(); + } catch (NoSuchFieldException | IllegalAccessException e) { + e.printStackTrace(); + } + + Notifications.INSTANCE.send("Hytils Reborn", "AutoGG settings have been migrated to Hytils Reborn. You can now configure them in the Hytils Reborn settings, and remove Sk1erLLC's AutoGG.", 5); + } + + try { + Class.forName("club.sk1er.lobbysounds.config.Sounds"); + boolean modified = false; + if (Sounds.DISABLE_SLIME_SOUNDS) { + lobbyDisableSlimeSounds = true; + modified = true; + } + if (Sounds.DISABLE_DRAGON_SOUNDS) { + lobbyDisableDragonSounds = true; + modified = true; + } + if (Sounds.DISABLE_WITHER_SOUNDS) { + lobbyDisableWitherSounds = true; + modified = true; + } + if (Sounds.DISABLE_ITEM_PICKUP_SOUNDS) { + lobbyDisableItemPickupSounds = true; + modified = true; + } + if (Sounds.DISABLE_EXPERIENCE_SOUNDS) { + lobbyDisableExperienceOrbSounds = true; + modified = true; + } + if (Sounds.DISABLE_TNT_PRIME_SOUNDS) { + lobbyDisablePrimedTntSounds = true; + modified = true; + } + if (Sounds.DISABLE_EXPLOSION_SOUNDS) { + lobbyDisableExplosionSounds = true; + modified = true; + } + if (Sounds.DISABLE_DELIVERY_MAN_SOUNDS) { + lobbyDisableDeliveryManSounds = true; + modified = true; + } + if (Sounds.DISABLE_NOTE_SOUNDS) { + lobbyDisableNoteBlockSounds = true; + modified = true; + } + if (Sounds.DISABLE_FIREWORKS_SOUNDS) { + lobbyDisableFireworkSounds = true; + modified = true; + } + if (Sounds.DISABLE_LEVELUP_SOUNDS) { + lobbyDisableLevelupSounds = true; + modified = true; + } + if (Sounds.DISABLE_ARROW_SOUNDS) { + lobbyDisableArrowSounds = true; + modified = true; + } + if (Sounds.DISABLE_BAT_SOUNDS) { + lobbyDisableBatSounds = true; + modified = true; + } + if (Sounds.DISABLE_FIRE_SOUNDS) { + lobbyDisableFireSounds = true; + modified = true; + } + if (Sounds.DISABLE_ENDERMEN_SOUNDS) { + lobbyDisableEndermanSounds = true; + modified = true; + } + if (Sounds.DISABLE_STEP_SOUNDS) { + lobbyDisableSteppingSounds = true; + modified = true; + } + + if (Sounds.DISABLE_SLIME_SOUNDS && + Sounds.DISABLE_DRAGON_SOUNDS && + Sounds.DISABLE_WITHER_SOUNDS && + Sounds.DISABLE_ITEM_PICKUP_SOUNDS && + Sounds.DISABLE_EXPERIENCE_SOUNDS && + Sounds.DISABLE_TNT_PRIME_SOUNDS && + Sounds.DISABLE_EXPLOSION_SOUNDS && + Sounds.DISABLE_DELIVERY_MAN_SOUNDS && + Sounds.DISABLE_NOTE_SOUNDS && + Sounds.DISABLE_FIREWORKS_SOUNDS && + Sounds.DISABLE_LEVELUP_SOUNDS && + Sounds.DISABLE_ARROW_SOUNDS && + Sounds.DISABLE_BAT_SOUNDS && + Sounds.DISABLE_FIRE_SOUNDS && + Sounds.DISABLE_ENDERMEN_SOUNDS && + Sounds.DISABLE_STEP_SOUNDS) { + silentLobby = true; + lobbyDisableDoorSounds = true; + } + + if (modified) { + Notifications.INSTANCE.send("Hytils Reborn", "Lobby Sounds settings have been migrated to Hytils Reborn. You can now configure them in the Hytils Reborn settings, and remove Sk1erLLC's Lobby Sounds.", 5); + } + } catch (ClassNotFoundException ignored) { + + } + } + configNumber = 3; // set this to the current config version save(); } @@ -1191,6 +1411,24 @@ public HytilsConfig() { addDependency("gexpMode", "autoGetGEXP"); + addDependency("autoGGSecondMessage", "autoGG"); + addDependency("casualAutoGG", "autoGG"); + addDependency("autoGGMessage", "autoGG"); + addDependency("autoGGFirstPhraseDelay", "autoGG"); + addDependency("autoGGMessage2", "autoGG"); + addDependency("autoGGSecondPhraseDelay", "autoGG"); + + Supplier autoGGEnabled = () -> !HytilsReborn.INSTANCE.isSk1erAutoGG || !AutoGG.INSTANCE.getAutoGGConfig().isModEnabled(); + + addDependency("autoGG", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("autoGGSecondMessage", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("casualAutoGG", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("autoGGMessage", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("autoGGFirstPhraseDelay", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("autoGGMessage2", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("autoGGSecondPhraseDelay", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("antiGG", "Sk1er's AutoGG Enabled", autoGGEnabled); + addDependency("glPhrase", "autoGL"); addDependency("guildAutoWB", "autoWB"); diff --git a/src/main/java/org/polyfrost/hytils/handlers/chat/ChatHandler.java b/src/main/java/org/polyfrost/hytils/handlers/chat/ChatHandler.java index 3b6b270..065212b 100644 --- a/src/main/java/org/polyfrost/hytils/handlers/chat/ChatHandler.java +++ b/src/main/java/org/polyfrost/hytils/handlers/chat/ChatHandler.java @@ -49,6 +49,7 @@ public ChatHandler() { // Blockers this.registerModule(new AdBlocker()); + this.registerModule(new AntiGG()); this.registerModule(new AntiGL()); this.registerModule(new AutoWB()); this.registerModule(new BedwarsAdvertisementsRemover()); @@ -66,6 +67,7 @@ public ChatHandler() { this.registerModule(new GuildMOTD()); this.registerModule(new HotPotatoRemover()); this.registerModule(new HypeLimitReminderRemover()); + this.registerModule(new KarmaRemover()); this.registerModule(new LobbyFishingAnnouncementRemover()); this.registerModule(new LobbyStatusRemover()); this.registerModule(new MvpEmotesRemover()); @@ -98,6 +100,7 @@ public ChatHandler() { this.registerModule(new AutoChatReportConfirm()); this.registerModule(new AutoChatSwapper()); this.registerModule(new AutoFriend()); + this.registerModule(new AutoGG()); this.registerModule(new AutoGL()); this.registerModule(new AutoPartyWarpConfirm()); this.registerModule(new AutoVictory()); diff --git a/src/main/java/org/polyfrost/hytils/handlers/chat/modules/blockers/AntiGG.java b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/blockers/AntiGG.java new file mode 100644 index 0000000..80af2b7 --- /dev/null +++ b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/blockers/AntiGG.java @@ -0,0 +1,45 @@ +/* + * Hytils Reborn - Hypixel focused Quality of Life mod. + * Copyright (C) 2020, 2021, 2022, 2023 Polyfrost, Sk1er LLC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.polyfrost.hytils.handlers.chat.modules.blockers; + +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import org.jetbrains.annotations.NotNull; +import org.polyfrost.hytils.config.HytilsConfig; +import org.polyfrost.hytils.handlers.chat.ChatReceiveModule; + +public class AntiGG implements ChatReceiveModule { + @Override + public void onMessageReceived(@NotNull ClientChatReceivedEvent event) { + String message = EnumChatFormatting.getTextWithoutFormattingCodes(event.message.getUnformattedText()); + if (getLanguage().cancelGgMessagesRegex.matcher(message).matches()) { + event.setCanceled(true); + } + } + + @Override + public boolean isEnabled() { + return HytilsConfig.antiGG; + } + + @Override + public int getPriority() { + return -3; + } +} diff --git a/src/main/java/org/polyfrost/hytils/handlers/chat/modules/blockers/KarmaRemover.java b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/blockers/KarmaRemover.java new file mode 100644 index 0000000..2119447 --- /dev/null +++ b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/blockers/KarmaRemover.java @@ -0,0 +1,45 @@ +/* + * Hytils Reborn - Hypixel focused Quality of Life mod. + * Copyright (C) 2020, 2021, 2022, 2023 Polyfrost, Sk1er LLC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.polyfrost.hytils.handlers.chat.modules.blockers; + +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import org.jetbrains.annotations.NotNull; +import org.polyfrost.hytils.config.HytilsConfig; +import org.polyfrost.hytils.handlers.chat.ChatReceiveModule; + +public class KarmaRemover implements ChatReceiveModule { + @Override + public void onMessageReceived(@NotNull ClientChatReceivedEvent event) { + String message = EnumChatFormatting.getTextWithoutFormattingCodes(event.message.getUnformattedText()); + if (getLanguage().chatCleanerKarmaMessagesRegex.matcher(message).matches()) { + event.setCanceled(true); + } + } + + @Override + public boolean isEnabled() { + return HytilsConfig.hideKarmaMessages; + } + + @Override + public int getPriority() { + return -1; + } +} diff --git a/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoGG.java b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoGG.java new file mode 100644 index 0000000..6e7c510 --- /dev/null +++ b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoGG.java @@ -0,0 +1,76 @@ +/* + * Hytils Reborn - Hypixel focused Quality of Life mod. + * Copyright (C) 2020, 2021, 2022, 2023 Polyfrost, Sk1er LLC and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package org.polyfrost.hytils.handlers.chat.modules.triggers; + +import cc.polyfrost.oneconfig.libs.universal.UChat; +import cc.polyfrost.oneconfig.utils.Multithreading; +import net.minecraft.util.EnumChatFormatting; +import net.minecraftforge.client.event.ClientChatReceivedEvent; +import org.jetbrains.annotations.NotNull; +import org.polyfrost.hytils.HytilsReborn; +import org.polyfrost.hytils.config.HytilsConfig; +import org.polyfrost.hytils.handlers.cache.PatternHandler; +import org.polyfrost.hytils.handlers.chat.ChatReceiveModule; + +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; + +public class AutoGG implements ChatReceiveModule { + private static final String[] ggMessagesOne = {"gg", "GG", "gf", "Good Game", "Good Fight", "Good Round! :D"}; + private static final String[] ggMessagesTwo = {"Have a good day!", "<3", "AutoGG By Hytils Reborn!", "gf", "Good Fight", "Good Round", ":D", "Well played!", "wp"}; + + private static String getGGMessageOne() { + return ggMessagesOne[HytilsConfig.autoGGMessage]; + } + private static String getGGMessageTwo() { + return ggMessagesTwo[HytilsConfig.autoGGMessage2]; + } + + @Override + public void onMessageReceived(@NotNull ClientChatReceivedEvent event) { + String message = EnumChatFormatting.getTextWithoutFormattingCodes(event.message.getUnformattedText()); + if (!hasGameEnded(message)) return; + Multithreading.schedule(() -> UChat.say("/ac " + getGGMessageOne()), HytilsConfig.autoGGFirstPhraseDelay, TimeUnit.SECONDS); + if (HytilsConfig.autoGGSecondMessage) + Multithreading.schedule(() -> UChat.say("/ac " + getGGMessageTwo()), HytilsConfig.autoGGSecondPhraseDelay + HytilsConfig.autoGGFirstPhraseDelay, TimeUnit.SECONDS); + } + + private boolean hasGameEnded(String message) { + if (!PatternHandler.INSTANCE.gameEnd.isEmpty()) { + for (Pattern triggers : PatternHandler.INSTANCE.gameEnd) { + if (triggers.matcher(message).matches()) { + return true; + } + } + } + + // TODO: UNTESTED! + return getLanguage().casualGameEndRegex.matcher(message).matches(); + } + + @Override + public boolean isEnabled() { + return HytilsConfig.autoGG && (!HytilsReborn.INSTANCE.isSk1erAutoGG || !club.sk1er.mods.autogg.AutoGG.INSTANCE.getAutoGGConfig().isModEnabled()); // If Sk1er's AutoGG is enabled, we don't want to interfere with it. + } + + @Override + public int getPriority() { + return 3; + } +} diff --git a/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoVictory.java b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoVictory.java index 0d07a1f..3fba4b2 100644 --- a/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoVictory.java +++ b/src/main/java/org/polyfrost/hytils/handlers/chat/modules/triggers/AutoVictory.java @@ -49,7 +49,7 @@ public AutoVictory() { @Override public void onMessageReceived(@NotNull ClientChatReceivedEvent event) { String unformattedText = UTextComponent.Companion.stripFormatting(event.message.getUnformattedText()); - if (PatternHandler.INSTANCE.gameEnd.size() != 0) { + if (!PatternHandler.INSTANCE.gameEnd.isEmpty()) { if (!victoryDetected) { // prevent victories being detected twice Multithreading.runAsync(() -> { //run this async as getting from the API normally would freeze minecraft for (Pattern triggers : PatternHandler.INSTANCE.gameEnd) { diff --git a/src/main/java/org/polyfrost/hytils/handlers/game/miniwalls/MiddleBeaconMiniWalls.java b/src/main/java/org/polyfrost/hytils/handlers/game/miniwalls/MiddleBeaconMiniWalls.java index e795c51..b8d4e63 100644 --- a/src/main/java/org/polyfrost/hytils/handlers/game/miniwalls/MiddleBeaconMiniWalls.java +++ b/src/main/java/org/polyfrost/hytils/handlers/game/miniwalls/MiddleBeaconMiniWalls.java @@ -54,6 +54,6 @@ public boolean shouldMakeBeacon() { @SubscribeEvent public void onRenderWorldLast(RenderWorldLastEvent event) { if (!shouldMakeBeacon()) return; - WaypointUtil.renderBeaconBeam(block, HytilsConfig.miniWallsMiddleBeaconColor.getRGB(), 1.0f, event.partialTicks); + WaypointUtil.renderBeaconBeam(block, HytilsConfig.miniWallsMiddleBeaconColor, event.partialTicks); } } diff --git a/src/main/java/org/polyfrost/hytils/handlers/language/LanguageData.java b/src/main/java/org/polyfrost/hytils/handlers/language/LanguageData.java index 1ef7d1c..c15501b 100644 --- a/src/main/java/org/polyfrost/hytils/handlers/language/LanguageData.java +++ b/src/main/java/org/polyfrost/hytils/handlers/language/LanguageData.java @@ -37,6 +37,7 @@ public class LanguageData { private String autoFriendPattern = "Friend request from (?.+)\\[ACCEPT] - \\[DENY] - \\[IGNORE].*"; private String autoAfkReplyPattern = "^From (\\[.+?] )?(.+?): .+$"; + private String chatCleanerKarmaMessages = "^\\+(?\\d)+ Karma!$"; private String chatCleanerJoin = "(?:sled into|slid into|joined|spooked into) the lobby"; private String chatCleanerTicketAnnouncer = "^(?(?!You )\\w{1,16} )has found an? .+$"; private String chatCleanerSoulWellFind = "^.+ has found .+ in the Soul Well!$"; @@ -98,6 +99,8 @@ public class LanguageData { private String hypixelLevelUp = "You are now Hypixel Level (?\\d+)!"; + private String casualGameEnd = "^(?:MINOR EVENT! .+ in .+ ended|DRAGON EGG OVER! Earned [\\d,]+XP [\\d,]g clicking the egg \\d+ times|GIANT CAKE! Event ended! Cake's gone!|PIT EVENT ENDED: .+ \\[INFO\\])$"; + private String cancelGgMessages = "^(?:.* )?(?:\\[.+] )?\\w{1,16}(?: .+)?: (?:❤|gg|GG|gf|Good Game|Good Fight|Good Round! :D|Have a good day!|<3|AutoGG By Sk1er!|AutoGG By Hytils Reborn!|gf|Good Fight|Good Round|:D|Well Played!|wp)$"; private String cancelGlMessages = "(?!.+: )(gl|glhf|good luck|have a good game|autogl by sk1er)"; public String autoChatReportConfirm = "Please type /report confirm to log your report for staff review."; @@ -117,6 +120,7 @@ public class LanguageData { public Pattern autoFriendPatternRegex; public Pattern autoAfkReplyPatternRegex; + public Pattern chatCleanerKarmaMessagesRegex; public Pattern chatCleanerJoinRegex; public Pattern chatCleanerTicketAnnouncerRegex; public Pattern chatCleanerSoulWellFindRegex; @@ -164,6 +168,8 @@ public class LanguageData { public Pattern hypixelLevelUpRegex; + public Pattern casualGameEndRegex; + public Pattern cancelGgMessagesRegex; public Pattern cancelGlMessagesRegex; public Pattern gameBossbarAdvertisementRegex; @@ -180,6 +186,7 @@ public void initialize() { autoFriendPatternRegex = Pattern.compile(autoFriendPattern); autoAfkReplyPatternRegex = Pattern.compile(autoAfkReplyPattern); + chatCleanerKarmaMessagesRegex = Pattern.compile(chatCleanerKarmaMessages); chatCleanerJoinRegex = Pattern.compile(chatCleanerJoin); chatCleanerTicketAnnouncerRegex = Pattern.compile(chatCleanerTicketAnnouncer); chatCleanerSoulWellFindRegex = Pattern.compile(chatCleanerSoulWellFind); @@ -227,6 +234,8 @@ public void initialize() { hypixelLevelUpRegex = Pattern.compile(hypixelLevelUp); + casualGameEndRegex = Pattern.compile(casualGameEnd); + cancelGgMessagesRegex = Pattern.compile(cancelGgMessages); cancelGlMessagesRegex = Pattern.compile(cancelGlMessages, Pattern.CASE_INSENSITIVE); gameBossbarAdvertisementRegex = Pattern.compile(gameBossbarAdvertisement); diff --git a/src/main/java/org/polyfrost/hytils/handlers/render/ChestHighlighter.java b/src/main/java/org/polyfrost/hytils/handlers/render/ChestHighlighter.java index 609a6aa..8a4ea0c 100644 --- a/src/main/java/org/polyfrost/hytils/handlers/render/ChestHighlighter.java +++ b/src/main/java/org/polyfrost/hytils/handlers/render/ChestHighlighter.java @@ -18,27 +18,20 @@ package org.polyfrost.hytils.handlers.render; -import cc.polyfrost.oneconfig.config.core.OneColor; import cc.polyfrost.oneconfig.utils.hypixel.LocrawInfo; import cc.polyfrost.oneconfig.utils.hypixel.LocrawUtil; -import org.polyfrost.hytils.config.HytilsConfig; -import org.polyfrost.hytils.events.TitleEvent; import net.minecraft.client.Minecraft; -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.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityChest; -import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import org.lwjgl.opengl.GL11; +import org.polyfrost.hytils.config.HytilsConfig; +import org.polyfrost.hytils.events.TitleEvent; +import org.polyfrost.hytils.util.WaypointUtil; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -83,92 +76,11 @@ public void onWorldRendered(RenderWorldLastEvent event) { if (entity instanceof TileEntityChest) { BlockPos pos = entity.getPos(); if (!highlightedChestPositions.contains(pos)) continue; - drawBoundingBox(event, pos); + WaypointUtil.drawBoundingBox(event, pos, HytilsConfig.highlightChestsColor); } } } - private void drawBoundingBox(RenderWorldLastEvent event, BlockPos pos) { - Entity viewer = Minecraft.getMinecraft().getRenderViewEntity(); - double viewerX = viewer.lastTickPosX + (viewer.posX - viewer.lastTickPosX) * event.partialTicks; - double viewerY = viewer.lastTickPosY + (viewer.posY - viewer.lastTickPosY) * event.partialTicks; - double viewerZ = viewer.lastTickPosZ + (viewer.posZ - viewer.lastTickPosZ) * event.partialTicks; - - double x = pos.getX() - viewerX; - double y = pos.getY() - viewerY; - double z = pos.getZ() - viewerZ; - GlStateManager.disableCull(); - drawFilledBoundingBox(new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1).expand(0.01, 0.01, 0.01), HytilsConfig.highlightChestsColor); - GlStateManager.enableCull(); - } - - /** - * Taken from NotEnoughUpdates under Creative Commons Attribution-NonCommercial 3.0 - * https://github.com/Moulberry/NotEnoughUpdates/blob/master/LICENSE - * - * @author Moulberry - */ - private void drawFilledBoundingBox(AxisAlignedBB aabb, OneColor c) { - GlStateManager.enableBlend(); - GlStateManager.disableLighting(); - GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); - GlStateManager.disableTexture2D(); - - Tessellator tessellator = Tessellator.getInstance(); - WorldRenderer worldrenderer = tessellator.getWorldRenderer(); - - GlStateManager.color(c.getRed() / 255f, c.getGreen() / 255f, c.getBlue() / 255f, c.getAlpha() / 255f * (float) 0.8); - - //vertical - worldrenderer.begin(GL11.GL_QUADS, 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(); - tessellator.draw(); - worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); - worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex(); - worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); - tessellator.draw(); - - - GlStateManager.color(c.getRed() / 255f * 0.8f, c.getGreen() / 255f * 0.8f, c.getBlue() / 255f * 0.8f, c.getAlpha() / 255f * (float) 0.8); - - //x - worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); - worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); - worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); - tessellator.draw(); - worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); - worldrenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex(); - tessellator.draw(); - - - GlStateManager.color(c.getRed() / 255f * 0.9f, c.getGreen() / 255f * 0.9f, c.getBlue() / 255f * 0.9f, c.getAlpha() / 255f * (float) 0.8); - //z - worldrenderer.begin(GL11.GL_QUADS, 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.minY, aabb.minZ).endVertex(); - worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); - tessellator.draw(); - worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); - worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); - worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); - tessellator.draw(); - GlStateManager.enableTexture2D(); - GlStateManager.disableBlend(); - } - private boolean isNotSupported() { return LocrawUtil.INSTANCE.getLocrawInfo() == null || (LocrawUtil.INSTANCE.getLocrawInfo().getGameType() != LocrawInfo.GameType.SKYWARS && LocrawUtil.INSTANCE.getLocrawInfo().getGameType() != LocrawInfo.GameType.BLITZ_SG && (LocrawUtil.INSTANCE.getLocrawInfo().getGameType() != LocrawInfo.GameType.DUELS || !LocrawUtil.INSTANCE.getLocrawInfo().getGameMode().contains("_SW_"))); } diff --git a/src/main/java/org/polyfrost/hytils/util/WaypointUtil.java b/src/main/java/org/polyfrost/hytils/util/WaypointUtil.java index b8b1779..5f6e935 100644 --- a/src/main/java/org/polyfrost/hytils/util/WaypointUtil.java +++ b/src/main/java/org/polyfrost/hytils/util/WaypointUtil.java @@ -18,7 +18,7 @@ package org.polyfrost.hytils.util; - +import cc.polyfrost.oneconfig.config.core.OneColor; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.GlStateManager; @@ -27,21 +27,20 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.entity.Entity; import net.minecraft.util.*; +import net.minecraftforge.client.event.RenderWorldLastEvent; import org.lwjgl.opengl.GL11; import org.lwjgl.util.vector.Vector3f; -import java.awt.*; - /** - * Taken and adapted from NotEnoughUpdates under Creative Commons Attribution-NonCommercial 3.0 - * https://github.com/Moulberry/NotEnoughUpdates/blob/master/LICENSE + * Taken and adapted from NotEnoughUpdates under GPL-3.0 + * https://github.com/NotEnoughUpdates/NotEnoughUpdates/blob/master/COPYING * @author Moulberry */ public class WaypointUtil { - private static final ResourceLocation beaconBeam = new ResourceLocation("textures/entity/beacon_beam.png"); + private static final OneColor nameColor = new OneColor(-1); - private static void renderBeaconBeam(double x, double y, double z, int rgb, float alphaMult, float partialTicks, boolean disableDepth) { + private static void renderBeaconBeam(double x, double y, double z, OneColor color, float partialTicks, boolean disableDepth) { int height = 300; int bottomOffset = 0; int topOffset = bottomOffset + height; @@ -66,9 +65,10 @@ private static void renderBeaconBeam(double x, double y, double z, int rgb, floa double time = Minecraft.getMinecraft().theWorld.getTotalWorldTime() + (double) partialTicks; double d1 = MathHelper.func_181162_h(-time * 0.2D - (double) MathHelper.floor_double(-time * 0.1D)); - float r = ((rgb >> 16) & 0xFF) / 255f; - float g = ((rgb >> 8) & 0xFF) / 255f; - float b = (rgb & 0xFF) / 255f; + float r = ((color.getRGB() >> 16) & 0xFF) / 255f; + float g = ((color.getRGB() >> 8) & 0xFF) / 255f; + float b = (color.getRGB() & 0xFF) / 255f; + float a = ((color.getRGB() >> 24) & 0xFF) / 255f; double d2 = time * 0.025D * -1.5D; double d4 = 0.5D + Math.cos(d2 + 2.356194490192345D) * 0.2D; double d5 = 0.5D + Math.sin(d2 + 2.356194490192345D) * 0.2D; @@ -81,22 +81,22 @@ private static void renderBeaconBeam(double x, double y, double z, int rgb, floa double d14 = -1.0D + d1; double d15 = (double) (height) * 2.5D + d14; worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); - worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(1.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); + worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(1.0D, d15).color(r, g, b, a).endVertex(); worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); - worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(0.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); - worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(1.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); + worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(0.0D, d15).color(r, g, b, a).endVertex(); + worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(1.0D, d15).color(r, g, b, a).endVertex(); worldrenderer.pos(x + d10, y + bottomOffset, z + d11).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); worldrenderer.pos(x + d8, y + bottomOffset, z + d9).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); - worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(0.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); - worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(1.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); + worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(0.0D, d15).color(r, g, b, a).endVertex(); + worldrenderer.pos(x + d6, y + topOffset, z + d7).tex(1.0D, d15).color(r, g, b, a).endVertex(); worldrenderer.pos(x + d6, y + bottomOffset, z + d7).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); worldrenderer.pos(x + d10, y + bottomOffset, z + d11).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); - worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(0.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); - worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(1.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); + worldrenderer.pos(x + d10, y + topOffset, z + d11).tex(0.0D, d15).color(r, g, b, a).endVertex(); + worldrenderer.pos(x + d8, y + topOffset, z + d9).tex(1.0D, d15).color(r, g, b, a).endVertex(); worldrenderer.pos(x + d8, y + bottomOffset, z + d9).tex(1.0D, d14).color(r, g, b, 1.0F).endVertex(); worldrenderer.pos(x + d4, y + bottomOffset, z + d5).tex(0.0D, d14).color(r, g, b, 1.0F).endVertex(); - worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(0.0D, d15).color(r, g, b, 1.0F * alphaMult).endVertex(); + worldrenderer.pos(x + d4, y + topOffset, z + d5).tex(0.0D, d15).color(r, g, b, a).endVertex(); tessellator.draw(); GlStateManager.disableCull(); @@ -104,22 +104,22 @@ private static void renderBeaconBeam(double x, double y, double z, int rgb, floa double d13 = height + d12; worldrenderer.begin(7, DefaultVertexFormats.POSITION_TEX_COLOR); - worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F * a).endVertex(); worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.2D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.2D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); - worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.2D).tex(0.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); - worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.8D).tex(1.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.2D).tex(0.0D, d13).color(r, g, b, 0.25F * a).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.8D).tex(1.0D, d13).color(r, g, b, 0.25F * a).endVertex(); worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.8D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.8D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); - worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.8D).tex(0.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); - worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.8D).tex(0.0D, d13).color(r, g, b, 0.25F * a).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.2D).tex(1.0D, d13).color(r, g, b, 0.25F * a).endVertex(); worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.2D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); worldrenderer.pos(x + 0.8D, y + bottomOffset, z + 0.8D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); - worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.8D).tex(0.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); - worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.8D).tex(1.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); + worldrenderer.pos(x + 0.8D, y + topOffset, z + 0.8D).tex(0.0D, d13).color(r, g, b, 0.25F * a).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.8D).tex(1.0D, d13).color(r, g, b, 0.25F * a).endVertex(); worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.8D).tex(1.0D, d12).color(r, g, b, 0.25F).endVertex(); worldrenderer.pos(x + 0.2D, y + bottomOffset, z + 0.2D).tex(0.0D, d12).color(r, g, b, 0.25F).endVertex(); - worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(0.0D, d13).color(r, g, b, 0.25F * alphaMult).endVertex(); + worldrenderer.pos(x + 0.2D, y + topOffset, z + 0.2D).tex(0.0D, d13).color(r, g, b, 0.25F * a).endVertex(); tessellator.draw(); GlStateManager.disableLighting(); @@ -129,28 +129,28 @@ private static void renderBeaconBeam(double x, double y, double z, int rgb, floa } } - private static void renderBoundingBox(double x, double y, double z, int rgb, float alphaMult, float partialTicks) { + private static void renderBoundingBox(double x, double y, double z, OneColor color, float alphaMult) { AxisAlignedBB bb = new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1); GlStateManager.disableDepth(); GlStateManager.disableCull(); GlStateManager.disableTexture2D(); - drawFilledBoundingBox(bb, 1f, new Color(rgb)); + drawFilledBoundingBox(bb, color, alphaMult); GlStateManager.enableTexture2D(); GlStateManager.enableCull(); GlStateManager.enableDepth(); } - public static void drawFilledBoundingBox(AxisAlignedBB boundingBox, float alpha, Color color) { + public static void drawFilledBoundingBox(AxisAlignedBB boundingBox, OneColor color, float alphaMult) { GlStateManager.enableBlend(); - GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); GlStateManager.disableTexture2D(); Tessellator tessellator = Tessellator.getInstance(); WorldRenderer worldrenderer = tessellator.getWorldRenderer(); - GlStateManager.color(color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f, color.getAlpha() / 255f * alpha); + GlStateManager.color(color.getRed() / 255F, color.getGreen() / 255F, color.getBlue() / 255F, color.getAlpha() / 255F * alphaMult); //vertical worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); @@ -167,10 +167,10 @@ public static void drawFilledBoundingBox(AxisAlignedBB boundingBox, float alpha, tessellator.draw(); GlStateManager.color( - color.getRed() / 255f * 0.8f, - color.getGreen() / 255f * 0.8f, - color.getBlue() / 255f * 0.8f, - color.getAlpha() / 255f * alpha + color.getRed() / 255F * 0.8f, + color.getGreen() / 255F * 0.8f, + color.getBlue() / 255F * 0.8f, + color.getAlpha() / 255F * alphaMult ); //x @@ -188,10 +188,10 @@ public static void drawFilledBoundingBox(AxisAlignedBB boundingBox, float alpha, tessellator.draw(); GlStateManager.color( - color.getRed() / 255f * 0.9f, - color.getGreen() / 255f * 0.9f, - color.getBlue() / 255f * 0.9f, - color.getAlpha() / 255f * alpha + color.getRed() / 255F * 0.9F, + color.getGreen() / 255F * 0.9F, + color.getBlue() / 255F * 0.9F, + color.getAlpha() / 255F * alphaMult ); //z worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); @@ -208,7 +208,82 @@ public static void drawFilledBoundingBox(AxisAlignedBB boundingBox, float alpha, tessellator.draw(); } - public static void renderBeaconBeam(BlockPos block, int rgb, float alphaMult, float partialTicks) { + public static void drawBoundingBox(RenderWorldLastEvent event, BlockPos pos, OneColor color) { + Entity viewer = Minecraft.getMinecraft().getRenderViewEntity(); + double viewerX = viewer.lastTickPosX + (viewer.posX - viewer.lastTickPosX) * event.partialTicks; + double viewerY = viewer.lastTickPosY + (viewer.posY - viewer.lastTickPosY) * event.partialTicks; + double viewerZ = viewer.lastTickPosZ + (viewer.posZ - viewer.lastTickPosZ) * event.partialTicks; + + double x = pos.getX() - viewerX; + double y = pos.getY() - viewerY; + double z = pos.getZ() - viewerZ; + GlStateManager.disableCull(); + drawFilledBoundingBox(new AxisAlignedBB(x, y, z, x + 1, y + 1, z + 1).expand(0.01, 0.01, 0.01), color); + GlStateManager.enableCull(); + } + + private static void drawFilledBoundingBox(AxisAlignedBB aabb, OneColor c) { + GlStateManager.enableBlend(); + GlStateManager.disableLighting(); + GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); + GlStateManager.disableTexture2D(); + + Tessellator tessellator = Tessellator.getInstance(); + WorldRenderer worldrenderer = tessellator.getWorldRenderer(); + + GlStateManager.color(c.getRed() / 255F, c.getGreen() / 255F, c.getBlue() / 255F, c.getAlpha() / 255F * (float) 0.8); + + //vertical + worldrenderer.begin(GL11.GL_QUADS, 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(); + tessellator.draw(); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); + worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex(); + worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); + tessellator.draw(); + + + GlStateManager.color(c.getRed() / 255F * 0.8f, c.getGreen() / 255F * 0.8f, c.getBlue() / 255F * 0.8f, c.getAlpha() / 255F * (float) 0.8); + + //x + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); + worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.minX, aabb.maxY, aabb.minZ).endVertex(); + worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); + tessellator.draw(); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); + worldrenderer.pos(aabb.maxX, aabb.minY, aabb.minZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.minZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex(); + tessellator.draw(); + + + GlStateManager.color(c.getRed() / 255F * 0.9F, c.getGreen() / 255F * 0.9F, c.getBlue() / 255F * 0.9F, c.getAlpha() / 255F * (float) 0.8); + //z + worldrenderer.begin(GL11.GL_QUADS, 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.minY, aabb.minZ).endVertex(); + worldrenderer.pos(aabb.minX, aabb.minY, aabb.minZ).endVertex(); + tessellator.draw(); + worldrenderer.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION); + worldrenderer.pos(aabb.minX, aabb.minY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.minY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.maxX, aabb.maxY, aabb.maxZ).endVertex(); + worldrenderer.pos(aabb.minX, aabb.maxY, aabb.maxZ).endVertex(); + tessellator.draw(); + GlStateManager.enableTexture2D(); + GlStateManager.disableBlend(); + } + + public static void renderBeaconBeam(BlockPos block, OneColor color, float partialTicks) { double viewerX; double viewerY; double viewerZ; @@ -224,10 +299,10 @@ public static void renderBeaconBeam(BlockPos block, int rgb, float alphaMult, fl double distSq = x * x + y * y + z * z; - WaypointUtil.renderBeaconBeam(x, y, z, rgb, 1.0f, partialTicks, distSq > 10 * 10); + WaypointUtil.renderBeaconBeam(x, y, z, color, partialTicks, distSq > 10 * 10); } - public static void renderBeaconBeamOrBoundingBox(BlockPos block, int rgb, float alphaMult, float partialTicks) { + public static void renderBeaconBeamOrBoundingBox(BlockPos block, OneColor color, float alphaMult, float partialTicks) { double viewerX; double viewerY; double viewerZ; @@ -244,9 +319,9 @@ public static void renderBeaconBeamOrBoundingBox(BlockPos block, int rgb, float double distSq = x * x + y * y + z * z; if (distSq > 10 * 10) { - WaypointUtil.renderBeaconBeam(x, y, z, rgb, 1.0f, partialTicks, true); + WaypointUtil.renderBeaconBeam(x, y, z, color, partialTicks, true); } else { - WaypointUtil.renderBoundingBox(x, y, z, rgb, 1.0f, partialTicks); + WaypointUtil.renderBoundingBox(x, y, z, color, alphaMult); } } @@ -278,7 +353,7 @@ public static void renderWayPoint(String str, Vector3f loc, float partialTicks) GlStateManager.translate(x, y, z); GlStateManager.translate(0, viewer.getEyeHeight(), 0); - renderNametag(str); + renderNametag(str, nameColor); GlStateManager.rotate(-Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F); GlStateManager.rotate(Minecraft.getMinecraft().getRenderManager().playerViewX, 1.0F, 0.0F, 0.0F); @@ -286,14 +361,14 @@ public static void renderWayPoint(String str, Vector3f loc, float partialTicks) GlStateManager.rotate(-Minecraft.getMinecraft().getRenderManager().playerViewX, 1.0F, 0.0F, 0.0F); GlStateManager.rotate(Minecraft.getMinecraft().getRenderManager().playerViewY, 0.0F, 1.0F, 0.0F); - renderNametag(EnumChatFormatting.YELLOW.toString() + Math.round(dist) + "m"); + renderNametag(EnumChatFormatting.YELLOW.toString() + Math.round(dist) + "m", nameColor); GlStateManager.popMatrix(); GlStateManager.disableLighting(); } - public static void renderNametag(String str) { + public static void renderNametag(String str, OneColor textColor) { FontRenderer fontrenderer = Minecraft.getMinecraft().fontRendererObj; float f = 1.6F; float f1 = 0.016666668F * f; @@ -306,7 +381,7 @@ public static void renderNametag(String str) { GlStateManager.depthMask(false); GlStateManager.disableDepth(); GlStateManager.enableBlend(); - GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, GL11.GL_ONE, GL11.GL_ZERO); Tessellator tessellator = Tessellator.getInstance(); WorldRenderer worldrenderer = tessellator.getWorldRenderer(); int i = 0; @@ -327,7 +402,7 @@ public static void renderNametag(String str) { GlStateManager.enableDepth(); GlStateManager.enableBlend(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + GlStateManager.color(textColor.getRed(), textColor.getGreen(), textColor.getBlue(), textColor.getAlpha()); GlStateManager.popMatrix(); } }