Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-18 05:50:04 +01:00
243 Zeilen
8.6 KiB
Java
243 Zeilen
8.6 KiB
Java
package net.minecraft.server;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
|
|
public class EnchantmentManager {
|
|
|
|
private static final Random random = new Random();
|
|
private static final EnchantmentModifierProtection b = new EnchantmentModifierProtection((EmptyClass3) null);
|
|
private static final EnchantmentModifierDamage c = new EnchantmentModifierDamage((EmptyClass3) null);
|
|
|
|
public EnchantmentManager() {}
|
|
|
|
public static int getEnchantmentLevel(int i, ItemStack itemstack) { // CraftBukkit - priv to pub
|
|
if (itemstack == null) {
|
|
return 0;
|
|
} else {
|
|
NBTTagList nbttaglist = itemstack.getEnchantments();
|
|
|
|
if (nbttaglist == null) {
|
|
return 0;
|
|
} else {
|
|
for (int j = 0; j < nbttaglist.size(); ++j) {
|
|
short short1 = ((NBTTagCompound) nbttaglist.get(j)).getShort("id");
|
|
short short2 = ((NBTTagCompound) nbttaglist.get(j)).getShort("lvl");
|
|
|
|
if (short1 == i) {
|
|
return short2;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
private static int getEnchantmentLevel(int i, ItemStack[] aitemstack) {
|
|
int j = 0;
|
|
ItemStack[] aitemstack1 = aitemstack;
|
|
int k = aitemstack.length;
|
|
|
|
for (int l = 0; l < k; ++l) {
|
|
ItemStack itemstack = aitemstack1[l];
|
|
int i1 = getEnchantmentLevel(i, itemstack);
|
|
|
|
if (i1 > j) {
|
|
j = i1;
|
|
}
|
|
}
|
|
|
|
return j;
|
|
}
|
|
|
|
private static void a(EnchantmentModifier enchantmentmodifier, ItemStack itemstack) {
|
|
if (itemstack != null) {
|
|
NBTTagList nbttaglist = itemstack.getEnchantments();
|
|
|
|
if (nbttaglist != null) {
|
|
for (int i = 0; i < nbttaglist.size(); ++i) {
|
|
short short1 = ((NBTTagCompound) nbttaglist.get(i)).getShort("id");
|
|
short short2 = ((NBTTagCompound) nbttaglist.get(i)).getShort("lvl");
|
|
|
|
if (Enchantment.byId[short1] != null) {
|
|
enchantmentmodifier.a(Enchantment.byId[short1], short2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void a(EnchantmentModifier enchantmentmodifier, ItemStack[] aitemstack) {
|
|
ItemStack[] aitemstack1 = aitemstack;
|
|
int i = aitemstack.length;
|
|
|
|
for (int j = 0; j < i; ++j) {
|
|
ItemStack itemstack = aitemstack1[j];
|
|
|
|
a(enchantmentmodifier, itemstack);
|
|
}
|
|
}
|
|
|
|
public static int a(PlayerInventory playerinventory, DamageSource damagesource) {
|
|
b.a = 0;
|
|
b.b = damagesource;
|
|
a((EnchantmentModifier) b, playerinventory.armor);
|
|
if (b.a > 25) {
|
|
b.a = 25;
|
|
}
|
|
|
|
return (b.a + 1 >> 1) + random.nextInt((b.a >> 1) + 1);
|
|
}
|
|
|
|
public static int a(PlayerInventory playerinventory, EntityLiving entityliving) {
|
|
c.a = 0;
|
|
c.b = entityliving;
|
|
a((EnchantmentModifier) c, playerinventory.getItemInHand());
|
|
return c.a > 0 ? 1 + random.nextInt(c.a) : 0;
|
|
}
|
|
|
|
public static int getKnockbackEnchantmentLevel(PlayerInventory playerinventory, EntityLiving entityliving) {
|
|
return getEnchantmentLevel(Enchantment.KNOCKBACK.id, playerinventory.getItemInHand());
|
|
}
|
|
|
|
public static int getFireAspectEnchantmentLevel(PlayerInventory playerinventory, EntityLiving entityliving) {
|
|
return getEnchantmentLevel(Enchantment.FIRE_ASPECT.id, playerinventory.getItemInHand());
|
|
}
|
|
|
|
public static int getOxygenEnchantmentLevel(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.OXYGEN.id, playerinventory.armor);
|
|
}
|
|
|
|
public static int getDigSpeedEnchantmentLevel(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.DIG_SPEED.id, playerinventory.getItemInHand());
|
|
}
|
|
|
|
public static int getDurabilityEnchantmentLevel(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.DURABILITY.id, playerinventory.getItemInHand());
|
|
}
|
|
|
|
public static boolean hasSilkTouchEnchantment(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.SILK_TOUCH.id, playerinventory.getItemInHand()) > 0;
|
|
}
|
|
|
|
public static int getBonusBlockLootEnchantmentLevel(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS.id, playerinventory.getItemInHand());
|
|
}
|
|
|
|
public static int getBonusMonsterLootEnchantmentLevel(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.LOOT_BONUS_MOBS.id, playerinventory.getItemInHand());
|
|
}
|
|
|
|
public static boolean hasWaterWorkerEnchantment(PlayerInventory playerinventory) {
|
|
return getEnchantmentLevel(Enchantment.WATER_WORKER.id, playerinventory.armor) > 0;
|
|
}
|
|
|
|
public static int a(Random random, int i, int j, ItemStack itemstack) {
|
|
Item item = itemstack.getItem();
|
|
int k = item.c();
|
|
|
|
if (k <= 0) {
|
|
return 0;
|
|
} else {
|
|
if (j > 30) {
|
|
j = 30;
|
|
}
|
|
|
|
j = 1 + random.nextInt((j >> 1) + 1) + random.nextInt(j + 1);
|
|
int l = random.nextInt(5) + j;
|
|
|
|
return i == 0 ? (l >> 1) + 1 : (i == 1 ? l * 2 / 3 + 1 : l);
|
|
}
|
|
}
|
|
|
|
public static List a(Random random, ItemStack itemstack, int i) {
|
|
Item item = itemstack.getItem();
|
|
int j = item.c();
|
|
|
|
if (j <= 0) {
|
|
return null;
|
|
} else {
|
|
j = 1 + random.nextInt((j >> 1) + 1) + random.nextInt((j >> 1) + 1);
|
|
int k = j + i;
|
|
float f = (random.nextFloat() + random.nextFloat() - 1.0F) * 0.25F;
|
|
int l = (int) ((float) k * (1.0F + f) + 0.5F);
|
|
ArrayList arraylist = null;
|
|
Map map = a(l, itemstack);
|
|
|
|
if (map != null && !map.isEmpty()) {
|
|
EnchantmentInstance enchantmentinstance = (EnchantmentInstance) WeightedRandom.a(random, map.values());
|
|
|
|
if (enchantmentinstance != null) {
|
|
arraylist = new ArrayList();
|
|
arraylist.add(enchantmentinstance);
|
|
|
|
for (int i1 = l >> 1; random.nextInt(50) <= i1; i1 >>= 1) {
|
|
Iterator iterator = map.keySet().iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
Integer integer = (Integer) iterator.next();
|
|
boolean flag = true;
|
|
Iterator iterator1 = arraylist.iterator();
|
|
|
|
while (true) {
|
|
if (iterator1.hasNext()) {
|
|
EnchantmentInstance enchantmentinstance1 = (EnchantmentInstance) iterator1.next();
|
|
|
|
if (enchantmentinstance1.a.a(Enchantment.byId[integer.intValue()])) {
|
|
continue;
|
|
}
|
|
|
|
flag = false;
|
|
}
|
|
|
|
if (!flag) {
|
|
iterator.remove();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!map.isEmpty()) {
|
|
EnchantmentInstance enchantmentinstance2 = (EnchantmentInstance) WeightedRandom.a(random, map.values());
|
|
|
|
arraylist.add(enchantmentinstance2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return arraylist;
|
|
}
|
|
}
|
|
|
|
public static Map a(int i, ItemStack itemstack) {
|
|
Item item = itemstack.getItem();
|
|
HashMap hashmap = null;
|
|
Enchantment[] aenchantment = Enchantment.byId;
|
|
int j = aenchantment.length;
|
|
|
|
for (int k = 0; k < j; ++k) {
|
|
Enchantment enchantment = aenchantment[k];
|
|
|
|
if (enchantment != null && enchantment.slot.canEnchant(item)) {
|
|
for (int l = enchantment.getStartLevel(); l <= enchantment.getMaxLevel(); ++l) {
|
|
if (i >= enchantment.a(l) && i <= enchantment.b(l)) {
|
|
if (hashmap == null) {
|
|
hashmap = new HashMap();
|
|
}
|
|
|
|
hashmap.put(Integer.valueOf(enchantment.id), new EnchantmentInstance(enchantment, l));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return hashmap;
|
|
}
|
|
}
|