mirror of
https://github.com/BlazingGames/blazing-games-plugin.git
synced 2025-02-03 21:26:41 -05:00
made improvements to the enchantment system by making more things use EnchantmentWrapper instead of CustomEnchantment
also added OverridableVanillaEnchantmentWrapper
This commit is contained in:
parent
f124798e1b
commit
e6b2008618
18 changed files with 187 additions and 141 deletions
|
@ -29,7 +29,8 @@ public enum BlazingEnchantmentTarget implements ItemPredicate {
|
|||
HOE("Hoe", Material.WOODEN_HOE, Material.STONE_HOE, Material.IRON_HOE, Material.GOLDEN_HOE, Material.DIAMOND_HOE, Material.NETHERITE_HOE),
|
||||
SHIELD("Shield", Material.SHIELD), ELYTRA("Elytra", Material.ELYTRA),
|
||||
WEAPON_TRIDENT("Weapons OR Trident", Material.WOODEN_SWORD, Material.STONE_SWORD, Material.IRON_SWORD, Material.GOLDEN_SWORD,
|
||||
Material.DIAMOND_SWORD, Material.NETHERITE_SWORD, Material.TRIDENT);
|
||||
Material.DIAMOND_SWORD, Material.NETHERITE_SWORD, Material.TRIDENT),
|
||||
BOW_ROCKET("Bow OR Firework Rocket", Material.BOW, Material.FIREWORK_ROCKET);
|
||||
|
||||
final Set<Material> allowed;
|
||||
final String description;
|
||||
|
|
|
@ -21,15 +21,11 @@ import net.kyori.adventure.text.Component;
|
|||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class CustomEnchantment implements EnchantmentWrapper {
|
||||
|
@ -49,42 +45,6 @@ public abstract class CustomEnchantment implements EnchantmentWrapper {
|
|||
return PaperEnchantmentTarget.BREAKABLE;
|
||||
}
|
||||
|
||||
public boolean canEnchantItem(@NotNull ItemStack itemStack) {
|
||||
Map<CustomEnchantment, Integer> customEnchantmentLevels = EnchantmentHelper.getCustomEnchantments(itemStack);
|
||||
|
||||
for(Map.Entry<CustomEnchantment, Integer> entry : customEnchantmentLevels.entrySet()) {
|
||||
if(conflictsWith(entry.getKey()) || entry.getKey().conflictsWith(this)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
|
||||
Map<Enchantment, Integer> enchantmentLevels = Map.of();
|
||||
|
||||
if(meta != null) {
|
||||
enchantmentLevels = itemStack.getItemMeta().getEnchants();
|
||||
}
|
||||
|
||||
for(Map.Entry<Enchantment, Integer> entry : enchantmentLevels.entrySet()) {
|
||||
if(conflictsWith(entry.getKey())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(itemStack.getItemMeta() instanceof EnchantmentStorageMeta esm) {
|
||||
Map<Enchantment, Integer> storedEnchantmentLevels = esm.getStoredEnchants();
|
||||
|
||||
for(Map.Entry<Enchantment, Integer> entry : storedEnchantmentLevels.entrySet()) {
|
||||
if(conflictsWith(entry.getKey())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return canGoOnItem(itemStack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canGoOnItem(ItemStack tool) {
|
||||
return getItemTarget().matchItem(tool) || tool.getType() == Material.BOOK
|
||||
|
@ -129,7 +89,7 @@ public abstract class CustomEnchantment implements EnchantmentWrapper {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Component getLevelessComponent() {
|
||||
public Component getDescription() {
|
||||
return Component.text(getDisplayName()).color(getEnchantmentType().getColor()).decoration(TextDecoration.ITALIC, false);
|
||||
}
|
||||
|
||||
|
@ -137,4 +97,9 @@ public abstract class CustomEnchantment implements EnchantmentWrapper {
|
|||
public boolean isTreasure() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeRemoved() {
|
||||
return getEnchantmentType().canBeRemoved();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,22 @@ import java.util.*;
|
|||
public class EnchantmentHelper implements ItemChangeProvider {
|
||||
private static final NamespacedKey key = BlazingGames.get().key("custom_enchantments");
|
||||
|
||||
public static Map<EnchantmentWrapper, Integer> getEnchantmentWrappers(ItemStack stack) {
|
||||
if(stack == null || !stack.hasItemMeta()) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
||||
HashMap<EnchantmentWrapper, Integer> enchantments = new HashMap<>();
|
||||
|
||||
for(EnchantmentWrapper wrapper : EnchantmentWrappers.list(false)) {
|
||||
if(wrapper.has(stack)) {
|
||||
enchantments.put(wrapper, wrapper.getLevel(stack));
|
||||
}
|
||||
}
|
||||
|
||||
return enchantments;
|
||||
}
|
||||
|
||||
public static Map<CustomEnchantment, Integer> getCustomEnchantments(ItemStack stack) {
|
||||
if(stack == null || !stack.hasItemMeta()) {
|
||||
return new HashMap<>();
|
||||
|
@ -148,7 +164,7 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
return ItemPredicates.enchantability.matchItem(stack);
|
||||
}
|
||||
|
||||
public static ItemStack enchantTool(ItemStack stack, CustomEnchantment enchantment, int level) {
|
||||
public static ItemStack enchantTool(ItemStack stack, EnchantmentWrapper enchantment, int level) {
|
||||
ItemStack result = stack.clone();
|
||||
|
||||
if(!canEnchantItem(result)) {
|
||||
|
@ -156,13 +172,8 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
}
|
||||
|
||||
if(enchantment.canEnchantItem(result)) {
|
||||
int current = getCustomEnchantmentLevel(result, enchantment);
|
||||
int current = enchantment.getLevel(result);
|
||||
|
||||
if(current == level && current > 0) {
|
||||
if(enchantment.canUpgradeLevel(current)) {
|
||||
level++;
|
||||
}
|
||||
}
|
||||
if(current > level) {
|
||||
level = current;
|
||||
}
|
||||
|
@ -173,7 +184,7 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
level = 0;
|
||||
}
|
||||
|
||||
return setCustomEnchantment(result, enchantment, level);
|
||||
return enchantment.apply(result, level);
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -244,9 +255,9 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
return result;
|
||||
}
|
||||
|
||||
Map<CustomEnchantment, Integer> enchantmentLevels = getCustomEnchantments(enchantingItem);
|
||||
Map<EnchantmentWrapper, Integer> enchantmentLevels = getEnchantmentWrappers(enchantingItem);
|
||||
|
||||
for(Map.Entry<CustomEnchantment, Integer> enchantment : enchantmentLevels.entrySet()) {
|
||||
for(Map.Entry<EnchantmentWrapper, Integer> enchantment : enchantmentLevels.entrySet()) {
|
||||
result = enchantTool(result, enchantment.getKey(), enchantment.getValue());
|
||||
}
|
||||
|
||||
|
@ -257,18 +268,18 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
return !getCustomEnchantments(stack).isEmpty();
|
||||
}
|
||||
|
||||
public static ItemStack removeCustomEnchantments(ItemStack stack) {
|
||||
public static ItemStack removeEnchantments(ItemStack stack) {
|
||||
ItemStack result = stack.clone();
|
||||
|
||||
if(!canEnchantItem(result)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
Set<CustomEnchantment> enchantments = getCustomEnchantments(stack).keySet();
|
||||
Set<EnchantmentWrapper> enchantments = getEnchantmentWrappers(stack).keySet();
|
||||
|
||||
for(CustomEnchantment enchantment : enchantments) {
|
||||
if(enchantment.getEnchantmentType().canBeRemoved()) {
|
||||
result = removeCustomEnchantment(result, enchantment);
|
||||
for(EnchantmentWrapper enchantment : enchantments) {
|
||||
if(enchantment.canBeRemoved()) {
|
||||
result = enchantment.remove(result);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -276,19 +287,19 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
}
|
||||
|
||||
// This version of the getCustomEnchantmentLevel function ignores enchanted books
|
||||
public static int getActiveCustomEnchantmentLevel(ItemStack stack, CustomEnchantment enchantment) {
|
||||
public static int getActiveEnchantmentWrapperLevel(ItemStack stack, EnchantmentWrapper enchantment) {
|
||||
if(stack != null && stack.getType() == Material.ENCHANTED_BOOK) {
|
||||
return 0;
|
||||
}
|
||||
return getCustomEnchantmentLevel(stack, enchantment);
|
||||
return enchantment.getLevel(stack);
|
||||
}
|
||||
|
||||
// This version of the hasCustomEnchantment function ignores enchanted books
|
||||
public static boolean hasActiveCustomEnchantment(ItemStack stack, CustomEnchantment enchantment) {
|
||||
return getActiveCustomEnchantmentLevel(stack, enchantment) > 0;
|
||||
public static boolean hasActiveEnchantmentWrapper(ItemStack stack, EnchantmentWrapper enchantment) {
|
||||
return getActiveEnchantmentWrapperLevel(stack, enchantment) > 0;
|
||||
}
|
||||
|
||||
public static Map<CustomEnchantment, Integer> getActiveCustomEnchantments(ItemStack stack) {
|
||||
public static Map<CustomEnchantment, Integer> getActiveEnchantmentWrappers(ItemStack stack) {
|
||||
if(stack != null && stack.getType() == Material.ENCHANTED_BOOK) {
|
||||
return new HashMap<>();
|
||||
}
|
||||
|
@ -342,7 +353,7 @@ public class EnchantmentHelper implements ItemChangeProvider {
|
|||
meta = result.getItemMeta();
|
||||
}
|
||||
|
||||
if(hasCustomEnchantment(stack, CustomEnchantments.UNSHINY)) {
|
||||
if(CustomEnchantments.UNSHINY.has(stack)) {
|
||||
meta.setEnchantmentGlintOverride(false);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@ public class EnchantmentTome extends ContextlessItem {
|
|||
}
|
||||
|
||||
protected Component getComponent() {
|
||||
return getWrapper().getLevelessComponent();
|
||||
return getWrapper().getDescription();
|
||||
}
|
||||
public EnchantmentWrapper getWrapper() {
|
||||
return wrapper;
|
||||
|
|
|
@ -29,19 +29,39 @@ import org.bukkit.inventory.meta.ItemMeta;
|
|||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public interface EnchantmentWrapper {
|
||||
ItemStack apply(ItemStack tool, int level);
|
||||
int getLevel(ItemStack tool);
|
||||
boolean canEnchantItem(ItemStack tool);
|
||||
boolean canGoOnItem(ItemStack tool);
|
||||
|
||||
default boolean canEnchantItem(ItemStack tool) {
|
||||
for(Map.Entry<EnchantmentWrapper, Integer> entry : EnchantmentHelper.getEnchantmentWrappers(tool).entrySet()) {
|
||||
if(this.conflictsWith(entry.getKey()))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if(entry.getKey().conflictsWith(this))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return this.canGoOnItem(tool);
|
||||
}
|
||||
|
||||
default ItemStack remove(ItemStack tool) {
|
||||
return apply(tool, 0);
|
||||
}
|
||||
|
||||
default boolean conflictsWith(EnchantmentWrapper wrapper) {
|
||||
if(wrapper instanceof VanillaEnchantmentWrapper vanilla) {
|
||||
return conflictsWith(vanilla.getEnchantment());
|
||||
}
|
||||
if(wrapper instanceof CustomEnchantment custom) {
|
||||
conflictsWith(custom);
|
||||
return conflictsWith(custom);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@ -56,7 +76,7 @@ public interface EnchantmentWrapper {
|
|||
|
||||
NamespacedKey getKey();
|
||||
Component getComponent(int level);
|
||||
Component getLevelessComponent();
|
||||
Component getDescription();
|
||||
|
||||
default String getWarning(int level) {
|
||||
return null;
|
||||
|
@ -122,7 +142,7 @@ public interface EnchantmentWrapper {
|
|||
meta.setMaxStackSize(getMaxLevel());
|
||||
meta.setHideTooltip(false);
|
||||
meta.setEnchantmentGlintOverride(level > 0);
|
||||
meta.itemName(level > 0 ? getComponent(level) : getLevelessComponent());
|
||||
meta.itemName(level > 0 ? getComponent(level) : getDescription());
|
||||
meta.lore(lore);
|
||||
meta.addItemFlags(ItemFlag.HIDE_ADDITIONAL_TOOLTIP);
|
||||
result.setItemMeta(meta);
|
||||
|
@ -149,4 +169,10 @@ public interface EnchantmentWrapper {
|
|||
default int getMaxLevel() {
|
||||
return getRecipes().size();
|
||||
}
|
||||
|
||||
default boolean has(ItemStack stack) {
|
||||
return getLevel(stack) != 0;
|
||||
}
|
||||
|
||||
boolean canBeRemoved();
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ package de.blazemcworld.blazinggames.enchantments.sys;
|
|||
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.VanillaEnchantmentWrapper.Warning;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.altar.AltarRecipe;
|
||||
import de.blazemcworld.blazinggames.items.predicates.BreakableItemPredicate;
|
||||
import de.blazemcworld.blazinggames.items.predicates.ColorlessItemPredicate;
|
||||
import de.blazemcworld.blazinggames.items.CustomItems;
|
||||
import de.blazemcworld.blazinggames.items.predicates.MaterialItemPredicate;
|
||||
|
@ -113,7 +114,8 @@ public class EnchantmentWrappers {
|
|||
new AltarRecipe(4,4, 4, 32, new MaterialItemPredicate(Material.BLAZE_POWDER))
|
||||
);
|
||||
public static VanillaEnchantmentWrapper MENDING =
|
||||
new VanillaEnchantmentWrapper(Enchantment.MENDING, () -> new ItemStack(Material.SHULKER_SHELL),
|
||||
new OverridableVanillaEnchantmentWrapper(Enchantment.MENDING, () -> new ItemStack(Material.SHULKER_SHELL),
|
||||
new OverridableVanillaEnchantmentWrapper.VanillaEnchantmentOverrides().conflicts(),
|
||||
new AltarRecipe(4,10, 15, CustomItems.NETHER_STAR_CHUNK)
|
||||
);
|
||||
public static VanillaEnchantmentWrapper LOYALTY =
|
||||
|
@ -209,7 +211,8 @@ public class EnchantmentWrappers {
|
|||
new AltarRecipe(3,2, 8, 32, new MaterialItemPredicate(Material.BLAZE_POWDER))
|
||||
);
|
||||
public static VanillaEnchantmentWrapper UNBREAKING =
|
||||
new VanillaEnchantmentWrapper(Enchantment.UNBREAKING, () -> new ItemStack(Material.BEDROCK),
|
||||
new OverridableVanillaEnchantmentWrapper(Enchantment.UNBREAKING, () -> new ItemStack(Material.BEDROCK),
|
||||
new OverridableVanillaEnchantmentWrapper.VanillaEnchantmentOverrides().target(BreakableItemPredicate.instance),
|
||||
new AltarRecipe(2,1, 2, 32, new MaterialItemPredicate(Material.IRON_INGOT)),
|
||||
new AltarRecipe(3,2, 4, 32, new MaterialItemPredicate(Material.OBSIDIAN)),
|
||||
new AltarRecipe(4,3, 8, 2, new MaterialItemPredicate(Material.NETHERITE_SCRAP))
|
||||
|
@ -225,7 +228,9 @@ public class EnchantmentWrappers {
|
|||
new AltarRecipe(3,3, 4, 16, new MaterialItemPredicate(Material.PUFFERFISH))
|
||||
);
|
||||
public static VanillaEnchantmentWrapper INFINITY =
|
||||
new VanillaEnchantmentWrapper(Enchantment.INFINITY, () -> new ItemStack(Material.CHORUS_FLOWER),
|
||||
new OverridableVanillaEnchantmentWrapper(Enchantment.INFINITY, () -> new ItemStack(Material.CHORUS_FLOWER),
|
||||
new OverridableVanillaEnchantmentWrapper.VanillaEnchantmentOverrides().target(BlazingEnchantmentTarget.BOW_ROCKET)
|
||||
.conflicts(),
|
||||
new AltarRecipe(4,1, 8, 64, new MaterialItemPredicate(Material.ARROW))
|
||||
);
|
||||
public static VanillaEnchantmentWrapper EFFICIENCY =
|
||||
|
@ -299,18 +304,20 @@ public class EnchantmentWrappers {
|
|||
);
|
||||
}
|
||||
|
||||
public static Set<EnchantmentWrapper> list() {
|
||||
public static Set<EnchantmentWrapper> list(boolean removeTreasure) {
|
||||
Set<EnchantmentWrapper> wrappers = new HashSet<>(CustomEnchantments.list());
|
||||
|
||||
wrappers.addAll(vanilla());
|
||||
|
||||
wrappers.removeIf(EnchantmentWrapper::isTreasure);
|
||||
if(removeTreasure) {
|
||||
wrappers.removeIf(EnchantmentWrapper::isTreasure);
|
||||
}
|
||||
|
||||
return wrappers;
|
||||
}
|
||||
|
||||
public static @Nullable EnchantmentWrapper getByKey(NamespacedKey key) {
|
||||
for(EnchantmentWrapper curr : list()) {
|
||||
for(EnchantmentWrapper curr : list(false)) {
|
||||
if(curr.getKey().equals(key)) {
|
||||
return curr;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Copyright 2025 The Blazing Games Maintainers
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package de.blazemcworld.blazinggames.enchantments.sys;
|
||||
|
||||
import de.blazemcworld.blazinggames.BlazingGames;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.altar.AltarRecipe;
|
||||
import de.blazemcworld.blazinggames.items.predicates.ItemPredicate;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class OverridableVanillaEnchantmentWrapper extends VanillaEnchantmentWrapper {
|
||||
public static class VanillaEnchantmentOverrides {
|
||||
private ItemPredicate target;
|
||||
private List<Enchantment> conflicts = null;
|
||||
|
||||
public VanillaEnchantmentOverrides target(ItemPredicate target) {
|
||||
this.target = target;
|
||||
return this;
|
||||
}
|
||||
|
||||
public VanillaEnchantmentOverrides conflicts(Enchantment... conflicts) {
|
||||
return conflicts(List.of(conflicts));
|
||||
}
|
||||
|
||||
public VanillaEnchantmentOverrides conflicts(List<Enchantment> conflicts) {
|
||||
this.conflicts = new ArrayList<>(conflicts);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
private final VanillaEnchantmentOverrides overrides;
|
||||
|
||||
public OverridableVanillaEnchantmentWrapper(Enchantment enchantment, Supplier<ItemStack> icon, List<Warning> warnings, VanillaEnchantmentOverrides overrides, AltarRecipe... recipes) {
|
||||
super(enchantment, icon, warnings, recipes);
|
||||
this.overrides = overrides;
|
||||
}
|
||||
|
||||
public OverridableVanillaEnchantmentWrapper(Enchantment enchantment, Supplier<ItemStack> icon, VanillaEnchantmentOverrides overrides, AltarRecipe... recipes) {
|
||||
super(enchantment, icon, recipes);
|
||||
this.overrides = overrides;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canGoOnItem(ItemStack tool) {
|
||||
if(overrides.target != null) {
|
||||
return overrides.target.matchItem(tool);
|
||||
}
|
||||
|
||||
return super.canGoOnItem(tool);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean conflictsWith(Enchantment other) {
|
||||
BlazingGames.get().log(overrides.conflicts);
|
||||
|
||||
if(overrides.conflicts != null) {
|
||||
return overrides.conflicts.contains(other);
|
||||
}
|
||||
|
||||
return super.conflictsWith(other);
|
||||
}
|
||||
}
|
|
@ -24,10 +24,8 @@ import org.bukkit.Material;
|
|||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class VanillaEnchantmentWrapper implements EnchantmentWrapper {
|
||||
|
@ -67,36 +65,6 @@ public class VanillaEnchantmentWrapper implements EnchantmentWrapper {
|
|||
return tool.getEnchantmentLevel(enchantment);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canEnchantItem(ItemStack tool) {
|
||||
Map<CustomEnchantment, Integer> customEnchantmentLevels = EnchantmentHelper.getCustomEnchantments(tool);
|
||||
|
||||
for(Map.Entry<CustomEnchantment, Integer> entry : customEnchantmentLevels.entrySet()) {
|
||||
if(entry.getKey().conflictsWith(enchantment)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(tool.getItemMeta() != null && tool.getItemMeta().hasConflictingEnchant(enchantment)) {
|
||||
for(Map.Entry<Enchantment, Integer> entry : tool.getItemMeta().getEnchants().entrySet()) {
|
||||
if(entry.getKey().equals(enchantment)) {
|
||||
continue;
|
||||
}
|
||||
if(entry.getKey().conflictsWith(enchantment)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(tool.getItemMeta() instanceof EnchantmentStorageMeta esm) {
|
||||
if(esm.hasConflictingStoredEnchant(enchantment)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return canGoOnItem(tool);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canGoOnItem(ItemStack tool) {
|
||||
return enchantment.canEnchantItem(tool) || tool.getType() == Material.BOOK
|
||||
|
@ -124,7 +92,7 @@ public class VanillaEnchantmentWrapper implements EnchantmentWrapper {
|
|||
}
|
||||
|
||||
@Override
|
||||
public Component getLevelessComponent() {
|
||||
public Component getDescription() {
|
||||
TextColor color = NamedTextColor.GRAY;
|
||||
|
||||
if(enchantment.isCursed()) {
|
||||
|
@ -149,6 +117,11 @@ public class VanillaEnchantmentWrapper implements EnchantmentWrapper {
|
|||
return recipes;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canBeRemoved() {
|
||||
return enchantment.isCursed();
|
||||
}
|
||||
|
||||
public Enchantment getEnchantment() {
|
||||
return enchantment;
|
||||
}
|
||||
|
|
|
@ -137,7 +137,7 @@ public class AltarInterface extends UserInterface {
|
|||
public Set<EnchantmentWrapper> getAvailable() {
|
||||
ItemStack tool = getItem(1,1);
|
||||
|
||||
Set<EnchantmentWrapper> result = EnchantmentWrappers.list();
|
||||
Set<EnchantmentWrapper> result = EnchantmentWrappers.list(true);
|
||||
|
||||
result.removeIf((wrapper) -> wrapper.getRecipe(1).tier() > tier);
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
|
||||
fakeBreakBlock(player, event.getBlock(), false);
|
||||
|
||||
if (EnchantmentHelper.hasActiveCustomEnchantment(mainHand, CustomEnchantments.TREE_FELLER)) {
|
||||
if (EnchantmentHelper.hasActiveEnchantmentWrapper(mainHand, CustomEnchantments.TREE_FELLER)) {
|
||||
if (logs.contains(event.getBlock().getType())) {
|
||||
if (player.getFoodLevel() <= 6) {
|
||||
return;
|
||||
|
@ -117,7 +117,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
|
||||
ItemStack axe = player.getInventory().getItemInMainHand();
|
||||
|
||||
int treeFeller = EnchantmentHelper.getActiveCustomEnchantmentLevel(axe, CustomEnchantments.TREE_FELLER);
|
||||
int treeFeller = EnchantmentHelper.getActiveEnchantmentWrapperLevel(axe, CustomEnchantments.TREE_FELLER);
|
||||
|
||||
if (treeFeller <= 0) {
|
||||
return;
|
||||
|
@ -159,7 +159,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
int pattern = EnchantmentHelper.getActiveCustomEnchantmentLevel(mainHand, CustomEnchantments.PATTERN);
|
||||
int pattern = EnchantmentHelper.getActiveEnchantmentWrapperLevel(mainHand, CustomEnchantments.PATTERN);
|
||||
|
||||
if (pattern > 0 && face != null) {
|
||||
Pair<Integer, Integer> dimensions = PatternEnchantment.dimensions.get(pattern - 1);
|
||||
|
@ -203,7 +203,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
|
||||
ItemStack axe = player.getInventory().getItemInMainHand();
|
||||
|
||||
int treeFeller = EnchantmentHelper.getActiveCustomEnchantmentLevel(axe, CustomEnchantments.TREE_FELLER);
|
||||
int treeFeller = EnchantmentHelper.getActiveEnchantmentWrapperLevel(axe, CustomEnchantments.TREE_FELLER);
|
||||
|
||||
if (treeFeller <= 0) {
|
||||
return;
|
||||
|
@ -285,7 +285,7 @@ public class BreakBlockEventListener implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
if (EnchantmentHelper.hasActiveCustomEnchantment(mainHand, CustomEnchantments.FLAME_TOUCH)) {
|
||||
if (EnchantmentHelper.hasActiveEnchantmentWrapper(mainHand, CustomEnchantments.FLAME_TOUCH)) {
|
||||
Iterator<ItemStack> iter = drops.iterator();
|
||||
List<ItemStack> smeltedDrops = new ArrayList<>();
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ public class EntityDamagedByEventListener implements Listener {
|
|||
}
|
||||
|
||||
double damageAdded = 0;
|
||||
for(Map.Entry<CustomEnchantment, Integer> enchantment : EnchantmentHelper.getActiveCustomEnchantments(weapon).entrySet()) {
|
||||
for(Map.Entry<CustomEnchantment, Integer> enchantment : EnchantmentHelper.getActiveEnchantmentWrappers(weapon).entrySet()) {
|
||||
damageAdded += enchantment.getKey().getDamageIncrease(victim, enchantment.getValue());
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ public class EntityDamagedByEventListener implements Listener {
|
|||
if(victim instanceof Player p && damager instanceof Damageable damageable) {
|
||||
if(p.isBlocking() && event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING) != 0) {
|
||||
ItemStack shield = p.getActiveItem();
|
||||
int reflectiveDefenses = EnchantmentHelper.getActiveCustomEnchantmentLevel(shield, CustomEnchantments.REFLECTIVE_DEFENSES);
|
||||
int reflectiveDefenses = EnchantmentHelper.getActiveEnchantmentWrapperLevel(shield, CustomEnchantments.REFLECTIVE_DEFENSES);
|
||||
|
||||
if(reflectiveDefenses != 0 && new Random().nextInt(Math.max(7 - reflectiveDefenses, 2)) == 0) {
|
||||
double dmg = Math.abs(event.getDamage(EntityDamageEvent.DamageModifier.BLOCKING)) * 0.15;
|
||||
|
|
|
@ -49,7 +49,7 @@ public class EntityDeathEventListener implements Listener {
|
|||
|
||||
ItemStack mainHand = killer.getInventory().getItemInMainHand();
|
||||
|
||||
int capturing = EnchantmentHelper.getActiveCustomEnchantmentLevel(mainHand, CustomEnchantments.CAPTURING);
|
||||
int capturing = EnchantmentHelper.getActiveEnchantmentWrapperLevel(mainHand, CustomEnchantments.CAPTURING);
|
||||
|
||||
if (Math.random() < capturing * 0.03 && !victim.getEntitySpawnReason().equals(CreatureSpawnEvent.SpawnReason.SPAWNER)) {
|
||||
Material spawnEgg = Material.getMaterial(victim.getType().getKey().getKey().toUpperCase() + "_SPAWN_EGG");
|
||||
|
@ -60,7 +60,7 @@ public class EntityDeathEventListener implements Listener {
|
|||
}
|
||||
}
|
||||
|
||||
int scavenger = EnchantmentHelper.getActiveCustomEnchantmentLevel(mainHand, CustomEnchantments.SCAVENGER);
|
||||
int scavenger = EnchantmentHelper.getActiveEnchantmentWrapperLevel(mainHand, CustomEnchantments.SCAVENGER);
|
||||
|
||||
if(Math.random() < scavenger*0.01) {
|
||||
victim.getWorld().playSound(victim, Sound.BLOCK_CHISELED_BOOKSHELF_PICKUP_ENCHANTED, 1, 0.5f);
|
||||
|
|
|
@ -236,7 +236,7 @@ public class InteractEventListener implements Listener {
|
|||
}
|
||||
}
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && block != null && hand != null && eventItem != null) {
|
||||
if(EnchantmentHelper.hasActiveCustomEnchantment(eventItem, CustomEnchantments.NATURE_BLESSING)) {
|
||||
if(EnchantmentHelper.hasActiveEnchantmentWrapper(eventItem, CustomEnchantments.NATURE_BLESSING)) {
|
||||
if(!dirt.contains(block.getType()) || player.isSneaking()) {
|
||||
if(block.applyBoneMeal(event.getBlockFace())) {
|
||||
eventItem = eventItem.damage(1, player);
|
||||
|
|
|
@ -15,11 +15,9 @@
|
|||
*/
|
||||
package de.blazemcworld.blazinggames.events;
|
||||
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.CustomEnchantment;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.CustomEnchantments;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.EnchantmentHelper;
|
||||
import de.blazemcworld.blazinggames.items.CustomItems;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
@ -139,16 +137,4 @@ public class LootGenerateEventListener implements Listener {
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private ItemStack createRandomBook(CustomEnchantment enchantment, Random random) {
|
||||
return enchantRandomTool(new ItemStack(Material.BOOK), enchantment, random);
|
||||
}
|
||||
|
||||
private ItemStack createBook(CustomEnchantment enchantment, int level) {
|
||||
return EnchantmentHelper.enchantTool(new ItemStack(Material.BOOK), enchantment, level);
|
||||
}
|
||||
|
||||
private ItemStack enchantRandomTool(ItemStack stack, CustomEnchantment enchantment, Random random) {
|
||||
return EnchantmentHelper.enchantTool(stack, enchantment, random.nextInt(enchantment.getMaxLevel()) + 1);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -91,9 +91,6 @@ public class PrepareGrindstoneEventListener implements Listener {
|
|||
}
|
||||
|
||||
public ItemStack grindstoneItem(ItemStack up, ItemStack down, ItemStack result) {
|
||||
if(CustomItem.isCustomItem(up)) return ItemStack.empty();
|
||||
if(CustomItem.isCustomItem(down)) return ItemStack.empty();
|
||||
|
||||
if(up == null || up.isEmpty()) {
|
||||
ItemStack swap = down;
|
||||
down = up;
|
||||
|
@ -105,12 +102,12 @@ public class PrepareGrindstoneEventListener implements Listener {
|
|||
else if(down != null && !down.isEmpty())
|
||||
{
|
||||
// double
|
||||
if(down.getType() == Material.SPONGE || down.getType() == Material.WET_SPONGE) {
|
||||
if(!CustomItem.isCustomItem(down) && (down.getType() == Material.SPONGE || down.getType() == Material.WET_SPONGE)) {
|
||||
if(EnchantmentHelper.canEnchantItem(up)) {
|
||||
return scrub(up, down);
|
||||
}
|
||||
}
|
||||
if(up.getType() == Material.SPONGE || up.getType() == Material.WET_SPONGE) {
|
||||
if(!CustomItem.isCustomItem(down) && (up.getType() == Material.SPONGE || up.getType() == Material.WET_SPONGE)) {
|
||||
if(EnchantmentHelper.canEnchantItem(down)) {
|
||||
return scrub(down, up);
|
||||
}
|
||||
|
@ -129,7 +126,7 @@ public class PrepareGrindstoneEventListener implements Listener {
|
|||
return null;
|
||||
}
|
||||
|
||||
result = EnchantmentHelper.removeCustomEnchantments(result);
|
||||
result = EnchantmentHelper.removeEnchantments(result);
|
||||
|
||||
if(result.equals(up)) {
|
||||
return null;
|
||||
|
|
|
@ -73,7 +73,7 @@ public class TickEventListener {
|
|||
}
|
||||
}
|
||||
|
||||
int updraft = EnchantmentHelper.getActiveCustomEnchantmentLevel(chestplate,
|
||||
int updraft = EnchantmentHelper.getActiveEnchantmentWrapperLevel(chestplate,
|
||||
CustomEnchantments.UPDRAFT);
|
||||
if(updraft > 0) {
|
||||
if(l.isGliding()) {
|
||||
|
|
|
@ -16,10 +16,11 @@
|
|||
|
||||
package de.blazemcworld.blazinggames.items.predicates;
|
||||
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.BlazingEnchantmentTarget;
|
||||
import de.blazemcworld.blazinggames.enchantments.sys.PaperEnchantmentTarget;
|
||||
|
||||
public class ItemPredicates {
|
||||
public static final ItemPredicate enchantability = new AlternativeItemPredicate("Any Enchantable Item",
|
||||
BreakableItemPredicate.instance, PaperEnchantmentTarget.ALL
|
||||
BreakableItemPredicate.instance, PaperEnchantmentTarget.ALL, BlazingEnchantmentTarget.BOW_ROCKET
|
||||
);
|
||||
}
|
||||
|
|
|
@ -72,7 +72,7 @@ public class InventoryUtils {
|
|||
}
|
||||
|
||||
public static void collectableDrop(Player player, Location location, Drops drops) {
|
||||
if (EnchantmentHelper.hasActiveCustomEnchantment(player.getInventory().getItemInMainHand(), CustomEnchantments.COLLECTABLE)) {
|
||||
if (EnchantmentHelper.hasActiveEnchantmentWrapper(player.getInventory().getItemInMainHand(), CustomEnchantments.COLLECTABLE)) {
|
||||
player.giveExp(drops.getExperienceDropped(), true);
|
||||
|
||||
for (ItemStack drop : drops) {
|
||||
|
|
Loading…
Reference in a new issue