diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/src/main/java/net/levelz/data/LevelLists.java b/src/main/java/net/levelz/data/LevelLists.java index c5eee01e..18842613 100644 --- a/src/main/java/net/levelz/data/LevelLists.java +++ b/src/main/java/net/levelz/data/LevelLists.java @@ -1,6 +1,7 @@ package net.levelz.data; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public class LevelLists { @@ -60,26 +61,17 @@ public class LevelLists { public static final ArrayList compassList = new ArrayList(); // Misc public static final List> listOfAllLists = new ArrayList<>(); - // Player - public static final List> miningBlockList = new ArrayList>(); - public static final List miningLevelList = new ArrayList(); - - public static final List> brewingItemList = new ArrayList>(); - public static final List brewingLevelList = new ArrayList(); - public static final List potionList = new ArrayList(); - - public static final List> smithingItemList = new ArrayList>(); - public static final List smithingLevelList = new ArrayList(); - - public static final List> craftingItemList = new ArrayList>(); - public static final List craftingLevelList = new ArrayList(); - public static final List craftingSkillList = new ArrayList(); // Custom public static final ArrayList customBlockList = new ArrayList(); public static final ArrayList customItemList = new ArrayList(); public static final ArrayList customEntityList = new ArrayList(); + public static final HashMap> levelLists = new HashMap<>(); + public static final HashMap>> levelObjectsLists = new HashMap<>(); + public static final HashMap> levelExtraDataLists = new HashMap<>(); + public static final HashMap levelHasExtraData = new HashMap<>(); + public static ArrayList getList(String string) { switch (string) { // Item diff --git a/src/main/java/net/levelz/data/LevelLoader.java b/src/main/java/net/levelz/data/LevelLoader.java index c0c8066a..82739ddd 100644 --- a/src/main/java/net/levelz/data/LevelLoader.java +++ b/src/main/java/net/levelz/data/LevelLoader.java @@ -4,6 +4,7 @@ import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import org.apache.logging.log4j.LogManager; @@ -418,41 +419,61 @@ private void fillLists(JsonObject data, boolean addToExisting, int type, int ind } } + + private static final HashMap skillReferenceMap = new HashMap() {{ + put(1, "mining"); + put(2, "alchemy"); + put(3, "smithing"); + put(4, "crafting"); + }}; + + public static void addSkillReference(int id, String skill) { + if(skillReferenceMap.get(id) != null){ + throw new IllegalArgumentException("Skill reference already exists"); + } + skillReferenceMap.put(id, skill); + } + + public static String getReferencedSkillName(int reference){ + return skillReferenceMap.get(reference); + } + // type: 1 = mining; 2 = brewing; 3 = smithing; 4 = crafting private void sortAndFillLists(List levelList, List> objectList, int type) { // clear replace list for next usage replaceList.clear(); - if (type != 0) { - if (type == 1) { - LevelLists.miningLevelList.addAll(levelList); - LevelLists.miningLevelList.sort(Comparator.naturalOrder()); - for (int i = 0; i < levelList.size(); i++) - LevelLists.miningBlockList.add(i, objectList.get(levelList.indexOf(LevelLists.miningLevelList.get(i)))); - - } else if (type == 2) { - LevelLists.brewingLevelList.addAll(levelList); - LevelLists.brewingLevelList.sort(Comparator.naturalOrder()); - for (int i = 0; i < levelList.size(); i++) - LevelLists.brewingItemList.add(i, objectList.get(levelList.indexOf(LevelLists.brewingLevelList.get(i)))); - - } else if (type == 3) { - LevelLists.smithingLevelList.addAll(levelList); - LevelLists.smithingLevelList.sort(Comparator.naturalOrder()); - for (int i = 0; i < levelList.size(); i++) - LevelLists.smithingItemList.add(i, objectList.get(levelList.indexOf(LevelLists.smithingLevelList.get(i)))); - - } else if (type == 4) { - LevelLists.craftingLevelList.addAll(levelList); - LevelLists.craftingSkillList.addAll(skillList); - LevelLists.craftingItemList.addAll(objectList); - SortList.concurrentSort(LevelLists.craftingLevelList, LevelLists.craftingLevelList, LevelLists.craftingSkillList, LevelLists.craftingItemList); - this.skillList.clear(); + String skill = getReferencedSkillName(type); + if(skill == null) { + return; + } + + var levelListCopy = LevelLists.levelLists.getOrDefault(skill, new ArrayList<>()); + var objListCopy = LevelLists.levelObjectsLists.getOrDefault(skill, new ArrayList<>()); + levelListCopy.addAll(levelList); + + if(skillList.isEmpty()){ + levelListCopy.sort(Comparator.naturalOrder()); + for (int i = 0; i < levelList.size(); i++) { + objListCopy.add(i, objectList.get(levelList.indexOf(levelListCopy.get(i)))); } - this.objectList.clear(); - this.levelList.clear(); + }else{ + var extraList = LevelLists.levelExtraDataLists.getOrDefault(skill, new ArrayList<>()); + extraList.addAll(skillList); + objListCopy.addAll(objectList); + + SortList.concurrentSort(levelListCopy, levelListCopy, extraList, objListCopy); + + LevelLists.levelExtraDataLists.put(skill, extraList); + this.skillList.clear(); } + LevelLists.levelLists.put(skill, levelListCopy); + LevelLists.levelObjectsLists.put(skill, objListCopy); + + this.objectList.clear(); + this.levelList.clear(); + } public static void addAllInOneList() { @@ -568,15 +589,9 @@ public static void clearEveryList() { LevelLists.customItemList.clear(); LevelLists.customEntityList.clear(); - LevelLists.miningBlockList.clear(); - LevelLists.miningLevelList.clear(); - LevelLists.brewingItemList.clear(); - LevelLists.brewingLevelList.clear(); - LevelLists.smithingItemList.clear(); - LevelLists.smithingLevelList.clear(); - LevelLists.craftingItemList.clear(); - LevelLists.craftingLevelList.clear(); - LevelLists.craftingSkillList.clear(); + LevelLists.levelLists.clear(); + LevelLists.levelObjectsLists.clear(); + LevelLists.levelExtraDataLists.clear(); // Potion list isn't filled via levelz datapacks // LevelLists.potionList.clear(); } diff --git a/src/main/java/net/levelz/data/SkillArgumentType.java b/src/main/java/net/levelz/data/SkillArgumentType.java new file mode 100644 index 00000000..7b482653 --- /dev/null +++ b/src/main/java/net/levelz/data/SkillArgumentType.java @@ -0,0 +1,84 @@ +package net.levelz.data; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.SimpleCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import net.levelz.stats.Skill; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class SkillArgumentType implements ArgumentType { + + public static SkillArgumentType skill() { + return new SkillArgumentType(); + } + + public static List skillStrings() { + List skillStrings = new ArrayList<>(); + for(var skill: Skill.values()){ + skillStrings.add(skill.getName().toLowerCase()); + } + skillStrings.add("level"); + skillStrings.add("points"); + skillStrings.add("experience"); + return skillStrings; + } + + @Override + public String parse(StringReader reader) throws CommandSyntaxException { + int argBeginning = reader.getCursor(); // The starting position of the cursor is at the beginning of the argument. + if (!reader.canRead()) { + reader.skip(); + } + + // Now we check the contents of the argument till either we hit the end of the + // command line (when ''canRead'' becomes false) + // Otherwise we go till reach reach a space, which signifies the next argument + while (reader.canRead() && reader.peek() != ' ') { // peek provides the character at the current cursor position. + reader.skip(); // Tells the StringReader to move it's cursor to the next position. + } + + // Now we substring the specific part we want to see using the starting cursor + // position and the ends where the next argument starts. + String skillRawString = reader.getString().substring(argBeginning, reader.getCursor()); + try { + if(skillStrings().contains(skillRawString.toLowerCase())){ + return skillRawString.toLowerCase(); + } + // And we return our type, in this case the parser will consider this + // argument to have parsed properly and then move on. + } catch (Exception ex) { + // UUIDs can throw an exception when made by a string, so we catch the exception + // and repackage it into a CommandSyntaxException type. + // Create with context tells Brigadier to supply some context to tell the user + // where the command failed at. + // Though normal create method could be used. + throw new SimpleCommandExceptionType(Text.literal(ex.getMessage())).createWithContext(reader); + } + throw new SimpleCommandExceptionType(Text.literal("Invalid skill")).createWithContext(reader); + } + + @Override + public Collection getExamples() { + return skillStrings(); + } + + @Override + public CompletableFuture listSuggestions(final CommandContext context, final SuggestionsBuilder builder) { + for(var skillString: skillStrings()){ + if(skillString.startsWith(builder.getRemaining().toLowerCase())){ + builder.suggest(skillString); + } + } + return builder.buildFuture(); + } + +} diff --git a/src/main/java/net/levelz/init/CommandInit.java b/src/main/java/net/levelz/init/CommandInit.java index 925042d4..7e56d288 100644 --- a/src/main/java/net/levelz/init/CommandInit.java +++ b/src/main/java/net/levelz/init/CommandInit.java @@ -1,223 +1,80 @@ package net.levelz.init; import com.mojang.brigadier.arguments.IntegerArgumentType; - -import org.apache.commons.lang3.StringUtils; - +import com.mojang.brigadier.arguments.StringArgumentType; +import net.fabricmc.fabric.api.command.v2.ArgumentTypeRegistry; import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; import net.levelz.access.PlayerStatsManagerAccess; import net.levelz.access.PlayerSyncAccess; +import net.levelz.data.SkillArgumentType; import net.levelz.network.PlayerStatsServerPacket; import net.levelz.stats.PlayerStatsManager; import net.levelz.stats.Skill; import net.minecraft.command.argument.EntityArgumentType; +import net.minecraft.command.argument.serialize.ConstantArgumentSerializer; import net.minecraft.entity.attribute.EntityAttributes; import net.minecraft.item.ArmorItem; import net.minecraft.item.Item; import net.minecraft.item.ToolItem; import net.minecraft.network.packet.s2c.play.PlayerListS2CPacket; -import net.minecraft.server.command.CommandManager; +import static net.minecraft.server.command.CommandManager.argument; +import static net.minecraft.server.command.CommandManager.literal; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.text.Text; +import net.minecraft.util.Identifier; +import net.minecraft.util.Pair; import net.minecraft.util.math.MathHelper; +import org.apache.commons.lang3.StringUtils; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; public class CommandInit { public static void init() { + ArgumentTypeRegistry.registerArgumentType(new Identifier("levelz", "skill"), SkillArgumentType.class, ConstantArgumentSerializer.of(SkillArgumentType::skill)); CommandRegistrationCallback.EVENT.register((dispatcher, dedicated, environment) -> { - dispatcher.register((CommandManager.literal("info").requires((serverCommandSource) -> { - return serverCommandSource.hasPermissionLevel(3); - })).then(CommandManager.literal("material").executes((commandContext) -> { - return executeInfoMaterial(commandContext.getSource()); - }))); + dispatcher.register((literal("info").requires((serverCommandSource) -> serverCommandSource.hasPermissionLevel(3))).then(literal("material").executes((commandContext) -> executeInfoMaterial(commandContext.getSource())))); }); - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated, environment) -> { - dispatcher.register((CommandManager.literal("playerstats").requires((serverCommandSource) -> { - return serverCommandSource.hasPermissionLevel(2); - })).then(CommandManager.argument("targets", EntityArgumentType.players()) - // Add values - .then(CommandManager.literal("add").then(CommandManager.literal("level").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "level", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("points").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "points", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("health").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "health", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("strength").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "strength", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("agility").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "agility", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("defense").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "defense", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("stamina").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "stamina", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("luck").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "luck", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("archery").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "archery", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("trade").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "trade", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("smithing").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "smithing", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("mining").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "mining", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("farming").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "farming", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("alchemy").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "alchemy", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - }))).then(CommandManager.literal("experience").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "experience", - IntegerArgumentType.getInteger(commandContext, "level"), 0); - })))) - // Remove values - .then(CommandManager.literal("remove").then(CommandManager.literal("level").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "level", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("points").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "points", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("health").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "health", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("strength").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "strength", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("agility").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "agility", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("defense").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "defense", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("stamina").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "stamina", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("luck").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "luck", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("archery").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "archery", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("trade").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "trade", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("smithing").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "smithing", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("mining").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "mining", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("farming").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "farming", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("alchemy").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "alchemy", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - }))).then(CommandManager.literal("experience").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "experience", - IntegerArgumentType.getInteger(commandContext, "level"), 1); - })))) - // Set values - .then(CommandManager.literal("set").then(CommandManager.literal("level").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "level", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("points").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "points", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("health").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "health", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("strength").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "strength", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("agility").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "agility", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("defense").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "defense", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("stamina").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "stamina", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("luck").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "luck", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("archery").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "archery", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("trade").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "trade", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("smithing").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "smithing", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("mining").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "mining", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("farming").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "farming", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("alchemy").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "alchemy", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - }))).then(CommandManager.literal("experience").then(CommandManager.argument("level", IntegerArgumentType.integer()).executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "experience", - IntegerArgumentType.getInteger(commandContext, "level"), 2); - })))) - // Print values - .then(CommandManager.literal("get").then(CommandManager.literal("level").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "level", 0, 3); - })).then(CommandManager.literal("all").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "all", 0, 3); - })).then(CommandManager.literal("points").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "points", 0, 3); - })).then(CommandManager.literal("health").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "health", 0, 3); - })).then(CommandManager.literal("strength").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "strength", 0, 3); - })).then(CommandManager.literal("agility").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "agility", 0, 3); - })).then(CommandManager.literal("defense").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "defense", 0, 3); - })).then(CommandManager.literal("stamina").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "stamina", 0, 3); - })).then(CommandManager.literal("luck").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "luck", 0, 3); - })).then(CommandManager.literal("archery").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "archery", 0, 3); - })).then(CommandManager.literal("trade").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "trade", 0, 3); - })).then(CommandManager.literal("smithing").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "smithing", 0, 3); - })).then(CommandManager.literal("mining").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "mining", 0, 3); - })).then(CommandManager.literal("farming").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "farming", 0, 3); - })).then(CommandManager.literal("alchemy").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "alchemy", 0, 3); - })).then(CommandManager.literal("experience").executes((commandContext) -> { - return executeSkillCommand(commandContext.getSource(), EntityArgumentType.getPlayers(commandContext, "targets"), "experience", 0, 3); - }))))); - }); + final var playerstatArgumentBuilder = (literal("playerstats").requires((serverCommandSource) -> serverCommandSource.hasPermissionLevel(2))) + .then(argument("targets", EntityArgumentType.players()) + .then(argument("command", StringArgumentType.string()).suggests((commandContext, suggestionsBuilder) -> { + suggestionsBuilder.suggest("add"); + suggestionsBuilder.suggest("remove"); + suggestionsBuilder.suggest("set"); + suggestionsBuilder.suggest("get"); + return suggestionsBuilder.buildFuture(); + }) + .then(argument("skill", SkillArgumentType.skill()) + .then(argument("value", IntegerArgumentType.integer(0, ConfigInit.CONFIG.maxLevel)) + .executes((commandContext) -> { + int reference = switch (commandContext.getArgument("command", String.class)) { + case "add" -> 0; + case "remove" -> 1; + case "set" -> 2; + case "get" -> 3; + default -> throw new IllegalStateException("Unexpected value: " + commandContext.getArgument("command", String.class)); + }; + if(reference == 3){ + return executeSkillCommand( + commandContext.getSource(), + EntityArgumentType.getPlayers(commandContext, "targets"), + commandContext.getArgument("skill", String.class), + 0, + reference); + } + return executeSkillCommand( + commandContext.getSource(), + EntityArgumentType.getPlayers(commandContext, "targets"), + commandContext.getArgument("skill", String.class), + commandContext.getArgument("value", Integer.class), + reference); + } + ))))); + + CommandRegistrationCallback.EVENT.register((dispatcher, dedicated, environment) -> dispatcher.register(playerstatArgumentBuilder)); } // Reference 0:Add, 1:Remove, 2:Set, 3:Print @@ -269,13 +126,13 @@ private static int executeSkillCommand(ServerCommandSource source, Collection Text.translatable("commands.playerstats.printProgress", serverPlayerEntity.getDisplayName(), (int) (playerStatsManager.getLevelProgress() * playerStatsManager.getNextLevelExperience()), playerStatsManager.getNextLevelExperience()), true); } else { - final String finalSkill = skillStrings().get(u); + final String finalSkill = SkillArgumentType.skillStrings().get(u); source.sendFeedback(() -> Text.translatable("commands.playerstats.printLevel", serverPlayerEntity.getDisplayName(), StringUtils.capitalize(finalSkill) + (finalSkill.equals("level") || finalSkill.equals("points") ? ":" : " Level:"), finalSkill.equals("level") ? playerStatsManager.getOverallLevel() @@ -344,8 +201,4 @@ private static int executeInfoMaterial(ServerCommandSource source) { return 1; } - private static List skillStrings() { - return List.of("agility", "alchemy", "archery", "defense", "farming", "health", "luck", "mining", "smithing", "stamina", "strength", "trade", "level", "points", "experience"); - } - } \ No newline at end of file diff --git a/src/main/java/net/levelz/mixin/item/ItemStackClientMixin.java b/src/main/java/net/levelz/mixin/item/ItemStackClientMixin.java index 2ebc3bc4..bb55239c 100644 --- a/src/main/java/net/levelz/mixin/item/ItemStackClientMixin.java +++ b/src/main/java/net/levelz/mixin/item/ItemStackClientMixin.java @@ -309,9 +309,9 @@ private List getAdditionalTooltip(PlayerEntity player) { list.add(Text.translatable("item.levelz.smithing_restriction.tooltip", PlayerStatsManager.getUnlockLevel(itemId, 3)).formatted(Formatting.RED)); } if (PlayerStatsManager.listContainsItemOrBlock(player, itemId, 4)) - for (int i = 0; i < LevelLists.craftingItemList.size(); i++) { - if (LevelLists.craftingItemList.get(i).contains(itemId)) { - list.add(Text.translatable("item.levelz.crafting_restriction.tooltip", StringUtils.capitalize(LevelLists.craftingSkillList.get(i)), PlayerStatsManager.getUnlockLevel(itemId, 4)) + for (int i = 0; i < LevelLists.levelObjectsLists.getOrDefault("crafting", new ArrayList<>()).size(); i++) { + if (LevelLists.levelObjectsLists.get("crafting").get(i).contains(itemId)) { + list.add(Text.translatable("item.levelz.crafting_restriction.tooltip", StringUtils.capitalize((String)LevelLists.levelExtraDataLists.get("crafting").get(i)), PlayerStatsManager.getUnlockLevel(itemId, 4)) .formatted(Formatting.RED)); break; } diff --git a/src/main/java/net/levelz/mixin/misc/BrewingRecipeRegistryMixin.java b/src/main/java/net/levelz/mixin/misc/BrewingRecipeRegistryMixin.java index 44f49ea2..b0a6b224 100644 --- a/src/main/java/net/levelz/mixin/misc/BrewingRecipeRegistryMixin.java +++ b/src/main/java/net/levelz/mixin/misc/BrewingRecipeRegistryMixin.java @@ -15,14 +15,18 @@ import net.minecraft.potion.Potions; import net.minecraft.recipe.BrewingRecipeRegistry; +import java.util.ArrayList; + @Mixin(BrewingRecipeRegistry.class) public class BrewingRecipeRegistryMixin { @Inject(method = "registerPotionRecipe", at = @At(value = "HEAD")) private static void registerPotionRecipe(Potion input, Item item, Potion output, CallbackInfo info) { if (output != Potions.MUNDANE && output != Potions.THICK) { - LevelLists.potionList.add(item); - LevelLists.potionList.add(output); + var potionList = LevelLists.levelExtraDataLists.getOrDefault("alchemy", new ArrayList<>()); + potionList.add(item); + potionList.add(output); + LevelLists.levelExtraDataLists.put("alchemy", potionList); } } diff --git a/src/main/java/net/levelz/network/PlayerStatsClientPacket.java b/src/main/java/net/levelz/network/PlayerStatsClientPacket.java index a0bad6ee..759be198 100644 --- a/src/main/java/net/levelz/network/PlayerStatsClientPacket.java +++ b/src/main/java/net/levelz/network/PlayerStatsClientPacket.java @@ -30,6 +30,9 @@ public static void init() { client.execute(() -> { PlayerStatsManager playerStatsManager = ((PlayerStatsManagerAccess) client.player).getPlayerStatsManager(); Skill skill = Skill.valueOf(skillString); + if(skill == null){ + return; + } playerStatsManager.setSkillLevel(skill, level); playerStatsManager.setSkillPoints(points); @@ -38,14 +41,7 @@ public static void init() { playerStatsManager.getPlayerEntity().getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE) .setBaseValue(ConfigInit.CONFIG.attackBase + (double) playerStatsManager.getSkillLevel(Skill.STRENGTH) * ConfigInit.CONFIG.attackBonus); } - PlayerStatsServerPacket.syncLockedCraftingItemList(playerStatsManager); - switch (skill) { - case SMITHING -> PlayerStatsServerPacket.syncLockedSmithingItemList(playerStatsManager); - case MINING -> PlayerStatsServerPacket.syncLockedBlockList(playerStatsManager); - case ALCHEMY -> PlayerStatsServerPacket.syncLockedBrewingItemList(playerStatsManager); - default -> { - } - } + PlayerStatsServerPacket.syncLockedLists(playerStatsManager); }); }); @@ -65,18 +61,9 @@ public static void init() { newBuffer.writeInt(buf.readInt()); newBuffer.writeInt(buf.readInt()); newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); - newBuffer.writeInt(buf.readInt()); + for(int i = 0; i < Skill.getSkillCount(); i++){ + newBuffer.writeInt(buf.readInt()); + } client.execute(() -> { executeLevelPacket(client.player, newBuffer); }); @@ -106,22 +93,26 @@ public static void init() { // Sync attributes on client client.execute(() -> { Skill skill = Skill.valueOf(skillString.toUpperCase()); + if(skill == null){ + return; + } + PlayerStatsManager playerStatsManager = ((PlayerStatsManagerAccess) client.player).getPlayerStatsManager(); int skillLevel = playerStatsManager.getSkillLevel(skill); playerStatsManager.setSkillPoints(playerStatsManager.getSkillPoints() + skillLevel); playerStatsManager.setSkillLevel(skill, 0); - switch (skill) { - case HEALTH -> { + if (skill.equals(Skill.HEALTH)) { client.player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).setBaseValue(ConfigInit.CONFIG.healthBase); client.player.setHealth(client.player.getMaxHealth()); - } - case STRENGTH -> client.player.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE).setBaseValue(ConfigInit.CONFIG.attackBase); - case AGILITY -> client.player.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED).setBaseValue(ConfigInit.CONFIG.movementBase); - case DEFENSE -> client.player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR).setBaseValue(ConfigInit.CONFIG.defenseBase); - case LUCK -> client.player.getAttributeInstance(EntityAttributes.GENERIC_LUCK).setBaseValue(ConfigInit.CONFIG.luckBase); - default -> { - } + } else if (skill.equals(Skill.STRENGTH)) { + client.player.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE).setBaseValue(ConfigInit.CONFIG.attackBase); + } else if (skill.equals(Skill.AGILITY)) { + client.player.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED).setBaseValue(ConfigInit.CONFIG.movementBase); + } else if (skill.equals(Skill.DEFENSE)) { + client.player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR).setBaseValue(ConfigInit.CONFIG.defenseBase); + } else if (skill.equals(Skill.LUCK)) { + client.player.getAttributeInstance(EntityAttributes.GENERIC_LUCK).setBaseValue(ConfigInit.CONFIG.luckBase); } }); @@ -282,7 +273,7 @@ public static void writeC2SIncreaseLevelPacket(PlayerStatsManager playerStatsMan } PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); - buf.writeString(skill.name()); + buf.writeString(skill.getName()); buf.writeInt(level); CustomPayloadC2SPacket packet = new CustomPayloadC2SPacket(PlayerStatsServerPacket.STATS_INCREASE_PACKET, buf); @@ -318,10 +309,7 @@ private static void executeLevelPacket(PlayerEntity player, PacketByteBuf buf) { playerStatsManager.setSkillLevel(skill, buf.readInt()); } // Set unlocked list - PlayerStatsServerPacket.syncLockedBlockList(playerStatsManager); - PlayerStatsServerPacket.syncLockedBrewingItemList(playerStatsManager); - PlayerStatsServerPacket.syncLockedSmithingItemList(playerStatsManager); - PlayerStatsServerPacket.syncLockedCraftingItemList(playerStatsManager); + PlayerStatsServerPacket.syncLockedLists(playerStatsManager); } private static void executeListPacket(PacketByteBuf buf, ClientPlayerEntity player) { @@ -344,43 +332,32 @@ private static void executeListPacket(PacketByteBuf buf, ClientPlayerEntity play for (int u = negativeCount; u < count; u++) { addToList(listName, list.get(i + u)); } - } else if (listName.equals("mining:level")) { - List blockList = new ArrayList<>(); - LevelLists.miningLevelList.add(Integer.parseInt(list.get(i + 1))); - for (int u = i + 2; u < list.size(); u++) { - if (list.get(u).equals("mining:level") || list.get(u).equals("brewing:level")) - break; - blockList.add(Integer.parseInt(list.get(u))); - } - LevelLists.miningBlockList.add(blockList); - } else if (listName.equals("brewing:level")) { - List brewingItemList = new ArrayList<>(); - LevelLists.brewingLevelList.add(Integer.parseInt(list.get(i + 1))); - for (int u = i + 2; u < list.size(); u++) { - if (list.get(u).equals("brewing:level") || list.get(u).equals("smithing:level")) - break; - brewingItemList.add(Integer.parseInt(list.get(u))); + } else if (listName.endsWith(":level")) { + String skillName = listName.substring(0, listName.length() - 6); + boolean hasExtraData = LevelLists.levelHasExtraData.getOrDefault(skillName, false); + + var levelList = LevelLists.levelLists.getOrDefault(skillName, new ArrayList<>()); + levelList.add(Integer.parseInt(list.get(i + 1))); + LevelLists.levelLists.put(skillName, levelList); + + if(hasExtraData){ + var extraDataList = LevelLists.levelExtraDataLists.getOrDefault(skillName, new ArrayList<>()); + extraDataList.add(list.get(i + 2)); + LevelLists.levelExtraDataLists.put(skillName, extraDataList); } - LevelLists.brewingItemList.add(brewingItemList); - } else if (listName.equals("smithing:level")) { - List smithingItemList = new ArrayList<>(); - LevelLists.smithingLevelList.add(Integer.parseInt(list.get(i + 1))); - for (int u = i + 2; u < list.size(); u++) { - if (list.get(u).equals("smithing:level") || list.get(u).equals("crafting:level")) - break; - smithingItemList.add(Integer.parseInt(list.get(u))); - } - LevelLists.smithingItemList.add(smithingItemList); - } else if (listName.equals("crafting:level")) { - List craftingItemList = new ArrayList<>(); - LevelLists.craftingLevelList.add(Integer.parseInt(list.get(i + 1))); - LevelLists.craftingSkillList.add(String.valueOf(list.get(i + 2))); - for (int u = i + 3; u < list.size(); u++) { - if (list.get(u).equals("crafting:level")) + + var blockListList = LevelLists.levelObjectsLists.getOrDefault(skillName, new ArrayList<>()); + var blockList = new ArrayList(); + + for (int u = i + (hasExtraData ? 3 : 2); u < list.size(); u++) { + if (list.get(u).contains(":level")){ break; - craftingItemList.add(Integer.parseInt(list.get(u))); + } + blockList.add(Integer.parseInt(list.get(u))); } - LevelLists.craftingItemList.add(craftingItemList); + + blockListList.add(blockList); + LevelLists.levelObjectsLists.put(skillName, blockListList); } } LevelLists.listOfAllLists.clear(); @@ -395,10 +372,7 @@ private static void executeListPacket(PacketByteBuf buf, ClientPlayerEntity play player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR) .setBaseValue(ConfigInit.CONFIG.defenseBase + (double) playerStatsManager.getSkillLevel(Skill.DEFENSE) * ConfigInit.CONFIG.defenseBonus); player.getAttributeInstance(EntityAttributes.GENERIC_LUCK).setBaseValue(ConfigInit.CONFIG.luckBase + (double) playerStatsManager.getSkillLevel(Skill.LUCK) * ConfigInit.CONFIG.luckBonus); - PlayerStatsServerPacket.syncLockedBlockList(playerStatsManager); - PlayerStatsServerPacket.syncLockedBrewingItemList(playerStatsManager); - PlayerStatsServerPacket.syncLockedSmithingItemList(playerStatsManager); - PlayerStatsServerPacket.syncLockedCraftingItemList(playerStatsManager); + PlayerStatsServerPacket.syncLockedLists(playerStatsManager); } private static void addToList(String listName, String object) { diff --git a/src/main/java/net/levelz/network/PlayerStatsServerPacket.java b/src/main/java/net/levelz/network/PlayerStatsServerPacket.java index 77cf125c..be837d3b 100644 --- a/src/main/java/net/levelz/network/PlayerStatsServerPacket.java +++ b/src/main/java/net/levelz/network/PlayerStatsServerPacket.java @@ -20,6 +20,7 @@ import net.minecraft.network.packet.s2c.play.CustomPayloadS2CPacket; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.util.Identifier; +import org.jetbrains.annotations.NotNull; public class PlayerStatsServerPacket { @@ -45,7 +46,7 @@ public static void init() { PlayerStatsManager playerStatsManager = ((PlayerStatsManagerAccess) player).getPlayerStatsManager(); if (playerStatsManager.getSkillPoints() - level >= 0) { Skill skill = Skill.valueOf(skillString); - if (!ConfigInit.CONFIG.allowHigherSkillLevel && playerStatsManager.getSkillLevel(skill) >= ConfigInit.CONFIG.maxLevel) { + if ((!ConfigInit.CONFIG.allowHigherSkillLevel && playerStatsManager.getSkillLevel(skill) >= ConfigInit.CONFIG.maxLevel) || skill == null) { return; } @@ -54,27 +55,24 @@ public static void init() { } playerStatsManager.setSkillLevel(skill, playerStatsManager.getSkillLevel(skill) + level); playerStatsManager.setSkillPoints(playerStatsManager.getSkillPoints() - level); - switch (skill) { - case HEALTH -> { + if (skill.equals(Skill.HEALTH)) { player.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH) - .setBaseValue(player.getAttributeBaseValue(EntityAttributes.GENERIC_MAX_HEALTH) + ConfigInit.CONFIG.healthBonus * level); + .setBaseValue(player.getAttributeBaseValue(EntityAttributes.GENERIC_MAX_HEALTH) + ConfigInit.CONFIG.healthBonus * level); player.setHealth(player.getHealth() + (float) ConfigInit.CONFIG.healthBonus * level); - } - case STRENGTH -> player.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE) + } else if (skill.equals(Skill.STRENGTH)) { + player.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE) .setBaseValue(player.getAttributeBaseValue(EntityAttributes.GENERIC_ATTACK_DAMAGE) + ConfigInit.CONFIG.attackBonus * level); - case AGILITY -> player.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED) + } else if (skill.equals(Skill.AGILITY)) { + player.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED) .setBaseValue(player.getAttributeBaseValue(EntityAttributes.GENERIC_MOVEMENT_SPEED) + ConfigInit.CONFIG.movementBonus * level); - case DEFENSE -> player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR) + } else if (skill.equals(Skill.DEFENSE)) { + player.getAttributeInstance(EntityAttributes.GENERIC_ARMOR) .setBaseValue(player.getAttributeBaseValue(EntityAttributes.GENERIC_ARMOR) + ConfigInit.CONFIG.defenseBonus * level); - case LUCK -> player.getAttributeInstance(EntityAttributes.GENERIC_LUCK) + } else if (skill.equals(Skill.LUCK)) { + player.getAttributeInstance(EntityAttributes.GENERIC_LUCK) .setBaseValue(player.getAttributeBaseValue(EntityAttributes.GENERIC_LUCK) + ConfigInit.CONFIG.luckBonus * level); - case MINING -> syncLockedBlockList(playerStatsManager); - case ALCHEMY -> syncLockedBrewingItemList(playerStatsManager); - case SMITHING -> syncLockedSmithingItemList(playerStatsManager); - default -> { - } } - syncLockedCraftingItemList(playerStatsManager); + syncLockedLists(playerStatsManager); writeS2CSyncLevelPacket(playerStatsManager, player, skill); } @@ -98,7 +96,7 @@ public static void init() { public static void writeS2CSyncLevelPacket(PlayerStatsManager playerStatsManager, ServerPlayerEntity serverPlayerEntity, Skill skill) { PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); - buf.writeString(skill.name()); + buf.writeString(skill.getName()); buf.writeInt(playerStatsManager.getSkillLevel(skill)); buf.writeInt(playerStatsManager.getSkillPoints()); CustomPayloadS2CPacket packet = new CustomPayloadS2CPacket(STATS_SYNC_PACKET, buf); @@ -125,10 +123,7 @@ public static void writeS2CSkillPacket(PlayerStatsManager playerStatsManager, Se } // Set on server - syncLockedBlockList(playerStatsManager); - syncLockedBrewingItemList(playerStatsManager); - syncLockedSmithingItemList(playerStatsManager); - syncLockedCraftingItemList(playerStatsManager); + syncLockedLists(playerStatsManager); CustomPayloadS2CPacket packet = new CustomPayloadS2CPacket(LEVEL_PACKET, buf); serverPlayerEntity.networkHandler.sendPacket(packet); @@ -141,49 +136,19 @@ public static void writeS2CStrengthPacket(ServerPlayerEntity serverPlayerEntity) serverPlayerEntity.networkHandler.sendPacket(packet); } - public static void syncLockedBlockList(PlayerStatsManager playerStatsManager) { - playerStatsManager.lockedBlockIds.clear(); - for (int i = 0; i < LevelLists.miningLevelList.size(); i++) { - if (LevelLists.miningLevelList.get(i) > playerStatsManager.getSkillLevel(Skill.MINING)) { - for (int u = 0; u < LevelLists.miningBlockList.get(i).size(); u++) { - if (!playerStatsManager.lockedBlockIds.contains(LevelLists.miningBlockList.get(i).get(u))) - playerStatsManager.lockedBlockIds.add(LevelLists.miningBlockList.get(i).get(u)); - } - } - } - } - - public static void syncLockedBrewingItemList(PlayerStatsManager playerStatsManager) { - playerStatsManager.lockedbrewingItemIds.clear(); - for (int i = 0; i < LevelLists.brewingLevelList.size(); i++) { - if (LevelLists.brewingLevelList.get(i) > playerStatsManager.getSkillLevel(Skill.ALCHEMY)) { - for (int u = 0; u < LevelLists.brewingItemList.get(i).size(); u++) { - if (!playerStatsManager.lockedbrewingItemIds.contains(LevelLists.brewingItemList.get(i).get(u))) - playerStatsManager.lockedbrewingItemIds.add(LevelLists.brewingItemList.get(i).get(u)); - } - } - } - } - - public static void syncLockedSmithingItemList(PlayerStatsManager playerStatsManager) { - playerStatsManager.lockedSmithingItemIds.clear(); - for (int i = 0; i < LevelLists.smithingLevelList.size(); i++) { - if (LevelLists.smithingLevelList.get(i) > playerStatsManager.getSkillLevel(Skill.SMITHING)) { - for (int u = 0; u < LevelLists.smithingItemList.get(i).size(); u++) { - if (!playerStatsManager.lockedSmithingItemIds.contains(LevelLists.smithingItemList.get(i).get(u))) - playerStatsManager.lockedSmithingItemIds.add(LevelLists.smithingItemList.get(i).get(u)); - } - } - } - } - - public static void syncLockedCraftingItemList(PlayerStatsManager playerStatsManager) { - playerStatsManager.lockedCraftingItemIds.clear(); - for (int i = 0; i < LevelLists.craftingLevelList.size(); i++) { - if (LevelLists.craftingLevelList.get(i) > playerStatsManager.getSkillLevel(Skill.valueOf(LevelLists.craftingSkillList.get(i).toString().toUpperCase()))) { - for (int u = 0; u < LevelLists.craftingItemList.get(i).size(); u++) { - if (!playerStatsManager.lockedCraftingItemIds.contains(LevelLists.craftingItemList.get(i).get(u))) - playerStatsManager.lockedCraftingItemIds.add(LevelLists.craftingItemList.get(i).get(u)); + public static void syncLockedLists(PlayerStatsManager playerStatsManager){ + playerStatsManager.lockedIds.clear(); + for (var entry:LevelLists.levelLists.entrySet()){ + String skillName = entry.getKey(); + for(int i = 0; i < entry.getValue().size(); i++){ + if(entry.getValue().get(i) > playerStatsManager.getSkillLevel(Skill.valueOf(skillName))){ + var lockedIds = playerStatsManager.lockedIds.getOrDefault(skillName, new ArrayList<>()); + for (Integer integer : LevelLists.levelObjectsLists.get(skillName).get(i)) { + if (!lockedIds.contains(integer)){ + lockedIds.add(integer); + } + } + playerStatsManager.lockedIds.put(skillName, lockedIds); } } } @@ -221,57 +186,43 @@ public static void writeS2CListPacket(ServerPlayerEntity serverPlayerEntity) { buf.writeString(list.get(u).toString()); } } - for (int k = 0; k < LevelLists.miningLevelList.size(); k++) { - buf.writeString("mining:level"); - buf.writeString(LevelLists.miningLevelList.get(k).toString()); - for (int u = 0; u < LevelLists.miningBlockList.get(k).size(); u++) { - buf.writeString(LevelLists.miningBlockList.get(k).get(u).toString()); - } - } - for (int k = 0; k < LevelLists.brewingLevelList.size(); k++) { - buf.writeString("brewing:level"); - buf.writeString(LevelLists.brewingLevelList.get(k).toString()); - for (int u = 0; u < LevelLists.brewingItemList.get(k).size(); u++) { - buf.writeString(LevelLists.brewingItemList.get(k).get(u).toString()); - } - } - for (int k = 0; k < LevelLists.smithingLevelList.size(); k++) { - buf.writeString("smithing:level"); - buf.writeString(LevelLists.smithingLevelList.get(k).toString()); - for (int u = 0; u < LevelLists.smithingItemList.get(k).size(); u++) { - buf.writeString(LevelLists.smithingItemList.get(k).get(u).toString()); - } - } - for (int k = 0; k < LevelLists.craftingLevelList.size(); k++) { - buf.writeString("crafting:level"); - buf.writeString(LevelLists.craftingLevelList.get(k).toString()); - buf.writeString(LevelLists.craftingSkillList.get(k).toString()); - for (int u = 0; u < LevelLists.craftingItemList.get(k).size(); u++) { - buf.writeString(LevelLists.craftingItemList.get(k).get(u).toString()); + + for(var skillEntry: LevelLists.levelLists.entrySet()){ + String skillName = skillEntry.getKey(); + for(int k = 0; k < skillEntry.getValue().size(); k++){ + buf.writeString(skillName+":level"); + buf.writeString(skillEntry.getValue().get(k).toString()); + if(LevelLists.levelHasExtraData.getOrDefault(skillName, false)){ + buf.writeString(LevelLists.levelExtraDataLists.get(skillName).get(k).toString()); + } + var objectList = LevelLists.levelObjectsLists.get(skillName).get(k); + for (Integer integer : objectList) { + buf.writeString(integer.toString()); + } } } CustomPayloadS2CPacket packet = new CustomPayloadS2CPacket(LIST_PACKET, buf); serverPlayerEntity.networkHandler.sendPacket(packet); } - public static void writeS2CResetSkillPacket(ServerPlayerEntity serverPlayerEntity, Skill skill) { + public static void writeS2CResetSkillPacket(ServerPlayerEntity serverPlayerEntity, @NotNull Skill skill) { // Sync attributes on server PlayerStatsManager playerStatsManager = ((PlayerStatsManagerAccess) serverPlayerEntity).getPlayerStatsManager(); int skillLevel = playerStatsManager.getSkillLevel(skill); - switch (skill) { - case HEALTH -> { + if (skill.equals(Skill.HEALTH)) { serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_MAX_HEALTH).setBaseValue(ConfigInit.CONFIG.healthBase + skillLevel * ConfigInit.CONFIG.healthBonus); serverPlayerEntity.setHealth(serverPlayerEntity.getMaxHealth()); - } - case STRENGTH -> serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE).setBaseValue(ConfigInit.CONFIG.attackBase + skillLevel * ConfigInit.CONFIG.attackBonus); - case AGILITY -> serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED).setBaseValue(ConfigInit.CONFIG.movementBase + skillLevel * ConfigInit.CONFIG.movementBonus); - case DEFENSE -> serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_ARMOR).setBaseValue(ConfigInit.CONFIG.defenseBase + skillLevel * ConfigInit.CONFIG.defenseBonus); - case LUCK -> serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_LUCK).setBaseValue(ConfigInit.CONFIG.luckBase + skillLevel * ConfigInit.CONFIG.luckBonus); - default -> { - } + } else if (skill.equals(Skill.STRENGTH)) { + serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_ATTACK_DAMAGE).setBaseValue(ConfigInit.CONFIG.attackBase + skillLevel * ConfigInit.CONFIG.attackBonus); + } else if (skill.equals(Skill.AGILITY)) { + serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_MOVEMENT_SPEED).setBaseValue(ConfigInit.CONFIG.movementBase + skillLevel * ConfigInit.CONFIG.movementBonus); + } else if (skill.equals(Skill.DEFENSE)) { + serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_ARMOR).setBaseValue(ConfigInit.CONFIG.defenseBase + skillLevel * ConfigInit.CONFIG.defenseBonus); + } else if (skill.equals(Skill.LUCK)) { + serverPlayerEntity.getAttributeInstance(EntityAttributes.GENERIC_LUCK).setBaseValue(ConfigInit.CONFIG.luckBase + skillLevel * ConfigInit.CONFIG.luckBonus); } PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); - buf.writeString(skill.name()); + buf.writeString(skill.getName()); CustomPayloadS2CPacket packet = new CustomPayloadS2CPacket(RESET_PACKET, buf); serverPlayerEntity.networkHandler.sendPacket(packet); } diff --git a/src/main/java/net/levelz/screen/ISkillInfoScreen.java b/src/main/java/net/levelz/screen/ISkillInfoScreen.java new file mode 100644 index 00000000..e0a9cbdb --- /dev/null +++ b/src/main/java/net/levelz/screen/ISkillInfoScreen.java @@ -0,0 +1,15 @@ +package net.levelz.screen; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; + +import java.util.ArrayList; + +public interface ISkillInfoScreen { + String getStat(); + default T getSkillList(int x, int y, TextRenderer textRenderer, MinecraftClient client){ + return null; + } + + ArrayList getWidgets(int x, int y, TextRenderer textRenderer); +} diff --git a/src/main/java/net/levelz/screen/IconsStitcher.java b/src/main/java/net/levelz/screen/IconsStitcher.java new file mode 100644 index 00000000..3428662c --- /dev/null +++ b/src/main/java/net/levelz/screen/IconsStitcher.java @@ -0,0 +1,45 @@ +package net.levelz.screen; + +import net.levelz.init.RenderInit; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.util.Identifier; +import net.minecraft.util.Pair; + +import java.util.ArrayList; + +public class IconsStitcher{ + private static final ArrayList>> textures = new ArrayList<>(); + private static final int DEFAULT_SIZE = 16; + + static{ + addTexture(RenderInit.GUI_ICONS, 192, 256); + } + + public static void addTexture(Identifier texture){ + addTexture(texture, DEFAULT_SIZE, DEFAULT_SIZE); + } + + public static void addTexture(Identifier texture, int sizeX, int sizeY){ + textures.add(new Pair<>(texture, new Pair<>(sizeX, sizeY))); + } + + public static void drawTexture(DrawContext context, int x, int y, int u, int v, int width, int height){ + int totalOffset = 0; + for(var entry : textures){ + final Identifier taxtureID = entry.getLeft(); + final int textureWidth = entry.getRight().getLeft(); + final int textureHeight = entry.getRight().getRight(); + + if (u - totalOffset >= textureWidth){ + totalOffset = totalOffset + textureWidth; + continue; + } + + final int texposX = u - totalOffset; + final int texposY = v % textureHeight; + context.drawTexture(taxtureID, x, y, texposX, texposY, width, height); + return; + } + } + +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreen.java index ed95f2b0..2773b0dd 100644 --- a/src/main/java/net/levelz/screen/SkillInfoScreen.java +++ b/src/main/java/net/levelz/screen/SkillInfoScreen.java @@ -1,14 +1,12 @@ package net.levelz.screen; -import java.text.DecimalFormat; import java.util.ArrayList; -import java.util.List; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.levelz.init.ConfigInit; import net.levelz.init.KeyInit; -import net.levelz.screen.widget.SkillScrollableWidget; +import net.levelz.screen.SkillInfoScreens.*; import net.libz.api.Tab; import net.libz.util.DrawTabHelper; import net.minecraft.client.gui.DrawContext; @@ -21,21 +19,32 @@ public class SkillInfoScreen extends Screen implements Tab { public static final Identifier BACKGROUND_TEXTURE = new Identifier("levelz:textures/gui/skill_info_background.png"); - private int backgroundWidth = 200; - private int backgroundHeight = 215; + private final int backgroundWidth = 200; + private final int backgroundHeight = 215; private int x; private int y; private final String title; - private Text translatableText1A = null; - private Text translatableText1B = null; - private Text translatableText2A = null; - private Text translatableText2B = null; - private Text translatableText3A = null; - private Text translatableText3B = null; - private Text translatableText6A = null; - private Text translatableText6B = null; + private static final ArrayList infoScreens = new ArrayList<>(); + static { + infoScreens.add(new HealthInfoScreen()); + infoScreens.add(new StrengthInfoScreen()); + infoScreens.add(new AgilityInfoScreen()); + infoScreens.add(new DefenseInfoScreen()); + infoScreens.add(new StaminaInfoScreen()); + infoScreens.add(new LuckInfoScreen()); + infoScreens.add(new ArcheryInfoScreen()); + infoScreens.add(new TradeInfoScreen()); + infoScreens.add(new SmithingInfoScreen()); + infoScreens.add(new MiningInfoScreen()); + infoScreens.add(new FarmingInfoScreen()); + infoScreens.add(new AlchemyInfoScreen()); + } + + public static void addScreen(ISkillInfoScreen screen){ + infoScreens.add(screen); + } public SkillInfoScreen(String title) { super(Text.of(title)); @@ -49,130 +58,19 @@ protected void init() { this.x = (this.width - this.backgroundWidth) / 2; this.y = (this.height - this.backgroundHeight) / 2; - switch (this.title) { - case "health": - this.translatableText1A = Text.translatable("text.levelz.health_info_1", ConfigInit.CONFIG.healthBase); - this.translatableText2A = Text.translatable("text.levelz.health_info_2_1", ConfigInit.CONFIG.healthBonus); - this.translatableText2B = Text.translatable("text.levelz.health_info_2_2", ConfigInit.CONFIG.healthBonus); - this.translatableText6A = Text.translatable("text.levelz.health_max_lvl_1", ConfigInit.CONFIG.healthAbsorptionBonus); - this.translatableText6B = Text.translatable("text.levelz.health_max_lvl_2", ConfigInit.CONFIG.healthAbsorptionBonus); - break; - case "strength": - this.translatableText1A = Text.translatable("text.levelz.strength_info_1", ConfigInit.CONFIG.attackBase); - this.translatableText2A = Text.translatable("text.levelz.strength_info_2_1", ConfigInit.CONFIG.attackBonus); - this.translatableText2B = Text.translatable("text.levelz.strength_info_2_2", ConfigInit.CONFIG.attackBonus); - this.translatableText6A = Text.translatable("text.levelz.strength_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.attackDoubleDamageChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.strength_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.attackDoubleDamageChance * 100F)); - break; - case "agility": - this.translatableText1A = Text.translatable("text.levelz.agility_info_1", ConfigInit.CONFIG.movementBase); - this.translatableText2A = Text.translatable("text.levelz.agility_info_2_1", ConfigInit.CONFIG.movementBonus); - this.translatableText2B = Text.translatable("text.levelz.agility_info_2_2", ConfigInit.CONFIG.movementBonus); - this.translatableText3A = Text.translatable("text.levelz.agility_info_3_1", ConfigInit.CONFIG.movementFallBonus); - this.translatableText3B = Text.translatable("text.levelz.agility_info_3_2", ConfigInit.CONFIG.movementFallBonus); - this.translatableText6A = Text.translatable("text.levelz.agility_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.movementMissChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.agility_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.movementMissChance * 100F)); - break; - case "defense": - this.translatableText1A = Text.translatable("text.levelz.defense_info_1", ConfigInit.CONFIG.defenseBase); - this.translatableText2A = Text.translatable("text.levelz.defense_info_2_1", ConfigInit.CONFIG.defenseBonus); - this.translatableText2B = Text.translatable("text.levelz.defense_info_2_2", ConfigInit.CONFIG.defenseBonus); - this.translatableText6A = Text.translatable("text.levelz.defense_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.defenseReflectChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.defense_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.defenseReflectChance * 100F)); - break; - case "stamina": - this.translatableText1A = Text.translatable("text.levelz.stamina_info_1", ConfigInit.CONFIG.staminaBase); - this.translatableText2A = Text.translatable("text.levelz.stamina_info_2_1", ConfigInit.CONFIG.staminaBonus); - this.translatableText2B = Text.translatable("text.levelz.stamina_info_2_2", ConfigInit.CONFIG.staminaBonus); - this.translatableText3A = Text.translatable("text.levelz.stamina_info_3_1", ConfigInit.CONFIG.staminaHealthBonus); - this.translatableText3B = Text.translatable("text.levelz.stamina_info_3_2", ConfigInit.CONFIG.staminaHealthBonus); - this.translatableText6A = Text.translatable("text.levelz.stamina_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.staminaFoodBonus * 100F)); - this.translatableText6B = Text.translatable("text.levelz.stamina_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.staminaFoodBonus * 100F)); - break; - case "luck": - this.translatableText1A = Text.translatable("text.levelz.luck_info_1", ConfigInit.CONFIG.luckBase); - this.translatableText1B = Text.translatable("text.levelz.luck_info_1_2"); - this.translatableText2A = Text.translatable("text.levelz.luck_info_2_1", ConfigInit.CONFIG.luckBonus); - this.translatableText2B = Text.translatable("text.levelz.luck_info_2_2", ConfigInit.CONFIG.luckBonus); - this.translatableText3A = Text.translatable("text.levelz.luck_info_3_1", ConfigInit.CONFIG.luckCritBonus); - this.translatableText3B = Text.translatable("text.levelz.luck_info_3_2", ConfigInit.CONFIG.luckCritBonus); - this.translatableText6A = Text.translatable("text.levelz.luck_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.luckSurviveChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.luck_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.luckSurviveChance * 100F)); - break; - case "archery": - this.translatableText2A = Text.translatable("text.levelz.archery_info_2_1", ConfigInit.CONFIG.archeryBowExtraDamage); - this.translatableText2B = Text.translatable("text.levelz.archery_info_2_2", ConfigInit.CONFIG.archeryBowExtraDamage); - this.translatableText3A = Text.translatable("text.levelz.archery_info_3_1", ConfigInit.CONFIG.archeryCrossbowExtraDamage); - this.translatableText3B = Text.translatable("text.levelz.archery_info_3_2", ConfigInit.CONFIG.archeryCrossbowExtraDamage); - this.translatableText6A = Text.translatable("text.levelz.archery_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.archeryDoubleDamageChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.archery_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.archeryDoubleDamageChance * 100F)); - break; - case "trade": - this.translatableText2A = Text.translatable("text.levelz.trade_info_2_1", ConfigInit.CONFIG.tradeXPBonus); - this.translatableText2B = Text.translatable("text.levelz.trade_info_2_2", ConfigInit.CONFIG.tradeXPBonus); - this.translatableText3A = Text.translatable("text.levelz.trade_info_3_1", ConfigInit.CONFIG.tradeBonus); - this.translatableText3B = Text.translatable("text.levelz.trade_info_3_2", ConfigInit.CONFIG.tradeBonus); - this.translatableText6A = Text.translatable("text.levelz.trade_max_lvl_1", ConfigInit.CONFIG.tradeReputation); - this.translatableText6B = Text.translatable("text.levelz.trade_max_lvl_2", ConfigInit.CONFIG.tradeReputation); - break; - case "smithing": - this.translatableText2A = Text.translatable("text.levelz.smithing_info_2_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingToolChance * 100F)); - this.translatableText2B = Text.translatable("text.levelz.smithing_info_2_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingToolChance * 100F)); - this.translatableText3A = Text.translatable("text.levelz.smithing_info_3_1", ConfigInit.CONFIG.smithingCostBonus); - this.translatableText3B = Text.translatable("text.levelz.smithing_info_3_2", ConfigInit.CONFIG.smithingCostBonus); - this.translatableText6A = Text.translatable("text.levelz.smithing_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingAnvilChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.smithing_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingAnvilChance * 100F)); - - this.addDrawableChild(new SkillScreen.WidgetButtonPage(this.x + 180, this.y + 7, 12, 9, 45, 80, false, true, null, button -> { - this.client.setScreen(new SkillListScreen(this.title)); - })); - break; - case "mining": - this.translatableText1A = Text.translatable("text.levelz.mining_info_1"); - this.translatableText2A = Text.translatable("text.levelz.mining_info_2_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningOreChance * 100F)); - this.translatableText2B = Text.translatable("text.levelz.mining_info_2_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningOreChance * 100F)); - this.translatableText6A = Text.translatable("text.levelz.mining_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningTntBonus * 100F)); - this.translatableText6B = Text.translatable("text.levelz.mining_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningTntBonus * 100F)); - - this.addDrawableChild(new SkillScreen.WidgetButtonPage(this.x + 180, this.y + 7, 12, 9, 45, 80, false, true, null, button -> { - this.client.setScreen(new SkillListScreen(this.title)); - })); - break; - case "farming": - this.translatableText2A = Text.translatable("text.levelz.farming_info_2_1", ConfigInit.CONFIG.farmingBase); - this.translatableText2B = Text.translatable("text.levelz.farming_info_2_2", ConfigInit.CONFIG.farmingBase); - this.translatableText3A = Text.translatable("text.levelz.farming_info_3_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingChanceBonus * 100F)); - this.translatableText3B = Text.translatable("text.levelz.farming_info_3_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingChanceBonus * 100F)); - this.translatableText6A = Text.translatable("text.levelz.farming_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingTwinChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.farming_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingTwinChance * 100F)); - break; - case "alchemy": - this.translatableText1A = Text.translatable("text.levelz.alchemy_info_1"); - this.translatableText1B = Text.translatable("text.levelz.alchemy_info_1_2"); - this.translatableText2A = Text.translatable("text.levelz.alchemy_info_2_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyEnchantmentChance * 100F)); - this.translatableText2B = Text.translatable("text.levelz.alchemy_info_2_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyEnchantmentChance * 100F)); - this.translatableText6A = Text.translatable("text.levelz.alchemy_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyPotionChance * 100F)); - this.translatableText6B = Text.translatable("text.levelz.alchemy_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyPotionChance * 100F)); - - this.addDrawableChild(new SkillScreen.WidgetButtonPage(this.x + 180, this.y + 7, 12, 9, 45, 80, false, true, null, button -> { - this.client.setScreen(new SkillListScreen(this.title)); - })); - break; - default: - break; + for(ISkillInfoScreen screen : infoScreens){ + if(screen.getStat().equals(title)){ + var widgets = screen.getWidgets(x, y, textRenderer); + var listButton = screen.getSkillList(x, y, textRenderer, client); + if(listButton != null){ + this.addDrawableChild(listButton); + } + for(var widget : widgets){ + this.addDrawableChild(widget); + } + return; + } } - - List list = new ArrayList(); - list.add(translatableText1A); - list.add(translatableText1B); - list.add(translatableText2A); - list.add(translatableText2B); - list.add(translatableText3A); - list.add(translatableText3B); - list.add(translatableText6A); - list.add(translatableText6B); - - this.addDrawableChild(new SkillScrollableWidget(this.x + 10, this.y + 22, 183, 185, list, this.title, this.textRenderer)); } @Override diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/AgilityInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/AgilityInfoScreen.java new file mode 100644 index 00000000..6338943b --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/AgilityInfoScreen.java @@ -0,0 +1,39 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class AgilityInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "agility"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.agility_info_1", ConfigInit.CONFIG.movementBase)); + list.add(null); + list.add(Text.translatable("text.levelz.agility_info_2_1", ConfigInit.CONFIG.movementBonus)); + list.add(Text.translatable("text.levelz.agility_info_2_2", ConfigInit.CONFIG.movementBonus)); + list.add(Text.translatable("text.levelz.agility_info_3_1", ConfigInit.CONFIG.movementFallBonus)); + list.add(Text.translatable("text.levelz.agility_info_3_2", ConfigInit.CONFIG.movementFallBonus)); + list.add(Text.translatable("text.levelz.agility_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.movementMissChance * 100F))); + list.add(Text.translatable("text.levelz.agility_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.movementMissChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/AlchemyInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/AlchemyInfoScreen.java new file mode 100644 index 00000000..e2a16fb7 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/AlchemyInfoScreen.java @@ -0,0 +1,48 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.SkillListScreen; +import net.levelz.screen.SkillScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class AlchemyInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "alchemy"; + } + + @Override + public T getSkillList(int x, int y, TextRenderer textRenderer, MinecraftClient client) { + return (T) new SkillScreen.WidgetButtonPage(x + 180, y + 7, 12, 9, 45, 80, false, true, null, button -> { + client.setScreen(new SkillListScreen(this.getStat())); + }); + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.alchemy_info_1")); + list.add(Text.translatable("text.levelz.alchemy_info_1_2")); + list.add(Text.translatable("text.levelz.alchemy_info_2_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyEnchantmentChance * 100F))); + list.add(Text.translatable("text.levelz.alchemy_info_2_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyEnchantmentChance * 100F))); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.alchemy_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyPotionChance * 100F))); + list.add(Text.translatable("text.levelz.alchemy_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.alchemyPotionChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/ArcheryInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/ArcheryInfoScreen.java new file mode 100644 index 00000000..be828294 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/ArcheryInfoScreen.java @@ -0,0 +1,38 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class ArcheryInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "archery"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.archery_info_2_1", ConfigInit.CONFIG.archeryBowExtraDamage)); + list.add(Text.translatable("text.levelz.archery_info_2_2", ConfigInit.CONFIG.archeryBowExtraDamage)); + list.add(Text.translatable("text.levelz.archery_info_3_1", ConfigInit.CONFIG.archeryCrossbowExtraDamage)); + list.add(Text.translatable("text.levelz.archery_info_3_2", ConfigInit.CONFIG.archeryCrossbowExtraDamage)); + list.add(Text.translatable("text.levelz.archery_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.archeryDoubleDamageChance * 100F))); + list.add(Text.translatable("text.levelz.archery_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.archeryDoubleDamageChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/DefenseInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/DefenseInfoScreen.java new file mode 100644 index 00000000..21af2466 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/DefenseInfoScreen.java @@ -0,0 +1,38 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class DefenseInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "defense"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.defense_info_1", ConfigInit.CONFIG.defenseBase)); + list.add(null); + list.add(Text.translatable("text.levelz.defense_info_2_1", ConfigInit.CONFIG.defenseBonus)); + list.add(Text.translatable("text.levelz.defense_info_2_2", ConfigInit.CONFIG.defenseBonus)); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.defense_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.defenseReflectChance * 100F))); + list.add(Text.translatable("text.levelz.defense_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.defenseReflectChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/FarmingInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/FarmingInfoScreen.java new file mode 100644 index 00000000..3beb5fac --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/FarmingInfoScreen.java @@ -0,0 +1,38 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class FarmingInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "farming"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.farming_info_2_1", ConfigInit.CONFIG.farmingBase)); + list.add(Text.translatable("text.levelz.farming_info_2_2", ConfigInit.CONFIG.farmingBase)); + list.add(Text.translatable("text.levelz.farming_info_3_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingChanceBonus * 100F))); + list.add(Text.translatable("text.levelz.farming_info_3_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingChanceBonus * 100F))); + list.add(Text.translatable("text.levelz.farming_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingTwinChance * 100F))); + list.add(Text.translatable("text.levelz.farming_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.farmingTwinChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/HealthInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/HealthInfoScreen.java new file mode 100644 index 00000000..068c5b97 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/HealthInfoScreen.java @@ -0,0 +1,37 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.List; + +public class HealthInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "health"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.health_info_1", ConfigInit.CONFIG.healthBase)); + list.add(null); + list.add(Text.translatable("text.levelz.health_info_2_1", ConfigInit.CONFIG.healthBonus)); + list.add(Text.translatable("text.levelz.health_info_2_2", ConfigInit.CONFIG.healthBonus)); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.health_max_lvl_1", ConfigInit.CONFIG.healthAbsorptionBonus)); + list.add(Text.translatable("text.levelz.health_max_lvl_2", ConfigInit.CONFIG.healthAbsorptionBonus)); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/LuckInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/LuckInfoScreen.java new file mode 100644 index 00000000..68317ee5 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/LuckInfoScreen.java @@ -0,0 +1,38 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class LuckInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "luck"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.luck_info_1", ConfigInit.CONFIG.luckBase)); + list.add(Text.translatable("text.levelz.luck_info_1_2")); + list.add(Text.translatable("text.levelz.luck_info_2_1", ConfigInit.CONFIG.luckBonus)); + list.add(Text.translatable("text.levelz.luck_info_2_2", ConfigInit.CONFIG.luckBonus)); + list.add(Text.translatable("text.levelz.luck_info_3_1", ConfigInit.CONFIG.luckCritBonus)); + list.add(Text.translatable("text.levelz.luck_info_3_2", ConfigInit.CONFIG.luckCritBonus)); + list.add(Text.translatable("text.levelz.luck_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.luckSurviveChance * 100F))); + list.add(Text.translatable("text.levelz.luck_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.luckSurviveChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/MiningInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/MiningInfoScreen.java new file mode 100644 index 00000000..10c4f602 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/MiningInfoScreen.java @@ -0,0 +1,48 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.SkillListScreen; +import net.levelz.screen.SkillScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class MiningInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "mining"; + } + + @Override + public T getSkillList(int x, int y, TextRenderer textRenderer, MinecraftClient client) { + return (T) new SkillScreen.WidgetButtonPage(x + 180, y + 7, 12, 9, 45, 80, false, true, null, button -> { + client.setScreen(new SkillListScreen(this.getStat())); + }); + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.mining_info_1")); + list.add(null); + list.add(Text.translatable("text.levelz.mining_info_2_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningOreChance * 100F))); + list.add(Text.translatable("text.levelz.mining_info_2_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningOreChance * 100F))); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.mining_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningTntBonus * 100F))); + list.add(Text.translatable("text.levelz.mining_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.miningTntBonus * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/SmithingInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/SmithingInfoScreen.java new file mode 100644 index 00000000..2dcbe724 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/SmithingInfoScreen.java @@ -0,0 +1,48 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.SkillListScreen; +import net.levelz.screen.SkillScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class SmithingInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "smithing"; + } + + @Override + public T getSkillList(int x, int y, TextRenderer textRenderer, MinecraftClient client) { + return (T) new SkillScreen.WidgetButtonPage(x + 180, y + 7, 12, 9, 45, 80, false, true, null, button -> { + client.setScreen(new SkillListScreen(this.getStat())); + }); + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.smithing_info_2_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingToolChance * 100F))); + list.add(Text.translatable("text.levelz.smithing_info_2_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingToolChance * 100F))); + list.add(Text.translatable("text.levelz.smithing_info_3_1", ConfigInit.CONFIG.smithingCostBonus)); + list.add(Text.translatable("text.levelz.smithing_info_3_2", ConfigInit.CONFIG.smithingCostBonus)); + list.add(Text.translatable("text.levelz.smithing_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingAnvilChance * 100F))); + list.add(Text.translatable("text.levelz.smithing_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.smithingAnvilChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/StaminaInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/StaminaInfoScreen.java new file mode 100644 index 00000000..32dafbf4 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/StaminaInfoScreen.java @@ -0,0 +1,38 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class StaminaInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "stamina"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.stamina_info_1", ConfigInit.CONFIG.staminaBase)); + list.add(null); + list.add(Text.translatable("text.levelz.stamina_info_2_1", ConfigInit.CONFIG.staminaBonus)); + list.add(Text.translatable("text.levelz.stamina_info_2_2", ConfigInit.CONFIG.staminaBonus)); + list.add(Text.translatable("text.levelz.stamina_info_3_1", ConfigInit.CONFIG.staminaHealthBonus)); + list.add(Text.translatable("text.levelz.stamina_info_3_2", ConfigInit.CONFIG.staminaHealthBonus)); + list.add(Text.translatable("text.levelz.stamina_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.staminaFoodBonus * 100F))); + list.add(Text.translatable("text.levelz.stamina_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.staminaFoodBonus * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/StrengthInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/StrengthInfoScreen.java new file mode 100644 index 00000000..9db278a6 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/StrengthInfoScreen.java @@ -0,0 +1,38 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class StrengthInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "strength"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(Text.translatable("text.levelz.strength_info_1", ConfigInit.CONFIG.attackBase)); + list.add(null); + list.add(Text.translatable("text.levelz.strength_info_2_1", ConfigInit.CONFIG.attackBonus)); + list.add(Text.translatable("text.levelz.strength_info_2_2", ConfigInit.CONFIG.attackBonus)); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.strength_max_lvl_1", new DecimalFormat("0.0").format(ConfigInit.CONFIG.attackDoubleDamageChance * 100F))); + list.add(Text.translatable("text.levelz.strength_max_lvl_2", new DecimalFormat("0.0").format(ConfigInit.CONFIG.attackDoubleDamageChance * 100F))); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillInfoScreens/TradeInfoScreen.java b/src/main/java/net/levelz/screen/SkillInfoScreens/TradeInfoScreen.java new file mode 100644 index 00000000..81576698 --- /dev/null +++ b/src/main/java/net/levelz/screen/SkillInfoScreens/TradeInfoScreen.java @@ -0,0 +1,37 @@ +package net.levelz.screen.SkillInfoScreens; + +import net.levelz.init.ConfigInit; +import net.levelz.screen.ISkillInfoScreen; +import net.levelz.screen.widget.SkillScrollableWidget; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.Drawable; +import net.minecraft.client.gui.Element; +import net.minecraft.client.gui.Selectable; +import net.minecraft.text.Text; + +import java.util.ArrayList; +import java.util.List; + +public class TradeInfoScreen implements ISkillInfoScreen { + @Override + public String getStat() { + return "trade"; + } + + @Override + public ArrayList getWidgets(int x, int y, TextRenderer textRenderer) { + List list = new ArrayList(); + list.add(null); + list.add(null); + list.add(Text.translatable("text.levelz.trade_info_2_1", ConfigInit.CONFIG.tradeXPBonus)); + list.add(Text.translatable("text.levelz.trade_info_2_2", ConfigInit.CONFIG.tradeXPBonus)); + list.add(Text.translatable("text.levelz.trade_info_3_1", ConfigInit.CONFIG.tradeBonus)); + list.add(Text.translatable("text.levelz.trade_info_3_2", ConfigInit.CONFIG.tradeBonus)); + list.add(Text.translatable("text.levelz.trade_max_lvl_1", ConfigInit.CONFIG.tradeReputation)); + list.add(Text.translatable("text.levelz.trade_max_lvl_2", ConfigInit.CONFIG.tradeReputation)); + + ArrayList widgets = new ArrayList<>(); + widgets.add((T) new SkillScrollableWidget(x + 10, y + 22, 183, 185, list, getStat(), textRenderer)); + return widgets; + } +} diff --git a/src/main/java/net/levelz/screen/SkillListScreen.java b/src/main/java/net/levelz/screen/SkillListScreen.java index 91ae6b2d..4a7377d1 100644 --- a/src/main/java/net/levelz/screen/SkillListScreen.java +++ b/src/main/java/net/levelz/screen/SkillListScreen.java @@ -2,7 +2,7 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; +import java.util.stream.Collectors; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -53,19 +53,12 @@ protected void init() { List levelList = new ArrayList<>(); List> objectList = new ArrayList<>(); List skillList = new ArrayList<>(); - if (Objects.equals(this.title, "mining")) { - levelList = LevelLists.miningLevelList; - objectList = LevelLists.miningBlockList; - } else if (Objects.equals(this.title, "alchemy")) { - levelList = LevelLists.brewingLevelList; - objectList = LevelLists.brewingItemList; - } else if (Objects.equals(this.title, "smithing")) { - levelList = LevelLists.smithingLevelList; - objectList = LevelLists.smithingItemList; - } else if (this.crafing) { - levelList = LevelLists.craftingLevelList; - objectList = LevelLists.craftingItemList; - skillList = LevelLists.craftingSkillList; + + levelList = LevelLists.levelLists.getOrDefault(this.title, new ArrayList<>()); + objectList = LevelLists.levelObjectsLists.getOrDefault(this.title, new ArrayList<>()); + + if(this.crafing){ + skillList = LevelLists.levelExtraDataLists.get("crafting").stream().map(data -> (String) data).collect(Collectors.toList()); if (ConfigInit.CONFIG.sortCraftingRecipesBySkill) { SortList.concurrentSort(skillList, skillList, levelList, objectList); } diff --git a/src/main/java/net/levelz/screen/SkillScreen.java b/src/main/java/net/levelz/screen/SkillScreen.java index 3eebf331..73402148 100644 --- a/src/main/java/net/levelz/screen/SkillScreen.java +++ b/src/main/java/net/levelz/screen/SkillScreen.java @@ -52,8 +52,8 @@ public class SkillScreen extends Screen implements Tab { public static final Identifier BACKGROUND_TEXTURE = new Identifier("levelz:textures/gui/skill_background.png"); public static final Identifier ICON_TEXTURES = new Identifier("levelz:textures/gui/icons.png"); - private final WidgetButtonPage[] skillButtons = new WidgetButtonPage[12]; - private final WidgetButtonPage[] levelButtons = new WidgetButtonPage[12]; + private final WidgetButtonPage[] skillButtons = new WidgetButtonPage[Skill.getSkillCount()]; + private final WidgetButtonPage[] levelButtons = new WidgetButtonPage[Skill.getSkillCount()]; private PlayerEntity playerEntity; private PlayerStatsManager playerStatsManager; @@ -78,18 +78,21 @@ protected void init() { for (int i = 0; i < this.skillButtons.length; i++) { final int skillInt = i; - this.skillButtons[i] = this.addDrawableChild(new WidgetButtonPage(this.x + 15 + (i > 5 ? 90 : 0), this.y + 90 + i * 20 - (i > 5 ? 120 : 0), 16, 16, i * 16, 16, false, true, - Text.translatable("spritetip.levelz." + Skill.values()[i].name().toLowerCase() + "_skill"), button -> { - this.client.setScreen(new SkillInfoScreen(Skill.values()[skillInt].name().toLowerCase())); + final int indexX = i % 2; + final int indexY = i / 2; + + this.skillButtons[i] = this.addDrawableChild(new WidgetButtonPage(this.x + 15 + indexX * 90, this.y + 90 + indexY * 20, 16, 16, i * 16, 16, false, true, + Text.translatable("spritetip.levelz." + Skill.values()[i].getName().toLowerCase() + "_skill"), button -> { + this.client.setScreen(new SkillInfoScreen(Skill.values()[skillInt].getName().toLowerCase())); })); for (int o = 1; o < 10; o++) { - String translatable = "spritetip.levelz." + Skill.values()[i].name().toLowerCase() + "_skill_info_" + o; + String translatable = "spritetip.levelz." + Skill.values()[i].getName().toLowerCase() + "_skill_info_" + o; Text tooltip = Text.translatable(translatable); if (!tooltip.getString().equals(translatable)) { this.skillButtons[i].addTooltip(tooltip); } } - this.levelButtons[i] = this.addDrawableChild(new WidgetButtonPage(this.x + 83 + (i > 5 ? 90 : 0), this.y + 92 + i * 20 - (i > 5 ? 120 : 0), 13, 13, 33, 42, true, true, null, button -> { + this.levelButtons[i] = this.addDrawableChild(new WidgetButtonPage(this.x + 83 + indexX * 90, this.y + 92 + indexY * 20, 13, 13, 33, 42, true, true, null, button -> { int level = 1; if (((WidgetButtonPage) button).wasRightButtonClicked()) { level = 5; @@ -108,7 +111,7 @@ protected void init() { infoButton.addTooltip(Text.of(infoTooltip[i])); } - if (!LevelLists.craftingItemList.isEmpty()) { + if (!LevelLists.levelLists.getOrDefault("crafting", new ArrayList<>()).isEmpty()) { this.addDrawableChild(new WidgetButtonPage(this.x + 180, this.y + 5, 15, 13, 0, 80, true, true, Text.translatable("text.levelz.crafting_info"), button -> { this.client.setScreen(new SkillListScreen("crafting")); })); @@ -203,9 +206,9 @@ public void render(DrawContext context, int mouseX, int mouseY, float delta) { } // Small icons text - for (int o = 0; o < 12; o++) { + for (int o = 0; o < Skill.getSkillCount(); o++) { Text currentLevelText = Text.translatable("text.levelz.gui.current_level", playerStatsManager.getSkillLevel(Skill.values()[o]), ConfigInit.CONFIG.maxLevel); - context.drawText(this.textRenderer, currentLevelText, this.x - this.textRenderer.getWidth(currentLevelText) / 2 + 57 + (o > 5 ? 90 : 0), this.y + 95 + o * 20 - (o > 5 ? 120 : 0), + context.drawText(this.textRenderer, currentLevelText, this.x - this.textRenderer.getWidth(currentLevelText) / 2 + 57 + (o % 2) * 90, this.y + 95 + (o / 2) * 20, 0x3F3F3F, false); } } @@ -323,7 +326,7 @@ public void renderButton(DrawContext context, int mouseX, int mouseY, float delt RenderSystem.enableBlend(); RenderSystem.enableDepthTest(); int i = hoverOutline ? this.getTextureY() : 0; - context.drawTexture(ICON_TEXTURES, this.getX(), this.getY(), this.textureX + i * this.width, this.textureY, this.width, this.height); + IconsStitcher.drawTexture(context, this.getX(), this.getY(), this.textureX + i * this.width, this.textureY, this.width, this.height); context.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f); if (this.isHovered()) { context.drawTooltip(minecraftClient.textRenderer, this.tooltip, mouseX, mouseY); diff --git a/src/main/java/net/levelz/screen/widget/SkillListScrollableWidget.java b/src/main/java/net/levelz/screen/widget/SkillListScrollableWidget.java index 60ff47be..2cd212d1 100644 --- a/src/main/java/net/levelz/screen/widget/SkillListScrollableWidget.java +++ b/src/main/java/net/levelz/screen/widget/SkillListScrollableWidget.java @@ -104,9 +104,9 @@ protected void renderContents(DrawContext context, int mouseX, int mouseY, float tooltip.add(item.getName()); stack = item.getDefaultStack(); - if (BrewingRecipeRegistry.isValidIngredient(item.getDefaultStack()) && LevelLists.potionList.contains(item)) { - int index = LevelLists.potionList.indexOf(item); - Potion potion = (Potion) LevelLists.potionList.get(index + 1); + if (BrewingRecipeRegistry.isValidIngredient(item.getDefaultStack()) && LevelLists.levelExtraDataLists.getOrDefault("alchemy", new ArrayList<>()).contains(item)) { + int index = LevelLists.levelExtraDataLists.get("alchemy").indexOf(item); + Potion potion = (Potion) LevelLists.levelExtraDataLists.get("alchemy").get(index + 1); ItemStack potionStack = PotionUtil.setPotion(new ItemStack(Items.POTION), potion); tooltip.add(Text.of("Ingredient for " + Text.translatable(((PotionItem) PotionUtil.setPotion(potionStack, potion).getItem()).getTranslationKey(potionStack)).getString())); } diff --git a/src/main/java/net/levelz/stats/PlayerStatsManager.java b/src/main/java/net/levelz/stats/PlayerStatsManager.java index 5df7e2bf..d67f481d 100644 --- a/src/main/java/net/levelz/stats/PlayerStatsManager.java +++ b/src/main/java/net/levelz/stats/PlayerStatsManager.java @@ -2,6 +2,7 @@ import net.levelz.access.PlayerStatsManagerAccess; import net.levelz.data.LevelLists; +import net.levelz.data.LevelLoader; import net.levelz.init.ConfigInit; import net.levelz.network.PlayerStatsServerPacket; import net.minecraft.entity.player.PlayerEntity; @@ -33,11 +34,7 @@ public PlayerEntity getPlayerEntity() { return playerEntity; } - // Other - public List lockedBlockIds = new ArrayList(); - public List lockedbrewingItemIds = new ArrayList(); - public List lockedSmithingItemIds = new ArrayList(); - public List lockedCraftingItemIds = new ArrayList(); + public HashMap> lockedIds = new HashMap<>(); // Wood, Stone, Iron, Gold, Diamond, Netherite @@ -218,52 +215,27 @@ public static boolean playerLevelisHighEnough(PlayerEntity playerEntity, List{ + private static final ArrayList registeredSkills = new ArrayList<>(); + + public final static Skill HEALTH = new Skill(1, "HealthLevel", "HEALTH"); + public final static Skill STRENGTH = new Skill(2, "StrengthLevel", "STRENGTH"); + public final static Skill AGILITY = new Skill(3, "AgilityLevel", "AGILITY"); + public final static Skill DEFENSE = new Skill(4, "DefenseLevel", "DEFENSE"); + public final static Skill STAMINA = new Skill(5, "StaminaLevel", "STAMINA"); + public final static Skill LUCK = new Skill(6, "LuckLevel", "LUCK"); + public final static Skill ARCHERY = new Skill(7, "ArcheryLevel", "ARCHERY"); + public final static Skill TRADE = new Skill(8, "TradeLevel", "TRADE"); + public final static Skill SMITHING = new Skill(9, "SmithingLevel", "SMITHING"); + public final static Skill MINING = new Skill(10, "MiningLevel", "MINING"); + public final static Skill FARMING = new Skill(11, "FarmingLevel", "FARMING"); + public final static Skill ALCHEMY = new Skill(12, "AlchemyLevel", "ALCHEMY"); final int id; final String nbt; + final String name; - Skill(int id, String nbt) { + Skill(int id, String nbt, String name) { this.id = id; this.nbt = nbt; + this.name = name; + registeredSkills.add(this); + } + + public static Skill[] values() { + return registeredSkills.toArray(Skill[]::new); + } + + public static Skill register(String nbt, String name){ + return new Skill(registeredSkills.get(registeredSkills.size() - 1).id + 1, nbt, name); } public static Skill fromNbt(String nbt) { - return Arrays.stream(Skill.values()).filter(it -> it.nbt.equals(nbt)).findFirst().orElse(null); + for(Skill skill : registeredSkills) { + if(skill.nbt.equals(nbt)) { + return skill; + } + } + return null; + } + + public static Skill valueOf(String name){ + name = name.toUpperCase(); + for(Skill skill : registeredSkills) { + if(skill.name.equals(name)) { + return skill; + } + } + return null; } public static Iterable listInRandomOrder(Random random) { @@ -37,7 +65,13 @@ public static Iterable listInRandomOrder(Random random) { random = Random.create(); } Random finalRandom = random; - return Arrays.stream(Skill.values()).sorted(Comparator.comparing(it -> finalRandom.nextInt())).collect(Collectors.toList()); + ArrayList randomSkills = new ArrayList<>(registeredSkills); + randomSkills.sort(Comparator.comparingInt((skill) -> finalRandom.nextInt())); + return randomSkills; + } + + public static int getSkillCount() { + return registeredSkills.size(); } public int getId() { @@ -47,4 +81,13 @@ public int getId() { public String getNbt() { return nbt; } + + public String getName() { + return name; + } + + @Override + public int compareTo(@NotNull Skill skill) { + return Integer.compare(id, skill.id); + } }