aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrayray75 <69988482+Grayray75@users.noreply.github.com>2023-10-08 16:39:15 +0200
committerGrayray75 <69988482+Grayray75@users.noreply.github.com>2023-10-08 16:40:47 +0200
commite65f26f096e998025fe4c46602adf4638710a977 (patch)
treeff1ea8544a923ca41a99e6ee93ba6e8c28a3c295
parent19c8450f00b1f18725deb8014b642817bb607682 (diff)
parent0c9381191663a74a9ec3cff9aae1c8b523215f0e (diff)
downloadSkyblocker-e65f26f096e998025fe4c46602adf4638710a977.tar.gz
Skyblocker-e65f26f096e998025fe4c46602adf4638710a977.tar.bz2
Skyblocker-e65f26f096e998025fe4c46602adf4638710a977.zip
Merge branch 'master' into item-cooldown
-rw-r--r--MRREADME.md225
-rw-r--r--build.gradle14
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java14
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java63
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java19
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java58
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java25
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java12
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java6
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java72
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java9
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemProtection.java75
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRarityBackgrounds.java109
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/item/SkyblockItemRarity.java29
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java4
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json10
-rw-r--r--src/main/resources/assets/skyblocker/textures/gui/sprites/item_rarity_background.pngbin0 -> 198 bytes
-rw-r--r--src/main/resources/fabric.mod.json2
-rw-r--r--src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java20
22 files changed, 669 insertions, 118 deletions
diff --git a/MRREADME.md b/MRREADME.md
new file mode 100644
index 00000000..7e1e68ad
--- /dev/null
+++ b/MRREADME.md
@@ -0,0 +1,225 @@
+<img height="150" src="https://hysky.de/skyblocker.png" />
+
+## Skyblocker
+
+Hypixel Skyblock Mod for Minecraft 1.17.x + 1.18.x + 1.19.x + 1.20.x
+
+## 🔧 Configuration - [Mod Menu](https://modrinth.com/mod/modmenu) not required
+open config with modmenu \
+or **/skyblocker config**
+
+Skyblocker has a variety of configurations. \
+To access the configuration menu, you must install [Mod Menu](https://modrinth.com/mod/modmenu).
+<figure><a href="https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/7a284adbbdc9cbad48c627e3898dc8cfb9f54a64.png"><img src="https://cdn.modrinth.com/data/y6DuFGwJ/images/7a284adbbdc9cbad48c627e3898dc8cfb9f54a64.png" alt="Mod Menu" style="width:100%"></a><figcaption align = "center"><b>Mod Menu - Skyblocker config</b></figcaption></figure>
+
+### List of Configuration
+
+<details>
+<summary> General </summary>
+
+|Config option|Description|
+|---|---|
+| Update Notification | Get notified when there is a new update |
+| View [backpack preview](https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/ef33e34b79c1615bcb23f3a395b29b793ef32e34.png) without holding shift | Preview on hover |
+
+<details>
+<summary> Health, Mana, Defence & XP Bars </summary>
+
+|Config option|Description|
+|---|---|
+|Enable Bars| Change Minecraft health ui with skyblocker [custom ui](https://user-images.githubusercontent.com/27798256/170806938-f858f0ae-4d8b-4767-9b53-8fe5a65edf56.png)|
+|Configure Bar Position|[Customize Bar Positions](https://cdn.discordapp.com/attachments/1103292463558438993/1103292498345984070/healt-layer.png)|
+</details>
+
+<details>
+<summary> Item List </summary>
+
+|Config option|Description|
+|---|---|
+|Enable Item List| Acitvate [recipe viewer](https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/cf9f8077067b9781686f23116f163d529c21c404.png)|
+</details>
+
+<details>
+<summary> Item Tooltip </summary>
+
+Customize [Item tooltip](https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/12903f3f839d769fac48a4e74e04bee9aa1657d5.png)
+
+</details>
+
+<details>
+<summary> Hitboxes </summary>
+
+|Config option|Description|
+|---|---|
+|Enable 1.8 farmland hitbox| Change hitbox to the 1.8 one |
+|Enable 1.8 lever hitbox| Change hitbox to the 1.8 one |
+</details>
+</details>
+
+<details>
+<summary> Locations </summary>
+
+<details>
+<summary> Dungeons </summary>
+
+|Config option|Description|
+|---|---|
+|Croseus Helper|Gray out chests that have already been opened|
+|Enable Map| [Map](https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/43243429b1c4d17236ae3e5a9836ecd7d905644b.png)|
+|Solve Three Weirdos Puzzle|Solver usefull in Dungeons|
+|Solve Blaze Puzzle|Solver usefull in Dungeons|
+|Solve Trivia Puzzle|Solver usefull in Dungeons|
+
+<details>
+<summary> Terminal </summary>
+
+|Config option|Description|
+|---|---|
+|Solve Selectect Colored|Solver usefull in Dungeons 7|
+|Solve Click In Order|Solver usefull in Dungeons 7|
+|Solve Starts With|Solver usefull in Dungeons 7|
+</details>
+</details>
+<details>
+<summary> Dwarven Mines </summary>
+
+|Config option|Description|
+|---|---|
+|Enable Drill Fuel|[Drill icon](https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/43c7ab7aa7c90fcf833c7cddbf73e6644c6ce5fa.png)|
+|Solve Fetchur| Solver usefull in Mines|
+|Solve Puzzler Puzzle| Solver usefull in Mines |
+|Dwarven Hud| [Commision Hud](https://cdn.discordapp.com/attachments/905867886428565565/950513333478494248/Screen_Shot_2022-03-07_at_4.58.12_PM.png)|
+</details>
+</details>
+
+
+<details>
+<summary> Quick Navigation </summary>
+
+|Config option|Description|
+|---|---|
+|Enable Quick Navigation|Enable [Quicknav](https://cdn.discordapp.com/attachments/1103292463558438993/1103358576870817866/quick-nav.png)|
+<details>
+<summary> Button 1-12 </summary>
+
+|Config option|Description|
+|---|---|
+|Render|To show the tab|
+|Item name| The name of the item e.g. iron_boots |
+|NBT| NBT tag of the item e.g. custom head id on skull item|
+|UI Title| Title of the tab|
+|Click event|The command that is executed when you click the tab|
+</details>
+</details>
+
+
+<details>
+<summary> Messages </summary>
+
+|Config option|Description|
+|---|---|
+|Hide Ability Cooldown|Disable,Filter or Move to action bar|
+|Hide Heal Messages|Disable,Filter or Move to action bar|
+|Hide AOTE Messages|Disable,Filter or Move to action bar|
+|Hide Implosion Message|Disable,Filter or Move to action bar|
+|Hide Molten Wave Message|Disable,Filter or Move to action bar|
+|Hide Ads from Public Chat|Disable,Filter or Move to action bar|
+|Hide Teleport Pad Messages|Disable,Filter or Move to action bar|
+|Hide Combo Messages|Disable,Filter or Move to action bar|
+|Hide Autopet Messages|Disable,Filter or Move to action bar|
+|Hide Mana Consumption Messages from Action Bar|Activate or deactivate|
+</details>
+
+
+<details>
+<summary> Discord Rich Presence </summary>
+
+|Config option|Description|
+|---|---|
+|Enable|Activate [Discord Rich Presence](https://cdn-raw.modrinth.com/data/y6DuFGwJ/images/f6314d0ae0fc24d77fb3371e59b7abfe4774a17e.png)|
+|Skyblock Info|Choose between Location,Purse and Bits|
+|Cycle Skyblock Info| Cycles between the three options|
+|Custom Message| Show a custom message|
+</details>
+
+## 🖼️ Images
+Click [#Gallery](https://modrinth.com/mod/skyblocker-liap/gallery) for images to this mod
+
+## 📖Features
+<details open>
+<summary>open</summary>
+
+* Bars: Health and absorption, Mana, Defense, XP (moving fancy bars)
+* Hide Messages: Ability Cooldown, Heal, AOTE, Implosion, Molten Wave, Teleport Pad Messages
+* Dungeon Minimap
+* Dungeon Secrets
+* Starred Mob Glow
+* Dungeon Puzzle Solver:
+ * Three Weirdos
+ * Blaze
+ * Tic Tac Toe
+ * Croesus
+ * Terminal:
+ * Order
+ * Coloured Items
+ * Item Name
+* Dwarven Mines Solver: Fetchur, Puzzler
+* Barn Solver: Treasure Hunter, Hungry Hiker
+* Experiments Solvers
+* Slayer helper:
+ * Vampire : Effigy Waypoints, Healing Melon Indicator, Twinclaws Ice Indicator, Steak Stake Indicator
+* Drill Fuel and Pickonimbus 2000 in Item Durability Bar
+* Hotbar Slot Lock Keybind (Select the hotbar slot you want to lock/unlock and press the lockbutton)
+* Price tooltip: npc, motes, bazaar (avg, lbin), ah, museum
+* reparty: write /rp to reparty + auto rejoin
+* Wiki Lookup: press f4 to open the wiki page about the held item
+* Discord Rich Presence: Allows user to show either their Piggy, Bits, or location. Along with a custom message
+* Quicknav: fast navigate between pets, armor, enderchest, skill, collection, crafting, enchant, envil, warp dungeon,
+ warp hub
+* Recipe book: in the vanilla recipe book all skyblock items are listed, and you can see the recipe of the item
+* Backpack preview: after you clicked your backpack or enderchest once you can hover over the backpack or enderchest and
+ hold shift to preview
+* Update notification
+* Commission HUD: Dwarven Mines quests
+* 1.8 hitbox for lever and farmland
+* Custom Tab HUD + Fully configureable with ressourcepack
+* Roughly enough items (REI) and Emi Support
+* Fishing Helper + sound notification
+* Mirrorverse Waypoints
+* Attribute Shard Info Display
+* Item and Armour customisation:
+ * Item Renaming
+ * Custom Armour Dye Colours
+ * Custom Armour Trims
+* OptiFabric Compatibility
+* Rare Drop Special Effects! Dungeon chest
+* Dungeon Chest Profit Calculator
+* Hide Status Effect Overlay
+* Personal Compactor/Deletor preview
+* Hide fake players in social interactions screen
+* hidden relic helper
+
+</details>
+
+
+## [Modpack](https://modrinth.com/modpack/skyblocker-modpack)
+
+<details open>
+<summary>open</summary>
+
+1. [Here](https://docs.modrinth.com/docs/modpacks/playing_modpacks) is a tutorial how to install it easy with a launcher.
+2. Download the [Skyblocker Modpack](https://modrinth.com/modpack/skyblocker-modpack/version/latest).
+ * Drag and drop the .mrpack file into a Custom MC Launcher like [MultiMC](https://multimc.org/) or [Prism Launcher](https://prismlauncher.org/) and start the new instance.
+
+</details>
+
+## Kinetic Hosting Affiliate - 15% off your first month
+
+Looking for an affordable and reliable hosting platform for your Minecraft server? Look no further than Kinetic Hosting! As an affiliate partner with Kinetic Hosting, we highly recommend their service. They offer fast and reliable servers with the largest range of supported modpacks.
+
+As a special offer for our audience, you can **<u>[use the discount code "Skyblocker" during checkout to get 15% off your first month](https://billing.kinetichosting.net/aff.php?aff=315)</u>**.
+This helps to cover our server costs.
+
+[![Kinetic-hosting](https://cdn.discordapp.com/attachments/1098004599757099150/1099460202924879902/Skyblocker.png)](https://billing.kinetichosting.net/aff.php?aff=315)
+
+So what are you waiting for? Click on the **<u>[link](https://billing.kinetichosting.net/aff.php?aff=315)</u>** to check out Kinetic Hosting and start playing with your friends today! \ No newline at end of file
diff --git a/build.gradle b/build.gradle
index d26c0e92..8ed905d1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -140,18 +140,22 @@ modrinth {
gameVersions = [project.minecraft_version]
loaders = ["fabric"]
versionType = "release"
- dependencies = [ // Yet another array. Create a new `ModDependency` or `VersionDependency` with two strings - the ID and the scope
- new ModDependency("P7dR8mSH", "required"), // Creates a new required dependency on Fabric API
- new ModDependency("mOgUt4GM", "optional"), // modmenu
- new ModDependency("nfn13YXA", "optional") // REI
- ]
+ dependencies {
+ required.project "fabric-api"
+ optional.project "modmenu"
+ optional.project "rei"
+ optional.project "emi"
+ }
changelog = System.getenv('CHANGELOG')
+ syncBodyFrom = rootProject.file("MRREADME.md").text
}
tasks.modrinth.doLast {
println "::set-output name=url::https://modrinth.com/mod/skyblocker-liap/version/$uploadInfo.id"
}
+tasks.modrinth.dependsOn(tasks.modrinthSyncBody)
+
// configure the maven publication
publishing {
publications {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
index beff7a49..6f4276e9 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/SkyblockerMod.java
@@ -102,6 +102,8 @@ public class SkyblockerMod implements ClientModInitializer {
TicTacToe.init();
QuiverWarning.init();
SpecialEffects.init();
+ ItemProtection.init();
+ ItemRarityBackgrounds.init();
containerSolverManager.init();
statusBarTracker.init();
Scheduler.INSTANCE.scheduleCyclic(Utils::update, 20);
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java
index 28ed704b..552ed091 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java
@@ -3,9 +3,17 @@ package me.xmrvizzy.skyblocker.config;
import dev.isxander.yacl3.api.Option;
import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
import dev.isxander.yacl3.api.controller.EnumControllerBuilder;
-import me.xmrvizzy.skyblocker.config.controllers.EnumDropdownControllerBuilder;
+import dev.isxander.yacl3.api.controller.ValueFormatter;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.function.Function;
public class ConfigUtils {
+ public static final Function<Formatting, String> FORMATTING_TO_STRING = formatting -> StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
+ public static final ValueFormatter<Float> FLOAT_TWO_FORMATTER = value -> Text.literal(String.format("%,.2f", value).replaceAll("[\u00a0\u202F]", " "));
+
public static BooleanControllerBuilder createBooleanController(Option<Boolean> opt) {
return BooleanControllerBuilder.create(opt).yesNoFormatter().coloured(true);
}
@@ -14,8 +22,4 @@ public class ConfigUtils {
public static <E extends Enum<E>> EnumControllerBuilder<E> createEnumCyclingListController(Option<E> opt) {
return EnumControllerBuilder.create(opt).enumClass((Class<E>) opt.binding().defaultValue().getClass());
}
-
- public static <E extends Enum<E>> EnumDropdownControllerBuilder<E> createEnumDropdownController(Option<E> opt) {
- return EnumDropdownControllerBuilder.create(opt);
- }
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index 7b801d89..8e014124 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,19 +1,18 @@
package me.xmrvizzy.skyblocker.config;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
import dev.isxander.yacl3.config.v2.api.SerialEntry;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
import me.xmrvizzy.skyblocker.skyblock.item.CustomArmorTrims;
import me.xmrvizzy.skyblocker.utils.chat.ChatFilterResult;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
+import java.util.ArrayList;
+import java.util.List;
+
public class SkyblockerConfig {
@SerialEntry
public int version = 1;
@@ -209,6 +208,9 @@ public class SkyblockerConfig {
@SerialEntry
public List<Integer> lockedSlots = new ArrayList<>();
+
+ @SerialEntry
+ public ObjectOpenHashSet<String> protectedItems = new ObjectOpenHashSet<>();
@SerialEntry
public Object2ObjectOpenHashMap<String, Text> customItemNames = new Object2ObjectOpenHashMap<>();
@@ -465,6 +467,12 @@ public class SkyblockerConfig {
public static class ItemInfoDisplay {
@SerialEntry
public boolean attributeShardInfo = true;
+
+ @SerialEntry
+ public boolean itemRarityBackgrounds = false;
+
+ @SerialEntry
+ public float itemRarityBackgroundsOpacity = 1f;
}
public static class SpecialEffects {
@@ -585,54 +593,17 @@ public class SkyblockerConfig {
public int neutralThreshold = 1000;
@SerialEntry
- public FormattingOption neutralColor = FormattingOption.DARK_GRAY;
+ public Formatting neutralColor = Formatting.DARK_GRAY;
@SerialEntry
- public FormattingOption profitColor = FormattingOption.DARK_GREEN;
+ public Formatting profitColor = Formatting.DARK_GREEN;
@SerialEntry
- public FormattingOption lossColor = FormattingOption.RED;
+ public Formatting lossColor = Formatting.RED;
@SerialEntry
- public FormattingOption incompleteColor = FormattingOption.BLUE;
-
- }
-
- public enum FormattingOption {
- BLACK(Formatting.BLACK),
- DARK_BLUE(Formatting.DARK_BLUE),
- DARK_GREEN(Formatting.DARK_GREEN),
- DARK_AQUA(Formatting.DARK_AQUA),
- DARK_RED(Formatting.DARK_RED),
- DARK_PURPLE(Formatting.DARK_PURPLE),
- GOLD(Formatting.GOLD),
- GRAY(Formatting.GRAY),
- DARK_GRAY(Formatting.DARK_GRAY),
- BLUE(Formatting.BLUE),
- GREEN(Formatting.GREEN),
- AQUA(Formatting.AQUA),
- RED(Formatting.RED),
- LIGHT_PURPLE(Formatting.LIGHT_PURPLE),
- YELLOW(Formatting.YELLOW),
- WHITE(Formatting.WHITE),
- OBFUSCATED(Formatting.OBFUSCATED),
- BOLD(Formatting.BOLD),
- STRIKETHROUGH(Formatting.STRIKETHROUGH),
- UNDERLINE(Formatting.UNDERLINE),
- ITALIC(Formatting.ITALIC),
- RESET(Formatting.RESET);
-
- public final Formatting formatting;
-
-
- FormattingOption(Formatting formatting) {
- this.formatting = formatting;
- }
+ public Formatting incompleteColor = Formatting.BLUE;
- @Override
- public String toString() {
- return StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
- }
}
public static class LividColor {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
index 16439cb5..2d641ac1 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
@@ -10,11 +10,12 @@ import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.StringControllerBuilder;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig.FormattingOption;
import me.xmrvizzy.skyblocker.config.ConfigUtils;
+import me.xmrvizzy.skyblocker.config.controllers.EnumDropdownControllerBuilder;
import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMapConfigScreen;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
public class DungeonsCategory {
@@ -150,34 +151,34 @@ public class DungeonsCategory {
newValue -> config.locations.dungeons.dungeonChestProfit.neutralThreshold = newValue)
.controller(IntegerFieldControllerBuilder::create)
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.neutralColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.neutralColor,
() -> config.locations.dungeons.dungeonChestProfit.neutralColor,
newValue -> config.locations.dungeons.dungeonChestProfit.neutralColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.profitColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.profitColor,
() -> config.locations.dungeons.dungeonChestProfit.profitColor,
newValue -> config.locations.dungeons.dungeonChestProfit.profitColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.lossColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.lossColor,
() -> config.locations.dungeons.dungeonChestProfit.lossColor,
newValue -> config.locations.dungeons.dungeonChestProfit.lossColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.incompleteColor"))
.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.incompleteColor.@Tooltip")))
.binding(defaults.locations.dungeons.dungeonChestProfit.incompleteColor,
() -> config.locations.dungeons.dungeonChestProfit.incompleteColor,
newValue -> config.locations.dungeons.dungeonChestProfit.incompleteColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
.build())
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
index 1a483ef5..318d579c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/GeneralCategory.java
@@ -1,15 +1,12 @@
package me.xmrvizzy.skyblocker.config.categories;
-import dev.isxander.yacl3.api.ButtonOption;
-import dev.isxander.yacl3.api.ConfigCategory;
-import dev.isxander.yacl3.api.Option;
-import dev.isxander.yacl3.api.OptionDescription;
-import dev.isxander.yacl3.api.OptionGroup;
+import dev.isxander.yacl3.api.*;
import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
+import dev.isxander.yacl3.api.controller.FloatSliderControllerBuilder;
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.config.ConfigUtils;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import me.xmrvizzy.skyblocker.skyblock.shortcut.ShortcutsConfigScreen;
import me.xmrvizzy.skyblocker.utils.render.title.TitleContainerConfigScreen;
import net.minecraft.client.MinecraftClient;
@@ -17,10 +14,10 @@ import net.minecraft.text.Text;
public class GeneralCategory {
- public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
+ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
return ConfigCategory.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.category.general"))
-
+
//Ungrouped Options
.option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.acceptReparty"))
@@ -57,7 +54,7 @@ public class GeneralCategory {
newValue -> config.general.hideStatusEffectOverlay = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
-
+
//Tab Hud
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.tabHud"))
@@ -94,7 +91,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createEnumCyclingListController)
.build())
.build())
-
+
//Fancy Bars
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.bars"))
@@ -135,7 +132,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createEnumCyclingListController)
.build())
.build())
-
+
//Experiments Solver
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.experiments"))
@@ -162,7 +159,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Fishing Helper
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.fishing"))
@@ -175,7 +172,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Fairy Souls Helper
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.fairySouls"))
@@ -203,7 +200,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Item Cooldown
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.itemCooldown"))
@@ -216,7 +213,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Shortcuts
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.shortcuts"))
@@ -251,7 +248,7 @@ public class GeneralCategory {
.action((screen, opt) -> MinecraftClient.getInstance().setScreen(new ShortcutsConfigScreen(screen)))
.build())
.build())
-
+
//Quiver Warning
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.quiverWarning"))
@@ -278,7 +275,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Item List
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.itemList"))
@@ -291,7 +288,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Item Tooltip
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.itemTooltip"))
@@ -348,7 +345,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Item Info Display
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay"))
@@ -361,8 +358,23 @@ public class GeneralCategory {
newValue -> config.general.itemInfoDisplay.attributeShardInfo = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds.@Tooltip")))
+ .binding(defaults.general.itemInfoDisplay.itemRarityBackgrounds,
+ () -> config.general.itemInfoDisplay.itemRarityBackgrounds,
+ newValue -> config.general.itemInfoDisplay.itemRarityBackgrounds = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Float>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgroundsOpacity"))
+ .binding(defaults.general.itemInfoDisplay.itemRarityBackgroundsOpacity,
+ () -> config.general.itemInfoDisplay.itemRarityBackgroundsOpacity,
+ newValue -> config.general.itemInfoDisplay.itemRarityBackgroundsOpacity = newValue)
+ .controller(opt -> FloatSliderControllerBuilder.create(opt).range(0f, 1f).step(0.05f).formatValue(ConfigUtils.FLOAT_TWO_FORMATTER))
+ .build())
.build())
-
+
//Special Effects
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.specialEffects"))
@@ -376,7 +388,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Hitboxes
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.hitbox"))
@@ -396,7 +408,7 @@ public class GeneralCategory {
.controller(ConfigUtils::createBooleanController)
.build())
.build())
-
+
//Title Container
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.titleContainer"))
@@ -443,7 +455,7 @@ public class GeneralCategory {
.action((screen, opt) -> MinecraftClient.getInstance().setScreen(new TitleContainerConfigScreen(screen)))
.build())
.build())
-
+
//Teleport Overlays
.group(OptionGroup.createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.teleportOverlay"))
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java
index cf40c7d5..6db0028c 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java
@@ -8,16 +8,23 @@ import dev.isxander.yacl3.gui.controllers.dropdown.AbstractDropdownController;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
+import java.util.function.Function;
import java.util.stream.Stream;
public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownController<E> {
- protected EnumDropdownController(Option<E> option) {
+ /**
+ * The function used to convert enum constants to strings used for display, suggestion, and validation. Defaults to {@link Enum#toString}.
+ */
+ protected final Function<E, String> toString;
+
+ protected EnumDropdownController(Option<E> option, Function<E, String> toString) {
super(option);
+ this.toString = toString;
}
@Override
public String getString() {
- return option().pendingValue().toString();
+ return toString.apply(option().pendingValue());
}
@Override
@@ -26,15 +33,15 @@ public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownC
}
/**
- * Searches through enum constants for one whose {@link Enum#toString()} result equals {@code value}
+ * Searches through enum constants for one whose {@link #toString} result equals {@code value}
*
* @return The enum constant associated with the {@code value} or the pending value if none are found
- * @implNote The return value of {@link Enum#toString()} on each enum constant should be unique in order to ensure accuracy
+ * @implNote The return value of {@link #toString} on each enum constant should be unique in order to ensure accuracy
*/
private E getEnumFromString(String value) {
value = value.toLowerCase();
for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) {
- if (constant.toString().toLowerCase().equals(value)) return constant;
+ if (toString.apply(constant).toLowerCase().equals(value)) return constant;
}
return option().pendingValue();
@@ -44,7 +51,7 @@ public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownC
public boolean isValueValid(String value) {
value = value.toLowerCase();
for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) {
- if (constant.toString().equals(value)) return true;
+ if (toString.apply(constant).equals(value)) return true;
}
return false;
@@ -59,16 +66,16 @@ public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownC
}
/**
- * Filters and sorts through enum constants for those whose {@link Enum#toString()} result equals {@code value}
+ * Filters and sorts through enum constants for those whose {@link #toString} result equals {@code value}
*
* @return a sorted stream containing enum constants associated with the {@code value}
- * @implNote The return value of {@link Enum#toString()} on each enum constant should be unique in order to ensure accuracy
+ * @implNote The return value of {@link #toString} on each enum constant should be unique in order to ensure accuracy
*/
@NotNull
protected Stream<String> getValidEnumConstants(String value) {
String valueLowerCase = value.toLowerCase();
return Arrays.stream(option().pendingValue().getDeclaringClass().getEnumConstants())
- .map(Enum::toString)
+ .map(this.toString)
.filter(constant -> constant.toLowerCase().contains(valueLowerCase))
.sorted((s1, s2) -> {
String s1LowerCase = s1.toLowerCase();
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java
index baadb8b3..a17f58d6 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java
@@ -3,8 +3,25 @@ package me.xmrvizzy.skyblocker.config.controllers;
import dev.isxander.yacl3.api.Option;
import dev.isxander.yacl3.api.controller.ControllerBuilder;
+import java.util.function.Function;
+
public interface EnumDropdownControllerBuilder<E extends Enum<E>> extends ControllerBuilder<E> {
+ EnumDropdownControllerBuilder<E> toString(Function<E, String> toString);
+
static <E extends Enum<E>> EnumDropdownControllerBuilder<E> create(Option<E> option) {
return new EnumDropdownControllerBuilderImpl<>(option);
}
+
+ /**
+ * Creates a factory for {@link EnumDropdownControllerBuilder}s with the given function for converting enum constants to strings.
+ * Use this if a custom toString function for an enum is needed.
+ * Use it like this:
+ * <pre>{@code Option.<MyEnum>createBuilder().controller(createEnumDropdownControllerBuilder.getFactory(MY_CUSTOM_ENUM_TO_STRING_FUNCTION))}</pre>
+ * @param toString The function used to convert enum constants to strings used for display, suggestion, and validation
+ * @return a factory for {@link EnumDropdownControllerBuilder}s
+ * @param <E> the enum type
+ */
+ static <E extends Enum<E>> Function<Option<E>, ControllerBuilder<E>> getFactory(Function<E, String> toString) {
+ return opt -> EnumDropdownControllerBuilder.create(opt).toString(toString);
+ }
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java
index ea30d1da..27878c86 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java
@@ -4,14 +4,24 @@ import dev.isxander.yacl3.api.Controller;
import dev.isxander.yacl3.api.Option;
import dev.isxander.yacl3.impl.controller.AbstractControllerBuilderImpl;
+import java.util.function.Function;
+
public class EnumDropdownControllerBuilderImpl<E extends Enum<E>> extends AbstractControllerBuilderImpl<E> implements EnumDropdownControllerBuilder<E> {
+ private Function<E, String> toString = Enum::toString;
+
public EnumDropdownControllerBuilderImpl(Option<E> option) {
super(option);
}
+ @Override
+ public EnumDropdownControllerBuilder<E> toString(Function<E, String> toString) {
+ this.toString = toString;
+ return this;
+ }
+
@SuppressWarnings("UnstableApiUsage")
@Override
public Controller<E> build() {
- return new EnumDropdownController<>(option);
+ return new EnumDropdownController<>(option, toString);
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java
index ee1fc5b8..8b2ec417 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ClientPlayerEntityMixin.java
@@ -4,6 +4,7 @@ import com.mojang.authlib.GameProfile;
import dev.cbyrne.betterinject.annotations.Inject;
import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock;
+import me.xmrvizzy.skyblocker.skyblock.item.ItemProtection;
import me.xmrvizzy.skyblocker.skyblock.rift.HealingMelonIndicator;
import me.xmrvizzy.skyblocker.utils.Utils;
import net.minecraft.client.network.AbstractClientPlayerEntity;
@@ -21,7 +22,10 @@ public abstract class ClientPlayerEntityMixin extends AbstractClientPlayerEntity
@Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true)
public void skyblocker$dropSelectedItem(CallbackInfoReturnable<Boolean> cir) {
- if (Utils.isOnSkyblock()) HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir);
+ if (Utils.isOnSkyblock()) {
+ if (ItemProtection.isItemProtected(this.getInventory().getMainHandStack())) cir.setReturnValue(false);
+ HotbarSlotLock.handleDropSelectedItem(this.getInventory().selectedSlot, cir);
+ }
}
@Inject(method = "updateHealth", at = @At("RETURN"))
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
index 17497ded..7e94d660 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/HandledScreenMixin.java
@@ -8,20 +8,27 @@ import me.xmrvizzy.skyblocker.skyblock.experiment.SuperpairsSolver;
import me.xmrvizzy.skyblocker.skyblock.experiment.UltrasequencerSolver;
import me.xmrvizzy.skyblocker.skyblock.item.BackpackPreview;
import me.xmrvizzy.skyblocker.skyblock.item.CompactorDeletorPreview;
+import me.xmrvizzy.skyblocker.skyblock.item.ItemProtection;
+import me.xmrvizzy.skyblocker.skyblock.item.ItemRarityBackgrounds;
import me.xmrvizzy.skyblocker.skyblock.item.WikiLookup;
import me.xmrvizzy.skyblocker.skyblock.itemlist.ItemRegistry;
import me.xmrvizzy.skyblocker.utils.Utils;
import me.xmrvizzy.skyblocker.utils.render.gui.ContainerSolver;
+import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.ingame.HandledScreen;
+import net.minecraft.client.item.TooltipContext;
import net.minecraft.inventory.SimpleInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
+import net.minecraft.screen.GenericContainerScreenHandler;
+import net.minecraft.screen.ScreenHandler;
import net.minecraft.screen.slot.Slot;
import net.minecraft.screen.slot.SlotActionType;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;
+import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
@@ -36,10 +43,20 @@ import java.util.Map;
import java.util.regex.Matcher;
@Mixin(HandledScreen.class)
-public abstract class HandledScreenMixin extends Screen {
+public abstract class HandledScreenMixin<T extends ScreenHandler> extends Screen {
+ /**
+ * This is the slot id returned for when a click is outside of the screen's bounds
+ */
+ @Unique
+ private static final int OUT_OF_BOUNDS_SLOT = -999;
+
@Shadow
@Nullable
protected Slot focusedSlot;
+
+ @Shadow
+ @Final
+ protected T handler;
protected HandledScreenMixin(Text title) {
super(title);
@@ -120,4 +137,57 @@ public abstract class HandledScreenMixin extends Screen {
}
}
}
+
+ /**
+ * The naming of this method in yarn is half true, its mostly to handle slot/item interactions (which are mouse or keyboard clicks)
+ * For example, using the drop key bind while hovering over an item will invoke this method to drop the players item
+ */
+ @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At("HEAD"), cancellable = true)
+ private void skyblocker$onSlotInteract(Slot slot, int slotId, int button, SlotActionType actionType, CallbackInfo ci) {
+ if (Utils.isOnSkyblock()) {
+ // When you try and drop the item by picking it up then clicking outside of the screen
+ if (slotId == OUT_OF_BOUNDS_SLOT) {
+ ItemStack cursorStack = this.handler.getCursorStack();
+
+ if (ItemProtection.isItemProtected(cursorStack)) ci.cancel();
+ }
+
+ if (slot != null) {
+ // When you click your drop key while hovering over an item
+ if (actionType == SlotActionType.THROW) {
+ ItemStack stack = slot.getStack();
+
+ if (ItemProtection.isItemProtected(stack)) ci.cancel();
+ }
+
+ //Prevent salvaging
+ if (this.getTitle().getString().equals("Salvage Items")) {
+ ItemStack stack = slot.getStack();
+
+ if (ItemProtection.isItemProtected(stack)) ci.cancel();
+ }
+
+ //Prevent selling to NPC shops
+ if (this.client != null && this.handler instanceof GenericContainerScreenHandler genericContainerScreenHandler && genericContainerScreenHandler.getRows() == 6) {
+ ItemStack sellItem = this.handler.slots.get(49).getStack();
+
+ if (sellItem.getName().getString().equals("Sell Item") || skyblocker$doesLoreContain(sellItem, this.client, "buyback")) {
+ ItemStack stack = slot.getStack();
+
+ if (ItemProtection.isItemProtected(stack)) ci.cancel();
+ }
+ }
+ }
+ }
+ }
+
+ //TODO make this a util method somewhere else, eventually
+ private static boolean skyblocker$doesLoreContain(ItemStack stack, MinecraftClient client, String searchString) {
+ return stack.getTooltip(client.player, TooltipContext.BASIC).stream().map(Text::getString).anyMatch(line -> line.contains(searchString));
+ }
+
+ @Inject(method = "drawSlot", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/DrawContext;drawItem(Lnet/minecraft/item/ItemStack;III)V"))
+ private void skyblocker$drawItemRarityBackground(DrawContext context, Slot slot, CallbackInfo ci) {
+ if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(slot.getStack(), context, slot.x, slot.y);
+ }
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
index 7df38bde..3376907b 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/InGameHudMixin.java
@@ -8,12 +8,14 @@ import me.xmrvizzy.skyblocker.skyblock.FancyStatusBars;
import me.xmrvizzy.skyblocker.skyblock.HotbarSlotLock;
import me.xmrvizzy.skyblocker.skyblock.item.ItemCooldowns;
import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMap;
+import me.xmrvizzy.skyblocker.skyblock.item.ItemRarityBackgrounds;
import me.xmrvizzy.skyblocker.utils.Utils;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.hud.InGameHud;
+import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Final;
@@ -42,9 +44,10 @@ public abstract class InGameHudMixin {
private MinecraftClient client;
@Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0))
- public void skyblocker$renderHotbarItemLock(float tickDelta, DrawContext context, CallbackInfo ci, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y) {
- if (Utils.isOnSkyblock() && HotbarSlotLock.isLocked(index)) {
- context.drawTexture(SLOT_LOCK, x, y, 0, 0, 16, 16);
+ public void skyblocker$renderHotbarItemLockOrRarityBg(float tickDelta, DrawContext context, CallbackInfo ci, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) {
+ if (Utils.isOnSkyblock()) {
+ if (SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgrounds) ItemRarityBackgrounds.tryDraw(player.getInventory().main.get(index), context, x, y);
+ if (HotbarSlotLock.isLocked(index)) context.drawTexture(SLOT_LOCK, x, y, 0, 0, 16, 16);
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
index 91be5248..ea54ff32 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
@@ -160,7 +160,7 @@ public class DungeonChestProfit {
private static Text getProfitText(int profit, boolean hasIncompleteData) {
SkyblockerConfig.DungeonChestProfit config = SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit;
- return getProfitText(profit, hasIncompleteData, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting);
+ return getProfitText(profit, hasIncompleteData, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor);
}
static Text getProfitText(int profit, boolean hasIncompleteData, int neutralThreshold, Formatting neutralColor, Formatting profitColor, Formatting lossColor, Formatting incompleteColor) {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemProtection.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemProtection.java
new file mode 100644
index 00000000..db671787
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemProtection.java
@@ -0,0 +1,75 @@
+package me.xmrvizzy.skyblocker.skyblock.item;
+
+import com.mojang.brigadier.Command;
+import com.mojang.brigadier.CommandDispatcher;
+
+import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
+import me.xmrvizzy.skyblocker.utils.Utils;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
+import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
+import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
+import net.minecraft.command.CommandRegistryAccess;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.text.Text;
+
+public class ItemProtection {
+
+ public static void init() {
+ ClientCommandRegistrationCallback.EVENT.register(ItemProtection::registerCommand);
+ }
+
+ public static boolean isItemProtected(ItemStack stack) {
+ if (stack == null || stack.isEmpty()) return false;
+
+ NbtCompound nbt = stack.getNbt();
+
+ if (nbt != null && nbt.contains("ExtraAttributes")) {
+ NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
+ String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : "";
+
+ return SkyblockerConfigManager.get().general.protectedItems.contains(itemUuid);
+ }
+
+ return false;
+ }
+
+ private static void registerCommand(CommandDispatcher<FabricClientCommandSource> dispatcher, CommandRegistryAccess registryAccess) {
+ dispatcher.register(ClientCommandManager.literal("skyblocker")
+ .then(ClientCommandManager.literal("protectItem")
+ .executes(context -> protectMyItem(context.getSource()))));
+ }
+
+ private static int protectMyItem(FabricClientCommandSource source) {
+ ItemStack heldItem = source.getPlayer().getMainHandStack();
+ NbtCompound nbt = (heldItem != null) ? heldItem.getNbt() : null;
+
+ if (Utils.isOnSkyblock() && nbt != null && nbt.contains("ExtraAttributes")) {
+ NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
+ String itemUuid = extraAttributes.contains("uuid") ? extraAttributes.getString("uuid") : null;
+
+ if (itemUuid != null) {
+ ObjectOpenHashSet<String> protectedItems = SkyblockerConfigManager.get().general.protectedItems;
+
+ if (!protectedItems.contains(itemUuid)) {
+ protectedItems.add(itemUuid);
+ SkyblockerConfigManager.save();
+
+ source.sendFeedback(Text.translatable("skyblocker.itemProtection.added", heldItem.getName()));
+ } else {
+ protectedItems.remove(itemUuid);
+ SkyblockerConfigManager.save();
+
+ source.sendFeedback(Text.translatable("skyblocker.itemProtection.removed", heldItem.getName()));
+ }
+ } else {
+ source.sendFeedback(Text.translatable("skyblocker.itemProtection.noItemUuid"));
+ }
+ } else {
+ source.sendFeedback(Text.translatable("skyblocker.itemProtection.unableToProtect"));
+ }
+
+ return Command.SINGLE_SUCCESS;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRarityBackgrounds.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRarityBackgrounds.java
new file mode 100644
index 00000000..837c209a
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/ItemRarityBackgrounds.java
@@ -0,0 +1,109 @@
+package me.xmrvizzy.skyblocker.skyblock.item;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import com.google.common.collect.ImmutableMap;
+import com.mojang.blaze3d.systems.RenderSystem;
+
+import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap;
+import me.xmrvizzy.skyblocker.SkyblockerMod;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfigManager;
+import me.xmrvizzy.skyblocker.utils.Utils;
+import me.xmrvizzy.skyblocker.utils.scheduler.Scheduler;
+import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.gui.DrawContext;
+import net.minecraft.client.item.TooltipContext;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.client.texture.Sprite;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NbtCompound;
+import net.minecraft.text.Text;
+import net.minecraft.util.Identifier;
+
+public class ItemRarityBackgrounds {
+ private static final Identifier RARITY_BG_TEX = new Identifier(SkyblockerMod.NAMESPACE, "item_rarity_background");
+ private static final Supplier<Sprite> SPRITE = () -> MinecraftClient.getInstance().getGuiAtlasManager().getSprite(RARITY_BG_TEX);
+ private static final ImmutableMap<String, SkyblockItemRarity> LORE_RARITIES = ImmutableMap.ofEntries(
+ Map.entry("ADMIN", SkyblockItemRarity.ADMIN),
+ Map.entry("SPECIAL", SkyblockItemRarity.SPECIAL), //Very special is the same color so this will cover it
+ Map.entry("DIVINE", SkyblockItemRarity.DIVINE),
+ Map.entry("MYTHIC", SkyblockItemRarity.MYTHIC),
+ Map.entry("LEGENDARY", SkyblockItemRarity.LEGENDARY),
+ Map.entry("LEGENJERRY", SkyblockItemRarity.LEGENDARY),
+ Map.entry("EPIC", SkyblockItemRarity.EPIC),
+ Map.entry("RARE", SkyblockItemRarity.RARE),
+ Map.entry("UNCOMMON", SkyblockItemRarity.UNCOMMON),
+ Map.entry("COMMON", SkyblockItemRarity.COMMON)
+ );
+ private static final Int2ReferenceOpenHashMap<SkyblockItemRarity> CACHE = new Int2ReferenceOpenHashMap<>();
+
+ public static void init() {
+ //Clear the cache every 5 minutes, ints are very compact!
+ Scheduler.INSTANCE.scheduleCyclic(CACHE::clear, 4800);
+
+ //Clear cache after a screen where items can be upgraded in rarity closes
+ ScreenEvents.BEFORE_INIT.register((client, screen, scaledWidth, scaledHeight) -> {
+ String title = screen.getTitle().getString();
+
+ if (Utils.isOnSkyblock() && (title.equals("The Hex") || title.equals("Craft Item") || title.equals("Anvil") || title.equals("Reforge Anvil"))) {
+ ScreenEvents.remove(screen).register(screen1 -> CACHE.clear());
+ }
+ });
+ }
+
+ public static void tryDraw(ItemStack stack, DrawContext context, int x, int y) {
+ MinecraftClient client = MinecraftClient.getInstance();
+
+ if (client.player != null) {
+ SkyblockItemRarity itemRarity = getItemRarity(stack, client.player);
+
+ if (itemRarity != null) draw(context, x, y, itemRarity);
+ }
+ }
+
+ private static SkyblockItemRarity getItemRarity(ItemStack stack, ClientPlayerEntity player) {
+ if (stack == null || stack.isEmpty()) return null;
+
+ int hashCode = 0;
+ NbtCompound nbt = stack.getNbt();
+
+ if (nbt != null && nbt.contains("ExtraAttributes")) {
+ NbtCompound extraAttributes = nbt.getCompound("ExtraAttributes");
+ String itemUuid = extraAttributes.getString("uuid");
+
+ //If the item has an uuid, then use the hash code of the uuid otherwise use the identity hash code of the stack
+ hashCode = itemUuid.isEmpty() ? System.identityHashCode(stack) : itemUuid.hashCode();
+ }
+
+ if (CACHE.containsKey(hashCode)) return CACHE.get(hashCode);
+
+ List<Text> tooltip = stack.getTooltip(player, TooltipContext.BASIC);
+ String[] stringifiedTooltip = tooltip.stream().map(Text::getString).toArray(String[]::new);
+
+ for (String rarityString : LORE_RARITIES.keySet()) {
+ if (Arrays.stream(stringifiedTooltip).anyMatch(line -> line.contains(rarityString))) {
+ SkyblockItemRarity rarity = LORE_RARITIES.get(rarityString);
+
+ CACHE.put(hashCode, rarity);
+ return rarity;
+ }
+ }
+
+ CACHE.put(hashCode, null);
+ return null;
+ }
+
+ private static void draw(DrawContext context, int x, int y, SkyblockItemRarity rarity) {
+ //Enable blending to handle HUD translucency
+ RenderSystem.enableBlend();
+ RenderSystem.defaultBlendFunc();
+
+ context.drawSprite(x, y, 0, 16, 16, SPRITE.get(), rarity.r, rarity.g, rarity.b, SkyblockerConfigManager.get().general.itemInfoDisplay.itemRarityBackgroundsOpacity);
+
+ RenderSystem.disableBlend();
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/SkyblockItemRarity.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/SkyblockItemRarity.java
new file mode 100644
index 00000000..f7ff1fb9
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/item/SkyblockItemRarity.java
@@ -0,0 +1,29 @@
+package me.xmrvizzy.skyblocker.skyblock.item;
+
+import net.minecraft.util.Formatting;
+
+public enum SkyblockItemRarity {
+ ADMIN(Formatting.DARK_RED),
+ VERY_SPECIAL(Formatting.RED),
+ SPECIAL(Formatting.RED),
+ DIVINE(Formatting.AQUA),
+ MYTHIC(Formatting.LIGHT_PURPLE),
+ LEGENDARY(Formatting.GOLD),
+ EPIC(Formatting.DARK_PURPLE),
+ RARE(Formatting.BLUE),
+ UNCOMMON(Formatting.GREEN),
+ COMMON(Formatting.WHITE);
+
+ public final float r;
+ public final float g;
+ public final float b;
+
+ SkyblockItemRarity(Formatting formatting) {
+ @SuppressWarnings("DataFlowIssue")
+ int rgb = formatting.getColorValue();
+
+ this.r = ((rgb >> 16) & 0xFF) / 255f;
+ this.g = ((rgb >> 8) & 0xFF) / 255f;
+ this.b = (rgb & 0xFF) / 255f;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java
index 19f656e5..61a9aa20 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/itemlist/ResultButtonWidget.java
@@ -15,7 +15,7 @@ import net.minecraft.text.Text;
import net.minecraft.util.Identifier;
public class ResultButtonWidget extends ClickableWidget {
- private static final Identifier BACKGROUND_TEXTURE = new Identifier("textures/gui/recipe_book.png");
+ private static final Identifier BACKGROUND_TEXTURE = new Identifier("recipe_book/slot_craftable");
protected ItemStack itemStack = null;
@@ -38,7 +38,7 @@ public class ResultButtonWidget extends ClickableWidget {
public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) {
MinecraftClient client = MinecraftClient.getInstance();
// this.drawTexture(matrices, this.x, this.y, 29, 206, this.width, this.height);
- context.drawTexture(BACKGROUND_TEXTURE, this.getX(), this.getY(), 29, 206, this.getWidth(), this.getHeight());
+ context.drawGuiTexture(BACKGROUND_TEXTURE, this.getX(), this.getY(), this.getWidth(), this.getHeight());
// client.getItemRenderer().renderInGui(this.itemStack, this.x + 4, this.y + 4);
context.drawItem(this.itemStack, this.getX() + 4, this.getY() + 4);
// client.getItemRenderer().renderGuiItemOverlay(client.textRenderer, itemStack, this.x + 4, this.y + 4);
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index fff1bd3e..f889595e 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -42,7 +42,7 @@
"text.autoconfig.skyblocker.option.general.itemCooldown.enableItemCooldowns": "Enable Item Cooldown",
"text.autoconfig.skyblocker.option.general.shortcuts": "Shortcuts",
"text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts": "Enable Shortcuts",
- "text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts.@Tooltip": "Only works on Hypixel. Edit shortcuts with \"/skyblocker shortcuts\". At least one of the following options must be enabled for this to take effect.",
+ "text.autoconfig.skyblocker.option.general.shortcuts.enableShortcuts.@Tooltip": "Works anywhere, even in vanilla! Edit shortcuts with \"/skyblocker shortcuts\". At least one of the following options must be enabled for this to take effect.",
"text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts": "Enable Command Shortcuts",
"text.autoconfig.skyblocker.option.general.shortcuts.enableCommandShortcuts.@Tooltip": "Shortcuts for commands consisting of only one word. Edit shortcuts with \"/skyblocker shortcuts\". Shortcuts must be enabled for this to take effect.",
"text.autoconfig.skyblocker.option.general.shortcuts.enableCommandArgShortcuts": "Enable Command Argument Shortcuts",
@@ -78,6 +78,9 @@
"text.autoconfig.skyblocker.option.general.itemInfoDisplay": "Item Info Display",
"text.autoconfig.skyblocker.option.general.itemInfoDisplay.attributeShardInfo": "Attribute Shard Info",
"text.autoconfig.skyblocker.option.general.itemInfoDisplay.attributeShardInfo.@Tooltip": "Displays the attribute's level as the stack count and the initials of the attribute's name.",
+ "text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds": "Item Rarity Backgrounds",
+ "text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgrounds.@Tooltip": "Displays a colored background behind an item, the color represents the item's rarity.",
+ "text.autoconfig.skyblocker.option.general.itemInfoDisplay.itemRarityBackgroundsOpacity": "Item Rarity Backgrounds Opacity",
"text.autoconfig.skyblocker.option.general.specialEffects": "Special Effects",
"text.autoconfig.skyblocker.option.general.specialEffects.rareDungeonDropEffects": "Rare Dungeon Drop Effects",
"text.autoconfig.skyblocker.option.general.specialEffects.rareDungeonDropEffects.@Tooltip": "Adds a special visual effect triggered upon obtaining rare dungeon loot!",
@@ -389,6 +392,11 @@
"skyblocker.quiverWarning.50Left": "You only have 50 Arrows left in your Quiver!",
"skyblocker.quiverWarning.10Left": "You only have 10 Arrows left in your Quiver!",
"skyblocker.quiverWarning.empty": "You don't have any more Arrows left in your Quiver!",
+
+ "skyblocker.itemProtection.added": "§b[§6Skyblocker§b] §fYour %s will now be protected! §o*your item now feels a little safer :')*",
+ "skyblocker.itemProtection.removed": "§b[§6Skyblocker§b] §fYour %s will §nno longer be protected§f :( - §lBeware of the dangers in doing this!",
+ "skyblocker.itemProtection.noItemUuid": "§b[§6Skyblocker§b] §cYou must be holding an item that has a uuid in order to protect it!",
+ "skyblocker.itemProtection.unableToProtect": "§b[§6Skyblocker§b] §cUnable to protect this item :( (Are you in skyblock?, are you holding an item?)",
"emi.category.skyblocker.skyblock": "Skyblock"
}
diff --git a/src/main/resources/assets/skyblocker/textures/gui/sprites/item_rarity_background.png b/src/main/resources/assets/skyblocker/textures/gui/sprites/item_rarity_background.png
new file mode 100644
index 00000000..fd8e8604
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/textures/gui/sprites/item_rarity_background.png
Binary files differ
diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json
index 0920d7d7..e9dc5e58 100644
--- a/src/main/resources/fabric.mod.json
+++ b/src/main/resources/fabric.mod.json
@@ -11,7 +11,7 @@
"sources": "https://github.com/SkyblockerMod/Skyblocker",
"issues": "https://github.com/SkyblockerMod/Skyblocker/issues"
},
- "license": "GNU LGPLv3",
+ "license": "LGPL-3.0-or-later",
"icon": "assets/skyblocker/icon.png",
"environment": "client",
"entrypoints": {
diff --git a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java
index 7a130b5a..9ff1e154 100644
--- a/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java
+++ b/src/test/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfitTest.java
@@ -8,15 +8,15 @@ public class DungeonChestProfitTest {
@Test
void testProfitText() {
SkyblockerConfig.DungeonChestProfit config = new SkyblockerConfig.DungeonChestProfit();
- Assertions.assertEquals("literal{ 0}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(0, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ 0}[style={color=blue}]", DungeonChestProfit.getProfitText(0, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ +10}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(10, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ +10}[style={color=blue}]", DungeonChestProfit.getProfitText(10, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ -10}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(-10, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ -10}[style={color=blue}]", DungeonChestProfit.getProfitText(-10, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ +10,000}[style={color=dark_green}]", DungeonChestProfit.getProfitText(10000, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ +10,000}[style={color=blue}]", DungeonChestProfit.getProfitText(10000, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ -10,000}[style={color=red}]", DungeonChestProfit.getProfitText(-10000, false, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
- Assertions.assertEquals("literal{ -10,000}[style={color=blue}]", DungeonChestProfit.getProfitText(-10000, true, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting).toString());
+ Assertions.assertEquals("literal{ 0}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(0, false, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ 0}[style={color=blue}]", DungeonChestProfit.getProfitText(0, true, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ +10}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(10, false, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ +10}[style={color=blue}]", DungeonChestProfit.getProfitText(10, true, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ -10}[style={color=dark_gray}]", DungeonChestProfit.getProfitText(-10, false, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ -10}[style={color=blue}]", DungeonChestProfit.getProfitText(-10, true, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ +10,000}[style={color=dark_green}]", DungeonChestProfit.getProfitText(10000, false, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ +10,000}[style={color=blue}]", DungeonChestProfit.getProfitText(10000, true, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ -10,000}[style={color=red}]", DungeonChestProfit.getProfitText(-10000, false, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
+ Assertions.assertEquals("literal{ -10,000}[style={color=blue}]", DungeonChestProfit.getProfitText(-10000, true, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor).toString());
}
}