3 Commits
V1.0 ... main

Author SHA1 Message Date
KäseToatz
6da9f0fd8e Fix duplicate enchants 2025-08-23 00:20:31 +02:00
611ed4c04d v1.2 2025-08-11 01:58:32 +02:00
02549c568a v1.1 2025-08-07 22:15:47 +02:00
4 changed files with 87 additions and 58 deletions

View File

@@ -4,7 +4,7 @@ plugins {
} }
group = 'com.kasetoatz' group = 'com.kasetoatz'
version = '1.0' version = '1.3'
repositories { repositories {
mavenCentral() mavenCentral()

View File

@@ -1,9 +1,55 @@
package com.kasetoatz.superBow; package com.kasetoatz.superBow;
import org.bukkit.enchantments.Enchantment;
import java.util.Map;
public class Multiplier { public class Multiplier {
public int item; public int item;
public int book; public int book;
public static final Map<Enchantment, Multiplier> multipliers = Map.ofEntries(
Map.entry(Enchantment.PROTECTION, new Multiplier(1, 1)),
Map.entry(Enchantment.FIRE_PROTECTION, new Multiplier(2, 1)),
Map.entry(Enchantment.FEATHER_FALLING, new Multiplier(2, 1)),
Map.entry(Enchantment.BLAST_PROTECTION, new Multiplier(4, 2)),
Map.entry(Enchantment.PROJECTILE_PROTECTION, new Multiplier(2, 1)),
Map.entry(Enchantment.THORNS, new Multiplier(8, 4)),
Map.entry(Enchantment.RESPIRATION, new Multiplier(4, 2)),
Map.entry(Enchantment.DEPTH_STRIDER, new Multiplier(4, 2)),
Map.entry(Enchantment.AQUA_AFFINITY, new Multiplier(4, 2)),
Map.entry(Enchantment.SHARPNESS, new Multiplier(1, 1)),
Map.entry(Enchantment.SMITE, new Multiplier(2, 1)),
Map.entry(Enchantment.BANE_OF_ARTHROPODS, new Multiplier(2, 1)),
Map.entry(Enchantment.KNOCKBACK, new Multiplier(2, 1)),
Map.entry(Enchantment.FIRE_ASPECT, new Multiplier(4, 2)),
Map.entry(Enchantment.LOOTING, new Multiplier(4, 2)),
Map.entry(Enchantment.EFFICIENCY, new Multiplier(1, 1)),
Map.entry(Enchantment.SILK_TOUCH, new Multiplier(8, 4)),
Map.entry(Enchantment.UNBREAKING, new Multiplier(2, 1)),
Map.entry(Enchantment.FORTUNE, new Multiplier(4, 2)),
Map.entry(Enchantment.POWER, new Multiplier(1, 1)),
Map.entry(Enchantment.PUNCH, new Multiplier(4, 2)),
Map.entry(Enchantment.FLAME, new Multiplier(4, 2)),
Map.entry(Enchantment.INFINITY, new Multiplier(8, 4)),
Map.entry(Enchantment.LUCK_OF_THE_SEA, new Multiplier(4, 2)),
Map.entry(Enchantment.LURE, new Multiplier(4, 2)),
Map.entry(Enchantment.FROST_WALKER, new Multiplier(4, 2)),
Map.entry(Enchantment.MENDING, new Multiplier(4, 2)),
Map.entry(Enchantment.IMPALING, new Multiplier(2, 1)),
Map.entry(Enchantment.RIPTIDE, new Multiplier(4, 2)),
Map.entry(Enchantment.LOYALTY, new Multiplier(1, 1)),
Map.entry(Enchantment.CHANNELING, new Multiplier(8, 4)),
Map.entry(Enchantment.MULTISHOT, new Multiplier(4, 2)),
Map.entry(Enchantment.PIERCING, new Multiplier(1, 1)),
Map.entry(Enchantment.QUICK_CHARGE, new Multiplier(2, 1)),
Map.entry(Enchantment.SWEEPING_EDGE, new Multiplier(4, 2)),
Map.entry(Enchantment.SWIFT_SNEAK, new Multiplier(8, 4)),
Map.entry(Enchantment.SOUL_SPEED, new Multiplier(8, 4)),
Map.entry(Enchantment.BINDING_CURSE, new Multiplier(8, 4)),
Map.entry(Enchantment.VANISHING_CURSE, new Multiplier(8, 4))
);
public Multiplier(int item, int book) public Multiplier(int item, int book)
{ {
this.item = item; this.item = item;

View File

@@ -14,8 +14,11 @@ import org.bukkit.inventory.meta.Repairable;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import static com.kasetoatz.superBow.Multiplier.multipliers;
public final class SuperBow extends JavaPlugin implements Listener public final class SuperBow extends JavaPlugin implements Listener
{ {
@Override @Override
@@ -26,52 +29,32 @@ public final class SuperBow extends JavaPlugin implements Listener
public Map<Enchantment, Integer> getEnchants(ItemStack item) public Map<Enchantment, Integer> getEnchants(ItemStack item)
{ {
Map<Enchantment, Integer> enchants = Map.of(); if (item.getItemMeta() instanceof EnchantmentStorageMeta meta)
if (item.getType() == Material.ENCHANTED_BOOK)
{ {
EnchantmentStorageMeta meta = (EnchantmentStorageMeta) item.getItemMeta(); return meta.getStoredEnchants();
if (meta != null)
{
enchants = meta.getStoredEnchants();
}
} }
else return item.getEnchantments();
{
enchants = item.getEnchantments();
}
return enchants;
} }
public int getPenalty(ItemStack item) public int getPenalty(ItemStack item)
{ {
if (item.getType() == Material.BOW) if (item.getItemMeta() instanceof Repairable meta)
{ {
Repairable meta = (Repairable)item.getItemMeta(); return (int)Math.pow(2, meta.getRepairCost()) - 1;
if (meta != null)
{
return (int)Math.pow(2, meta.getRepairCost()) - 1;
}
} }
return 0; return 0;
} }
public int calculateCost(ItemStack target, ItemStack sacrifice, boolean renamed, boolean repair) public int calculateCost(ItemStack target, ItemStack sacrifice, boolean renamed, boolean repair)
{ {
Map<Enchantment, Multiplier> multipliers = Map.of(
Enchantment.UNBREAKING, new Multiplier(2, 1),
Enchantment.POWER, new Multiplier(1, 1),
Enchantment.PUNCH, new Multiplier(4, 2),
Enchantment.FLAME, new Multiplier(4, 2),
Enchantment.INFINITY, new Multiplier(8, 4),
Enchantment.MENDING, new Multiplier(4, 2)
);
AtomicInteger cost = new AtomicInteger(); AtomicInteger cost = new AtomicInteger();
getEnchants(sacrifice).forEach((enchant, level) -> { getEnchants(sacrifice).forEach((enchant, level) -> {
if (!enchant.canEnchantItem(new ItemStack(Material.BOW))) if (!isValidEnchant(target, enchant))
{ {
return; return;
} }
boolean conflict = getEnchants(target).keySet().stream().anyMatch(e -> (enchant == Enchantment.MENDING && e == Enchantment.INFINITY) || (enchant == Enchantment.INFINITY && e == Enchantment.MENDING) || enchant.conflictsWith(e)); boolean conflict = getEnchants(target).keySet().stream().anyMatch(e -> !((enchant == Enchantment.MENDING && e == Enchantment.INFINITY) || (enchant == Enchantment.INFINITY && e == Enchantment.MENDING)) && enchant.conflictsWith(e));
if (conflict) if (conflict)
{ {
cost.getAndIncrement(); cost.getAndIncrement();
@@ -83,6 +66,7 @@ public final class SuperBow extends JavaPlugin implements Listener
{ {
multiplier = multipliers.get(enchant).book; multiplier = multipliers.get(enchant).book;
} }
Enchantment test = Enchantment.PROTECTION;
int targetLevel = getEnchants(target).getOrDefault(enchant, 0); int targetLevel = getEnchants(target).getOrDefault(enchant, 0);
if (targetLevel == level) if (targetLevel == level)
{ {
@@ -106,6 +90,11 @@ public final class SuperBow extends JavaPlugin implements Listener
return cost.get(); return cost.get();
} }
private boolean isValidEnchant(ItemStack item, Enchantment enchant)
{
return enchant.canEnchantItem(new ItemStack(item.getType())) || item.getType() == Material.ENCHANTED_BOOK;
}
@EventHandler @EventHandler
public void onAnvilPrepare(PrepareAnvilEvent event) public void onAnvilPrepare(PrepareAnvilEvent event)
{ {
@@ -113,34 +102,38 @@ public final class SuperBow extends JavaPlugin implements Listener
ItemStack left = inv.getItem(0); ItemStack left = inv.getItem(0);
ItemStack right = inv.getItem(1); ItemStack right = inv.getItem(1);
if (left == null || right == null || left.getType() != Material.BOW) if (left == null || right == null)
{ {
return; return;
} }
boolean hasMending = left.containsEnchantment(Enchantment.MENDING) || right.containsEnchantment(Enchantment.MENDING); boolean hasMending = getEnchants(left).containsKey(Enchantment.MENDING) || getEnchants(right).containsKey(Enchantment.MENDING);
boolean hasInfinity = left.containsEnchantment(Enchantment.INFINITY) || right.containsEnchantment(Enchantment.INFINITY); boolean hasInfinity = getEnchants(left).containsKey(Enchantment.INFINITY) || getEnchants(right).containsKey(Enchantment.INFINITY);
boolean hasBookWithBoth = false; if ((hasMending && hasInfinity))
if (right.getType() == Material.ENCHANTED_BOOK)
{
EnchantmentStorageMeta meta = (EnchantmentStorageMeta)right.getItemMeta();
if (meta != null)
{
if (meta.hasStoredEnchant(Enchantment.MENDING) && meta.hasStoredEnchant(Enchantment.INFINITY))
{
hasBookWithBoth = true;
}
}
}
if ((hasMending && hasInfinity) || hasBookWithBoth)
{ {
ItemStack result = left.clone(); ItemStack result = left.clone();
boolean repair = false; boolean repair = false;
getEnchants(right).forEach((enchant, level) -> {
if (isValidEnchant(left, enchant))
{
if (Objects.equals(getEnchants(left).getOrDefault(enchant, -1), level))
{
level = Math.min(enchant.getMaxLevel(), level + 1);
}
if (result.getItemMeta() instanceof EnchantmentStorageMeta meta)
{
meta.addStoredEnchant(enchant, level, true);
result.setItemMeta(meta);
}
else
{
result.addUnsafeEnchantment(enchant, level);
}
}
});
if (right.getType() == Material.BOW) if (right.getType() == Material.BOW)
{ {
result.addUnsafeEnchantments(right.getEnchantments());
int maxDamage = result.getType().getMaxDurability(); int maxDamage = result.getType().getMaxDurability();
Damageable leftMeta = (Damageable)left.getItemMeta(); Damageable leftMeta = (Damageable)left.getItemMeta();
Damageable rightMeta = (Damageable)right.getItemMeta(); Damageable rightMeta = (Damageable)right.getItemMeta();
@@ -151,22 +144,12 @@ public final class SuperBow extends JavaPlugin implements Listener
} }
int leftDurability = maxDamage - leftMeta.getDamage(); int leftDurability = maxDamage - leftMeta.getDamage();
int rightDurability = maxDamage - rightMeta.getDamage(); int rightDurability = maxDamage - rightMeta.getDamage();
int durability = Math.min(leftDurability + rightDurability, maxDamage); int durability = Math.min(leftDurability + rightDurability, maxDamage);
int damage = maxDamage - durability; int damage = maxDamage - durability;
repair = resultMeta.getDamage() != damage; repair = resultMeta.getDamage() != damage;
resultMeta.setDamage(damage); resultMeta.setDamage(damage);
result.setItemMeta(resultMeta); result.setItemMeta(resultMeta);
} }
else if (hasBookWithBoth)
{
EnchantmentStorageMeta book = (EnchantmentStorageMeta)right.getItemMeta();
if (book == null)
{
return;
}
result.addUnsafeEnchantments(book.getStoredEnchants());
}
ItemMeta meta = result.getItemMeta(); ItemMeta meta = result.getItemMeta();
if (meta == null) if (meta == null)
{ {

View File

@@ -1,4 +1,4 @@
name: SuperBow name: SuperBow
version: '1.0' version: '1.3'
main: com.kasetoatz.superBow.SuperBow main: com.kasetoatz.superBow.SuperBow
api-version: '1.21' api-version: '1.21'