summaryrefslogtreecommitdiffstats
path: root/src/main/java/net/minecraft
diff options
context:
space:
mode:
authorNathan Adams <dinnerbone@dinnerbone.com>2011-11-27 00:39:25 +0000
committerNathan Adams <dinnerbone@dinnerbone.com>2011-11-27 01:37:00 +0000
commiteb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0 (patch)
tree52e38d7638d78aebb416a54573b3bb727dd24f31 /src/main/java/net/minecraft
parentba608f55e4afe7ded3f31d4723d1e74d910015fc (diff)
downloadcraftbukkit-eb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0.tar
craftbukkit-eb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0.tar.gz
craftbukkit-eb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0.tar.lz
craftbukkit-eb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0.tar.xz
craftbukkit-eb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0.zip
Implemented Enchantment API
Diffstat (limited to 'src/main/java/net/minecraft')
-rw-r--r--src/main/java/net/minecraft/server/Enchantment.java81
-rw-r--r--src/main/java/net/minecraft/server/EnchantmentManager.java242
-rw-r--r--src/main/java/net/minecraft/server/EnchantmentModifier1.java17
-rw-r--r--src/main/java/net/minecraft/server/EnchantmentModifier2.java17
4 files changed, 357 insertions, 0 deletions
diff --git a/src/main/java/net/minecraft/server/Enchantment.java b/src/main/java/net/minecraft/server/Enchantment.java
new file mode 100644
index 00000000..6397455a
--- /dev/null
+++ b/src/main/java/net/minecraft/server/Enchantment.java
@@ -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;
+ }
+}
diff --git a/src/main/java/net/minecraft/server/EnchantmentManager.java b/src/main/java/net/minecraft/server/EnchantmentManager.java
new file mode 100644
index 00000000..1a170621
--- /dev/null
+++ b/src/main/java/net/minecraft/server/EnchantmentManager.java
@@ -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;
+ }
+}
diff --git a/src/main/java/net/minecraft/server/EnchantmentModifier1.java b/src/main/java/net/minecraft/server/EnchantmentModifier1.java
new file mode 100644
index 00000000..2edeacfe
--- /dev/null
+++ b/src/main/java/net/minecraft/server/EnchantmentModifier1.java
@@ -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();
+ }
+}
diff --git a/src/main/java/net/minecraft/server/EnchantmentModifier2.java b/src/main/java/net/minecraft/server/EnchantmentModifier2.java
new file mode 100644
index 00000000..b10eff5e
--- /dev/null
+++ b/src/main/java/net/minecraft/server/EnchantmentModifier2.java
@@ -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();
+ }
+}