From eb7bd5f23b56d47a8a3e27d21dad11e3f01c19d0 Mon Sep 17 00:00:00 2001 From: Nathan Adams Date: Sun, 27 Nov 2011 00:39:25 +0000 Subject: Implemented Enchantment API --- .../java/net/minecraft/server/Enchantment.java | 81 +++++++ .../net/minecraft/server/EnchantmentManager.java | 242 +++++++++++++++++++++ .../net/minecraft/server/EnchantmentModifier1.java | 17 ++ .../net/minecraft/server/EnchantmentModifier2.java | 17 ++ 4 files changed, 357 insertions(+) create mode 100644 src/main/java/net/minecraft/server/Enchantment.java create mode 100644 src/main/java/net/minecraft/server/EnchantmentManager.java create mode 100644 src/main/java/net/minecraft/server/EnchantmentModifier1.java create mode 100644 src/main/java/net/minecraft/server/EnchantmentModifier2.java (limited to 'src/main/java/net') 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(); + } +} -- cgit v1.2.3