Skip to content

Commit

Permalink
[1.10.6-beta2]锻造配方新增copy_enchantments字段,修复1.19.4-1.20.4版本copy_nbt实际效果…
Browse files Browse the repository at this point in the history
…相反的bug
  • Loading branch information
YufiriaMazenta committed Jul 28, 2024
1 parent 6eb599a commit 2e99c26
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 135 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 = "1.10.6-beta1"
version = "1.10.6-beta2"

plugins {
`java-library`
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ public void runConditions(PrepareAnvilEvent event) {

//正常合成流程
ItemStack result = anvilRecipe.result();
String resultId = ItemManager.INSTANCE.matchItemName(result, false);
if (resultId != null) {
ItemStack refreshItem = ItemManager.INSTANCE.matchItem(resultId, (Player) event.getViewers().get(0));
result.setItemMeta(refreshItem.getItemMeta());
}
if (anvilRecipe.copyNbt()) {
if (base.hasItemMeta())
result.setItemMeta(base.getItemMeta());
Expand Down Expand Up @@ -96,11 +101,7 @@ public void runConditions(PrepareAnvilEvent event) {
}
event.getInventory().setRepairCost(anvilRecipe.costLevel());
//刷新物品
String resultId = ItemManager.INSTANCE.matchItemName(result, false);
if (resultId != null) {
ItemStack refreshItem = ItemManager.INSTANCE.matchItem(resultId, (Player) event.getViewers().get(0));
result.setItemMeta(refreshItem.getItemMeta());
}

event.setResult(result);
event.getInventory().setItem(2, result);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
import com.github.yufiriamazenta.craftorithm.arcenciel.ArcencielDispatcher;
import com.github.yufiriamazenta.craftorithm.item.ItemManager;
import com.github.yufiriamazenta.craftorithm.recipe.RecipeManager;
import com.github.yufiriamazenta.craftorithm.util.CollectionsUtil;
import com.github.yufiriamazenta.craftorithm.util.ItemUtils;
import crypticlib.listener.BukkitListener;
import org.bukkit.NamespacedKey;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
Expand All @@ -18,15 +20,18 @@
import org.bukkit.event.inventory.SmithItemEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.meta.ItemMeta;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@BukkitListener
public enum SmithingHandler implements Listener {

INSTANCE;

@EventHandler(priority = EventPriority.LOWEST)
@EventHandler(priority = EventPriority.MONITOR)
public void refreshResult(PrepareSmithingEvent event) {
if (event.getResult() == null)
return;
Expand All @@ -38,21 +43,45 @@ public void refreshResult(PrepareSmithingEvent event) {
return;
}

ItemStack item = event.getResult();
String id = ItemManager.INSTANCE.matchItemName(item, false);
if (id == null) {
return;
ItemStack result = event.getResult();
String id = ItemManager.INSTANCE.matchItemName(result, false);
if (id != null) {
ItemStack refreshItem = ItemManager.INSTANCE.matchItem(id, (Player) event.getViewers().get(0));
if (!result.isSimilar(refreshItem)) {
result.setItemMeta(refreshItem.getItemMeta());
}
}
ItemStack refreshItem = ItemManager.INSTANCE.matchItem(id, (Player) event.getViewers().get(0));
if (item.isSimilar(refreshItem)) {
return;

boolean copyEnchantment = RecipeManager.INSTANCE.getSmithingCopyEnchantment(recipe);
if (copyEnchantment) {
ItemStack base = event.getInventory().getItem(1);
if (base.hasItemMeta()) {
Map<Enchantment, Integer> baseEnchantments = base.getItemMeta().getEnchants();
ItemMeta resultMeta = result.getItemMeta();
Map<Enchantment, Integer> resultEnchantments = new HashMap<>(resultMeta.getEnchants());
CollectionsUtil.putAllIf(resultEnchantments, baseEnchantments, (type, level) -> {
if (resultEnchantments.containsKey(type)) {
return level > resultEnchantments.get(type);
} else {
return true;
}
});
resultMeta.getEnchants().forEach(
(enchant, level) -> {
resultMeta.removeEnchant(enchant);
}
);
resultEnchantments.forEach((enchant, level) -> {
resultMeta.addEnchant(enchant, level, true);
});
result.setItemMeta(resultMeta);
}
}
item.setItemMeta(refreshItem.getItemMeta());
event.setResult(item);
event.getInventory().setResult(item);
event.setResult(result);
event.getInventory().setResult(result);
}

@EventHandler(priority = EventPriority.MONITOR)
@EventHandler(priority = EventPriority.HIGHEST)
public void runConditions(PrepareSmithingEvent event) {
NamespacedKey recipeKey = RecipeManager.INSTANCE.getRecipeKey(event.getInventory().getRecipe());
if (recipeKey == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,7 @@ public RecipeCreator setTitle(String title) {
public void regRecipeGroup(ConfigWrapper recipeConfig) {
RecipeGroup recipeGroup = new RecipeGroup(recipeName, recipeType(), recipeConfig);
RecipeManager.INSTANCE.addRecipeGroup(recipeGroup);
for (RecipeRegistry recipeRegistry : RecipeFactory.newRecipeRegistry(recipeConfig.config(), recipeName)) {
recipeRegistry.register();
}
RecipeManager.INSTANCE.loadRecipeGroup(recipeGroup);
if (CrypticLib.isPaper()) {
Bukkit.updateRecipes();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import com.github.yufiriamazenta.craftorithm.item.ItemManager;
import com.github.yufiriamazenta.craftorithm.recipe.registry.RecipeRegistry;
import com.github.yufiriamazenta.craftorithm.recipe.registry.impl.*;
import crypticlib.CrypticLib;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.Tag;
Expand Down Expand Up @@ -258,11 +257,12 @@ public static List<RecipeRegistry> newSmithingRecipe(YamlConfiguration config, S
ItemStack result = getResultItem(config);
RecipeChoice base = getRecipeChoice(config.getString("source.base", ""));
RecipeChoice addition = getRecipeChoice(config.getString("source.addition", ""));
boolean copyNbt = config.getBoolean("source.copy_nbt", true);
boolean copyNbt = config.getBoolean("source.copy_nbt", false);
boolean copyEnchantments = config.getBoolean("source.copy_enchantments", true);
RecipeRegistry recipeRegistry;
RecipeChoice template = getRecipeChoice(config.getString("source.template", ""));
XSmithingRecipeRegistry.SmithingType type = XSmithingRecipeRegistry.SmithingType.valueOf(config.getString("source.type", "default").toUpperCase());
recipeRegistry = new XSmithingRecipeRegistry(key, namespacedKey, result).setSmithingType(type).setTemplate(template).setBase(base).setAddition(addition).setCopyNbt(copyNbt);
SmithingRecipeRegistry.SmithingType type = SmithingRecipeRegistry.SmithingType.valueOf(config.getString("source.type", "default").toUpperCase());
recipeRegistry = new SmithingRecipeRegistry(key, namespacedKey, result).setSmithingType(type).setTemplate(template).setBase(base).setAddition(addition).setCopyNbt(copyNbt).setCopyEnchantments(copyEnchantments);
return Collections.singletonList(recipeRegistry);
}

Expand All @@ -276,14 +276,15 @@ public static List<RecipeRegistry> newMultipleSmithingRecipe(YamlConfiguration c
NamespacedKey namespacedKey = new NamespacedKey(Craftorithm.instance(), fullKey);
RecipeChoice base = getRecipeChoice((String) map.get("base"));
RecipeChoice addition = getRecipeChoice((String) map.get("addition"));
boolean copyNbt = map.containsKey("copy_nbt") ? (Boolean) map.get("copy_nbt") : true;
boolean copyNbt = map.containsKey("copy_nbt") ? (Boolean) map.get("copy_nbt") : false;
boolean copyEnchantments = map.containsKey("copy_enchantments") ? (Boolean) map.get("copy_enchantments") : true;
String typeStr = (String) map.get("type");
if (typeStr == null) {
typeStr = "DEFAULT";
}
RecipeChoice template = getRecipeChoice((String) map.get("template"));
XSmithingRecipeRegistry.SmithingType type = XSmithingRecipeRegistry.SmithingType.valueOf(typeStr.toUpperCase());
recipeRegistries.add(new XSmithingRecipeRegistry(key, namespacedKey, result).setSmithingType(type).setTemplate(template).setBase(base).setAddition(addition).setCopyNbt(copyNbt));
SmithingRecipeRegistry.SmithingType type = SmithingRecipeRegistry.SmithingType.valueOf(typeStr.toUpperCase());
recipeRegistries.add(new SmithingRecipeRegistry(key, namespacedKey, result).setSmithingType(type).setTemplate(template).setBase(base).setAddition(addition).setCopyNbt(copyNbt).setCopyEnchantments(copyEnchantments));
}
return recipeRegistries;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
import com.github.yufiriamazenta.craftorithm.recipe.custom.CustomRecipe;
import com.github.yufiriamazenta.craftorithm.recipe.custom.PotionMixRecipe;
import com.github.yufiriamazenta.craftorithm.recipe.registry.RecipeRegistry;
import com.github.yufiriamazenta.craftorithm.recipe.registry.impl.SmithingRecipeRegistry;
import com.github.yufiriamazenta.craftorithm.util.CollectionsUtil;
import com.github.yufiriamazenta.craftorithm.util.LangUtil;
import crypticlib.CrypticLib;
import crypticlib.chat.MsgSender;
import crypticlib.config.ConfigWrapper;
import crypticlib.lang.entry.StringLangEntry;
import crypticlib.platform.IPlatform;
Expand All @@ -36,6 +36,7 @@ public enum RecipeManager {
public final File RECIPE_FILE_FOLDER = new File(Craftorithm.instance().getDataFolder().getPath(), "recipes");
private final ConfigWrapper removedRecipesConfigWrapper = new ConfigWrapper(Craftorithm.instance(), "removed_recipes.yml");
public final String PLUGIN_RECIPE_NAMESPACE = "craftorithm";
private final Map<NamespacedKey, RecipeRegistry> recipeRegistryMap = new ConcurrentHashMap<>();
private final Map<RecipeType, Map<String, RecipeGroup>> pluginRecipeMap;
private final Map<RecipeType, Consumer<Recipe>> recipeRegisterMap;
private final Map<RecipeType, Consumer<List<NamespacedKey>>> recipeRemoverMap;
Expand All @@ -45,14 +46,7 @@ public enum RecipeManager {
private final Map<NamespacedKey, PotionMixRecipe> potionMixRecipeMap;
private final Map<NamespacedKey, AnvilRecipe> anvilRecipeMap;
public static final List<RecipeType> UNLOCKABLE_RECIPE_TYPE =
Collections.unmodifiableList(Arrays.asList(
RecipeType.SHAPED,
RecipeType.SHAPELESS,
RecipeType.COOKING,
RecipeType.SMITHING,
RecipeType.STONE_CUTTING,
RecipeType.RANDOM_COOKING
));
List.of(RecipeType.SHAPED, RecipeType.SHAPELESS, RecipeType.COOKING, RecipeType.SMITHING, RecipeType.STONE_CUTTING, RecipeType.RANDOM_COOKING);
private boolean supportPotionMix;

RecipeManager() {
Expand Down Expand Up @@ -130,6 +124,7 @@ public void loadRecipeGroup(RecipeGroup recipeGroup) {
}
for (RecipeRegistry recipeRegistry : RecipeFactory.newRecipeRegistry(config, recipeGroup.groupName())) {
recipeRegistry.register();
recipeRegistryMap.put(recipeRegistry.namespacedKey(), recipeRegistry);
if (UNLOCKABLE_RECIPE_TYPE.contains(recipeGroup.recipeType())) {
recipeUnlockMap.put(recipeRegistry.namespacedKey(), recipeGroup.unlock());
}
Expand Down Expand Up @@ -202,13 +197,13 @@ public Recipe getRecipe(NamespacedKey namespacedKey) {
return Bukkit.getRecipe(namespacedKey);
}

public NamespacedKey getRecipeKey(Recipe recipe) {
public @Nullable NamespacedKey getRecipeKey(Recipe recipe) {
if (recipe instanceof CustomRecipe customRecipe) {
return customRecipe.key();
} else if (recipe instanceof Keyed keyed) {
return keyed.getKey();
} else {
MsgSender.info("&e[WARN] Can not get key of recipe " + recipe);
// MsgSender.info("&e[WARN] Can not get key of recipe " + recipe);
return null;
}
}
Expand Down Expand Up @@ -401,6 +396,19 @@ public StringLangEntry getRecipeTypeName(RecipeType recipeType) {
};
}

public boolean getSmithingCopyEnchantment(Recipe recipe) {
if (!(recipe instanceof SmithingRecipe))
return false;
NamespacedKey namespacedKey = getRecipeKey(recipe);
if (namespacedKey == null)
return false;
RecipeRegistry recipeRegistry = recipeRegistryMap.get(namespacedKey);
if (!(recipeRegistry instanceof SmithingRecipeRegistry smithingRecipeRegistry)) {
return false;
}
return smithingRecipeRegistry.copyEnchantments();
}

public void resetRecipes() {
//删除Craftorithm的配方
pluginRecipeMap.forEach((type, recipeGroupMaps) -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,32 @@
import com.github.yufiriamazenta.craftorithm.recipe.registry.RecipeRegistry;
import crypticlib.CrypticLib;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.SmithingRecipe;
import org.bukkit.inventory.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Objects;

/**
* 1.20以下的锻造台配方注册器
*/
public class SmithingRecipeRegistry extends RecipeRegistry {

private RecipeChoice template;
private SmithingType smithingType;
private RecipeChoice base, addition;
protected boolean copyNbt = true;
protected boolean copyNbt = false;
protected boolean copyEnchantments = true;

public SmithingRecipeRegistry(@NotNull String recipeGroup, @NotNull NamespacedKey namespacedKey, ItemStack result) {
public SmithingRecipeRegistry(@NotNull String recipeGroup, @NotNull NamespacedKey namespacedKey, @Nullable ItemStack result) {
super(recipeGroup, namespacedKey, result);
this.smithingType = SmithingType.TRANSFORM;
}

public RecipeChoice template() {
return template;
}

public SmithingRecipeRegistry setTemplate(RecipeChoice template) {
this.template = template;
return this;
}

public RecipeChoice base() {
Expand All @@ -44,26 +53,61 @@ public SmithingRecipeRegistry setAddition(RecipeChoice addition) {

public boolean copyNbt() {
//因为1.20.6开始Paper对组件的处理与NBT不同,所以需要倒转此属性
return !copyNbt;
if (CrypticLib.minecraftVersion() >= 12005)
return !copyNbt;
else
return copyNbt;
}

public SmithingRecipeRegistry setCopyNbt(boolean copyNbt) {
this.copyNbt = copyNbt;
return this;
}

public boolean copyEnchantments() {
return copyEnchantments;
}

public SmithingRecipeRegistry setCopyEnchantments(boolean copyEnchantments) {
this.copyEnchantments = copyEnchantments;
return this;
}

@Override
public void register() {
Objects.requireNonNull(namespacedKey(), "Recipe key cannot be null");
Objects.requireNonNull(result(), "Recipe result cannot be null");
Objects.requireNonNull(base, "Recipe base cannot be null");
Objects.requireNonNull(addition, "Recipe addition cannot be null");
Objects.requireNonNull(base(), "Recipe base cannot be null");
Objects.requireNonNull(addition(), "Recipe addition cannot be null");
Objects.requireNonNull(template, "Recipe template cannot be null");

SmithingRecipe smithingRecipe;
if (CrypticLib.isPaper())
smithingRecipe = new SmithingRecipe(namespacedKey(), result(), base, addition, copyNbt);
else
smithingRecipe = new SmithingRecipe(namespacedKey(), result(), base, addition);
if (Objects.requireNonNull(smithingType) == SmithingType.TRIM) {
if (CrypticLib.isPaper())
smithingRecipe = new SmithingTrimRecipe(namespacedKey(), template, base(), addition(), copyNbt());
else
smithingRecipe = new SmithingTrimRecipe(namespacedKey(), template, base(), addition());
} else {
Objects.requireNonNull(result(), "Recipe result cannot be null");
if (CrypticLib.isPaper())
smithingRecipe = new SmithingTransformRecipe(namespacedKey(), result(), template, base(), addition(), copyNbt());
else
smithingRecipe = new SmithingTransformRecipe(namespacedKey(), result(), template, base(), addition());
}

RecipeManager.INSTANCE.regRecipe(group(), smithingRecipe, RecipeType.SMITHING);
}

public SmithingType smithingType() {
return smithingType;
}

public SmithingRecipeRegistry setSmithingType(SmithingType smithingType) {
this.smithingType = smithingType;
return this;
}

public enum SmithingType {
TRIM, TRANSFORM
}

}
Loading

0 comments on commit 2e99c26

Please sign in to comment.