diff --git a/build.gradle.kts b/build.gradle.kts index 37ea0f73..f39e4556 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -15,6 +15,7 @@ repositories { maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") maven("https://repo.maven.apache.org/maven2/") maven("https://mvn.lumine.io/repository/maven-public/") + maven("https://repo.papermc.io/repository/maven-public/") maven("https://nexus.phoenixdevt.fr/repository/maven-public/") maven("http://repo.crypticlib.com:8081/repository/maven-public/") { isAllowInsecureProtocol = true @@ -37,7 +38,7 @@ dependencies { } group = "com.github.yufiriamazenta" -version = "1.4.7-dev2" +version = "1.4.7-dev3" var pluginVersion: String = version.toString() + "-" + SimpleDateFormat("yyyyMMdd").format(System.currentTimeMillis()) java.sourceCompatibility = JavaVersion.VERSION_1_8 java.targetCompatibility = JavaVersion.VERSION_1_8 diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java b/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java index 84cd8eb0..9fb71ba2 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/Craftorithm.java @@ -105,7 +105,7 @@ public void onServerLoad(ServerLoadEvent event) { map.put(namespace, recipes); } } - RecipeManager.loadRecipes(); + RecipeManager.reloadRecipes(); } } } diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/CraftorithmAPI.java b/src/main/java/com/github/yufiriamazenta/craftorithm/CraftorithmAPI.java index 4005e345..7e96badd 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/CraftorithmAPI.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/CraftorithmAPI.java @@ -34,8 +34,8 @@ public ArcencielDispatcher getArcencielDispatcher() { return ArcencielDispatcher.INSTANCE; } - public Map getPluginRecipeTypeMap() { - return RecipeManager.getPluginRecipeTypeMap(); + public RecipeType getRecipeType(Recipe recipe) { + return RecipeManager.getRecipeType(recipe); } public void setLoadedOtherPluginRecipe(boolean loadedOtherPluginRecipe) { diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RecipeListCommand.java b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RecipeListCommand.java index 3fea8fe1..29e18cfb 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RecipeListCommand.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RecipeListCommand.java @@ -5,7 +5,10 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Locale; //TODO 展示全服所有配方 public final class RecipeListCommand extends AbstractSubCommand { @@ -23,8 +26,25 @@ public boolean onCommand(CommandSender sender, List args) { return true; } Player player = (Player) sender; + switch (args.get(0).toLowerCase(Locale.ENGLISH)) { + case "all": + //TODO + break; + case "custom": + //TODO + break; + } player.openInventory(new RecipeListMenuHolder().getInventory()); return true; } + @Override + public List onTabComplete(CommandSender sender, List args) { + if (args.size() <= 1) { + List list = new ArrayList<>(Arrays.asList("all", "custom")); + filterTabList(list, args.get(0)); + return list; + } + return super.onTabComplete(sender, args); + } } diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ReloadCommand.java b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ReloadCommand.java index 5e02fbbd..08338efd 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ReloadCommand.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ReloadCommand.java @@ -42,13 +42,13 @@ public static void reloadConfigs() { LangUtil.reloadMsgConfig(); RecipeManager.getRemovedRecipeConfig().reloadConfig(); ItemManager.loadItemFiles(); - RecipeManager.loadRecipeFiles(); + RecipeManager.reloadRecipeFiles(); ArcencielDispatcher.INSTANCE.getFunctionFile().reloadConfig(); ItemUtil.reloadCannotCraftLore(); } public static void reloadRecipes() { - RecipeManager.loadRecipes(); + RecipeManager.reloadRecipes(); } } diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RemoveRecipeCommand.java b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RemoveRecipeCommand.java index 52577e7d..2f4af915 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RemoveRecipeCommand.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/RemoveRecipeCommand.java @@ -3,7 +3,6 @@ import com.github.yufiriamazenta.craftorithm.recipe.RecipeManager; import com.github.yufiriamazenta.craftorithm.util.LangUtil; import crypticlib.command.ISubCmdExecutor; -import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; import java.util.ArrayList; @@ -26,7 +25,8 @@ public boolean onCommand(CommandSender sender, List args) { sendNotEnoughCmdParamMsg(sender, 1); return true; } - if (RecipeManager.removeRecipe(args.get(0), true)) { + + if (RecipeManager.removeCraftorithmRecipe(args.get(0), true)) { LangUtil.sendLang(sender, "command.remove.success"); } else @@ -38,10 +38,9 @@ public boolean onCommand(CommandSender sender, List args) { public List onTabComplete(CommandSender sender, List args) { if (args.size() <= 1) { List tabList = new ArrayList<>(); - for (NamespacedKey key : RecipeManager.getServerRecipeList().keySet()) { - String str = key.toString(); - if (str.startsWith(args.get(0))) - tabList.add(key.toString()); + for (String key : RecipeManager.getRecipeGroupMap().keySet()) { + if (key.startsWith(args.get(0))) + tabList.add(key); } filterTabList(tabList, args.get(0)); return tabList; diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ShowRecipeCommand.java b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ShowRecipeCommand.java index f73f5fef..f1af4437 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ShowRecipeCommand.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/cmd/subcmd/ShowRecipeCommand.java @@ -1,9 +1,7 @@ package com.github.yufiriamazenta.craftorithm.cmd.subcmd; -import com.github.yufiriamazenta.craftorithm.menu.impl.recipe.RecipeDisplayMenuHolder; import com.github.yufiriamazenta.craftorithm.recipe.RecipeManager; import com.github.yufiriamazenta.craftorithm.util.LangUtil; -import org.bukkit.NamespacedKey; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.Recipe; @@ -30,25 +28,27 @@ public boolean onCommand(CommandSender sender, List args) { sendNotEnoughCmdParamMsg(sender, 1); return true; } - Recipe recipe = RecipeManager.getCraftorithmRecipe(args.get(0)); - if (recipe == null) { + List recipes = RecipeManager.getCraftorithmRecipe(args.get(0)); + if (recipes.isEmpty()) { LangUtil.sendLang(sender, "command.show.not_exist_recipe"); return true; } Player player = (Player) sender; - player.openInventory(new RecipeDisplayMenuHolder(recipe).getInventory()); + //TODO 完成新版配方展示 +// player.openInventory(new RecipeDisplayMenuHolder(recipe).getInventory()); return true; } @Override public List onTabComplete(CommandSender sender, List args) { + //TODO 修改返回列表 if (args.size() <= 1) { - List recipeKeyList = RecipeManager.getPluginRecipeKeys(); +// List recipeKeyList = RecipeManager.getPluginRecipeKeys(); List tabList = new ArrayList<>(); - for (NamespacedKey key : recipeKeyList) { - tabList.add(key.getKey()); - } - filterTabList(tabList, args.get(0)); +// for (NamespacedKey key : recipeKeyList) { +// tabList.add(key.getKey()); +// } +// filterTabList(tabList, args.get(0)); return tabList; } else { return Collections.singletonList(""); diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeCreatorMenuHolder.java b/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeCreatorMenuHolder.java index 7cc06099..4abb3a26 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeCreatorMenuHolder.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeCreatorMenuHolder.java @@ -113,10 +113,8 @@ private void setStoneCuttingMenuIcons() { recipeConfig.saveConfig(); recipeConfig.reloadConfig(); Recipe[] recipes = RecipeFactory.newMultipleRecipe(recipeConfig.config(), recipeName); - for (Recipe recipe : recipes) { - NamespacedKey key = RecipeManager.getRecipeKey(recipe); - RecipeManager.regRecipes(key, recipe, recipeConfig.config()); - } + RecipeManager.regRecipes(recipeName, Arrays.asList(recipes), recipeConfig); + RecipeManager.getRecipeConfigWrapperMap().put(recipeName, recipeConfig); event.getWhoClicked().closeInventory(); sendSuccessMsgAndReloadMap(event.getWhoClicked()); }); @@ -197,8 +195,9 @@ private void setSmithingMenuIcons() { } recipeConfig.saveConfig(); recipeConfig.reloadConfig(); - Recipe recipe = RecipeFactory.newRecipe(recipeConfig.config(), recipeName); - RecipeManager.regRecipes(NamespacedKey.fromString(recipeName, Craftorithm.getInstance()), recipe, recipeConfig.config()); + Recipe[] recipes = RecipeFactory.newRecipe(recipeConfig.config(), recipeName); + RecipeManager.regRecipes(recipeName, Arrays.asList(recipes), recipeConfig); + RecipeManager.getRecipeConfigWrapperMap().put(recipeName, recipeConfig); event.getWhoClicked().closeInventory(); sendSuccessMsgAndReloadMap(event.getWhoClicked()); }); @@ -281,17 +280,16 @@ private void setCookingMenuIcons() { recipeConfig.saveConfig(); recipeConfig.reloadConfig(); Recipe[] multipleRecipes = RecipeFactory.newMultipleRecipe(recipeConfig.config(), recipeName); - for (Recipe recipe : multipleRecipes) { - NamespacedKey key = RecipeManager.getRecipeKey(recipe); - RecipeManager.regRecipes(key, recipe, recipeConfig.config()); - } + RecipeManager.regRecipes(recipeName, Arrays.asList(multipleRecipes), recipeConfig); + RecipeManager.getRecipeConfigWrapperMap().put(recipeName, recipeConfig); } else { recipeConfig.config().set("source.block", "furnace"); recipeConfig.config().set("source.item", sourceName); recipeConfig.saveConfig(); recipeConfig.reloadConfig(); - Recipe recipe = RecipeFactory.newRecipe(recipeConfig.config(), recipeName); - RecipeManager.regRecipes(NamespacedKey.fromString(recipeName, Craftorithm.getInstance()), recipe, recipeConfig.config()); + Recipe[] recipes = RecipeFactory.newRecipe(recipeConfig.config(), recipeName); + RecipeManager.regRecipes(recipeName, Arrays.asList(recipes), recipeConfig); + RecipeManager.getRecipeConfigWrapperMap().put(recipeName, recipeConfig); } event.getWhoClicked().closeInventory(); sendSuccessMsgAndReloadMap(event.getWhoClicked()); @@ -403,8 +401,9 @@ private void setCraftMenuIcons() { } recipeConfig.saveConfig(); recipeConfig.reloadConfig(); - Recipe recipe = RecipeFactory.newRecipe(recipeConfig.config(), recipeName); - RecipeManager.regRecipes(NamespacedKey.fromString(recipeName, Craftorithm.getInstance()), recipe, recipeConfig.config()); + Recipe[] recipes = RecipeFactory.newRecipe(recipeConfig.config(), recipeName); + RecipeManager.regRecipes(recipeName, Arrays.asList(recipes), recipeConfig); + RecipeManager.getRecipeConfigWrapperMap().put(recipeName, recipeConfig); event.getWhoClicked().closeInventory(); sendSuccessMsgAndReloadMap(event.getWhoClicked()); }); diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeDisplayMenuHolder.java b/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeDisplayMenuHolder.java index dfb5e66f..46697bdb 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeDisplayMenuHolder.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeDisplayMenuHolder.java @@ -32,7 +32,7 @@ public RecipeDisplayMenuHolder(Recipe recipe, RecipeListMenuHolder parentMenu) { super(); this.parentMenu = parentMenu; this.recipe = recipe; - RecipeType recipeType = RecipeManager.getCraftorithmRecipeType(recipe); + RecipeType recipeType = RecipeManager.getRecipeType(recipe); switch (recipeType) { case SHAPED: setShapedRecipeMenu(); diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeListMenuHolder.java b/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeListMenuHolder.java index 5ea73013..d0885c11 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeListMenuHolder.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/menu/impl/recipe/RecipeListMenuHolder.java @@ -26,7 +26,8 @@ public class RecipeListMenuHolder extends BukkitMenuHandler { public RecipeListMenuHolder() { super(); - this.recipeList = new ArrayList<>(RecipeManager.getPluginRecipeTypeMap().keySet()); + //TODO 重写配方展示页面 + this.recipeList = new ArrayList<>(); int recipeNum = recipeList.size(); page = 0; if (recipeNum % 45 == 0) diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeFactory.java b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeFactory.java index bf77dc47..bf44e252 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeFactory.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeFactory.java @@ -20,7 +20,7 @@ public class RecipeFactory { - private static final Map> recipeBuilderMap; + private static final Map> recipeBuilderMap; private static final Map> multipleRecipeBuilderMap; static { @@ -43,7 +43,7 @@ public class RecipeFactory { multipleRecipeBuilderMap.put(RecipeType.SMITHING, RecipeFactory::multipleSmithingRecipe); } - public static Recipe newRecipe(YamlConfiguration config, String key) { + public static Recipe[] newRecipe(YamlConfiguration config, String key) { key = key.toLowerCase(Locale.ROOT); String recipeTypeStr = config.getString("type", "shaped"); RecipeType recipeType = RecipeType.valueOf(recipeTypeStr.toUpperCase(Locale.ROOT)); @@ -57,7 +57,7 @@ public static Recipe[] newMultipleRecipe(YamlConfiguration config, String key) { return multipleRecipeBuilderMap.get(recipeType).apply(config, key); } - public static Recipe shapedRecipe(YamlConfiguration config, String key) { + public static Recipe[] shapedRecipe(YamlConfiguration config, String key) { Map recipeChoiceMap = getShapedRecipeChoiceMap(config.getConfigurationSection("source")); ItemStack result = getResultItem(config); NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); @@ -68,7 +68,8 @@ public static Recipe shapedRecipe(YamlConfiguration config, String key) { } String[] shape = new String[shapeStrList.size()]; shape = shapeStrList.toArray(shape); - return ShapedRecipeBuilder.builder().key(namespacedKey).result(result).shape(shape).recipeChoiceMap(recipeChoiceMap).build(); + Recipe recipe = ShapedRecipeBuilder.builder().key(namespacedKey).result(result).shape(shape).recipeChoiceMap(recipeChoiceMap).build(); + return new Recipe[]{recipe}; } public static Recipe[] multipleShapedRecipe(YamlConfiguration config, String key) { @@ -91,7 +92,7 @@ public static Recipe[] multipleShapedRecipe(YamlConfiguration config, String key return shapedRecipes; } - public static Recipe shapelessRecipe(YamlConfiguration config, String key) { + public static Recipe[] shapelessRecipe(YamlConfiguration config, String key) { NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); ItemStack result = getResultItem(config); List itemStrList = config.getStringList("source"); @@ -99,7 +100,8 @@ public static Recipe shapelessRecipe(YamlConfiguration config, String key) { for (String itemStr : itemStrList) { recipeChoiceList.add(getRecipeChoice(itemStr)); } - return ShapelessRecipeBuilder.builder().key(namespacedKey).result(result).choiceList(recipeChoiceList).build(); + Recipe recipe = ShapelessRecipeBuilder.builder().key(namespacedKey).result(result).choiceList(recipeChoiceList).build(); + return new Recipe[]{recipe}; } public static Recipe[] multipleShapelessRecipe(YamlConfiguration config, String key) { @@ -121,7 +123,7 @@ public static Recipe[] multipleShapelessRecipe(YamlConfiguration config, String return shapelessRecipes; } - public static Recipe cookingRecipe(YamlConfiguration config, String key) { + public static Recipe[] cookingRecipe(YamlConfiguration config, String key) { NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); ItemStack result = getResultItem(config); String choiceStr = config.getString("source.item", ""); @@ -129,7 +131,8 @@ public static Recipe cookingRecipe(YamlConfiguration config, String key) { RecipeChoice source = getRecipeChoice(choiceStr); float exp = (float) config.getDouble("exp", 0); int time = config.getInt("time", 200); - return CookingRecipeBuilder.builder().key(namespacedKey).result(result).block(cookingBlock).source(source).exp(exp).time(time).build(); + Recipe recipe = CookingRecipeBuilder.builder().key(namespacedKey).result(result).block(cookingBlock).source(source).exp(exp).time(time).build(); + return new Recipe[]{recipe}; } public static Recipe[] multipleCookingRecipe(YamlConfiguration config, String key) { @@ -153,18 +156,20 @@ public static Recipe[] multipleCookingRecipe(YamlConfiguration config, String ke return cookingRecipes; } - public static Recipe smithingRecipe(YamlConfiguration config, String key) { + public static Recipe[] smithingRecipe(YamlConfiguration config, String key) { NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); ItemStack result = getResultItem(config); RecipeChoice base = getRecipeChoice(config.getString("source.base", "")); RecipeChoice addition = getRecipeChoice(config.getString("source.addition", "")); + Recipe recipe; if (CrypticLib.minecraftVersion() >= 12000) { RecipeChoice template = getRecipeChoice(config.getString("source.template", "")); XSmithingRecipeBuilder.SmithingType type = XSmithingRecipeBuilder.SmithingType.valueOf(config.getString("source.type", "default").toUpperCase()); - return XSmithingRecipeBuilder.builder(type).key(namespacedKey).result(result).base(base).addition(addition).template(template).build(); + recipe = XSmithingRecipeBuilder.builder(type).key(namespacedKey).result(result).base(base).addition(addition).template(template).build(); } else { - return SmithingRecipeBuilder.builder().key(namespacedKey).result(result).base(base).addition(addition).build(); + recipe = SmithingRecipeBuilder.builder().key(namespacedKey).result(result).base(base).addition(addition).build(); } + return new Recipe[]{recipe}; } public static Recipe[] multipleSmithingRecipe(YamlConfiguration config, String key) { @@ -192,23 +197,25 @@ public static Recipe[] multipleSmithingRecipe(YamlConfiguration config, String k return smithingRecipes; } - public static Recipe stoneCuttingRecipe(YamlConfiguration config, String key) { + public static Recipe[] stoneCuttingRecipe(YamlConfiguration config, String key) { RecipeChoice choice = getRecipeChoice(config.getString("source", "")); ItemStack result; if (config.isList("result")) { + List recipes = new ArrayList<>(); List resultList = config.getStringList("result"); - result = ItemManager.matchItem(resultList.get(0)); - for (int i = 1; i < resultList.size(); i++) { + for (int i = 0; i < resultList.size(); i++) { ItemStack result1 = ItemManager.matchItem(resultList.get(i)); String fullKey = key + "." + i; NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), fullKey); - RecipeManager.regRecipes(namespacedKey, StoneCuttingRecipeBuilder.builder().key(namespacedKey).result(result1).source(choice).build(), config); + recipes.add(StoneCuttingRecipeBuilder.builder().key(namespacedKey).result(result1).source(choice).build()); } + return recipes.toArray(new Recipe[0]); } else { result = getResultItem(config); + NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); + Recipe recipe = StoneCuttingRecipeBuilder.builder().key(namespacedKey).result(result).source(choice).build(); + return new Recipe[]{recipe}; } - NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); - return StoneCuttingRecipeBuilder.builder().key(namespacedKey).result(result).source(choice).build(); } public static Recipe[] multipleStoneCuttingRecipe(YamlConfiguration config, String key) { @@ -244,7 +251,7 @@ public static Recipe[] multipleStoneCuttingRecipe(YamlConfiguration config, Stri } } - public static Recipe anvilRecipe(YamlConfiguration config, String key) { + public static Recipe[] anvilRecipe(YamlConfiguration config, String key) { ItemStack result = getResultItem(config); String baseStr = config.getString("source.base", ""); ItemStack baseItem = ItemManager.matchItem(baseStr); @@ -254,7 +261,8 @@ public static Recipe anvilRecipe(YamlConfiguration config, String key) { AnvilRecipeItem addition = new AnvilRecipeItem(additionItem, additionStr.contains(":")); NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.getInstance(), key); int costLevel = config.getInt("cost_level", 0); - return AnvilRecipeBuilder.builder().key(namespacedKey).result(result).base(base).addition(addition).costLevel(costLevel).build(); + Recipe recipe = AnvilRecipeBuilder.builder().key(namespacedKey).result(result).base(base).addition(addition).costLevel(costLevel).build(); + return new Recipe[]{recipe}; } public static Recipe[] multipleAnvilRecipe(YamlConfiguration config, String key) { diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeManager.java b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeManager.java index cd0c1b1d..0c831845 100644 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeManager.java +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/RecipeManager.java @@ -4,7 +4,6 @@ import com.github.yufiriamazenta.craftorithm.CraftorithmAPI; import com.github.yufiriamazenta.craftorithm.recipe.custom.AnvilRecipe; import com.github.yufiriamazenta.craftorithm.recipe.custom.CustomRecipe; -import com.github.yufiriamazenta.craftorithm.recipe.custom.PotionMixRecipe; import com.github.yufiriamazenta.craftorithm.util.ContainerUtil; import com.github.yufiriamazenta.craftorithm.util.FileUtil; import com.github.yufiriamazenta.craftorithm.util.LangUtil; @@ -27,16 +26,16 @@ public class RecipeManager { private static final YamlConfigWrapper removedRecipeConfig; private static final File recipeFileFolder; private static final Map recipeConfigWrapperMap; - private static final Map> craftorithmRecipeGroupMap; + private static final Map> recipeGroupMap; + private static final Map recipeSortIdMap; private static final Map recipeUnlockMap; - private static final Map recipeSortIdMap; private static final Map anvilRecipeMap; private static final List serverRecipeList; static { removedRecipeConfig = new YamlConfigWrapper(Craftorithm.getInstance(), "removed_recipes.yml"); recipeFileFolder = new File(Craftorithm.getInstance().getDataFolder().getPath(), "recipes"); - craftorithmRecipeGroupMap = new ConcurrentHashMap<>(); + recipeGroupMap = new ConcurrentHashMap<>(); recipeConfigWrapperMap = new ConcurrentHashMap<>(); serverRecipeList = new CopyOnWriteArrayList<>(); recipeUnlockMap = new ConcurrentHashMap<>(); @@ -45,10 +44,10 @@ public class RecipeManager { } public static void loadRecipeManager() { - loadRecipeFiles(); + reloadRecipeFiles(); } - public static void loadRecipeFiles() { + public static void reloadRecipeFiles() { recipeConfigWrapperMap.clear(); if (!recipeFileFolder.exists()) { boolean mkdirResult = recipeFileFolder.mkdir(); @@ -68,14 +67,14 @@ public static void loadRecipeFiles() { } } - public static void loadRecipes() { - loadCraftorithmRecipes(); - loadOtherPluginsRecipes(); - loadRemovedRecipes(); + public static void reloadRecipes() { + reloadCraftorithmRecipes(); + reloadOtherPluginsRecipes(); + reloadRemovedRecipes(); reloadServerRecipeMap(); } - public static void loadCraftorithmRecipes() { + public static void reloadCraftorithmRecipes() { resetRecipes(); for (String fileName : recipeConfigWrapperMap.keySet()) { try { @@ -84,12 +83,11 @@ public static void loadCraftorithmRecipes() { boolean multiple = config.getBoolean("multiple", false); if (multiple) { Recipe[] multipleRecipes = RecipeFactory.newMultipleRecipe(config, fileName); - regRecipes(fileName, Arrays.asList(multipleRecipes), config); + regRecipes(fileName, Arrays.asList(multipleRecipes), configWrapper); } else { - Recipe recipe = RecipeFactory.newRecipe(config, fileName); - regRecipes(fileName, Collections.singletonList(recipe), config); + Recipe[] recipes = RecipeFactory.newRecipe(config, fileName); + regRecipes(fileName, Arrays.asList(recipes), configWrapper); } - recipeConfigWrapperMap.put(fileName, configWrapper); } catch (Exception e) { LangUtil.info("load.recipe_load_exception", ContainerUtil.newHashMap("", fileName)); e.printStackTrace(); @@ -97,18 +95,16 @@ public static void loadCraftorithmRecipes() { } } - public static void regRecipes(String recipeName, List recipes, YamlConfiguration config) { + public static void regRecipes(String recipeName, List recipes, YamlConfigWrapper configWrapper) { + YamlConfiguration config = configWrapper.config(); List recipeKeyList = new ArrayList<>(); for (Recipe recipe : recipes) { NamespacedKey recipeKey = getRecipeKey(recipe); recipeKeyList.add(getRecipeKey(recipe)); if (recipe instanceof CustomRecipe) { - switch (((CustomRecipe) recipe).getRecipeType()) { - case ANVIL: - regAnvilRecipe((AnvilRecipe) recipe); - break; - case POTION: - regPotionMixRecipe((PotionMixRecipe) recipe); + //TODO + if (Objects.requireNonNull(((CustomRecipe) recipe).getRecipeType()) == RecipeType.ANVIL) { + regAnvilRecipe((AnvilRecipe) recipe); } } else { Bukkit.addRecipe(recipe); @@ -120,13 +116,11 @@ public static void regRecipes(String recipeName, List recipes, YamlConfi } } } - craftorithmRecipeGroupMap.put(recipeName, recipeKeyList); - - //TODO 是否要进行排序暂定 -// recipeSortIdMap.put(key, config.getInt("sort_id", 0)); + recipeGroupMap.put(recipeName, recipeKeyList); + recipeSortIdMap.put(recipeName, config.getInt("sort_id", 0)); } - private static void loadOtherPluginsRecipes() { + private static void reloadOtherPluginsRecipes() { Map> pluginRecipeMap = CraftorithmAPI.INSTANCE.getPluginRegRecipeMap(); for (String plugin : pluginRecipeMap.keySet()) { if (plugin.equals(NamespacedKey.MINECRAFT) || plugin.equals(Craftorithm.getInstance().getName())) @@ -137,7 +131,7 @@ private static void loadOtherPluginsRecipes() { } } - private static void loadRemovedRecipes() { + private static void reloadRemovedRecipes() { List removedRecipes = removedRecipeConfig.config().getStringList("recipes"); if (Craftorithm.getInstance().getConfig().getBoolean("remove_all_vanilla_recipe", false)) { for (NamespacedKey key : serverRecipeList) { @@ -168,12 +162,11 @@ public static void resetRecipes() { }); //删除Craftorithm的配方 - craftorithmRecipeGroupMap.forEach((key, recipes) -> { - removeCraftorithmRecipe(key); + recipeGroupMap.forEach((key, recipes) -> { + removeCraftorithmRecipe(key, false); }); anvilRecipeMap.clear(); - craftorithmRecipeGroupMap.clear(); - recipeConfigWrapperMap.clear(); + recipeGroupMap.clear(); recipeUnlockMap.clear(); recipeSortIdMap.clear(); reloadServerRecipeMap(); @@ -206,6 +199,12 @@ else if (recipe instanceof AnvilRecipe) private static int removeRecipes(List recipeKeys) { if (recipeKeys == null || recipeKeys.isEmpty()) return 0; + //删除表里缓存的一些数据 + for (NamespacedKey recipeKey : recipeKeys) { + recipeUnlockMap.remove(recipeKey); + } + + //在服务器中缓存的数据 int removedRecipeNum = 0; if (CrypticLib.minecraftVersion() >= 11500) { for (NamespacedKey recipeKey : recipeKeys) { @@ -222,20 +221,21 @@ private static int removeRecipes(List recipeKeys) { removedRecipeNum ++; //TODO 维护表 } - reloadServerRecipeMap(); } + reloadServerRecipeMap(); } return removedRecipeNum; } - public static boolean removeCraftorithmRecipe(String recipeName) { - int i = removeRecipes(craftorithmRecipeGroupMap.getOrDefault(recipeName, new ArrayList<>())); + public static boolean removeCraftorithmRecipe(String recipeName, boolean deleteFile) { + int i = removeRecipes(recipeGroupMap.getOrDefault(recipeName, new ArrayList<>())); YamlConfigWrapper recipeConfig = recipeConfigWrapperMap.get(recipeName); - if (recipeConfig != null) { + if (recipeConfig != null && deleteFile) { recipeConfig.configFile().delete(); } recipeConfigWrapperMap.remove(recipeName); - craftorithmRecipeGroupMap.remove(recipeName); + recipeGroupMap.remove(recipeName); + recipeSortIdMap.remove(recipeName); return i > 0; } @@ -245,9 +245,12 @@ public static boolean disableOtherPluginsRecipe(List recipeKeys) return removeRecipes(recipeKeys) > 0; } - public static void addKeyToRemovedConfig(List keys) { + private static void addKeyToRemovedConfig(List keys) { List removedList = removedRecipeConfig.config().getStringList("recipes"); + boolean removeAllVanillaRecipe = Craftorithm.getInstance().getConfig().getBoolean("remove_all_vanilla_recipe"); for (NamespacedKey key : keys) { + if (key.getNamespace().equals(NamespacedKey.MINECRAFT) && removeAllVanillaRecipe) + continue; String keyStr = key.toString(); if (!removedList.contains(keyStr)) removedList.add(keyStr); @@ -262,14 +265,18 @@ public static void reloadServerRecipeMap() { while (recipeIterator.hasNext()) { Recipe recipe = recipeIterator.next(); NamespacedKey key = RecipeManager.getRecipeKey(recipe); - serverRecipeList.put(key, recipe); + serverRecipeList.add(key); } } - - public static YamlConfiguration getRecipeConfig(NamespacedKey recipeKey) { - return recipeKey != null ? recipeKeyConfigMap.get(recipeKey) : null; + for (String recipeName : recipeGroupMap.keySet()) { + List recipeKeys = recipeGroupMap.getOrDefault(recipeName, new ArrayList<>()); + if (recipeKeys.contains(recipeKey)) { + return recipeConfigWrapperMap.get(recipeName).config(); + } + } + return null; } public static NamespacedKey getRecipeKey(Recipe recipe) { @@ -281,17 +288,14 @@ public static NamespacedKey getRecipeKey(Recipe recipe) { return ((Keyed) recipe).getKey(); } - public static List getCraftorithmRecipe(String key) { + public static List getCraftorithmRecipe(String recipeName) { List recipes = new ArrayList<>(); - if (key.contains(":")) { - return getCraftorithmRecipe(NamespacedKey.fromString(key)); - } else { - return getCraftorithmRecipe(NamespacedKey.fromString(key, Craftorithm.getInstance())); + for (NamespacedKey key : recipeGroupMap.getOrDefault(recipeName, new ArrayList<>())) { + Recipe recipe = Bukkit.getRecipe(key); + if (recipe != null) + recipes.add(recipe); } - } - - public static RecipeType getCraftorithmRecipeType(Recipe recipe) { - return recipeTypeMap.getOrDefault(recipe, RecipeType.UNKNOWN); + return recipes; } public static AnvilRecipe matchAnvilRecipe(ItemStack base, ItemStack addition) { @@ -314,17 +318,21 @@ public static void regAnvilRecipe(AnvilRecipe recipe) { anvilRecipeMap.put(recipe.getKey(), recipe); } - private static void regPotionMixRecipe(PotionMixRecipe recipe) { - //TODO - } +// private static void regPotionMixRecipe(PotionMix recipe) { +// //TODO +// } + public static Map> getRecipeGroupMap() { + return recipeGroupMap; + } + public static YamlConfigWrapper getRemovedRecipeConfig() { return removedRecipeConfig; } - public static Map getServerRecipeList() { - return Collections.unmodifiableMap(serverRecipeList); + public static List getServerRecipeList() { + return serverRecipeList; } public static Map getRecipeUnlockMap() { @@ -336,20 +344,10 @@ public static Map getRecipeConfigWrapperMap() { } public static Map getAnvilRecipeMap() {return anvilRecipeMap;} - - public static List getPluginRecipeKeys() { - return new ArrayList<>(recipeKeyMap.keySet()); + public static Map getRecipeSortIdMap() { + return recipeSortIdMap; } - public static Map getPluginRecipeTypeMap() { - return new ConcurrentHashMap<>(recipeTypeMap); - } - - public static Map getRecipeSortIdMap() { - return new ConcurrentHashMap<>(recipeSortIdMap); - } - - private static void saveDefConfigFile(List allFiles) { Craftorithm.getInstance().saveResource("recipes/example_shaped.yml", false); Craftorithm.getInstance().saveResource("recipes/example_shapeless.yml", false); diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/builder/vanilla/PotionMixBuilder.java b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/builder/vanilla/PotionMixBuilder.java new file mode 100644 index 00000000..512caae4 --- /dev/null +++ b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/builder/vanilla/PotionMixBuilder.java @@ -0,0 +1,5 @@ +package com.github.yufiriamazenta.craftorithm.recipe.builder.vanilla; + +public class PotionMixBuilder { + //TODO +} diff --git a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/custom/PotionMixRecipe.java b/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/custom/PotionMixRecipe.java deleted file mode 100644 index f6167203..00000000 --- a/src/main/java/com/github/yufiriamazenta/craftorithm/recipe/custom/PotionMixRecipe.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.github.yufiriamazenta.craftorithm.recipe.custom; - -import com.github.yufiriamazenta.craftorithm.recipe.RecipeType; -import org.bukkit.NamespacedKey; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.RecipeChoice; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; - -public class PotionMixRecipe implements CustomRecipe { - - private NamespacedKey key; - private ItemStack result; - private RecipeChoice input; - private RecipeChoice sourcePotion; - - /** - * 一个炼药配方 - * @param key 配方的key - * @param result 配方的结果 - * @param input 配方的酿造材料 - * @param sourcePotion 配方的源药水 - */ - public PotionMixRecipe(@NotNull NamespacedKey key, @NotNull ItemStack result, @NotNull RecipeChoice input, @NotNull RecipeChoice sourcePotion) { - this.key = key; - this.result = result; - this.input = input; - this.sourcePotion = sourcePotion; - } - - @Override - public RecipeType getRecipeType() { - return RecipeType.POTION; - } - - public NamespacedKey getKey() { - return this.key; - } - - @Override - public void setKey(NamespacedKey key) { - this.key = key; - } - - public @NotNull ItemStack getResult() { - return this.result; - } - - public @NotNull RecipeChoice getInput() { - return this.input; - } - - public void setResult(ItemStack result) { - this.result = result; - } - - public void setInput(RecipeChoice input) { - this.input = input; - } - - public void setSourcePotion(RecipeChoice sourcePotion) { - this.sourcePotion = sourcePotion; - } - - public @NotNull RecipeChoice getSourcePotion() { - return this.sourcePotion; - } - - @Override - public int hashCode() { - return Objects.hash(this.key, this.result, this.input, this.sourcePotion); - } - -}