cn.nukkit.item.enchantment.Enchantment Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of powernukkit Show documentation
Show all versions of powernukkit Show documentation
A Minecraft Bedrock Edition server software implementation made in Java from scratch which supports all new features.
package cn.nukkit.item.enchantment;
import cn.nukkit.api.PowerNukkitOnly;
import cn.nukkit.api.Since;
import cn.nukkit.entity.Entity;
import cn.nukkit.event.entity.EntityDamageEvent;
import cn.nukkit.item.Item;
import cn.nukkit.item.enchantment.bow.EnchantmentBowFlame;
import cn.nukkit.item.enchantment.bow.EnchantmentBowInfinity;
import cn.nukkit.item.enchantment.bow.EnchantmentBowKnockback;
import cn.nukkit.item.enchantment.bow.EnchantmentBowPower;
import cn.nukkit.item.enchantment.damage.EnchantmentDamageAll;
import cn.nukkit.item.enchantment.damage.EnchantmentDamageArthropods;
import cn.nukkit.item.enchantment.damage.EnchantmentDamageSmite;
import cn.nukkit.item.enchantment.loot.EnchantmentLootDigging;
import cn.nukkit.item.enchantment.loot.EnchantmentLootFishing;
import cn.nukkit.item.enchantment.loot.EnchantmentLootWeapon;
import cn.nukkit.item.enchantment.protection.*;
import cn.nukkit.item.enchantment.trident.EnchantmentTridentChanneling;
import cn.nukkit.item.enchantment.trident.EnchantmentTridentImpaling;
import cn.nukkit.item.enchantment.trident.EnchantmentTridentLoyalty;
import cn.nukkit.item.enchantment.trident.EnchantmentTridentRiptide;
import cn.nukkit.math.NukkitMath;
import io.netty.util.internal.EmptyArrays;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.concurrent.ThreadLocalRandom;
/**
* @author MagicDroidX (Nukkit Project)
*/
public abstract class Enchantment implements Cloneable {
@PowerNukkitOnly
@Since("1.4.0.0-PN")
public static final Enchantment[] EMPTY_ARRAY = new Enchantment[0];
protected static Enchantment[] enchantments;
//http://minecraft.gamepedia.com/Enchanting#Aqua_Affinity
public static final int ID_PROTECTION_ALL = 0;
public static final int ID_PROTECTION_FIRE = 1;
public static final int ID_PROTECTION_FALL = 2;
public static final int ID_PROTECTION_EXPLOSION = 3;
public static final int ID_PROTECTION_PROJECTILE = 4;
public static final int ID_THORNS = 5;
public static final int ID_WATER_BREATHING = 6;
public static final int ID_WATER_WALKER = 7;
public static final int ID_WATER_WORKER = 8;
public static final int ID_DAMAGE_ALL = 9;
public static final int ID_DAMAGE_SMITE = 10;
public static final int ID_DAMAGE_ARTHROPODS = 11;
public static final int ID_KNOCKBACK = 12;
public static final int ID_FIRE_ASPECT = 13;
public static final int ID_LOOTING = 14;
public static final int ID_EFFICIENCY = 15;
public static final int ID_SILK_TOUCH = 16;
public static final int ID_DURABILITY = 17;
public static final int ID_FORTUNE_DIGGING = 18;
public static final int ID_BOW_POWER = 19;
public static final int ID_BOW_KNOCKBACK = 20;
public static final int ID_BOW_FLAME = 21;
public static final int ID_BOW_INFINITY = 22;
public static final int ID_FORTUNE_FISHING = 23;
public static final int ID_LURE = 24;
public static final int ID_FROST_WALKER = 25;
public static final int ID_MENDING = 26;
public static final int ID_BINDING_CURSE = 27;
public static final int ID_VANISHING_CURSE = 28;
public static final int ID_TRIDENT_IMPALING = 29;
public static final int ID_TRIDENT_RIPTIDE = 30;
public static final int ID_TRIDENT_LOYALTY = 31;
public static final int ID_TRIDENT_CHANNELING = 32;
public static final int ID_SOUL_SPEED = 36;
public static void init() {
enchantments = new Enchantment[256];
enchantments[ID_PROTECTION_ALL] = new EnchantmentProtectionAll();
enchantments[ID_PROTECTION_FIRE] = new EnchantmentProtectionFire();
enchantments[ID_PROTECTION_FALL] = new EnchantmentProtectionFall();
enchantments[ID_PROTECTION_EXPLOSION] = new EnchantmentProtectionExplosion();
enchantments[ID_PROTECTION_PROJECTILE] = new EnchantmentProtectionProjectile();
enchantments[ID_THORNS] = new EnchantmentThorns();
enchantments[ID_WATER_BREATHING] = new EnchantmentWaterBreath();
enchantments[ID_WATER_WORKER] = new EnchantmentWaterWorker();
enchantments[ID_WATER_WALKER] = new EnchantmentWaterWalker();
enchantments[ID_DAMAGE_ALL] = new EnchantmentDamageAll();
enchantments[ID_DAMAGE_SMITE] = new EnchantmentDamageSmite();
enchantments[ID_DAMAGE_ARTHROPODS] = new EnchantmentDamageArthropods();
enchantments[ID_KNOCKBACK] = new EnchantmentKnockback();
enchantments[ID_FIRE_ASPECT] = new EnchantmentFireAspect();
enchantments[ID_LOOTING] = new EnchantmentLootWeapon();
enchantments[ID_EFFICIENCY] = new EnchantmentEfficiency();
enchantments[ID_SILK_TOUCH] = new EnchantmentSilkTouch();
enchantments[ID_DURABILITY] = new EnchantmentDurability();
enchantments[ID_FORTUNE_DIGGING] = new EnchantmentLootDigging();
enchantments[ID_BOW_POWER] = new EnchantmentBowPower();
enchantments[ID_BOW_KNOCKBACK] = new EnchantmentBowKnockback();
enchantments[ID_BOW_FLAME] = new EnchantmentBowFlame();
enchantments[ID_BOW_INFINITY] = new EnchantmentBowInfinity();
enchantments[ID_FORTUNE_FISHING] = new EnchantmentLootFishing();
enchantments[ID_LURE] = new EnchantmentLure();
enchantments[ID_FROST_WALKER] = new EnchantmentFrostWalker();
enchantments[ID_MENDING] = new EnchantmentMending();
enchantments[ID_BINDING_CURSE] = new EnchantmentBindingCurse();
enchantments[ID_VANISHING_CURSE] = new EnchantmentVanishingCurse();
enchantments[ID_TRIDENT_IMPALING] = new EnchantmentTridentImpaling();
enchantments[ID_TRIDENT_RIPTIDE] = new EnchantmentTridentRiptide();
enchantments[ID_TRIDENT_LOYALTY] = new EnchantmentTridentLoyalty();
enchantments[ID_TRIDENT_CHANNELING] = new EnchantmentTridentChanneling();
enchantments[ID_SOUL_SPEED] = new EnchantmentSoulSpeed();
}
public static Enchantment get(int id) {
Enchantment enchantment = null;
if (id >= 0 && id < enchantments.length) {
enchantment = enchantments[id];
}
if (enchantment == null) {
return new UnknownEnchantment(id);
}
return enchantment;
}
public static Enchantment getEnchantment(int id) {
return get(id).clone();
}
public static Enchantment[] getEnchantments() {
ArrayList list = new ArrayList<>();
for (Enchantment enchantment : enchantments) {
if (enchantment == null) {
break;
}
list.add(enchantment);
}
return list.toArray(Enchantment.EMPTY_ARRAY);
}
public final int id;
private final int weight;
public EnchantmentType type;
protected int level = 1;
protected final String name;
protected Enchantment(int id, String name, int weight, EnchantmentType type) {
this.id = id;
this.weight = weight;
this.type = type;
this.name = name;
}
public int getLevel() {
return level;
}
public Enchantment setLevel(int level) {
return this.setLevel(level, true);
}
public Enchantment setLevel(int level, boolean safe) {
if (!safe) {
this.level = level;
return this;
}
this.level = NukkitMath.clamp(level, this.getMinLevel(), this.getMaxLevel());
return this;
}
public int getId() {
return id;
}
public int getWeight() {
return weight;
}
public int getMinLevel() {
return 1;
}
public int getMaxLevel() {
return 1;
}
public int getMaxEnchantableLevel() {
return getMaxLevel();
}
public int getMinEnchantAbility(int level) {
return 1 + level * 10;
}
public int getMaxEnchantAbility(int level) {
return this.getMinEnchantAbility(level) + 5;
}
public float getProtectionFactor(EntityDamageEvent event) {
return 0;
}
public double getDamageBonus(Entity entity) {
return 0;
}
public void doPostAttack(Entity attacker, Entity entity) {
}
public void doPostHurt(Entity attacker, Entity entity) {
}
public boolean isCompatibleWith(Enchantment enchantment) {
return this != enchantment;
}
public String getName() {
return "%enchantment." + this.name;
}
public boolean canEnchant(Item item) {
return this.type.canEnchantItem(item);
}
public boolean isMajor() {
return false;
}
@Override
protected Enchantment clone() {
try {
return (Enchantment) super.clone();
} catch (CloneNotSupportedException e) {
return null;
}
}
/**
* Checks if an item can have this enchantment. It's not strict to the enchantment table.
*/
@PowerNukkitOnly @Since("1.2.1.0-PN")
public boolean isItemAcceptable(Item item) {
return canEnchant(item);
}
public static final String[] words = {"the", "elder", "scrolls", "klaatu", "berata", "niktu", "xyzzy", "bless", "curse", "light", "darkness", "fire", "air", "earth", "water", "hot", "dry", "cold", "wet", "ignite", "snuff", "embiggen", "twist", "shorten", "stretch", "fiddle", "destroy", "imbue", "galvanize", "enchant", "free", "limited", "range", "of", "towards", "inside", "sphere", "cube", "self", "other", "ball", "mental", "physical", "grow", "shrink", "demon", "elemental", "spirit", "animal", "creature", "beast", "humanoid", "undead", "fresh", "stale"};
public static String getRandomName() {
int count = ThreadLocalRandom.current().nextInt(3, 6);
HashSet set = new HashSet<>();
while (set.size() < count) {
set.add(Enchantment.words[ThreadLocalRandom.current().nextInt(0, Enchantment.words.length)]);
}
String[] words = set.toArray(EmptyArrays.EMPTY_STRINGS);
return String.join(" ", words);
}
private static class UnknownEnchantment extends Enchantment {
protected UnknownEnchantment(int id) {
super(id, "unknown", 0, EnchantmentType.ALL);
}
}
}