Initial commit
This commit is contained in:
13
src/main/java/com/kasetoatz/superArmor/Multiplier.java
Normal file
13
src/main/java/com/kasetoatz/superArmor/Multiplier.java
Normal 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;
|
||||
}
|
||||
}
|
193
src/main/java/com/kasetoatz/superArmor/SuperArmor.java
Normal file
193
src/main/java/com/kasetoatz/superArmor/SuperArmor.java
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
4
src/main/resources/plugin.yml
Normal file
4
src/main/resources/plugin.yml
Normal file
@@ -0,0 +1,4 @@
|
||||
name: SuperArmor
|
||||
version: '1.0'
|
||||
main: com.kasetoatz.superArmor.SuperArmor
|
||||
api-version: '1.21'
|
Reference in New Issue
Block a user