Implemented Enchantment API

This commit is contained in:
Nathan Adams
2011-11-27 00:39:25 +00:00
parent ba608f55e4
commit eb7bd5f23b
7 changed files with 545 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
package net.minecraft.server;
import org.bukkit.craftbukkit.enchantments.CraftEnchantment;
public abstract class Enchantment {
// CraftBukkit comment - update CraftEnchant.getName(i) if this changes.
public static final Enchantment[] byId = new Enchantment[256];
public static final Enchantment PROTECTION_ENVIRONMENTAL = new EnchantmentProtection(0, 10, 0);
public static final Enchantment PROTECTION_FIRE = new EnchantmentProtection(1, 5, 1);
public static final Enchantment PROTECTION_FALL = new EnchantmentProtection(2, 5, 2);
public static final Enchantment PROTECTION_EXPLOSIONS = new EnchantmentProtection(3, 2, 3);
public static final Enchantment PROTECTION_PROJECTILE = new EnchantmentProtection(4, 5, 4);
public static final Enchantment OXYGEN = new EnchantmentOxygen(5, 2);
public static final Enchantment WATER_WORKER = new EnchantmentWaterWorker(6, 2);
public static final Enchantment DAMAGE_ALL = new EnchantmentWeaponDamage(16, 10, 0);
public static final Enchantment DAMAGE_UNDEAD = new EnchantmentWeaponDamage(17, 5, 1);
public static final Enchantment DAMAGE_ARTHROPODS = new EnchantmentWeaponDamage(18, 5, 2);
public static final Enchantment KNOCKBACK = new EnchantmentKnockback(19, 5);
public static final Enchantment FIRE_ASPECT = new EnchantmentFire(20, 2);
public static final Enchantment LOOT_BONUS_MOBS = new EnchantmentLootBonus(21, 2, EnchantmentSlotType.WEAPON);
public static final Enchantment DIG_SPEED = new EnchantmentDigging(32, 10);
public static final Enchantment SILK_TOUCH = new EnchantmentSilkTouch(33, 1);
public static final Enchantment DURABILITY = new EnchantmentDurability(34, 5);
public static final Enchantment LOOT_BONUS_BLOCKS = new EnchantmentLootBonus(35, 2, EnchantmentSlotType.DIGGER);
public final int id;
private final int weight;
public EnchantmentSlotType slot;
protected String name;
protected Enchantment(int i, int j, EnchantmentSlotType enchantmentslottype) {
this.id = i;
this.weight = j;
this.slot = enchantmentslottype;
if (byId[i] != null) {
throw new IllegalArgumentException("Duplicate enchantment id!");
} else {
byId[i] = this;
}
// CraftBukkit start
org.bukkit.enchantments.Enchantment.registerEnchantment(new CraftEnchantment(this));
// CraftBukkit end
}
public int getRandomWeight() {
return this.weight;
}
public int getStartLevel() {
return 1;
}
public int getMaxLevel() {
return 1;
}
public int a(int i) {
return 1 + i * 10;
}
public int b(int i) {
return this.a(i) + 5;
}
public int a(int i, DamageSource damagesource) {
return 0;
}
public int a(int i, EntityLiving entityliving) {
return 0;
}
public boolean a(Enchantment enchantment) {
return this != enchantment;
}
public Enchantment a(String s) {
this.name = s;
return this;
}
}

View File

@@ -0,0 +1,242 @@
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 EnchantmentModifier1 b = new EnchantmentModifier1((EmptyClass3) null);
private static final EnchantmentModifier2 c = new EnchantmentModifier2((EmptyClass3) null);
public EnchantmentManager() {}
public static int b(int i, ItemStack itemstack) { // CraftBukkit - priv to pub
if (itemstack == null) {
return 0;
} else {
NBTTagList nbttaglist = itemstack.p();
if (nbttaglist == null) {
return 0;
} else {
for (int j = 0; j < nbttaglist.d(); ++j) {
short short1 = ((NBTTagCompound) nbttaglist.a(j)).e("id");
short short2 = ((NBTTagCompound) nbttaglist.a(j)).e("lvl");
if (short1 == i) {
return short2;
}
}
return 0;
}
}
}
private static int a(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 = b(i, itemstack);
if (i1 > j) {
j = i1;
}
}
return j;
}
private static void a(EnchantmentModifier enchantmentmodifier, ItemStack itemstack) {
if (itemstack != null) {
NBTTagList nbttaglist = itemstack.p();
if (nbttaglist != null) {
for (int i = 0; i < nbttaglist.d(); ++i) {
short short1 = ((NBTTagCompound) nbttaglist.a(i)).e("id");
short short2 = ((NBTTagCompound) nbttaglist.a(i)).e("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(InventoryPlayer inventoryplayer, DamageSource damagesource) {
b.a = 0;
b.b = damagesource;
a((EnchantmentModifier) b, inventoryplayer.armor);
if (b.a > 25) {
b.a = 25;
}
return (b.a + 1 >> 1) + random.nextInt((b.a >> 1) + 1);
}
public static int a(InventoryPlayer inventoryplayer, EntityLiving entityliving) {
c.a = 0;
c.b = entityliving;
a((EnchantmentModifier) c, inventoryplayer.getItemInHand());
return c.a > 0 ? 1 + random.nextInt(c.a) : 0;
}
public static int b(InventoryPlayer inventoryplayer, EntityLiving entityliving) {
return b(Enchantment.KNOCKBACK.id, inventoryplayer.getItemInHand());
}
public static int c(InventoryPlayer inventoryplayer, EntityLiving entityliving) {
return b(Enchantment.FIRE_ASPECT.id, inventoryplayer.getItemInHand());
}
public static int a(InventoryPlayer inventoryplayer) {
return a(Enchantment.OXYGEN.id, inventoryplayer.armor);
}
public static int b(InventoryPlayer inventoryplayer) {
return b(Enchantment.DIG_SPEED.id, inventoryplayer.getItemInHand());
}
public static int c(InventoryPlayer inventoryplayer) {
return b(Enchantment.DURABILITY.id, inventoryplayer.getItemInHand());
}
public static boolean d(InventoryPlayer inventoryplayer) {
return b(Enchantment.SILK_TOUCH.id, inventoryplayer.getItemInHand()) > 0;
}
public static int e(InventoryPlayer inventoryplayer) {
return b(Enchantment.LOOT_BONUS_BLOCKS.id, inventoryplayer.getItemInHand());
}
public static int f(InventoryPlayer inventoryplayer) {
return b(Enchantment.LOOT_BONUS_MOBS.id, inventoryplayer.getItemInHand());
}
public static boolean g(InventoryPlayer inventoryplayer) {
return a(Enchantment.WATER_WORKER.id, inventoryplayer.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()) {
WeightedRandomChoiceEnchantment weightedrandomchoiceenchantment = (WeightedRandomChoiceEnchantment) WeightedRandom.a(random, map.values());
if (weightedrandomchoiceenchantment != null) {
arraylist = new ArrayList();
arraylist.add(weightedrandomchoiceenchantment);
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()) {
WeightedRandomChoiceEnchantment weightedrandomchoiceenchantment1 = (WeightedRandomChoiceEnchantment) iterator1.next();
if (weightedrandomchoiceenchantment1.a.a(Enchantment.byId[integer.intValue()])) {
continue;
}
flag = false;
}
if (!flag) {
iterator.remove();
}
break;
}
}
if (!map.isEmpty()) {
WeightedRandomChoiceEnchantment weightedrandomchoiceenchantment2 = (WeightedRandomChoiceEnchantment) WeightedRandom.a(random, map.values());
arraylist.add(weightedrandomchoiceenchantment2);
}
}
}
}
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.a(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 WeightedRandomChoiceEnchantment(enchantment, l));
}
}
}
}
return hashmap;
}
}

View File

@@ -0,0 +1,17 @@
package net.minecraft.server;
final class EnchantmentModifier1 implements EnchantmentModifier {
public int a;
public DamageSource b;
private EnchantmentModifier1() {}
public void a(Enchantment enchantment, int i) {
this.a += enchantment.a(i, this.b);
}
EnchantmentModifier1(EmptyClass3 emptyclass3) {
this();
}
}

View File

@@ -0,0 +1,17 @@
package net.minecraft.server;
final class EnchantmentModifier2 implements EnchantmentModifier {
public int a;
public EntityLiving b;
private EnchantmentModifier2() {}
public void a(Enchantment enchantment, int i) {
this.a += enchantment.a(i, this.b);
}
EnchantmentModifier2(EmptyClass3 emptyclass3) {
this();
}
}