Initial commit

This commit is contained in:
2025-08-11 01:18:42 +02:00
parent b9cff97045
commit 58858eb2b5
11 changed files with 618 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package com.kasetoatz.superArmor;
public class Multiplier
{
public int item;
public int book;
public Multiplier(int item, int book)
{
this.item = item;
this.book = book;
}
}

View File

@@ -0,0 +1,193 @@
package com.kasetoatz.superArmor;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.AnvilInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.Repairable;
import org.bukkit.inventory.view.AnvilView;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
public final class SuperArmor extends JavaPlugin implements Listener {
private final Map<Enchantment, Multiplier> multipliers = Map.ofEntries(
Map.entry(Enchantment.MENDING, new Multiplier(4, 2)),
Map.entry(Enchantment.UNBREAKING, new Multiplier(2, 1)),
Map.entry(Enchantment.THORNS, new Multiplier(8, 4)),
Map.entry(Enchantment.RESPIRATION, new Multiplier(4, 2)),
Map.entry(Enchantment.AQUA_AFFINITY, new Multiplier(4, 2)),
Map.entry(Enchantment.SWIFT_SNEAK, new Multiplier(8, 4)),
Map.entry(Enchantment.FEATHER_FALLING, new Multiplier(2, 1)),
Map.entry(Enchantment.SOUL_SPEED, new Multiplier(8, 4)),
Map.entry(Enchantment.PROTECTION, new Multiplier(1, 1)),
Map.entry(Enchantment.PROJECTILE_PROTECTION, new Multiplier(2, 1)),
Map.entry(Enchantment.FIRE_PROTECTION, new Multiplier(2, 1)),
Map.entry(Enchantment.BLAST_PROTECTION, new Multiplier(4, 2)),
Map.entry(Enchantment.DEPTH_STRIDER, new Multiplier(4, 2)),
Map.entry(Enchantment.FROST_WALKER, new Multiplier(4, 2))
);
@Override
public void onEnable()
{
getServer().getPluginManager().registerEvents(this, this);
}
private Map<Enchantment, Integer> getEnchants(ItemStack item)
{
if (item.getItemMeta() instanceof EnchantmentStorageMeta meta)
{
return meta.getStoredEnchants();
}
return item.getEnchantments();
}
private int getPenalty(ItemStack item)
{
if (item.getItemMeta() instanceof Repairable meta)
{
return (int)Math.pow(2, meta.getRepairCost()) - 1;
}
return 0;
}
private boolean isProtection(Enchantment enchant)
{
return enchant == Enchantment.PROTECTION || enchant == Enchantment.PROJECTILE_PROTECTION || enchant == Enchantment.FIRE_PROTECTION || enchant == Enchantment.BLAST_PROTECTION;
}
private boolean isArmor(ItemStack item)
{
return switch (item.getType()) {
case LEATHER_HELMET, LEATHER_CHESTPLATE, LEATHER_LEGGINGS, LEATHER_BOOTS, CHAINMAIL_HELMET,
CHAINMAIL_CHESTPLATE, CHAINMAIL_LEGGINGS, CHAINMAIL_BOOTS, IRON_HELMET, IRON_CHESTPLATE, IRON_LEGGINGS,
IRON_BOOTS, GOLDEN_HELMET, GOLDEN_CHESTPLATE, GOLDEN_LEGGINGS, GOLDEN_BOOTS, DIAMOND_HELMET,
DIAMOND_CHESTPLATE, DIAMOND_LEGGINGS, DIAMOND_BOOTS, NETHERITE_HELMET, NETHERITE_CHESTPLATE,
NETHERITE_LEGGINGS, NETHERITE_BOOTS, TURTLE_HELMET -> true;
default -> false;
};
}
private int calculateCost(ItemStack target, ItemStack sacrifice, boolean renamed, boolean repair)
{
AtomicInteger cost = new AtomicInteger();
getEnchants(sacrifice).forEach((enchant, level) -> {
if (!isValidEnchant(target, enchant))
{
return;
}
boolean conflict = getEnchants(target).keySet().stream().anyMatch(e -> !(isProtection(enchant) && isProtection(e)) && enchant.conflictsWith(e));
if (conflict)
{
cost.getAndIncrement();
}
else
{
int multiplier = multipliers.get(enchant).item;
if (sacrifice.getType() == Material.ENCHANTED_BOOK)
{
multiplier = multipliers.get(enchant).book;
}
int targetLevel = getEnchants(target).getOrDefault(enchant, 0);
if (targetLevel == level)
{
cost.getAndAdd(multiplier * Math.min(level + 1, enchant.getMaxLevel()));
}
else
{
cost.getAndAdd(multiplier * Math.max(level, targetLevel));
}
}
});
cost.getAndAdd(getPenalty(target) + getPenalty(sacrifice));
if (repair)
{
cost.getAndAdd(2);
}
if (renamed)
{
cost.getAndIncrement();
}
return cost.get();
}
private boolean isValidEnchant(ItemStack item, Enchantment enchant)
{
return enchant.canEnchantItem(new ItemStack(item.getType())) || item.getType() == Material.ENCHANTED_BOOK;
}
@EventHandler
public void onAnvilPrepare(PrepareAnvilEvent event)
{
AnvilInventory inv = event.getInventory();
ItemStack left = inv.getItem(0);
ItemStack right = inv.getItem(1);
if (left == null || right == null)
{
return;
}
if (getEnchants(left).keySet().stream().anyMatch(this::isProtection) || getEnchants(right).keySet().stream().anyMatch(this::isProtection))
{
ItemStack result = left.clone();
boolean repair = false;
getEnchants(right).forEach((enchant, level) -> {
if (isProtection(enchant))
{
if (result.getItemMeta() instanceof EnchantmentStorageMeta meta)
{
meta.addStoredEnchant(enchant, level, true);
result.setItemMeta(meta);
}
else
{
result.addUnsafeEnchantment(enchant, level);
}
}
});
if (isArmor(right))
{
if (left.getType() != right.getType())
{
return;
}
int maxDamage = result.getType().getMaxDurability();
Damageable leftMeta = (Damageable)left.getItemMeta();
Damageable rightMeta = (Damageable)right.getItemMeta();
Damageable resultMeta = (Damageable)result.getItemMeta();
if (leftMeta == null || rightMeta == null || resultMeta == null)
{
return;
}
int leftDurability = maxDamage - leftMeta.getDamage();
int rightDurability = maxDamage - rightMeta.getDamage();
int durability = Math.min(leftDurability + rightDurability, maxDamage);
int damage = maxDamage - durability;
repair = resultMeta.getDamage() != damage;
resultMeta.setDamage(damage);
result.setItemMeta(resultMeta);
}
ItemMeta meta = result.getItemMeta();
if (meta == null)
{
return;
}
AnvilView view = event.getView();
String renameText = view.getRenameText();
boolean renamed = !meta.getDisplayName().equals(renameText);
meta.setDisplayName(renameText);
result.setItemMeta(meta);
view.setRepairCost(calculateCost(left, right, renamed, repair));
event.setResult(result);
}
}
}

View File

@@ -0,0 +1,4 @@
name: SuperArmor
version: '1.0'
main: com.kasetoatz.superArmor.SuperArmor
api-version: '1.21'