Sort abilities consistently

This commit is contained in:
abel1502 2025-05-18 13:42:11 +03:00
parent e23cfab649
commit ce64270b2c
No known key found for this signature in database
GPG Key ID: 076926596A536338
6 changed files with 152 additions and 3 deletions

View File

@ -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<IBaseAbility, Integer>::getKey)
.thenComparing(Map.Entry<IBaseAbility, Integer>::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<IWeaponAbility, Integer>::getKey)
.thenComparing(Map.Entry<IWeaponAbility, Integer>::getValue)
).forEach(entry -> {
IWeaponAbility ability = entry.getKey();
int level = entry.getValue();
list.add(" " + EnumChatFormatting.RED + ability.getFullName(level));
});
}

View File

@ -2,7 +2,7 @@ package com.hbm.handler.ability;
import net.minecraft.client.resources.I18n;
public interface IBaseAbility {
public interface IBaseAbility extends Comparable<IBaseAbility> {
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();
}
}

View File

@ -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];

View File

@ -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;

View File

@ -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) {

View File

@ -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) {