diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/CodeCurrency.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/CodeCurrency.java index a36a5beec..d65aa91d2 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/CodeCurrency.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/CodeCurrency.java @@ -25,7 +25,7 @@ public static class Weights { public static int RARE = 250; public static int UBER = 50; public static int MEGA_UBER = 10; - + public static int MIRROR = 1; } diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/GearCurrency.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/GearCurrency.java index 96d655e8e..97f33b75a 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/GearCurrency.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/base/GearCurrency.java @@ -73,6 +73,10 @@ public ExplainedResult canItemBeModified(LocReqContext context) { return ExplainedResult.failure(Chats.CORRUPT_CANT_BE_MODIFIED.locName()); } + if (ex.isMirrored() && this.spendsGearPotential()) { + return ExplainedResult.failure(Chats.MIRRORED_CANT_BE_MODIFIED.locName()); + } + if (!ex.get(StackKeys.POTENTIAL).has() || ex.get(StackKeys.POTENTIAL).get().potential < 1) { if (this.spendsGearPotential()) { return ExplainedResult.failure(Chats.GEAR_NO_POTENTIAL.locName()); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java index 1cc5eac3b..02c575027 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/ExileCurrencies.java @@ -68,6 +68,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { return ExileCurrency.Builder.of(id, info.tier.word + " Sharpening Stone", ItemReqs.INSTANCE.IS_GEAR) .rarity(info.tier.rar) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addAlwaysUseModification(ItemMods.INSTANCE.SHARPEN_STONE_QUALITY.get(info)) .edit(MaxUsesKey.ofUses(ItemReqs.Datas.MAX_SHARPENING_STONE_USES.toKey())) .potentialCost(0) @@ -78,6 +79,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey CORRUPT_GEAR = ExileCurrency.Builder.of("chaos_orb", "Orb of Chaos", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.UNIQUE_ID) .addModification(ItemMods.INSTANCE.CORRUPT_GEAR, 75) .addModification(Modifications.INSTANCE.DESTROY_ITEM, 25) @@ -85,8 +87,17 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { .weight(1000) .build(this); + public ExileKey MIRROR = ExileCurrency.Builder.of("mirror", "Orb of Reflection", ItemReqs.INSTANCE.IS_GEAR, ItemReqs.INSTANCE.IS_JEWEL) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) + .rarity(IRarity.MYTHIC_ID) + .addAlwaysUseModification(ItemMods.INSTANCE.MIRROR) + .potentialCost(0) + .weight(CodeCurrency.Weights.MIRROR) + .build(this); + public ExileKey LEVEL_GEAR = ExileCurrency.Builder.of("level_up_orb", "Orb of Infinity", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.UNCOMMON) .addRequirement(ItemReqs.INSTANCE.LEVEL_NOT_MAX) .addModification(ItemMods.INSTANCE.ADD_GEAR_LEVEL, 1) @@ -97,6 +108,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey ADD_SOCKET = ExileCurrency.Builder.of("socket_adder", "Orb of Digging", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.CAN_ADD_SOCKETS) .rarity(IRarity.RARE_ID) .addModification(ItemMods.INSTANCE.ADD_SOCKET, 50) @@ -107,6 +119,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey UNIQUE_STAT_REROLL = ExileCurrency.Builder.of("unique_reroll", "Orb of Imperfection", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.RARE_ID) .addRequirement(ItemReqs.INSTANCE.IS_RARITY.map.get(new RarityKeyInfo(IRarity.UNIQUE_ID))) .addModification(ItemMods.INSTANCE.ADD_5_PERCENT_UNIQUE_STATS, 60) @@ -117,6 +130,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_RANDOM_AFFIX = ExileCurrency.Builder.of("affix_common_reroll", "Orb of New Beginnings", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.RARE_ID) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_RANDOM_AFFIX) @@ -127,6 +141,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_RANDOM_AFFIX_TO_MYTHIC = ExileCurrency.Builder.of("affix_random_mythic_reroll", "Orb of Divine Benevolence", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.MYTHIC_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) .addRequirement(ItemReqs.INSTANCE.NOT_CRAFTED) .addRequirement(ItemReqs.INSTANCE.IS_RARITY.get(new RarityKeyInfo(IRarity.MYTHIC_ID))) @@ -138,6 +153,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey UPGRADE_OR_DOWNGRADE_RANDOM_AFFIX = ExileCurrency.Builder.of("affix_tier_up_down", "Orb of Imbalance", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.RARE_ID) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) .addModification(ItemMods.INSTANCE.UPGRADE_RANDOM_AFFIX, 60) @@ -148,6 +164,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey UPGRADE_QUALITY = ExileCurrency.Builder.of("orb_of_quality", "Orb of Quality", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.UNDER_20_QUALITY) .rarity(IRarity.UNCOMMON) .addAlwaysUseModification(ItemMods.INSTANCE.ADD_GEAR_QUALITY) @@ -157,6 +174,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_INFUSION = ExileCurrency.Builder.of("enchant_reroll", "Orb of Second Guessing", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_INFUSION) .rarity(IRarity.UNCOMMON) .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_INFUSION) @@ -167,6 +185,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { /* public ExileKey MAP_RARITY_UPGRADE = ExileCurrency.Builder.of("map_rarity_upgrade", "Map Rarity Upgrade Orb", WorksOnBlock.ItemType.MAP) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.MAP_HAS_HIGHER_RARITY) .rarity(IRarity.EPIC_ID) .addAlwaysUseModification(ItemMods.INSTANCE.UPGRADE_MAP_RARITY) @@ -180,6 +199,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey UPGRADE_COMMON_AFFIX = ExileCurrency.Builder.of("upgrade_common_affix", "Orb of Fledgling's Reprieve", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.RARE_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIX_OF_RARITY.get(new RarityKeyInfo(IRarity.COMMON_ID))) .addAlwaysUseModification(ItemMods.INSTANCE.UPGRADE_SPECIFIC_AFFIX_RARITY.get(new RarityKeyInfo(IRarity.COMMON_ID))) .potentialCost(3) @@ -189,6 +209,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_AFFIX_NUMBERS = ExileCurrency.Builder.of("affix_number_reroll", "Orb of Ciphers", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.RARE_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_AFFIX_NUMBERS) .potentialCost(5) @@ -198,6 +219,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_IMPLICIT_NUMBERS = ExileCurrency.Builder.of("implicit_number_reroll", "Orb of Genesis", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.LEGENDARY_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_IMPLICIT) .addAlwaysUseModification(ItemMods.INSTANCE.REROLL_IMPLICIT_NUMBERS) .potentialCost(10) @@ -207,6 +229,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey UPGRADE_CORRUPTION_AFFIX = ExileCurrency.Builder.of("up_corrupt_affix", "Orb of Foolish Risk", ItemReqs.INSTANCE.IS_GEAR, ItemReqs.INSTANCE.IS_JEWEL) .rarity(IRarity.EPIC_ID) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_CORRUPTION_AFFIXES) .addModification(ItemMods.INSTANCE.UPGRADE_CORRUPTION_AFFIX_RARITY, 90) .addModification(Modifications.INSTANCE.DESTROY_ITEM, 10) @@ -235,6 +258,7 @@ public ExileCurrencies(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey EASY_ONE_TIME_UPGRADE = ExileCurrency.Builder.of("orb_of_relief", "Orb of Relief", ItemReqs.INSTANCE.IS_GEAR) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.EPIC_ID) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIX_OF_RARITY_OR_LOWER.get(new RarityKeyInfo(IRarity.EPIC_ID))) diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/HarvestCurrencies.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/HarvestCurrencies.java index 6a8eef4d0..f6209f58b 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/HarvestCurrencies.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/HarvestCurrencies.java @@ -51,6 +51,7 @@ public static void harvestOnlyDrop(String id) { return ExileCurrency.Builder.of(id, "Harvested " + info.tier.word + " Essence", ItemReqs.INSTANCE.IS_GEAR) .rarity(info.tier.rar) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.NOT_CRAFTED) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIX_OF_RARITY.get(new RarityKeyInfo(info.tier.rar))) .addModification(Modifications.INSTANCE.DESTROY_ITEM, 15) @@ -63,6 +64,7 @@ public static void harvestOnlyDrop(String id) { public ExileKey HARVEST_AFFIX_UPGRADE = ExileCurrency.Builder.of("entangled_affix_upgrade", "Entangled Orb of Upgrade", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.LEGENDARY_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.HAS_AFFIXES) .addModification(ItemMods.INSTANCE.UPGRADE_LOWEST_AFFIX, 50) .addModification(ItemMods.INSTANCE.CORRUPT_GEAR_NO_AFFIXES, 50) @@ -74,6 +76,7 @@ public static void harvestOnlyDrop(String id) { public ExileKey HARVEST_POTENTIAL_UPGRADE = ExileCurrency.Builder.of("entangled_potential", "Entangled Orb of Potential", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.LEGENDARY_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addModification(ItemMods.INSTANCE.ADD_25_POTENTIAL, 75) .addModification(ItemMods.INSTANCE.CORRUPT_GEAR_NO_AFFIXES, 25) .potentialCost(0) @@ -84,6 +87,7 @@ public static void harvestOnlyDrop(String id) { public ExileKey HARVEST_QUALITY = ExileCurrency.Builder.of("entangled_quality", "Entangled Orb of Quality", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.LEGENDARY_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.UNDER_21_QUALITY) .addModification(ItemMods.INSTANCE.ADD_UP_TO_5_GEAR_QUALITY, 75) .addModification(ItemMods.INSTANCE.CORRUPT_GEAR_NO_AFFIXES, 25) @@ -94,6 +98,7 @@ public static void harvestOnlyDrop(String id) { public ExileKey HARVEST_UNIQUE_STATS = ExileCurrency.Builder.of("entangled_unique_reroll", "Entangled Orb of Imperfection", ItemReqs.INSTANCE.IS_GEAR) .rarity(IRarity.LEGENDARY_ID) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .addRequirement(ItemReqs.INSTANCE.IS_RARITY.get(new RarityKeyInfo(IRarity.UNIQUE_ID))) .addModification(ItemMods.INSTANCE.ADD_10_PERCENT_UNIQUE_STATS, 30) .addModification(ItemMods.INSTANCE.CORRUPT_GEAR_NO_AFFIXES, 70) diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/JewelCurrencies.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/JewelCurrencies.java index ba5f72fdf..96c5fb26d 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/JewelCurrencies.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/JewelCurrencies.java @@ -18,6 +18,7 @@ public JewelCurrencies(ExileCurrencies holder) { public ExileKey JEWEL_CORRUPT = ExileCurrency.Builder.of("jewel_corrupt", "Orb of Mesmerizing Chaos", ItemReqs.INSTANCE.IS_JEWEL) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.UNIQUE_ID) .addModification(ItemMods.INSTANCE.JEWEL_CORRUPTION, 50) .addModification(Modifications.INSTANCE.DESTROY_ITEM, 50) @@ -27,6 +28,7 @@ public JewelCurrencies(ExileCurrencies holder) { public ExileKey JEWEL_UPGRADE_AFFIX = ExileCurrency.Builder.of("jewel_upgrade_affix", "Orb of Glimmering Light", ItemReqs.INSTANCE.IS_JEWEL) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.EPIC_ID) .addModification(ItemMods.INSTANCE.UPGRADE_JEWEL_AFFIX_RARITY, 85) .addModification(Modifications.INSTANCE.DESTROY_ITEM, 15) @@ -36,6 +38,7 @@ public JewelCurrencies(ExileCurrencies holder) { public ExileKey JEWEL_UPGRADE_AFFIX_SURE = ExileCurrency.Builder.of("jewel_sure_upgrade", "Orb of Mystery", ItemReqs.INSTANCE.IS_JEWEL) .addRequirement(ItemReqs.INSTANCE.IS_NOT_CORRUPTED) + .addRequirement(ItemReqs.INSTANCE.IS_NOT_MIRRORED) .rarity(IRarity.MYTHIC_ID) .addModification(ItemMods.INSTANCE.UPGRADE_JEWEL_AFFIX_RARITY, 90) .addModification(Modifications.INSTANCE.DO_NOTHING, 10) diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java index c9a228b95..a29a4ecc5 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemModificationSers.java @@ -13,6 +13,7 @@ public class ItemModificationSers { public static String SET_AFFIX_RARITY = "set_affix_rarity"; public static String DOWNGRADE_AFFIX_RARITY = "downgrade_affix_rarity"; public static String CORRUPT_GEAR = "corrupt_gear"; + public static String MIRROR = "mirror"; public static String MODIFY_UNIQUE_STATS = "modify_unique_stats"; public static String REROLL_AFFIX = "reroll_affix"; diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java index c0da4d2ac..48ea8cfe2 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/ItemMods.java @@ -80,6 +80,7 @@ public ItemMods(ModRequiredRegisterInfo modRegisterInfo) { public ExileKey REROLL_IMPLICIT_NUMBERS = ExileKey.ofId(this, "implicit_number_reroll", x -> new RerollImplicitNumbersItemMod(x.GUID())); public ExileKey EXTRACT_GEM = ExileKey.ofId(this, "extract_gem", x -> new ExtractSocketItemMod(x.GUID(), ExtractSocketItemMod.SocketedType.GEM)); public ExileKey EXTRACT_RUNE = ExileKey.ofId(this, "extract_rune", x -> new ExtractSocketItemMod(x.GUID(), ExtractSocketItemMod.SocketedType.RUNE)); + public ExileKey MIRROR = ExileKey.ofId(this, "mirror", x -> new MirrorItemMod(x.GUID())); // jewels public ExileKey UPGRADE_JEWEL_AFFIX_RARITY = ExileKey.ofId(this, "upgrade_jewel_affix_rarity", x -> new UpgradeJewelAffixRarityMod(x.GUID(), UpgradeAffixItemMod.AffixFinder.RANDOM_AFFIX.get())); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/MirrorItemMod.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/MirrorItemMod.java new file mode 100644 index 000000000..260027a44 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_mod/gear/MirrorItemMod.java @@ -0,0 +1,51 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.ItemModificationSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.itemstack.CustomItemData; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.itemstack.StackKeys; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.orbs_of_crafting.misc.StackHolder; +import com.robertx22.orbs_of_crafting.register.mods.base.ItemModification; +import com.robertx22.orbs_of_crafting.register.mods.base.ItemModificationResult; +import net.minecraft.network.chat.MutableComponent; + +public class MirrorItemMod extends ItemModification { + public MirrorItemMod(String id) { + super(ItemModificationSers.MIRROR, id); + } + + @Override + public void applyINTERNAL(StackHolder stack, ItemModificationResult r) { + ExileStack mirroredStack = ExileStack.of(stack.stack); + mirroredStack.get(StackKeys.CUSTOM).edit(x -> x.data.set(CustomItemData.KEYS.MIRRORED, true)); + mirroredStack.get(StackKeys.POTENTIAL).edit(e -> e.potential = 0); + r.extraItemsCreated.add(mirroredStack.getStack()); + } + + @Override + public OutcomeType getOutcomeType() { + return OutcomeType.GOOD; + } + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Creates an unmodifiable Mirrored copy of the Item")); + } + + @Override + public Class getClassForSerialization() { + return MirrorItemMod.class; + } + + +} diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java index 6e06c5d35..79a23832d 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqSers.java @@ -9,6 +9,7 @@ public class ItemReqSers { public static String HAS_IMPLICIT = "has_implicit"; public static String HAS_CORRUPTION_AFFIXES = "has_corrupt_affixes"; public static String IS_NOT_CORRUPTED = "is_not_corrupted"; + public static String IS_NOT_MIRRORED = "is_not_mirrored"; public static String HAS_INFUSION = "has_infusion"; public static String CAN_ADD_SOCKETS = "can_add_sockets"; public static String IS_UNDER_QUALITY = "is_under_quality"; diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java index d41dbfb56..b805a0564 100644 --- a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/ItemReqs.java @@ -4,6 +4,7 @@ import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_mod.gear.ExtractSocketItemMod; import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.custom.HasCorruptAffixes; import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.custom.IsNotCorruptedReq; +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.custom.IsNotMirroredReq; import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.custom.MaximumUsesReq; import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.gear.*; import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.item_types.BeDungeonMapReq; @@ -73,6 +74,7 @@ public static List allMaxUses() { public ExileKey HAS_IMPLICIT = ExileKey.ofId(this, "has_implicit", x -> new MustHaveImplicitReq(x.GUID())); public ExileKey HAS_CORRUPTION_AFFIXES = ExileKey.ofId(this, "has_corrupt_affixes", x -> new HasCorruptAffixes(x.GUID())); public ExileKey IS_NOT_CORRUPTED = ExileKey.ofId(this, "is_not_corrupted", x -> new IsNotCorruptedReq(x.GUID())); + public ExileKey IS_NOT_MIRRORED = ExileKey.ofId(this, "is_not_mirrored", x -> new IsNotMirroredReq(x.GUID())); public ExileKey HAS_INFUSION = ExileKey.ofId(this, "has_infusion", x -> new HasInfusionReq(x.GUID())); public ExileKey CAN_ADD_SOCKETS = ExileKey.ofId(this, "can_add_sockets", x -> new CanAddSocketsReq(x.GUID())); public ExileKey UNDER_20_QUALITY = ExileKey.ofId(this, "is_under_20_quality", x -> new IsUnderQualityReq(x.GUID(), IsUnderQualityReq.UNDER_20)); diff --git a/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/custom/IsNotMirroredReq.java b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/custom/IsNotMirroredReq.java new file mode 100644 index 000000000..c190472e5 --- /dev/null +++ b/src/main/java/com/robertx22/addons/orbs_of_crafting/currency/reworked/item_req/custom/IsNotMirroredReq.java @@ -0,0 +1,44 @@ +package com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.custom; + +import com.robertx22.addons.orbs_of_crafting.currency.reworked.item_req.ItemReqSers; +import com.robertx22.library_of_exile.localization.ExileTranslation; +import com.robertx22.library_of_exile.localization.TranslationBuilder; +import com.robertx22.library_of_exile.localization.TranslationType; +import com.robertx22.mine_and_slash.itemstack.ExileStack; +import com.robertx22.mine_and_slash.mmorpg.SlashRef; +import com.robertx22.orbs_of_crafting.misc.StackHolder; +import com.robertx22.orbs_of_crafting.register.reqs.base.ItemRequirement; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.entity.player.Player; + +public class IsNotMirroredReq extends ItemRequirement { + + public IsNotMirroredReq(String id) { + super(ItemReqSers.IS_NOT_MIRRORED, id); + } + + @Override + public Class getClassForSerialization() { + return IsNotMirroredReq.class; + } + + @Override + public MutableComponent getDescWithParams() { + return this.getTranslation(TranslationType.DESCRIPTION).getTranslatedName(); + } + + @Override + public TranslationBuilder createTranslationBuilder() { + return TranslationBuilder.of(SlashRef.MODID) + .desc(ExileTranslation.registry(this, "Must not be mirrored") + ); + } + + + @Override + public boolean isValid(Player p, StackHolder stack) { + return !ExileStack.of(stack.stack).isMirrored(); + } + + +} diff --git a/src/main/java/com/robertx22/mine_and_slash/itemstack/CommonTooltips.java b/src/main/java/com/robertx22/mine_and_slash/itemstack/CommonTooltips.java index f873826a7..518d5a790 100644 --- a/src/main/java/com/robertx22/mine_and_slash/itemstack/CommonTooltips.java +++ b/src/main/java/com/robertx22/mine_and_slash/itemstack/CommonTooltips.java @@ -16,7 +16,23 @@ public class CommonTooltips { public static AdditionalBlock potentialCorruptionAndQuality(ExileStack exStack, boolean doQuality) { List list = new ArrayList<>(); - list.add(exStack.isCorrupted() ? Component.literal("").append(Itemtips.POTENTIAL.locName(exStack.get(StackKeys.POTENTIAL).getOrCreate().potential).withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.STRIKETHROUGH)).append(Component.literal(" ")).append(Words.Corrupted.locName().withStyle(ChatFormatting.RED)) : Itemtips.POTENTIAL.locName(exStack.get(StackKeys.POTENTIAL).getOrCreate().potential).withStyle(ChatFormatting.GOLD)); + + MutableComponent potential = Itemtips.POTENTIAL.locName(exStack.get(StackKeys.POTENTIAL).getOrCreate().potential); + + if (exStack.isCorrupted() || exStack.isMirrored()) { + potential = Component.literal("").append(potential.withStyle(ChatFormatting.DARK_GRAY, ChatFormatting.STRIKETHROUGH)); + + if (exStack.isCorrupted()) { + potential.append(Component.literal(" ")).append(Words.Corrupted.locName().withStyle(ChatFormatting.RED)); + } + if (exStack.isMirrored()) { + potential.append(Component.literal(" ")).append(Words.Mirrored.locName().withStyle(ChatFormatting.WHITE)); + } + } else { + potential.withStyle(ChatFormatting.GOLD); + } + + list.add(potential); if (doQuality) { list.add(Itemtips.QUALITY.locName(exStack.get(StackKeys.CUSTOM).getOrCreate().data.get(CustomItemData.KEYS.QUALITY)).withStyle(ChatFormatting.GOLD)); diff --git a/src/main/java/com/robertx22/mine_and_slash/itemstack/CustomItemData.java b/src/main/java/com/robertx22/mine_and_slash/itemstack/CustomItemData.java index 3599a0627..68fd0c6df 100644 --- a/src/main/java/com/robertx22/mine_and_slash/itemstack/CustomItemData.java +++ b/src/main/java/com/robertx22/mine_and_slash/itemstack/CustomItemData.java @@ -14,6 +14,7 @@ public static class KeyHolderClass extends DataKeyHolder { public DataKey.BooleanKey CORRUPT = of(new DataKey.BooleanKey("cr")); public DataKey.BooleanKey CRAFTED = of(new DataKey.BooleanKey("crafted")); + public DataKey.BooleanKey MIRRORED = of(new DataKey.BooleanKey("mr")); public DataKey.BooleanKey SALVAGING_DISABLED = of(new DataKey.BooleanKey("sl")); // public DataKey.BooleanKey USED_SHARPENING_STONE = of(new DataKey.BooleanKey("us")); @@ -27,8 +28,11 @@ public static class KeyHolderClass extends DataKeyHolder { public GenericDataHolder data = new GenericDataHolder(); - public boolean isCorrupted() { return data.get(KEYS.CORRUPT); } + + public boolean isMirrored() { + return data.get(KEYS.MIRRORED); + } } diff --git a/src/main/java/com/robertx22/mine_and_slash/itemstack/ExileStack.java b/src/main/java/com/robertx22/mine_and_slash/itemstack/ExileStack.java index 02e1fdedf..875adde14 100644 --- a/src/main/java/com/robertx22/mine_and_slash/itemstack/ExileStack.java +++ b/src/main/java/com/robertx22/mine_and_slash/itemstack/ExileStack.java @@ -45,6 +45,10 @@ public boolean isCorrupted() { return get(StackKeys.CUSTOM).has() && get(StackKeys.CUSTOM).getOrCreate().isCorrupted(); } + public boolean isMirrored() { + return get(StackKeys.CUSTOM).has() && get(StackKeys.CUSTOM).getOrCreate().isMirrored(); + } + public void setStack(ItemStack stack) { this.stack = stack; stackWasChanged = true; diff --git a/src/main/java/com/robertx22/mine_and_slash/mixins/ItemMirrorMixin.java b/src/main/java/com/robertx22/mine_and_slash/mixins/ItemMirrorMixin.java new file mode 100644 index 000000000..28fc66741 --- /dev/null +++ b/src/main/java/com/robertx22/mine_and_slash/mixins/ItemMirrorMixin.java @@ -0,0 +1,35 @@ +package com.robertx22.mine_and_slash.mixins; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import org.lwjgl.opengl.GL11; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.robertx22.mine_and_slash.itemstack.ExileStack; + +@Mixin(GuiGraphics.class) +public class ItemMirrorMixin { + @Inject( + method = "renderItem(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;IIII)V", + at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/vertex/PoseStack;scale(FFF)V")) + private void adjustScale(LivingEntity entity, Level level, ItemStack stack, int x, int y, int seed, int guiOffset, CallbackInfo ci) { + if (ExileStack.of(stack).isMirrored()) { + ((GuiGraphics) (Object) this).pose().scale(-1F, 1F, 1F); + // we reverse the winding order by mirroring the model + GL11.glFrontFace(GL11.GL_CW); + } + } + + @Inject( + method = "renderItem(Lnet/minecraft/world/entity/LivingEntity;Lnet/minecraft/world/level/Level;Lnet/minecraft/world/item/ItemStack;IIII)V", + at = @At(value = "RETURN")) + private void restoreFrontFace(LivingEntity entity, Level level, ItemStack stack, int x, int y, int seed, int guiOffset, CallbackInfo ci) { + GL11.glFrontFace(GL11.GL_CCW); + } +} \ No newline at end of file diff --git a/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Chats.java b/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Chats.java index f8e3ccaa4..fc48af795 100644 --- a/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Chats.java +++ b/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Chats.java @@ -56,7 +56,8 @@ public enum Chats implements IAutoLocName { EMPTY_MAP_FORCED_TP("The Map you're currently inside was deleted. This can happen if you entered another player's map and they started a new one."), TP_TO_DUNGEON_MAPNAME("Teleported to the [%1$s] Dungeon"), ITEM_CANT_CORRUPT_TWICE("This item is already corrupted."), - CORRUPT_CANT_BE_MODIFIED("Corrupted Items can't be modified. They can only be sockeded with Gems etc."), + CORRUPT_CANT_BE_MODIFIED("Corrupted Items can't be modified. They can only be socketed with Gems etc."), + MIRRORED_CANT_BE_MODIFIED("Mirrored Items can't be modified. They can only be socketed with Gems etc."), ALT_TO_SHOW_OTHER_SPELL("Press [Alt] to show the other Spell"), MUST_BE_IN_MAP_TO_ACCEPT_PROPHECY("You must be inside the same Map Dungeon to accept Prophecy Rewards"), NOT_ENOUGH_FAVOR_TO_BUY_PROPHECY("Not enough Prophecy Coins to claim the Prophecy. You can gain more Coins by killing map mobs while under Prophecy Curses."), diff --git a/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java b/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java index 70577664a..9195a985e 100644 --- a/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java +++ b/src/main/java/com/robertx22/mine_and_slash/uncommon/localization/Words.java @@ -233,6 +233,7 @@ public enum Words implements IAutoLocName { GEAR_SOUL_DESC("Souls are one way of adding Mine and Slash stats to Gear."), DungeonKey("Dungeon Key"), Corrupted("Corrupted"), + Mirrored("Mirrored"), CorruptsItemHarvest("Turns the Item Corrupted (no benefits)"), Classes("Classes"), AscClasses("Ascendancy"), diff --git a/src/main/resources/assets/mmorpg/lang/en_us.json b/src/main/resources/assets/mmorpg/lang/en_us.json index e44359fae..0eee99808 100644 --- a/src/main/resources/assets/mmorpg/lang/en_us.json +++ b/src/main/resources/assets/mmorpg/lang/en_us.json @@ -552,6 +552,7 @@ "item.mmorpg.currency.affix_random_mythic_reroll": "Orb of Divine Benevolence", "item.mmorpg.currency.affix_tier_up_down": "Orb of Imbalance", "item.mmorpg.currency.chaos_orb": "Orb of Chaos", + "item.mmorpg.currency.mirror": "Orb of Reflection", "item.mmorpg.currency.enchant_reroll": "Orb of Second Guessing", "item.mmorpg.currency.entangled_affix_upgrade": "Entangled Orb of Upgrade", "item.mmorpg.currency.entangled_potential": "Entangled Orb of Potential", @@ -1916,7 +1917,8 @@ "mmorpg.chat.caught_something": "You caught something!", "mmorpg.chat.character_load_info": "Character Feature saves:\n- Your level and exp\n- Your spells, stats, talents, hotbar setup\n\nIt does not save your gear, gems jewels etc.\n\nEach Character starts from Level 1", "mmorpg.chat.command_block_unavaliable": "Command blocks are disabled, this will stop you from playing Mine and slash Dungeons!", - "mmorpg.chat.corrupt_cant_be_modified": "Corrupted Items can't be modified. They can only be sockeded with Gems etc.", + "mmorpg.chat.corrupt_cant_be_modified": "Corrupted Items can't be modified. They can only be socketed with Gems etc.", + "mmorpg.chat.mirrored_cant_be_modified": "Mirrored Items can't be modified. They can only be socketed with Gems etc.", "mmorpg.chat.craft_prof_mat_source": "Crafted through the %1$s Profession's Station", "mmorpg.chat.create_error_char_limit": "You already have a Maximum amount of Characters allowed.", "mmorpg.chat.create_error_name": "Not a valid character name", @@ -2605,6 +2607,7 @@ "mmorpg.word.configs": "Features", "mmorpg.word.cooldown": "Cooldown: %1$ss", "mmorpg.word.corrupted": "Corrupted", + "mmorpg.word.mirrored": "Mirrored", "mmorpg.word.corruptsitemharvest": "Turns the Item Corrupted (no benefits)", "mmorpg.word.costs_favor": "Costs %1$s Prophecy Coins", "mmorpg.word.craft_failed": "Craft Failed due to incorrect materials", @@ -3500,6 +3503,7 @@ "library_of_exile.item_modification.affix_number_reroll": "Re-rolls Affix Numbers", "library_of_exile.item_modification.corrupt_gear": "Corrupts the Item, making it unmodifiable and adds a Random amount of Corruption Affixes", "library_of_exile.item_modification.corrupt_gear_no_affix": "Corrupts the Item, making it unmodifiable", + "library_of_exile.item_modification.mirror": "Creates an unmodifiable Mirrored copy of the Item", "library_of_exile.item_modification.downgrade_random_affix": "Downgrades Rarity and re-rolls Numbers of %1$s", "library_of_exile.item_modification.extract_gem": "Extracts %1$s from a Socket", "library_of_exile.item_modification.extract_rune": "Extracts %1$s from a Socket", @@ -3575,6 +3579,7 @@ "library_of_exile.item_requirement.is_legendary": "Must be %1$s Rarity", "library_of_exile.item_requirement.is_mythic": "Must be %1$s Rarity", "library_of_exile.item_requirement.is_not_corrupted": "Must not be corrupted", + "library_of_exile.item_requirement.is_not_mirrored": "Must not be mirrored", "library_of_exile.item_requirement.is_rare": "Must be %1$s Rarity", "library_of_exile.item_requirement.is_runeword": "Must be %1$s Rarity", "library_of_exile.item_requirement.is_soul": "Must be a Soul Item", diff --git a/src/main/resources/assets/mmorpg/textures/item/currency/mirror.png b/src/main/resources/assets/mmorpg/textures/item/currency/mirror.png new file mode 100644 index 000000000..90c55d4db Binary files /dev/null and b/src/main/resources/assets/mmorpg/textures/item/currency/mirror.png differ diff --git a/src/main/resources/mmorpg.mixins.json b/src/main/resources/mmorpg.mixins.json index 1bdc58b8e..9824c11dc 100644 --- a/src/main/resources/mmorpg.mixins.json +++ b/src/main/resources/mmorpg.mixins.json @@ -22,6 +22,7 @@ "client": [ "AccessorRenderType", "ItemGlintMixin", + "ItemMirrorMixin", "ItemStackMixin", "MixinServerWorldInfo", "MouseHandlerMixin",