diff --git a/src/main/java/com/hbm/handler/ability/AvailableAbilities.java b/src/main/java/com/hbm/handler/ability/AvailableAbilities.java index e4662a0c0..650f22a4b 100644 --- a/src/main/java/com/hbm/handler/ability/AvailableAbilities.java +++ b/src/main/java/com/hbm/handler/ability/AvailableAbilities.java @@ -1,6 +1,7 @@ package com.hbm.handler.ability; import java.util.Collections; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -91,7 +92,14 @@ public class AvailableAbilities { if (!toolAbilities.isEmpty()) { list.add("Abilities: "); - toolAbilities.forEach((ability, level) -> { + toolAbilities.entrySet().stream().sorted( + Comparator + .comparing(Map.Entry::getKey) + .thenComparing(Map.Entry::getValue) + ).forEach(entry -> { + IBaseAbility ability = entry.getKey(); + int level = entry.getValue(); + String fullName = ability.getFullName(level); if (!fullName.isEmpty()) { list.add(" " + EnumChatFormatting.GOLD + fullName); @@ -108,7 +116,14 @@ public class AvailableAbilities { if (!weaponAbilities.isEmpty()) { list.add("Weapon modifiers: "); - weaponAbilities.forEach((ability, level) -> { + weaponAbilities.entrySet().stream().sorted( + Comparator + .comparing(Map.Entry::getKey) + .thenComparing(Map.Entry::getValue) + ).forEach(entry -> { + IWeaponAbility ability = entry.getKey(); + int level = entry.getValue(); + list.add(" " + EnumChatFormatting.RED + ability.getFullName(level)); }); } diff --git a/src/main/java/com/hbm/handler/ability/IBaseAbility.java b/src/main/java/com/hbm/handler/ability/IBaseAbility.java index 007d25e81..9999bcaa0 100644 --- a/src/main/java/com/hbm/handler/ability/IBaseAbility.java +++ b/src/main/java/com/hbm/handler/ability/IBaseAbility.java @@ -2,7 +2,7 @@ package com.hbm.handler.ability; import net.minecraft.client.resources.I18n; -public interface IBaseAbility { +public interface IBaseAbility extends Comparable { public String getName(); public default String getExtension(int level) { @@ -24,4 +24,13 @@ public interface IBaseAbility { default int levels() { return 1; } + + default int sortOrder() { + return hashCode(); + } + + @Override + default int compareTo(IBaseAbility o) { + return sortOrder() - o.sortOrder(); + } } diff --git a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java index e49cb4c30..4f4994bbd 100644 --- a/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolAreaAbility.java @@ -34,12 +34,19 @@ public interface IToolAreaAbility extends IBaseAbility { return true; } + public final static int SORT_ORDER_BASE = 0; + // region handlers public static final IToolAreaAbility NONE = new IToolAreaAbility() { @Override public String getName() { return ""; } + + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 0; + } @Override public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) { @@ -70,6 +77,11 @@ public interface IToolAreaAbility extends IBaseAbility { return " (" + radiusAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 1; + } + // Note: if reusing it across different instatces of a tool // is a problem here, then it had already been one before // the refactor! The solution is to simply make this a local @@ -193,6 +205,11 @@ public interface IToolAreaAbility extends IBaseAbility { return " (" + rangeAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 2; + } + @Override public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) { int range = rangeAtLevel[level]; @@ -241,6 +258,11 @@ public interface IToolAreaAbility extends IBaseAbility { return false; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 3; + } + @Override public boolean onDig(int level, World world, int x, int y, int z, EntityPlayer player, ItemToolAbility tool) { float strength = strengthAtLevel[level]; diff --git a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java index 82bbca88c..99cbea697 100644 --- a/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java +++ b/src/main/java/com/hbm/handler/ability/IToolHarvestAbility.java @@ -41,6 +41,8 @@ public interface IToolHarvestAbility extends IBaseAbility { } } + public final static int SORT_ORDER_BASE = 100; + // region handlers public static final IToolHarvestAbility NONE = new IToolHarvestAbility() { @Override @@ -48,6 +50,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ""; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 0; + } + @Override public boolean skipDefaultDrops(int level) { return false; @@ -65,6 +72,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ToolConfig.abilitySilk; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 1; + } + @Override public boolean skipDefaultDrops(int level) { return false; @@ -109,6 +121,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return " (" + powerAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 2; + } + @Override public boolean skipDefaultDrops(int level) { return false; @@ -141,6 +158,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ToolConfig.abilityFurnace; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 3; + } + @Override public boolean skipDefaultDrops(int level) { return true; @@ -184,6 +206,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ToolConfig.abilityShredder; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 4; + } + @Override public boolean skipDefaultDrops(int level) { return true; @@ -216,6 +243,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ToolConfig.abilityCentrifuge; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 5; + } + @Override public boolean skipDefaultDrops(int level) { return true; @@ -252,6 +284,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ToolConfig.abilityCrystallizer; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 6; + } + @Override public boolean skipDefaultDrops(int level) { return true; @@ -284,6 +321,11 @@ public interface IToolHarvestAbility extends IBaseAbility { return ToolConfig.abilityMercury; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 7; + } + @Override public boolean skipDefaultDrops(int level) { return true; diff --git a/src/main/java/com/hbm/handler/ability/IWeaponAbility.java b/src/main/java/com/hbm/handler/ability/IWeaponAbility.java index 92f0d3f1d..97c604c54 100644 --- a/src/main/java/com/hbm/handler/ability/IWeaponAbility.java +++ b/src/main/java/com/hbm/handler/ability/IWeaponAbility.java @@ -38,6 +38,8 @@ public interface IWeaponAbility extends IBaseAbility { // Note: tool is currently unused in weapon abilities public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool); + public final static int SORT_ORDER_BASE = 200; + // region handlers public static final IWeaponAbility NONE = new IWeaponAbility() { @Override @@ -45,6 +47,11 @@ public interface IWeaponAbility extends IBaseAbility { return ""; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 0; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) {} }; @@ -67,6 +74,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (" + radAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 1; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { if(victim instanceof EntityLivingBase) @@ -92,6 +104,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (" + amountAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 2; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { float amount = amountAtLevel[level]; @@ -124,6 +141,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (" + durationAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 3; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { int duration = durationAtLevel[level]; @@ -155,6 +177,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (1:" + dividerAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 4; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { int divider = dividerAtLevel[level]; @@ -197,6 +224,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (" + durationAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 5; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { int duration = durationAtLevel[level]; @@ -227,6 +259,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (" + durationAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 5; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { if(victim instanceof EntityLivingBase) { @@ -253,6 +290,11 @@ public interface IWeaponAbility extends IBaseAbility { return " (1:" + dividerAtLevel[level] + ")"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 6; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { int divider = dividerAtLevel[level]; @@ -290,6 +332,11 @@ public interface IWeaponAbility extends IBaseAbility { return "weapon.ability.beheader"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 7; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { if(victim instanceof EntityLivingBase && ((EntityLivingBase) victim).getHealth() <= 0.0F) { @@ -331,6 +378,11 @@ public interface IWeaponAbility extends IBaseAbility { return "weapon.ability.bobble"; } + @Override + public int sortOrder() { + return SORT_ORDER_BASE + 8; + } + @Override public void onHit(int level, World world, EntityPlayer player, Entity victim, Item tool) { if(victim instanceof EntityMob && ((EntityMob) victim).getHealth() <= 0.0F) { diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbility.java b/src/main/java/com/hbm/items/tool/ItemToolAbility.java index 2c40e3db3..112e8bad4 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbility.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbility.java @@ -1,6 +1,7 @@ package com.hbm.items.tool; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Locale; @@ -455,6 +456,14 @@ public class ItemToolAbility extends ItemTool implements IDepthRockTool, IGUIPro return; presets.add(new ToolPreset(IToolAreaAbility.NONE, 0, ability, level)); }); + + presets.sort( + Comparator + .comparing((ToolPreset p) -> p.harvestAbility) + .thenComparingInt(p -> p.harvestAbilityLevel) + .thenComparing(p -> p.areaAbility) + .thenComparingInt(p -> p.areaAbilityLevel) + ); } public void restrictTo(AvailableAbilities availableAbilities) {