unique support 90% done
This commit is contained in:
parent
3325839d7d
commit
6b50b6cb3b
6 changed files with 277 additions and 164 deletions
|
|
@ -16,6 +16,7 @@ public class Config {
|
||||||
public static final ForgeConfigSpec.BooleanValue SHOW_CHANCE;
|
public static final ForgeConfigSpec.BooleanValue SHOW_CHANCE;
|
||||||
public static final ForgeConfigSpec.BooleanValue QOL_HUNTERS_CONFLICT_RESOLUTION;
|
public static final ForgeConfigSpec.BooleanValue QOL_HUNTERS_CONFLICT_RESOLUTION;
|
||||||
public static final ForgeConfigSpec.BooleanValue SHOW_UNOBTAINABLE_CRAFTED;
|
public static final ForgeConfigSpec.BooleanValue SHOW_UNOBTAINABLE_CRAFTED;
|
||||||
|
public static final ForgeConfigSpec.BooleanValue DEBUG_UNIQUE_GEAR;
|
||||||
// string instead of enum, because forge would remove enum values that are not present in the enum
|
// string instead of enum, because forge would remove enum values that are not present in the enum
|
||||||
// (this could cause problems if mods are extending the enum - like wold's)
|
// (this could cause problems if mods are extending the enum - like wold's)
|
||||||
public static final ForgeConfigSpec.ConfigValue<List<String>> AFFIX_TAG_GROUP_CHANCE_BLACKLIST;
|
public static final ForgeConfigSpec.ConfigValue<List<String>> AFFIX_TAG_GROUP_CHANCE_BLACKLIST;
|
||||||
|
|
@ -41,11 +42,16 @@ public class Config {
|
||||||
QOL_HUNTERS_CONFLICT_RESOLUTION = builder
|
QOL_HUNTERS_CONFLICT_RESOLUTION = builder
|
||||||
.comment("QOL Hunters conflict resolution (shouldn't be disabled unless it causes issues)")
|
.comment("QOL Hunters conflict resolution (shouldn't be disabled unless it causes issues)")
|
||||||
.define("QOLHuntersConflictResolution", true);
|
.define("QOLHuntersConflictResolution", true);
|
||||||
builder.pop();
|
AFFIX_TAG_GROUP_CHANCE_BLACKLIST = builder
|
||||||
|
.comment("vhcir won't show chance/weight for affixes in these groups")
|
||||||
|
.define("affixTagGroupBlacklist", List.of(VaultGearTierConfig.ModifierAffixTagGroup.CRAFTED_PREFIX.name(), VaultGearTierConfig.ModifierAffixTagGroup.CRAFTED_SUFFIX.name()));
|
||||||
MAX_LEVEL_OVERRIDE = builder
|
MAX_LEVEL_OVERRIDE = builder
|
||||||
.comment("override max level")
|
.comment("override max level")
|
||||||
.defineInRange("maxLevelOverride", -1, -1, Integer.MAX_VALUE);
|
.defineInRange("maxLevelOverride", -1, -1, Integer.MAX_VALUE);
|
||||||
|
DEBUG_UNIQUE_GEAR = builder
|
||||||
|
.comment("debug unique gear")
|
||||||
|
.define("debugUniqueGear", false);
|
||||||
|
builder.pop();
|
||||||
|
|
||||||
SHOW_ABILITY_ENHANCEMENTS = builder
|
SHOW_ABILITY_ENHANCEMENTS = builder
|
||||||
.comment("show ability enhancements")
|
.comment("show ability enhancements")
|
||||||
|
|
@ -59,10 +65,6 @@ public class Config {
|
||||||
.comment("show chance")
|
.comment("show chance")
|
||||||
.define("showChance", true);
|
.define("showChance", true);
|
||||||
|
|
||||||
AFFIX_TAG_GROUP_CHANCE_BLACKLIST = builder
|
|
||||||
.comment("vhcir won't show chance/weight for affixes in these groups")
|
|
||||||
.define("affixTagGroupBlacklist", List.of(VaultGearTierConfig.ModifierAffixTagGroup.CRAFTED_PREFIX.name(), VaultGearTierConfig.ModifierAffixTagGroup.CRAFTED_SUFFIX.name()));
|
|
||||||
|
|
||||||
SHOW_UNOBTAINABLE_CRAFTED = builder
|
SHOW_UNOBTAINABLE_CRAFTED = builder
|
||||||
.comment("show unobtainable crafted modifiers (above current lvl)")
|
.comment("show unobtainable crafted modifiers (above current lvl)")
|
||||||
.define("showUnobtainableCrafted", false);
|
.define("showUnobtainableCrafted", false);
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,27 @@
|
||||||
package com.radimous.vhatcaniroll.logic;
|
package com.radimous.vhatcaniroll.logic;
|
||||||
|
|
||||||
import com.radimous.vhatcaniroll.Config;
|
import com.radimous.vhatcaniroll.Config;
|
||||||
|
import com.radimous.vhatcaniroll.mixin.AbilityFloatValueAttributeReaderInvoker;
|
||||||
import com.radimous.vhatcaniroll.mixin.EffectConfigAccessor;
|
import com.radimous.vhatcaniroll.mixin.EffectConfigAccessor;
|
||||||
import com.radimous.vhatcaniroll.mixin.VaultGearTierConfigAccessor;
|
import com.radimous.vhatcaniroll.mixin.VaultGearTierConfigAccessor;
|
||||||
|
import iskallia.vault.config.UniqueGearConfig;
|
||||||
import iskallia.vault.config.gear.VaultGearTierConfig;
|
import iskallia.vault.config.gear.VaultGearTierConfig;
|
||||||
import iskallia.vault.gear.attribute.VaultGearAttribute;
|
import iskallia.vault.gear.attribute.VaultGearAttribute;
|
||||||
import iskallia.vault.gear.attribute.VaultGearAttributeRegistry;
|
import iskallia.vault.gear.attribute.VaultGearAttributeRegistry;
|
||||||
|
import iskallia.vault.gear.attribute.VaultGearModifier;
|
||||||
|
import iskallia.vault.gear.attribute.ability.AbilityAreaOfEffectPercentAttribute;
|
||||||
import iskallia.vault.gear.attribute.ability.AbilityLevelAttribute;
|
import iskallia.vault.gear.attribute.ability.AbilityLevelAttribute;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.EntropyPoisonModification;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.FrostNovaVulnerabilityModification;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.base.SpecialAbilityConfig;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.base.SpecialAbilityGearAttribute;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.base.SpecialAbilityModification;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.base.template.config.IntRangeConfig;
|
||||||
|
import iskallia.vault.gear.attribute.ability.special.base.template.value.IntValue;
|
||||||
import iskallia.vault.gear.attribute.config.BooleanFlagGenerator;
|
import iskallia.vault.gear.attribute.config.BooleanFlagGenerator;
|
||||||
import iskallia.vault.gear.attribute.config.ConfigurableAttributeGenerator;
|
import iskallia.vault.gear.attribute.config.ConfigurableAttributeGenerator;
|
||||||
import iskallia.vault.gear.attribute.custom.effect.EffectGearAttribute;
|
import iskallia.vault.gear.attribute.custom.effect.EffectGearAttribute;
|
||||||
|
import iskallia.vault.gear.reader.VaultGearModifierReader;
|
||||||
import iskallia.vault.init.ModConfigs;
|
import iskallia.vault.init.ModConfigs;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
|
@ -20,6 +32,7 @@ import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraftforge.fml.LogicalSide;
|
import net.minecraftforge.fml.LogicalSide;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.text.DecimalFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -44,14 +57,24 @@ public class Modifiers {
|
||||||
ArrayList<Component> modList = new ArrayList<>();
|
ArrayList<Component> modList = new ArrayList<>();
|
||||||
|
|
||||||
for (VaultGearTierConfig.ModifierAffixTagGroup affixTagGroup : modifierGroup.keySet()) {
|
for (VaultGearTierConfig.ModifierAffixTagGroup affixTagGroup : modifierGroup.keySet()) {
|
||||||
modList.addAll(getAffixGroupComponents(lvl, affixTagGroup, modifierGroup, modifierCategory));
|
modList.addAll(getAffixGroupComponents(lvl, affixTagGroup, modifierGroup.get(affixTagGroup), modifierCategory));
|
||||||
}
|
}
|
||||||
|
|
||||||
return modList;
|
return modList;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Component> getAffixGroupComponents(int lvl, VaultGearTierConfig.ModifierAffixTagGroup affixTagGroup,
|
public static List<Component> getUniqueModifierList(int lvl, ModifierCategory modifierCategory, Map<UniqueGearConfig.AffixTargetType, List<ResourceLocation>> modifierIdentifiers) {
|
||||||
Map<VaultGearTierConfig.ModifierAffixTagGroup, VaultGearTierConfig.AttributeGroup> modifierGroup,
|
ArrayList<Component> modList = new ArrayList<>();
|
||||||
|
|
||||||
|
for (Map.Entry<UniqueGearConfig.AffixTargetType, List<ResourceLocation>> modifierIdentifier : modifierIdentifiers.entrySet()) {
|
||||||
|
modList.addAll(getUniqueAffixComponents(lvl, modifierIdentifier, modifierCategory));
|
||||||
|
}
|
||||||
|
|
||||||
|
return modList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Component> getAffixGroupComponents(int lvl, VaultGearTierConfig.ModifierAffixTagGroup affixTagGroup,
|
||||||
|
VaultGearTierConfig.AttributeGroup modifierGroups,
|
||||||
ModifierCategory modifierCategory) {
|
ModifierCategory modifierCategory) {
|
||||||
|
|
||||||
ArrayList<Component> componentList = new ArrayList<>();
|
ArrayList<Component> componentList = new ArrayList<>();
|
||||||
|
|
@ -60,10 +83,10 @@ public class Modifiers {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Map<String, Integer> groupCounts = countGroups(lvl, affixTagGroup, modifierGroup, modifierCategory);
|
Map<String, Integer> groupCounts = countGroups(lvl, modifierGroups, modifierCategory);
|
||||||
|
|
||||||
AtomicBoolean noWeightAttr = new AtomicBoolean(false);
|
AtomicBoolean noWeightAttr = new AtomicBoolean(false);
|
||||||
int totalWeight = modifierGroup.get(affixTagGroup).stream()
|
int totalWeight = modifierGroups.stream()
|
||||||
.mapToInt(modTierGroup -> getModifierTiers(lvl, modTierGroup, modifierCategory).stream().mapToInt(
|
.mapToInt(modTierGroup -> getModifierTiers(lvl, modTierGroup, modifierCategory).stream().mapToInt(
|
||||||
tier -> {
|
tier -> {
|
||||||
if ((affixTagGroup == VaultGearTierConfig.ModifierAffixTagGroup.IMPLICIT
|
if ((affixTagGroup == VaultGearTierConfig.ModifierAffixTagGroup.IMPLICIT
|
||||||
|
|
@ -88,10 +111,8 @@ public class Modifiers {
|
||||||
componentList.add(new TextComponent("Total Weight: " + totalWeight).withStyle(ChatFormatting.BOLD));
|
componentList.add(new TextComponent("Total Weight: " + totalWeight).withStyle(ChatFormatting.BOLD));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Map<String, List<Component>> groupedModifiers = new HashMap<>();
|
Map<String, List<Component>> groupedModifiers = new HashMap<>();
|
||||||
for (VaultGearTierConfig.ModifierTierGroup modifierTierGroup : modifierGroup.get(affixTagGroup)) {
|
for (VaultGearTierConfig.ModifierTierGroup modifierTierGroup :modifierGroups) {
|
||||||
ArrayList<VaultGearTierConfig.ModifierTier<?>> mTierList;
|
ArrayList<VaultGearTierConfig.ModifierTier<?>> mTierList;
|
||||||
|
|
||||||
mTierList = getModifierTiers(lvl, modifierTierGroup, modifierCategory);
|
mTierList = getModifierTiers(lvl, modifierTierGroup, modifierCategory);
|
||||||
|
|
@ -103,7 +124,6 @@ public class Modifiers {
|
||||||
|
|
||||||
MutableComponent modComp = getModifierComponent(VaultGearAttributeRegistry.getAttribute(modifierTierGroup.getAttribute()),mTierList);
|
MutableComponent modComp = getModifierComponent(VaultGearAttributeRegistry.getAttribute(modifierTierGroup.getAttribute()),mTierList);
|
||||||
|
|
||||||
// //if (implicit||base) && groupCounts == 0
|
|
||||||
if (!(
|
if (!(
|
||||||
(affixTagGroup == VaultGearTierConfig.ModifierAffixTagGroup.BASE_ATTRIBUTES
|
(affixTagGroup == VaultGearTierConfig.ModifierAffixTagGroup.BASE_ATTRIBUTES
|
||||||
|| affixTagGroup == VaultGearTierConfig.ModifierAffixTagGroup.IMPLICIT
|
|| affixTagGroup == VaultGearTierConfig.ModifierAffixTagGroup.IMPLICIT
|
||||||
|
|
@ -114,7 +134,7 @@ public class Modifiers {
|
||||||
modComp.append(new TextComponent(" w"+weight).withStyle(ChatFormatting.GRAY));
|
modComp.append(new TextComponent(" w"+weight).withStyle(ChatFormatting.GRAY));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.SHOW_CHANCE.get() && shouldShowWeight(modifierCategory, affixTagGroup)) {
|
if (Config.SHOW_CHANCE.get() && shouldShowWeight(modifierCategory, affixTagGroup) && totalWeight > 0) {
|
||||||
modComp.append(new TextComponent(String.format(" %.2f%%", ((double) weight * 100 / totalWeight))).withStyle(ChatFormatting.GRAY));
|
modComp.append(new TextComponent(String.format(" %.2f%%", ((double) weight * 100 / totalWeight))).withStyle(ChatFormatting.GRAY));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -147,11 +167,44 @@ public class Modifiers {
|
||||||
return componentList;
|
return componentList;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, Integer> countGroups(int lvl, VaultGearTierConfig.ModifierAffixTagGroup affixTagGroup,
|
/**
|
||||||
Map<VaultGearTierConfig.ModifierAffixTagGroup, VaultGearTierConfig.AttributeGroup> modifierGroup,
|
* Same as getAffixGroupComponents, but for unique gear without chances and groups
|
||||||
ModifierCategory modifierCategory) {
|
*/
|
||||||
|
public static List<Component> getUniqueAffixComponents(int lvl,Map.Entry<UniqueGearConfig.AffixTargetType, List<ResourceLocation>> modifierIdentifier, ModifierCategory modifierCategory) {
|
||||||
|
|
||||||
|
ArrayList<Component> componentList = new ArrayList<>();
|
||||||
|
if (modifierIdentifier.getValue().isEmpty()) {
|
||||||
|
return componentList; // no affix for this type
|
||||||
|
}
|
||||||
|
UniqueGearConfig.AffixTargetType affixTagGroup = modifierIdentifier.getKey();
|
||||||
|
componentList.add(new TextComponent(affixTagGroup.toString().replace("_", " ")).withStyle(ChatFormatting.BOLD));
|
||||||
|
for (ResourceLocation modifier : modifierIdentifier.getValue()) {
|
||||||
|
VaultGearTierConfig.ModifierTierGroup modifierTierGroup = ModConfigs.VAULT_GEAR_CONFIG.get(VaultGearTierConfig.UNIQUE_ITEM).getTierGroup(modifier);
|
||||||
|
if (modifierTierGroup == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ArrayList<VaultGearTierConfig.ModifierTier<?>> mTierList;
|
||||||
|
mTierList = getModifierTiers(lvl, modifierTierGroup, modifierCategory);
|
||||||
|
if (mTierList.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
MutableComponent modComp = getModifierComponent(VaultGearAttributeRegistry.getAttribute(modifierTierGroup.getAttribute()),mTierList);
|
||||||
|
MutableComponent full = new TextComponent(" ");
|
||||||
|
full.append(modComp);
|
||||||
|
componentList.add(full);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (componentList.size() == 1) { // only header
|
||||||
|
return new ArrayList<>(); // no affixes for this type (all tiers are unobtainable)
|
||||||
|
}
|
||||||
|
|
||||||
|
componentList.add(TextComponent.EMPTY);
|
||||||
|
return componentList;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Map<String, Integer> countGroups(int lvl, VaultGearTierConfig.AttributeGroup modifierTierGroups, ModifierCategory modifierCategory) {
|
||||||
Map<String, Integer> groupCounts = new HashMap<>();
|
Map<String, Integer> groupCounts = new HashMap<>();
|
||||||
for (VaultGearTierConfig.ModifierTierGroup modifierTierGroup : modifierGroup.get(affixTagGroup)) {
|
for (VaultGearTierConfig.ModifierTierGroup modifierTierGroup : modifierTierGroups) {
|
||||||
ArrayList<VaultGearTierConfig.ModifierTier<?>> mTierList;
|
ArrayList<VaultGearTierConfig.ModifierTier<?>> mTierList;
|
||||||
mTierList = getModifierTiers(lvl, modifierTierGroup, modifierCategory);
|
mTierList = getModifierTiers(lvl, modifierTierGroup, modifierCategory);
|
||||||
if (mTierList.isEmpty()) {
|
if (mTierList.isEmpty()) {
|
||||||
|
|
@ -163,8 +216,7 @@ public class Modifiers {
|
||||||
return groupCounts;
|
return groupCounts;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ArrayList<VaultGearTierConfig.ModifierTier<?>> getModifierTiers(int lvl,
|
public static ArrayList<VaultGearTierConfig.ModifierTier<?>> getModifierTiers(int lvl, VaultGearTierConfig.ModifierTierGroup modifierTierGroup, ModifierCategory modifierCategory) {
|
||||||
VaultGearTierConfig.ModifierTierGroup modifierTierGroup, ModifierCategory modifierCategory) {
|
|
||||||
|
|
||||||
if (modifierCategory == ModifierCategory.NORMAL) {
|
if (modifierCategory == ModifierCategory.NORMAL) {
|
||||||
return getNormalModifierTiers(lvl, modifierTierGroup);
|
return getNormalModifierTiers(lvl, modifierTierGroup);
|
||||||
|
|
@ -224,6 +276,10 @@ public class Modifiers {
|
||||||
|
|
||||||
var minConfigDisplay = atrGenerator.getConfigDisplay(atr.getReader(), minConfig);
|
var minConfigDisplay = atrGenerator.getConfigDisplay(atr.getReader(), minConfig);
|
||||||
|
|
||||||
|
if (minConfig instanceof SpecialAbilityGearAttribute.SpecialAbilityTierConfig<?,?,?> minConfigSpecial) {
|
||||||
|
return getSpecialAbilityAttributeComponent(modifierTiers, minConfigSpecial);
|
||||||
|
}
|
||||||
|
|
||||||
MutableComponent res = null;
|
MutableComponent res = null;
|
||||||
if (modifierTiers.size() > 1) {
|
if (modifierTiers.size() > 1) {
|
||||||
res = rangeComponent(atrName, atr, atrGenerator, minConfig, maxConfig);
|
res = rangeComponent(atrName, atr, atrGenerator, minConfig, maxConfig);
|
||||||
|
|
@ -240,11 +296,43 @@ public class Modifiers {
|
||||||
if (minConfig instanceof EffectGearAttribute.Config ) {
|
if (minConfig instanceof EffectGearAttribute.Config ) {
|
||||||
return minConfigDisplay;
|
return minConfigDisplay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (minConfig instanceof AbilityAreaOfEffectPercentAttribute.Config minConfigA) {
|
||||||
|
return getAbilityAoePercentageComponent(atr, minConfigA, minConfigA);
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
return new TextComponent("ERR - NULL DISPLAY " + atrName);
|
return new TextComponent("ERR - NULL DISPLAY " + atrName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") // this thing is insane
|
||||||
|
private static @NotNull MutableComponent getSpecialAbilityAttributeComponent(
|
||||||
|
ArrayList<VaultGearTierConfig.ModifierTier<?>> modifierTiers,
|
||||||
|
SpecialAbilityGearAttribute.SpecialAbilityTierConfig<?, ?, ?> minConfigSpecial) {
|
||||||
|
var modification = minConfigSpecial.getModification();
|
||||||
|
if (modification instanceof FrostNovaVulnerabilityModification frostNovaVulnerabilityModification) {
|
||||||
|
var minToMaxComponent = new TextComponent("<TODO>");
|
||||||
|
return (new TextComponent("Frost Nova also applies Level ").append(minToMaxComponent)
|
||||||
|
.append(" Vulnerability"));
|
||||||
|
}
|
||||||
|
if (modification instanceof EntropyPoisonModification entropyPoisonModification) {
|
||||||
|
var tiers = (List<SpecialAbilityGearAttribute.SpecialAbilityTierConfig<SpecialAbilityModification<IntRangeConfig, IntValue>, IntRangeConfig, IntValue>>) modifierTiers.stream().map(x -> x.getModifierConfiguration()).toList();
|
||||||
|
var minValue = entropyPoisonModification.getMinimumValue(tiers);
|
||||||
|
var minValueDisplay = new TextComponent(minValue.map(x -> String.valueOf(x.getValue().getValue())).orElse("NULL"));
|
||||||
|
var maxValue = entropyPoisonModification.getMaximumValue(tiers);
|
||||||
|
var maxValueDisplay = new TextComponent(maxValue.map(x -> String.valueOf(x.getValue().getValue())).orElse("NULL"));
|
||||||
|
MutableComponent cmp = new TextComponent("Entropic Bind also applies Poison ");
|
||||||
|
var range = new TextComponent(minValueDisplay.getString() + "-" + maxValueDisplay.getString());
|
||||||
|
cmp.append(range);
|
||||||
|
return cmp;
|
||||||
|
}
|
||||||
|
var abilityKey = minConfigSpecial.getAbilityKey();
|
||||||
|
return ModConfigs.ABILITIES.getAbilityById(abilityKey).filter(skill -> skill.getName() != null).map(skill -> {
|
||||||
|
String name = skill.getName();
|
||||||
|
return new TextComponent("Special " + name + " modification");
|
||||||
|
}).orElseGet(() -> (TextComponent) new TextComponent(abilityKey).withStyle(Style.EMPTY.withColor(14076214)));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method handles combining multiple configs into a single component
|
* This method handles combining multiple configs into a single component
|
||||||
* VH doesn't have method for this, so we need to do it manually
|
* VH doesn't have method for this, so we need to do it manually
|
||||||
|
|
@ -277,20 +365,60 @@ public class Modifiers {
|
||||||
return getCloudRangeComponent(minConfigDisplay, maxConfigDisplay, atr);
|
return getCloudRangeComponent(minConfigDisplay, maxConfigDisplay, atr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((minConfig instanceof AbilityAreaOfEffectPercentAttribute.Config minConfigA) && (maxConfig instanceof AbilityAreaOfEffectPercentAttribute.Config maxConfigA)) {
|
||||||
|
return getAbilityAoePercentageComponent(atr, minConfigA, maxConfigA);
|
||||||
|
}
|
||||||
|
|
||||||
if (minConfig instanceof EffectGearAttribute.Config minEffectConfig
|
if (minConfig instanceof EffectGearAttribute.Config minEffectConfig
|
||||||
&& maxConfig instanceof EffectGearAttribute.Config
|
&& maxConfig instanceof EffectGearAttribute.Config
|
||||||
&& maxConfigDisplay != null) {
|
&& maxConfigDisplay != null) {
|
||||||
var effectStr = ((EffectConfigAccessor)minEffectConfig).getAmplifier() + "-" +
|
var effectStr = ((EffectConfigAccessor)minEffectConfig).getAmplifier() + "-" +
|
||||||
maxConfigDisplay.getString();
|
maxConfigDisplay.getString();
|
||||||
return new TextComponent(effectStr).withStyle(atr.getReader().getColoredTextStyle());
|
return new TextComponent(effectStr).withStyle(atr.getReader().getColoredTextStyle());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (atrName.equals("the_vault:effect_cloud")){
|
||||||
|
return new TextComponent("Special ability modification");
|
||||||
|
}
|
||||||
|
|
||||||
if (res != null) {
|
if (res != null) {
|
||||||
return atr.getReader().formatConfigDisplay(LogicalSide.CLIENT, res);
|
return atr.getReader().formatConfigDisplay(LogicalSide.CLIENT, res);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <T> @NotNull MutableComponent getAbilityAoePercentageComponent(VaultGearAttribute<T> atr,
|
||||||
|
AbilityAreaOfEffectPercentAttribute.Config minConfigA,
|
||||||
|
AbilityAreaOfEffectPercentAttribute.Config maxConfigA) {
|
||||||
|
float min = minConfigA.getMin();
|
||||||
|
float max = maxConfigA.generateMaximumValue();
|
||||||
|
|
||||||
|
VaultGearModifierReader<T> reader = atr.getReader();
|
||||||
|
MutableComponent minValueDisplay = new TextComponent(new DecimalFormat("0.#").format(Math.abs(min * 100.0F)) + "%");
|
||||||
|
MutableComponent maxValueDisplay = new TextComponent(new DecimalFormat("0.#").format(Math.abs(max * 100.0F)) + "%");
|
||||||
|
boolean positive = min > 0;
|
||||||
|
MutableComponent areaCmp = new TextComponent("Area Of Effect").withStyle(Style.EMPTY.withColor(ModConfigs.COLORS.getColor("areaOfEffect")));
|
||||||
|
String cdInfo;
|
||||||
|
if (positive) {
|
||||||
|
cdInfo = " more ";
|
||||||
|
} else {
|
||||||
|
cdInfo = " less ";
|
||||||
|
}
|
||||||
|
|
||||||
|
return new TextComponent("")
|
||||||
|
.append(VaultGearModifier.AffixType.IMPLICIT.getAffixPrefixComponent(true)
|
||||||
|
.withStyle(Style.EMPTY.withColor(6082075)))
|
||||||
|
.append(minValueDisplay.withStyle(Style.EMPTY.withColor(6082075)))
|
||||||
|
.append(new TextComponent("-").withStyle(Style.EMPTY.withColor(6082075)))
|
||||||
|
.append(maxValueDisplay.withStyle(Style.EMPTY.withColor(6082075)))
|
||||||
|
.append(cdInfo)
|
||||||
|
.append(areaCmp)
|
||||||
|
.append(" of ")
|
||||||
|
.append(
|
||||||
|
((AbilityFloatValueAttributeReaderInvoker) reader).invokeFormatAbilityName(minConfigA.getAbilityKey()))
|
||||||
|
.setStyle(reader.getColoredTextStyle());
|
||||||
|
}
|
||||||
|
|
||||||
private static MutableComponent getCloudRangeComponent(MutableComponent minConfigDisplay, MutableComponent maxConfigDisplay, VaultGearAttribute<?> atr) {
|
private static MutableComponent getCloudRangeComponent(MutableComponent minConfigDisplay, MutableComponent maxConfigDisplay, VaultGearAttribute<?> atr) {
|
||||||
// <Effect> [<LVL>] Cloud [when Hit]
|
// <Effect> [<LVL>] Cloud [when Hit]
|
||||||
// Poison Cloud
|
// Poison Cloud
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.radimous.vhatcaniroll.mixin;
|
||||||
|
|
||||||
|
import iskallia.vault.gear.attribute.ability.AbilityFloatValueAttribute;
|
||||||
|
import net.minecraft.network.chat.MutableComponent;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.gen.Invoker;
|
||||||
|
|
||||||
|
@Mixin(AbilityFloatValueAttribute.Reader.class)
|
||||||
|
public interface AbilityFloatValueAttributeReaderInvoker {
|
||||||
|
@Invoker
|
||||||
|
MutableComponent invokeFormatAbilityName(String abilityKey);
|
||||||
|
}
|
||||||
|
|
@ -1,11 +1,14 @@
|
||||||
package com.radimous.vhatcaniroll.ui;
|
package com.radimous.vhatcaniroll.ui;
|
||||||
|
|
||||||
|
import com.radimous.vhatcaniroll.Config;
|
||||||
import com.radimous.vhatcaniroll.logic.ModifierCategory;
|
import com.radimous.vhatcaniroll.logic.ModifierCategory;
|
||||||
import com.radimous.vhatcaniroll.logic.Modifiers;
|
import com.radimous.vhatcaniroll.logic.Modifiers;
|
||||||
import com.radimous.vhatcaniroll.mixin.UniqueGearConfigAccessor;
|
import com.radimous.vhatcaniroll.mixin.UniqueGearConfigAccessor;
|
||||||
import com.radimous.vhatcaniroll.mixin.VaultGearTierConfigAccessor;
|
import com.radimous.vhatcaniroll.mixin.VaultGearTierConfigAccessor;
|
||||||
import iskallia.vault.client.gui.framework.ScreenTextures;
|
import iskallia.vault.client.gui.framework.ScreenTextures;
|
||||||
|
import iskallia.vault.client.gui.framework.element.FakeItemSlotElement;
|
||||||
import iskallia.vault.client.gui.framework.element.LabelElement;
|
import iskallia.vault.client.gui.framework.element.LabelElement;
|
||||||
|
import iskallia.vault.client.gui.framework.element.NineSliceElement;
|
||||||
import iskallia.vault.client.gui.framework.element.VerticalScrollClipContainer;
|
import iskallia.vault.client.gui.framework.element.VerticalScrollClipContainer;
|
||||||
import iskallia.vault.client.gui.framework.spatial.Padding;
|
import iskallia.vault.client.gui.framework.spatial.Padding;
|
||||||
import iskallia.vault.client.gui.framework.spatial.Spatials;
|
import iskallia.vault.client.gui.framework.spatial.Spatials;
|
||||||
|
|
@ -13,33 +16,24 @@ import iskallia.vault.client.gui.framework.spatial.spi.ISpatial;
|
||||||
import iskallia.vault.client.gui.framework.text.LabelTextStyle;
|
import iskallia.vault.client.gui.framework.text.LabelTextStyle;
|
||||||
import iskallia.vault.config.UniqueGearConfig;
|
import iskallia.vault.config.UniqueGearConfig;
|
||||||
import iskallia.vault.config.gear.VaultGearTierConfig;
|
import iskallia.vault.config.gear.VaultGearTierConfig;
|
||||||
import iskallia.vault.gear.attribute.VaultGearAttributeRegistry;
|
import iskallia.vault.gear.VaultGearState;
|
||||||
|
import iskallia.vault.gear.data.VaultGearData;
|
||||||
import iskallia.vault.init.ModConfigs;
|
import iskallia.vault.init.ModConfigs;
|
||||||
|
import iskallia.vault.init.ModGearAttributes;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
import net.minecraft.network.chat.TextComponent;
|
import net.minecraft.network.chat.TextComponent;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.item.ItemStack;
|
import net.minecraft.world.item.ItemStack;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
|
||||||
|
|
||||||
public class UniqueGearListContainer extends VerticalScrollClipContainer<UniqueGearListContainer> implements InnerGearScreen {
|
public class UniqueGearListContainer extends VerticalScrollClipContainer<UniqueGearListContainer> implements InnerGearScreen {
|
||||||
|
|
||||||
public UniqueGearListContainer(ISpatial spatial, int lvl, ModifierCategory modifierCategory, ItemStack gearPiece) {
|
public UniqueGearListContainer(ISpatial spatial, int lvl, ModifierCategory modifierCategory, ItemStack gearPiece) {
|
||||||
super(spatial, Padding.ZERO, ScreenTextures.INSET_BLACK_BACKGROUND);
|
super(spatial, Padding.ZERO, ScreenTextures.INSET_BLACK_BACKGROUND);
|
||||||
int labelX = 9;
|
int labelX = 9;
|
||||||
int labelY = 20;
|
int labelY = 9;
|
||||||
|
|
||||||
|
|
||||||
// Label for the item name and level (GOLD if legendary, AQUA if greater, WHITE if common)
|
|
||||||
LabelElement<?> itemName = new LabelElement<>(
|
|
||||||
Spatials.positionXY(labelX, 5).width(this.innerWidth() - labelX).height(15), new TextComponent(
|
|
||||||
gearPiece.getItem().toString().toUpperCase() + " - LVL " + lvl)
|
|
||||||
.withStyle(ChatFormatting.UNDERLINE).withStyle(modifierCategory.getStyle()), LabelTextStyle.defaultStyle()
|
|
||||||
);
|
|
||||||
this.addElement(itemName);
|
|
||||||
|
|
||||||
Map<ResourceLocation, UniqueGearConfig.Entry> uniqueRegistry = ((UniqueGearConfigAccessor) ModConfigs.UNIQUE_GEAR).getRegistry();
|
Map<ResourceLocation, UniqueGearConfig.Entry> uniqueRegistry = ((UniqueGearConfigAccessor) ModConfigs.UNIQUE_GEAR).getRegistry();
|
||||||
var regName = gearPiece.getItem().getRegistryName();
|
var regName = gearPiece.getItem().getRegistryName();
|
||||||
|
|
@ -51,94 +45,67 @@ public class UniqueGearListContainer extends VerticalScrollClipContainer<UniqueG
|
||||||
var goodEntries = uniqueRegistry.entrySet().stream().filter(entry -> entry.getValue().getModel() != null && entry.getValue().getModel().toString().contains(regPath)).toList();
|
var goodEntries = uniqueRegistry.entrySet().stream().filter(entry -> entry.getValue().getModel() != null && entry.getValue().getModel().toString().contains(regPath)).toList();
|
||||||
List<Map.Entry<ResourceLocation, UniqueGearConfig.Entry>> badEntries = uniqueRegistry.entrySet().stream().filter(entry -> entry.getValue().getModel() == null || !entry.getValue().getModel().toString().contains(regPath)).toList();
|
List<Map.Entry<ResourceLocation, UniqueGearConfig.Entry>> badEntries = uniqueRegistry.entrySet().stream().filter(entry -> entry.getValue().getModel() == null || !entry.getValue().getModel().toString().contains(regPath)).toList();
|
||||||
|
|
||||||
|
|
||||||
var uniqueConfig1 = (VaultGearTierConfigAccessor) ModConfigs.VAULT_GEAR_CONFIG.get(VaultGearTierConfig.UNIQUE_ITEM);
|
var uniqueConfig1 = (VaultGearTierConfigAccessor) ModConfigs.VAULT_GEAR_CONFIG.get(VaultGearTierConfig.UNIQUE_ITEM);
|
||||||
if (uniqueConfig1 == null) {
|
if (uniqueConfig1 == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for (var entry : goodEntries) {
|
for (var entry : goodEntries) {
|
||||||
var value = entry.getValue();
|
var value = entry.getValue();
|
||||||
ResourceLocation id = value.getId() == null ? new ResourceLocation("minecraft", "missing") : value.getId();
|
String name = value.getName();
|
||||||
String name = value.getName() == null ? "missing" : value.getName();
|
if (name == null) {
|
||||||
ResourceLocation model = value.getModel() == null ? new ResourceLocation("minecraft", "missing") : value.getModel();
|
|
||||||
|
|
||||||
List<String> modifierTags = value.getModifierTags() == null ? List.of("missing") : value.getModifierTags();
|
|
||||||
Map<UniqueGearConfig.AffixTargetType, List<ResourceLocation>> modifierIdentifiers = value.getModifierIdentifiers() == null ? Map.of(UniqueGearConfig.AffixTargetType.PREFIX, List.of(new ResourceLocation("minecraft", "missing"))) : value.getModifierIdentifiers();
|
|
||||||
|
|
||||||
LabelElement<?> idLabel = new LabelElement<>(
|
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
|
||||||
new TextComponent(
|
|
||||||
"ID: " + id.toString()), LabelTextStyle.defaultStyle()
|
|
||||||
);
|
|
||||||
this.addElement(idLabel);
|
|
||||||
labelY += 10;
|
|
||||||
LabelElement<?> nameLabel = new LabelElement<>(
|
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
|
||||||
new TextComponent(
|
|
||||||
"Name: " + name), LabelTextStyle.defaultStyle()
|
|
||||||
);
|
|
||||||
this.addElement(nameLabel);
|
|
||||||
labelY += 10;
|
|
||||||
LabelElement<?> modelLabel = new LabelElement<>(
|
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
|
||||||
new TextComponent(
|
|
||||||
"Model: " + model.toString()), LabelTextStyle.defaultStyle()
|
|
||||||
);
|
|
||||||
this.addElement(modelLabel);
|
|
||||||
labelY += 10;
|
|
||||||
LabelElement<?> modifierTagsLabel = new LabelElement<>(
|
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
|
||||||
new TextComponent(
|
|
||||||
"Modifier Tags: " + modifierTags.toString()), LabelTextStyle.defaultStyle()
|
|
||||||
);
|
|
||||||
this.addElement(modifierTagsLabel);
|
|
||||||
labelY += 10;
|
|
||||||
for (Map.Entry<UniqueGearConfig.AffixTargetType, List<ResourceLocation>> modifierIdentifier : modifierIdentifiers.entrySet()) {
|
|
||||||
if (modifierIdentifier.getValue().isEmpty()) {
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
this.addElement(new LabelElement<>(
|
ResourceLocation model = value.getModel();
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
if (model == null) {
|
||||||
new TextComponent(modifierIdentifier.getKey().toString()), LabelTextStyle.defaultStyle()));
|
continue;
|
||||||
labelY += 10;
|
|
||||||
for (ResourceLocation modifier : modifierIdentifier.getValue()) {
|
|
||||||
Map<VaultGearTierConfig.ModifierAffixTagGroup, VaultGearTierConfig.AttributeGroup> ff = uniqueConfig1.getModifierGroup();
|
|
||||||
List<VaultGearTierConfig.AttributeGroup> kk = new ArrayList<>();
|
|
||||||
for (Map.Entry<VaultGearTierConfig.ModifierAffixTagGroup, VaultGearTierConfig.AttributeGroup> f : ff.entrySet()) {
|
|
||||||
kk.add(f.getValue());
|
|
||||||
}
|
}
|
||||||
var someModTierGroup = kk.get(0).get(0);
|
|
||||||
var mTierList = Modifiers.getModifierTiers(lvl,someModTierGroup , modifierCategory);
|
|
||||||
var mc = Modifiers.getModifierComponent(VaultGearAttributeRegistry.getAttribute(modifier),mTierList);
|
|
||||||
|
|
||||||
//TODO: figure this out
|
Map<UniqueGearConfig.AffixTargetType, List<ResourceLocation>> modifierIdentifiers = value.getModifierIdentifiers();
|
||||||
// LabelElement<?> mcl = new LabelElement<>(
|
if (modifierIdentifiers == null) {
|
||||||
// Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
continue;
|
||||||
// mc, LabelTextStyle.defaultStyle());
|
|
||||||
// this.addElement(mcl);
|
|
||||||
labelY += 10;
|
|
||||||
LabelElement<?> modifierIdentifierLabel = new LabelElement<>(
|
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
|
||||||
new TextComponent(" " + modifier.toString()), LabelTextStyle.defaultStyle());
|
|
||||||
this.addElement(modifierIdentifierLabel);
|
|
||||||
labelY += 10;
|
|
||||||
}
|
}
|
||||||
labelY += 10;
|
int iconHeight = labelY;
|
||||||
}
|
|
||||||
labelY += 10;
|
|
||||||
|
|
||||||
this.addElement(new LabelElement<>(
|
labelY += 5;
|
||||||
|
LabelElement<?> nameLabel = new LabelElement<>(
|
||||||
|
Spatials.positionXY(labelX + 20, labelY).width(this.innerWidth() - labelX).height(15),
|
||||||
|
new TextComponent(name), LabelTextStyle.defaultStyle()
|
||||||
|
);
|
||||||
|
this.addElement(nameLabel);
|
||||||
|
labelY += 20;
|
||||||
|
|
||||||
|
ItemStack displayStack = new ItemStack(gearPiece.getItem());
|
||||||
|
VaultGearData gearData = VaultGearData.read(displayStack);
|
||||||
|
gearData.setState(VaultGearState.IDENTIFIED);
|
||||||
|
gearData.createOrReplaceAttributeValue(ModGearAttributes.GEAR_MODEL, model);
|
||||||
|
gearData.write(displayStack);
|
||||||
|
this.addElement(new FakeItemSlotElement<>(Spatials.positionXY(labelX - 4, iconHeight).width(16).height(16), () -> displayStack, () -> false, ScreenTextures.EMPTY, ScreenTextures.EMPTY));
|
||||||
|
|
||||||
|
|
||||||
|
var mlist = Modifiers.getUniqueModifierList(lvl, modifierCategory, modifierIdentifiers);
|
||||||
|
for (var mc : mlist) {
|
||||||
|
LabelElement<?> mcl = new LabelElement<>(
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
||||||
new TextComponent("----------------------------------------"), LabelTextStyle.defaultStyle()));
|
mc, LabelTextStyle.defaultStyle());
|
||||||
|
this.addElement(mcl);
|
||||||
labelY += 10;
|
labelY += 10;
|
||||||
}
|
}
|
||||||
|
this.addElement(new NineSliceElement<>(
|
||||||
|
Spatials.positionXY(0, labelY).width(this.innerWidth()).height(3),
|
||||||
|
ScreenTextures.BUTTON_EMPTY));
|
||||||
|
labelY += 10;
|
||||||
|
}
|
||||||
|
if (Config.DEBUG_UNIQUE_GEAR.get()) {
|
||||||
this.addElement(new LabelElement<>(
|
this.addElement(new LabelElement<>(
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
||||||
new TextComponent("BAD ENTRIES:").withStyle(ChatFormatting.RED), LabelTextStyle.defaultStyle()));
|
new TextComponent("[DEBUG] BAD ENTRIES:").withStyle(ChatFormatting.RED), LabelTextStyle.defaultStyle()));
|
||||||
labelY += 10;
|
labelY += 10;
|
||||||
for (var entry : badEntries) {
|
for (var entry : badEntries) {
|
||||||
this.addElement(new LabelElement<>(
|
this.addElement(new LabelElement<>(
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
||||||
new TextComponent("ID: " + entry.getKey().toString()).withStyle(ChatFormatting.RED), LabelTextStyle.defaultStyle()));
|
new TextComponent("ID: " + entry.getKey().toString()).withStyle(ChatFormatting.RED),
|
||||||
|
LabelTextStyle.defaultStyle()));
|
||||||
labelY += 10;
|
labelY += 10;
|
||||||
var vv = entry.getValue();
|
var vv = entry.getValue();
|
||||||
if (vv == null) {
|
if (vv == null) {
|
||||||
|
|
@ -146,10 +113,12 @@ public class UniqueGearListContainer extends VerticalScrollClipContainer<UniqueG
|
||||||
}
|
}
|
||||||
this.addElement(new LabelElement<>(
|
this.addElement(new LabelElement<>(
|
||||||
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
Spatials.positionXY(labelX, labelY).width(this.innerWidth() - labelX).height(15),
|
||||||
new TextComponent("Model: " + vv.getModel()).withStyle(ChatFormatting.RED), LabelTextStyle.defaultStyle()));
|
new TextComponent("Model: " + vv.getModel()).withStyle(ChatFormatting.RED),
|
||||||
|
LabelTextStyle.defaultStyle()));
|
||||||
labelY += 16;
|
labelY += 16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public float getScroll() {
|
public float getScroll() {
|
||||||
return this.verticalScrollBarElement.getValue();
|
return this.verticalScrollBarElement.getValue();
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
{
|
{
|
||||||
"vhatcaniroll.screen.title.random": "Random Modifiers",
|
"vhatcaniroll.screen.title.random": "Random Modifiers",
|
||||||
"vhatcaniroll.screen.title.crafted": "Crafted Modifiers",
|
"vhatcaniroll.screen.title.crafted": "Crafted Modifiers",
|
||||||
|
"vhatcaniroll.screen.title.unique": "Unique Gear",
|
||||||
"vhatcaniroll.screen.title.transmogs": "Transmogs",
|
"vhatcaniroll.screen.title.transmogs": "Transmogs",
|
||||||
"vhatcaniroll.openmodscreen": "Open VHat can I roll? screen",
|
"vhatcaniroll.openmodscreen": "Open VHat can I roll? screen",
|
||||||
"key.categories.vhatcaniroll": "VHat can I roll?"
|
"key.categories.vhatcaniroll": "VHat can I roll?"
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,11 @@
|
||||||
"mixins": [
|
"mixins": [
|
||||||
],
|
],
|
||||||
"client": [
|
"client": [
|
||||||
"StatisticsElementContainerScreenMixin",
|
|
||||||
"VaultGearTierConfigAccessor",
|
|
||||||
"EffectConfigAccessor",
|
"EffectConfigAccessor",
|
||||||
"UniqueGearConfigAccessor"
|
"StatisticsElementContainerScreenMixin",
|
||||||
|
"UniqueGearConfigAccessor",
|
||||||
|
"VaultGearTierConfigAccessor",
|
||||||
|
"AbilityFloatValueAttributeReaderInvoker"
|
||||||
],
|
],
|
||||||
"injectors": {
|
"injectors": {
|
||||||
"defaultRequire": 1
|
"defaultRequire": 1
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue