Skip to content

Commit

Permalink
[2.0.0-dev13]将配方注册和注销方法移到RecipeType
Browse files Browse the repository at this point in the history
  • Loading branch information
YufiriaMazenta committed Jan 23, 2024
1 parent a56f5a0 commit d0076a1
Show file tree
Hide file tree
Showing 4 changed files with 134 additions and 69 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import java.text.SimpleDateFormat
version = "2.0.0-dev12"
version = "2.0.0-dev13"

plugins {
`java-library`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public RecipeGroup removeRecipeRegistry(String recipeName) {
return this;
}
RecipeRegistry registry = groupRecipeRegistryMap.get(recipeKey);
RecipeManager.INSTANCE.recipeRemoverMap().get(registry.recipeType()).accept(Collections.singletonList(recipeKey));
registry.recipeType().remover().accept(Collections.singletonList(recipeKey));
groupRecipeRegistryMap.remove(recipeKey);
groupRecipeKeyMap.remove(recipeName);
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.github.yufiriamazenta.craftorithm.Craftorithm;
import com.github.yufiriamazenta.craftorithm.config.Languages;
import com.github.yufiriamazenta.craftorithm.config.PluginConfigs;
import com.github.yufiriamazenta.craftorithm.exception.UnsupportedVersionException;
import com.github.yufiriamazenta.craftorithm.recipe.custom.AnvilRecipe;
import com.github.yufiriamazenta.craftorithm.recipe.custom.CustomRecipe;
import com.github.yufiriamazenta.craftorithm.recipe.custom.PotionMixRecipe;
Expand All @@ -23,7 +22,6 @@
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;

import static com.github.yufiriamazenta.craftorithm.recipe.RecipeType.*;

Expand All @@ -34,8 +32,6 @@ public enum RecipeManager {
public static final String PLUGIN_RECIPE_NAMESPACE = "craftorithm";
private final ConfigWrapper removedRecipesConfigWrapper = new ConfigWrapper(Craftorithm.instance(), "removed_recipes.yml");
private final Map<String, RecipeGroup> recipeGroupMap = new ConcurrentHashMap<>();
private final Map<RecipeType, Consumer<Recipe>> recipeRegisterMap = new ConcurrentHashMap<>();
private final Map<RecipeType, Consumer<List<NamespacedKey>>> recipeRemoverMap = new ConcurrentHashMap<>();
private final Map<NamespacedKey, Boolean> recipeUnlockMap = new ConcurrentHashMap<>();
private final List<Recipe> removeRecipeRecycleBin = new CopyOnWriteArrayList<>();
private final Map<NamespacedKey, Recipe> serverRecipesCache = new ConcurrentHashMap<>();
Expand All @@ -44,52 +40,12 @@ public enum RecipeManager {
private boolean supportPotionMix;

RecipeManager() {
//设置各类型配方的注册方法
recipeRegisterMap.put(SHAPED, Bukkit::addRecipe);
recipeRemoverMap.put(SHAPED, this::removeRecipes);
recipeRegisterMap.put(SHAPELESS, Bukkit::addRecipe);
recipeRemoverMap.put(SHAPELESS, this::removeRecipes);
if (CrypticLib.minecraftVersion() >= 11400) {
recipeRegisterMap.put(COOKING, Bukkit::addRecipe);
recipeRemoverMap.put(COOKING, this::removeRecipes);
recipeRegisterMap.put(RecipeType.STONE_CUTTING, Bukkit::addRecipe);
recipeRemoverMap.put(RecipeType.STONE_CUTTING, this::removeRecipes);
recipeRegisterMap.put(RecipeType.SMITHING, Bukkit::addRecipe);
recipeRemoverMap.put(RecipeType.SMITHING, this::removeRecipes);
}
if (CrypticLib.minecraftVersion() >= 11700) {
recipeRegisterMap.put(RecipeType.RANDOM_COOKING, Bukkit::addRecipe);
recipeRemoverMap.put(RecipeType.RANDOM_COOKING, this::removeRecipes);
}

if (PluginConfigs.ENABLE_ANVIL_RECIPE.value()) {
recipeRegisterMap.put(RecipeType.ANVIL, recipe -> {
anvilRecipeMap.put(getRecipeKey(recipe), (AnvilRecipe) recipe);
});
recipeRemoverMap.put(RecipeType.ANVIL, keys -> {
for (NamespacedKey key : keys) {
anvilRecipeMap.remove(key);
}
});
}

try {
Class.forName("io.papermc.paper.potion.PotionMix");
supportPotionMix = true;
} catch (Exception e) {
supportPotionMix = false;
}
if (supportPotionMix) {
recipeRegisterMap.put(RecipeType.POTION, recipe -> {
Bukkit.getPotionBrewer().addPotionMix(((PotionMixRecipe) recipe).potionMix());
potionMixRecipeMap.put(((PotionMixRecipe) recipe).key(), (PotionMixRecipe) recipe);
});
recipeRemoverMap.put(RecipeType.POTION, recipeList -> {
for (NamespacedKey recipeKey : recipeList) {
Bukkit.getPotionBrewer().removePotionMix(recipeKey);
}
});
}
}

public void reloadRecipeManager() {
Expand Down Expand Up @@ -148,9 +104,7 @@ private void loadRecipeGroups() {
public void regRecipe(String recipeGroupName, Recipe recipe, RecipeType recipeType) {
if (!recipeGroupMap.containsKey(recipeGroupName))
throw new IllegalArgumentException("Can not find recipe group " + recipeGroupName + ", use addRecipeGroup() method to add recipe group.");
recipeRegisterMap.getOrDefault(recipeType, recipe1 -> {
throw new UnsupportedVersionException("Can not register " + recipeType.typeId().toLowerCase() + " recipe");
}).accept(recipe);
recipeType.register().accept(recipe);
}

public Map<String, RecipeGroup> recipeGroupMap() {
Expand Down Expand Up @@ -212,7 +166,7 @@ public boolean removeRecipeGroup(String recipeGroupName, boolean deleteFile) {
return false;
recipeGroup.groupRecipeRegistryMap.forEach(
(recipeKey, recipeRegistry) -> {
recipeRemoverMap.get(recipeRegistry.recipeType()).accept(Collections.singletonList(recipeKey));
recipeRegistry.recipeType().remover().accept(Collections.singletonList(recipeKey));
}
);
ConfigWrapper recipeConfig = recipeGroupMap.get(recipeGroupName).recipeGroupConfig();
Expand Down Expand Up @@ -251,7 +205,7 @@ private void addRecipeToRemovedRecipeRecycleBin(List<NamespacedKey> recipeKeys)
* @param recipeKeys 要删除的配方
* @return 删除的配方数量
*/
private int removeRecipes(List<NamespacedKey> recipeKeys) {
public int removeRecipes(List<NamespacedKey> recipeKeys) {
if (recipeKeys == null || recipeKeys.isEmpty())
return 0;
//删除表里缓存的一些数据
Expand Down Expand Up @@ -386,18 +340,14 @@ public void loadServerRecipeCache() {
}
}

public Map<RecipeType, Consumer<Recipe>> recipeRegisterMap() {
return recipeRegisterMap;
}

public Map<RecipeType, Consumer<List<NamespacedKey>>> recipeRemoverMap() {
return recipeRemoverMap;
}

public Map<NamespacedKey, PotionMixRecipe> potionMixRecipeMap() {
return potionMixRecipeMap;
}

public Map<NamespacedKey, AnvilRecipe> anvilRecipeMap() {
return anvilRecipeMap;
}

public List<String> getRecipeGroups() {
return new ArrayList<>(recipeGroupMap.keySet());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,128 @@
package com.github.yufiriamazenta.craftorithm.recipe;

import com.github.yufiriamazenta.craftorithm.config.Languages;
import com.github.yufiriamazenta.craftorithm.config.PluginConfigs;
import com.github.yufiriamazenta.craftorithm.recipe.custom.AnvilRecipe;
import com.github.yufiriamazenta.craftorithm.recipe.custom.PotionMixRecipe;
import crypticlib.CrypticLib;
import crypticlib.chat.entry.StringLangConfigEntry;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.Recipe;
import org.jetbrains.annotations.NotNull;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

public final class RecipeType {

private static final Map<String, RecipeType> BY_NAME = new ConcurrentHashMap<>();

public static RecipeType SHAPED = new RecipeType("shaped", Languages.RECIPE_TYPE_NAME_SHAPED);
public static RecipeType SHAPELESS = new RecipeType("shapeless", Languages.RECIPE_TYPE_NAME_SHAPELESS);
public static RecipeType COOKING = new RecipeType("cooking", Languages.RECIPE_TYPE_NAME_COOKING);
public static RecipeType SMITHING = new RecipeType("smithing", Languages.RECIPE_TYPE_NAME_SMITHING);
public static RecipeType STONE_CUTTING = new RecipeType("stone_cutting", Languages.RECIPE_TYPE_NAME_STONE_CUTTING);
public static RecipeType RANDOM_COOKING = new RecipeType("random_cooking", Languages.RECIPE_TYPE_NAME_COOKING);
public static RecipeType UNKNOWN = new RecipeType("unknown", null);
public static RecipeType POTION = new RecipeType("potion", Languages.RECIPE_TYPE_NAME_POTION);
public static RecipeType ANVIL = new RecipeType("anvil", Languages.RECIPE_TYPE_NAME_ANVIL);
public static RecipeType SHAPED = new RecipeType(
"shaped",
Languages.RECIPE_TYPE_NAME_SHAPED,
Bukkit::addRecipe,
RecipeManager.INSTANCE::removeRecipes
);
public static RecipeType SHAPELESS = new RecipeType(
"shapeless",
Languages.RECIPE_TYPE_NAME_SHAPELESS,
Bukkit::addRecipe,
RecipeManager.INSTANCE::removeRecipes
);
public static RecipeType COOKING = new RecipeType(
"cooking",
Languages.RECIPE_TYPE_NAME_COOKING,
recipe -> {
if (CrypticLib.minecraftVersion() >= 11400) {
Bukkit.addRecipe(recipe);
}
},
RecipeManager.INSTANCE::removeRecipes
);
public static RecipeType SMITHING = new RecipeType(
"smithing",
Languages.RECIPE_TYPE_NAME_SMITHING,
recipe -> {
if (CrypticLib.minecraftVersion() >= 11400) {
Bukkit.addRecipe(recipe);
}
},
RecipeManager.INSTANCE::removeRecipes
);
public static RecipeType STONE_CUTTING = new RecipeType(
"stone_cutting",
Languages.RECIPE_TYPE_NAME_STONE_CUTTING,
recipe -> {
if (CrypticLib.minecraftVersion() >= 11400) {
Bukkit.addRecipe(recipe);
}
},
RecipeManager.INSTANCE::removeRecipes
);
public static RecipeType RANDOM_COOKING = new RecipeType(
"random_cooking",
Languages.RECIPE_TYPE_NAME_COOKING,
recipe -> {
if (CrypticLib.minecraftVersion() >= 11700) {
Bukkit.addRecipe(recipe);
}
},
RecipeManager.INSTANCE::removeRecipes
);
public static RecipeType UNKNOWN = new RecipeType(
"unknown",
null,
recipe -> {},
keys -> {}
);
public static RecipeType POTION = new RecipeType(
"potion",
Languages.RECIPE_TYPE_NAME_POTION,
recipe -> {
if (!RecipeManager.INSTANCE.supportPotionMix())
return;
Bukkit.getPotionBrewer().addPotionMix(((PotionMixRecipe) recipe).potionMix());
RecipeManager.INSTANCE.potionMixRecipeMap().put(((PotionMixRecipe) recipe).key(), (PotionMixRecipe) recipe);
},
keys -> {
if (!RecipeManager.INSTANCE.supportPotionMix())
return;
for (NamespacedKey recipeKey : keys) {
Bukkit.getPotionBrewer().removePotionMix(recipeKey);
RecipeManager.INSTANCE.potionMixRecipeMap().remove(recipeKey);
}
}
);
public static RecipeType ANVIL = new RecipeType(
"anvil",
Languages.RECIPE_TYPE_NAME_ANVIL,
recipe -> {
if (!PluginConfigs.ENABLE_ANVIL_RECIPE.value())
return;
RecipeManager.INSTANCE.anvilRecipeMap().put(RecipeManager.INSTANCE.getRecipeKey(recipe), (AnvilRecipe) recipe);
},
keys -> {
if (!PluginConfigs.ENABLE_ANVIL_RECIPE.value())
return;
for (NamespacedKey key : keys) {
RecipeManager.INSTANCE.anvilRecipeMap().remove(key);
}
}
);

private final String typeId;
private StringLangConfigEntry typeName;
private Consumer<Recipe> register;
private Consumer<List<NamespacedKey>> remover;

private RecipeType(String typeId, StringLangConfigEntry typeName) {
private RecipeType(@NotNull String typeId, StringLangConfigEntry typeName, @NotNull Consumer<Recipe> register, @NotNull Consumer<List<NamespacedKey>> remover) {
this.typeId = typeId.toUpperCase();
this.typeName = typeName;
this.register = register;
this.remover = remover;
BY_NAME.put(this.typeId, this);
}

Expand All @@ -42,6 +139,24 @@ public RecipeType setTypeName(StringLangConfigEntry typeName) {
return this;
}

public Consumer<Recipe> register() {
return register;
}

public RecipeType setRegister(Consumer<Recipe> register) {
this.register = register;
return this;
}

public Consumer<List<NamespacedKey>> remover() {
return remover;
}

public RecipeType setRemover(Consumer<List<NamespacedKey>> remover) {
this.remover = remover;
return this;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down

0 comments on commit d0076a1

Please sign in to comment.