diff options
628 files changed, 22150 insertions, 65097 deletions
@@ -5,12 +5,14 @@ # netbeans /nbproject +nb*.xml # we use maven! /build.xml # maven /target +dependency-reduced-pom.xml # vim .*.sw[a-p] diff --git a/makePatches.sh b/makePatches.sh new file mode 100755 index 00000000..771e39f8 --- /dev/null +++ b/makePatches.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +if [ -z "$1" ] +then + echo "Please run this script again with the clean decompile sources as an argument. In most cases this will be ../work/decompile-XXXX" + exit +fi + +rm -f nms-patches/* + +for file in $(ls src/main/java/net/minecraft/server) +do + echo "Diffing $file" + dos2unix -q $1/net/minecraft/server/$file $1/net/minecraft/server/$file + diff -u $1/net/minecraft/server/$file src/main/java/net/minecraft/server/$file > nms-patches/"$(echo $file | cut -d. -f1)".patch +done diff --git a/nms-patches/BiomeTheEndDecorator.patch b/nms-patches/BiomeTheEndDecorator.patch new file mode 100644 index 00000000..6c957c2a --- /dev/null +++ b/nms-patches/BiomeTheEndDecorator.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BiomeTheEndDecorator.java 2014-11-27 08:59:46.501422728 +1100 ++++ src/main/java/net/minecraft/server/BiomeTheEndDecorator.java 2014-11-27 08:42:10.136850942 +1100 +@@ -21,7 +21,7 @@ + EntityEnderDragon entityenderdragon = new EntityEnderDragon(this.a); + + entityenderdragon.setPositionRotation(0.0D, 128.0D, 0.0D, this.b.nextFloat() * 360.0F, 0.0F); +- this.a.addEntity(entityenderdragon); ++ this.a.addEntity(entityenderdragon, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason + } + + } diff --git a/nms-patches/Block.patch b/nms-patches/Block.patch new file mode 100644 index 00000000..fc44dc75 --- /dev/null +++ b/nms-patches/Block.patch @@ -0,0 +1,23 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Block.java 2014-11-27 08:59:46.537422569 +1100 ++++ src/main/java/net/minecraft/server/Block.java 2014-11-27 08:42:10.172850872 +1100 +@@ -295,7 +295,8 @@ + int j = this.getDropCount(i, world.random); + + for (int k = 0; k < j; ++k) { +- if (world.random.nextFloat() <= f) { ++ // CraftBukkit - <= to < to allow for plugins to completely disable block drops from explosions ++ if (world.random.nextFloat() < f) { + Item item = this.getDropType(iblockdata, world.random, i); + + if (item != null) { +@@ -920,4 +921,10 @@ + private static void a(int i, String s, Block block) { + a(i, new MinecraftKey(s), block); + } ++ ++ // CraftBukkit start ++ public int getExpDrop(World world, IBlockData data, int enchantmentLevel) { ++ return 0; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/BlockBloodStone.patch b/nms-patches/BlockBloodStone.patch new file mode 100644 index 00000000..82233f90 --- /dev/null +++ b/nms-patches/BlockBloodStone.patch @@ -0,0 +1,28 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockBloodStone.java 2014-11-27 08:59:46.505422709 +1100 ++++ src/main/java/net/minecraft/server/BlockBloodStone.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockBloodStone extends Block { + + public BlockBloodStone() { +@@ -10,4 +12,17 @@ + public MaterialMapColor g(IBlockData iblockdata) { + return MaterialMapColor.K; + } ++ ++ // CraftBukkit start ++ @Override ++ public void doPhysics(World world, BlockPosition position, IBlockData iblockdata, Block block) { ++ if (block != null && block.isPowerSource()) { ++ org.bukkit.block.Block bl = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); ++ int power = bl.getBlockPower(); ++ ++ BlockRedstoneEvent event = new BlockRedstoneEvent(bl, power, power); ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/BlockButtonAbstract.patch b/nms-patches/BlockButtonAbstract.patch new file mode 100644 index 00000000..b41c8016 --- /dev/null +++ b/nms-patches/BlockButtonAbstract.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockButtonAbstract.java 2014-11-27 08:59:46.505422709 +1100 ++++ src/main/java/net/minecraft/server/BlockButtonAbstract.java 2014-11-27 08:42:10.160850895 +1100 +@@ -3,6 +3,11 @@ + import java.util.List; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.event.block.BlockRedstoneEvent; ++import org.bukkit.event.entity.EntityInteractEvent; ++// CraftBukkit end ++ + public abstract class BlockButtonAbstract extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); +@@ -122,6 +127,19 @@ + if (((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue()) { + return true; + } else { ++ // CraftBukkit start ++ boolean powered = ((Boolean) iblockdata.get(POWERED)); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int old = (powered) ? 15 : 0; ++ int current = (!powered) ? 15 : 0; ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) { ++ return true; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true)), 3); + world.b(blockposition, blockposition); + world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, 0.6F); +@@ -159,6 +177,16 @@ + if (this.M) { + this.f(world, blockposition, iblockdata); + } else { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() > 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false))); + this.b(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); + world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, 0.5F); +@@ -192,8 +220,42 @@ + List list = world.a(EntityArrow.class, new AxisAlignedBB((double) blockposition.getX() + this.minX, (double) blockposition.getY() + this.minY, (double) blockposition.getZ() + this.minZ, (double) blockposition.getX() + this.maxX, (double) blockposition.getY() + this.maxY, (double) blockposition.getZ() + this.maxZ)); + boolean flag = !list.isEmpty(); + boolean flag1 = ((Boolean) iblockdata.get(BlockButtonAbstract.POWERED)).booleanValue(); ++ ++ // CraftBukkit start - Call interact event when arrows turn on wooden buttons ++ if (flag1 != flag && flag) { ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ boolean allowed = false; ++ ++ // If all of the events are cancelled block the button press, else allow ++ for (Object object : list) { ++ if (object != null) { ++ EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ allowed = true; ++ break; ++ } ++ } ++ } ++ ++ if (!allowed) { ++ return; ++ } ++ } ++ // CraftBukkit end + + if (flag && !flag1) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 0, 15); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() <= 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(true))); + this.b(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); + world.b(blockposition, blockposition); +@@ -201,6 +263,16 @@ + } + + if (!flag && flag1) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() > 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, iblockdata.set(BlockButtonAbstract.POWERED, Boolean.valueOf(false))); + this.b(world, blockposition, (EnumDirection) iblockdata.get(BlockButtonAbstract.FACING)); + world.b(blockposition, blockposition); diff --git a/nms-patches/BlockCactus.patch b/nms-patches/BlockCactus.patch new file mode 100644 index 00000000..7159a89e --- /dev/null +++ b/nms-patches/BlockCactus.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCactus.java 2014-11-27 08:59:46.509422692 +1100 ++++ src/main/java/net/minecraft/server/BlockCactus.java 2014-11-27 08:42:10.152850911 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockCactus extends Block { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15); +@@ -31,7 +33,8 @@ + world.setTypeUpdate(blockposition1, this.getBlockData()); + IBlockData iblockdata1 = iblockdata.set(BlockCactus.AGE, Integer.valueOf(0)); + +- world.setTypeAndData(blockposition, iblockdata1, 4); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this, 0); // CraftBukkit ++ // world.setTypeAndData(blockposition, iblockdata1, 4); // CraftBukkit + this.doPhysics(world, blockposition1, iblockdata1, this); + } else { + world.setTypeAndData(blockposition, iblockdata.set(BlockCactus.AGE, Integer.valueOf(j + 1)), 4); +@@ -83,7 +86,9 @@ + } + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { ++ CraftEventFactory.blockDamage = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); // CraftBukkit + entity.damageEntity(DamageSource.CACTUS, 1.0F); ++ CraftEventFactory.blockDamage = null; // CraftBukkit + } + + public IBlockData fromLegacyData(int i) { diff --git a/nms-patches/BlockCake.patch b/nms-patches/BlockCake.patch new file mode 100644 index 00000000..facc1d4f --- /dev/null +++ b/nms-patches/BlockCake.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCake.java 2014-11-27 08:59:46.509422692 +1100 ++++ src/main/java/net/minecraft/server/BlockCake.java 2014-11-27 08:42:10.168850880 +1100 +@@ -54,7 +54,18 @@ + + private void b(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { + if (entityhuman.j(false)) { +- entityhuman.getFoodData().eat(2, 0.1F); ++ // CraftBukkit start ++ // entityhuman.getFoodData().eat(2, 0.1F); ++ int oldFoodLevel = entityhuman.getFoodData().foodLevel; ++ ++ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, 2 + oldFoodLevel); ++ ++ if (!event.isCancelled()) { ++ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); ++ // CraftBukkit end + int i = ((Integer) iblockdata.get(BlockCake.BITES)).intValue(); + + if (i < 6) { diff --git a/nms-patches/BlockCocoa.patch b/nms-patches/BlockCocoa.patch new file mode 100644 index 00000000..40006fff --- /dev/null +++ b/nms-patches/BlockCocoa.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCocoa.java 2014-11-27 08:59:46.513422674 +1100 ++++ src/main/java/net/minecraft/server/BlockCocoa.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockCocoa extends BlockDirectional implements IBlockFragilePlantElement { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 2); +@@ -19,7 +21,10 @@ + int i = ((Integer) iblockdata.get(BlockCocoa.AGE)).intValue(); + + if (i < 2) { +- world.setTypeAndData(blockposition, iblockdata.set(BlockCocoa.AGE, Integer.valueOf(i + 1)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i + 1)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + } + +@@ -125,7 +130,10 @@ + } + + public void b(World world, Random random, BlockPosition blockposition, IBlockData iblockdata) { +- world.setTypeAndData(blockposition, iblockdata.set(BlockCocoa.AGE, Integer.valueOf(((Integer) iblockdata.get(BlockCocoa.AGE)).intValue() + 1)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(((Integer) iblockdata.get(AGE)).intValue() + 1)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + + public IBlockData fromLegacyData(int i) { diff --git a/nms-patches/BlockCommand.patch b/nms-patches/BlockCommand.patch new file mode 100644 index 00000000..e7fe808d --- /dev/null +++ b/nms-patches/BlockCommand.patch @@ -0,0 +1,34 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCommand.java 2014-11-27 08:59:46.513422674 +1100 ++++ src/main/java/net/minecraft/server/BlockCommand.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockCommand extends BlockContainer { + + public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered"); +@@ -19,11 +21,20 @@ + if (!world.isStatic) { + boolean flag = world.isBlockIndirectlyPowered(blockposition); + boolean flag1 = ((Boolean) iblockdata.get(BlockCommand.TRIGGERED)).booleanValue(); ++ ++ // CraftBukkit start ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int old = flag1 ? 15 : 0; ++ int current = flag ? 15 : 0; ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ // CraftBukkit end + +- if (flag && !flag1) { ++ if (eventRedstone.getNewCurrent() > 0 && !(eventRedstone.getOldCurrent() > 0)) { // CraftBukkit + world.setTypeAndData(blockposition, iblockdata.set(BlockCommand.TRIGGERED, Boolean.valueOf(true)), 4); + world.a(blockposition, (Block) this, this.a(world)); +- } else if (!flag && flag1) { ++ } else if (!(eventRedstone.getNewCurrent() > 0) && eventRedstone.getOldCurrent() > 0) { // CraftBukkit + world.setTypeAndData(blockposition, iblockdata.set(BlockCommand.TRIGGERED, Boolean.valueOf(false)), 4); + } + } diff --git a/nms-patches/BlockCrops.patch b/nms-patches/BlockCrops.patch new file mode 100644 index 00000000..fde60f42 --- /dev/null +++ b/nms-patches/BlockCrops.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockCrops.java 2014-11-27 08:59:46.517422657 +1100 ++++ src/main/java/net/minecraft/server/BlockCrops.java 2014-11-27 08:42:10.160850895 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7); +@@ -31,7 +33,10 @@ + float f = a((Block) this, world, blockposition); + + if (random.nextInt((int) (25.0F / f) + 1) == 0) { +- world.setTypeAndData(blockposition, iblockdata.set(BlockCrops.AGE, Integer.valueOf(i + 1)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i + 1)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + } + } +@@ -45,7 +50,10 @@ + i = 7; + } + +- world.setTypeAndData(blockposition, iblockdata.set(BlockCrops.AGE, Integer.valueOf(i)), 2); ++ // CraftBukkit start ++ IBlockData data = iblockdata.set(AGE, Integer.valueOf(i)); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(data)); ++ // CraftBukkit end + } + + protected static float a(Block block, World world, BlockPosition blockposition) { diff --git a/nms-patches/BlockDaylightDetector.patch b/nms-patches/BlockDaylightDetector.patch new file mode 100644 index 00000000..7f37a071 --- /dev/null +++ b/nms-patches/BlockDaylightDetector.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDaylightDetector.java 2014-11-27 08:59:46.517422657 +1100 ++++ src/main/java/net/minecraft/server/BlockDaylightDetector.java 2014-11-27 08:42:10.164850887 +1100 +@@ -41,6 +41,7 @@ + } + + if (((Integer) iblockdata.get(BlockDaylightDetector.POWER)).intValue() != i) { ++ i = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), ((Integer) iblockdata.get(POWER)), i).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent + world.setTypeAndData(blockposition, iblockdata.set(BlockDaylightDetector.POWER, Integer.valueOf(i)), 3); + } + diff --git a/nms-patches/BlockDiodeAbstract.patch b/nms-patches/BlockDiodeAbstract.patch new file mode 100644 index 00000000..f0c210d8 --- /dev/null +++ b/nms-patches/BlockDiodeAbstract.patch @@ -0,0 +1,30 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDiodeAbstract.java 2014-11-27 08:59:46.517422657 +1100 ++++ src/main/java/net/minecraft/server/BlockDiodeAbstract.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public abstract class BlockDiodeAbstract extends BlockDirectional { + + protected final boolean M; +@@ -31,8 +33,18 @@ + boolean flag = this.e(world, blockposition, iblockdata); + + if (this.M && !flag) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, this.k(iblockdata), 2); + } else if (!this.M) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, this.e(iblockdata), 2); + if (!flag) { + world.a(blockposition, this.e(iblockdata).getBlock(), this.m(iblockdata), -1); diff --git a/nms-patches/BlockDispenser.patch b/nms-patches/BlockDispenser.patch new file mode 100644 index 00000000..35ad0d58 --- /dev/null +++ b/nms-patches/BlockDispenser.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDispenser.java 2014-11-27 08:59:46.521422639 +1100 ++++ src/main/java/net/minecraft/server/BlockDispenser.java 2014-11-27 08:42:10.084851043 +1100 +@@ -8,6 +8,7 @@ + public static final BlockStateBoolean TRIGGERED = BlockStateBoolean.of("triggered"); + public static final RegistryDefault M = new RegistryDefault(new DispenseBehaviorItem()); + protected Random N = new Random(); ++ public static boolean eventFired = false; // CraftBukkit + + protected BlockDispenser() { + super(Material.STONE); +@@ -78,6 +79,7 @@ + + if (idispensebehavior != IDispenseBehavior.a) { + ItemStack itemstack1 = idispensebehavior.a(sourceblock, itemstack); ++ eventFired = false; // CraftBukkit - reset event status + + tileentitydispenser.setItem(i, itemstack1.count == 0 ? null : itemstack1); + } diff --git a/nms-patches/BlockDoor.patch b/nms-patches/BlockDoor.patch new file mode 100644 index 00000000..a14fff0f --- /dev/null +++ b/nms-patches/BlockDoor.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDoor.java 2014-11-27 08:59:46.521422639 +1100 ++++ src/main/java/net/minecraft/server/BlockDoor.java 2014-11-27 08:42:10.156850903 +1100 +@@ -3,6 +3,8 @@ + import com.google.common.base.Predicate; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockDoor extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirectionLimit.HORIZONTAL); +@@ -151,9 +153,21 @@ + this.b(world, blockposition, iblockdata, 0); + } + } else { +- boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || world.isBlockIndirectlyPowered(blockposition2); ++ // CraftBukkit start ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block blockTop = bworld.getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()); ++ ++ int power = bukkitBlock.getBlockPower(); ++ int powerTop = blockTop.getBlockPower(); ++ if (powerTop > power) power = powerTop; ++ int oldPower = (Boolean)iblockdata2.get(POWERED) ? 15 : 0; ++ ++ if (oldPower == 0 ^ power == 0) { ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); ++ world.getServer().getPluginManager().callEvent(eventRedstone); + +- if ((flag1 || block.isPowerSource()) && block != this && flag1 != ((Boolean) iblockdata2.get(BlockDoor.POWERED)).booleanValue()) { ++ boolean flag1 = eventRedstone.getNewCurrent() > 0; + world.setTypeAndData(blockposition2, iblockdata2.set(BlockDoor.POWERED, Boolean.valueOf(flag1)), 2); + if (flag1 != ((Boolean) iblockdata.get(BlockDoor.OPEN)).booleanValue()) { + world.setTypeAndData(blockposition, iblockdata.set(BlockDoor.OPEN, Boolean.valueOf(flag1)), 2); +@@ -161,6 +175,7 @@ + world.a((EntityHuman) null, flag1 ? 1003 : 1006, blockposition, 0); + } + } ++ // CraftBukkit end + } + } + diff --git a/nms-patches/BlockDragonEgg.patch b/nms-patches/BlockDragonEgg.patch new file mode 100644 index 00000000..d2415b9b --- /dev/null +++ b/nms-patches/BlockDragonEgg.patch @@ -0,0 +1,30 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDragonEgg.java 2014-11-27 08:59:46.525422622 +1100 ++++ src/main/java/net/minecraft/server/BlockDragonEgg.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit ++ + public class BlockDragonEgg extends Block { + + public BlockDragonEgg() { +@@ -61,6 +63,18 @@ + BlockPosition blockposition1 = blockposition.a(world.random.nextInt(16) - world.random.nextInt(16), world.random.nextInt(8) - world.random.nextInt(8), world.random.nextInt(16) - world.random.nextInt(16)); + + if (world.getType(blockposition1).getBlock().material == Material.AIR) { ++ // CraftBukkit start ++ org.bukkit.block.Block from = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block to = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); ++ BlockFromToEvent event = new BlockFromToEvent(from, to); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ blockposition1 = new BlockPosition(event.getToBlock().getX(), event.getToBlock().getY(), event.getToBlock().getZ()); ++ // CraftBukkit end + if (world.isStatic) { + for (int j = 0; j < 128; ++j) { + double d0 = world.random.nextDouble(); diff --git a/nms-patches/BlockDropper.patch b/nms-patches/BlockDropper.patch new file mode 100644 index 00000000..43df579c --- /dev/null +++ b/nms-patches/BlockDropper.patch @@ -0,0 +1,41 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockDropper.java 2014-11-27 08:59:46.525422622 +1100 ++++ src/main/java/net/minecraft/server/BlockDropper.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.inventory.InventoryMoveItemEvent; ++// CraftBukkit end ++ + public class BlockDropper extends BlockDispenser { + + private final IDispenseBehavior O = new DispenseBehaviorItem(); +@@ -38,8 +43,25 @@ + itemstack1 = null; + } + } else { +- itemstack1 = TileEntityHopper.addItem(iinventory, itemstack.cloneItemStack().a(1), enumdirection.opposite()); +- if (itemstack1 == null) { ++ // CraftBukkit start - Fire event when pushing items into other inventories ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().a(1)); ++ ++ org.bukkit.inventory.Inventory destinationInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ destinationInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); ++ world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ itemstack1 = TileEntityHopper.addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection.opposite()); ++ if (event.getItem().equals(oitemstack) && itemstack1 == null) { ++ // CraftBukkit end + itemstack1 = itemstack.cloneItemStack(); + if (--itemstack1.count == 0) { + itemstack1 = null; diff --git a/nms-patches/BlockEnderPortal.patch b/nms-patches/BlockEnderPortal.patch new file mode 100644 index 00000000..ae5743c2 --- /dev/null +++ b/nms-patches/BlockEnderPortal.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockEnderPortal.java 2014-11-27 08:59:46.529422604 +1100 ++++ src/main/java/net/minecraft/server/BlockEnderPortal.java 2014-11-27 08:42:10.104851005 +1100 +@@ -3,6 +3,8 @@ + import java.util.List; + import java.util.Random; + ++import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit ++ + public class BlockEnderPortal extends BlockContainer { + + protected BlockEnderPortal(Material material) { +@@ -36,6 +38,10 @@ + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { + if (entity.vehicle == null && entity.passenger == null && !world.isStatic) { ++ // CraftBukkit start - Entity in portal ++ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + entity.c(1); + } + diff --git a/nms-patches/BlockFire.patch b/nms-patches/BlockFire.patch new file mode 100644 index 00000000..0abc00c0 --- /dev/null +++ b/nms-patches/BlockFire.patch @@ -0,0 +1,110 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockFire.java 2014-11-27 08:59:46.529422604 +1100 ++++ src/main/java/net/minecraft/server/BlockFire.java 2014-11-27 08:42:10.168850880 +1100 +@@ -4,6 +4,12 @@ + import java.util.Map; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.block.BlockBurnEvent; ++import org.bukkit.event.block.BlockSpreadEvent; ++// CraftBukkit end ++ + public class BlockFire extends Block { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 15); +@@ -109,7 +115,7 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (world.getGameRules().getBoolean("doFireTick")) { + if (!this.canPlace(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - invalid place location + } + + Block block = world.getType(blockposition.down()).getBlock(); +@@ -120,7 +126,7 @@ + } + + if (!flag && world.S() && this.d(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - extinguished by rain + } else { + int i = ((Integer) iblockdata.get(BlockFire.AGE)).intValue(); + +@@ -186,7 +192,26 @@ + l1 = 15; + } + +- world.setTypeAndData(blockposition1, iblockdata.set(BlockFire.AGE, Integer.valueOf(l1)), 3); ++ // CraftBukkit start - Call to stop spread of fire ++ if (world.getType(blockposition1) != Blocks.FIRE) { ++ if (CraftEventFactory.callBlockIgniteEvent(world, i1, k1, j1, i, j, k).isCancelled()) { ++ continue; ++ } ++ ++ org.bukkit.Server server = world.getServer(); ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.block.BlockState blockState = bworld.getBlockAt(i1, k1, j1).getState(); ++ blockState.setTypeId(Block.getId(this)); ++ blockState.setData(new org.bukkit.material.MaterialData(Block.getId(this), (byte) l1)); ++ ++ BlockSpreadEvent spreadEvent = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); ++ server.getPluginManager().callEvent(spreadEvent); ++ ++ if (!spreadEvent.isCancelled()) { ++ blockState.update(true); ++ } ++ } ++ // CraftBukkit end + } + } + } +@@ -223,6 +248,17 @@ + + if (random.nextInt(i) < k) { + IBlockData iblockdata = world.getType(blockposition); ++ ++ // CraftBukkit start ++ org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockBurnEvent event = new BlockBurnEvent(theBlock); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + + if (random.nextInt(j + 10) < 5 && !world.isRainingAt(blockposition)) { + int l = j + random.nextInt(5) / 4; +@@ -290,7 +326,7 @@ + + public void doPhysics(World world, BlockPosition blockposition, IBlockData iblockdata, Block block) { + if (!World.a((IBlockAccess) world, blockposition.down()) && !this.e(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - fuel block gone + } + + } +@@ -298,7 +334,7 @@ + public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) { + if (world.worldProvider.getDimension() > 0 || !Blocks.PORTAL.d(world, blockposition)) { + if (!World.a((IBlockAccess) world, blockposition.down()) && !this.e(world, blockposition)) { +- world.setAir(blockposition); ++ fireExtinguished(world, blockposition); // CraftBukkit - fuel block broke + } else { + world.a(blockposition, (Block) this, this.a(world) + world.random.nextInt(10)); + } +@@ -320,4 +356,12 @@ + protected BlockStateList getStateList() { + return new BlockStateList(this, new IBlockState[] { BlockFire.AGE, BlockFire.NORTH, BlockFire.EAST, BlockFire.SOUTH, BlockFire.WEST, BlockFire.UPPER, BlockFire.FLIP, BlockFire.ALT}); + } ++ ++ // CraftBukkit start ++ private void fireExtinguished(World world, BlockPosition position) { ++ if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), Blocks.AIR).isCancelled()) { ++ world.setAir(position); ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/BlockFlowing.patch b/nms-patches/BlockFlowing.patch new file mode 100644 index 00000000..84b3101d --- /dev/null +++ b/nms-patches/BlockFlowing.patch @@ -0,0 +1,83 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockFlowing.java 2014-11-27 08:59:46.529422604 +1100 ++++ src/main/java/net/minecraft/server/BlockFlowing.java 2014-11-27 08:42:10.112850989 +1100 +@@ -5,6 +5,11 @@ + import java.util.Random; + import java.util.Set; + ++// CraftBukkit start ++import org.bukkit.block.BlockFace; ++import org.bukkit.event.block.BlockFromToEvent; ++// CraftBukkit end ++ + public class BlockFlowing extends BlockFluids { + + int a; +@@ -18,7 +23,12 @@ + } + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { +- int i = ((Integer) iblockdata.get(BlockFlowing.LEVEL)).intValue(); ++ // CraftBukkit start ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.Server server = world.getServer(); ++ org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ // CraftBukkit end ++ int i = ((Integer) iblockdata.get(LEVEL)).intValue(); + byte b0 = 1; + + if (this.material == Material.LAVA && !world.worldProvider.n()) { +@@ -88,17 +98,25 @@ + IBlockData iblockdata2 = world.getType(blockposition.down()); + + if (this.h(world, blockposition.down(), iblockdata2)) { +- if (this.material == Material.LAVA && world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER) { +- world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData()); +- this.fizz(world, blockposition.down()); +- return; +- } ++ // CraftBukkit start - Send "down" to the server ++ BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); ++ if (server != null) { ++ server.getPluginManager().callEvent(event); ++ } ++ if (!event.isCancelled()) { ++ if (this.material == Material.LAVA && world.getType(blockposition.down()).getBlock().getMaterial() == Material.WATER) { ++ world.setTypeUpdate(blockposition.down(), Blocks.STONE.getBlockData()); ++ this.fizz(world, blockposition.down()); ++ return; ++ } + +- if (i >= 8) { +- this.flow(world, blockposition.down(), iblockdata2, i); +- } else { +- this.flow(world, blockposition.down(), iblockdata2, i + 8); ++ if (i >= 8) { ++ this.flow(world, blockposition.down(), iblockdata2, i); ++ } else { ++ this.flow(world, blockposition.down(), iblockdata2, i + 8); ++ } + } ++ // CraftBukkit end + } else if (i >= 0 && (i == 0 || this.g(world, blockposition.down(), iblockdata2))) { + Set set = this.e(world, blockposition); + +@@ -115,8 +133,17 @@ + + while (iterator1.hasNext()) { + EnumDirection enumdirection1 = (EnumDirection) iterator1.next(); +- +- this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); ++ ++ // CraftBukkit start ++ BlockFromToEvent event = new BlockFromToEvent(source, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection1)); ++ if (server != null) { ++ server.getPluginManager().callEvent(event); ++ } ++ ++ if (!event.isCancelled()) { ++ this.flow(world, blockposition.shift(enumdirection1), world.getType(blockposition.shift(enumdirection1)), k); ++ } ++ // CraftBukkit end + } + } + diff --git a/nms-patches/BlockGrass.patch b/nms-patches/BlockGrass.patch new file mode 100644 index 00000000..b52f01fd --- /dev/null +++ b/nms-patches/BlockGrass.patch @@ -0,0 +1,77 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockGrass.java 2014-11-27 08:59:46.533422586 +1100 ++++ src/main/java/net/minecraft/server/BlockGrass.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,14 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.BlockSpreadEvent; ++import org.bukkit.event.block.BlockFadeEvent; ++// CraftBukkit end ++ + public class BlockGrass extends Block implements IBlockFragilePlantElement { + + public static final BlockStateBoolean SNOWY = BlockStateBoolean.of("snowy"); +@@ -22,7 +30,19 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (!world.isStatic) { + if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).getBlock().n() > 2) { +- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); ++ ++ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } else { + if (world.getLightLevel(blockposition.up()) >= 9) { + for (int i = 0; i < 4; ++i) { +@@ -31,7 +51,19 @@ + IBlockData iblockdata1 = world.getType(blockposition1); + + if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && block.n() <= 2) { +- world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData()); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition1, Blocks.GRASS.getBlockData()); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.GRASS)); ++ ++ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + } +@@ -74,13 +106,15 @@ + IBlockData iblockdata1 = blockflowers.getBlockData().set(blockflowers.l(), enumflowervarient); + + if (blockflowers.f(world, blockposition2, iblockdata1)) { +- world.setTypeAndData(blockposition2, iblockdata1, 3); ++ // world.setTypeAndData(blockposition2, iblockdata1, 3); // CraftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition2.getX(), blockposition2.getY(), blockposition2.getZ(), iblockdata1.getBlock(), iblockdata1.getBlock().toLegacyData(iblockdata1)); // CraftBukkit + } + } else { + IBlockData iblockdata2 = Blocks.TALLGRASS.getBlockData().set(BlockLongGrass.TYPE, EnumTallGrassType.GRASS); + + if (Blocks.TALLGRASS.f(world, blockposition2, iblockdata2)) { +- world.setTypeAndData(blockposition2, iblockdata2, 3); ++ // world.setTypeAndData(blockposition2, iblockdata2, 3); // CRaftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition2.getX(), blockposition2.getY(), blockposition2.getZ(), iblockdata2.getBlock(), iblockdata2.getBlock().toLegacyData(iblockdata2)); // CraftBukkit + } + } + } diff --git a/nms-patches/BlockIce.patch b/nms-patches/BlockIce.patch new file mode 100644 index 00000000..91033f00 --- /dev/null +++ b/nms-patches/BlockIce.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockIce.java 2014-11-27 08:59:46.533422586 +1100 ++++ src/main/java/net/minecraft/server/BlockIce.java 2014-11-27 08:42:10.168850880 +1100 +@@ -44,6 +44,12 @@ + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (world.b(EnumSkyBlock.BLOCK, blockposition) > 11 - this.n()) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), world.worldProvider.n() ? Blocks.AIR : Blocks.WATER).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ + if (world.worldProvider.n()) { + world.setAir(blockposition); + } else { diff --git a/nms-patches/BlockLeaves.patch b/nms-patches/BlockLeaves.patch new file mode 100644 index 00000000..067c5808 --- /dev/null +++ b/nms-patches/BlockLeaves.patch @@ -0,0 +1,26 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockLeaves.java 2014-11-27 08:59:46.537422569 +1100 ++++ src/main/java/net/minecraft/server/BlockLeaves.java 2014-11-27 08:42:10.132850949 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit ++ + public abstract class BlockLeaves extends BlockTransparent { + + public static final BlockStateBoolean DECAYABLE = BlockStateBoolean.of("decayable"); +@@ -128,6 +130,14 @@ + } + + private void d(World world, BlockPosition blockposition) { ++ // CraftBukkit start ++ LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + this.b(world, blockposition, world.getType(blockposition), 0); + world.setAir(blockposition); + } diff --git a/nms-patches/BlockLever.patch b/nms-patches/BlockLever.patch new file mode 100644 index 00000000..fa9482b1 --- /dev/null +++ b/nms-patches/BlockLever.patch @@ -0,0 +1,32 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockLever.java 2014-11-27 08:59:46.541422551 +1100 ++++ src/main/java/net/minecraft/server/BlockLever.java 2014-11-27 08:42:10.168850880 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Iterator; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockLever extends Block { + + public static final BlockStateEnum FACING = BlockStateEnum.of("facing", EnumLeverPosition.class); +@@ -144,6 +146,20 @@ + if (world.isStatic) { + return true; + } else { ++ // CraftBukkit start - Interact Lever ++ boolean powered = (Boolean)iblockdata.get(POWERED); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int old = (powered) ? 15 : 0; ++ int current = (!powered) ? 15 : 0; ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) { ++ return true; ++ } ++ // CraftBukkit end ++ + iblockdata = iblockdata.a(BlockLever.POWERED); + world.setTypeAndData(blockposition, iblockdata, 3); + world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "random.click", 0.3F, ((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 0.6F : 0.5F); diff --git a/nms-patches/BlockMinecartDetector.patch b/nms-patches/BlockMinecartDetector.patch new file mode 100644 index 00000000..4e33f431 --- /dev/null +++ b/nms-patches/BlockMinecartDetector.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMinecartDetector.java 2014-11-27 08:59:46.541422551 +1100 ++++ src/main/java/net/minecraft/server/BlockMinecartDetector.java 2014-11-27 08:42:10.124850965 +1100 +@@ -4,6 +4,8 @@ + import java.util.List; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockMinecartDetector extends BlockMinecartTrackAbstract { + + public static final BlockStateEnum SHAPE = BlockStateEnum.a("shape", EnumTrackPosition.class, (Predicate) (new BlockMinecartDetectorInnerClass1())); +@@ -55,6 +57,17 @@ + if (!list.isEmpty()) { + flag1 = true; + } ++ ++ // CraftBukkit start ++ if (flag != flag1) { ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, flag ? 15 : 0, flag1 ? 15 : 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ flag1 = eventRedstone.getNewCurrent() > 0; ++ } ++ // CraftBukkit end + + if (flag1 && !flag) { + world.setTypeAndData(blockposition, iblockdata.set(BlockMinecartDetector.POWERED, Boolean.valueOf(true)), 3); diff --git a/nms-patches/BlockMobSpawner.patch b/nms-patches/BlockMobSpawner.patch new file mode 100644 index 00000000..5be7f790 --- /dev/null +++ b/nms-patches/BlockMobSpawner.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMobSpawner.java 2014-11-27 08:59:46.541422551 +1100 ++++ src/main/java/net/minecraft/server/BlockMobSpawner.java 2014-11-27 08:42:10.172850872 +1100 +@@ -22,9 +22,19 @@ + + public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { + super.dropNaturally(world, blockposition, iblockdata, f, i); ++ /* CraftBukkit start - Delegate to getExpDrop + int j = 15 + world.random.nextInt(15) + world.random.nextInt(15); + + this.dropExperience(world, blockposition, j); ++ */ ++ } ++ ++ @Override ++ public int getExpDrop(World world, IBlockData iblockdata, int enchantmentLevel) { ++ int j = 15 + world.random.nextInt(15) + world.random.nextInt(15); ++ ++ return j; ++ // CraftBukkit end + } + + public boolean c() { diff --git a/nms-patches/BlockMonsterEggs.patch b/nms-patches/BlockMonsterEggs.patch new file mode 100644 index 00000000..9260842f --- /dev/null +++ b/nms-patches/BlockMonsterEggs.patch @@ -0,0 +1,20 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMonsterEggs.java 2014-11-27 08:59:46.545422534 +1100 ++++ src/main/java/net/minecraft/server/BlockMonsterEggs.java 2014-11-27 08:42:10.136850942 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; // CraftBukkit ++ + public class BlockMonsterEggs extends Block { + + public static final BlockStateEnum VARIANT = BlockStateEnum.of("variant", EnumMonsterEggVarient.class); +@@ -50,7 +52,7 @@ + EntitySilverfish entitysilverfish = new EntitySilverfish(world); + + entitysilverfish.setPositionRotation((double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, 0.0F, 0.0F); +- world.addEntity(entitysilverfish); ++ world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason + entitysilverfish.y(); + } + diff --git a/nms-patches/BlockMushroom.patch b/nms-patches/BlockMushroom.patch new file mode 100644 index 00000000..5f2477b7 --- /dev/null +++ b/nms-patches/BlockMushroom.patch @@ -0,0 +1,57 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMushroom.java 2014-11-27 08:59:46.545422534 +1100 ++++ src/main/java/net/minecraft/server/BlockMushroom.java 2014-11-27 08:42:10.100851012 +1100 +@@ -3,6 +3,12 @@ + import java.util.Iterator; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.TreeType; ++import org.bukkit.block.BlockState; ++import org.bukkit.event.block.BlockSpreadEvent; ++// CraftBukkit end ++ + public class BlockMushroom extends BlockPlant implements IBlockFragilePlantElement { + + protected BlockMushroom() { +@@ -13,6 +19,7 @@ + } + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { ++ final int sourceX = blockposition.getX(), sourceY = blockposition.getY(), sourceZ = blockposition.getZ(); // CraftBukkit + if (random.nextInt(25) == 0) { + int i = 5; + boolean flag = true; +@@ -39,8 +46,20 @@ + blockposition2 = blockposition.a(random.nextInt(3) - 1, random.nextInt(2) - random.nextInt(2), random.nextInt(3) - 1); + } + +- if (world.isEmpty(blockposition2) && this.f(world, blockposition2, this.getBlockData())) { +- world.setTypeAndData(blockposition2, this.getBlockData(), 2); ++ if (world.isEmpty(blockposition2) && this.f(world, blockposition2, this.getBlockData())) { ++ // CraftBukkit start ++ // world.setTypeAndData(blockposition2, this.getBlockData(), 2); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()).getState(); ++ blockState.setType(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(this)); // nms: this.id, 0, 2 ++ ++ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(sourceX, sourceY, sourceZ), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + +@@ -69,8 +88,10 @@ + WorldGenHugeMushroom worldgenhugemushroom = null; + + if (this == Blocks.BROWN_MUSHROOM) { ++ BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit + worldgenhugemushroom = new WorldGenHugeMushroom(0); + } else if (this == Blocks.RED_MUSHROOM) { ++ BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit + worldgenhugemushroom = new WorldGenHugeMushroom(1); + } + diff --git a/nms-patches/BlockMycel.patch b/nms-patches/BlockMycel.patch new file mode 100644 index 00000000..0a0bd4fb --- /dev/null +++ b/nms-patches/BlockMycel.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockMycel.java 2014-11-27 08:59:46.549422516 +1100 ++++ src/main/java/net/minecraft/server/BlockMycel.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,13 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.BlockFadeEvent; ++import org.bukkit.event.block.BlockSpreadEvent; ++// CraftBukkit end ++ + public class BlockMycel extends Block { + + public static final BlockStateBoolean SNOWY = BlockStateBoolean.of("snowy"); +@@ -22,7 +29,19 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (!world.isStatic) { + if (world.getLightLevel(blockposition.up()) < 4 && world.getType(blockposition.up()).getBlock().n() > 2) { +- world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, EnumDirtVariant.DIRT)); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData().set(BlockDirt.VARIANT, EnumDirtVariant.DIRT)); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); ++ ++ BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } else { + if (world.getLightLevel(blockposition.up()) >= 9) { + for (int i = 0; i < 4; ++i) { +@@ -31,7 +50,19 @@ + Block block = world.getType(blockposition1.up()).getBlock(); + + if (iblockdata1.getBlock() == Blocks.DIRT && iblockdata1.get(BlockDirt.VARIANT) == EnumDirtVariant.DIRT && world.getLightLevel(blockposition1.up()) >= 4 && block.n() <= 2) { +- world.setTypeUpdate(blockposition1, this.getBlockData()); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition1, this.getBlockData()); ++ org.bukkit.World bworld = world.getWorld(); ++ BlockState blockState = bworld.getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(this)); ++ ++ BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), blockState); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/BlockNetherWart.patch b/nms-patches/BlockNetherWart.patch new file mode 100644 index 00000000..c6f458eb --- /dev/null +++ b/nms-patches/BlockNetherWart.patch @@ -0,0 +1,12 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockNetherWart.java 2014-11-27 08:59:46.549422516 +1100 ++++ src/main/java/net/minecraft/server/BlockNetherWart.java 2014-11-27 08:42:10.140850934 +1100 +@@ -28,7 +28,8 @@ + + if (i < 3 && random.nextInt(10) == 0) { + iblockdata = iblockdata.set(BlockNetherWart.AGE, Integer.valueOf(i + 1)); +- world.setTypeAndData(blockposition, iblockdata, 2); ++ // world.setTypeAndData(blockposition, iblockdata, 2); // CraftBukkit ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata)); // CraftBukkit + } + + super.b(world, blockposition, iblockdata, random); diff --git a/nms-patches/BlockOre.patch b/nms-patches/BlockOre.patch new file mode 100644 index 00000000..473fcbaf --- /dev/null +++ b/nms-patches/BlockOre.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockOre.java 2014-11-27 08:59:46.549422516 +1100 ++++ src/main/java/net/minecraft/server/BlockOre.java 2014-11-27 08:42:10.144850927 +1100 +@@ -33,6 +33,7 @@ + + public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { + super.dropNaturally(world, blockposition, iblockdata, f, i); ++ /* CraftBukkit start - Delegated to getExpDrop + if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { + int j = 0; + +@@ -50,7 +51,31 @@ + + this.dropExperience(world, blockposition, j); + } ++ // */ ++ } ++ ++ @Override ++ public int getExpDrop(World world, IBlockData iblockdata, int i) { ++ if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { ++ int j = 0; ++ ++ if (this == Blocks.COAL_ORE) { ++ j = MathHelper.nextInt(world.random, 0, 2); ++ } else if (this == Blocks.DIAMOND_ORE) { ++ j = MathHelper.nextInt(world.random, 3, 7); ++ } else if (this == Blocks.EMERALD_ORE) { ++ j = MathHelper.nextInt(world.random, 3, 7); ++ } else if (this == Blocks.LAPIS_ORE) { ++ j = MathHelper.nextInt(world.random, 2, 5); ++ } else if (this == Blocks.QUARTZ_ORE) { ++ j = MathHelper.nextInt(world.random, 2, 5); ++ } ++ ++ return j; ++ } + ++ return 0; ++ // CraftBukkit end + } + + public int getDropData(World world, BlockPosition blockposition) { diff --git a/nms-patches/BlockPiston.patch b/nms-patches/BlockPiston.patch new file mode 100644 index 00000000..816eebdc --- /dev/null +++ b/nms-patches/BlockPiston.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPiston.java 2014-11-27 08:59:46.553422499 +1100 ++++ src/main/java/net/minecraft/server/BlockPiston.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,6 +1,16 @@ + package net.minecraft.server; + ++import java.util.AbstractList; ++import java.util.Collection; ++import java.util.Iterator; + import java.util.List; ++import java.util.ListIterator; ++ ++// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlock; ++import org.bukkit.event.block.BlockPistonRetractEvent; ++import org.bukkit.event.block.BlockPistonExtendEvent; ++// CraftBukkit end + + public class BlockPiston extends Block { + +@@ -52,10 +62,19 @@ + boolean flag = this.b(world, blockposition, enumdirection); + + if (flag && !((Boolean) iblockdata.get(BlockPiston.EXTENDED)).booleanValue()) { +- if ((new PistonExtendsChecker(world, blockposition, enumdirection, true)).a()) { ++ if ((new PistonExtendsChecker(world, blockposition, enumdirection, true)).a()) { + world.playBlockAction(blockposition, this, 0, enumdirection.a()); + } + } else if (!flag && ((Boolean) iblockdata.get(BlockPiston.EXTENDED)).booleanValue()) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, CraftBlock.notchToBlockFace(enumdirection)); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, iblockdata.set(BlockPiston.EXTENDED, Boolean.valueOf(false)), 2); + world.playBlockAction(blockposition, this, 1, enumdirection.a()); + } +@@ -286,6 +305,35 @@ + if (!pistonextendschecker.a()) { + return false; + } else { ++ final org.bukkit.block.Block bblock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ final List moved = pistonextendschecker.getMovedBlocks(); ++ final List broken = pistonextendschecker.getBrokenBlocks(); ++ ++ List<org.bukkit.block.Block> blocks = new AbstractList<org.bukkit.block.Block>() { ++ ++ @Override ++ public int size() { ++ return moved.size() + broken.size(); ++ } ++ ++ @Override ++ public org.bukkit.block.Block get(int index) { ++ if (index >= size() || index < 0) { ++ throw new ArrayIndexOutOfBoundsException(index); ++ } ++ BlockPosition pos = (BlockPosition) (index < moved.size() ? moved.get(index) : broken.get(index - moved.size())); ++ return bblock.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); ++ } ++ }; ++ ++ BlockPistonExtendEvent event = new BlockPistonExtendEvent(bblock, blocks, CraftBlock.notchToBlockFace(enumdirection)); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end + int i = list.size() + list1.size(); + Block[] ablock = new Block[i]; + EnumDirection enumdirection1 = flag ? enumdirection : enumdirection.opposite(); diff --git a/nms-patches/BlockPortal.patch b/nms-patches/BlockPortal.patch new file mode 100644 index 00000000..d575fc78 --- /dev/null +++ b/nms-patches/BlockPortal.patch @@ -0,0 +1,53 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPortal.java 2014-11-27 08:59:46.553422499 +1100 ++++ src/main/java/net/minecraft/server/BlockPortal.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit ++ + public class BlockPortal extends BlockHalfTransparent { + + public static final BlockStateEnum AXIS = BlockStateEnum.of("axis", EnumAxis.class, new EnumAxis[] { EnumAxis.X, EnumAxis.Z}); +@@ -24,7 +26,8 @@ + } + + if (i > 0 && !world.getType(blockposition1.up()).getBlock().isOccluding()) { +- Entity entity = ItemMonsterEgg.a(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D); ++ // CraftBukkit - set spawn reason to NETHER_PORTAL ++ Entity entity = ItemMonsterEgg.spawnCreature(world, 57, (double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 1.1D, (double) blockposition1.getZ() + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); + + if (entity != null) { + entity.portalCooldown = entity.ar(); +@@ -66,14 +69,16 @@ + PortalCreator portalcreator = new PortalCreator(world, blockposition, EnumAxis.X); + + if (portalcreator.b() && PortalCreator.a(portalcreator) == 0) { +- portalcreator.c(); +- return true; ++ // CraftBukkit start - return portalcreator ++ return portalcreator.c(); ++ // return true; + } else { + PortalCreator portalcreator1 = new PortalCreator(world, blockposition, EnumAxis.Z); + + if (portalcreator1.b() && PortalCreator.a(portalcreator1) == 0) { +- portalcreator1.c(); +- return true; ++ return portalcreator1.c(); ++ // return true; ++ // CraftBukkit end + } else { + return false; + } +@@ -104,6 +109,10 @@ + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) { + if (entity.vehicle == null && entity.passenger == null) { ++ // CraftBukkit start - Entity in portal ++ EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + entity.aq(); + } + diff --git a/nms-patches/BlockPoweredRail.patch b/nms-patches/BlockPoweredRail.patch new file mode 100644 index 00000000..a43bdf22 --- /dev/null +++ b/nms-patches/BlockPoweredRail.patch @@ -0,0 +1,25 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPoweredRail.java 2014-11-27 08:59:46.557422481 +1100 ++++ src/main/java/net/minecraft/server/BlockPoweredRail.java 2014-11-27 08:42:10.124850965 +1100 +@@ -2,6 +2,8 @@ + + import com.google.common.base.Predicate; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockPoweredRail extends BlockMinecartTrackAbstract { + + public static final BlockStateEnum SHAPE = BlockStateEnum.a("shape", EnumTrackPosition.class, (Predicate) (new BlockPoweredRailInnerClass1())); +@@ -108,6 +110,13 @@ + boolean flag1 = world.isBlockIndirectlyPowered(blockposition) || this.a(world, blockposition, iblockdata, true, 0) || this.a(world, blockposition, iblockdata, false, 0); + + if (flag1 != flag) { ++ // CraftBukkit start ++ int power = (Boolean)iblockdata.get(POWERED) ? 15 : 0; ++ int newPower = CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), power, 15 - power).getNewCurrent(); ++ if (newPower == power) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, iblockdata.set(BlockPoweredRail.POWERED, Boolean.valueOf(flag1)), 3); + world.applyPhysics(blockposition.down(), this); + if (((EnumTrackPosition) iblockdata.get(BlockPoweredRail.SHAPE)).c()) { diff --git a/nms-patches/BlockPressurePlateAbstract.patch b/nms-patches/BlockPressurePlateAbstract.patch new file mode 100644 index 00000000..a226e9c4 --- /dev/null +++ b/nms-patches/BlockPressurePlateAbstract.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPressurePlateAbstract.java 2014-11-27 08:59:46.557422481 +1100 ++++ src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java 2014-11-27 08:42:10.144850927 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public abstract class BlockPressurePlateAbstract extends Block { + + protected BlockPressurePlateAbstract(Material material) { +@@ -90,6 +92,19 @@ + int j = this.e(world, blockposition); + boolean flag = i > 0; + boolean flag1 = j > 0; ++ ++ // CraftBukkit start - Interact Pressure Plate ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ ++ if (flag != flag1) { ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), i, j); ++ manager.callEvent(eventRedstone); ++ ++ flag1 = eventRedstone.getNewCurrent() > 0; ++ j = eventRedstone.getNewCurrent(); ++ } ++ // CraftBukkit end + + if (i != j) { + iblockdata = this.a(iblockdata, j); diff --git a/nms-patches/BlockPressurePlateBinary.patch b/nms-patches/BlockPressurePlateBinary.patch new file mode 100644 index 00000000..a1d38a16 --- /dev/null +++ b/nms-patches/BlockPressurePlateBinary.patch @@ -0,0 +1,38 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPressurePlateBinary.java 2014-11-27 08:59:46.557422481 +1100 ++++ src/main/java/net/minecraft/server/BlockPressurePlateBinary.java 2014-11-27 08:42:10.152850911 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit ++ + public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { + + public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); +@@ -44,6 +46,26 @@ + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); ++ ++ // CraftBukkit start - Call interact event when turning on a pressure plate ++ if (this.e(world.getType(blockposition)) == 0) { ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ org.bukkit.event.Cancellable cancellable; ++ ++ if (entity instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ manager.callEvent((EntityInteractEvent) cancellable); ++ } ++ ++ // We only want to block turning the plate on if all events are cancelled ++ if (cancellable.isCancelled()) { ++ continue; ++ } ++ } ++ // CraftBukkit end + + if (!entity.aH()) { + return 15; diff --git a/nms-patches/BlockPressurePlateWeighted.patch b/nms-patches/BlockPressurePlateWeighted.patch new file mode 100644 index 00000000..bd07b6a6 --- /dev/null +++ b/nms-patches/BlockPressurePlateWeighted.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPressurePlateWeighted.java 2014-11-27 08:59:46.561422463 +1100 ++++ src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java 2014-11-27 08:42:10.160850895 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit ++ + public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract { + + public static final BlockStateInteger POWER = BlockStateInteger.of("power", 0, 15); +@@ -12,7 +14,31 @@ + } + + protected int e(World world, BlockPosition blockposition) { +- int i = Math.min(world.a(Entity.class, this.a(blockposition)).size(), this.b); ++ // CraftBukkit start ++ //int i = Math.min(world.a(Entity.class, this.a(blockposition)).size(), this.b); ++ int i = 0; ++ java.util.Iterator iterator = world.a(Entity.class, this.a(blockposition)).iterator(); ++ ++ while (iterator.hasNext()) { ++ Entity entity = (Entity) iterator.next(); ++ ++ org.bukkit.event.Cancellable cancellable; ++ ++ if (entity instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); ++ } ++ ++ // We only want to block turning the plate on if all events are cancelled ++ if (!cancellable.isCancelled()) { ++ i++; ++ } ++ } ++ ++ i = Math.min(i, this.b); ++ // CraftBukkit end + + if (i > 0) { + float f = (float) Math.min(this.b, i) / (float) this.b; diff --git a/nms-patches/BlockPumpkin.patch b/nms-patches/BlockPumpkin.patch new file mode 100644 index 00000000..abf3e858 --- /dev/null +++ b/nms-patches/BlockPumpkin.patch @@ -0,0 +1,117 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockPumpkin.java 2014-11-27 08:59:46.561422463 +1100 ++++ src/main/java/net/minecraft/server/BlockPumpkin.java 2014-11-27 08:42:10.108850996 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.block.BlockRedstoneEvent; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++// CraftBukkit end ++ + public class BlockPumpkin extends BlockDirectional { + + private ShapeDetector snowGolemPart; +@@ -29,31 +35,45 @@ + int j; + + if ((shapedetectorcollection = this.getDetectorSnowGolem().a(world, blockposition)) != null) { ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator + for (i = 0; i < this.getDetectorSnowGolem().b(); ++i) { + ShapeDetectorBlock shapedetectorblock = shapedetectorcollection.a(0, i, 0); + +- world.setTypeAndData(shapedetectorblock.d(), Blocks.AIR.getBlockData(), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorblock.d(), Blocks.AIR.getBlockData(), 2); ++ BlockPosition pos = shapedetectorblock.d(); ++ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0); ++ // CraftBukkit end + } + + EntitySnowman entitysnowman = new EntitySnowman(world); + BlockPosition blockposition1 = shapedetectorcollection.a(0, 2, 0).d(); + + entitysnowman.setPositionRotation((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY() + 0.05D, (double) blockposition1.getZ() + 0.5D, 0.0F, 0.0F); +- world.addEntity(entitysnowman); ++ // CraftBukkit start ++ if (world.addEntity(entitysnowman, SpawnReason.BUILD_SNOWMAN)) { ++ blockList.updateList(); + +- for (j = 0; j < 120; ++j) { +- world.addParticle(EnumParticle.SNOW_SHOVEL, (double) blockposition1.getX() + world.random.nextDouble(), (double) blockposition1.getY() + world.random.nextDouble() * 2.5D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); +- } ++ for (j = 0; j < 120; ++j) { ++ world.addParticle(EnumParticle.SNOW_SHOVEL, (double) blockposition1.getX() + world.random.nextDouble(), (double) blockposition1.getY() + world.random.nextDouble() * 2.5D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); ++ } + +- for (j = 0; j < this.getDetectorSnowGolem().b(); ++j) { +- ShapeDetectorBlock shapedetectorblock1 = shapedetectorcollection.a(0, j, 0); ++ for (j = 0; j < this.getDetectorSnowGolem().b(); ++j) { ++ ShapeDetectorBlock shapedetectorblock1 = shapedetectorcollection.a(0, j, 0); + +- world.update(shapedetectorblock1.d(), Blocks.AIR); ++ world.update(shapedetectorblock1.d(), Blocks.AIR); ++ } + } ++ // CraftBukkit end + } else if ((shapedetectorcollection = this.getDetectorIronGolem().a(world, blockposition)) != null) { ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); // CraftBukkit - Use BlockStateListPopulator + for (i = 0; i < this.getDetectorIronGolem().c(); ++i) { + for (int k = 0; k < this.getDetectorIronGolem().b(); ++k) { +- world.setTypeAndData(shapedetectorcollection.a(i, k, 0).d(), Blocks.AIR.getBlockData(), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorcollection.a(i, k, 0).d(), Blocks.AIR.getBlockData(), 2); ++ BlockPosition pos = shapedetectorcollection.a(i, k, 0).d(); ++ blockList.setTypeId(pos.getX(), pos.getY(), pos.getZ(), 0); ++ // CraftBukkit end + } + } + +@@ -62,22 +82,38 @@ + + entityirongolem.setPlayerCreated(true); + entityirongolem.setPositionRotation((double) blockposition2.getX() + 0.5D, (double) blockposition2.getY() + 0.05D, (double) blockposition2.getZ() + 0.5D, 0.0F, 0.0F); +- world.addEntity(entityirongolem); +- +- for (j = 0; j < 120; ++j) { +- world.addParticle(EnumParticle.SNOWBALL, (double) blockposition2.getX() + world.random.nextDouble(), (double) blockposition2.getY() + world.random.nextDouble() * 3.9D, (double) blockposition2.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); +- } ++ // CraftBukkit start ++ if (world.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) { ++ blockList.updateList(); ++ ++ for (j = 0; j < 120; ++j) { ++ world.addParticle(EnumParticle.SNOWBALL, (double) blockposition2.getX() + world.random.nextDouble(), (double) blockposition2.getY() + world.random.nextDouble() * 3.9D, (double) blockposition2.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); ++ } + +- for (j = 0; j < this.getDetectorIronGolem().c(); ++j) { +- for (int l = 0; l < this.getDetectorIronGolem().b(); ++l) { +- ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(j, l, 0); ++ for (j = 0; j < this.getDetectorIronGolem().c(); ++j) { ++ for (int l = 0; l < this.getDetectorIronGolem().b(); ++l) { ++ ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(j, l, 0); + +- world.update(shapedetectorblock2.d(), Blocks.AIR); ++ world.update(shapedetectorblock2.d(), Blocks.AIR); ++ } + } + } ++ // CraftBukkit end + } ++ } + ++ // CraftBukkit start ++ @Override ++ public void doPhysics(World world, BlockPosition position, IBlockData data, Block block) { ++ if (block != null && block.isPowerSource()) { ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); ++ int power = bukkitBlock.getBlockPower(); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ } + } ++ // CraftBukkit end + + public boolean canPlace(World world, BlockPosition blockposition) { + return world.getType(blockposition).getBlock().material.isReplaceable() && World.a((IBlockAccess) world, blockposition.down()); diff --git a/nms-patches/BlockRedstoneLamp.patch b/nms-patches/BlockRedstoneLamp.patch new file mode 100644 index 00000000..66c81280 --- /dev/null +++ b/nms-patches/BlockRedstoneLamp.patch @@ -0,0 +1,47 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneLamp.java 2014-11-27 08:59:46.565422446 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneLamp.java 2014-11-27 08:42:10.140850934 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockRedstoneLamp extends Block { + + private final boolean a; +@@ -20,6 +22,11 @@ + if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { + world.setTypeAndData(blockposition, Blocks.REDSTONE_LAMP.getBlockData(), 2); + } else if (!this.a && world.isBlockIndirectlyPowered(blockposition)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.LIT_REDSTONE_LAMP.getBlockData(), 2); + } + +@@ -31,6 +38,11 @@ + if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { + world.a(blockposition, (Block) this, 4); + } else if (!this.a && world.isBlockIndirectlyPowered(blockposition)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 0, 15).getNewCurrent() != 15) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.LIT_REDSTONE_LAMP.getBlockData(), 2); + } + +@@ -40,6 +52,11 @@ + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (!world.isStatic) { + if (this.a && !world.isBlockIndirectlyPowered(blockposition)) { ++ // CraftBukkit start ++ if (CraftEventFactory.callRedstoneChange(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), 15, 0).getNewCurrent() != 0) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.REDSTONE_LAMP.getBlockData(), 2); + } + diff --git a/nms-patches/BlockRedstoneOre.patch b/nms-patches/BlockRedstoneOre.patch new file mode 100644 index 00000000..fcc0a637 --- /dev/null +++ b/nms-patches/BlockRedstoneOre.patch @@ -0,0 +1,102 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneOre.java 2014-11-27 08:59:46.565422446 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneOre.java 2014-11-27 08:42:10.112850989 +1100 +@@ -2,6 +2,11 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityInteractEvent; ++// CraftBukkit end ++ + public class BlockRedstoneOre extends Block { + + private final boolean a; +@@ -20,23 +25,44 @@ + } + + public void attack(World world, BlockPosition blockposition, EntityHuman entityhuman) { +- this.d(world, blockposition); ++ this.d(world, blockposition, entityhuman); // CraftBukkit - add entityhuman + super.attack(world, blockposition, entityhuman); + } + +- public void a(World world, BlockPosition blockposition, Entity entity) { +- this.d(world, blockposition); +- super.a(world, blockposition, entity); ++ public void a(World world, BlockPosition blockposition, Entity entity) { ++ // CraftBukkit start ++ // this.d(world, blockposition); ++ // super.a(world, blockposition, entity); ++ if (entity instanceof EntityHuman) { ++ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ if (!event.isCancelled()) { ++ this.d(world, blockposition, entity); // add entity ++ super.a(world, blockposition, entity); ++ } ++ } else { ++ EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { ++ this.d(world, blockposition, entity); // add entity ++ super.a(world, blockposition, entity); ++ } ++ } ++ // CraftBukkit end + } + + public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumDirection enumdirection, float f, float f1, float f2) { +- this.d(world, blockposition); ++ this.d(world, blockposition, entityhuman); // CraftBukkit - add entityhuman + return super.interact(world, blockposition, iblockdata, entityhuman, enumdirection, f, f1, f2); + } + +- private void d(World world, BlockPosition blockposition) { ++ private void d(World world, BlockPosition blockposition, Entity entity) { // CraftBukkit - add Entity + this.e(world, blockposition); + if (this == Blocks.REDSTONE_ORE) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.LIT_REDSTONE_ORE, 0).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, Blocks.LIT_REDSTONE_ORE.getBlockData()); + } + +@@ -44,6 +70,11 @@ + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (this == Blocks.LIT_REDSTONE_ORE) { ++ // CraftBukkit start ++ if (CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.REDSTONE_ORE).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, Blocks.REDSTONE_ORE.getBlockData()); + } + +@@ -63,12 +94,24 @@ + + public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { + super.dropNaturally(world, blockposition, iblockdata, f, i); ++ /* CraftBukkit start - Delegated to getExpDrop + if (this.getDropType(iblockdata, world.random, i) != Item.getItemOf(this)) { + int j = 1 + world.random.nextInt(5); + + this.dropExperience(world, blockposition, j); + } ++ // */ ++ } + ++ @Override ++ public int getExpDrop(World world, IBlockData data, int i) { ++ if (this.getDropType(data, world.random, i) != Item.getItemOf(this)) { ++ int j = 1 + world.random.nextInt(5); ++ ++ return j; ++ } ++ return 0; ++ // CraftBukkit end + } + + private void e(World world, BlockPosition blockposition) { diff --git a/nms-patches/BlockRedstoneTorch.patch b/nms-patches/BlockRedstoneTorch.patch new file mode 100644 index 00000000..60516593 --- /dev/null +++ b/nms-patches/BlockRedstoneTorch.patch @@ -0,0 +1,55 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneTorch.java 2014-11-27 08:59:46.565422446 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneTorch.java 2014-11-27 08:42:10.156850903 +1100 +@@ -6,6 +6,8 @@ + import java.util.Map; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockRedstoneTorch extends BlockTorch { + + private static Map b = Maps.newHashMap(); +@@ -95,9 +97,26 @@ + while (list != null && !list.isEmpty() && world.getTime() - ((RedstoneUpdateInfo) list.get(0)).b > 60L) { + list.remove(0); + } ++ ++ // CraftBukkit start ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ int oldCurrent = this.isOn ? 15 : 0; ++ ++ BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent); ++ // CraftBukkit end + + if (this.isOn) { + if (flag) { ++ // CraftBukkit start ++ if (oldCurrent != 0) { ++ event.setNewCurrent(0); ++ manager.callEvent(event); ++ if (event.getNewCurrent() != 0) { ++ return; ++ } ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.UNLIT_REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); + if (this.a(world, blockposition, true)) { + world.makeSound((double) ((float) blockposition.getX() + 0.5F), (double) ((float) blockposition.getY() + 0.5F), (double) ((float) blockposition.getZ() + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); +@@ -114,6 +133,16 @@ + } + } + } else if (!flag && !this.a(world, blockposition, false)) { ++ // CraftBukkit start ++ if (oldCurrent != 15) { ++ event.setNewCurrent(15); ++ manager.callEvent(event); ++ if (event.getNewCurrent() != 15) { ++ return; ++ } ++ } ++ // CraftBukkit end ++ + world.setTypeAndData(blockposition, Blocks.REDSTONE_TORCH.getBlockData().set(BlockRedstoneTorch.FACING, iblockdata.get(BlockRedstoneTorch.FACING)), 3); + } + diff --git a/nms-patches/BlockRedstoneWire.patch b/nms-patches/BlockRedstoneWire.patch new file mode 100644 index 00000000..79e7b08f --- /dev/null +++ b/nms-patches/BlockRedstoneWire.patch @@ -0,0 +1,27 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockRedstoneWire.java 2014-11-27 08:59:46.569422428 +1100 ++++ src/main/java/net/minecraft/server/BlockRedstoneWire.java 2014-11-27 08:42:10.136850942 +1100 +@@ -8,6 +8,8 @@ + import java.util.Random; + import java.util.Set; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockRedstoneWire extends Block { + + public static final BlockStateEnum NORTH = BlockStateEnum.of("north", EnumRedstoneWireConnection.class); +@@ -123,6 +125,15 @@ + if (k > j - 1) { + j = k; + } ++ ++ // CraftBukkit start ++ if (i != j) { ++ BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), i, j); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ j = event.getNewCurrent(); ++ } ++ // CraftBukkit end + + if (i != j) { + iblockdata = iblockdata.set(BlockRedstoneWire.POWER, Integer.valueOf(j)); diff --git a/nms-patches/BlockReed.patch b/nms-patches/BlockReed.patch new file mode 100644 index 00000000..667af180 --- /dev/null +++ b/nms-patches/BlockReed.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockReed.java 2014-11-27 08:59:46.569422428 +1100 ++++ src/main/java/net/minecraft/server/BlockReed.java 2014-11-27 08:42:10.120850973 +1100 +@@ -29,8 +29,13 @@ + int j = ((Integer) iblockdata.get(BlockReed.AGE)).intValue(); + + if (j == 15) { +- world.setTypeUpdate(blockposition.up(), this.getBlockData()); +- world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(0)), 4); ++ // CraftBukkit start ++ // world.setTypeUpdate(blockposition.up(), this.getBlockData()); ++ // world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(0)), 4); ++ BlockPosition upPos = blockposition.up(); ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, upPos.getX(), upPos.getY(), upPos.getZ(), this, 0); ++ // CraftBukkit end ++ + } else { + world.setTypeAndData(blockposition, iblockdata.set(BlockReed.AGE, Integer.valueOf(j + 1)), 4); + } diff --git a/nms-patches/BlockSapling.patch b/nms-patches/BlockSapling.patch new file mode 100644 index 00000000..5212c9d9 --- /dev/null +++ b/nms-patches/BlockSapling.patch @@ -0,0 +1,125 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSapling.java 2014-11-27 08:59:46.573422410 +1100 ++++ src/main/java/net/minecraft/server/BlockSapling.java 2014-11-27 08:42:10.108850996 +1100 +@@ -2,10 +2,20 @@ + + import java.util.Random; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.Location; ++import org.bukkit.TreeType; ++import org.bukkit.block.BlockState; ++import org.bukkit.event.world.StructureGrowEvent; ++// CraftBukkit end ++ + public class BlockSapling extends BlockPlant implements IBlockFragilePlantElement { + + public static final BlockStateEnum TYPE = BlockStateEnum.of("type", EnumLogVariant.class); + public static final BlockStateInteger STAGE = BlockStateInteger.of("stage", 0, 1); ++ public static TreeType treeType; // CraftBukkit + + protected BlockSapling() { + this.j(this.blockStateList.getBlockData().set(BlockSapling.TYPE, EnumLogVariant.OAK).set(BlockSapling.STAGE, Integer.valueOf(0))); +@@ -19,7 +29,30 @@ + if (!world.isStatic) { + super.b(world, blockposition, iblockdata, random); + if (world.getLightLevel(blockposition.up()) >= 9 && random.nextInt(7) == 0) { ++ // CraftBukkit start ++ world.captureTreeGeneration = true; ++ // CraftBukkit end + this.grow(world, blockposition, iblockdata, random); ++ // CraftBukkit start ++ world.captureTreeGeneration = false; ++ if (world.capturedBlockStates.size() > 0) { ++ TreeType treeType = BlockSapling.treeType; ++ BlockSapling.treeType = null; ++ Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone(); ++ world.capturedBlockStates.clear(); ++ StructureGrowEvent event = null; ++ if (treeType != null) { ++ event = new StructureGrowEvent(location, treeType, false, null, blocks); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ } ++ if (event == null || !event.isCancelled()) { ++ for (BlockState blockstate : blocks) { ++ blockstate.update(true); ++ } ++ } ++ } ++ // CraftBukkit end + } + + } +@@ -35,7 +68,17 @@ + } + + public void e(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { +- Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); ++ // CraftBukkit start - Turn ternary operator into if statement to set treeType ++ // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); ++ Object object; ++ if (random.nextInt(10) == 0) { ++ treeType = TreeType.BIG_TREE; ++ object = new WorldGenBigTree(true); ++ } else { ++ treeType = TreeType.TREE; ++ object = new WorldGenTrees(true); ++ } ++ // CraftBukkit end + int i = 0; + int j = 0; + boolean flag = false; +@@ -46,6 +89,7 @@ + for (i = 0; i >= -1; --i) { + for (j = 0; j >= -1; --j) { + if (this.a(world, blockposition.a(i, 0, j), EnumLogVariant.SPRUCE) && this.a(world, blockposition.a(i + 1, 0, j), EnumLogVariant.SPRUCE) && this.a(world, blockposition.a(i, 0, j + 1), EnumLogVariant.SPRUCE) && this.a(world, blockposition.a(i + 1, 0, j + 1), EnumLogVariant.SPRUCE)) { ++ treeType = TreeType.MEGA_REDWOOD; // CraftBukkit + object = new WorldGenMegaTree(false, random.nextBoolean()); + flag = true; + break label78; +@@ -56,11 +100,13 @@ + if (!flag) { + j = 0; + i = 0; ++ treeType = TreeType.REDWOOD; // CraftBukkit + object = new WorldGenTaiga2(true); + } + break; + + case 2: ++ treeType = TreeType.BIRCH; // CraftBukkit + object = new WorldGenForest(true, false); + break; + +@@ -69,6 +115,7 @@ + for (i = 0; i >= -1; --i) { + for (j = 0; j >= -1; --j) { + if (this.a(world, blockposition.a(i, 0, j), EnumLogVariant.JUNGLE) && this.a(world, blockposition.a(i + 1, 0, j), EnumLogVariant.JUNGLE) && this.a(world, blockposition.a(i, 0, j + 1), EnumLogVariant.JUNGLE) && this.a(world, blockposition.a(i + 1, 0, j + 1), EnumLogVariant.JUNGLE)) { ++ treeType = TreeType.JUNGLE; // CraftBukkit + object = new WorldGenJungleTree(true, 10, 20, EnumLogVariant.JUNGLE.a(), EnumLogVariant.JUNGLE.a()); + flag = true; + break label93; +@@ -79,11 +126,13 @@ + if (!flag) { + j = 0; + i = 0; ++ treeType = TreeType.SMALL_JUNGLE; // CraftBukkit + object = new WorldGenTrees(true, 4 + random.nextInt(7), EnumLogVariant.JUNGLE.a(), EnumLogVariant.JUNGLE.a(), false); + } + break; + + case 4: ++ treeType = TreeType.ACACIA; // CraftBukki + object = new WorldGenAcaciaTree(true); + break; + +@@ -92,6 +141,7 @@ + for (i = 0; i >= -1; --i) { + for (j = 0; j >= -1; --j) { + if (this.a(world, blockposition.a(i, 0, j), EnumLogVariant.DARK_OAK) && this.a(world, blockposition.a(i + 1, 0, j), EnumLogVariant.DARK_OAK) && this.a(world, blockposition.a(i, 0, j + 1), EnumLogVariant.DARK_OAK) && this.a(world, blockposition.a(i + 1, 0, j + 1), EnumLogVariant.DARK_OAK)) { ++ treeType = TreeType.DARK_OAK; // CraftBukkit + object = new WorldGenForestTree(true); + flag = true; + break label108; diff --git a/nms-patches/BlockSkull.patch b/nms-patches/BlockSkull.patch new file mode 100644 index 00000000..0bebb84d --- /dev/null +++ b/nms-patches/BlockSkull.patch @@ -0,0 +1,133 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSkull.java 2014-11-27 08:59:46.573422410 +1100 ++++ src/main/java/net/minecraft/server/BlockSkull.java 2014-11-27 08:42:10.156850903 +1100 +@@ -4,6 +4,11 @@ + import java.util.Iterator; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++// CraftBukkit end ++ + public class BlockSkull extends BlockContainer { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing"); +@@ -69,8 +74,25 @@ + + return tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() : super.getDropData(world, blockposition); + } ++ ++ // CraftBukkit start - Special case dropping so we can get info from the tile entity ++ public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) { ++ if (world.random.nextFloat() < f) { ++ ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, blockposition)); ++ TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(blockposition); ++ ++ if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { ++ itemstack.setTag(new NBTTagCompound()); ++ NBTTagCompound nbttagcompound = new NBTTagCompound(); ++ ++ GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); ++ itemstack.getTag().set("SkullOwner", nbttagcompound); ++ } + +- public void dropNaturally(World world, BlockPosition blockposition, IBlockData iblockdata, float f, int i) {} ++ a(world, blockposition, itemstack); ++ } ++ } ++ // CraftBukkit end + + public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { + if (entityhuman.abilities.canInstantlyBuild) { +@@ -83,7 +105,10 @@ + + public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) { + if (!world.isStatic) { +- if (!((Boolean) iblockdata.get(BlockSkull.NODROP)).booleanValue()) { ++ // CraftBukkit start - Drop item in code above, not here ++ // if (!((Boolean) iblockdata.get(BlockSkull.NODROP)).booleanValue()) { ++ if (false) { ++ // CraftBukkit end + TileEntity tileentity = world.getTileEntity(blockposition); + + if (tileentity instanceof TileEntitySkull) { +@@ -120,19 +145,30 @@ + ShapeDetectorCollection shapedetectorcollection = shapedetector.a(world, blockposition); + + if (shapedetectorcollection != null) { ++ // CraftBukkit start - Use BlockStateListPopulator ++ BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); + int i; + + for (i = 0; i < 3; ++i) { + ShapeDetectorBlock shapedetectorblock = shapedetectorcollection.a(i, 0, 0); + +- world.setTypeAndData(shapedetectorblock.d(), shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorblock.d(), shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)), 2); ++ BlockPosition pos = shapedetectorblock.d(); ++ IBlockData data = shapedetectorblock.a().set(BlockSkull.NODROP, Boolean.valueOf(true)); ++ blockList.setTypeAndData(pos.getX(), pos.getY(), pos.getZ(), data.getBlock(), data.getBlock().toLegacyData(data), 2); ++ // CraftBukkit end + } + + for (i = 0; i < shapedetector.c(); ++i) { + for (int j = 0; j < shapedetector.b(); ++j) { + ShapeDetectorBlock shapedetectorblock1 = shapedetectorcollection.a(i, j, 0); + +- world.setTypeAndData(shapedetectorblock1.d(), Blocks.AIR.getBlockData(), 2); ++ // CraftBukkit start ++ // world.setTypeAndData(shapedetectorblock1.d(), Blocks.AIR.getBlockData(), 2); ++ BlockPosition pos = shapedetectorblock1.d(); ++ blockList.setTypeAndData(pos.getX(), pos.getY(), pos.getZ(), Blocks.AIR, 0, 2); ++ // CraftBukkit end + } + } + +@@ -145,28 +181,31 @@ + entitywither.n(); + Iterator iterator = world.a(EntityHuman.class, entitywither.getBoundingBox().grow(50.0D, 50.0D, 50.0D)).iterator(); + +- while (iterator.hasNext()) { +- EntityHuman entityhuman = (EntityHuman) iterator.next(); ++ // CraftBukkit start ++ if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { ++ while (iterator.hasNext()) { ++ EntityHuman entityhuman = (EntityHuman) iterator.next(); + +- entityhuman.b((Statistic) AchievementList.I); +- } +- +- world.addEntity(entitywither); ++ entityhuman.b((Statistic) AchievementList.I); ++ } ++ ++ blockList.updateList(); + +- int k; ++ int k; + +- for (k = 0; k < 120; ++k) { +- world.addParticle(EnumParticle.SNOWBALL, (double) blockposition1.getX() + world.random.nextDouble(), (double) (blockposition1.getY() - 2) + world.random.nextDouble() * 3.9D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); +- } ++ for (k = 0; k < 120; ++k) { ++ world.addParticle(EnumParticle.SNOWBALL, (double) blockposition1.getX() + world.random.nextDouble(), (double) (blockposition1.getY() - 2) + world.random.nextDouble() * 3.9D, (double) blockposition1.getZ() + world.random.nextDouble(), 0.0D, 0.0D, 0.0D, new int[0]); ++ } + +- for (k = 0; k < shapedetector.c(); ++k) { +- for (int l = 0; l < shapedetector.b(); ++l) { +- ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(k, l, 0); ++ for (k = 0; k < shapedetector.c(); ++k) { ++ for (int l = 0; l < shapedetector.b(); ++l) { ++ ShapeDetectorBlock shapedetectorblock2 = shapedetectorcollection.a(k, l, 0); + +- world.update(shapedetectorblock2.d(), Blocks.AIR); ++ world.update(shapedetectorblock2.d(), Blocks.AIR); ++ } + } + } +- ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/BlockSnow.patch b/nms-patches/BlockSnow.patch new file mode 100644 index 00000000..5727d5a5 --- /dev/null +++ b/nms-patches/BlockSnow.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSnow.java 2014-11-27 08:59:46.577422392 +1100 ++++ src/main/java/net/minecraft/server/BlockSnow.java 2014-11-27 08:42:10.144850927 +1100 +@@ -85,6 +85,11 @@ + + public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) { + if (world.b(EnumSkyBlock.BLOCK, blockposition) > 11) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Blocks.AIR).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + this.b(world, blockposition, world.getType(blockposition), 0); + world.setAir(blockposition); + } diff --git a/nms-patches/BlockSoil.patch b/nms-patches/BlockSoil.patch new file mode 100644 index 00000000..cd0c3d50 --- /dev/null +++ b/nms-patches/BlockSoil.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockSoil.java 2014-11-27 08:59:46.577422392 +1100 ++++ src/main/java/net/minecraft/server/BlockSoil.java 2014-11-27 08:42:10.168850880 +1100 +@@ -3,6 +3,11 @@ + import java.util.Iterator; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.event.entity.EntityInteractEvent; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++// CraftBukkit end ++ + public class BlockSoil extends Block { + + public static final BlockStateInteger MOISTURE = BlockStateInteger.of("moisture", 0, 7); +@@ -34,6 +39,12 @@ + if (i > 0) { + world.setTypeAndData(blockposition, iblockdata.set(BlockSoil.MOISTURE, Integer.valueOf(i - 1)), 2); + } else if (!this.d(world, blockposition)) { ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ if (CraftEventFactory.callBlockFadeEvent(block, Blocks.DIRT).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); + } + } else if (i < 7) { +@@ -49,6 +60,24 @@ + return; + } + ++ // CraftBukkit start - Interact soil ++ org.bukkit.event.Cancellable cancellable; ++ if (entity instanceof EntityHuman) { ++ cancellable = CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else { ++ cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); ++ } ++ ++ if (cancellable.isCancelled()) { ++ return; ++ } ++ ++ if (CraftEventFactory.callEntityChangeBlockEvent(entity, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.DIRT, 0).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ + world.setTypeUpdate(blockposition, Blocks.DIRT.getBlockData()); + } + diff --git a/nms-patches/BlockStationary.patch b/nms-patches/BlockStationary.patch new file mode 100644 index 00000000..5ffd0a2e --- /dev/null +++ b/nms-patches/BlockStationary.patch @@ -0,0 +1,40 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockStationary.java 2014-11-27 08:59:46.577422392 +1100 ++++ src/main/java/net/minecraft/server/BlockStationary.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockStationary extends BlockFluids { + + protected BlockStationary(Material material) { +@@ -41,6 +43,13 @@ + + if (block.material == Material.AIR) { + if (this.e(world, blockposition1)) { ++ // CraftBukkit start - Prevent lava putting something on fire ++ if (world.getType(blockposition1) != Blocks.FIRE) { ++ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { ++ continue; ++ } ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); + return; + } +@@ -53,6 +62,14 @@ + BlockPosition blockposition2 = blockposition.a(random.nextInt(3) - 1, 0, random.nextInt(3) - 1); + + if (world.isEmpty(blockposition2.up()) && this.m(world, blockposition2)) { ++ // CraftBukkit start - Prevent lava putting something on fire ++ BlockPosition up = blockposition2.up(); ++ if (world.getType(up) != Blocks.FIRE) { ++ if (CraftEventFactory.callBlockIgniteEvent(world, up.getX(), up.getY(), up.getZ(), blockposition.getX(), blockposition.getY(), blockposition.getZ()).isCancelled()) { ++ continue; ++ } ++ } ++ // CraftBukkit end + world.setTypeUpdate(blockposition2.up(), Blocks.FIRE.getBlockData()); + } + } diff --git a/nms-patches/BlockStem.patch b/nms-patches/BlockStem.patch new file mode 100644 index 00000000..b20e09ca --- /dev/null +++ b/nms-patches/BlockStem.patch @@ -0,0 +1,41 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockStem.java 2014-11-27 08:59:46.581422375 +1100 ++++ src/main/java/net/minecraft/server/BlockStem.java 2014-11-27 08:42:10.152850911 +1100 +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockStem extends BlockPlant implements IBlockFragilePlantElement { + + public static final BlockStateInteger AGE = BlockStateInteger.of("age", 0, 7); +@@ -50,7 +52,8 @@ + + if (i < 7) { + iblockdata = iblockdata.set(BlockStem.AGE, Integer.valueOf(i + 1)); +- world.setTypeAndData(blockposition, iblockdata, 2); ++ // world.setTypeAndData(blockposition, iblockdata, 2); // CraftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, toLegacyData(iblockdata)); // CraftBukkit + } else { + Iterator iterator = EnumDirectionLimit.HORIZONTAL.iterator(); + +@@ -66,7 +69,8 @@ + Block block = world.getType(blockposition.down()).getBlock(); + + if (world.getType(blockposition).getBlock().material == Material.AIR && (block == Blocks.FARMLAND || block == Blocks.DIRT || block == Blocks.GRASS)) { +- world.setTypeUpdate(blockposition, this.blockFruit.getBlockData()); ++ // world.setTypeUpdate(blockposition, this.blockFruit.getBlockData()); // CraftBukkit ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.blockFruit, 0); // CraftBukkit + } + } + } +@@ -77,7 +81,8 @@ + public void g(World world, BlockPosition blockposition, IBlockData iblockdata) { + int i = ((Integer) iblockdata.get(BlockStem.AGE)).intValue() + MathHelper.nextInt(world.random, 2, 5); + +- world.setTypeAndData(blockposition, iblockdata.set(BlockStem.AGE, Integer.valueOf(Math.min(7, i))), 2); ++ // world.setTypeAndData(blockposition, iblockdata.set(BlockStem.AGE, Integer.valueOf(Math.min(7, i))), 2); ++ CraftEventFactory.handleBlockGrowEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this, Math.min(7, i)); // CraftBukkit + } + + public void h() { diff --git a/nms-patches/BlockTrapdoor.patch b/nms-patches/BlockTrapdoor.patch new file mode 100644 index 00000000..8b2992a9 --- /dev/null +++ b/nms-patches/BlockTrapdoor.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockTrapdoor.java 2014-11-27 08:59:46.581422375 +1100 ++++ src/main/java/net/minecraft/server/BlockTrapdoor.java 2014-11-27 08:42:10.124850965 +1100 +@@ -2,6 +2,8 @@ + + import com.google.common.base.Predicate; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockTrapdoor extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirectionLimit.HORIZONTAL); +@@ -101,6 +103,19 @@ + boolean flag = world.isBlockIndirectlyPowered(blockposition); + + if (flag || block.isPowerSource()) { ++ // CraftBukkit start ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.block.Block bblock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ int power = bblock.getBlockPower(); ++ int oldPower = (Boolean) iblockdata.get(OPEN) ? 15 : 0; ++ ++ if (oldPower == 0 ^ power == 0 || block.isPowerSource()) { ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ flag = eventRedstone.getNewCurrent() > 0; ++ } ++ // CraftBukkit end + boolean flag1 = ((Boolean) iblockdata.get(BlockTrapdoor.OPEN)).booleanValue(); + + if (flag1 != flag) { diff --git a/nms-patches/BlockTripwire.patch b/nms-patches/BlockTripwire.patch new file mode 100644 index 00000000..f3954aa5 --- /dev/null +++ b/nms-patches/BlockTripwire.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockTripwire.java 2014-11-27 08:59:46.585422357 +1100 ++++ src/main/java/net/minecraft/server/BlockTripwire.java 2014-11-27 08:42:10.140850934 +1100 +@@ -4,6 +4,8 @@ + import java.util.List; + import java.util.Random; + ++import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit ++ + public class BlockTripwire extends Block { + + public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); +@@ -154,6 +156,40 @@ + } + } + } ++ ++ // CraftBukkit start - Call interact even when triggering connected tripwire ++ if (flag != flag1 && flag1 && (Boolean)iblockdata.get(ATTACHED)) { ++ org.bukkit.World bworld = world.getWorld(); ++ org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); ++ org.bukkit.block.Block block = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ boolean allowed = false; ++ ++ // If all of the events are cancelled block the tripwire trigger, else allow ++ for (Object object : list) { ++ if (object != null) { ++ org.bukkit.event.Cancellable cancellable; ++ ++ if (object instanceof EntityHuman) { ++ cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null); ++ } else if (object instanceof Entity) { ++ cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); ++ manager.callEvent((EntityInteractEvent) cancellable); ++ } else { ++ continue; ++ } ++ ++ if (!cancellable.isCancelled()) { ++ allowed = true; ++ break; ++ } ++ } ++ } ++ ++ if (!allowed) { ++ return; ++ } ++ } ++ // CraftBukkit end + + if (flag1 != flag) { + iblockdata = iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(flag1)); diff --git a/nms-patches/BlockTripwireHook.patch b/nms-patches/BlockTripwireHook.patch new file mode 100644 index 00000000..d4da9326 --- /dev/null +++ b/nms-patches/BlockTripwireHook.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockTripwireHook.java 2014-11-27 08:59:46.585422357 +1100 ++++ src/main/java/net/minecraft/server/BlockTripwireHook.java 2014-11-27 08:42:10.144850927 +1100 +@@ -5,6 +5,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit ++ + public class BlockTripwireHook extends Block { + + public static final BlockStateDirection FACING = BlockStateDirection.of("facing", (Predicate) EnumDirectionLimit.HORIZONTAL); +@@ -141,6 +143,17 @@ + this.a(world, blockposition1, flag5, flag6, flag2, flag3); + } + ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); ++ world.getServer().getPluginManager().callEvent(eventRedstone); ++ ++ if (eventRedstone.getNewCurrent() > 0) { ++ return; ++ } ++ // CraftBukkit end ++ + this.a(world, blockposition, flag5, flag6, flag2, flag3); + if (!flag) { + world.setTypeAndData(blockposition, iblockdata3.set(BlockTripwireHook.FACING, enumdirection), 3); diff --git a/nms-patches/BlockVine.patch b/nms-patches/BlockVine.patch new file mode 100644 index 00000000..5e920272 --- /dev/null +++ b/nms-patches/BlockVine.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/BlockVine.java 2014-11-27 08:59:46.589422340 +1100 ++++ src/main/java/net/minecraft/server/BlockVine.java 2014-11-27 08:42:10.156850903 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.Random; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class BlockVine extends Block { + + public static final BlockStateBoolean UP = BlockStateBoolean.of("up"); +@@ -203,7 +205,13 @@ + } + + if (((Boolean) iblockdata1.get(BlockVine.NORTH)).booleanValue() || ((Boolean) iblockdata1.get(BlockVine.EAST)).booleanValue() || ((Boolean) iblockdata1.get(BlockVine.SOUTH)).booleanValue() || ((Boolean) iblockdata1.get(BlockVine.WEST)).booleanValue()) { +- world.setTypeAndData(blockposition.up(), iblockdata1, 2); ++ // CraftBukkit start - Call BlockSpreadEvent ++ // world.setTypeAndData(blockposition.up(), iblockdata1, 2); ++ BlockPosition target = blockposition.up(); ++ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(block, source, this, toLegacyData(iblockdata1)); ++ // CraftBukkit end + } + + } +@@ -222,18 +230,30 @@ + boolean flag2 = ((Boolean) iblockdata.get(a(enumdirection2))).booleanValue(); + BlockPosition blockposition2 = blockposition1.shift(enumdirection1); + BlockPosition blockposition3 = blockposition1.shift(enumdirection2); ++ ++ // CraftBukkit start - Call BlockSpreadEvent ++ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); + + if (flag1 && this.c(world.getType(blockposition2).getBlock())) { +- world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)), 2); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection1), Boolean.valueOf(true)))); + } else if (flag2 && this.c(world.getType(blockposition3).getBlock())) { +- world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition1, this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)), 2); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection2), Boolean.valueOf(true)))); + } else if (flag1 && world.isEmpty(blockposition2) && this.c(world.getType(blockposition.shift(enumdirection1)).getBlock())) { +- world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition2, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ bukkitBlock = world.getWorld().getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)))); + } else if (flag2 && world.isEmpty(blockposition3) && this.c(world.getType(blockposition.shift(enumdirection2)).getBlock())) { +- world.setTypeAndData(blockposition3, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ // world.setTypeAndData(blockposition3, this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)), 2); ++ bukkitBlock = world.getWorld().getBlockAt(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData().set(a(enumdirection.opposite()), Boolean.valueOf(true)))); + } else if (this.c(world.getType(blockposition1.up()).getBlock())) { +- world.setTypeAndData(blockposition1, this.getBlockData(), 2); ++ // world.setTypeAndData(blockposition1, this.getBlockData(), 2); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, block, toLegacyData(this.getBlockData())); + } ++ // CraftBukkit end + } else if (block.material.k() && block.d()) { + world.setTypeAndData(blockposition, iblockdata.set(a(enumdirection), Boolean.valueOf(true)), 2); + } +@@ -260,7 +280,12 @@ + } + + if (((Boolean) iblockdata3.get(BlockVine.NORTH)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.EAST)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.SOUTH)).booleanValue() || ((Boolean) iblockdata3.get(BlockVine.WEST)).booleanValue()) { +- world.setTypeAndData(blockposition1, iblockdata3, 2); ++ // CraftBukkit start - Call BlockSpreadEvent ++ // world.setTypeAndData(blockposition1, iblockdata3, 2); ++ org.bukkit.block.Block source = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); ++ CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, toLegacyData(iblockdata3)); ++ // CraftBukkit end + } + } else if (block1 == this) { + iblockdata3 = iblockdata2; diff --git a/nms-patches/Chunk.patch b/nms-patches/Chunk.patch new file mode 100644 index 00000000..d2f4392f --- /dev/null +++ b/nms-patches/Chunk.patch @@ -0,0 +1,169 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Chunk.java 2014-11-27 08:59:46.589422340 +1100 ++++ src/main/java/net/minecraft/server/Chunk.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,6 +1,7 @@ + package net.minecraft.server; + + import com.google.common.base.Predicate; ++import com.google.common.collect.Lists; // CraftBukkit + import com.google.common.collect.Maps; + import com.google.common.collect.Queues; + import java.util.Arrays; +@@ -14,6 +15,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.Bukkit; // CraftBukkit ++ + public class Chunk { + + private static final Logger c = LogManager.getLogger(); +@@ -23,7 +26,7 @@ + private final boolean[] g; + private boolean h; + public final World world; +- private final int[] heightMap; ++ public final int[] heightMap; // CraftBukkit - make public + public final int locX; + public final int locZ; + private boolean k; +@@ -40,6 +43,34 @@ + private int v; + private ConcurrentLinkedQueue w; + ++ // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking ++ private int neighbors = 0x1 << 12; ++ ++ public boolean areNeighborsLoaded(final int radius) { ++ switch (radius) { ++ case 2: ++ return this.neighbors == Integer.MAX_VALUE >> 6; ++ case 1: ++ final int mask = ++ // x z offset x z offset x z offset ++ (0x1 << (1 * 5 + 1 + 12)) | (0x1 << (0 * 5 + 1 + 12)) | (0x1 << (-1 * 5 + 1 + 12)) | ++ (0x1 << (1 * 5 + 0 + 12)) | (0x1 << (0 * 5 + 0 + 12)) | (0x1 << (-1 * 5 + 0 + 12)) | ++ (0x1 << (1 * 5 + -1 + 12)) | (0x1 << (0 * 5 + -1 + 12)) | (0x1 << (-1 * 5 + -1 + 12)); ++ return (this.neighbors & mask) == mask; ++ default: ++ throw new UnsupportedOperationException(String.valueOf(radius)); ++ } ++ } ++ ++ public void setNeighborLoaded(final int x, final int z) { ++ this.neighbors |= 0x1 << (x * 5 + 12 + z); ++ } ++ ++ public void setNeighborUnloaded(final int x, final int z) { ++ this.neighbors &= ~(0x1 << (x * 5 + 12 + z)); ++ } ++ // CraftBukkit end ++ + public Chunk(World world, int i, int j) { + this.sections = new ChunkSection[16]; + this.e = new byte[256]; +@@ -60,8 +91,17 @@ + + Arrays.fill(this.f, -999); + Arrays.fill(this.e, (byte) -1); ++ ++ // CraftBukkit start ++ if (!(this instanceof EmptyChunk)) { ++ this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); ++ } + } + ++ public org.bukkit.Chunk bukkitChunk; ++ public boolean mustSave; ++ // CraftBukkit end ++ + public Chunk(World world, ChunkSnapshot chunksnapshot, int i, int j) { + this(world, i, j); + short short0 = 256; +@@ -465,7 +505,13 @@ + flag = j >= i1; + } + +- chunksection.setType(i, j & 15, k, iblockdata); ++ // CraftBukkit start - Delay removing containers until after they're cleaned up ++ if (!(block1 instanceof IContainer)) { ++ chunksection.setType(i, j & 15, k, iblockdata); ++ } ++ // CraftBukkit end ++ ++ + if (block1 != block) { + if (!this.world.isStatic) { + block1.remove(this.world, blockposition, iblockdata1); +@@ -474,6 +520,12 @@ + } + } + ++ // CraftBukkit start - Delay removing containers until after they're cleaned up ++ if (block1 instanceof IContainer) { ++ chunksection.setType(i, j & 15, k, iblockdata); ++ } ++ // CraftBukkit end ++ + if (chunksection.b(i, j & 15, k) != block) { + return null; + } else { +@@ -505,7 +557,8 @@ + } + } + +- if (!this.world.isStatic && block1 != block) { ++ // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. ++ if (!this.world.isStatic && block1 != block && (!this.world.captureBlockStates || block instanceof BlockContainer)) { + block.onPlace(this.world, blockposition, iblockdata); + } + +@@ -586,7 +639,11 @@ + int j = MathHelper.floor(entity.locZ / 16.0D); + + if (i != this.locX || j != this.locZ) { +- Chunk.c.warn("Wrong location! (" + i + ", " + j + ") should be (" + this.locX + ", " + this.locZ + "), " + entity, new Object[] { entity}); ++ // CraftBukkit start ++ Bukkit.getLogger().warning("Wrong location for " + entity + " in world '" + world.getWorld().getName() + "'!"); ++ // Chunk.c.warn("Wrong location! (" + i + ", " + j + ") should be (" + this.locX + ", " + this.locZ + "), " + entity, new Object[] { entity}); ++ Bukkit.getLogger().warning("Entity is at " + entity.locX + "," + entity.locZ + " (chunk " + i + "," + j + ") but was stored in chunk " + this.locX + "," + this.locZ); ++ // CraftBukkit end + entity.die(); + } + +@@ -673,6 +730,13 @@ + + tileentity.D(); + this.tileEntities.put(blockposition, tileentity); ++ // CraftBukkit start ++ } else { ++ System.out.println("Attempted to place a tile entity (" + tileentity + ") at " + tileentity.position.getX() + "," + tileentity.position.getY() + "," + tileentity.position.getZ() ++ + " (" + org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(getType(blockposition)) + ") where there was no entity tile!"); ++ System.out.println("Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16)); ++ new Exception().printStackTrace(); ++ // CraftBukkit end + } + } + +@@ -716,7 +780,21 @@ + } + + for (int i = 0; i < this.entitySlices.length; ++i) { +- this.world.c((Collection) this.entitySlices[i]); ++ // CraftBukkit start ++ List<Entity> newList = Lists.newArrayList(this.entitySlices[i]); ++ java.util.Iterator<Entity> iter = newList.iterator(); ++ while (iter.hasNext()) { ++ Entity entity = iter.next(); ++ ++ // Do not pass along players, as doing so can get them stuck outside of time. ++ // (which for example disables inventory icon updates and prevents block breaking) ++ if (entity instanceof EntityPlayer) { ++ iter.remove(); ++ } ++ } ++ ++ this.world.c((Collection) newList); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/ChunkProviderServer.patch b/nms-patches/ChunkProviderServer.patch new file mode 100644 index 00000000..bbe662e2 --- /dev/null +++ b/nms-patches/ChunkProviderServer.patch @@ -0,0 +1,348 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ChunkProviderServer.java 2014-11-27 08:59:46.593422322 +1100 ++++ src/main/java/net/minecraft/server/ChunkProviderServer.java 2014-11-27 08:42:10.124850965 +1100 +@@ -10,17 +10,28 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.Random; ++import java.util.logging.Level; ++ ++import org.bukkit.Server; ++import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; ++import org.bukkit.craftbukkit.util.LongHash; ++import org.bukkit.craftbukkit.util.LongHashSet; ++import org.bukkit.craftbukkit.util.LongObjectHashMap; ++import org.bukkit.event.world.ChunkUnloadEvent; ++// CraftBukkit end ++ + public class ChunkProviderServer implements IChunkProvider { + + private static final Logger b = LogManager.getLogger(); +- public Set unloadQueue = Collections.newSetFromMap(new ConcurrentHashMap()); ++ public LongHashSet unloadQueue = new LongHashSet(); // CraftBukkit - LongHashSet + public Chunk emptyChunk; + public IChunkProvider chunkProvider; + private IChunkLoader chunkLoader; +- public boolean forceChunkLoad = true; +- public LongHashMap chunks = new LongHashMap(); +- private List chunkList = Lists.newArrayList(); +- private WorldServer world; ++ public boolean forceChunkLoad = false; // CraftBukkit - true -> false ++ public LongObjectHashMap<Chunk> chunks = new LongObjectHashMap<Chunk>(); ++ public WorldServer world; // CraftBukkit- public + + public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, IChunkProvider ichunkprovider) { + this.emptyChunk = new EmptyChunk(worldserver, 0, 0); +@@ -30,40 +41,93 @@ + } + + public boolean isChunkLoaded(int i, int j) { +- return this.chunks.contains(ChunkCoordIntPair.a(i, j)); ++ return this.chunks.containsKey(LongHash.toLong(i, j)); // CraftBukkit + } + +- public List a() { +- return this.chunkList; ++ // CraftBukkit start - Change return type to Collection and return the values of our chunk map ++ public java.util.Collection a() { ++ // return this.chunkList; ++ return this.chunks.values(); ++ // CraftBukkit end + } + + public void queueUnload(int i, int j) { + if (this.world.worldProvider.e()) { + if (!this.world.c(i, j)) { +- this.unloadQueue.add(Long.valueOf(ChunkCoordIntPair.a(i, j))); ++ // CraftBukkit start ++ this.unloadQueue.add(i, j); ++ ++ Chunk c = chunks.get(LongHash.toLong(i, j)); ++ if (c != null) { ++ c.mustSave = true; ++ } ++ // CraftBukkit end + } + } else { +- this.unloadQueue.add(Long.valueOf(ChunkCoordIntPair.a(i, j))); ++ // CraftBukkit start ++ this.unloadQueue.add(i, j); ++ ++ Chunk c = chunks.get(LongHash.toLong(i, j)); ++ if (c != null) { ++ c.mustSave = true; ++ } ++ // CraftBukkit end + } + + } + + public void b() { +- Iterator iterator = this.chunkList.iterator(); ++ Iterator iterator = this.chunks.values().iterator(); + + while (iterator.hasNext()) { + Chunk chunk = (Chunk) iterator.next(); + + this.queueUnload(chunk.locX, chunk.locZ); + } +- ++ } ++ ++ // CraftBukkit start - Add async variant, provide compatibility ++ public Chunk getChunkIfLoaded(int x, int z) { ++ return chunks.get(LongHash.toLong(x, z)); + } + + public Chunk getChunkAt(int i, int j) { +- long k = ChunkCoordIntPair.a(i, j); +- +- this.unloadQueue.remove(Long.valueOf(k)); +- Chunk chunk = (Chunk) this.chunks.getEntry(k); ++ return getChunkAt(i, j, null); ++ } ++ ++ public Chunk getChunkAt(int i, int j, Runnable runnable) { ++ unloadQueue.remove(i, j); ++ Chunk chunk = chunks.get(LongHash.toLong(i, j)); ++ ChunkRegionLoader loader = null; ++ ++ if (this.chunkLoader instanceof ChunkRegionLoader) { ++ loader = (ChunkRegionLoader) this.chunkLoader; ++ ++ } ++ // We can only use the queue for already generated chunks ++ if (chunk == null && loader != null && loader.chunkExists(world, i, j)) { ++ if (runnable != null) { ++ ChunkIOExecutor.queueChunkLoad(world, loader, this, i, j, runnable); ++ return null; ++ } else { ++ chunk = ChunkIOExecutor.syncChunkLoad(world, loader, this, i, j); ++ } ++ } else if (chunk == null) { ++ chunk = originalGetChunkAt(i, j); ++ } ++ ++ // If we didn't load the chunk async and have a callback run it now ++ if (runnable != null) { ++ runnable.run(); ++ } ++ ++ return chunk; ++ } ++ public Chunk originalGetChunkAt(int i, int j) { ++ this.unloadQueue.remove(i, j); ++ Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); ++ boolean newChunk = false; ++ // CraftBukkit end + + if (chunk == null) { + chunk = this.loadChunk(i, j); +@@ -78,16 +142,44 @@ + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Chunk to be generated"); + + crashreportsystemdetails.a("Location", (Object) String.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j)})); +- crashreportsystemdetails.a("Position hash", (Object) Long.valueOf(k)); ++ crashreportsystemdetails.a("Position hash", (Object) Long.valueOf(LongHash.toLong(i, j))); // CraftBukkit - Use LongHash + crashreportsystemdetails.a("Generator", (Object) this.chunkProvider.getName()); + throw new ReportedException(crashreport); + } + } ++ newChunk = true; // CraftBukkit + } + +- this.chunks.put(k, chunk); +- this.chunkList.add(chunk); ++ this.chunks.put(LongHash.toLong(i, j), chunk); + chunk.addEntities(); ++ ++ // CraftBukkit start ++ Server server = world.getServer(); ++ if (server != null) { ++ /* ++ * If it's a new world, the first few chunks are generated inside ++ * the World constructor. We can't reliably alter that, so we have ++ * no way of creating a CraftWorld/CraftServer at that point. ++ */ ++ server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, newChunk)); ++ } ++ ++ // Update neighbor counts ++ for (int x = -2; x < 3; x++) { ++ for (int z = -2; z < 3; z++) { ++ if (x == 0 && z == 0) { ++ continue; ++ } ++ ++ Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); ++ if (neighbor != null) { ++ neighbor.setNeighborLoaded(-x, -z); ++ chunk.setNeighborLoaded(x, z); ++ } ++ } ++ } ++ // CraftBukkit end ++ + chunk.loadNearby(this, this, i, j); + } + +@@ -95,9 +187,22 @@ + } + + public Chunk getOrCreateChunk(int i, int j) { +- Chunk chunk = (Chunk) this.chunks.getEntry(ChunkCoordIntPair.a(i, j)); ++ // CraftBukkit start ++ Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); + +- return chunk == null ? (!this.world.ad() && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; ++ chunk = chunk == null ? (!this.world.ad() && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; ++ ++ if (chunk == emptyChunk) return chunk; ++ if (i != chunk.locX || j != chunk.locZ) { ++ b.error("Chunk (" + chunk.locX + ", " + chunk.locZ + ") stored at (" + i + ", " + j + ") in world '" + world.getWorld().getName() + "'"); ++ b.error(chunk.getClass().getName()); ++ Throwable ex = new Throwable(); ++ ex.fillInStackTrace(); ++ ex.printStackTrace(); ++ } ++ ++ return chunk; ++ // CraftBukkit end + } + + public Chunk loadChunk(int i, int j) { +@@ -138,10 +243,13 @@ + try { + chunk.setLastSaved(this.world.getTime()); + this.chunkLoader.a(this.world, chunk); +- } catch (IOException ioexception) { ++ // CraftBukkit start - IOException to Exception ++ } catch (Exception ioexception) { + ChunkProviderServer.b.error("Couldn\'t save chunk", ioexception); ++ /* Remove extra exception + } catch (ExceptionWorldConflict exceptionworldconflict) { + ChunkProviderServer.b.error("Couldn\'t save chunk; already in use by another instance of Minecraft?", exceptionworldconflict); ++ // CraftBukkit end */ + } + + } +@@ -154,6 +262,30 @@ + chunk.n(); + if (this.chunkProvider != null) { + this.chunkProvider.getChunkAt(ichunkprovider, i, j); ++ ++ // CraftBukkit start ++ BlockSand.instaFall = true; ++ Random random = new Random(); ++ random.setSeed(world.getSeed()); ++ long xRand = random.nextLong() / 2L * 2L + 1L; ++ long zRand = random.nextLong() / 2L * 2L + 1L; ++ random.setSeed((long) i * xRand + (long) j * zRand ^ world.getSeed()); ++ ++ org.bukkit.World world = this.world.getWorld(); ++ if (world != null) { ++ this.world.populating = true; ++ try { ++ for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) { ++ populator.populate(world, random, chunk.bukkitChunk); ++ } ++ } finally { ++ this.world.populating = false; ++ } ++ } ++ BlockSand.instaFall = false; ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(chunk.bukkitChunk)); ++ // CraftBukkit end ++ + chunk.e(); + } + } +@@ -173,9 +305,12 @@ + + public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { + int i = 0; +- +- for (int j = 0; j < this.chunkList.size(); ++j) { +- Chunk chunk = (Chunk) this.chunkList.get(j); ++ ++ // CraftBukkit start ++ Iterator iterator = this.chunks.values().iterator(); ++ while (iterator.hasNext()) { ++ Chunk chunk = (Chunk) iterator.next(); ++ // CraftBukkit end + + if (flag) { + this.saveChunkNOP(chunk); +@@ -203,22 +338,42 @@ + + public boolean unloadChunks() { + if (!this.world.savingDisabled) { +- for (int i = 0; i < 100; ++i) { +- if (!this.unloadQueue.isEmpty()) { +- Long olong = (Long) this.unloadQueue.iterator().next(); +- Chunk chunk = (Chunk) this.chunks.getEntry(olong.longValue()); +- ++ // CraftBukkit start ++ Server server = this.world.getServer(); ++ for (int i = 0; i < 100 && !this.unloadQueue.isEmpty(); ++i) { ++ long chunkcoordinates = this.unloadQueue.popFirst(); ++ Chunk chunk = this.chunks.get(chunkcoordinates); ++ if (chunk == null) continue; ++ ++ ChunkUnloadEvent event = new ChunkUnloadEvent(chunk.bukkitChunk); ++ server.getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { + if (chunk != null) { + chunk.removeEntities(); + this.saveChunk(chunk); + this.saveChunkNOP(chunk); +- this.chunks.remove(olong.longValue()); +- this.chunkList.remove(chunk); ++ this.chunks.remove(chunkcoordinates); // CraftBukkit + } + +- this.unloadQueue.remove(olong); ++ // this.unloadQueue.remove(olong); ++ ++ // Update neighbor counts ++ for (int x = -2; x < 3; x++) { ++ for (int z = -2; z < 3; z++) { ++ if (x == 0 && z == 0) { ++ continue; ++ } ++ ++ Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); ++ if (neighbor != null) { ++ neighbor.setNeighborUnloaded(-x, -z); ++ chunk.setNeighborUnloaded(x, z); ++ } ++ } ++ } + } +- } ++ } ++ // CraftBukkit end + + if (this.chunkLoader != null) { + this.chunkLoader.a(); +@@ -233,7 +388,8 @@ + } + + public String getName() { +- return "ServerChunkCache: " + this.chunks.count() + " Drop: " + this.unloadQueue.size(); ++ // CraftBukkit - this.chunks.count() -> .size() ++ return "ServerChunkCache: " + this.chunks.size() + " Drop: " + this.unloadQueue.size(); + } + + public List getMobsFor(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { +@@ -245,7 +401,8 @@ + } + + public int getLoadedChunks() { +- return this.chunks.count(); ++ // CraftBukkit - this.chunks.count() -> this.chunks.size() ++ return this.chunks.size(); + } + + public void recreateStructures(Chunk chunk, int i, int j) {} diff --git a/nms-patches/ChunkRegionLoader.patch b/nms-patches/ChunkRegionLoader.patch new file mode 100644 index 00000000..35c373ed --- /dev/null +++ b/nms-patches/ChunkRegionLoader.patch @@ -0,0 +1,131 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ChunkRegionLoader.java 2014-11-27 08:59:46.593422322 +1100 ++++ src/main/java/net/minecraft/server/ChunkRegionLoader.java 2014-11-27 08:42:10.136850942 +1100 +@@ -23,8 +23,40 @@ + public ChunkRegionLoader(File file) { + this.e = file; + } ++ ++ // CraftBukkit start ++ public boolean chunkExists(World world, int i, int j) { ++ ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); ++ ++ synchronized (this.d) { ++ if (this.c.contains(chunkcoordintpair)) { ++ for (int k = 0; k < this.b.size(); ++k) { ++ if (((PendingChunkToSave) this.b.get(k)).a.equals(chunkcoordintpair)) { ++ return true; ++ } ++ } ++ } ++ } ++ ++ return RegionFileCache.a(this.e, i, j).chunkExists(i & 31, j & 31); ++ } ++ // CraftBukkit end + ++ // CraftBukkit start - Add async variant, provide compatibility + public Chunk a(World world, int i, int j) { ++ Object[] data = loadChunk(world, i, j); ++ if (data != null) { ++ Chunk chunk = (Chunk) data[0]; ++ NBTTagCompound nbttagcompound = (NBTTagCompound) data[1]; ++ loadEntities(chunk, nbttagcompound.getCompound("Level"), world); ++ return chunk; ++ } ++ ++ return null; ++ } ++ ++ public Object[] loadChunk(World world, int i, int j) { ++ // CraftBukkit end + NBTTagCompound nbttagcompound = null; + ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); + Object object = this.d; +@@ -53,7 +85,7 @@ + return this.a(world, i, j, nbttagcompound); + } + +- protected Chunk a(World world, int i, int j, NBTTagCompound nbttagcompound) { ++ protected Object[] a(World world, int i, int j, NBTTagCompound nbttagcompound) { // CraftBukkit - return Chunk -> Object[] + if (!nbttagcompound.hasKeyOfType("Level", 10)) { + ChunkRegionLoader.a.error("Chunk file at " + i + "," + j + " is missing level data, skipping"); + return null; +@@ -64,18 +96,42 @@ + Chunk chunk = this.a(world, nbttagcompound.getCompound("Level")); + + if (!chunk.a(i, j)) { +- ChunkRegionLoader.a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + chunk.locZ + ")"); +- nbttagcompound.setInt("xPos", i); +- nbttagcompound.setInt("zPos", j); ++ a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + chunk.locZ + ")"); ++ nbttagcompound.getCompound("Level").setInt("xPos", i); ++ nbttagcompound.getCompound("Level").setInt("zPos", j); ++ ++ // CraftBukkit start - Have to move tile entities since we don't load them at this stage ++ NBTTagList tileEntities = nbttagcompound.getCompound("Level").getList("TileEntities", 10); ++ if (tileEntities != null) { ++ for (int te = 0; te < tileEntities.size(); te++) { ++ NBTTagCompound tileEntity = (NBTTagCompound) tileEntities.get(te); ++ int x = tileEntity.getInt("x") - chunk.locX * 16; ++ int z = tileEntity.getInt("z") - chunk.locZ * 16; ++ tileEntity.setInt("x", i * 16 + x); ++ tileEntity.setInt("z", j * 16 + z); ++ } ++ } ++ // CraftBukkit end + chunk = this.a(world, nbttagcompound.getCompound("Level")); + } + +- return chunk; ++ // CraftBukkit start ++ Object[] data = new Object[2]; ++ data[0] = chunk; ++ data[1] = nbttagcompound; ++ return data; ++ // CraftBukkit end + } + } + + public void a(World world, Chunk chunk) { +- world.checkSession(); ++ // CraftBukkit start - "handle" exception ++ try { ++ world.checkSession(); ++ } catch (ExceptionWorldConflict ex) { ++ ex.printStackTrace(); ++ } ++ // CraftBukkit end + + try { + NBTTagCompound nbttagcompound = new NBTTagCompound(); +@@ -133,7 +189,7 @@ + return true; + } + +- public void a(PendingChunkToSave pendingchunktosave) { ++ public void a(PendingChunkToSave pendingchunktosave) throws java.io.IOException { // CraftBukkit - added throws + DataOutputStream dataoutputstream = RegionFileCache.d(this.e, pendingchunktosave.a.x, pendingchunktosave.a.z); + + NBTCompressedStreamTools.a(pendingchunktosave.b, (DataOutput) dataoutputstream); +@@ -320,7 +376,13 @@ + if (nbttagcompound.hasKeyOfType("Biomes", 7)) { + chunk.a(nbttagcompound.getByteArray("Biomes")); + } ++ ++ // CraftBukkit start - End this method here and split off entity loading to another method ++ return chunk; ++ } + ++ public void loadEntities(Chunk chunk, NBTTagCompound nbttagcompound, World world) { ++ // CraftBukkit end + NBTTagList nbttaglist1 = nbttagcompound.getList("Entities", 10); + + if (nbttaglist1 != null) { +@@ -379,6 +441,6 @@ + } + } + +- return chunk; ++ // return chunk; // CraftBukkit + } + } diff --git a/nms-patches/ChunkSection.patch b/nms-patches/ChunkSection.patch new file mode 100644 index 00000000..4063d6cc --- /dev/null +++ b/nms-patches/ChunkSection.patch @@ -0,0 +1,21 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ChunkSection.java 2014-11-27 08:59:46.597422305 +1100 ++++ src/main/java/net/minecraft/server/ChunkSection.java 2014-11-27 08:42:10.172850872 +1100 +@@ -19,6 +19,18 @@ + + } + ++ // CraftBukkit start ++ public ChunkSection(int y, boolean flag, char[] blockIds) { ++ this.yPos = y; ++ this.blockIds = blockIds; ++ this.emittedLight = new NibbleArray(); ++ if (flag) { ++ this.skyLight = new NibbleArray(); ++ } ++ recalcBlockCounts(); ++ } ++ // CraftBukkit end ++ + public IBlockData getType(int i, int j, int k) { + IBlockData iblockdata = (IBlockData) Block.d.a(this.blockIds[j << 8 | k << 4 | i]); + diff --git a/nms-patches/CommandBlockListenerAbstract.patch b/nms-patches/CommandBlockListenerAbstract.patch new file mode 100644 index 00000000..c49fad99 --- /dev/null +++ b/nms-patches/CommandBlockListenerAbstract.patch @@ -0,0 +1,162 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/CommandBlockListenerAbstract.java 2014-11-27 08:59:46.597422305 +1100 ++++ src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java 2014-11-27 08:42:10.172850872 +1100 +@@ -4,6 +4,13 @@ + import java.util.Date; + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import java.util.ArrayList; ++import org.apache.logging.log4j.Level; ++import org.bukkit.craftbukkit.command.VanillaCommandWrapper; ++import com.google.common.base.Joiner; ++// CraftBukkit end ++ + public abstract class CommandBlockListenerAbstract implements ICommandListener { + + private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss"); +@@ -13,6 +20,7 @@ + public String e = ""; + private String f = "@"; + private final CommandObjectiveExecutor g = new CommandObjectiveExecutor(); ++ protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender + + public CommandBlockListenerAbstract() {} + +@@ -79,7 +87,109 @@ + + try { + this.d = null; +- this.b = icommandhandler.a(this, this.e); ++ // this.b = icommandhandler.a(this, this.e); ++ // CraftBukkit start - Handle command block commands using Bukkit dispatcher ++ org.bukkit.command.SimpleCommandMap commandMap = minecraftserver.server.getCommandMap(); ++ Joiner joiner = Joiner.on(" "); ++ String command = this.e; ++ if (this.e.startsWith("/")) { ++ command = this.e.substring(1); ++ } ++ String[] args = command.split(" "); ++ ArrayList<String[]> commands = new ArrayList<String[]>(); ++ ++ // Block disallowed commands ++ if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("op") || ++ args[0].equalsIgnoreCase("deop") || args[0].equalsIgnoreCase("ban") || args[0].equalsIgnoreCase("ban-ip") || ++ args[0].equalsIgnoreCase("pardon") || args[0].equalsIgnoreCase("pardon-ip") || args[0].equalsIgnoreCase("reload")) { ++ this.b = 0; ++ return; ++ } ++ ++ // If the world has no players don't run ++ if (this.getWorld().players.isEmpty()) { ++ this.b = 0; ++ return; ++ } ++ ++ // Handle vanilla commands; ++ if (minecraftserver.server.getCommandBlockOverride(args[0])) { ++ org.bukkit.command.Command commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]); ++ if (commandBlockCommand instanceof VanillaCommandWrapper) { ++ this.b = ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommandBlock(this, this.e); ++ return; ++ } ++ } ++ ++ // Make sure this is a valid command ++ if (commandMap.getCommand(args[0]) == null) { ++ this.b = 0; ++ return; ++ } ++ ++ // testfor command requires special handling ++ if (args[0].equalsIgnoreCase("testfor")) { ++ if (args.length < 2) { ++ this.b = 0; ++ return; ++ } ++ ++ EntityPlayer[] players = ((java.util.List<EntityPlayer>)PlayerSelector.getPlayers(this, args[1], EntityPlayer.class)).toArray(new EntityPlayer[0]); ++ ++ if (players != null && players.length > 0) { ++ this.b = players.length; ++ return; ++ } else { ++ EntityPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(args[1]); ++ if (player == null) { ++ this.b = 0; ++ return; ++ } else { ++ this.b = 1; ++ return; ++ } ++ } ++ } ++ ++ commands.add(args); ++ ++ // Find positions of command block syntax, if any ++ ArrayList<String[]> newCommands = new ArrayList<String[]>(); ++ for (int i = 0; i < args.length; i++) { ++ if (PlayerSelector.isPattern(args[i])) { ++ for (int j = 0; j < commands.size(); j++) { ++ newCommands.addAll(this.buildCommands(commands.get(j), i)); ++ } ++ ArrayList<String[]> temp = commands; ++ commands = newCommands; ++ newCommands = temp; ++ newCommands.clear(); ++ } ++ } ++ ++ int completed = 0; ++ ++ // Now dispatch all of the commands we ended up with ++ for (int i = 0; i < commands.size(); i++) { ++ try { ++ if (commandMap.dispatch(sender, joiner.join(java.util.Arrays.asList(commands.get(i))))) { ++ completed++; ++ } ++ } catch (Throwable exception) { ++ if(this instanceof TileEntityCommandListener) { ++ TileEntityCommandListener listener = (TileEntityCommandListener) this; ++ MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), exception); ++ } else if (this instanceof EntityMinecartCommandBlockListener) { ++ EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) this; ++ MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), exception); ++ } else { ++ MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), exception); ++ } ++ } ++ } ++ ++ this.b = completed; ++ // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Executing command block"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Command to be executed"); +@@ -91,8 +201,26 @@ + } else { + this.b = 0; + } ++ } ++ ++ // CraftBukkit start ++ private ArrayList<String[]> buildCommands(String[] args, int pos) { ++ ArrayList<String[]> commands = new ArrayList<String[]>(); ++ EntityPlayer[] players = ((java.util.List<EntityPlayer>)PlayerSelector.getPlayers(this, args[pos], EntityPlayer.class)).toArray(new EntityPlayer[0]); ++ if (players != null) { ++ for (EntityPlayer player : players) { ++ if (player.world != this.getWorld()) { ++ continue; ++ } ++ String[] command = args.clone(); ++ command[pos] = player.getName(); ++ commands.add(command); ++ } ++ } + ++ return commands; + } ++ // CraftBukkit end + + public String getName() { + return this.f; diff --git a/nms-patches/Container.patch b/nms-patches/Container.patch new file mode 100644 index 00000000..4891ecc5 --- /dev/null +++ b/nms-patches/Container.patch @@ -0,0 +1,204 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Container.java 2014-11-27 08:59:46.617422217 +1100 ++++ src/main/java/net/minecraft/server/Container.java 2014-11-27 08:42:10.156850903 +1100 +@@ -7,6 +7,17 @@ + import java.util.List; + import java.util.Set; + ++// CraftBukkit start ++import java.util.HashMap; ++import java.util.Map; ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.Event.Result; ++import org.bukkit.event.inventory.InventoryDragEvent; ++import org.bukkit.event.inventory.InventoryType; ++import org.bukkit.inventory.InventoryView; ++// CraftBukkit end ++ + public abstract class Container { + + public List b = Lists.newArrayList(); +@@ -17,6 +28,18 @@ + private final Set h = Sets.newHashSet(); + protected List listeners = Lists.newArrayList(); + private Set i = Sets.newHashSet(); ++ ++ // CraftBukkit start ++ public boolean checkReachable = true; ++ public abstract InventoryView getBukkitView(); ++ public void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player) { ++ InventoryView source = this.getBukkitView(), destination = other.getBukkitView(); ++ ((CraftInventory) source.getTopInventory()).getInventory().onClose(player); ++ ((CraftInventory) source.getBottomInventory()).getInventory().onClose(player); ++ ((CraftInventory) destination.getTopInventory()).getInventory().onOpen(player); ++ ((CraftInventory) destination.getBottomInventory()).getInventory().onOpen(player); ++ } ++ // CraftBukkit end + + public Container() {} + +@@ -124,6 +147,7 @@ + l = playerinventory.getCarried().count; + Iterator iterator = this.h.iterator(); + ++ Map<Integer, ItemStack> draggedSlots = new HashMap<Integer, ItemStack>(); // CraftBukkit - Store slots from drag in map (raw slot id -> new stack) + while (iterator.hasNext()) { + Slot slot1 = (Slot) iterator.next(); + +@@ -141,16 +165,49 @@ + } + + l -= itemstack2.count - j1; +- slot1.set(itemstack2); ++ // slot1.set(itemstack2); ++ draggedSlots.put(slot1.rawSlotIndex, itemstack2); // CraftBukkit - Put in map instead of setting + } + } ++ ++ // CraftBukkit start - InventoryDragEvent ++ InventoryView view = getBukkitView(); ++ org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack1); ++ newcursor.setAmount(l); ++ Map<Integer, org.bukkit.inventory.ItemStack> eventmap = new HashMap<Integer, org.bukkit.inventory.ItemStack>(); ++ for (Map.Entry<Integer, ItemStack> ditem : draggedSlots.entrySet()) { ++ eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); ++ } ++ ++ // It's essential that we set the cursor to the new value here to prevent item duplication if a plugin closes the inventory. ++ ItemStack oldCursor = playerinventory.getCarried(); ++ playerinventory.setCarried(CraftItemStack.asNMSCopy(newcursor)); ++ ++ InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.dragType == 1, eventmap); ++ entityhuman.world.getServer().getPluginManager().callEvent(event); ++ ++ // Whether or not a change was made to the inventory that requires an update. ++ boolean needsUpdate = event.getResult() != Result.DEFAULT; ++ ++ if (event.getResult() != Result.DENY) { ++ for (Map.Entry<Integer, ItemStack> dslot : draggedSlots.entrySet()) { ++ view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); ++ } ++ // The only time the carried item will be set to null is if the inventory is closed by the server. ++ // If the inventory is closed by the server, then the cursor items are dropped. This is why we change the cursor early. ++ if (playerinventory.getCarried() != null) { ++ playerinventory.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); ++ needsUpdate = true; + +- itemstack1.count = l; +- if (itemstack1.count <= 0) { +- itemstack1 = null; ++ } ++ } else { ++ playerinventory.setCarried(oldCursor); + } + +- playerinventory.setCarried(itemstack1); ++ if (needsUpdate && entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).updateInventory(this); ++ } ++ // CraftBukkit end + } + + this.d(); +@@ -173,8 +230,14 @@ + } + + if (j == 1) { +- entityhuman.drop(playerinventory.getCarried().a(1), true); +- if (playerinventory.getCarried().count == 0) { ++ // CraftBukkit start - Store a reference ++ ItemStack itemstack4 = playerinventory.getCarried(); ++ if (itemstack4.count > 0) { ++ entityhuman.drop(itemstack4.a(1), true); ++ } ++ ++ if (itemstack4.count == 0) { ++ // CraftBukkit end + playerinventory.setCarried((ItemStack) null); + } + } +@@ -223,7 +286,11 @@ + + if (itemstack4.count == 0) { + playerinventory.setCarried((ItemStack) null); ++ // CraftBukkit start - Update client cursor if we didn't empty it ++ } else if (entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); + } ++ // CraftBukkit end + } + } else if (slot2.isAllowed(entityhuman)) { + if (itemstack4 == null) { +@@ -249,7 +316,11 @@ + itemstack4.a(k1); + if (itemstack4.count == 0) { + playerinventory.setCarried((ItemStack) null); ++ // CraftBukkit start - Update client cursor if we didn't empty it ++ } else if (entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); + } ++ // CraftBukkit end + + itemstack1.count += k1; + } else if (itemstack4.count <= slot2.getMaxStackSize(itemstack4)) { +@@ -258,7 +329,9 @@ + } + } else if (itemstack1.getItem() == itemstack4.getItem() && itemstack4.getMaxStackSize() > 1 && (!itemstack1.usesData() || itemstack1.getData() == itemstack4.getData()) && ItemStack.equals(itemstack1, itemstack4)) { + k1 = itemstack1.count; +- if (k1 > 0 && k1 + itemstack4.count <= itemstack4.getMaxStackSize()) { ++ // CraftBukkit start - itemstack4.getMaxStackSize() -> maxStack ++ int maxStack = Math.min(itemstack4.getMaxStackSize(), slot2.getMaxStackSize()); ++ if (k1 > 0 && k1 + itemstack4.count <= maxStack) { + itemstack4.count += k1; + itemstack1 = slot2.a(k1); + if (itemstack1.count == 0) { +@@ -266,11 +339,24 @@ + } + + slot2.a(entityhuman, playerinventory.getCarried()); ++ // CraftBukkit start - Update client cursor if we didn't empty it ++ } else if (entityhuman instanceof EntityPlayer) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); + } ++ // CraftBukkit end + } + } + + slot2.f(); ++ // CraftBukkit start - Make sure the client has the right slot contents ++ if (entityhuman instanceof EntityPlayer && slot2.getMaxStackSize() != 64) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, slot2.rawSlotIndex, slot2.getItem())); ++ // Updating a crafting inventory makes the client reset the result slot, have to send it again ++ if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, 0, this.getSlot(0).getItem())); ++ } ++ } ++ // CraftBukkit end + } + } + } else if (k == 2 && j >= 0 && j < 9) { +@@ -411,17 +497,20 @@ + if (itemstack1 != null && itemstack1.getItem() == itemstack.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1)) { + int l = itemstack1.count + itemstack.count; + +- if (l <= itemstack.getMaxStackSize()) { ++ // CraftBukkit start - itemstack.getMaxStackSize() -> maxStack ++ int maxStack = Math.min(itemstack.getMaxStackSize(), slot.getMaxStackSize()); ++ if (l <= maxStack) { + itemstack.count = 0; + itemstack1.count = l; + slot.f(); + flag1 = true; +- } else if (itemstack1.count < itemstack.getMaxStackSize()) { +- itemstack.count -= itemstack.getMaxStackSize() - itemstack1.count; +- itemstack1.count = itemstack.getMaxStackSize(); ++ } else if (itemstack1.count < maxStack) { ++ itemstack.count -= maxStack - itemstack1.count; ++ itemstack1.count = maxStack; + slot.f(); + flag1 = true; + } ++ // CraftBukkit end + } + + if (flag) { diff --git a/nms-patches/ContainerAnvil.patch b/nms-patches/ContainerAnvil.patch new file mode 100644 index 00000000..1c0c583a --- /dev/null +++ b/nms-patches/ContainerAnvil.patch @@ -0,0 +1,51 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerAnvil.java 2014-11-27 08:59:46.601422287 +1100 ++++ src/main/java/net/minecraft/server/ContainerAnvil.java 2014-11-27 08:42:10.144850927 +1100 +@@ -6,6 +6,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit ++ + public class ContainerAnvil extends Container { + + private static final Logger f = LogManager.getLogger(); +@@ -17,8 +19,13 @@ + private int k; + private String l; + private final EntityHuman m; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerAnvil(PlayerInventory playerinventory, World world, BlockPosition blockposition, EntityHuman entityhuman) { ++ this.player = playerinventory; // CraftBukkit + this.j = blockposition; + this.i = world; + this.m = entityhuman; +@@ -265,6 +272,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.i.getType(this.j).getBlock() != Blocks.ANVIL ? false : entityhuman.e((double) this.j.getX() + 0.5D, (double) this.j.getY() + 0.5D, (double) this.j.getZ() + 0.5D) <= 64.0D; + } + +@@ -328,4 +336,17 @@ + static int b(ContainerAnvil containeranvil) { + return containeranvil.k; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryAnvil(this.h, this.g); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerAnvilInventory.patch b/nms-patches/ContainerAnvilInventory.patch new file mode 100644 index 00000000..16649334 --- /dev/null +++ b/nms-patches/ContainerAnvilInventory.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerAnvilInventory.java 2014-11-27 08:59:46.597422305 +1100 ++++ src/main/java/net/minecraft/server/ContainerAnvilInventory.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,8 +1,43 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class ContainerAnvilInventory extends InventorySubcontainer { + + final ContainerAnvil a; ++ ++ // CraftBukkit start ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ public org.bukkit.entity.Player player; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } + + ContainerAnvilInventory(ContainerAnvil containeranvil, String s, boolean flag, int i) { + super(s, flag, i); +@@ -13,4 +48,11 @@ + super.update(); + this.a.a((IInventory) this); + } ++ ++ // CraftBukkit start - override inherited maxStack from InventorySubcontainer ++ @Override ++ public int getMaxStackSize() { ++ return maxStack; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerBeacon.patch b/nms-patches/ContainerBeacon.patch new file mode 100644 index 00000000..178e143c --- /dev/null +++ b/nms-patches/ContainerBeacon.patch @@ -0,0 +1,47 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerBeacon.java 2014-11-27 08:59:46.601422287 +1100 ++++ src/main/java/net/minecraft/server/ContainerBeacon.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,11 +1,18 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit ++ + public class ContainerBeacon extends Container { + + private IInventory a; + private final SlotBeacon f; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerBeacon(IInventory iinventory, IInventory iinventory1) { ++ player = (PlayerInventory) iinventory; // CraftBukkit - TODO: check this + this.a = iinventory1; + this.a((Slot) (this.f = new SlotBeacon(this, iinventory1, 0, 136, 110))); + byte b0 = 36; +@@ -35,6 +42,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.a.a(entityhuman); + } + +@@ -83,4 +91,17 @@ + + return itemstack; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryBeacon((TileEntityBeacon) this.a); // TODO - check this ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerBrewingStand.patch b/nms-patches/ContainerBrewingStand.patch new file mode 100644 index 00000000..b7aba135 --- /dev/null +++ b/nms-patches/ContainerBrewingStand.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerBrewingStand.java 2014-11-27 08:59:46.605422269 +1100 ++++ src/main/java/net/minecraft/server/ContainerBrewingStand.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,12 +1,23 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerBrewingStand extends Container { + + private IInventory brewingStand; + private final Slot f; + private int g; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerBrewingStand(PlayerInventory playerinventory, IInventory iinventory) { ++ player = playerinventory; // CraftBukkit + this.brewingStand = iinventory; + this.a((Slot) (new SlotPotionBottle(playerinventory.player, iinventory, 0, 56, 46))); + this.a((Slot) (new SlotPotionBottle(playerinventory.player, iinventory, 1, 79, 53))); +@@ -47,6 +58,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.brewingStand.a(entityhuman); + } + +@@ -101,4 +113,17 @@ + + return itemstack; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryBrewer inventory = new CraftInventoryBrewer(this.brewingStand); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerChest.patch b/nms-patches/ContainerChest.patch new file mode 100644 index 00000000..7021c61b --- /dev/null +++ b/nms-patches/ContainerChest.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerChest.java 2014-11-27 08:59:46.605422269 +1100 ++++ src/main/java/net/minecraft/server/ContainerChest.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,15 +1,48 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerChest extends Container { + + public IInventory container; + private int f; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory; ++ if (this.container instanceof PlayerInventory) { ++ inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryPlayer((PlayerInventory) this.container); ++ } else if (this.container instanceof InventoryLargeChest) { ++ inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) this.container); ++ } else { ++ inventory = new CraftInventory(this.container); ++ } ++ ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerChest(IInventory iinventory, IInventory iinventory1, EntityHuman entityhuman) { + this.container = iinventory1; + this.f = iinventory1.getSize() / 9; + iinventory1.startOpen(entityhuman); + int i = (this.f - 4) * 18; ++ ++ // CraftBukkit start - Save player ++ // TODO: Should we check to make sure it really is an InventoryPlayer? ++ this.player = (PlayerInventory) iinventory; ++ // CraftBukkit end + + int j; + int k; +@@ -33,6 +66,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.container.a(entityhuman); + } + diff --git a/nms-patches/ContainerDispenser.patch b/nms-patches/ContainerDispenser.patch new file mode 100644 index 00000000..cee54779 --- /dev/null +++ b/nms-patches/ContainerDispenser.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerDispenser.java 2014-11-27 08:59:46.605422269 +1100 ++++ src/main/java/net/minecraft/server/ContainerDispenser.java 2014-11-27 08:42:10.148850918 +1100 +@@ -1,11 +1,24 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerDispenser extends Container { + +- private IInventory items; ++ public IInventory items; // CraftBukkit - private -> public ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerDispenser(IInventory iinventory, IInventory iinventory1) { + this.items = iinventory1; ++ // CraftBukkit start - Save player ++ // TODO: Should we check to make sure it really is an InventoryPlayer? ++ this.player = (PlayerInventory)iinventory; ++ // CraftBukkit end + + int i; + int j; +@@ -29,6 +42,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.items.a(entityhuman); + } + +@@ -63,4 +77,17 @@ + + return itemstack; + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory = new CraftInventory(this.items); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerEnchantTable.patch b/nms-patches/ContainerEnchantTable.patch new file mode 100644 index 00000000..f2d866d8 --- /dev/null +++ b/nms-patches/ContainerEnchantTable.patch @@ -0,0 +1,170 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerEnchantTable.java 2014-11-27 08:59:46.609422252 +1100 ++++ src/main/java/net/minecraft/server/ContainerEnchantTable.java 2014-11-27 08:42:10.120850973 +1100 +@@ -3,15 +3,31 @@ + import java.util.List; + import java.util.Random; + ++// CraftBukkit start ++import java.util.Map; ++ ++import org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.enchantment.EnchantItemEvent; ++import org.bukkit.event.enchantment.PrepareItemEnchantEvent; ++import org.bukkit.entity.Player; ++// CraftBukkit end ++ + public class ContainerEnchantTable extends Container { + +- public IInventory enchantSlots = new ContainerEnchantTableInventory(this, "Enchant", true, 2); ++ // CraftBukkit - make type specific (changed from IInventory) ++ public ContainerEnchantTableInventory enchantSlots = new ContainerEnchantTableInventory(this, "Enchant", true, 2); + private World world; + private BlockPosition position; + private Random k = new Random(); + public int f; + public int[] costs = new int[3]; + public int[] h = new int[] { -1, -1, -1}; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private Player player; ++ // CraftBukkit end + + public ContainerEnchantTable(PlayerInventory playerinventory, World world, BlockPosition blockposition) { + this.world = world; +@@ -31,7 +47,11 @@ + for (i = 0; i < 9; ++i) { + this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); + } +- ++ ++ // CraftBukkit start ++ player = (Player) playerinventory.player.getBukkitEntity(); ++ enchantSlots.player = player; ++ // CraftBukkit end + } + + public void addSlotListener(ICrafting icrafting) { +@@ -67,7 +87,7 @@ + ItemStack itemstack = iinventory.getItem(0); + int i; + +- if (itemstack != null && itemstack.v()) { ++ if (itemstack != null) { // CraftBukkit - relax condition + if (!this.world.isStatic) { + i = 0; + +@@ -114,6 +134,20 @@ + this.costs[j] = 0; + } + } ++ ++ // CraftBukkit start ++ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); ++ PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), item, this.costs, i); ++ event.setCancelled(!itemstack.v()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ for (i = 0; i < 3; ++i) { ++ this.costs[i] = 0; ++ } ++ return; ++ } ++ // CraftBukkit end + + for (j = 0; j < 3; ++j) { + if (this.costs[j] > 0) { +@@ -149,24 +183,56 @@ + } else if (this.costs[i] > 0 && itemstack != null && (entityhuman.expLevel >= j && entityhuman.expLevel >= this.costs[i] || entityhuman.abilities.canInstantlyBuild)) { + if (!this.world.isStatic) { + List list = this.a(itemstack, i, this.costs[i]); ++ // CraftBukkit start - Provide an empty enchantment list ++ if (list == null) { ++ list = new java.util.ArrayList<WeightedRandomEnchant>(); ++ } ++ // CraftBukkit end + boolean flag = itemstack.getItem() == Items.BOOK; + + if (list != null) { +- entityhuman.b(j); ++ // CraftBukkit start ++ Map<org.bukkit.enchantments.Enchantment, Integer> enchants = new java.util.HashMap<org.bukkit.enchantments.Enchantment, Integer>(); ++ for (Object obj : list) { ++ WeightedRandomEnchant instance = (WeightedRandomEnchant) obj; ++ enchants.put(org.bukkit.enchantments.Enchantment.getById(instance.enchantment.id), instance.level); ++ } ++ CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); ++ ++ EnchantItemEvent event = new EnchantItemEvent((Player) entityhuman.getBukkitEntity(), this.getBukkitView(), this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), item, this.costs[i], enchants, i); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ int level = event.getExpLevelCost(); ++ if (event.isCancelled() || (level > entityhuman.expLevel && !entityhuman.abilities.canInstantlyBuild) || event.getEnchantsToAdd().isEmpty()) { ++ return false; ++ } ++ + if (flag) { + itemstack.setItem(Items.ENCHANTED_BOOK); + } ++ ++ for (Map.Entry<org.bukkit.enchantments.Enchantment, Integer> entry : event.getEnchantsToAdd().entrySet()) { ++ try { ++ if (flag) { ++ int enchantId = entry.getKey().getId(); ++ if (Enchantment.getById(enchantId) == null) { ++ continue; ++ } + +- for (int k = 0; k < list.size(); ++k) { +- WeightedRandomEnchant weightedrandomenchant = (WeightedRandomEnchant) list.get(k); +- +- if (flag) { +- Items.ENCHANTED_BOOK.a(itemstack, weightedrandomenchant); +- } else { +- itemstack.addEnchantment(weightedrandomenchant.enchantment, weightedrandomenchant.level); ++ WeightedRandomEnchant enchantment = new WeightedRandomEnchant(Enchantment.getById(enchantId), entry.getValue()); ++ Items.ENCHANTED_BOOK.a(itemstack, enchantment); ++ } else { ++ item.addUnsafeEnchantment(entry.getKey(), entry.getValue()); ++ } ++ } catch (IllegalArgumentException e) { ++ /* Just swallow invalid enchantments */ + } + } ++ ++ entityhuman.b(level); ++ // CraftBukkit end + ++ // CraftBukkit - TODO: let plugins change this + if (!entityhuman.abilities.canInstantlyBuild) { + itemstack1.count -= j; + if (itemstack1.count <= 0) { +@@ -212,6 +278,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.world.getType(this.position).getBlock() != Blocks.ENCHANTING_TABLE ? false : entityhuman.e((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D; + } + +@@ -263,5 +330,18 @@ + } + + return itemstack; ++ } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryEnchanting inventory = new CraftInventoryEnchanting(this.enchantSlots); ++ bukkitEntity = new CraftInventoryView(this.player, inventory, this); ++ return bukkitEntity; + } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerEnchantTableInventory.patch b/nms-patches/ContainerEnchantTableInventory.patch new file mode 100644 index 00000000..f2f80b3e --- /dev/null +++ b/nms-patches/ContainerEnchantTableInventory.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerEnchantTableInventory.java 2014-11-27 08:59:46.609422252 +1100 ++++ src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java 2014-11-27 08:42:10.088851036 +1100 +@@ -1,8 +1,45 @@ + package net.minecraft.server; + +-class ContainerEnchantTableInventory extends InventorySubcontainer { ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ ++// CraftBukkit -> public ++public class ContainerEnchantTableInventory extends InventorySubcontainer { + + final ContainerEnchantTable enchantTable; ++ ++ // CraftBukkit start ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ public org.bukkit.entity.Player player; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + ContainerEnchantTableInventory(ContainerEnchantTable containerenchanttable, String s, boolean flag, int i) { + super(s, flag, i); +@@ -10,7 +47,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public void update() { diff --git a/nms-patches/ContainerFurnace.patch b/nms-patches/ContainerFurnace.patch new file mode 100644 index 00000000..b299ee20 --- /dev/null +++ b/nms-patches/ContainerFurnace.patch @@ -0,0 +1,51 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerFurnace.java 2014-11-27 08:59:46.613422234 +1100 ++++ src/main/java/net/minecraft/server/ContainerFurnace.java 2014-11-27 08:42:10.116850981 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerFurnace extends Container { + + private final IInventory furnace; +@@ -7,12 +12,29 @@ + private int g; + private int h; + private int i; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryFurnace inventory = new CraftInventoryFurnace((TileEntityFurnace) this.furnace); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerFurnace(PlayerInventory playerinventory, IInventory iinventory) { + this.furnace = iinventory; + this.a(new Slot(iinventory, 0, 56, 17)); + this.a((Slot) (new SlotFurnaceFuel(iinventory, 1, 56, 53))); + this.a((Slot) (new SlotFurnaceResult(playerinventory.player, iinventory, 2, 116, 35))); ++ this.player = playerinventory; // CraftBukkit - save player + + int i; + +@@ -63,6 +85,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.furnace.a(entityhuman); + } + diff --git a/nms-patches/ContainerHopper.patch b/nms-patches/ContainerHopper.patch new file mode 100644 index 00000000..4654d33a --- /dev/null +++ b/nms-patches/ContainerHopper.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerHopper.java 2014-11-27 08:59:46.613422234 +1100 ++++ src/main/java/net/minecraft/server/ContainerHopper.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,11 +1,33 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerHopper extends Container { + + private final IInventory hopper; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory = new CraftInventory(this.hopper); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerHopper(PlayerInventory playerinventory, IInventory iinventory, EntityHuman entityhuman) { + this.hopper = iinventory; ++ this.player = playerinventory; // CraftBukkit - save player + iinventory.startOpen(entityhuman); + byte b0 = 51; + +@@ -28,6 +50,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.hopper.a(entityhuman); + } + diff --git a/nms-patches/ContainerHorse.patch b/nms-patches/ContainerHorse.patch new file mode 100644 index 00000000..9c9fa57a --- /dev/null +++ b/nms-patches/ContainerHorse.patch @@ -0,0 +1,36 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerHorse.java 2014-11-27 08:59:46.613422234 +1100 ++++ src/main/java/net/minecraft/server/ContainerHorse.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,11 +1,33 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++import org.bukkit.inventory.InventoryView; ++// CraftBukkit end ++ + public class ContainerHorse extends Container { + + private IInventory a; + private EntityHorse f; ++ ++ // CraftBukkit start ++ org.bukkit.craftbukkit.inventory.CraftInventoryView bukkitEntity; ++ PlayerInventory player; ++ ++ @Override ++ public InventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryHorse(this.a); ++ return bukkitEntity = new CraftInventoryView(player.player.getBukkitEntity(), inventory, this); ++ } + + public ContainerHorse(IInventory iinventory, IInventory iinventory1, EntityHorse entityhorse, EntityHuman entityhuman) { ++ player = (PlayerInventory) iinventory; ++ // CraftBukkit end + this.a = iinventory1; + this.f = entityhorse; + byte b0 = 3; diff --git a/nms-patches/ContainerMerchant.patch b/nms-patches/ContainerMerchant.patch new file mode 100644 index 00000000..d62ffe9e --- /dev/null +++ b/nms-patches/ContainerMerchant.patch @@ -0,0 +1,36 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerMerchant.java 2014-11-27 08:59:46.617422217 +1100 ++++ src/main/java/net/minecraft/server/ContainerMerchant.java 2014-11-27 08:42:10.136850942 +1100 +@@ -1,10 +1,25 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit ++ + public class ContainerMerchant extends Container { + + private IMerchant merchant; + private InventoryMerchant f; + private final World g; ++ ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity == null) { ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), new org.bukkit.craftbukkit.inventory.CraftInventoryMerchant((InventoryMerchant) f), this); ++ } ++ return bukkitEntity; ++ } ++ // CraftBukkit end + + public ContainerMerchant(PlayerInventory playerinventory, IMerchant imerchant, World world) { + this.merchant = imerchant; +@@ -13,6 +28,7 @@ + this.a(new Slot(this.f, 0, 36, 53)); + this.a(new Slot(this.f, 1, 62, 53)); + this.a((Slot) (new SlotMerchantResult(playerinventory.player, imerchant, this.f, 2, 120, 53))); ++ this.player = playerinventory; // CraftBukkit - save player + + int i; + diff --git a/nms-patches/ContainerPlayer.patch b/nms-patches/ContainerPlayer.patch new file mode 100644 index 00000000..8b2c347b --- /dev/null +++ b/nms-patches/ContainerPlayer.patch @@ -0,0 +1,74 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerPlayer.java 2014-11-27 08:59:46.621422199 +1100 ++++ src/main/java/net/minecraft/server/ContainerPlayer.java 2014-11-27 08:42:10.104851005 +1100 +@@ -1,15 +1,28 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerPlayer extends Container { + + public InventoryCrafting craftInventory = new InventoryCrafting(this, 2, 2); + public IInventory resultInventory = new InventoryCraftResult(); + public boolean g; + private final EntityHuman h; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerPlayer(PlayerInventory playerinventory, boolean flag, EntityHuman entityhuman) { + this.g = flag; + this.h = entityhuman; ++ this.resultInventory = new InventoryCraftResult(); // CraftBukkit - moved to before InventoryCrafting construction ++ this.craftInventory = new InventoryCrafting(this, 2, 2, playerinventory.player); // CraftBukkit - pass player ++ this.craftInventory.resultInventory = this.resultInventory; // CraftBukkit - let InventoryCrafting know about its result slot ++ this.player = playerinventory; // CraftBukkit - save player + this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 144, 36))); + + int i; +@@ -35,11 +48,22 @@ + this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); + } + +- this.a((IInventory) this.craftInventory); ++ // this.a((IInventory) this.craftInventory); // CraftBukkit - unneeded since it just sets result slot to empty + } + + public void a(IInventory iinventory) { +- this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.h.world)); ++ // this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.h.world)); ++ // CraftBukkit start (Note: the following line would cause an error if called during construction) ++ CraftingManager.getInstance().lastCraftView = getBukkitView(); ++ ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.h.world); ++ this.resultInventory.setItem(0, craftResult); ++ if (super.listeners.size() < 1) { ++ return; ++ } ++ ++ EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. ++ player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); ++ // CraftBukkit end + } + + public void b(EntityHuman entityhuman) { +@@ -119,4 +143,17 @@ + public boolean a(ItemStack itemstack, Slot slot) { + return slot.inventory != this.resultInventory && super.a(itemstack, slot); + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ContainerWorkbench.patch b/nms-patches/ContainerWorkbench.patch new file mode 100644 index 00000000..045167c1 --- /dev/null +++ b/nms-patches/ContainerWorkbench.patch @@ -0,0 +1,79 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ContainerWorkbench.java 2014-11-27 08:59:46.621422199 +1100 ++++ src/main/java/net/minecraft/server/ContainerWorkbench.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,13 +1,28 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++// CraftBukkit end ++ + public class ContainerWorkbench extends Container { + +- public InventoryCrafting craftInventory = new InventoryCrafting(this, 3, 3); +- public IInventory resultInventory = new InventoryCraftResult(); ++ public InventoryCrafting craftInventory; // CraftBukkit - move initialization into constructor ++ public IInventory resultInventory; // CraftBukkit - move initialization into constructor + private World g; + private BlockPosition h; ++ // CraftBukkit start ++ private CraftInventoryView bukkitEntity = null; ++ private PlayerInventory player; ++ // CraftBukkit end + + public ContainerWorkbench(PlayerInventory playerinventory, World world, BlockPosition blockposition) { ++ // CraftBukkit start - Switched order of IInventory construction and stored player ++ this.resultInventory = new InventoryCraftResult(); ++ this.craftInventory = new InventoryCrafting(this, 3, 3, playerinventory.player); // CraftBukkit - pass player ++ this.craftInventory.resultInventory = this.resultInventory; ++ this.player = playerinventory; ++ // CraftBukkit end + this.g = world; + this.h = blockposition; + this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 124, 35))); +@@ -35,7 +50,18 @@ + } + + public void a(IInventory iinventory) { +- this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.g)); ++ // this.resultInventory.setItem(0, CraftingManager.getInstance().craft(this.craftInventory, this.g)); ++ // CraftBukkit start ++ CraftingManager.getInstance().lastCraftView = getBukkitView(); ++ ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.g); ++ this.resultInventory.setItem(0, craftResult); ++ if (super.listeners.size() < 1) { ++ return; ++ } ++ ++ EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. ++ player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); ++ // CraftBukkit end + } + + public void b(EntityHuman entityhuman) { +@@ -53,6 +79,7 @@ + } + + public boolean a(EntityHuman entityhuman) { ++ if (!this.checkReachable) return true; // CraftBukkit + return this.g.getType(this.h).getBlock() != Blocks.CRAFTING_TABLE ? false : entityhuman.e((double) this.h.getX() + 0.5D, (double) this.h.getY() + 0.5D, (double) this.h.getZ() + 0.5D) <= 64.0D; + } + +@@ -101,4 +128,17 @@ + public boolean a(ItemStack itemstack, Slot slot) { + return slot.inventory != this.resultInventory && super.a(itemstack, slot); + } ++ ++ // CraftBukkit start ++ @Override ++ public CraftInventoryView getBukkitView() { ++ if (bukkitEntity != null) { ++ return bukkitEntity; ++ } ++ ++ CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); ++ bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); ++ return bukkitEntity; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/ControllerLook.patch b/nms-patches/ControllerLook.patch new file mode 100644 index 00000000..212d063e --- /dev/null +++ b/nms-patches/ControllerLook.patch @@ -0,0 +1,23 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ControllerLook.java 2014-11-27 08:59:46.621422199 +1100 ++++ src/main/java/net/minecraft/server/ControllerLook.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.TrigMath; // CraftBukkit ++ + public class ControllerLook { + + private EntityInsentient a; +@@ -45,8 +47,10 @@ + double d1 = this.f - (this.a.locY + (double) this.a.getHeadHeight()); + double d2 = this.g - this.a.locZ; + double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); +- float f = (float) (Math.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; +- float f1 = (float) (-(Math.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); ++ // CraftBukkit start - Math -> TrigMath ++ float f = (float) (TrigMath.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; ++ float f1 = (float) (-(TrigMath.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); ++ // CraftBukkit end + + this.a.pitch = this.a(this.a.pitch, f1, this.c); + this.a.aI = this.a(this.a.aI, f, this.b); diff --git a/nms-patches/ControllerMove.patch b/nms-patches/ControllerMove.patch new file mode 100644 index 00000000..9963db77 --- /dev/null +++ b/nms-patches/ControllerMove.patch @@ -0,0 +1,12 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ControllerMove.java 2014-11-27 08:59:46.625422182 +1100 ++++ src/main/java/net/minecraft/server/ControllerMove.java 2014-11-27 08:42:10.164850887 +1100 +@@ -43,7 +43,8 @@ + double d3 = d0 * d0 + d2 * d2 + d1 * d1; + + if (d3 >= 2.500000277905201E-7D) { +- float f = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; ++ // CraftBukkit - Math -> TrigMath ++ float f = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; + + this.a.yaw = this.a(this.a.yaw, f, 30.0F); + this.a.j((float) (this.e * this.a.getAttributeInstance(GenericAttributes.d).getValue())); diff --git a/nms-patches/CraftingManager.patch b/nms-patches/CraftingManager.patch new file mode 100644 index 00000000..8d0f4bde --- /dev/null +++ b/nms-patches/CraftingManager.patch @@ -0,0 +1,57 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/CraftingManager.java 2014-11-27 08:59:46.625422182 +1100 ++++ src/main/java/net/minecraft/server/CraftingManager.java 2014-11-27 08:42:10.112850989 +1100 +@@ -8,10 +8,16 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class CraftingManager { + + private static final CraftingManager a = new CraftingManager(); + public List recipes = Lists.newArrayList(); ++ // CraftBukkit start ++ public IRecipe lastRecipe; ++ public org.bukkit.inventory.InventoryView lastCraftView; ++ // CraftBukkit end + + public static CraftingManager getInstance() { + return CraftingManager.a; +@@ -166,8 +172,15 @@ + this.registerShapedRecipe(new ItemStack(Blocks.DAYLIGHT_DETECTOR), new Object[] { "GGG", "QQQ", "WWW", Character.valueOf('G'), Blocks.GLASS, Character.valueOf('Q'), Items.QUARTZ, Character.valueOf('W'), Blocks.WOODEN_SLAB}); + this.registerShapedRecipe(new ItemStack(Blocks.HOPPER), new Object[] { "I I", "ICI", " I ", Character.valueOf('I'), Items.IRON_INGOT, Character.valueOf('C'), Blocks.CHEST}); + this.registerShapedRecipe(new ItemStack(Items.ARMOR_STAND, 1), new Object[] { "///", " / ", "/_/", Character.valueOf('/'), Items.STICK, Character.valueOf('_'), new ItemStack(Blocks.STONE_SLAB, 1, EnumStoneSlabVariant.STONE.a())}); ++ // Collections.sort(this.recipes, new RecipeSorter(this)); // CraftBukkit - moved below ++ sort(); ++ } ++ ++ // CraftBukkit start ++ public void sort() { + Collections.sort(this.recipes, new RecipeSorter(this)); + } ++ // CraftBukkit end + + public ShapedRecipes registerShapedRecipe(ItemStack itemstack, Object... aobject) { + String s = ""; +@@ -265,13 +278,18 @@ + + do { + if (!iterator.hasNext()) { ++ inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found + return null; + } + + irecipe = (IRecipe) iterator.next(); +- } while (!irecipe.a(inventorycrafting, world)); +- +- return irecipe.a(inventorycrafting); ++ } while (!irecipe.a(inventorycrafting, world)); ++ ++ // CraftBukkit start - INVENTORY_PRE_CRAFT event ++ inventorycrafting.currentRecipe = irecipe; ++ ItemStack result = irecipe.a(inventorycrafting); ++ return CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, false); ++ // CraftBukkit end + } + + public ItemStack[] b(InventoryCrafting inventorycrafting, World world) { diff --git a/nms-patches/CrashReport.patch b/nms-patches/CrashReport.patch new file mode 100644 index 00000000..3518bd3e --- /dev/null +++ b/nms-patches/CrashReport.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/CrashReport.java 2014-11-27 08:59:46.629422164 +1100 ++++ src/main/java/net/minecraft/server/CrashReport.java 2014-11-27 08:42:10.172850872 +1100 +@@ -40,6 +40,7 @@ + this.d.a("Memory", (Callable) (new CrashReportMemory(this))); + this.d.a("JVM Flags", (Callable) (new CrashReportJVMFlags(this))); + this.d.a("IntCache", (Callable) (new CrashReportIntCacheSize(this))); ++ this.d.a("CraftBukkit Information", (Callable) (new org.bukkit.craftbukkit.CraftCrashReport())); // CraftBukkit + } + + public String a() { diff --git a/nms-patches/DedicatedServer.patch b/nms-patches/DedicatedServer.patch new file mode 100644 index 00000000..814b166b --- /dev/null +++ b/nms-patches/DedicatedServer.patch @@ -0,0 +1,162 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DedicatedServer.java 2014-11-27 08:59:46.629422164 +1100 ++++ src/main/java/net/minecraft/server/DedicatedServer.java 2014-11-27 08:42:10.172850872 +1100 +@@ -13,6 +13,14 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.io.PrintStream; ++import org.apache.logging.log4j.Level; ++ ++import org.bukkit.craftbukkit.LoggerOutputStream; ++import org.bukkit.event.server.ServerCommandEvent; ++// CraftBukkit end ++ + public class DedicatedServer extends MinecraftServer implements IMinecraftServer { + + private static final Logger LOGGER = LogManager.getLogger(); +@@ -25,23 +33,48 @@ + private EnumGamemode q; + private boolean r; + +- public DedicatedServer(File file) { +- super(file, Proxy.NO_PROXY, DedicatedServer.a); ++ // CraftBukkit start - Signature changed ++ public DedicatedServer(joptsimple.OptionSet options) { ++ super(options, Proxy.NO_PROXY, a); ++ // super(file, Proxy.NO_PROXY, a); ++ // CraftBukkit end + new ThreadSleepForever(this, "Server Infinisleeper"); + } + +- protected boolean init() { ++ protected boolean init() throws java.net.UnknownHostException { // CraftBukkit - throws UnknownHostException + ThreadCommandReader threadcommandreader = new ThreadCommandReader(this, "Server console handler"); + + threadcommandreader.setDaemon(true); + threadcommandreader.start(); ++ ++ // CraftBukkit start - TODO: handle command-line logging arguments ++ java.util.logging.Logger global = java.util.logging.Logger.getLogger(""); ++ global.setUseParentHandlers(false); ++ for (java.util.logging.Handler handler : global.getHandlers()) { ++ global.removeHandler(handler); ++ } ++ global.addHandler(new org.bukkit.craftbukkit.util.ForwardLogHandler()); ++ ++ final org.apache.logging.log4j.core.Logger logger = ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()); ++ for (org.apache.logging.log4j.core.Appender appender : logger.getAppenders().values()) { ++ if (appender instanceof org.apache.logging.log4j.core.appender.ConsoleAppender) { ++ logger.removeAppender(appender); ++ } ++ } ++ ++ new Thread(new org.bukkit.craftbukkit.util.TerminalConsoleWriterThread(System.out, this.reader)).start(); ++ ++ System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true)); ++ System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true)); ++ // CraftBukkit end ++ + DedicatedServer.LOGGER.info("Starting minecraft server version 1.8"); + if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { + DedicatedServer.LOGGER.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); + } + + DedicatedServer.LOGGER.info("Loading properties"); +- this.propertyManager = new PropertyManager(new File("server.properties")); ++ this.propertyManager = new PropertyManager(this.options); // CraftBukkit - CLI argument support + this.o = new EULA(new File("eula.txt")); + if (!this.o.a()) { + DedicatedServer.LOGGER.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); +@@ -90,13 +123,15 @@ + + try { + this.ao().a(inetaddress, this.Q()); +- } catch (IOException ioexception) { ++ } catch (Throwable ioexception) { // CraftBukkit - IOException -> Throwable + DedicatedServer.LOGGER.warn("**** FAILED TO BIND TO PORT!"); + DedicatedServer.LOGGER.warn("The exception was: {}", new Object[] { ioexception.toString()}); + DedicatedServer.LOGGER.warn("Perhaps a server is already running on that port?"); + return false; + } + ++ this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit ++ + if (!this.getOnlineMode()) { + DedicatedServer.LOGGER.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); + DedicatedServer.LOGGER.warn("The server will make no attempt to authenticate usernames. Beware."); +@@ -111,7 +146,8 @@ + if (!NameReferencingFileConverter.a(this.propertyManager)) { + return false; + } else { +- this.a((PlayerList) (new DedicatedPlayerList(this))); ++ // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - moved up ++ this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor + long j = System.nanoTime(); + + if (this.T() == null) { +@@ -166,7 +202,18 @@ + DedicatedServer.LOGGER.info("Starting remote control listener"); + this.m = new RemoteControlListener(this); + this.m.a(); ++ this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit ++ } ++ ++ // CraftBukkit start ++ if (this.server.getBukkitSpawnRadius() > -1) { ++ DedicatedServer.LOGGER.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you."); ++ this.propertyManager.properties.remove("spawn-protection"); ++ this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius()); ++ this.server.removeBukkitSpawnRadius(); ++ this.propertyManager.savePropertiesFile(); + } ++ // CraftBukkit end + + if (this.aQ() > 0L) { + Thread thread = new Thread(new ThreadWatchdog(this)); +@@ -181,6 +228,12 @@ + } + } + ++ // CraftBukkit start ++ public PropertyManager getPropertyManager() { ++ return this.propertyManager; ++ } ++ // CraftBukkit end ++ + public void setGamemode(EnumGamemode enumgamemode) { + super.setGamemode(enumgamemode); + this.q = enumgamemode; +@@ -203,6 +256,7 @@ + } + + protected void a(CrashReport crashreport) { ++ /* CraftBukkit start - not sure why you would want to continue running commands once the server crashed + while (this.isRunning()) { + this.aM(); + +@@ -212,7 +266,7 @@ + ; + } + } +- ++ // CraftBukkit end */ + } + + public CrashReport b(CrashReport crashreport) { +@@ -257,7 +311,14 @@ + while (!this.k.isEmpty()) { + ServerCommand servercommand = (ServerCommand) this.k.remove(0); + +- this.getCommandHandler().a(servercommand.source, servercommand.command); ++ // CraftBukkit start - ServerCommand for preprocessing ++ ServerCommandEvent event = new ServerCommandEvent(console, servercommand.command); ++ server.getPluginManager().callEvent(event); ++ servercommand = new ServerCommand(event.getCommand(), servercommand.source); ++ ++ // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand ++ server.dispatchServerCommand(console, servercommand); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/DispenseBehaviorArmor.patch b/nms-patches/DispenseBehaviorArmor.patch new file mode 100644 index 00000000..6c420e65 --- /dev/null +++ b/nms-patches/DispenseBehaviorArmor.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorArmor.java 2014-11-27 08:59:46.629422164 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorArmor.java 2014-11-27 08:42:10.144850927 +1100 +@@ -3,6 +3,11 @@ + import com.google.common.base.Predicates; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorArmor extends DispenseBehaviorItem { + + DispenseBehaviorArmor() {} +@@ -19,15 +24,42 @@ + EntityLiving entityliving = (EntityLiving) list.get(0); + int l = entityliving instanceof EntityHuman ? 1 : 0; + int i1 = EntityInsentient.c(itemstack); +- ItemStack itemstack1 = itemstack.cloneItemStack(); ++ ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ World world = isourceblock.i(); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } + ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end ++ + itemstack1.count = 1; + entityliving.setEquipment(i1 - l, itemstack1); + if (entityliving instanceof EntityInsentient) { + ((EntityInsentient) entityliving).a(i1, 2.0F); + } + +- --itemstack.count; ++ // --itemstack.count; // CraftBukkit - handled above + return itemstack; + } else { + return super.b(isourceblock, itemstack); diff --git a/nms-patches/DispenseBehaviorBoat.patch b/nms-patches/DispenseBehaviorBoat.patch new file mode 100644 index 00000000..19daf555 --- /dev/null +++ b/nms-patches/DispenseBehaviorBoat.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorBoat.java 2014-11-27 08:59:46.633422146 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorBoat.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorBoat extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -26,10 +31,38 @@ + d3 = 0.0D; + } + +- EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2); ++ // EntityBoat entityboat = new EntityBoat(world, d0, d1 + d3, d2); ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); ++ // CraftBukkit end + + world.addEntity(entityboat); +- itemstack.a(1); ++ // itemstack.a(1); // CraftBukkit - handled during event processing + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorBonemeal.patch b/nms-patches/DispenseBehaviorBonemeal.patch new file mode 100644 index 00000000..32cea5b7 --- /dev/null +++ b/nms-patches/DispenseBehaviorBonemeal.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorBonemeal.java 2014-11-27 08:59:46.633422146 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorBonemeal extends DispenseBehaviorItem { + + private boolean b = true; +@@ -10,6 +15,30 @@ + if (EnumColor.WHITE == EnumColor.fromInvColorIndex(itemstack.getData())) { + World world = isourceblock.i(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); ++ ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asNewCraftStack(itemstack.getItem()); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end + + if (ItemDye.a(itemstack, world, blockposition)) { + if (!world.isStatic) { diff --git a/nms-patches/DispenseBehaviorEmptyBucket.patch b/nms-patches/DispenseBehaviorEmptyBucket.patch new file mode 100644 index 00000000..9727c367 --- /dev/null +++ b/nms-patches/DispenseBehaviorEmptyBucket.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorEmptyBucket.java 2014-11-27 08:59:46.633422146 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorEmptyBucket extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -23,6 +28,30 @@ + + item = Items.LAVA_BUCKET; + } ++ ++ // CraftBukkit start ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(bukkitBlock, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX(), blockposition.getY(), blockposition.getZ())); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end + + world.setAir(blockposition); + if (--itemstack.count == 0) { diff --git a/nms-patches/DispenseBehaviorFilledBucket.patch b/nms-patches/DispenseBehaviorFilledBucket.patch new file mode 100644 index 00000000..e3bcc62e --- /dev/null +++ b/nms-patches/DispenseBehaviorFilledBucket.patch @@ -0,0 +1,65 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorFilledBucket.java 2014-11-27 08:59:46.637422129 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java 2014-11-27 08:42:10.088851036 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorFilledBucket extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -9,10 +14,49 @@ + public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { + ItemBucket itembucket = (ItemBucket) itemstack.getItem(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); ++ ++ // CraftBukkit start ++ World world = isourceblock.i(); ++ int x = blockposition.getX(); ++ int y = blockposition.getY(); ++ int z = blockposition.getZ(); ++ if (world.isEmpty(blockposition) || !world.getType(blockposition).getBlock().getMaterial().isBuildable()) { ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); ++ } ++ // CraftBukkit end + + if (itembucket.a(isourceblock.i(), blockposition)) { +- itemstack.setItem(Items.BUCKET); +- itemstack.count = 1; ++ // CraftBukkit start - Handle stacked buckets ++ Item item = Items.BUCKET; ++ if (--itemstack.count == 0) { ++ itemstack.setItem(Items.BUCKET); ++ itemstack.count = 1; ++ } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { ++ this.b.a(isourceblock, new ItemStack(item)); ++ } ++ // CraftBukkit end + return itemstack; + } else { + return this.b.a(isourceblock, itemstack); diff --git a/nms-patches/DispenseBehaviorFireball.patch b/nms-patches/DispenseBehaviorFireball.patch new file mode 100644 index 00000000..1d21873f --- /dev/null +++ b/nms-patches/DispenseBehaviorFireball.patch @@ -0,0 +1,55 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorFireball.java 2014-11-27 08:59:46.637422129 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorFireball.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,11 @@ + + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorFireball extends DispenseBehaviorItem { + + DispenseBehaviorFireball() {} +@@ -18,8 +23,38 @@ + double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY(); + double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ(); + +- world.addEntity(new EntitySmallFireball(world, d0, d1, d2, d3, d4, d5)); +- itemstack.a(1); ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ EntitySmallFireball entitysmallfireball = new EntitySmallFireball(world, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); ++ entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); ++ ++ world.addEntity(entitysmallfireball); ++ // itemstack.a(1); // Handled during event processing ++ // CraftBukkit end + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorFlintAndSteel.patch b/nms-patches/DispenseBehaviorFlintAndSteel.patch new file mode 100644 index 00000000..26ab2df0 --- /dev/null +++ b/nms-patches/DispenseBehaviorFlintAndSteel.patch @@ -0,0 +1,57 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorFlintAndSteel.java 2014-11-27 08:59:46.641422111 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorFlintAndSteel extends DispenseBehaviorItem { + + private boolean b = true; +@@ -10,11 +15,39 @@ + World world = isourceblock.i(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); + +- if (world.isEmpty(blockposition)) { +- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); +- if (itemstack.isDamaged(1, world.random)) { +- itemstack.count = 0; ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ // CraftBukkit end ++ ++ if (world.isEmpty(blockposition)) { ++ // CraftBukkit start - Ignition by dispensing flint and steel ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()).isCancelled()) { ++ world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ if (itemstack.isDamaged(1, world.random)) { ++ itemstack.count = 0; ++ } + } ++ // CraftBukkit end + } else if (world.getType(blockposition).getBlock() == Blocks.TNT) { + Blocks.TNT.postBreak(world, blockposition, Blocks.TNT.getBlockData().set(BlockTNT.EXPLODE, Boolean.valueOf(true))); + world.setAir(blockposition); diff --git a/nms-patches/DispenseBehaviorItem.patch b/nms-patches/DispenseBehaviorItem.patch new file mode 100644 index 00000000..b902b835 --- /dev/null +++ b/nms-patches/DispenseBehaviorItem.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorItem.java 2014-11-27 08:59:46.641422111 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorItem.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + public class DispenseBehaviorItem implements IDispenseBehavior { + + public DispenseBehaviorItem() {} +@@ -17,11 +22,18 @@ + IPosition iposition = BlockDispenser.a(isourceblock); + ItemStack itemstack1 = itemstack.a(1); + +- a(isourceblock.i(), itemstack1, 6, enumdirection, iposition); ++ // CraftBukkit start ++ if (!a(isourceblock.i(), itemstack1, 6, enumdirection, isourceblock)) { ++ itemstack.count++; ++ } ++ // CraftBukkit end + return itemstack; + } + +- public static void a(World world, ItemStack itemstack, int i, EnumDirection enumdirection, IPosition iposition) { ++ // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument ++ public static boolean a(World world, ItemStack itemstack, int i, EnumDirection enumdirection, ISourceBlock isourceblock) { ++ IPosition iposition = BlockDispenser.a(isourceblock); ++ // CraftBukkit end + double d0 = iposition.getX(); + double d1 = iposition.getY(); + double d2 = iposition.getZ(); +@@ -41,7 +53,41 @@ + entityitem.motX += world.random.nextGaussian() * 0.007499999832361937D * (double) i; + entityitem.motY += world.random.nextGaussian() * 0.007499999832361937D * (double) i; + entityitem.motZ += world.random.nextGaussian() * 0.007499999832361937D * (double) i; ++ ++ // CraftBukkit start ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motX, entityitem.motY, entityitem.motZ)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ entityitem.setItemStack(CraftItemStack.asNMSCopy(event.getItem())); ++ entityitem.motX = event.getVelocity().getX(); ++ entityitem.motY = event.getVelocity().getY(); ++ entityitem.motZ = event.getVelocity().getZ(); ++ ++ if (!event.getItem().equals(craftItem)) { ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior.getClass() != DispenseBehaviorItem.class) { ++ idispensebehavior.a(isourceblock, eventStack); ++ } else { ++ world.addEntity(entityitem); ++ } ++ return false; ++ } ++ + world.addEntity(entityitem); ++ ++ return true; ++ // CraftBukkit end + } + + protected void a(ISourceBlock isourceblock) { diff --git a/nms-patches/DispenseBehaviorMinecart.patch b/nms-patches/DispenseBehaviorMinecart.patch new file mode 100644 index 00000000..454c15b7 --- /dev/null +++ b/nms-patches/DispenseBehaviorMinecart.patch @@ -0,0 +1,58 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorMinecart.java 2014-11-27 08:59:46.641422111 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorMinecart extends DispenseBehaviorItem { + + private final DispenseBehaviorItem b = new DispenseBehaviorItem(); +@@ -38,14 +43,42 @@ + } + } + +- EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, d0, d1 + d3, d2, ItemMinecart.a((ItemMinecart) itemstack.getItem())); ++ // CraftBukkit start ++ // EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, d0, d1 + d3, d2, ItemMinecart.a((ItemMinecart) itemstack.getItem())); ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block2 = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); ++ EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), ItemMinecart.a((ItemMinecart) itemstack1.getItem())); + + if (itemstack.hasName()) { + entityminecartabstract.setCustomName(itemstack.getName()); + } + + world.addEntity(entityminecartabstract); +- itemstack.a(1); ++ // itemstack.a(1); // CraftBukkit - handled during event processing + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorMonsterEgg.patch b/nms-patches/DispenseBehaviorMonsterEgg.patch new file mode 100644 index 00000000..56a05a54 --- /dev/null +++ b/nms-patches/DispenseBehaviorMonsterEgg.patch @@ -0,0 +1,61 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorMonsterEgg.java 2014-11-27 08:59:46.645422093 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java 2014-11-27 08:42:10.096851020 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorMonsterEgg extends DispenseBehaviorItem { + + DispenseBehaviorMonsterEgg() {} +@@ -9,13 +14,45 @@ + double d0 = isourceblock.getX() + (double) enumdirection.getAdjacentX(); + double d1 = (double) ((float) isourceblock.getBlockPosition().getY() + 0.2F); + double d2 = isourceblock.getZ() + (double) enumdirection.getAdjacentZ(); +- Entity entity = ItemMonsterEgg.a(isourceblock.i(), itemstack.getData(), d0, d1, d2); ++ // Entity entity = ItemMonsterEgg.a(isourceblock.i(), itemstack.getData(), d0, d1, d2); ++ ++ // CraftBukkit start ++ World world = isourceblock.i(); ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); ++ ++ Entity entity = ItemMonsterEgg.spawnCreature(isourceblock.i(), itemstack.getData(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG); + + if (entity instanceof EntityLiving && itemstack.hasName()) { + ((EntityInsentient) entity).setCustomName(itemstack.getName()); + } + +- itemstack.a(1); ++ // itemstack.a(1); // Handled during event processing ++ // CraftBukkit end + return itemstack; + } + } diff --git a/nms-patches/DispenseBehaviorProjectile.patch b/nms-patches/DispenseBehaviorProjectile.patch new file mode 100644 index 00000000..b4e7083b --- /dev/null +++ b/nms-patches/DispenseBehaviorProjectile.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorProjectile.java 2014-11-27 08:59:46.645422093 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + public abstract class DispenseBehaviorProjectile extends DispenseBehaviorItem { + + public DispenseBehaviorProjectile() {} +@@ -10,9 +15,38 @@ + EnumDirection enumdirection = BlockDispenser.b(isourceblock.f()); + IProjectile iprojectile = this.a(world, iposition); + +- iprojectile.shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), this.b(), this.a()); ++ // iprojectile.shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), this.b(), this.a()); ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ())); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.b(), this.a()); ++ ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); ++ // CraftBukkit end + world.addEntity((Entity) iprojectile); +- itemstack.a(1); ++ // itemstack.a(1); // CraftBukkit - Handled during event processing + return itemstack; + } + diff --git a/nms-patches/DispenseBehaviorTNT.patch b/nms-patches/DispenseBehaviorTNT.patch new file mode 100644 index 00000000..1dd1d42c --- /dev/null +++ b/nms-patches/DispenseBehaviorTNT.patch @@ -0,0 +1,56 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/DispenseBehaviorTNT.java 2014-11-27 08:59:46.645422093 +1100 ++++ src/main/java/net/minecraft/server/DispenseBehaviorTNT.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.block.BlockDispenseEvent; ++// CraftBukkit end ++ + final class DispenseBehaviorTNT extends DispenseBehaviorItem { + + DispenseBehaviorTNT() {} +@@ -7,11 +12,40 @@ + protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { + World world = isourceblock.i(); + BlockPosition blockposition = isourceblock.getBlockPosition().shift(BlockDispenser.b(isourceblock.f())); +- EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); ++ // EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY(), (double) blockposition.getZ() + 0.5D, (EntityLiving) null); ++ ++ // CraftBukkit start ++ ItemStack itemstack1 = itemstack.a(1); ++ org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockPosition().getX(), isourceblock.getBlockPosition().getY(), isourceblock.getBlockPosition().getZ()); ++ CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); ++ ++ BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(blockposition.getX() + 0.5, blockposition.getY() + 0.5, blockposition.getZ() + 0.5)); ++ if (!BlockDispenser.eventFired) { ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ itemstack.count++; ++ return itemstack; ++ } ++ ++ if (!event.getItem().equals(craftItem)) { ++ itemstack.count++; ++ // Chain to handler for new item ++ ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); ++ IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.M.get(eventStack.getItem()); ++ if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { ++ idispensebehavior.a(isourceblock, eventStack); ++ return itemstack; ++ } ++ } ++ ++ EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLiving) null); ++ // CraftBukkit end + + world.addEntity(entitytntprimed); + world.makeSound(entitytntprimed, "game.tnt.primed", 1.0F, 1.0F); +- --itemstack.count; ++ // --itemstack.count; // CraftBukkit - handled above + return itemstack; + } + } diff --git a/nms-patches/Enchantment.patch b/nms-patches/Enchantment.patch new file mode 100644 index 00000000..8b09c515 --- /dev/null +++ b/nms-patches/Enchantment.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Enchantment.java 2014-11-27 08:59:46.649422075 +1100 ++++ src/main/java/net/minecraft/server/Enchantment.java 2014-11-27 08:42:10.096851020 +1100 +@@ -8,6 +8,7 @@ + + public abstract class Enchantment { + ++ // CraftBukkit - update CraftEnchant.getName(i) if this changes + private static final Enchantment[] byId = new Enchantment[256]; + public static final Enchantment[] b; + private static final Map E = Maps.newHashMap(); +@@ -55,6 +56,8 @@ + Enchantment.byId[i] = this; + Enchantment.E.put(minecraftkey, this); + } ++ ++ org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment(this)); // CraftBukkit + } + + public static Enchantment getByName(String s) { diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch new file mode 100644 index 00000000..95a7509b --- /dev/null +++ b/nms-patches/Entity.patch @@ -0,0 +1,578 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Entity.java 2014-11-27 08:59:46.697421864 +1100 ++++ src/main/java/net/minecraft/server/Entity.java 2014-11-27 08:42:10.176850864 +1100 +@@ -6,8 +6,40 @@ + import java.util.UUID; + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.Location; ++import org.bukkit.Server; ++import org.bukkit.TravelAgent; ++import org.bukkit.block.BlockFace; ++import org.bukkit.entity.Hanging; ++import org.bukkit.entity.LivingEntity; ++import org.bukkit.entity.Painting; ++import org.bukkit.entity.Vehicle; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.hanging.HangingBreakByEntityEvent; ++import org.bukkit.event.painting.PaintingBreakByEntityEvent; ++import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; ++import org.bukkit.event.vehicle.VehicleEnterEvent; ++import org.bukkit.event.vehicle.VehicleExitEvent; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.entity.CraftEntity; ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityCombustEvent; ++import org.bukkit.event.entity.EntityPortalEvent; ++import org.bukkit.plugin.PluginManager; ++// CraftBukkit end ++ + public abstract class Entity implements ICommandListener { + ++ // CraftBukkit start ++ private static final int CURRENT_LEVEL = 2; ++ static boolean isLevelAtLeast(NBTTagCompound tag, int level) { ++ return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; ++ } ++ // CraftBukikt end ++ + private static final AxisAlignedBB a = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); + private static int entityCount; + private int id; +@@ -77,6 +109,8 @@ + private boolean invulnerable; + public UUID uniqueID; + private final CommandObjectiveExecutor as; ++ public boolean valid; // CraftBukkit ++ public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only + + public int getId() { + return this.id; +@@ -150,6 +184,33 @@ + } + + protected void setYawPitch(float f, float f1) { ++ // CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0 ++ if (Float.isNaN(f)) { ++ f = 0; ++ } ++ ++ if (f == Float.POSITIVE_INFINITY || f == Float.NEGATIVE_INFINITY) { ++ if (this instanceof EntityPlayer) { ++ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid yaw"); ++ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); ++ } ++ f = 0; ++ } ++ ++ // pitch was sometimes set to NaN, so we need to set it back to 0 ++ if (Float.isNaN(f1)) { ++ f1 = 0; ++ } ++ ++ if (f1 == Float.POSITIVE_INFINITY || f1 == Float.NEGATIVE_INFINITY) { ++ if (this instanceof EntityPlayer) { ++ this.world.getServer().getLogger().warning(this.getName() + " was caught trying to crash the server with an invalid pitch"); ++ ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); ++ } ++ f1 = 0; ++ } ++ // CraftBukkit end ++ + this.yaw = f % 360.0F; + this.pitch = f1 % 360.0F; + } +@@ -186,7 +247,7 @@ + int i = this.L(); + + if (this.ak) { +- if (minecraftserver.getAllowNether()) { ++ if (true || minecraftserver.getAllowNether()) { // CraftBukkit + if (this.vehicle == null && this.al++ >= i) { + this.al = i; + this.portalCooldown = this.ar(); +@@ -263,6 +324,27 @@ + protected void burnFromLava() { + if (!this.fireProof) { + this.damageEntity(DamageSource.LAVA, 4.0F); ++ ++ // CraftBukkit start - Fallen in lava TODO: this event spams! ++ if (this instanceof EntityLiving) { ++ if (fireTicks <= 0) { ++ // not on fire yet ++ // TODO: shouldn't be sending null for the block ++ org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k); ++ org.bukkit.entity.Entity damagee = this.getBukkitEntity(); ++ EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15); ++ this.world.getServer().getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ this.setOnFire(combustEvent.getDuration()); ++ } ++ } else { ++ // This will be called every single tick the entity is in lava, so don't throw an event ++ this.setOnFire(15); ++ } ++ return; ++ } ++ // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls + this.setOnFire(15); + } + } +@@ -300,6 +382,22 @@ + this.a(this.getBoundingBox().c(d0, d1, d2)); + this.recalcPosition(); + } else { ++ // CraftBukkit start - Don't do anything if we aren't moving ++ // We need to do this regardless of whether or not we are moving thanks to portals ++ try { ++ this.checkBlockCollisions(); ++ } catch (Throwable throwable) { ++ CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); ++ CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); ++ ++ this.appendEntityCrashDetails(crashreportsystemdetails); ++ throw new ReportedException(crashreport); ++ } ++ // Check if we're moving ++ if (d0 == 0 && d1 == 0 && d2 == 0 && this.vehicle == null && this.passenger == null) { ++ return; ++ } ++ // CraftBukkit end + this.world.methodProfiler.a("move"); + double d3 = this.locX; + double d4 = this.locY; +@@ -520,6 +618,28 @@ + block.a(this.world, this); + } + ++ // CraftBukkit start ++ if (positionChanged && getBukkitEntity() instanceof Vehicle) { ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.block.Block bl = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY - (double) this.getHeadHeight()), MathHelper.floor(this.locZ)); ++ ++ // PAIL: using local vars may break between updates, name them above? ++ ++ if (d6 > d0) { ++ bl = bl.getRelative(BlockFace.EAST); ++ } else if (d6 < d0) { ++ bl = bl.getRelative(BlockFace.WEST); ++ } else if (d8 > d2) { ++ bl = bl.getRelative(BlockFace.SOUTH); ++ } else if (d8 < d2) { ++ bl = bl.getRelative(BlockFace.NORTH); ++ } ++ ++ VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, bl); ++ world.getServer().getPluginManager().callEvent(event); ++ } ++ // CraftBukkit end ++ + if (this.r_() && !flag && this.vehicle == null) { + double d21 = this.locX - d3; + double d22 = this.locY - d4; +@@ -530,7 +650,7 @@ + } + + if (block != null && this.onGround) { +- block.a(this.world, blockposition, this); ++ // block.a(this.world, blockposition, this); // CraftBukkit removed down + } + + this.M = (float) ((double) this.M + (double) MathHelper.sqrt(d21 * d21 + d23 * d23) * 0.6D); +@@ -548,9 +668,12 @@ + } + + this.a(blockposition, block); ++ block.a(this.world, blockposition, this); // CraftBukkit - moved from above + } + } + ++ // CraftBukkit start - Move to the top of the method ++ /* + try { + this.checkBlockCollisions(); + } catch (Throwable throwable) { +@@ -560,6 +683,8 @@ + this.appendEntityCrashDetails(crashreportsystemdetails); + throw new ReportedException(crashreport); + } ++ */ ++ // CraftBukkit end + + boolean flag2 = this.U(); + +@@ -567,7 +692,16 @@ + this.burn(1); + if (!flag2) { + ++this.fireTicks; +- if (this.fireTicks == 0) { ++ // CraftBukkit start - Not on fire yet ++ if (this.fireTicks <= 0) { // Only throw events on the first combust, otherwise it spams ++ EntityCombustEvent event = new EntityCombustEvent(getBukkitEntity(), 8); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ setOnFire(event.getDuration()); ++ } ++ } else { ++ // CraftBukkit end + this.setOnFire(8); + } + } +@@ -673,7 +807,7 @@ + return null; + } + +- protected void burn(int i) { ++ protected void burn(float i) { // CraftBukkit - int -> float + if (!this.fireProof) { + this.damageEntity(DamageSource.FIRE, (float) i); + } +@@ -823,6 +957,13 @@ + } + + public void spawnIn(World world) { ++ // CraftBukkit start ++ if (world == null) { ++ die(); ++ this.world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); ++ return; ++ } ++ // CraftBukkit end + this.world = world; + } + +@@ -1015,6 +1156,18 @@ + try { + nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY, this.locZ})); + nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ})); ++ ++ // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero ++ // TODO: make sure this is the best way to address this. ++ if (Float.isNaN(this.yaw)) { ++ this.yaw = 0; ++ } ++ ++ if (Float.isNaN(this.pitch)) { ++ this.pitch = 0; ++ } ++ // CraftBukkit end ++ + nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch})); + nbttagcompound.setFloat("FallDistance", this.fallDistance); + nbttagcompound.setShort("Fire", (short) this.fireTicks); +@@ -1025,6 +1178,11 @@ + nbttagcompound.setInt("PortalCooldown", this.portalCooldown); + nbttagcompound.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits()); + nbttagcompound.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits()); ++ // CraftBukkit start ++ nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); ++ nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); ++ nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL); ++ // CraftBukkit end + if (this.getCustomName() != null && this.getCustomName().length() > 0) { + nbttagcompound.setString("CustomName", this.getCustomName()); + nbttagcompound.setBoolean("CustomNameVisible", this.getCustomNameVisible()); +@@ -1062,6 +1220,7 @@ + this.motX = nbttaglist1.d(0); + this.motY = nbttaglist1.d(1); + this.motZ = nbttaglist1.d(2); ++ /* CraftBukkit start - Moved section down + if (Math.abs(this.motX) > 10.0D) { + this.motX = 0.0D; + } +@@ -1073,6 +1232,7 @@ + if (Math.abs(this.motZ) > 10.0D) { + this.motZ = 0.0D; + } ++ // CraftBukkit end */ + + this.lastX = this.P = this.locX = nbttaglist.d(0); + this.lastY = this.Q = this.locY = nbttaglist.d(1); +@@ -1105,7 +1265,57 @@ + if (this.af()) { + this.setPosition(this.locX, this.locY, this.locZ); + } ++ // CraftBukkit start ++ if (this instanceof EntityLiving) { ++ EntityLiving entity = (EntityLiving) this; ++ ++ // Reset the persistence for tamed animals ++ if (entity instanceof EntityTameableAnimal && !isLevelAtLeast(nbttagcompound, 2) && !nbttagcompound.getBoolean("PersistenceRequired")) { ++ EntityInsentient entityinsentient = (EntityInsentient) entity; ++ entityinsentient.persistent = !entityinsentient.isTypeNotPersistent(); ++ } ++ } ++ // CraftBukkit end ++ ++ // CraftBukkit start - Exempt Vehicles from notch's sanity check ++ if (!(getBukkitEntity() instanceof Vehicle)) { ++ if (Math.abs(this.motX) > 10.0D) { ++ this.motX = 0.0D; ++ } ++ ++ if (Math.abs(this.motY) > 10.0D) { ++ this.motY = 0.0D; ++ } ++ ++ if (Math.abs(this.motZ) > 10.0D) { ++ this.motZ = 0.0D; ++ } ++ } ++ // CraftBukkit end ++ ++ // CraftBukkit start - Reset world ++ if (this instanceof EntityPlayer) { ++ Server server = Bukkit.getServer(); ++ org.bukkit.World bworld = null; + ++ // TODO: Remove World related checks, replaced with WorldUID ++ String worldName = nbttagcompound.getString("world"); ++ ++ if (nbttagcompound.hasKey("WorldUUIDMost") && nbttagcompound.hasKey("WorldUUIDLeast")) { ++ UUID uid = new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast")); ++ bworld = server.getWorld(uid); ++ } else { ++ bworld = server.getWorld(worldName); ++ } ++ ++ if (bworld == null) { ++ EntityPlayer entityPlayer = (EntityPlayer) this; ++ bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); ++ } ++ ++ spawnIn(bworld == null? null : ((CraftWorld) bworld).getHandle()); ++ } ++ // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded"); +@@ -1167,6 +1377,12 @@ + + public EntityItem a(ItemStack itemstack, float f) { + if (itemstack.count != 0 && itemstack.getItem() != null) { ++ // CraftBukkit start - Capture drops for death event ++ if (this instanceof EntityLiving && ((EntityLiving) this).drops != null) { ++ ((EntityLiving) this).drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); ++ return null; ++ } ++ // CraftBukkit end + EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack); + + entityitem.p(); +@@ -1276,16 +1492,76 @@ + } + + public void mount(Entity entity) { ++ // CraftBukkit start ++ setPassengerOf(entity); ++ } ++ ++ protected CraftEntity bukkitEntity; ++ ++ public CraftEntity getBukkitEntity() { ++ if (bukkitEntity == null) { ++ bukkitEntity = CraftEntity.getEntity(world.getServer(), this); ++ } ++ return bukkitEntity; ++ } ++ ++ public void setPassengerOf(Entity entity) { ++ // b(null) doesn't really fly for overloaded methods, ++ // so this method is needed ++ ++ Entity originalVehicle = this.vehicle; ++ Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger; ++ PluginManager pluginManager = Bukkit.getPluginManager(); ++ getBukkitEntity(); // make sure bukkitEntity is initialised ++ // CraftBukkit end + this.ap = 0.0D; + this.aq = 0.0D; + if (entity == null) { + if (this.vehicle != null) { ++ // CraftBukkit start ++ if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { ++ VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); ++ pluginManager.callEvent(event); ++ ++ if (event.isCancelled() || vehicle != originalVehicle) { ++ return; ++ } ++ } ++ // CraftBukkit end + this.setPositionRotation(this.vehicle.locX, this.vehicle.getBoundingBox().b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); + this.vehicle.passenger = null; + } + + this.vehicle = null; + } else { ++ // CraftBukkit start ++ if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4, true)) { ++ // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are. ++ VehicleExitEvent exitEvent = null; ++ if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) { ++ exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); ++ pluginManager.callEvent(exitEvent); ++ ++ if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { ++ return; ++ } ++ } ++ ++ VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity); ++ pluginManager.callEvent(event); ++ ++ // If a plugin messes with the vehicle or the vehicle's passenger ++ if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { ++ // If we only cancelled the enterevent then we need to put the player in a decent position. ++ if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) { ++ this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); ++ this.vehicle.passenger = null; ++ this.vehicle = null; ++ } ++ return; ++ } ++ } ++ // CraftBukkit end + if (this.vehicle != null) { + this.vehicle.passenger = null; + } +@@ -1406,10 +1682,50 @@ + } + + public void onLightningStrike(EntityLightning entitylightning) { +- this.damageEntity(DamageSource.LIGHTNING, 5.0F); ++ // CraftBukkit start ++ final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity(); ++ final org.bukkit.entity.Entity stormBukkitEntity = entitylightning.getBukkitEntity(); ++ final PluginManager pluginManager = Bukkit.getPluginManager(); ++ ++ if (thisBukkitEntity instanceof Hanging) { ++ HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity); ++ PaintingBreakByEntityEvent paintingEvent = null; ++ ++ if (thisBukkitEntity instanceof Painting) { ++ paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity); ++ } ++ ++ pluginManager.callEvent(hangingEvent); ++ ++ if (paintingEvent != null) { ++ paintingEvent.setCancelled(hangingEvent.isCancelled()); ++ pluginManager.callEvent(paintingEvent); ++ } ++ ++ if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return; ++ } ++ } ++ ++ if (this.fireProof) { ++ return; ++ } ++ CraftEventFactory.entityDamage = entitylightning; ++ if (!this.damageEntity(DamageSource.LIGHTNING, 5.0F)) { ++ CraftEventFactory.entityDamage = null; ++ return; ++ } ++ // CraftBukkit end + ++this.fireTicks; + if (this.fireTicks == 0) { + this.setOnFire(8); ++ // CraftBukkit start - Call a combust event when lightning strikes ++ EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8); ++ pluginManager.callEvent(entityCombustEvent); ++ if (!entityCombustEvent.isCancelled()) { ++ this.setOnFire(entityCombustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + + } +@@ -1546,32 +1862,78 @@ + if (!this.world.isStatic && !this.dead) { + this.world.methodProfiler.a("changeDimension"); + MinecraftServer minecraftserver = MinecraftServer.getServer(); +- int j = this.dimension; +- WorldServer worldserver = minecraftserver.getWorldServer(j); +- WorldServer worldserver1 = minecraftserver.getWorldServer(i); ++ // CraftBukkit start - Move logic into new function "teleportToLocation" ++ // int j = this.dimension; ++ // WorldServer worldserver = minecraftserver.getWorldServer(j); ++ // WorldServer worldserver1 = minecraftserver.getWorldServer(i); ++ WorldServer exitWorld = null; ++ if (this.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // Plugins must specify exit from custom Bukkit worlds ++ // Only target existing worlds (compensate for allow-nether/allow-end as false) ++ for (WorldServer world : minecraftserver.worlds) { ++ if (world.dimension == i) { ++ exitWorld = world; ++ } ++ } ++ } ++ ++ Location enter = this.getBukkitEntity().getLocation(); ++ Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null; ++ boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END ++ ++ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins ++ EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent); ++ event.useTravelAgent(useTravelAgent); ++ event.getEntity().getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { ++ return; ++ } ++ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); ++ this.teleportTo(exit, true); ++ } ++ } ++ ++ public void teleportTo(Location exit, boolean portal) { ++ if (true) { ++ WorldServer worldserver = ((CraftWorld) getBukkitEntity().getLocation().getWorld()).getHandle(); ++ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); ++ int i = worldserver1.dimension; ++ // CraftBukkit end + + this.dimension = i; ++ /* CraftBukkit start - TODO: Check if we need this + if (j == 1 && i == 1) { + worldserver1 = minecraftserver.getWorldServer(0); + this.dimension = 0; + } ++ // CraftBukkit end */ + + this.world.kill(this); + this.dead = false; + this.world.methodProfiler.a("reposition"); +- minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); ++ // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create ++ // minecraftserver.getPlayerList().changeWorld(this, j, worldserver, worldserver1); ++ boolean before = worldserver1.chunkProviderServer.forceChunkLoad; ++ worldserver1.chunkProviderServer.forceChunkLoad = true; ++ worldserver1.getMinecraftServer().getPlayerList().repositionEntity(this, exit, portal); ++ worldserver1.chunkProviderServer.forceChunkLoad = before; ++ // CraftBukkit end + this.world.methodProfiler.c("reloading"); + Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); + + if (entity != null) { + entity.n(this); ++ /* CraftBukkit start - We need to do this... + if (j == 1 && i == 1) { + BlockPosition blockposition = this.world.r(worldserver1.getSpawn()); + + entity.setPositionRotation(blockposition, entity.yaw, entity.pitch); + } +- ++ // CraftBukkit end */ + worldserver1.addEntity(entity); ++ // CraftBukkit start - Forward the CraftEntity to the new entity ++ this.getBukkitEntity().setHandle(entity); ++ entity.bukkitEntity = this.getBukkitEntity(); ++ // CraftBukkit end + } + + this.dead = true; diff --git a/nms-patches/EntityAgeable.patch b/nms-patches/EntityAgeable.patch new file mode 100644 index 00000000..f1fe109b --- /dev/null +++ b/nms-patches/EntityAgeable.patch @@ -0,0 +1,48 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityAgeable.java 2014-11-27 08:59:46.649422075 +1100 ++++ src/main/java/net/minecraft/server/EntityAgeable.java 2014-11-27 08:42:10.144850927 +1100 +@@ -7,6 +7,7 @@ + protected int c; + private float bk = -1.0F; + private float bl; ++ public boolean ageLocked = false; // CraftBukkit + + public EntityAgeable(World world) { + super(world); +@@ -27,14 +28,14 @@ + if (entityageable != null) { + entityageable.setAgeRaw(-24000); + entityageable.setPositionRotation(this.locX, this.locY, this.locZ, 0.0F, 0.0F); +- this.world.addEntity(entityageable); ++ this.world.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit + if (itemstack.hasName()) { + entityageable.setCustomName(itemstack.getName()); + } + + if (!entityhuman.abilities.canInstantlyBuild) { + --itemstack.count; +- if (itemstack.count <= 0) { ++ if (itemstack.count == 0) { // CraftBukkit - allow less than 0 stacks as "infinite" + entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); + } + } +@@ -99,17 +100,19 @@ + super.b(nbttagcompound); + nbttagcompound.setInt("Age", this.getAge()); + nbttagcompound.setInt("ForcedAge", this.b); ++ nbttagcompound.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit + } + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + this.setAgeRaw(nbttagcompound.getInt("Age")); + this.b = nbttagcompound.getInt("ForcedAge"); ++ this.ageLocked = nbttagcompound.getBoolean("AgeLocked"); // CraftBukkit + } + + public void m() { + super.m(); +- if (this.world.isStatic) { ++ if (this.world.isStatic || ageLocked) { // CraftBukkit + if (this.c > 0) { + if (this.c % 4 == 0) { + this.world.addParticle(EnumParticle.VILLAGER_HAPPY, this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, this.locY + 0.5D + (double) (this.random.nextFloat() * this.length), this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, 0.0D, 0.0D, 0.0D, new int[0]); diff --git a/nms-patches/EntityArrow.patch b/nms-patches/EntityArrow.patch new file mode 100644 index 00000000..2912f97b --- /dev/null +++ b/nms-patches/EntityArrow.patch @@ -0,0 +1,106 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityArrow.java 2014-11-27 08:59:46.653422058 +1100 ++++ src/main/java/net/minecraft/server/EntityArrow.java 2014-11-27 08:42:10.100851012 +1100 +@@ -2,6 +2,12 @@ + + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.entity.LivingEntity; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.player.PlayerPickupItemEvent; ++// CraftBukkit end ++ + public class EntityArrow extends Entity implements IProjectile { + + private int d = -1; +@@ -35,6 +41,7 @@ + super(world); + this.j = 10.0D; + this.shooter = entityliving; ++ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + if (entityliving instanceof EntityHuman) { + this.fromPlayer = 1; + } +@@ -62,6 +69,7 @@ + super(world); + this.j = 10.0D; + this.shooter = entityliving; ++ this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + if (entityliving instanceof EntityHuman) { + this.fromPlayer = 1; + } +@@ -175,7 +183,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb1.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- double d1 = vec3d.f(movingobjectposition1.pos); ++ double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; +@@ -202,6 +210,8 @@ + float f4; + + if (movingobjectposition != null) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // CraftBukkit - Call event ++ + if (movingobjectposition.entity != null) { + f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); + int k = MathHelper.f((double) f2 * this.damage); +@@ -217,12 +227,20 @@ + } else { + damagesource = DamageSource.arrow(this, this.shooter); + } ++ ++ // CraftBukkit start - Moved damage call ++ if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { ++ if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman) && (!(movingobjectposition.entity instanceof EntityPlayer) || !(this.shooter instanceof EntityPlayer) || this.world.pvpMode)) { // CraftBukkit - abide by pvp setting if destination is a player ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); + +- if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman)) { +- movingobjectposition.entity.setOnFire(5); ++ if (!combustEvent.isCancelled()) { ++ movingobjectposition.entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + +- if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { ++ // if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { // CraftBukkit - moved up + if (movingobjectposition.entity instanceof EntityLiving) { + EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; + +@@ -382,6 +400,21 @@ + + public void d(EntityHuman entityhuman) { + if (!this.world.isStatic && this.inGround && this.shake <= 0) { ++ // CraftBukkit start ++ ItemStack itemstack = new ItemStack(Items.ARROW); ++ if (this.fromPlayer == 1 && entityhuman.inventory.canHold(itemstack) > 0) { ++ EntityItem item = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack); ++ ++ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.world.getServer(), this, item), 0); ++ // event.setCancelled(!entityhuman.canPickUpLoot); TODO ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end ++ + boolean flag = this.fromPlayer == 1 || this.fromPlayer == 2 && entityhuman.abilities.canInstantlyBuild; + + if (this.fromPlayer == 1 && !entityhuman.inventory.pickup(new ItemStack(Items.ARROW, 1))) { +@@ -433,4 +466,10 @@ + + return (b0 & 1) != 0; + } ++ ++ // CraftBukkit start ++ public boolean isInGround() { ++ return inGround; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityBoat.patch b/nms-patches/EntityBoat.patch new file mode 100644 index 00000000..6ab202bf --- /dev/null +++ b/nms-patches/EntityBoat.patch @@ -0,0 +1,249 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityBoat.java 2014-11-27 08:59:46.653422058 +1100 ++++ src/main/java/net/minecraft/server/EntityBoat.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,16 @@ + + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.entity.Vehicle; ++import org.bukkit.event.vehicle.VehicleDamageEvent; ++import org.bukkit.event.vehicle.VehicleDestroyEvent; ++import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; ++import org.bukkit.event.vehicle.VehicleMoveEvent; ++// CraftBukkit end ++ + public class EntityBoat extends Entity { + + private boolean a; +@@ -12,6 +22,27 @@ + private double f; + private double g; + private double h; ++ ++ // CraftBukkit start ++ public double maxSpeed = 0.4D; ++ public double occupiedDeceleration = 0.2D; ++ public double unoccupiedDeceleration = -1; ++ public boolean landBoats = false; ++ ++ @Override ++ public void collide(Entity entity) { ++ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); ++ ++ VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), hitEntity); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ super.collide(entity); ++ } ++ // CraftBukkit end + + public EntityBoat(World world) { + super(world); +@@ -52,6 +83,8 @@ + this.lastX = d0; + this.lastY = d1; + this.lastZ = d2; ++ ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit + } + + public double an() { +@@ -65,6 +98,19 @@ + if (this.passenger != null && this.passenger == damagesource.getEntity() && damagesource instanceof EntityDamageSourceIndirect) { + return false; + } else { ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.entity.Entity attacker = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); ++ ++ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, (double) f); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return true; ++ } ++ // f = event.getDamage(); // TODO Why don't we do this? ++ // CraftBukkit end ++ + this.b(-this.m()); + this.a(10); + this.setDamage(this.j() + f * 10.0F); +@@ -72,6 +118,15 @@ + boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; + + if (flag || this.j() > 40.0F) { ++ // CraftBukkit start ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ ++ if (destroyEvent.isCancelled()) { ++ this.setDamage(40F); // Maximize damage so this doesn't get triggered again right away ++ return true; ++ } ++ // CraftBukkit end + if (this.passenger != null) { + this.passenger.mount(this); + } +@@ -95,6 +150,13 @@ + } + + public void s_() { ++ // CraftBukkit start ++ double prevX = this.locX; ++ double prevY = this.locY; ++ double prevZ = this.locZ; ++ float prevYaw = this.yaw; ++ float prevPitch = this.pitch; ++ // CraftBukkit end + super.s_(); + if (this.l() > 0) { + this.a(this.l() - 1); +@@ -196,6 +258,19 @@ + this.motX += -Math.sin((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.aY * 0.05000000074505806D; + this.motZ += Math.cos((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.aY * 0.05000000074505806D; + } ++ // CraftBukkit start - Support unoccupied deceleration ++ else if (unoccupiedDeceleration >= 0) { ++ this.motX *= unoccupiedDeceleration; ++ this.motZ *= unoccupiedDeceleration; ++ // Kill lingering speed ++ if (motX <= 0.00001) { ++ motX = 0; ++ } ++ if (motZ <= 0.00001) { ++ motZ = 0; ++ } ++ } ++ // CraftBukkit end + + d4 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); + if (d4 > 0.35D) { +@@ -230,16 +305,26 @@ + Block block = this.world.getType(blockposition).getBlock(); + + if (block == Blocks.SNOW_LAYER) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + this.world.setAir(blockposition); + this.positionChanged = false; + } else if (block == Blocks.WATERLILY) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + this.world.setAir(blockposition, true); + this.positionChanged = false; + } + } + } + +- if (this.onGround) { ++ if (this.onGround && !this.landBoats) { // CraftBukkit + this.motX *= 0.5D; + this.motY *= 0.5D; + this.motZ *= 0.5D; +@@ -247,16 +332,23 @@ + + this.move(this.motX, this.motY, this.motZ); + if (this.positionChanged && d3 > 0.2D) { +- if (!this.world.isStatic && !this.dead) { +- this.die(); ++ if (!this.world.isStatic && !this.dead) { ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ if (!destroyEvent.isCancelled()) { ++ this.die(); + +- for (k = 0; k < 3; ++k) { +- this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); +- } ++ for (k = 0; k < 3; ++k) { ++ this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); ++ } + +- for (k = 0; k < 2; ++k) { +- this.a(Items.STICK, 1, 0.0F); ++ for (k = 0; k < 2; ++k) { ++ this.a(Items.STICK, 1, 0.0F); ++ } + } ++ // CraftBukkit end + } + } else { + this.motX *= 0.9900000095367432D; +@@ -284,6 +376,23 @@ + + this.yaw = (float) ((double) this.yaw + d12); + this.setYawPitch(this.yaw, this.pitch); ++ ++ // CraftBukkit start ++ org.bukkit.Server server = this.world.getServer(); ++ org.bukkit.World bworld = this.world.getWorld(); ++ ++ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); ++ Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ ++ server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); ++ ++ if (!from.equals(to)) { ++ VehicleMoveEvent event = new VehicleMoveEvent(vehicle, from, to); ++ server.getPluginManager().callEvent(event); ++ } ++ // CraftBukkit end ++ + if (!this.world.isStatic) { + List list = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); + +@@ -298,6 +407,7 @@ + } + + if (this.passenger != null && this.passenger.dead) { ++ this.passenger.vehicle = null; // CraftBukkit + this.passenger = null; + } + +@@ -335,17 +445,24 @@ + if (this.fallDistance > 3.0F) { + this.e(this.fallDistance, 1.0F); + if (!this.world.isStatic && !this.dead) { +- this.die(); ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ if (!destroyEvent.isCancelled()) { ++ this.die(); + +- int i; ++ int i; + +- for (i = 0; i < 3; ++i) { +- this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); +- } ++ for (i = 0; i < 3; ++i) { ++ this.a(Item.getItemOf(Blocks.PLANKS), 1, 0.0F); ++ } + +- for (i = 0; i < 2; ++i) { +- this.a(Items.STICK, 1, 0.0F); ++ for (i = 0; i < 2; ++i) { ++ this.a(Items.STICK, 1, 0.0F); ++ } + } ++ // CraftBukkit end + } + + this.fallDistance = 0.0F; diff --git a/nms-patches/EntityChicken.patch b/nms-patches/EntityChicken.patch new file mode 100644 index 00000000..07602829 --- /dev/null +++ b/nms-patches/EntityChicken.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityChicken.java 2014-11-27 08:59:46.657422040 +1100 ++++ src/main/java/net/minecraft/server/EntityChicken.java 2014-11-27 08:42:10.104851005 +1100 +@@ -35,6 +35,11 @@ + } + + public void m() { ++ // CraftBukkit start ++ if (this.isChickenJockey()) { ++ this.persistent = !this.isTypeNotPersistent(); ++ } ++ // CraftBukkit end + super.m(); + this.bo = this.bk; + this.bn = this.bm; diff --git a/nms-patches/EntityCow.patch b/nms-patches/EntityCow.patch new file mode 100644 index 00000000..c8aafbcc --- /dev/null +++ b/nms-patches/EntityCow.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityCow.java 2014-11-27 08:59:46.657422040 +1100 ++++ src/main/java/net/minecraft/server/EntityCow.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++// CraftBukkit end ++ + public class EntityCow extends EntityAnimal { + + public EntityCow(World world) { +@@ -69,13 +74,23 @@ + + public boolean a(EntityHuman entityhuman) { + ItemStack itemstack = entityhuman.inventory.getItemInHand(); +- ++ + if (itemstack != null && itemstack.getItem() == Items.BUCKET && !entityhuman.abilities.canInstantlyBuild) { +- if (itemstack.count-- == 1) { +- entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, new ItemStack(Items.MILK_BUCKET)); +- } else if (!entityhuman.inventory.pickup(new ItemStack(Items.MILK_BUCKET))) { +- entityhuman.drop(new ItemStack(Items.MILK_BUCKET, 1, 0), false); ++ // CraftBukkit start - Got milk? ++ org.bukkit.Location loc = this.getBukkitEntity().getLocation(); ++ org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), null, itemstack, Items.MILK_BUCKET); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ ItemStack result = CraftItemStack.asNMSCopy(event.getItemStack()); ++ if (--itemstack.count <= 0) { ++ entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, result); ++ } else if (!entityhuman.inventory.pickup(result)) { ++ entityhuman.drop(result, false); + } ++ // CraftBukkit end + + return true; + } else { diff --git a/nms-patches/EntityCreature.patch b/nms-patches/EntityCreature.patch new file mode 100644 index 00000000..f9d70d5e --- /dev/null +++ b/nms-patches/EntityCreature.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityCreature.java 2014-11-27 08:59:46.657422040 +1100 ++++ src/main/java/net/minecraft/server/EntityCreature.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,12 @@ + + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftEntity; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.event.entity.EntityUnleashEvent; ++// CraftBukkit end ++ + public abstract class EntityCreature extends EntityInsentient { + + public static final UUID bi = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); +@@ -69,6 +75,7 @@ + + if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) { + if (f > 10.0F) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit + this.unleash(true, true); + } + +@@ -100,6 +107,7 @@ + } + + if (f > 10.0F) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit + this.unleash(true, true); + } + } else if (!this.cb() && this.bk) { diff --git a/nms-patches/EntityCreeper.patch b/nms-patches/EntityCreeper.patch new file mode 100644 index 00000000..47e72258 --- /dev/null +++ b/nms-patches/EntityCreeper.patch @@ -0,0 +1,104 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityCreeper.java 2014-11-27 08:59:46.661422023 +1100 ++++ src/main/java/net/minecraft/server/EntityCreeper.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.ExplosionPrimeEvent; ++// CraftBukkit end ++ + public class EntityCreeper extends EntityMonster { + + private int b; +@@ -7,6 +12,7 @@ + private int maxFuseTicks = 30; + private int explosionRadius = 3; + private int bm = 0; ++ private int record = -1; // CraftBukkit + + public EntityCreeper(World world) { + super(world); +@@ -111,19 +117,36 @@ + } + + public void die(DamageSource damagesource) { +- super.die(damagesource); ++ // super.die(damagesource); // CraftBukkit - Moved to end + if (damagesource.getEntity() instanceof EntitySkeleton) { + int i = Item.getId(Items.RECORD_13); + int j = Item.getId(Items.RECORD_WAIT); + int k = i + this.random.nextInt(j - i + 1); + +- this.a(Item.getById(k), 1); ++ // CraftBukkit start - Store record for now, drop in dropDeathLoot ++ // this.a(Item.getById(k), 1); ++ this.record = k; ++ // CraftBukkit end + } else if (damagesource.getEntity() instanceof EntityCreeper && damagesource.getEntity() != this && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).cn()) { + ((EntityCreeper) damagesource.getEntity()).co(); + this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); + } +- ++ ++ super.die(damagesource); // CraftBukkit - Moved from above ++ } ++ ++ // CraftBukkit start - Whole method ++ @Override ++ protected void dropDeathLoot(boolean flag, int i) { ++ super.dropDeathLoot(flag, i); ++ ++ // Drop a music disc? ++ if (this.record != -1) { ++ this.a(Item.getById(this.record), 1); ++ this.record = -1; ++ } + } ++ // CraftBukkit end + + public boolean r(Entity entity) { + return true; +@@ -147,7 +170,21 @@ + + public void onLightningStrike(EntityLightning entitylightning) { + super.onLightningStrike(entitylightning); +- this.datawatcher.watch(17, Byte.valueOf((byte) 1)); ++ // CraftBukkit start ++ if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) { ++ return; ++ } ++ ++ this.setPowered(true); ++ } ++ ++ public void setPowered(boolean powered) { ++ if (!powered) { ++ this.datawatcher.watch(17, Byte.valueOf((byte) 0)); ++ } else { ++ this.datawatcher.watch(17, Byte.valueOf((byte) 1)); ++ } ++ // CraftBukkit end + } + + protected boolean a(EntityHuman entityhuman) { +@@ -170,9 +207,16 @@ + if (!this.world.isStatic) { + boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); + float f = this.isPowered() ? 2.0F : 1.0F; +- +- this.world.explode(this, this.locX, this.locY, this.locZ, (float) this.explosionRadius * f, flag); +- this.die(); ++ ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), this.explosionRadius * f, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); ++ this.die(); ++ } else { ++ fuseTicks = 0; ++ } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/EntityDamageSourceIndirect.patch b/nms-patches/EntityDamageSourceIndirect.patch new file mode 100644 index 00000000..efcfd591 --- /dev/null +++ b/nms-patches/EntityDamageSourceIndirect.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityDamageSourceIndirect.java 2014-11-27 08:59:46.661422023 +1100 ++++ src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java 2014-11-27 08:42:10.164850887 +1100 +@@ -24,5 +24,11 @@ + String s1 = s + ".item"; + + return itemstack != null && itemstack.hasName() && LocaleI18n.c(s1) ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.C()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent}); ++ } ++ ++ // CraftBukkit start ++ public Entity getProximateDamageSource() { ++ return super.getEntity(); + } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityEgg.patch b/nms-patches/EntityEgg.patch new file mode 100644 index 00000000..9b51e766 --- /dev/null +++ b/nms-patches/EntityEgg.patch @@ -0,0 +1,65 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEgg.java 2014-11-27 08:59:46.665422005 +1100 ++++ src/main/java/net/minecraft/server/EntityEgg.java 2014-11-27 08:42:10.112850989 +1100 +@@ -1,5 +1,12 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.entity.Ageable; ++import org.bukkit.entity.EntityType; ++import org.bukkit.entity.Player; ++import org.bukkit.event.player.PlayerEggThrowEvent; ++// CraftBukkit end ++ + public class EntityEgg extends EntityProjectile { + + public EntityEgg(World world) { +@@ -19,21 +26,36 @@ + movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); + } + +- if (!this.world.isStatic && this.random.nextInt(8) == 0) { +- byte b0 = 1; ++ // CraftBukkit start - Fire PlayerEggThrowEvent ++ boolean hatching = !this.world.isStatic && this.random.nextInt(8) == 0; ++ int numHatching = (this.random.nextInt(32) == 0) ? 4 : 1; ++ if (!hatching) { ++ numHatching = 0; ++ } ++ ++ EntityType hatchingType = EntityType.CHICKEN; + +- if (this.random.nextInt(32) == 0) { +- b0 = 4; +- } +- +- for (int i = 0; i < b0; ++i) { +- EntityChicken entitychicken = new EntityChicken(this.world); +- +- entitychicken.setAgeRaw(-24000); +- entitychicken.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); +- this.world.addEntity(entitychicken); +- } ++ Entity shooter = this.getShooter(); ++ if (shooter instanceof EntityPlayer) { ++ Player player = (shooter == null) ? null : (Player) shooter.getBukkitEntity(); ++ ++ PlayerEggThrowEvent event = new PlayerEggThrowEvent(player, (org.bukkit.entity.Egg) this.getBukkitEntity(), hatching, (byte) numHatching, hatchingType); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ hatching = event.isHatching(); ++ numHatching = event.getNumHatches(); ++ hatchingType = event.getHatchingType(); ++ } ++ ++ if (hatching) { ++ for (int k = 0; k < numHatching; k++) { ++ org.bukkit.entity.Entity entity = world.getWorld().spawn(new org.bukkit.Location(world.getWorld(), this.locX, this.locY, this.locZ, this.yaw, 0.0F), hatchingType.getEntityClass(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); ++ if (entity instanceof Ageable) { ++ ((Ageable) entity).setBaby(); ++ } ++ } + } ++ // CraftBukkit end + + double d0 = 0.08D; + diff --git a/nms-patches/EntityEnderCrystal.patch b/nms-patches/EntityEnderCrystal.patch new file mode 100644 index 00000000..0bf41baa --- /dev/null +++ b/nms-patches/EntityEnderCrystal.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderCrystal.java 2014-11-27 08:59:46.665422005 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderCrystal.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.ExplosionPrimeEvent; ++// CraftBukkit end ++ + public class EntityEnderCrystal extends Entity { + + public int a; +@@ -32,7 +37,11 @@ + int k = MathHelper.floor(this.locZ); + + if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(new BlockPosition(i, j, k)).getBlock() != Blocks.FIRE) { +- this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.FIRE.getBlockData()); ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { ++ this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + + } +@@ -54,7 +63,15 @@ + if (this.b <= 0) { + this.die(); + if (!this.world.isStatic) { +- this.world.explode((Entity) null, this.locX, this.locY, this.locZ, 6.0F, true); ++ // CraftBukkit start ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ this.dead = false; ++ return false; ++ } ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/EntityEnderDragon.patch b/nms-patches/EntityEnderDragon.patch new file mode 100644 index 00000000..a58d2f8f --- /dev/null +++ b/nms-patches/EntityEnderDragon.patch @@ -0,0 +1,330 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderDragon.java 2014-11-27 08:59:46.665422005 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderDragon.java 2014-11-27 08:42:10.116850981 +1100 +@@ -5,6 +5,17 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.BlockStateListPopulator; ++import org.bukkit.event.entity.EntityCreatePortalEvent; ++import org.bukkit.event.entity.EntityExplodeEvent; ++import org.bukkit.event.entity.EntityRegainHealthEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.Bukkit; ++// CraftBukkit end ++ + public class EntityEnderDragon extends EntityInsentient implements IComplex, IMonster { + + public double a; +@@ -27,6 +38,7 @@ + private Entity by; + public int bw; + public EntityEnderCrystal bx; ++ private Explosion explosionSource = new Explosion(null, this, Double.NaN, Double.NaN, Double.NaN, Float.NaN, true, true); // CraftBukkit - reusable source for CraftTNTPrimed.getSource() + + public EntityEnderDragon(World world) { + super(world); +@@ -120,21 +132,21 @@ + + if (this.world.isStatic) { + if (this.ba > 0) { +- d3 = this.locX + (this.bb - this.locX) / (double) this.ba; +- d0 = this.locY + (this.bc - this.locY) / (double) this.ba; +- d1 = this.locZ + (this.bd - this.locZ) / (double) this.ba; +- d2 = MathHelper.g(this.be - (double) this.yaw); +- this.yaw = (float) ((double) this.yaw + d2 / (double) this.ba); ++ d0 = this.locX + (this.bb - this.locX) / (double) this.ba; ++ d1 = this.locY + (this.bc - this.locY) / (double) this.ba; ++ d2 = this.locZ + (this.bd - this.locZ) / (double) this.ba; ++ d3 = MathHelper.g(this.be - (double) this.yaw); ++ this.yaw = (float) ((double) this.yaw + d3 / (double) this.ba); + this.pitch = (float) ((double) this.pitch + (this.bf - (double) this.pitch) / (double) this.ba); + --this.ba; +- this.setPosition(d3, d0, d1); ++ this.setPosition(d0, d1, d2); + this.setYawPitch(this.yaw, this.pitch); + } + } else { +- d3 = this.a - this.locX; +- d0 = this.b - this.locY; +- d1 = this.c - this.locZ; +- d2 = d3 * d3 + d0 * d0 + d1 * d1; ++ d0 = this.a - this.locX; ++ d1 = this.b - this.locY; ++ d2 = this.c - this.locZ; ++ d3 = d0 * d0 + d1 * d1 + d2 * d2; + double d4; + + if (this.by != null) { +@@ -155,16 +167,16 @@ + this.c += this.random.nextGaussian() * 2.0D; + } + +- if (this.bu || d2 < 100.0D || d2 > 22500.0D || this.positionChanged || this.E) { ++ if (this.bu || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.E) { + this.cd(); + } + +- d0 /= (double) MathHelper.sqrt(d3 * d3 + d1 * d1); ++ d1 /= (double) MathHelper.sqrt(d0 * d0 + d2 * d2); + f3 = 0.6F; +- d0 = MathHelper.a(d0, (double) (-f3), (double) f3); +- this.motY += d0 * 0.10000000149011612D; ++ d1 = MathHelper.a(d1, (double) (-f3), (double) f3); ++ this.motY += d1 * 0.10000000149011612D; + this.yaw = MathHelper.g(this.yaw); +- double d8 = 180.0D - Math.atan2(d3, d1) * 180.0D / 3.1415927410125732D; ++ double d8 = 180.0D - Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D; + double d9 = MathHelper.g(d8 - (double) this.yaw); + + if (d9 > 50.0D) { +@@ -290,12 +302,21 @@ + if (this.bx != null) { + if (this.bx.dead) { + if (!this.world.isStatic) { ++ CraftEventFactory.entityDamage = this.bx; // CraftBukkit + this.a(this.bl, DamageSource.explosion((Explosion) null), 10.0F); ++ CraftEventFactory.entityDamage = null; // CraftBukkit + } + + this.bx = null; + } else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) { +- this.setHealth(this.getHealth() + 1.0F); ++ // CraftBukkit start ++ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0D, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setHealth((float) (this.getHealth() + event.getAmount())); ++ } ++ // CraftBukkit end + } + } + +@@ -364,7 +385,19 @@ + } + + if (this.random.nextInt(2) == 0 && !arraylist.isEmpty()) { +- this.by = (Entity) arraylist.get(this.random.nextInt(arraylist.size())); ++ // CraftBukkit start ++ Entity target = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); ++ EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.RANDOM_TARGET); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ if (event.getTarget() == null) { ++ this.by = null; ++ } else { ++ this.by = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); ++ } ++ } ++ // CraftBukkit end + } else { + boolean flag; + +@@ -399,6 +432,11 @@ + int j1 = MathHelper.floor(axisalignedbb.f); + boolean flag = false; + boolean flag1 = false; ++ ++ // CraftBukkit start - Create a list to hold all the destroyed blocks ++ List<org.bukkit.block.Block> destroyedBlocks = new java.util.ArrayList<org.bukkit.block.Block>(); ++ org.bukkit.craftbukkit.CraftWorld craftWorld = this.world.getWorld(); ++ // CraftBukkit end + + for (int k1 = i; k1 <= l; ++k1) { + for (int l1 = j; l1 <= i1; ++l1) { +@@ -407,7 +445,11 @@ + + if (block.getMaterial() != Material.AIR) { + if (block != Blocks.BARRIER && block != Blocks.OBSIDIAN && block != Blocks.END_STONE && block != Blocks.BEDROCK && block != Blocks.COMMAND_BLOCK && this.world.getGameRules().getBoolean("mobGriefing")) { +- flag1 = this.world.setAir(new BlockPosition(k1, l1, i2)) || flag1; ++ // CraftBukkit start - Add blocks to list rather than destroying them ++ // flag1 = this.world.setAir(new BlockPosition(k1, l1, i2)) || flag1; ++ flag1 = true; ++ destroyedBlocks.add(craftWorld.getBlockAt(k1, l1, i2)); ++ // CraftBukkit end + } else { + flag = true; + } +@@ -417,6 +459,40 @@ + } + + if (flag1) { ++ // CraftBukkit start - Set off an EntityExplodeEvent for the dragon exploding all these blocks ++ org.bukkit.entity.Entity bukkitEntity = this.getBukkitEntity(); ++ EntityExplodeEvent event = new EntityExplodeEvent(bukkitEntity, bukkitEntity.getLocation(), destroyedBlocks, 0F); ++ Bukkit.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ // This flag literally means 'Dragon hit something hard' (Obsidian, White Stone or Bedrock) and will cause the dragon to slow down. ++ // We should consider adding an event extension for it, or perhaps returning true if the event is cancelled. ++ return flag; ++ } else if (event.getYield() == 0F) { ++ // Yield zero ==> no drops ++ for (org.bukkit.block.Block block : event.blockList()) { ++ this.world.setAir(new BlockPosition(block.getX(), block.getY(), block.getZ())); ++ } ++ } else { ++ for (org.bukkit.block.Block block : event.blockList()) { ++ org.bukkit.Material blockId = block.getType(); ++ if (blockId == org.bukkit.Material.AIR) { ++ continue; ++ } ++ ++ int blockX = block.getX(); ++ int blockY = block.getY(); ++ int blockZ = block.getZ(); ++ ++ Block nmsBlock = org.bukkit.craftbukkit.util.CraftMagicNumbers.getBlock(blockId); ++ if (nmsBlock.a(explosionSource)) { ++ nmsBlock.dropNaturally(this.world, new BlockPosition(blockX, blockY, blockZ), nmsBlock.fromLegacyData(block.getData()), event.getYield(), 0); ++ } ++ nmsBlock.wasExploded(world, new BlockPosition(blockX, blockY, blockZ), explosionSource); ++ ++ this.world.setAir(new BlockPosition(blockX, blockY, blockZ)); ++ } ++ } ++ // CraftBukkit end + double d0 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) this.random.nextFloat(); + double d1 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) this.random.nextFloat(); + double d2 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) this.random.nextFloat(); +@@ -464,6 +540,7 @@ + } + + protected void aY() { ++ if (this.dead) return; // CraftBukkit - can't kill what's already dead + ++this.bw; + if (this.bw >= 180 && this.bw <= 200) { + float f = (this.random.nextFloat() - 0.5F) * 8.0F; +@@ -478,7 +555,7 @@ + + if (!this.world.isStatic) { + if (this.bw > 150 && this.bw % 5 == 0 && this.world.getGameRules().getBoolean("doMobLoot")) { +- i = 1000; ++ i = this.expToDrop / 12; // CraftBukkit - drop experience as dragon falls from sky. use experience drop from death event. This is now set in getExpReward() + + while (i > 0) { + j = EntityExperienceOrb.getOrbValue(i); +@@ -488,14 +565,30 @@ + } + + if (this.bw == 1) { +- this.world.a(1018, new BlockPosition(this), 0); ++ // CraftBukkit start - Use relative location for far away sounds ++ // this.world.a(1018, new BlockPosition(this), 0); ++ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; ++ for (EntityPlayer player : (List<EntityPlayer>) this.world.players) { ++ double deltaX = this.locX - player.locX; ++ double deltaZ = this.locZ - player.locZ; ++ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; ++ if (distanceSquared > viewDistance * viewDistance) { ++ double deltaLength = Math.sqrt(distanceSquared); ++ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; ++ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, new BlockPosition((int) relativeX, (int) this.locY, (int) relativeZ), 0, true)); ++ } else { ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0, true)); ++ } ++ } ++ // CraftBukkit end + } + } + + this.move(0.0D, 0.10000000149011612D, 0.0D); + this.aG = this.yaw += 20.0F; + if (this.bw == 200 && !this.world.isStatic) { +- i = 2000; ++ i = this.expToDrop - (10 * this.expToDrop / 12); // CraftBukkit - drop the remaining experience + + while (i > 0) { + j = EntityExperienceOrb.getOrbValue(i); +@@ -513,6 +606,9 @@ + boolean flag = true; + double d0 = 12.25D; + double d1 = 6.25D; ++ ++ // CraftBukkit start - Replace any "this.world" in the following with just "world"! ++ BlockStateListPopulator world = new BlockStateListPopulator(this.world.getWorld()); + + for (int i = -1; i <= 32; ++i) { + for (int j = -4; j <= 4; ++j) { +@@ -524,31 +620,51 @@ + + if (i < 0) { + if (d2 <= 6.25D) { +- this.world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); + } + } else if (i > 0) { +- this.world.setTypeUpdate(blockposition1, Blocks.AIR.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.AIR.getBlockData()); + } else if (d2 > 6.25D) { +- this.world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.BEDROCK.getBlockData()); + } else { +- this.world.setTypeUpdate(blockposition1, Blocks.END_PORTAL.getBlockData()); ++ world.setTypeUpdate(blockposition1, Blocks.END_PORTAL.getBlockData()); + } + } + } + } + } + +- this.world.setTypeUpdate(blockposition, Blocks.BEDROCK.getBlockData()); +- this.world.setTypeUpdate(blockposition.up(), Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition.up(), Blocks.BEDROCK.getBlockData()); + BlockPosition blockposition2 = blockposition.up(2); + +- this.world.setTypeUpdate(blockposition2, Blocks.BEDROCK.getBlockData()); +- this.world.setTypeUpdate(blockposition2.west(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.EAST)); +- this.world.setTypeUpdate(blockposition2.east(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.WEST)); +- this.world.setTypeUpdate(blockposition2.north(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.SOUTH)); +- this.world.setTypeUpdate(blockposition2.south(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.NORTH)); +- this.world.setTypeUpdate(blockposition.up(3), Blocks.BEDROCK.getBlockData()); +- this.world.setTypeUpdate(blockposition.up(4), Blocks.DRAGON_EGG.getBlockData()); ++ world.setTypeUpdate(blockposition2, Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition2.west(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.EAST)); ++ world.setTypeUpdate(blockposition2.east(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.WEST)); ++ world.setTypeUpdate(blockposition2.north(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.SOUTH)); ++ world.setTypeUpdate(blockposition2.south(), Blocks.TORCH.getBlockData().set(BlockTorch.FACING, EnumDirection.NORTH)); ++ world.setTypeUpdate(blockposition.up(3), Blocks.BEDROCK.getBlockData()); ++ world.setTypeUpdate(blockposition.up(4), Blocks.DRAGON_EGG.getBlockData()); ++ ++ EntityCreatePortalEvent event = new EntityCreatePortalEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), java.util.Collections.unmodifiableList(world.getList()), org.bukkit.PortalType.ENDER); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ for (BlockState state : event.getBlocks()) { ++ state.update(true); ++ } ++ } else { ++ for (BlockState state : event.getBlocks()) { ++ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, new BlockPosition(state.getX(), state.getY(), state.getZ())); ++ for (Iterator it = this.world.players.iterator(); it.hasNext();) { ++ EntityHuman entity = (EntityHuman) it.next(); ++ if (entity instanceof EntityPlayer) { ++ ((EntityPlayer) entity).playerConnection.sendPacket(packet); ++ } ++ } ++ } ++ } ++ // CraftBukkit end + } + + protected void D() {} +@@ -576,4 +692,12 @@ + protected float bA() { + return 5.0F; + } ++ ++ // CraftBukkit start ++ public int getExpReward() { ++ // This value is equal to the amount of experience dropped while falling from the sky (10 * 1000) ++ // plus what is dropped when the dragon hits the ground (2000) ++ return 12000; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityEnderPearl.patch b/nms-patches/EntityEnderPearl.patch new file mode 100644 index 00000000..de13eefd --- /dev/null +++ b/nms-patches/EntityEnderPearl.patch @@ -0,0 +1,50 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderPearl.java 2014-11-27 08:59:46.669421987 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderPearl.java 2014-11-27 08:42:10.124850965 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.player.PlayerTeleportEvent; ++// CraftBukkit end ++ + public class EntityEnderPearl extends EntityProjectile { + + public EntityEnderPearl(World world, EntityLiving entityliving) { +@@ -29,14 +35,28 @@ + entityendermite.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.world.addEntity(entityendermite); + } +- +- if (entityliving.av()) { +- entityliving.mount((Entity) null); ++ ++ // CraftBukkit start - Fire PlayerTeleportEvent ++ org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); ++ org.bukkit.Location location = getBukkitEntity().getLocation(); ++ location.setPitch(player.getLocation().getPitch()); ++ location.setYaw(player.getLocation().getYaw()); ++ ++ PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); ++ Bukkit.getPluginManager().callEvent(teleEvent); ++ ++ if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) { ++ if (entityliving.av()) { ++ entityliving.mount((Entity) null); ++ } ++ ++ entityplayer.playerConnection.teleport(teleEvent.getTo()); ++ entityliving.fallDistance = 0.0F; ++ CraftEventFactory.entityDamage = this; ++ entityliving.damageEntity(DamageSource.FALL, 5.0F); ++ CraftEventFactory.entityDamage = null; + } +- +- entityliving.enderTeleportTo(this.locX, this.locY, this.locZ); +- entityliving.fallDistance = 0.0F; +- entityliving.damageEntity(DamageSource.FALL, 5.0F); ++ // CraftBukkit end + } + } + diff --git a/nms-patches/EntityEnderman.patch b/nms-patches/EntityEnderman.patch new file mode 100644 index 00000000..1fb9b606 --- /dev/null +++ b/nms-patches/EntityEnderman.patch @@ -0,0 +1,34 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityEnderman.java 2014-11-27 08:59:46.669421987 +1100 ++++ src/main/java/net/minecraft/server/EntityEnderman.java 2014-11-27 08:42:10.140850934 +1100 +@@ -4,6 +4,12 @@ + import java.util.Set; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTeleportEvent; ++// CraftBukkit end ++ + public class EntityEnderman extends EntityMonster { + + private static final UUID b = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"); +@@ -165,7 +171,17 @@ + } + + if (flag1) { +- super.enderTeleportTo(this.locX, this.locY, this.locZ); ++ // CraftBukkit start - Teleport event ++ // super.enderTeleportTo(this.locX, this.locY, this.locZ); ++ EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), this.locX, this.locY, this.locZ)); ++ this.world.getServer().getPluginManager().callEvent(teleport); ++ if (teleport.isCancelled()) { ++ return false; ++ } ++ ++ Location to = teleport.getTo(); ++ this.enderTeleportTo(to.getX(), to.getY(), to.getZ()); ++ // CraftBukkit end + if (this.world.getCubes(this, this.getBoundingBox()).isEmpty() && !this.world.containsLiquid(this.getBoundingBox())) { + flag = true; + } diff --git a/nms-patches/EntityExperienceOrb.patch b/nms-patches/EntityExperienceOrb.patch new file mode 100644 index 00000000..0f389895 --- /dev/null +++ b/nms-patches/EntityExperienceOrb.patch @@ -0,0 +1,82 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityExperienceOrb.java 2014-11-27 08:59:46.673421970 +1100 ++++ src/main/java/net/minecraft/server/EntityExperienceOrb.java 2014-11-27 08:42:10.100851012 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTargetLivingEntityEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++// CraftBukkit end ++ + public class EntityExperienceOrb extends Entity { + + public int a; +@@ -34,6 +40,7 @@ + + public void s_() { + super.s_(); ++ EntityHuman prevTarget = this.targetPlayer;// CraftBukkit - store old target + if (this.c > 0) { + --this.c; + } +@@ -65,6 +72,16 @@ + } + + if (this.targetPlayer != null) { ++ // CraftBukkit start ++ boolean cancelled = false; ++ if (this.targetPlayer != prevTarget) { ++ EntityTargetLivingEntityEvent event = CraftEventFactory.callEntityTargetLivingEvent(this, targetPlayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); ++ EntityLiving target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle(); ++ targetPlayer = target instanceof EntityHuman ? (EntityHuman) target : null; ++ cancelled = event.isCancelled(); ++ } ++ ++ if (!cancelled && targetPlayer != null) { + double d1 = (this.targetPlayer.locX - this.locX) / d0; + double d2 = (this.targetPlayer.locY + (double) this.targetPlayer.getHeadHeight() - this.locY) / d0; + double d3 = (this.targetPlayer.locZ - this.locZ) / d0; +@@ -77,6 +94,8 @@ + this.motY += d2 / d4 * d5 * 0.1D; + this.motZ += d3 / d4 * d5 * 0.1D; + } ++ } ++ // CraftBukkit end + } + + this.move(this.motX, this.motY, this.motZ); +@@ -141,7 +160,7 @@ + entityhuman.bn = 2; + this.world.makeSound(entityhuman, "random.orb", 0.1F, 0.5F * ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.8F)); + entityhuman.receive(this, 1); +- entityhuman.giveExp(this.value); ++ entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value -> event.getAmount() + this.die(); + } + +@@ -153,6 +172,24 @@ + } + + public static int getOrbValue(int i) { ++ // CraftBukkit start ++ if (i > 162670129) return i - 100000; ++ if (i > 81335063) return 81335063; ++ if (i > 40667527) return 40667527; ++ if (i > 20333759) return 20333759; ++ if (i > 10166857) return 10166857; ++ if (i > 5083423) return 5083423; ++ if (i > 2541701) return 2541701; ++ if (i > 1270849) return 1270849; ++ if (i > 635413) return 635413; ++ if (i > 317701) return 317701; ++ if (i > 158849) return 158849; ++ if (i > 79423) return 79423; ++ if (i > 39709) return 39709; ++ if (i > 19853) return 19853; ++ if (i > 9923) return 9923; ++ if (i > 4957) return 4957; ++ // CraftBukkit end + return i >= 2477 ? 2477 : (i >= 1237 ? 1237 : (i >= 617 ? 617 : (i >= 307 ? 307 : (i >= 149 ? 149 : (i >= 73 ? 73 : (i >= 37 ? 37 : (i >= 17 ? 17 : (i >= 7 ? 7 : (i >= 3 ? 3 : 1))))))))); + } + diff --git a/nms-patches/EntityFallingBlock.patch b/nms-patches/EntityFallingBlock.patch new file mode 100644 index 00000000..2b53c264 --- /dev/null +++ b/nms-patches/EntityFallingBlock.patch @@ -0,0 +1,44 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityFallingBlock.java 2014-11-27 08:59:46.673421970 +1100 ++++ src/main/java/net/minecraft/server/EntityFallingBlock.java 2014-11-27 08:42:10.132850949 +1100 +@@ -4,6 +4,8 @@ + import java.util.ArrayList; + import java.util.Iterator; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityFallingBlock extends Entity { + + public IBlockData block; +@@ -56,7 +58,7 @@ + + if (this.ticksLived++ == 0) { + blockposition = new BlockPosition(this); +- if (this.world.getType(blockposition).getBlock() == block) { ++ if (this.world.getType(blockposition).getBlock() == block && !CraftEventFactory.callEntityChangeBlockEvent(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.AIR, 0).isCancelled()) { + this.world.setAir(blockposition); + } else if (!this.world.isStatic) { + this.die(); +@@ -77,7 +79,12 @@ + this.motY *= -0.5D; + if (this.world.getType(blockposition).getBlock() != Blocks.PISTON_EXTENSION) { + this.die(); +- if (!this.e && this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, blockposition.down()) && this.world.setTypeAndData(blockposition, this.block, 3)) { ++ if (!this.e && this.world.a(block, blockposition, true, EnumDirection.UP, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, blockposition.down()) /* mimic the false conditions of setTypeIdAndData */ && blockposition.getX() >= -30000000 && blockposition.getZ() >= -30000000 && blockposition.getX() < 30000000 && blockposition.getZ() < 30000000 && blockposition.getY() >= 0 && blockposition.getY() < 256 && this.world.getType(blockposition) != this.block) { ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.block.getBlock(), this.block.getBlock().toLegacyData(this.block)).isCancelled()) { ++ return; ++ } ++ this.world.setTypeAndData(blockposition, this.block, 3); ++ // CraftBukkit end + if (block instanceof BlockFalling) { + ((BlockFalling) block).a_(this.world, blockposition); + } +@@ -135,7 +142,9 @@ + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); + ++ CraftEventFactory.entityDamage = this; // CraftBukkit + entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax)); ++ CraftEventFactory.entityDamage = null; // CraftBukkit + } + + if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) { diff --git a/nms-patches/EntityFireball.patch b/nms-patches/EntityFireball.patch new file mode 100644 index 00000000..67022e16 --- /dev/null +++ b/nms-patches/EntityFireball.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityFireball.java 2014-11-27 08:59:46.677421952 +1100 ++++ src/main/java/net/minecraft/server/EntityFireball.java 2014-11-27 08:42:10.144850927 +1100 +@@ -2,6 +2,8 @@ + + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public abstract class EntityFireball extends Entity { + + private int e = -1; +@@ -15,6 +17,8 @@ + public double dirX; + public double dirY; + public double dirZ; ++ public float bukkitYield = 1; // CraftBukkit ++ public boolean isIncendiary = true; // CraftBukkit + + public EntityFireball(World world) { + super(world); +@@ -38,10 +42,17 @@ + public EntityFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { + super(world); + this.shooter = entityliving; ++ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + this.a(1.0F, 1.0F); + this.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.setPosition(this.locX, this.locY, this.locZ); + this.motX = this.motY = this.motZ = 0.0D; ++ // CraftBukkit start - Added setDirection method ++ this.setDirection(d0, d1, d2); ++ } ++ ++ public void setDirection(double d0, double d1, double d2) { ++ // CraftBukkit end + d0 += this.random.nextGaussian() * 0.4D; + d1 += this.random.nextGaussian() * 0.4D; + d2 += this.random.nextGaussian() * 0.4D; +@@ -101,7 +112,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- double d1 = vec3d.f(movingobjectposition1.pos); ++ double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; +@@ -117,6 +128,12 @@ + + if (movingobjectposition != null) { + this.a(movingobjectposition); ++ ++ // CraftBukkit start - Fire ProjectileHitEvent ++ if (this.dead) { ++ CraftEventFactory.callProjectileHitEvent(this); ++ } ++ // CraftBukkit end + } + + this.locX += this.motX; +@@ -181,7 +198,8 @@ + + nbttagcompound.setString("inTile", minecraftkey == null ? "" : minecraftkey.toString()); + nbttagcompound.setByte("inGround", (byte) (this.i ? 1 : 0)); +- nbttagcompound.set("direction", this.a(new double[] { this.motX, this.motY, this.motZ})); ++ // CraftBukkit - Fix direction being mismapped to invalid variables ++ nbttagcompound.set("power", this.a(new double[] { this.dirX, this.dirY, this.dirZ})); + } + + public void a(NBTTagCompound nbttagcompound) { +@@ -195,12 +213,14 @@ + } + + this.i = nbttagcompound.getByte("inGround") == 1; +- if (nbttagcompound.hasKeyOfType("direction", 9)) { +- NBTTagList nbttaglist = nbttagcompound.getList("direction", 6); +- +- this.motX = nbttaglist.d(0); +- this.motY = nbttaglist.d(1); +- this.motZ = nbttaglist.d(2); ++ // CraftBukkit start - direction -> power ++ if (nbttagcompound.hasKeyOfType("power", 9)) { ++ NBTTagList nbttaglist = nbttagcompound.getList("power", 6); ++ ++ this.dirX = nbttaglist.d(0); ++ this.dirY = nbttaglist.d(1); ++ this.dirZ = nbttaglist.d(2); ++ // CraftBukkit end + } else { + this.die(); + } +@@ -221,6 +241,11 @@ + } else { + this.ac(); + if (damagesource.getEntity() != null) { ++ // CraftBukkit start ++ if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { ++ return false; ++ } ++ // CraftBukkit end + Vec3D vec3d = damagesource.getEntity().ap(); + + if (vec3d != null) { +@@ -234,6 +259,7 @@ + + if (damagesource.getEntity() instanceof EntityLiving) { + this.shooter = (EntityLiving) damagesource.getEntity(); ++ this.projectileSource = (org.bukkit.projectiles.ProjectileSource) this.shooter.getBukkitEntity(); + } + + return true; diff --git a/nms-patches/EntityFishingHook.patch b/nms-patches/EntityFishingHook.patch new file mode 100644 index 00000000..b2a015b8 --- /dev/null +++ b/nms-patches/EntityFishingHook.patch @@ -0,0 +1,159 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityFishingHook.java 2014-11-27 08:59:46.677421952 +1100 ++++ src/main/java/net/minecraft/server/EntityFishingHook.java 2014-11-27 08:42:10.104851005 +1100 +@@ -3,6 +3,12 @@ + import java.util.Arrays; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.entity.Fish; ++import org.bukkit.event.player.PlayerFishEvent; ++// CraftBukkit end ++ + public class EntityFishingHook extends Entity { + + private static final List d = Arrays.asList(new PossibleFishingResult[] { (new PossibleFishingResult(new ItemStack(Items.LEATHER_BOOTS), 10)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.LEATHER), 10), new PossibleFishingResult(new ItemStack(Items.BONE), 10), new PossibleFishingResult(new ItemStack(Items.POTION), 10), new PossibleFishingResult(new ItemStack(Items.STRING), 5), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 2)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.BOWL), 10), new PossibleFishingResult(new ItemStack(Items.STICK), 5), new PossibleFishingResult(new ItemStack(Items.DYE, 10, EnumColor.BLACK.getInvColorIndex()), 1), new PossibleFishingResult(new ItemStack(Blocks.TRIPWIRE_HOOK), 10), new PossibleFishingResult(new ItemStack(Items.ROTTEN_FLESH), 10)}); +@@ -168,7 +174,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- d6 = vec3d.f(movingobjectposition1.pos); ++ d6 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency + if (d6 < d5 || d5 == 0.0D) { + entity = entity1; + d5 = d6; +@@ -182,6 +188,7 @@ + } + + if (movingobjectposition != null) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // Craftbukkit - Call event + if (movingobjectposition.entity != null) { + if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.owner), 0.0F)) { + this.hooked = movingobjectposition.entity; +@@ -261,8 +268,8 @@ + } else { + float f3; + float f4; +- double d11; + float f5; ++ double d11; + double d12; + + if (this.av > 0) { +@@ -277,20 +284,20 @@ + } else { + this.aw = (float) ((double) this.aw + this.random.nextGaussian() * 4.0D); + f3 = this.aw * 0.017453292F; +- f5 = MathHelper.sin(f3); +- f4 = MathHelper.cos(f3); +- d8 = this.locX + (double) (f5 * (float) this.av * 0.1F); +- d12 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); +- d11 = this.locZ + (double) (f4 * (float) this.av * 0.1F); ++ f4 = MathHelper.sin(f3); ++ f5 = MathHelper.cos(f3); ++ d8 = this.locX + (double) (f4 * (float) this.av * 0.1F); ++ d11 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); ++ d12 = this.locZ + (double) (f5 * (float) this.av * 0.1F); + if (this.random.nextFloat() < 0.15F) { +- worldserver.a(EnumParticle.WATER_BUBBLE, d8, d12 - 0.10000000149011612D, d11, 1, (double) f5, 0.1D, (double) f4, 0.0D, new int[0]); ++ worldserver.a(EnumParticle.WATER_BUBBLE, d8, d11 - 0.10000000149011612D, d12, 1, (double) f4, 0.1D, (double) f5, 0.0D, new int[0]); + } + +- float f6 = f5 * 0.04F; +- float f7 = f4 * 0.04F; ++ float f6 = f4 * 0.04F; ++ float f7 = f5 * 0.04F; + +- worldserver.a(EnumParticle.WATER_WAKE, d8, d12, d11, 0, (double) f7, 0.01D, (double) (-f6), 1.0D, new int[0]); +- worldserver.a(EnumParticle.WATER_WAKE, d8, d12, d11, 0, (double) (-f7), 0.01D, (double) f6, 1.0D, new int[0]); ++ worldserver.a(EnumParticle.WATER_WAKE, d8, d11, d12, 0, (double) f7, 0.01D, (double) (-f6), 1.0D, new int[0]); ++ worldserver.a(EnumParticle.WATER_WAKE, d8, d11, d12, 0, (double) (-f7), 0.01D, (double) f6, 1.0D, new int[0]); + } + } else if (this.au > 0) { + this.au -= k; +@@ -304,12 +311,12 @@ + } + + if (this.random.nextFloat() < f3) { +- f5 = MathHelper.a(this.random, 0.0F, 360.0F) * 0.017453292F; +- f4 = MathHelper.a(this.random, 25.0F, 60.0F); +- d8 = this.locX + (double) (MathHelper.sin(f5) * f4 * 0.1F); +- d12 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); +- d11 = this.locZ + (double) (MathHelper.cos(f5) * f4 * 0.1F); +- worldserver.a(EnumParticle.WATER_SPLASH, d8, d12, d11, 2 + this.random.nextInt(2), 0.10000000149011612D, 0.0D, 0.10000000149011612D, 0.0D, new int[0]); ++ f4 = MathHelper.a(this.random, 0.0F, 360.0F) * 0.017453292F; ++ f5 = MathHelper.a(this.random, 25.0F, 60.0F); ++ d8 = this.locX + (double) (MathHelper.sin(f4) * f5 * 0.1F); ++ d11 = (double) ((float) MathHelper.floor(this.getBoundingBox().b) + 1.0F); ++ d12 = this.locZ + (double) (MathHelper.cos(f4) * f5 * 0.1F); ++ worldserver.a(EnumParticle.WATER_SPLASH, d8, d11, d12, 2 + this.random.nextInt(2), 0.10000000149011612D, 0.0D, 0.10000000149011612D, 0.0D, new int[0]); + } + + if (this.au <= 0) { +@@ -374,6 +381,15 @@ + byte b0 = 0; + + if (this.hooked != null) { ++ // CraftBukkit start ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), this.hooked.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ // CraftBukkit end ++ + double d0 = this.owner.locX - this.locX; + double d1 = this.owner.locY - this.locY; + double d2 = this.owner.locZ - this.locZ; +@@ -386,6 +402,16 @@ + b0 = 3; + } else if (this.at > 0) { + EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, this.m()); ++ // CraftBukkit start ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); ++ playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ // CraftBukkit end ++ + double d5 = this.owner.locX - this.locX; + double d6 = this.owner.locY - this.locY; + double d7 = this.owner.locZ - this.locZ; +@@ -396,13 +422,32 @@ + entityitem.motY = d6 * d9 + (double) MathHelper.sqrt(d8) * 0.08D; + entityitem.motZ = d7 * d9; + this.world.addEntity(entityitem); +- this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, this.random.nextInt(6) + 1)); ++ // CraftBukkit - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop() ++ this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, playerFishEvent.getExpToDrop())); + b0 = 1; + } + + if (this.aq) { ++ // CraftBukkit start ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ // CraftBukkit end + b0 = 2; + } ++ ++ // CraftBukkit start ++ if (b0 == 0) { ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT); ++ this.world.getServer().getPluginManager().callEvent(playerFishEvent); ++ if (playerFishEvent.isCancelled()) { ++ return 0; ++ } ++ } ++ // CraftBukkit end + + this.die(); + this.owner.hookedFish = null; diff --git a/nms-patches/EntityHanging.patch b/nms-patches/EntityHanging.patch new file mode 100644 index 00000000..d65c6dd9 --- /dev/null +++ b/nms-patches/EntityHanging.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityHanging.java 2014-11-27 08:59:46.681421935 +1100 ++++ src/main/java/net/minecraft/server/EntityHanging.java 2014-11-27 08:42:10.168850880 +1100 +@@ -4,6 +4,13 @@ + import java.util.List; + import org.apache.commons.lang3.Validate; + ++// CraftBukkit start ++import org.bukkit.entity.Hanging; ++import org.bukkit.entity.Painting; ++import org.bukkit.event.hanging.HangingBreakEvent; ++import org.bukkit.event.painting.PaintingBreakEvent; ++// CraftBukkit end ++ + public abstract class EntityHanging extends Entity { + + private int c; +@@ -77,6 +84,33 @@ + if (this.c++ == 100 && !this.world.isStatic) { + this.c = 0; + if (!this.dead && !this.survives()) { ++ // CraftBukkit start - fire break events ++ Material material = this.world.getType(new BlockPosition(this)).getBlock().getMaterial(); ++ HangingBreakEvent.RemoveCause cause; ++ ++ if (!material.equals(Material.AIR)) { ++ // TODO: This feels insufficient to catch 100% of suffocation cases ++ cause = HangingBreakEvent.RemoveCause.OBSTRUCTION; ++ } else { ++ cause = HangingBreakEvent.RemoveCause.PHYSICS; ++ } ++ ++ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ PaintingBreakEvent paintingEvent = null; ++ if (this instanceof EntityPainting) { ++ // Fire old painting event until it can be removed ++ paintingEvent = new PaintingBreakEvent((Painting) this.getBukkitEntity(), PaintingBreakEvent.RemoveCause.valueOf(cause.name())); ++ paintingEvent.setCancelled(event.isCancelled()); ++ this.world.getServer().getPluginManager().callEvent(paintingEvent); ++ } ++ ++ if (dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return; ++ } ++ // CraftBukkit end ++ + this.die(); + this.b((Entity) null); + } +@@ -138,6 +172,32 @@ + return false; + } else { + if (!this.dead && !this.world.isStatic) { ++ // CraftBukkit start - fire break events ++ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT); ++ PaintingBreakEvent paintingEvent = null; ++ if (damagesource.getEntity() != null) { ++ event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); ++ ++ if (this instanceof EntityPainting) { ++ // Fire old painting event until it can be removed ++ paintingEvent = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); ++ } ++ } else if (damagesource.isExplosion()) { ++ event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.EXPLOSION); ++ } ++ ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (paintingEvent != null) { ++ paintingEvent.setCancelled(event.isCancelled()); ++ this.world.getServer().getPluginManager().callEvent(paintingEvent); ++ } ++ ++ if (this.dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return true; ++ } ++ // CraftBukkit end ++ + this.die(); + this.ac(); + this.b(damagesource.getEntity()); +@@ -149,6 +209,18 @@ + + public void move(double d0, double d1, double d2) { + if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { ++ if (this.dead) return; // CraftBukkit ++ ++ // CraftBukkit start - fire break events ++ // TODO - Does this need its own cause? Seems to only be triggered by pistons ++ HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (this.dead || event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ + this.die(); + this.b((Entity) null); + } +@@ -156,7 +228,7 @@ + } + + public void g(double d0, double d1, double d2) { +- if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { ++ if (false && !this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed + this.die(); + this.b((Entity) null); + } diff --git a/nms-patches/EntityHorse.patch b/nms-patches/EntityHorse.patch new file mode 100644 index 00000000..f4ff42d0 --- /dev/null +++ b/nms-patches/EntityHorse.patch @@ -0,0 +1,140 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityHorse.java 2014-11-27 08:59:46.681421935 +1100 ++++ src/main/java/net/minecraft/server/EntityHorse.java 2014-11-27 08:42:10.148850918 +1100 +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit ++ + public class EntityHorse extends EntityAnimal implements IInventoryListener { + + private static final Predicate bq = new EntitySelectorHorse(); +@@ -36,6 +38,7 @@ + private String bM; + private String[] bN = new String[3]; + private boolean bO = false; ++ public int maxDomestication = 100; // CraftBukkit - store max domestication value + + public EntityHorse(World world) { + super(world); +@@ -314,13 +317,13 @@ + private int cX() { + int i = this.getType(); + +- return this.hasChest() && (i == 1 || i == 2) ? 17 : 2; ++ return this.hasChest() /* && (i == 1 || i == 2) */ ? 17 : 2; // CraftBukkit - Remove type check + } + + public void loadChest() { + InventoryHorseChest inventoryhorsechest = this.inventoryChest; + +- this.inventoryChest = new InventoryHorseChest("HorseChest", this.cX()); ++ this.inventoryChest = new InventoryHorseChest("HorseChest", this.cX(), this); // CraftBukkit - add this horse + this.inventoryChest.a(this.getName()); + if (inventoryhorsechest != null) { + inventoryhorsechest.b(this); +@@ -485,7 +488,7 @@ + } + + public int getMaxDomestication() { +- return 100; ++ return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100 + } + + protected float bA() { +@@ -585,7 +588,7 @@ + } + + if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { +- this.heal(f); ++ this.heal(f, RegainReason.EATING); // CraftBukkit + flag = true; + } + +@@ -692,11 +695,24 @@ + + public void die(DamageSource damagesource) { + super.die(damagesource); ++ /* CraftBukkit start - Handle chest dropping in dropDeathLoot below + if (!this.world.isStatic) { + this.dropChest(); + } ++ // CraftBukkit end */ ++ } + ++ // CraftBukkit start - Add method ++ @Override ++ protected void dropDeathLoot(boolean flag, int i) { ++ super.dropDeathLoot(flag, i); ++ ++ // Moved from die method above ++ if (!this.world.isStatic) { ++ this.dropChest(); ++ } + } ++ // CraftBukkit end + + public void m() { + if (this.random.nextInt(200) == 0) { +@@ -706,7 +722,7 @@ + super.m(); + if (!this.world.isStatic) { + if (this.random.nextInt(900) == 0 && this.deathTicks == 0) { +- this.heal(1.0F); ++ this.heal(1.0F, RegainReason.REGEN); // CraftBukkit + } + + if (!this.cw() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getType(new BlockPosition(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ))).getBlock() == Blocks.GRASS) { +@@ -949,6 +965,7 @@ + nbttagcompound.setInt("Temper", this.getTemper()); + nbttagcompound.setBoolean("Tame", this.isTame()); + nbttagcompound.setString("OwnerUUID", this.getOwnerUUID()); ++ nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit + if (this.hasChest()) { + NBTTagList nbttaglist = new NBTTagList(); + +@@ -1001,6 +1018,12 @@ + this.setOwnerUUID(s); + } + ++ // CraftBukkit start ++ if (nbttagcompound.hasKey("Bukkit.MaxDomestication")) { ++ this.maxDomestication = nbttagcompound.getInt("Bukkit.MaxDomestication"); ++ } ++ // CraftBukkit end ++ + AttributeInstance attributeinstance = this.getAttributeMap().a("Speed"); + + if (attributeinstance != null) { +@@ -1166,18 +1189,25 @@ + + public void v(int i) { + if (this.cE()) { ++ // CraftBukkit start - fire HorseJumpEvent, use event power + if (i < 0) { + i = 0; +- } else { +- this.bE = true; +- this.df(); + } +- ++ ++ float power; + if (i >= 90) { +- this.bp = 1.0F; ++ power = 1.0F; + } else { +- this.bp = 0.4F + 0.4F * (float) i / 90.0F; ++ power = 0.4F + 0.4F * (float) i / 90.0F; ++ } ++ ++ org.bukkit.event.entity.HorseJumpEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callHorseJumpEvent(this, power); ++ if (!event.isCancelled()) { ++ this.bE = true; ++ this.df(); ++ this.bp = power; + } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/EntityHuman.patch b/nms-patches/EntityHuman.patch new file mode 100644 index 00000000..185b52b4 --- /dev/null +++ b/nms-patches/EntityHuman.patch @@ -0,0 +1,383 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityHuman.java 2014-11-27 08:59:46.685421917 +1100 ++++ src/main/java/net/minecraft/server/EntityHuman.java 2014-11-27 08:42:10.120850973 +1100 +@@ -8,13 +8,25 @@ + import java.util.List; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.craftbukkit.entity.CraftItem; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.entity.Player; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.player.PlayerBedEnterEvent; ++import org.bukkit.event.player.PlayerBedLeaveEvent; ++import org.bukkit.event.player.PlayerDropItemEvent; ++import org.bukkit.event.player.PlayerItemConsumeEvent; ++// CraftBukkit end ++ + public abstract class EntityHuman extends EntityLiving { + + public PlayerInventory inventory = new PlayerInventory(this); + private InventoryEnderChest enderChest = new InventoryEnderChest(); + public Container defaultContainer; + public Container activeContainer; +- protected FoodMetaData foodData = new FoodMetaData(); ++ protected FoodMetaData foodData = new FoodMetaData(this); // CraftBukkit - add "this" to constructor + protected int bk; + public float bl; + public float bm; +@@ -34,6 +46,7 @@ + private boolean d; + private BlockPosition e; + public PlayerAbilities abilities = new PlayerAbilities(); ++ public int oldLevel = -1; // CraftBukkit - add field + public int expLevel; + public int expTotal; + public float exp; +@@ -46,6 +59,16 @@ + private final GameProfile bF; + private boolean bG = false; + public EntityFishingHook hookedFish; ++ ++ // CraftBukkit start ++ public boolean fauxSleeping; ++ public String spawnWorld = ""; ++ ++ @Override ++ public CraftHumanEntity getBukkitEntity() { ++ return (CraftHumanEntity) super.getBukkitEntity(); ++ } ++ // CraftBukkit end + + public EntityHuman(World world, GameProfile gameprofile) { + super(world); +@@ -265,6 +288,32 @@ + if (this.g != null) { + this.b(this.g, 16); + int i = this.g.count; ++ ++ // CraftBukkit start - fire PlayerItemConsumeEvent ++ org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.g); ++ PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ // Update client ++ if (this instanceof EntityPlayer) { ++ ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.g)); ++ } ++ return; ++ } ++ ++ // Plugin modified the item, process it but don't remove it ++ if (!craftItem.equals(event.getItem())) { ++ CraftItemStack.asNMSCopy(event.getItem()).b(this.world, this); ++ ++ // Update client ++ if (this instanceof EntityPlayer) { ++ ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.g)); ++ } ++ return; ++ } ++ // CraftBukkit end ++ + ItemStack itemstack = this.g.b(this.world, this); + + if (itemstack != this.g || itemstack != null && itemstack.count != i) { +@@ -324,7 +373,8 @@ + + if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL && this.world.getGameRules().getBoolean("naturalRegeneration")) { + if (this.getHealth() < this.getMaxHealth() && this.ticksLived % 20 == 0) { +- this.heal(1.0F); ++ // CraftBukkit - added regain reason of "REGEN" for filtering purposes. ++ this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); + } + + if (this.foodData.c() && this.ticksLived % 10 == 0) { +@@ -348,7 +398,7 @@ + + this.j((float) attributeinstance.getValue()); + float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); +- float f1 = (float) (Math.atan(-this.motY * 0.20000000298023224D) * 15.0D); ++ float f1 = (float) ( org.bukkit.craftbukkit.TrigMath.atan(-this.motY * 0.20000000298023224D) * 15.0D); // CraftBukkit + + if (f > 0.1F) { + f = 0.1F; +@@ -438,11 +488,14 @@ + + public void b(Entity entity, int i) { + this.addScore(i); +- Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.f); ++ // CraftBukkit - Get our scores instead ++ Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), new java.util.ArrayList<ScoreboardScore>()); ++ + + if (entity instanceof EntityHuman) { + this.b(StatisticList.B); +- collection.addAll(this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.e)); ++ // CraftBukkit - Get our scores instead ++ this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getName(), collection); + collection.addAll(this.e(entity)); + } else { + this.b(StatisticList.z); +@@ -451,8 +504,7 @@ + Iterator iterator = collection.iterator(); + + while (iterator.hasNext()) { +- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); +- ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective); ++ ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead + + scoreboardscore.incrementScore(); + } +@@ -491,6 +543,7 @@ + } + + public EntityItem a(boolean flag) { ++ // Called only when dropped by Q or CTRL-Q + return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false, true); + } + +@@ -532,6 +585,30 @@ + entityitem.motY += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); + entityitem.motZ += Math.sin((double) f1) * (double) f; + } ++ ++ // CraftBukkit start - fire PlayerDropItemEvent ++ Player player = (Player) this.getBukkitEntity(); ++ CraftItem drop = new CraftItem(this.world.getServer(), entityitem); ++ ++ PlayerDropItemEvent event = new PlayerDropItemEvent(player, drop); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); ++ if (flag1 && (cur == null || cur.getAmount() == 0)) { ++ // The complete stack was dropped ++ player.getInventory().setItemInHand(drop.getItemStack()); ++ } else if (flag1 && cur.isSimilar(drop.getItemStack()) && drop.getItemStack().getAmount() == 1) { ++ // Only one item is dropped ++ cur.setAmount(cur.getAmount() + 1); ++ player.getInventory().setItemInHand(cur); ++ } else { ++ // Fallback ++ player.getInventory().addItem(drop.getItemStack()); ++ } ++ return null; ++ } ++ // CraftBukkit end + + this.a(entityitem); + if (flag1) { +@@ -623,10 +700,18 @@ + this.bv = new BlockPosition(this); + this.a(true, true, false); + } ++ ++ // CraftBukkit start ++ this.spawnWorld = nbttagcompound.getString("SpawnWorld"); ++ if ("".equals(spawnWorld)) { ++ this.spawnWorld = this.world.getServer().getWorlds().get(0).getName(); ++ } ++ // CraftBukkit end + + if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) { + this.c = new BlockPosition(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ")); + this.d = nbttagcompound.getBoolean("SpawnForced"); ++ nbttagcompound.setString("SpawnWorld", spawnWorld); // CraftBukkit - fixes bed spawns for multiworld worlds + } + + this.foodData.a(nbttagcompound); +@@ -684,7 +769,7 @@ + + if (damagesource.r()) { + if (this.world.getDifficulty() == EnumDifficulty.PEACEFUL) { +- f = 0.0F; ++ return false; // CraftBukkit - f = 0.0f -> return false + } + + if (this.world.getDifficulty() == EnumDifficulty.EASY) { +@@ -696,7 +781,7 @@ + } + } + +- if (f == 0.0F) { ++ if (false && f == 0.0F) { // CraftBukkit - Don't filter out 0 damage + return false; + } else { + Entity entity = damagesource.getEntity(); +@@ -712,10 +797,29 @@ + } + + public boolean a(EntityHuman entityhuman) { +- ScoreboardTeamBase scoreboardteambase = this.getScoreboardTeam(); +- ScoreboardTeamBase scoreboardteambase1 = entityhuman.getScoreboardTeam(); ++ // CraftBukkit start - Change to check OTHER player's scoreboard team according to API ++ // To summarize this method's logic, it's "Can parameter hurt this" ++ org.bukkit.scoreboard.Team team; ++ if (entityhuman instanceof EntityPlayer) { ++ EntityPlayer thatPlayer = (EntityPlayer) entityhuman; ++ team = thatPlayer.getBukkitEntity().getScoreboard().getPlayerTeam(thatPlayer.getBukkitEntity()); ++ if (team == null || team.allowFriendlyFire()) { ++ return true; ++ } ++ } else { ++ // This should never be called, but is implemented anyway ++ org.bukkit.OfflinePlayer thisPlayer = entityhuman.world.getServer().getOfflinePlayer(entityhuman.getName()); ++ team = entityhuman.world.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); ++ if (team == null || team.allowFriendlyFire()) { ++ return true; ++ } ++ } + +- return scoreboardteambase == null ? true : (!scoreboardteambase.isAlly(scoreboardteambase1) ? true : scoreboardteambase.allowFriendlyFire()); ++ if (this instanceof EntityPlayer) { ++ return !team.hasPlayer(((EntityPlayer) this).getBukkitEntity()); ++ } ++ return !team.hasPlayer(this.world.getServer().getOfflinePlayer(this.getName())); ++ // CraftBukkit end + } + + protected void damageArmor(float f) { +@@ -742,7 +846,12 @@ + return (float) i / (float) this.inventory.armor.length; + } + +- protected void d(DamageSource damagesource, float f) { ++ // CraftBukkit start ++ protected boolean d(DamageSource damagesource, float f) { // void -> boolean ++ if (true) { ++ return super.d(damagesource, f); ++ } ++ // CraftBukkit end + if (!this.isInvulnerable(damagesource)) { + if (!damagesource.ignoresArmor() && this.isBlocking() && f > 0.0F) { + f = (1.0F + f) * 0.5F; +@@ -766,6 +875,7 @@ + + } + } ++ return false; // CraftBukkit + } + + public void openSign(TileEntitySign tileentitysign) {} +@@ -800,7 +910,8 @@ + } + + if (itemstack.a(this, (EntityLiving) entity)) { +- if (itemstack.count <= 0 && !this.abilities.canInstantlyBuild) { ++ // CraftBukkit - bypass infinite items; <= 0 -> == 0 ++ if (itemstack.count == 0 && !this.abilities.canInstantlyBuild) { + this.bZ(); + } + +@@ -866,8 +977,15 @@ + int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); + + if (entity instanceof EntityLiving && j > 0 && !entity.isBurning()) { +- flag1 = true; +- entity.setOnFire(1); ++ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 1); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ flag1 = true; ++ entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + + double d0 = entity.motX; +@@ -922,7 +1040,8 @@ + + if (itemstack != null && object instanceof EntityLiving) { + itemstack.a((EntityLiving) object, this); +- if (itemstack.count <= 0) { ++ // CraftBukkit - bypass infinite items; <= 0 -> == 0 ++ if (itemstack.count == 0) { + this.bZ(); + } + } +@@ -930,7 +1049,14 @@ + if (entity instanceof EntityLiving) { + this.a(StatisticList.w, Math.round(f * 10.0F)); + if (j > 0) { +- entity.setOnFire(j * 4); ++ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + } + +@@ -995,6 +1121,20 @@ + if (this.av()) { + this.mount((Entity) null); + } ++ ++ // CraftBukkit start - fire PlayerBedEnterEvent ++ if (this.getBukkitEntity() instanceof Player) { ++ Player player = (Player) this.getBukkitEntity(); ++ org.bukkit.block.Block bed = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ PlayerBedEnterEvent event = new PlayerBedEnterEvent(player, bed); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return EnumBedResult.OTHER_PROBLEM; ++ } ++ } ++ // CraftBukkit end + + this.a(0.2F, 0.2F); + if (this.world.isLoaded(blockposition)) { +@@ -1077,6 +1217,23 @@ + if (!this.world.isStatic && flag1) { + this.world.everyoneSleeping(); + } ++ ++ // CraftBukkit start - fire PlayerBedLeaveEvent ++ if (this.getBukkitEntity() instanceof Player) { ++ Player player = (Player) this.getBukkitEntity(); ++ ++ org.bukkit.block.Block bed; ++ BlockPosition blockposition = this.bv; ++ if (blockposition != null) { ++ bed = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ } else { ++ bed = this.world.getWorld().getBlockAt(player.getLocation()); ++ } ++ ++ PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed); ++ this.world.getServer().getPluginManager().callEvent(event); ++ } ++ // CraftBukkit end + + this.sleepTicks = flag ? 0 : 100; + if (flag2) { +@@ -1128,9 +1285,11 @@ + if (blockposition != null) { + this.c = blockposition; + this.d = flag; ++ this.spawnWorld = this.world.worldData.getName(); // CraftBukkit + } else { + this.c = null; + this.d = false; ++ this.spawnWorld = ""; // CraftBukkit + } + + } +@@ -1477,6 +1636,7 @@ + } + + public IChatBaseComponent getScoreboardDisplayName() { ++ // CraftBukkit - todo: fun + ChatComponentText chatcomponenttext = new ChatComponentText(ScoreboardTeam.getPlayerDisplayName(this.getScoreboardTeam(), this.getName())); + + chatcomponenttext.getChatModifier().setChatClickable(new ChatClickable(EnumClickAction.SUGGEST_COMMAND, "/msg " + this.getName() + " ")); diff --git a/nms-patches/EntityInsentient.patch b/nms-patches/EntityInsentient.patch new file mode 100644 index 00000000..17867b8d --- /dev/null +++ b/nms-patches/EntityInsentient.patch @@ -0,0 +1,164 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityInsentient.java 2014-11-27 08:59:46.689421900 +1100 ++++ src/main/java/net/minecraft/server/EntityInsentient.java 2014-11-27 08:42:10.156850903 +1100 +@@ -4,6 +4,15 @@ + import java.util.List; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.event.entity.EntityTargetLivingEntityEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++import org.bukkit.event.entity.EntityUnleashEvent; ++import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; ++// CraftBukkit end ++ + public abstract class EntityInsentient extends EntityLiving { + + public int a_; +@@ -39,7 +48,9 @@ + for (int i = 0; i < this.dropChances.length; ++i) { + this.dropChances[i] = 0.085F; + } +- ++ // CraftBukkit start - default persistance to type's persistance value ++ this.persistent = !isTypeNotPersistent(); ++ // CraftBukkit end + } + + protected void aW() { +@@ -76,7 +87,37 @@ + } + + public void setGoalTarget(EntityLiving entityliving) { ++ // CraftBukkit start - fire event ++ setGoalTarget(entityliving, EntityTargetEvent.TargetReason.UNKNOWN, true); ++ } ++ ++ public void setGoalTarget(EntityLiving entityliving, EntityTargetEvent.TargetReason reason, boolean fireEvent) { ++ if (getGoalTarget() == entityliving) return; ++ if (fireEvent) { ++ if (reason == EntityTargetEvent.TargetReason.UNKNOWN && getGoalTarget() != null && entityliving == null) { ++ reason = getGoalTarget().isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; ++ } ++ if (reason == EntityTargetEvent.TargetReason.UNKNOWN) { ++ world.getServer().getLogger().log(java.util.logging.Level.WARNING, "Unknown target reason, please report on the issue tracker", new Exception()); ++ } ++ CraftLivingEntity ctarget = null; ++ if (entityliving != null) { ++ ctarget = (CraftLivingEntity) entityliving.getBukkitEntity(); ++ } ++ EntityTargetLivingEntityEvent event = new EntityTargetLivingEntityEvent(this.getBukkitEntity(), ctarget, reason); ++ world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ if (event.getTarget() != null) { ++ entityliving = ((CraftLivingEntity) event.getTarget()).getHandle(); ++ } else { ++ entityliving = null; ++ } ++ } + this.goalTarget = entityliving; ++ // CraftBukkit end + } + + public boolean a(Class oclass) { +@@ -235,11 +276,21 @@ + + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); ++ ++ // CraftBukkit start - If looting or persistence is false only use it if it was set after we started using it + if (nbttagcompound.hasKeyOfType("CanPickUpLoot", 1)) { +- this.j(nbttagcompound.getBoolean("CanPickUpLoot")); ++ boolean data = nbttagcompound.getBoolean("CanPickUpLoot"); ++ if (isLevelAtLeast(nbttagcompound, 1) || data) { ++ this.j(data); ++ } + } + +- this.persistent = nbttagcompound.getBoolean("PersistenceRequired"); ++ boolean data = nbttagcompound.getBoolean("PersistenceRequired"); ++ if (isLevelAtLeast(nbttagcompound, 1) || data) { ++ this.persistent = data; ++ } ++ // CraftBukkit end ++ + NBTTagList nbttaglist; + int i; + +@@ -380,11 +431,11 @@ + double d2 = entityhuman.locZ - this.locZ; + double d3 = d0 * d0 + d1 * d1 + d2 * d2; + +- if (this.isTypeNotPersistent() && d3 > 16384.0D) { ++ if (d3 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check + this.die(); + } + +- if (this.aO > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D && this.isTypeNotPersistent()) { ++ if (this.aO > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check + this.die(); + } else if (d3 < 1024.0D) { + this.aO = 0; +@@ -707,6 +758,12 @@ + + public final boolean e(EntityHuman entityhuman) { + if (this.cb() && this.getLeashHolder() == entityhuman) { ++ // CraftBukkit start - fire PlayerUnleashEntityEvent ++ if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); ++ return false; ++ } ++ // CraftBukkit end + this.unleash(true, !entityhuman.abilities.canInstantlyBuild); + return true; + } else { +@@ -714,12 +771,24 @@ + + if (itemstack != null && itemstack.getItem() == Items.LEAD && this.ca()) { + if (!(this instanceof EntityTameableAnimal) || !((EntityTameableAnimal) this).isTamed()) { ++ // CraftBukkit start - fire PlayerLeashEntityEvent ++ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); ++ return false; ++ } ++ // CraftBukkit end + this.setLeashHolder(entityhuman, true); + --itemstack.count; + return true; + } + + if (((EntityTameableAnimal) this).e((EntityLiving) entityhuman)) { ++ // CraftBukkit start - fire PlayerLeashEntityEvent ++ if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); ++ return false; ++ } ++ // CraftBukkit end + this.setLeashHolder(entityhuman, true); + --itemstack.count; + return true; +@@ -741,10 +810,12 @@ + + if (this.bm) { + if (!this.isAlive()) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.PLAYER_UNLEASH)); // CraftBukkit + this.unleash(true, true); + } + + if (this.bn == null || this.bn.dead) { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit + this.unleash(true, true); + } + } +@@ -811,6 +882,7 @@ + + this.bn = entityleash; + } else { ++ this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit + this.unleash(false, true); + } + } diff --git a/nms-patches/EntityIronGolem.patch b/nms-patches/EntityIronGolem.patch new file mode 100644 index 00000000..e71334e1 --- /dev/null +++ b/nms-patches/EntityIronGolem.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityIronGolem.java 2014-11-27 08:59:46.689421900 +1100 ++++ src/main/java/net/minecraft/server/EntityIronGolem.java 2014-11-27 08:42:10.100851012 +1100 +@@ -57,7 +57,7 @@ + + protected void s(Entity entity) { + if (entity instanceof IMonster && this.bb().nextInt(20) == 0) { +- this.setGoalTarget((EntityLiving) entity); ++ this.setGoalTarget((EntityLiving) entity, org.bukkit.event.entity.EntityTargetLivingEntityEvent.TargetReason.COLLISION, true); // CraftBukkit - set reason + } + + super.s(entity); diff --git a/nms-patches/EntityItem.patch b/nms-patches/EntityItem.patch new file mode 100644 index 00000000..0873e363 --- /dev/null +++ b/nms-patches/EntityItem.patch @@ -0,0 +1,115 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityItem.java 2014-11-27 08:59:46.693421882 +1100 ++++ src/main/java/net/minecraft/server/EntityItem.java 2014-11-27 08:42:10.104851005 +1100 +@@ -4,6 +4,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit ++ + public class EntityItem extends Entity { + + private static final Logger b = LogManager.getLogger(); +@@ -13,6 +15,7 @@ + private String f; + private String g; + public float a; ++ private int lastTick = MinecraftServer.currentTick; // CraftBukkit + + public EntityItem(World world, double d0, double d1, double d2) { + super(world); +@@ -28,6 +31,11 @@ + + public EntityItem(World world, double d0, double d1, double d2, ItemStack itemstack) { + this(world, d0, d1, d2); ++ // CraftBukkit start - Can't set null items in the datawatcher ++ if (itemstack == null || itemstack.getItem() == null) { ++ return; ++ } ++ // CraftBukkit end + this.setItemStack(itemstack); + } + +@@ -52,9 +60,12 @@ + this.die(); + } else { + super.s_(); +- if (this.pickupDelay > 0 && this.pickupDelay != 32767) { +- --this.pickupDelay; +- } ++ // CraftBukkit start - Use wall time for pickup and despawn timers ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.pickupDelay -= elapsedTicks; ++ this.age += elapsedTicks; ++ this.lastTick = MinecraftServer.currentTick; ++ // CraftBukkit end + + this.lastX = this.locX; + this.lastY = this.locY; +@@ -90,12 +101,20 @@ + this.motY *= -0.5D; + } + ++ /* Craftbukkit start - moved up + if (this.age != -32768) { + ++this.age; + } ++ // Craftbukkit end */ + + this.W(); + if (!this.world.isStatic && this.age >= 6000) { ++ // CraftBukkit start - fire ItemDespawnEvent ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { ++ this.age = 0; ++ return; ++ } ++ // CraftBukkit end + this.die(); + } + +@@ -228,7 +247,18 @@ + + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); + +- this.setItemStack(ItemStack.createStack(nbttagcompound1)); ++ // CraftBukkit start - Handle missing "Item" compounds ++ if (nbttagcompound1 != null) { ++ ItemStack itemstack = ItemStack.createStack(nbttagcompound1); ++ if (itemstack != null) { ++ this.setItemStack(itemstack); ++ } else { ++ this.die(); ++ } ++ } else { ++ this.die(); ++ } ++ // CraftBukkit end + if (this.getItemStack() == null) { + this.die(); + } +@@ -239,6 +269,26 @@ + if (!this.world.isStatic) { + ItemStack itemstack = this.getItemStack(); + int i = itemstack.count; ++ ++ // CraftBukkit start - fire PlayerPickupItemEvent ++ int canHold = entityhuman.inventory.canHold(itemstack); ++ int remaining = itemstack.count - canHold; ++ ++ if (this.pickupDelay <= 0 && canHold > 0) { ++ itemstack.count = canHold; ++ PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); ++ // event.setCancelled(!entityhuman.canPickUpLoot); TODO ++ this.world.getServer().getPluginManager().callEvent(event); ++ itemstack.count = canHold + remaining; ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ // Possibly < 0; fix here so we do not have to modify code below ++ this.pickupDelay = 0; ++ } ++ // CraftBukkit end + + if (this.pickupDelay == 0 && (this.g == null || 6000 - this.age <= 200 || this.g.equals(entityhuman.getName())) && entityhuman.inventory.pickup(itemstack)) { + if (itemstack.getItem() == Item.getItemOf(Blocks.LOG)) { diff --git a/nms-patches/EntityItemFrame.patch b/nms-patches/EntityItemFrame.patch new file mode 100644 index 00000000..1ae52fd2 --- /dev/null +++ b/nms-patches/EntityItemFrame.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityItemFrame.java 2014-11-27 08:59:46.693421882 +1100 ++++ src/main/java/net/minecraft/server/EntityItemFrame.java 2014-11-27 08:42:10.176850864 +1100 +@@ -27,6 +27,12 @@ + return false; + } else if (!damagesource.isExplosion() && this.getItem() != null) { + if (!this.world.isStatic) { ++ // CraftBukkit start - fire EntityDamageEvent ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) { ++ return true; ++ } ++ // CraftBukkit end ++ + this.a(damagesource.getEntity(), false); + this.setItem((ItemStack) null); + } diff --git a/nms-patches/EntityLargeFireball.patch b/nms-patches/EntityLargeFireball.patch new file mode 100644 index 00000000..2e14fc4d --- /dev/null +++ b/nms-patches/EntityLargeFireball.patch @@ -0,0 +1,38 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLargeFireball.java 2014-11-27 08:59:46.697421864 +1100 ++++ src/main/java/net/minecraft/server/EntityLargeFireball.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit ++ + public class EntityLargeFireball extends EntityFireball { + + public int yield = 1; +@@ -21,7 +23,16 @@ + + boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); + +- this.world.createExplosion((Entity) null, this.locX, this.locY, this.locZ, (float) this.yield, flag, flag); ++ // CraftBukkit start - fire ExplosionPrimeEvent ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(this.world.getServer(), this)); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ // give 'this' instead of (Entity) null so we know what causes the damage ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); ++ } ++ // CraftBukkit end ++ + this.die(); + } + +@@ -35,7 +46,8 @@ + public void a(NBTTagCompound nbttagcompound) { + super.a(nbttagcompound); + if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { +- this.yield = nbttagcompound.getInt("ExplosionPower"); ++ // CraftBukkit - set bukkitYield when setting explosionpower ++ bukkitYield = this.yield = nbttagcompound.getInt("ExplosionPower"); + } + + } diff --git a/nms-patches/EntityLeash.patch b/nms-patches/EntityLeash.patch new file mode 100644 index 00000000..65d979ac --- /dev/null +++ b/nms-patches/EntityLeash.patch @@ -0,0 +1,61 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLeash.java 2014-11-27 08:59:46.701421847 +1100 ++++ src/main/java/net/minecraft/server/EntityLeash.java 2014-11-27 08:42:10.136850942 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityLeash extends EntityHanging { + + public EntityLeash(World world) { +@@ -63,6 +65,12 @@ + while (iterator.hasNext()) { + entityinsentient = (EntityInsentient) iterator.next(); + if (entityinsentient.cb() && entityinsentient.getLeashHolder() == entityhuman) { ++ // CraftBukkit start ++ if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, this, entityhuman).isCancelled()) { ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, entityinsentient, entityinsentient.getLeashHolder())); ++ continue; ++ } ++ // CraftBukkit end + entityinsentient.setLeashHolder(this, true); + flag = true; + } +@@ -70,8 +78,11 @@ + } + + if (!this.world.isStatic && !flag) { +- this.die(); +- if (entityhuman.abilities.canInstantlyBuild) { ++ // CraftBukkit start - Move below ++ // this.die(); ++ boolean die = true; ++ // CraftBukkit end ++ if (true || entityhuman.abilities.canInstantlyBuild) { // CraftBukkit - Process for non-creative as well + d0 = 7.0D; + list = this.world.a(EntityInsentient.class, new AxisAlignedBB(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); + iterator = list.iterator(); +@@ -79,10 +90,21 @@ + while (iterator.hasNext()) { + entityinsentient = (EntityInsentient) iterator.next(); + if (entityinsentient.cb() && entityinsentient.getLeashHolder() == this) { +- entityinsentient.unleash(true, false); ++ // CraftBukkit start ++ if (CraftEventFactory.callPlayerUnleashEntityEvent(entityinsentient, entityhuman).isCancelled()) { ++ die = false; ++ continue; ++ } ++ entityinsentient.unleash(true, !entityhuman.abilities.canInstantlyBuild); // false -> survival mode boolean ++ // CraftBukkit end + } + } + } ++ // CraftBukkit start ++ if (die) { ++ this.die(); ++ } ++ // CraftBukkit end + } + + return true; diff --git a/nms-patches/EntityLightning.patch b/nms-patches/EntityLightning.patch new file mode 100644 index 00000000..7e8633d2 --- /dev/null +++ b/nms-patches/EntityLightning.patch @@ -0,0 +1,111 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLightning.java 2014-11-27 08:59:46.701421847 +1100 ++++ src/main/java/net/minecraft/server/EntityLightning.java 2014-11-27 08:42:10.116850981 +1100 +@@ -2,30 +2,54 @@ + + import java.util.List; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityLightning extends EntityWeather { + + private int lifeTicks; + public long a; + private int c; ++ ++ // CraftBukkit start ++ public boolean isEffect = false; + + public EntityLightning(World world, double d0, double d1, double d2) { ++ this(world, d0, d1, d2, false); ++ } ++ ++ public EntityLightning(World world, double d0, double d1, double d2, boolean isEffect) { ++ // CraftBukkit end ++ + super(world); ++ ++ // CraftBukkit - Set isEffect ++ this.isEffect = isEffect; ++ + this.setPositionRotation(d0, d1, d2, 0.0F, 0.0F); + this.lifeTicks = 2; + this.a = this.random.nextLong(); + this.c = this.random.nextInt(3) + 1; +- if (!world.isStatic && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(new BlockPosition(this), 10)) { ++ // CraftBukkit - add "!isEffect" ++ if (!isEffect && !world.isStatic && world.getGameRules().getBoolean("doFireTick") && (world.getDifficulty() == EnumDifficulty.NORMAL || world.getDifficulty() == EnumDifficulty.HARD) && world.areChunksLoaded(new BlockPosition(this), 10)) { + BlockPosition blockposition = new BlockPosition(this); + +- if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition)) { +- world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition)) { ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + + for (int i = 0; i < 4; ++i) { + BlockPosition blockposition1 = blockposition.a(this.random.nextInt(3) - 1, this.random.nextInt(3) - 1, this.random.nextInt(3) - 1); + +- if (world.getType(blockposition1).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition1)) { +- world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); ++ if (world.getType(blockposition1).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, blockposition1)) { ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), this).isCancelled()) { ++ world.setTypeUpdate(blockposition1, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } +@@ -35,7 +59,24 @@ + public void s_() { + super.s_(); + if (this.lifeTicks == 2) { +- this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); ++ // CraftBukkit start - Use relative location for far away sounds ++ //this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); ++ float pitch = 0.8F + this.random.nextFloat() * 0.2F; ++ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; ++ for (EntityPlayer player : (List<EntityPlayer>) this.world.players) { ++ double deltaX = this.locX - player.locX; ++ double deltaZ = this.locZ - player.locZ; ++ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; ++ if (distanceSquared > viewDistance * viewDistance) { ++ double deltaLength = Math.sqrt(distanceSquared); ++ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; ++ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; ++ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", relativeX, this.locY, relativeZ, 10000.0F, pitch)); ++ } else { ++ player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", this.locX, this.locY, this.locZ, 10000.0F, pitch)); ++ } ++ } ++ // CraftBukkit end + this.world.makeSound(this.locX, this.locY, this.locZ, "random.explode", 2.0F, 0.5F + this.random.nextFloat() * 0.2F); + } + +@@ -48,14 +89,18 @@ + this.lifeTicks = 1; + this.a = this.random.nextLong(); + BlockPosition blockposition = new BlockPosition(this); +- +- if (!this.world.isStatic && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, blockposition)) { +- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ // CraftBukkit - add "!isEffect" ++ if (!isEffect && !this.world.isStatic && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(blockposition, 10) && this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, blockposition)) { ++ // CraftBukkit start ++ if (!CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } + +- if (this.lifeTicks >= 0) { ++ if (this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - add !this.isEffect + if (this.world.isStatic) { + this.world.c(2); + } else { diff --git a/nms-patches/EntityLiving.patch b/nms-patches/EntityLiving.patch new file mode 100644 index 00000000..880a5b32 --- /dev/null +++ b/nms-patches/EntityLiving.patch @@ -0,0 +1,440 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityLiving.java 2014-11-27 08:59:46.705421829 +1100 ++++ src/main/java/net/minecraft/server/EntityLiving.java 2014-11-27 08:42:10.160850895 +1100 +@@ -8,6 +8,15 @@ + import java.util.Random; + import java.util.UUID; + ++// CraftBukkit start ++import java.util.ArrayList; ++import com.google.common.base.Function; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityDamageEvent; ++import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; ++import org.bukkit.event.entity.EntityRegainHealthEvent; ++// CraftBukkit end ++ + public abstract class EntityLiving extends Entity { + + private static final UUID a = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"); +@@ -67,6 +76,11 @@ + private float bk; + private int bl; + private float bm; ++ // CraftBukkit start ++ public int expToDrop; ++ public int maxAirTicks = 300; ++ ArrayList<org.bukkit.inventory.ItemStack> drops = null; ++ // CraftBukkit end + + public void G() { + this.damageEntity(DamageSource.OUT_OF_WORLD, Float.MAX_VALUE); +@@ -75,7 +89,8 @@ + public EntityLiving(World world) { + super(world); + this.aW(); +- this.setHealth(this.getMaxHealth()); ++ // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor ++ this.datawatcher.watch(6, (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue()); + this.k = true; + this.aF = (float) ((Math.random() + 1.0D) * 0.009999999776482582D); + this.setPosition(this.locX, this.locY, this.locZ); +@@ -116,8 +131,14 @@ + } + + int i = (int) (150.0D * d1); +- +- ((WorldServer) this.world).a(EnumParticle.BLOCK_DUST, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); ++ ++ // CraftBukkit start - visiblity api ++ if (this instanceof EntityPlayer) { ++ ((WorldServer) this.world).sendParticles((EntityPlayer) this, EnumParticle.BLOCK_DUST, false, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); ++ } else { ++ ((WorldServer) this.world).a(EnumParticle.BLOCK_DUST, this.locX, this.locY, this.locZ, i, 0.0D, 0.0D, 0.0D, 0.15000000596046448D, new int[] { Block.getCombinedId(iblockdata)}); ++ } ++ // CraftBukkit end + } + } + +@@ -174,7 +195,11 @@ + this.mount((Entity) null); + } + } else { +- this.setAirTicks(300); ++ // CraftBukkit start - Only set if needed to work around a DataWatcher inefficiency ++ if (this.getAirTicks() != 300) { ++ this.setAirTicks(maxAirTicks); ++ } ++ // CraftBukkit end + } + + if (this.isAlive() && this.U()) { +@@ -220,6 +245,18 @@ + this.lastPitch = this.pitch; + this.world.methodProfiler.b(); + } ++ ++ // CraftBukkit start ++ public int getExpReward() { ++ int exp = this.getExpValue(this.killer); ++ ++ if (!this.world.isStatic && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.aZ() && this.world.getGameRules().getBoolean("doMobLoot")) { ++ return exp; ++ } else { ++ return 0; ++ } ++ } ++ // CraftBukkit end + + public boolean isBaby() { + return false; +@@ -227,19 +264,18 @@ + + protected void aY() { + ++this.deathTicks; +- if (this.deathTicks == 20) { ++ if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead) + int i; + +- if (!this.world.isStatic && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.aZ() && this.world.getGameRules().getBoolean("doMobLoot")) { +- i = this.getExpValue(this.killer); +- +- while (i > 0) { +- int j = EntityExperienceOrb.getOrbValue(i); +- +- i -= j; +- this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); +- } ++ // CraftBukkit start - Update getExpReward() above if the removed if() changes! ++ i = this.expToDrop; ++ while (i > 0) { ++ int j = EntityExperienceOrb.getOrbValue(i); ++ i -= j; ++ this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); + } ++ this.expToDrop = 0; ++ // CraftBukkit end + + this.die(); + +@@ -375,6 +411,17 @@ + } + } + } ++ ++ // CraftBukkit start ++ if (nbttagcompound.hasKey("Bukkit.MaxHealth")) { ++ NBTBase nbtbase = nbttagcompound.get("Bukkit.MaxHealth"); ++ if (nbtbase.getTypeId() == 5) { ++ this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagFloat) nbtbase).c()); ++ } else if (nbtbase.getTypeId() == 3) { ++ this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagInt) nbtbase).d()); ++ } ++ } ++ // CraftBukkit end + + if (nbttagcompound.hasKeyOfType("HealF", 99)) { + this.setHealth(nbttagcompound.getFloat("HealF")); +@@ -486,7 +533,8 @@ + } + + public boolean hasEffect(int i) { +- return this.effects.containsKey(Integer.valueOf(i)); ++ // CraftBukkit - Add size check for efficiency ++ return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(i)); + } + + public boolean hasEffect(MobEffectList mobeffectlist) { +@@ -560,20 +608,52 @@ + + } + ++ // CraftBukkit start - Delegate so we can handle providing a reason for health being regained + public void heal(float f) { ++ heal(f, EntityRegainHealthEvent.RegainReason.CUSTOM); ++ } ++ ++ public void heal(float f, EntityRegainHealthEvent.RegainReason regainReason) { + float f1 = this.getHealth(); + + if (f1 > 0.0F) { +- this.setHealth(f1 + f); ++ EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setHealth((float) (this.getHealth() + event.getAmount())); ++ } ++ // CraftBukkit end + } + + } + + public final float getHealth() { ++ // CraftBukkit start - Use unscaled health ++ if (this instanceof EntityPlayer) { ++ return (float) ((EntityPlayer) this).getBukkitEntity().getHealth(); ++ } ++ // CraftBukkit end + return this.datawatcher.getFloat(6); + } + + public void setHealth(float f) { ++ // CraftBukkit start - Handle scaled health ++ if (this instanceof EntityPlayer) { ++ org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayer) this).getBukkitEntity(); ++ // Squeeze ++ if (f < 0.0F) { ++ player.setRealHealth(0.0D); ++ } else if (f > player.getMaxHealth()) { ++ player.setRealHealth(player.getMaxHealth()); ++ } else { ++ player.setRealHealth(f); ++ } ++ ++ this.datawatcher.watch(6, Float.valueOf(player.getScaledHealth())); ++ return; ++ } ++ // CraftBukkit end + this.datawatcher.watch(6, Float.valueOf(MathHelper.a(f, 0.0F, this.getMaxHealth()))); + } + +@@ -589,7 +669,8 @@ + } else if (damagesource.o() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) { + return false; + } else { +- if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { ++ // CraftBukkit - Moved into d(DamageSource, float) ++ if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { + this.getEquipment(4).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this); + f *= 0.75F; + } +@@ -602,13 +683,22 @@ + return false; + } + +- this.d(damagesource, f - this.lastDamage); ++ // CraftBukkit start ++ if (!this.d(damagesource, f - this.lastDamage)) { ++ return false; ++ } ++ // CraftBukkit end + this.lastDamage = f; + flag = false; + } else { ++ // CraftBukkit start ++ float previousHealth = this.getHealth(); ++ if (!this.d(damagesource, f)) { ++ return false; ++ } + this.lastDamage = f; + this.noDamageTicks = this.maxNoDamageTicks; +- this.d(damagesource, f); ++ // CraftBukkit end + this.hurtTicks = this.at = 10; + } + +@@ -717,11 +807,19 @@ + } + + if (this.aZ() && this.world.getGameRules().getBoolean("doMobLoot")) { ++ this.drops = new ArrayList<org.bukkit.inventory.ItemStack>(); // CraftBukkit - Setup drop capture ++ + this.dropDeathLoot(this.lastDamageByPlayerTime > 0, i); + this.dropEquipment(this.lastDamageByPlayerTime > 0, i); + if (this.lastDamageByPlayerTime > 0 && this.random.nextFloat() < 0.025F + (float) i * 0.01F) { + this.getRareDrop(); +- } ++ } ++ // CraftBukkit start - Call death event ++ CraftEventFactory.callEntityDeathEvent(this, this.drops); ++ this.drops = null; ++ } else { ++ CraftEventFactory.callEntityDeathEvent(this); ++ // CraftBukkit end + } + } + +@@ -781,8 +879,13 @@ + int i = MathHelper.f((f - 3.0F - f2) * f1); + + if (i > 0) { ++ // CraftBukkit start ++ if (!this.damageEntity(DamageSource.FALL, (float) i)) { ++ return; ++ } ++ // CraftBukkit end + this.makeSound(this.n(i), 1.0F, 1.0F); +- this.damageEntity(DamageSource.FALL, (float) i); ++ // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up + int j = MathHelper.floor(this.locX); + int k = MathHelper.floor(this.locY - 0.20000000298023224D); + int l = MathHelper.floor(this.locZ); +@@ -826,7 +929,7 @@ + int i = 25 - this.bq(); + float f1 = f * (float) i; + +- this.damageArmor(f); ++ // this.damageArmor(f); // CraftBukkit - Moved into d(DamageSource, float) + f = f1 / 25.0F; + } + +@@ -840,8 +943,9 @@ + int i; + int j; + float f1; +- +- if (this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { ++ ++ // CraftBukkit - Moved to d(DamageSource, float) ++ if (false && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { + i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; + j = 25 - i; + f1 = f * (float) j; +@@ -867,22 +971,117 @@ + } + } + +- protected void d(DamageSource damagesource, float f) { ++ // CraftBukkit start ++ protected boolean d(final DamageSource damagesource, float f) { // void -> boolean, add final + if (!this.isInvulnerable(damagesource)) { +- f = this.applyArmorModifier(damagesource, f); +- f = this.applyMagicModifier(damagesource, f); +- float f1 = f; ++ final boolean human = this instanceof EntityHuman; ++ float originalDamage = f; ++ Function<Double, Double> hardHat = new Function<Double, Double>() { ++ @Override ++ public Double apply(Double f) { ++ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && EntityLiving.this.getEquipment(4) != null) { ++ return -(f - (f * 0.75F)); ++ } ++ return -0.0; ++ } ++ }; ++ float hardHatModifier = hardHat.apply((double) f).floatValue(); ++ f += hardHatModifier; ++ ++ Function<Double, Double> blocking = new Function<Double, Double>() { ++ @Override ++ public Double apply(Double f) { ++ if (human) { ++ if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f > 0.0F) { ++ return -(f - ((1.0F + f) * 0.5F)); ++ } ++ } ++ return -0.0; ++ } ++ }; ++ float blockingModifier = blocking.apply((double) f).floatValue(); ++ f += blockingModifier; ++ ++ Function<Double, Double> armor = new Function<Double, Double>() { ++ @Override ++ public Double apply(Double f) { ++ return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue())); ++ } ++ }; ++ float armorModifier = armor.apply((double) f).floatValue(); ++ f += armorModifier; ++ ++ Function<Double, Double> resistance = new Function<Double, Double>() { ++ @Override ++ public Double apply(Double f) { ++ if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { ++ int i = (EntityLiving.this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; ++ int j = 25 - i; ++ float f1 = f.floatValue() * (float) j; ++ return -(f - (f1 / 25.0F)); ++ } ++ return -0.0; ++ } ++ }; ++ float resistanceModifier = resistance.apply((double) f).floatValue(); ++ f += resistanceModifier; ++ ++ Function<Double, Double> magic = new Function<Double, Double>() { ++ @Override ++ public Double apply(Double f) { ++ return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue())); ++ } ++ }; ++ float magicModifier = magic.apply((double) f).floatValue(); ++ f += magicModifier; ++ ++ Function<Double, Double> absorption = new Function<Double, Double>() { ++ @Override ++ public Double apply(Double f) { ++ return -(Math.max(f - Math.max(f - EntityLiving.this.getAbsorptionHearts(), 0.0F), 0.0F)); ++ } ++ }; ++ float absorptionModifier = absorption.apply((double) f).floatValue(); ++ ++ EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, hardHat, blocking, armor, resistance, magic, absorption); ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ f = (float) event.getFinalDamage(); + +- f = Math.max(f - this.getAbsorptionHearts(), 0.0F); +- this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f)); ++ // Apply damage to helmet ++ if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { ++ this.getEquipment(4).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this); ++ } ++ ++ // Apply damage to armor ++ if (!damagesource.ignoresArmor()) { ++ float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT)); ++ this.damageArmor(armorDamage); ++ } ++ ++ absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION); ++ this.setAbsorptionHearts(Math.max(this.getAbsorptionHearts() - absorptionModifier, 0.0F)); + if (f != 0.0F) { ++ if (human) { ++ ((EntityHuman) this).applyExhaustion(damagesource.getExhaustionCost()); ++ } ++ // CraftBukkit end + float f2 = this.getHealth(); + + this.setHealth(f2 - f); + this.br().a(damagesource, f2, f); ++ // CraftBukkit start ++ if (human) { ++ return true; ++ } ++ // CraftBukkit end + this.setAbsorptionHearts(this.getAbsorptionHearts() - f); + } ++ return true; // CraftBukkit + } ++ return false; // CraftBukkit + } + + public CombatTracker br() { +@@ -1236,7 +1435,8 @@ + if (f > 0.0025000002F) { + f3 = 1.0F; + f2 = (float) Math.sqrt((double) f) * 3.0F; +- f1 = (float) Math.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; ++ // CraftBukkit - Math -> TrigMath ++ f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; + } + + if (this.ax > 0.0F) { +@@ -1400,6 +1600,13 @@ + if (list != null && !list.isEmpty()) { + for (int i = 0; i < list.size(); ++i) { + Entity entity = (Entity) list.get(i); ++ ++ // TODO better check now? ++ // CraftBukkit start - Only handle mob (non-player) collisions every other tick ++ if (entity instanceof EntityLiving && !(this instanceof EntityPlayer) && this.ticksLived % 2 == 0) { ++ continue; ++ } ++ // CraftBukkit end + + if (entity.ae()) { + this.s(entity); diff --git a/nms-patches/EntityMinecartAbstract.patch b/nms-patches/EntityMinecartAbstract.patch new file mode 100644 index 00000000..c8ed3d56 --- /dev/null +++ b/nms-patches/EntityMinecartAbstract.patch @@ -0,0 +1,231 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMinecartAbstract.java 2014-11-27 08:59:46.705421829 +1100 ++++ src/main/java/net/minecraft/server/EntityMinecartAbstract.java 2014-11-27 08:42:10.136850942 +1100 +@@ -2,6 +2,15 @@ + + import java.util.Iterator; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.entity.Vehicle; ++import org.bukkit.event.vehicle.VehicleDamageEvent; ++import org.bukkit.event.vehicle.VehicleDestroyEvent; ++import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; ++import org.bukkit.util.Vector; ++// CraftBukkit end ++ + public abstract class EntityMinecartAbstract extends Entity implements INamableTileEntity { + + private boolean a; +@@ -13,6 +22,17 @@ + private double g; + private double h; + private double i; ++ ++ // CraftBukkit start ++ public boolean slowWhenEmpty = true; ++ private double derailedX = 0.5; ++ private double derailedY = 0.5; ++ private double derailedZ = 0.5; ++ private double flyingX = 0.95; ++ private double flyingY = 0.95; ++ private double flyingZ = 0.95; ++ public double maxSpeed = 0.4D; ++ // CraftBukkit end + + public EntityMinecartAbstract(World world) { + super(world); +@@ -79,6 +99,8 @@ + this.lastX = d0; + this.lastY = d1; + this.lastZ = d2; ++ ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit + } + + public double an() { +@@ -90,16 +112,39 @@ + if (this.isInvulnerable(damagesource)) { + return false; + } else { ++ // CraftBukkit start - fire VehicleDamageEvent ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); ++ ++ VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return true; ++ } ++ ++ f = (float) event.getDamage(); ++ // CraftBukkit end ++ + this.k(-this.r()); + this.j(10); + this.ac(); + this.setDamage(this.getDamage() + f * 10.0F); + boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; + +- if (flag || this.getDamage() > 40.0F) { ++ if (flag || this.getDamage() > 40.0F) { // CraftBukkit - multi-world should still allow teleport even if default vanilla nether disabled + if (this.passenger != null) { + this.passenger.mount((Entity) null); + } ++ // CraftBukkit start ++ VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); ++ this.world.getServer().getPluginManager().callEvent(destroyEvent); ++ ++ if (destroyEvent.isCancelled()) { ++ this.setDamage(40); // Maximize damage so this doesn't get triggered again right away ++ return true; ++ } ++ // CraftBukkit end + + if (flag && !this.hasCustomName()) { + this.die(); +@@ -135,6 +180,14 @@ + } + + public void s_() { ++ // CraftBukkit start ++ double prevX = this.locX; ++ double prevY = this.locY; ++ double prevZ = this.locZ; ++ float prevYaw = this.yaw; ++ float prevPitch = this.pitch; ++ // CraftBukkit end ++ + if (this.getType() > 0) { + this.j(this.getType() - 1); + } +@@ -155,7 +208,7 @@ + + i = this.L(); + if (this.ak) { +- if (minecraftserver.getAllowNether()) { ++ if (true || minecraftserver.getAllowNether()) { + if (this.vehicle == null && this.al++ >= i) { + this.al = i; + this.portalCooldown = this.ar(); +@@ -252,6 +305,20 @@ + } + + this.setYawPitch(this.yaw, this.pitch); ++ ++ // CraftBukkit start ++ org.bukkit.World bworld = this.world.getWorld(); ++ Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); ++ Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); ++ ++ if (!from.equals(to)) { ++ this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); ++ } ++ // CraftBukkit end ++ + Iterator iterator = this.world.getEntities(this, this.getBoundingBox().grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); + + while (iterator.hasNext()) { +@@ -275,7 +342,7 @@ + } + + protected double m() { +- return 0.4D; ++ return this.maxSpeed; // CraftBukkit + } + + public void a(int i, int j, int k, boolean flag) {} +@@ -286,16 +353,20 @@ + this.motX = MathHelper.a(this.motX, -d0, d0); + this.motZ = MathHelper.a(this.motZ, -d0, d0); + if (this.onGround) { +- this.motX *= 0.5D; +- this.motY *= 0.5D; +- this.motZ *= 0.5D; ++ // CraftBukkit start - replace magic numbers with our variables ++ this.motX *= this.derailedX; ++ this.motY *= this.derailedY; ++ this.motZ *= this.derailedZ; ++ // CraftBukkit end + } + + this.move(this.motX, this.motY, this.motZ); + if (!this.onGround) { +- this.motX *= 0.949999988079071D; +- this.motY *= 0.949999988079071D; +- this.motZ *= 0.949999988079071D; ++ // CraftBukkit start - replace magic numbers with our variables ++ this.motX *= this.flyingX; ++ this.motY *= this.flyingY; ++ this.motZ *= this.flyingZ; ++ // CraftBukkit end + } + + } +@@ -483,7 +554,7 @@ + } + + protected void o() { +- if (this.passenger != null) { ++ if (this.passenger != null || !this.slowWhenEmpty) { // CraftBukkit - add !this.slowWhenEmpty + this.motX *= 0.996999979019165D; + this.motY *= 0.0D; + this.motZ *= 0.996999979019165D; +@@ -611,6 +682,17 @@ + if (!this.world.isStatic) { + if (!entity.T && !this.T) { + if (entity != this.passenger) { ++ // CraftBukkit start ++ Vehicle vehicle = (Vehicle) this.getBukkitEntity(); ++ org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); ++ ++ VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, hitEntity); ++ this.world.getServer().getPluginManager().callEvent(collisionEvent); ++ ++ if (collisionEvent.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + if (entity instanceof EntityLiving && !(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && this.s() == EnumMinecartType.RIDEABLE && this.motX * this.motX + this.motZ * this.motZ > 0.01D && this.passenger == null && entity.vehicle == null) { + entity.mount(this); + } +@@ -619,7 +701,8 @@ + double d1 = entity.locZ - this.locZ; + double d2 = d0 * d0 + d1 * d1; + +- if (d2 >= 9.999999747378752E-5D) { ++ // CraftBukkit - collision ++ if (d2 >= 9.999999747378752E-5D && !collisionEvent.isCollisionCancelled()) { + d2 = (double) MathHelper.sqrt(d2); + d0 /= d2; + d1 /= d2; +@@ -775,4 +858,26 @@ + return chatmessage; + } + } ++ ++ // CraftBukkit start - Methods for getting and setting flying and derailed velocity modifiers ++ public Vector getFlyingVelocityMod() { ++ return new Vector(flyingX, flyingY, flyingZ); ++ } ++ ++ public void setFlyingVelocityMod(Vector flying) { ++ flyingX = flying.getX(); ++ flyingY = flying.getY(); ++ flyingZ = flying.getZ(); ++ } ++ ++ public Vector getDerailedVelocityMod() { ++ return new Vector(derailedX, derailedY, derailedZ); ++ } ++ ++ public void setDerailedVelocityMod(Vector derailed) { ++ derailedX = derailed.getX(); ++ derailedY = derailed.getY(); ++ derailedZ = derailed.getZ(); ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityMinecartCommandBlockListener.patch b/nms-patches/EntityMinecartCommandBlockListener.patch new file mode 100644 index 00000000..ccfa4973 --- /dev/null +++ b/nms-patches/EntityMinecartCommandBlockListener.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMinecartCommandBlockListener.java 2014-11-27 08:59:46.709421812 +1100 ++++ src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java 2014-11-27 08:42:10.088851036 +1100 +@@ -6,6 +6,7 @@ + + EntityMinecartCommandBlockListener(EntityMinecartCommandBlock entityminecartcommandblock) { + this.a = entityminecartcommandblock; ++ this.sender = (org.bukkit.craftbukkit.entity.CraftMinecartCommand) entityminecartcommandblock.getBukkitEntity(); // CraftBukkit - Set the sender + } + + public void h() { diff --git a/nms-patches/EntityMinecartContainer.patch b/nms-patches/EntityMinecartContainer.patch new file mode 100644 index 00000000..3a7c0c58 --- /dev/null +++ b/nms-patches/EntityMinecartContainer.patch @@ -0,0 +1,61 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMinecartContainer.java 2014-11-27 08:59:46.709421812 +1100 ++++ src/main/java/net/minecraft/server/EntityMinecartContainer.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,9 +1,48 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.inventory.InventoryHolder; ++// CraftBukkit end ++ + public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements ITileInventory { + +- private ItemStack[] items = new ItemStack[36]; ++ private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 + private boolean b = true; ++ ++ // CraftBukkit start ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public InventoryHolder getOwner() { ++ org.bukkit.entity.Entity cart = getBukkitEntity(); ++ if(cart instanceof InventoryHolder) return (InventoryHolder) cart; ++ return null; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public EntityMinecartContainer(World world) { + super(world); +@@ -81,7 +120,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public void c(int i) { diff --git a/nms-patches/EntityMonster.patch b/nms-patches/EntityMonster.patch new file mode 100644 index 00000000..f5500fac --- /dev/null +++ b/nms-patches/EntityMonster.patch @@ -0,0 +1,26 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMonster.java 2014-11-27 08:59:46.709421812 +1100 ++++ src/main/java/net/minecraft/server/EntityMonster.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit ++ + public abstract class EntityMonster extends EntityCreature implements IMonster { + + protected final PathfinderGoal a = new PathfinderGoalAvoidTarget(this, new EntitySelectorExplodingCreeper(this), 4.0F, 1.0D, 2.0D); +@@ -81,7 +83,14 @@ + int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); + + if (j > 0) { +- entity.setOnFire(j * 4); ++ // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item ++ EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); ++ org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); ++ ++ if (!combustEvent.isCancelled()) { ++ entity.setOnFire(combustEvent.getDuration()); ++ } ++ // CraftBukkit end + } + + this.a((EntityLiving) this, entity); diff --git a/nms-patches/EntityMushroomCow.patch b/nms-patches/EntityMushroomCow.patch new file mode 100644 index 00000000..2d2507ed --- /dev/null +++ b/nms-patches/EntityMushroomCow.patch @@ -0,0 +1,26 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityMushroomCow.java 2014-11-27 08:59:46.713421793 +1100 ++++ src/main/java/net/minecraft/server/EntityMushroomCow.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.player.PlayerShearEntityEvent; // CraftBukkit ++ + public class EntityMushroomCow extends EntityCow { + + public EntityMushroomCow(World world) { +@@ -24,6 +26,15 @@ + } + + if (itemstack != null && itemstack.getItem() == Items.SHEARS && this.getAge() >= 0) { ++ // CraftBukkit start ++ PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ + this.die(); + this.world.addParticle(EnumParticle.EXPLOSION_LARGE, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, 0.0D, 0.0D, 0.0D, new int[0]); + if (!this.world.isStatic) { diff --git a/nms-patches/EntityOcelot.patch b/nms-patches/EntityOcelot.patch new file mode 100644 index 00000000..1abf343c --- /dev/null +++ b/nms-patches/EntityOcelot.patch @@ -0,0 +1,30 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityOcelot.java 2014-11-27 08:59:46.713421793 +1100 ++++ src/main/java/net/minecraft/server/EntityOcelot.java 2014-11-27 08:42:10.160850895 +1100 +@@ -51,7 +51,7 @@ + } + + protected boolean isTypeNotPersistent() { +- return !this.isTamed() && this.ticksLived > 2400; ++ return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit + } + + protected void aW() { +@@ -124,7 +124,8 @@ + } + + if (!this.world.isStatic) { +- if (this.random.nextInt(3) == 0) { ++ // CraftBukkit - added event call and isCancelled check ++ if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { + this.setTamed(true); + this.setCatType(1 + this.world.random.nextInt(3)); + this.setOwnerUUID(entityhuman.getUniqueID().toString()); +@@ -231,7 +232,7 @@ + + entityocelot.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); + entityocelot.setAgeRaw(-24000); +- this.world.addEntity(entityocelot); ++ this.world.addEntity(entityocelot, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OCELOT_BABY); // CraftBukkit - add SpawnReason + } + } + diff --git a/nms-patches/EntityPainting.patch b/nms-patches/EntityPainting.patch new file mode 100644 index 00000000..7c698b4f --- /dev/null +++ b/nms-patches/EntityPainting.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPainting.java 2014-11-27 08:59:46.717421776 +1100 ++++ src/main/java/net/minecraft/server/EntityPainting.java 2014-11-27 08:42:10.132850949 +1100 +@@ -9,6 +9,7 @@ + + public EntityPainting(World world) { + super(world); ++ this.art = EnumArt.values()[this.random.nextInt(EnumArt.values().length)]; // CraftBukkit - generate a non-null painting + } + + public EntityPainting(World world, BlockPosition blockposition, EnumDirection enumdirection) { diff --git a/nms-patches/EntityPig.patch b/nms-patches/EntityPig.patch new file mode 100644 index 00000000..064655a7 --- /dev/null +++ b/nms-patches/EntityPig.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPig.java 2014-11-27 08:59:46.717421776 +1100 ++++ src/main/java/net/minecraft/server/EntityPig.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit ++ + public class EntityPig extends EntityAnimal { + + private final PathfinderGoalPassengerCarrotStick bk; +@@ -111,10 +113,17 @@ + public void onLightningStrike(EntityLightning entitylightning) { + if (!this.world.isStatic) { + EntityPigZombie entitypigzombie = new EntityPigZombie(this.world); ++ ++ // CraftBukkit start ++ if (CraftEventFactory.callPigZapEvent(this, entitylightning, entitypigzombie).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + + entitypigzombie.setEquipment(0, new ItemStack(Items.GOLDEN_SWORD)); + entitypigzombie.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); +- this.world.addEntity(entitypigzombie); ++ // CraftBukkit - added a reason for spawning this creature ++ this.world.addEntity(entitypigzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); + this.die(); + } + } diff --git a/nms-patches/EntityPlayer.patch b/nms-patches/EntityPlayer.patch new file mode 100644 index 00000000..e63348a0 --- /dev/null +++ b/nms-patches/EntityPlayer.patch @@ -0,0 +1,542 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPlayer.java 2014-11-27 08:59:46.721421758 +1100 ++++ src/main/java/net/minecraft/server/EntityPlayer.java 2014-11-27 08:42:10.164850887 +1100 +@@ -13,6 +13,17 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.WeatherType; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.inventory.InventoryType; ++import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; ++// CraftBukkit end ++ + public class EntityPlayer extends EntityHuman implements ICrafting { + + private static final Logger bF = LogManager.getLogger(); +@@ -39,6 +50,18 @@ + public boolean g; + public int ping; + public boolean viewingCredits; ++ ++ // CraftBukkit start ++ public String displayName; ++ public IChatBaseComponent listName; ++ public org.bukkit.Location compassTarget; ++ public int newExp = 0; ++ public int newLevel = 0; ++ public int newTotalExp = 0; ++ public boolean keepLevel = false; ++ public double maxHealthCache; ++ public boolean joining = true; ++ // CraftBukkit end + + public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { + super(worldserver, gameprofile); +@@ -69,7 +92,11 @@ + while (!worldserver.getCubes(this, this.getBoundingBox()).isEmpty() && this.locY < 255.0D) { + this.setPosition(this.locX, this.locY + 1.0D, this.locZ); + } +- ++ // CraftBukkit start ++ this.displayName = this.getName(); ++ // this.canPickUpLoot = true; TODO ++ this.maxHealthCache = this.getMaxHealth(); ++ // CraftBukkit end + } + + public void a(NBTTagCompound nbttagcompound) { +@@ -81,13 +108,39 @@ + this.playerInteractManager.setGameMode(EnumGamemode.getById(nbttagcompound.getInt("playerGameType"))); + } + } +- ++ this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit + } + + public void b(NBTTagCompound nbttagcompound) { + super.b(nbttagcompound); + nbttagcompound.setInt("playerGameType", this.playerInteractManager.getGameMode().getId()); ++ this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit ++ } ++ ++ // CraftBukkit start - World fallback code, either respawn location or global spawn ++ public void spawnIn(World world) { ++ super.spawnIn(world); ++ if (world == null) { ++ this.dead = false; ++ BlockPosition position = null; ++ if (this.spawnWorld != null && !this.spawnWorld.equals("")) { ++ CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld); ++ if (cworld != null && this.getBed() != null) { ++ world = cworld.getHandle(); ++ position = EntityHuman.getBed(cworld.getHandle(), this.getBed(), false); ++ } ++ } ++ if (world == null || position == null) { ++ world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); ++ position = world.getSpawn(); ++ } ++ this.world = world; ++ this.setPosition(position.getX() + 0.5, position.getY(), position.getZ() + 0.5); ++ } ++ this.dimension = ((WorldServer) this.world).dimension; ++ this.playerInteractManager.a((WorldServer) world); + } ++ // CraftBukkit end + + public void levelDown(int i) { + super.levelDown(i); +@@ -114,6 +167,11 @@ + } + + public void s_() { ++ // CraftBukkit start ++ if (this.joining) { ++ this.joining = false; ++ } ++ // CraftBukkit end + this.playerInteractManager.a(); + --this.invulnerableTicks; + if (this.noDamageTicks > 0) { +@@ -155,7 +213,7 @@ + chunk = this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z); + if (chunk.isReady()) { + arraylist.add(chunk); +- arraylist1.addAll(((WorldServer) this.world).getTileEntities(chunkcoordintpair.x * 16, 0, chunkcoordintpair.z * 16, chunkcoordintpair.x * 16 + 16, 256, chunkcoordintpair.z * 16 + 16)); ++ arraylist1.addAll(chunk.tileEntities.values()); // CraftBukkit - Get tile entities directly from the chunk instead of the world + iterator1.remove(); + } + } +@@ -220,8 +278,9 @@ + } + } + ++ // CraftBukkit - Optionally scale health + if (this.getHealth() != this.bK || this.bL != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.bM) { +- this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); ++ this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getBukkitEntity().getScaledHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); + this.bK = this.getHealth(); + this.bL = this.foodData.getFoodLevel(); + this.bM = this.foodData.getSaturationLevel() == 0.0F; +@@ -229,15 +288,14 @@ + + if (this.getHealth() + this.getAbsorptionHearts() != this.bJ) { + this.bJ = this.getHealth() + this.getAbsorptionHearts(); +- Collection collection = this.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.g); +- Iterator iterator = collection.iterator(); +- +- while (iterator.hasNext()) { +- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); +- +- this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).updateForList(Arrays.asList(new EntityHuman[] { this})); +- } ++ // CraftBukkit - Update ALL the scores! ++ this.world.getServer().getScoreboardManager().updateAllScoresForList(IScoreboardCriteria.f, this.getName(), com.google.common.collect.ImmutableList.of(this)); ++ } ++ // CraftBukkit start - Force max health updates ++ if (this.maxHealthCache != this.getMaxHealth()) { ++ this.getBukkitEntity().updateScaledHealth(); + } ++ // CraftBukkit end + + if (this.expTotal != this.lastSentExp) { + this.lastSentExp = this.expTotal; +@@ -247,7 +305,17 @@ + if (this.ticksLived % 20 * 5 == 0 && !this.getStatisticManager().hasAchievement(AchievementList.L)) { + this.h_(); + } ++ ++ // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent ++ if (this.oldLevel == -1) { ++ this.oldLevel = this.expLevel; ++ } + ++ if (this.oldLevel != this.expLevel) { ++ CraftEventFactory.callPlayerLevelChangeEvent(this.world.getServer().getPlayer((EntityPlayer) this), this.oldLevel, this.expLevel); ++ this.oldLevel = this.expLevel; ++ } ++ // CraftBukkit end + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Ticking player"); + CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked"); +@@ -296,30 +364,64 @@ + } + + public void die(DamageSource damagesource) { +- if (this.world.getGameRules().getBoolean("showDeathMessages")) { +- ScoreboardTeamBase scoreboardteambase = this.getScoreboardTeam(); ++ // CraftBukkit start - fire PlayerDeathEvent ++ if (this.dead) { ++ return; ++ } ++ ++ java.util.List<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>(); ++ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); ++ ++ if (!keepInventory) { ++ for (int i = 0; i < this.inventory.items.length; ++i) { ++ if (this.inventory.items[i] != null) { ++ loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i])); ++ } ++ } + +- if (scoreboardteambase != null && scoreboardteambase.j() != EnumNameTagVisibility.ALWAYS) { +- if (scoreboardteambase.j() == EnumNameTagVisibility.HIDE_FOR_OTHER_TEAMS) { +- this.server.getPlayerList().a((EntityHuman) this, this.br().b()); +- } else if (scoreboardteambase.j() == EnumNameTagVisibility.HIDE_FOR_OWN_TEAM) { +- this.server.getPlayerList().b((EntityHuman) this, this.br().b()); ++ for (int i = 0; i < this.inventory.armor.length; ++i) { ++ if (this.inventory.armor[i] != null) { ++ loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i])); + } ++ } ++ } ++ ++ IChatBaseComponent chatmessage = this.br().b(); ++ ++ String deathmessage = chatmessage.c(); ++ org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory); ++ ++ String deathMessage = event.getDeathMessage(); ++ ++ if (deathMessage != null && deathMessage.length() > 0 && this.world.getGameRules().getBoolean("showDeathMessages")) { // TODO: allow plugins to override? ++ if (deathMessage.equals(deathmessage)) { ++ this.server.getPlayerList().sendMessage(chatmessage); + } else { +- this.server.getPlayerList().sendMessage(this.br().b()); ++ this.server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromString(deathMessage)); + } + } ++ ++ // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. ++ if (!event.getKeepInventory()) { ++ for (int i = 0; i < this.inventory.items.length; ++i) { ++ this.inventory.items[i] = null; ++ } + +- if (!this.world.getGameRules().getBoolean("keepInventory")) { +- this.inventory.n(); ++ for (int i = 0; i < this.inventory.armor.length; ++i) { ++ this.inventory.armor[i] = null; ++ } + } + +- Collection collection = this.world.getScoreboard().getObjectivesForCriteria(IScoreboardCriteria.d); ++ this.closeInventory(); ++ this.e((Entity) this); // Remove spectated target ++ // CraftBukkit end ++ ++ // CraftBukkit - Get our scores instead ++ Collection collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getName(), new java.util.ArrayList<ScoreboardScore>()); + Iterator iterator = collection.iterator(); + + while (iterator.hasNext()) { +- ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); +- ScoreboardScore scoreboardscore = this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective); ++ ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead + + scoreboardscore.incrementScore(); + } +@@ -376,7 +478,8 @@ + } + + private boolean cq() { +- return this.server.getPVP(); ++ // CraftBukkit - this.server.getPvP() -> this.world.pvpMode ++ return this.world.pvpMode; + } + + public void c(int i) { +@@ -388,6 +491,8 @@ + } else { + if (this.dimension == 0 && i == 1) { + this.b((Statistic) AchievementList.C); ++ // CraftBukkit start - Rely on custom portal management ++ /* + BlockPosition blockposition = this.server.getWorldServer(i).getDimensionSpawn(); + + if (blockposition != null) { +@@ -395,11 +500,16 @@ + } + + i = 1; ++ */ ++ // CraftBukkit end + } else { + this.b((Statistic) AchievementList.y); + } + +- this.server.getPlayerList().changeDimension(this, i); ++ // CraftBukkit start ++ TeleportCause cause = (this.dimension == 1 || i == 1) ? TeleportCause.END_PORTAL : TeleportCause.NETHER_PORTAL; ++ this.server.getPlayerList().changeDimension(this, i, cause); ++ // CraftBukkit end + this.lastSentExp = -1; + this.bK = -1.0F; + this.bL = -1; +@@ -442,6 +552,8 @@ + } + + public void a(boolean flag, boolean flag1, boolean flag2) { ++ if (!this.sleeping) return; // CraftBukkit - Can't leave bed if not in one! ++ + if (this.isSleeping()) { + this.u().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2)); + } +@@ -454,14 +566,23 @@ + } + + public void mount(Entity entity) { +- Entity entity1 = this.vehicle; ++ // CraftBukkit start ++ this.setPassengerOf(entity); ++ } ++ ++ public void setPassengerOf(Entity entity) { ++ // mount(null) doesn't really fly for overloaded methods, ++ // so this method is needed ++ Entity currentVehicle = this.vehicle; ++ ++ super.setPassengerOf(entity); + +- super.mount(entity); +- if (entity != entity1) { ++ // Check if the vehicle actually changed. ++ if (currentVehicle != this.vehicle) { + this.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this, this.vehicle)); + this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); + } +- ++ // CraftBukkit end + } + + protected void a(double d0, boolean flag, Block block, BlockPosition blockposition) {} +@@ -490,19 +611,38 @@ + this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentitysign.getPosition())); + } + +- public void nextContainerCounter() { ++ public int nextContainerCounter() { // CraftBukkit - private void -> public int + this.containerCounter = this.containerCounter % 100 + 1; ++ return containerCounter; // CraftBukkit + } + + public void openTileEntity(ITileEntityContainer itileentitycontainer) { ++ // CraftBukkit start - Inventory open hook ++ Container container = CraftEventFactory.callInventoryOpenEvent(this, itileentitycontainer.createContainer(this.inventory, this)); ++ if (container == null) { ++ return; ++ } ++ // CraftBukkit end + this.nextContainerCounter(); + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, itileentitycontainer.getContainerName(), itileentitycontainer.getScoreboardDisplayName())); +- this.activeContainer = itileentitycontainer.createContainer(this.inventory, this); ++ this.activeContainer = container; // CraftBukkit + this.activeContainer.windowId = this.containerCounter; + this.activeContainer.addSlotListener(this); + } + + public void openContainer(IInventory iinventory) { ++ // CraftBukkit start - Inventory open hook ++ Container container; ++ if (iinventory instanceof ITileEntityContainer) { ++ container = ((ITileEntityContainer)iinventory).createContainer(this.inventory, this); ++ } else { ++ container = new ContainerChest(this.inventory, iinventory, this); ++ } ++ container = CraftEventFactory.callInventoryOpenEvent(this, container); ++ if (container == null) { ++ return; ++ } ++ // CraftBukkit end + if (this.activeContainer != this.defaultContainer) { + this.closeInventory(); + } +@@ -520,10 +660,10 @@ + this.nextContainerCounter(); + if (iinventory instanceof ITileEntityContainer) { + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, ((ITileEntityContainer) iinventory).getContainerName(), iinventory.getScoreboardDisplayName(), iinventory.getSize())); +- this.activeContainer = ((ITileEntityContainer) iinventory).createContainer(this.inventory, this); ++ this.activeContainer = container; // CraftBukkit + } else { + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "minecraft:container", iinventory.getScoreboardDisplayName(), iinventory.getSize())); +- this.activeContainer = new ContainerChest(this.inventory, iinventory, this); ++ this.activeContainer = container; // CraftBukkit + } + + this.activeContainer.windowId = this.containerCounter; +@@ -531,8 +671,14 @@ + } + + public void openTrade(IMerchant imerchant) { ++ // CraftBukkit start - Inventory open hook ++ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerMerchant(this.inventory, imerchant, this.world)); ++ if (container == null) { ++ return; ++ } ++ // CraftBukkit end + this.nextContainerCounter(); +- this.activeContainer = new ContainerMerchant(this.inventory, imerchant, this.world); ++ this.activeContainer = container; // CraftBukkit + this.activeContainer.windowId = this.containerCounter; + this.activeContainer.addSlotListener(this); + InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).e(); +@@ -552,13 +698,20 @@ + } + + public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) { ++ // CraftBukkit start - Inventory open hook ++ Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHorse(this.inventory, iinventory, entityhorse, this)); ++ if (container == null) { ++ iinventory.closeContainer(this); ++ return; ++ } ++ // CraftBukkit end + if (this.activeContainer != this.defaultContainer) { + this.closeInventory(); + } + + this.nextContainerCounter(); + this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, "EntityHorse", iinventory.getScoreboardDisplayName(), iinventory.getSize(), entityhorse.getId())); +- this.activeContainer = new ContainerHorse(this.inventory, iinventory, entityhorse, this); ++ this.activeContainer = container; + this.activeContainer.windowId = this.containerCounter; + this.activeContainer.addSlotListener(this); + } +@@ -587,6 +740,11 @@ + public void a(Container container, List list) { + this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, list)); + this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried())); ++ // CraftBukkit start - Send a Set Slot to update the crafting result slot ++ if (java.util.EnumSet.of(InventoryType.CRAFTING,InventoryType.WORKBENCH).contains(container.getBukkitView().getType())) { ++ this.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, 0, container.getSlot(0).getItem())); ++ } ++ // CraftBukkit end + } + + public void setContainerData(Container container, int i, int j) { +@@ -601,6 +759,7 @@ + } + + public void closeInventory() { ++ CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit + this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId)); + this.p(); + } +@@ -681,7 +840,16 @@ + + public void triggerHealthUpdate() { + this.bK = -1.0E8F; ++ this.lastSentExp = -1; // CraftBukkit - Added to reset ++ } ++ ++ // CraftBukkit start - Support multi-line messages ++ public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { ++ for (IChatBaseComponent component : ichatbasecomponent) { ++ this.sendMessage(component); ++ } + } ++ // CraftBukkit end + + public void b(IChatBaseComponent ichatbasecomponent) { + this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); +@@ -867,6 +1035,93 @@ + } + + public IChatBaseComponent getPlayerListName() { +- return null; ++ return listName; // CraftBukkit ++ } ++ ++ // CraftBukkit start - Add per-player time and weather. ++ public long timeOffset = 0; ++ public boolean relativeTime = true; ++ ++ public long getPlayerTime() { ++ if (this.relativeTime) { ++ // Adds timeOffset to the current server time. ++ return this.world.getDayTime() + this.timeOffset; ++ } else { ++ // Adds timeOffset to the beginning of this day. ++ return this.world.getDayTime() - (this.world.getDayTime() % 24000) + this.timeOffset; ++ } ++ } ++ ++ public WeatherType weather = null; ++ ++ public WeatherType getPlayerWeather() { ++ return this.weather; ++ } ++ ++ public void setPlayerWeather(WeatherType type, boolean plugin) { ++ if (!plugin && this.weather != null) { ++ return; ++ } ++ ++ if (plugin) { ++ this.weather = type; ++ } ++ ++ if (type == WeatherType.DOWNFALL) { ++ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(2, 0)); ++ // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, this.world.j(1.0F))); ++ // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, this.world.h(1.0F))); ++ } else { ++ this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0)); ++ } ++ } ++ ++ public void resetPlayerWeather() { ++ this.weather = null; ++ this.setPlayerWeather(this.world.getWorldData().hasStorm() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); ++ } ++ ++ @Override ++ public String toString() { ++ return super.toString() + "(" + this.getName() + " at " + this.locX + "," + this.locY + "," + this.locZ + ")"; ++ } ++ ++ public void reset() { ++ float exp = 0; ++ boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); ++ ++ if (this.keepLevel || keepInventory) { ++ exp = this.exp; ++ this.newTotalExp = this.expTotal; ++ this.newLevel = this.expLevel; ++ } ++ ++ this.setHealth(this.getMaxHealth()); ++ this.fireTicks = 0; ++ this.fallDistance = 0; ++ this.foodData = new FoodMetaData(this); ++ this.expLevel = this.newLevel; ++ this.expTotal = this.newTotalExp; ++ this.exp = 0; ++ this.deathTicks = 0; ++ this.removeAllEffects(); ++ this.updateEffects = true; ++ this.activeContainer = this.defaultContainer; ++ this.killer = null; ++ this.lastDamager = null; ++ this.combatTracker = new CombatTracker(this); ++ this.lastSentExp = -1; ++ if (this.keepLevel || keepInventory) { ++ this.exp = exp; ++ } else { ++ this.giveExp(this.newExp); ++ } ++ this.keepLevel = false; ++ } ++ ++ @Override ++ public CraftPlayer getBukkitEntity() { ++ return (CraftPlayer) super.getBukkitEntity(); + } ++ // CraftBukkit end + } diff --git a/nms-patches/EntityPotion.patch b/nms-patches/EntityPotion.patch new file mode 100644 index 00000000..fd9e7d33 --- /dev/null +++ b/nms-patches/EntityPotion.patch @@ -0,0 +1,70 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityPotion.java 2014-11-27 08:59:46.721421758 +1100 ++++ src/main/java/net/minecraft/server/EntityPotion.java 2014-11-27 08:42:10.112850989 +1100 +@@ -3,6 +3,13 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import java.util.HashMap; ++ ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.entity.LivingEntity; ++// CraftBukkit end ++ + public class EntityPotion extends EntityProjectile { + + public ItemStack item; +@@ -57,12 +64,15 @@ + if (!this.world.isStatic) { + List list = Items.POTION.h(this.item); + +- if (list != null && !list.isEmpty()) { ++ if (true || list != null && !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply + AxisAlignedBB axisalignedbb = this.getBoundingBox().grow(4.0D, 2.0D, 4.0D); + List list1 = this.world.a(EntityLiving.class, axisalignedbb); + +- if (!list1.isEmpty()) { ++ if (true || !list1.isEmpty()) { // CraftBukkit - Run code even if there are no entities around + Iterator iterator = list1.iterator(); ++ ++ // CraftBukkit ++ HashMap<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>(); + + while (iterator.hasNext()) { + EntityLiving entityliving = (EntityLiving) iterator.next(); +@@ -74,12 +84,35 @@ + if (entityliving == movingobjectposition.entity) { + d1 = 1.0D; + } ++ ++ // CraftBukkit start ++ affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); ++ } ++ } ++ ++ org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); ++ if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process ++ for (LivingEntity victim : event.getAffectedEntities()) { ++ if (!(victim instanceof CraftLivingEntity)) { ++ continue; ++ } ++ ++ EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); ++ double d1 = event.getIntensity(victim); ++ // CraftBukkit end + + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { + MobEffect mobeffect = (MobEffect) iterator1.next(); + int i = mobeffect.getEffectId(); ++ ++ // CraftBukkit start - Abide by PVP settings - for players only! ++ if (!this.world.pvpMode && this.getShooter() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getShooter()) { ++ // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions ++ if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) continue; ++ } ++ // CraftBukkit end + + if (MobEffectList.byId[i].isInstant()) { + MobEffectList.byId[i].applyInstantEffect(this, this.getShooter(), entityliving, mobeffect.getAmplifier(), d1); diff --git a/nms-patches/EntityProjectile.patch b/nms-patches/EntityProjectile.patch new file mode 100644 index 00000000..bd4789e6 --- /dev/null +++ b/nms-patches/EntityProjectile.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityProjectile.java 2014-11-27 08:59:46.725421741 +1100 ++++ src/main/java/net/minecraft/server/EntityProjectile.java 2014-11-27 08:42:10.140850934 +1100 +@@ -25,6 +25,7 @@ + public EntityProjectile(World world, EntityLiving entityliving) { + super(world); + this.shooter = entityliving; ++ this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit + this.a(0.25F, 0.25F); + this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); + this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); +@@ -130,7 +131,7 @@ + MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); + + if (movingobjectposition1 != null) { +- double d1 = vec3d.f(movingobjectposition1.pos); ++ double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency + + if (d1 < d0 || d0 == 0.0D) { + entity = entity1; +@@ -150,6 +151,11 @@ + this.aq(); + } else { + this.a(movingobjectposition); ++ // CraftBukkit start ++ if (this.dead) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); ++ } ++ // CraftBukkit end + } + } + diff --git a/nms-patches/EntitySheep.patch b/nms-patches/EntitySheep.patch new file mode 100644 index 00000000..b1737592 --- /dev/null +++ b/nms-patches/EntitySheep.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySheep.java 2014-11-27 08:59:46.725421741 +1100 ++++ src/main/java/net/minecraft/server/EntitySheep.java 2014-11-27 08:42:10.124850965 +1100 +@@ -4,6 +4,11 @@ + import java.util.Map; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.event.entity.SheepRegrowWoolEvent; ++import org.bukkit.event.player.PlayerShearEntityEvent; ++// CraftBukkit end ++ + public class EntitySheep extends EntityAnimal { + + private final InventoryCrafting bk = new InventoryCrafting(new ContainerSheepBreed(this), 2, 1); +@@ -30,6 +35,7 @@ + this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); + this.bk.setItem(0, new ItemStack(Items.DYE, 1, 0)); + this.bk.setItem(1, new ItemStack(Items.DYE, 1, 0)); ++ this.bk.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event + } + + protected void E() { +@@ -82,6 +88,15 @@ + + if (itemstack != null && itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) { + if (!this.world.isStatic) { ++ // CraftBukkit start ++ PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ + this.setSheared(true); + int i = 1 + this.random.nextInt(3); + +@@ -169,7 +184,14 @@ + } + + public void v() { +- this.setSheared(false); ++ // CraftBukkit start ++ SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setSheared(false); ++ } ++ // CraftBukkit end + if (this.isBaby()) { + this.setAge(60); + } diff --git a/nms-patches/EntitySkeleton.patch b/nms-patches/EntitySkeleton.patch new file mode 100644 index 00000000..fe603518 --- /dev/null +++ b/nms-patches/EntitySkeleton.patch @@ -0,0 +1,60 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySkeleton.java 2014-11-27 08:59:46.725421741 +1100 ++++ src/main/java/net/minecraft/server/EntitySkeleton.java 2014-11-27 08:42:10.136850942 +1100 +@@ -2,6 +2,8 @@ + + import java.util.Calendar; + ++import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit ++ + public class EntitySkeleton extends EntityMonster implements IRangedEntity { + + private PathfinderGoalArrowAttack b = new PathfinderGoalArrowAttack(this, 1.0D, 20, 60, 15.0F); +@@ -90,7 +92,14 @@ + } + + if (flag) { +- this.setOnFire(8); ++ // CraftBukkit start ++ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + } +@@ -225,11 +234,30 @@ + } + + if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, this.bz()) > 0 || this.getSkeletonType() == 1) { +- entityarrow.setOnFire(100); ++ // CraftBukkit start - call EntityCombustEvent ++ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ entityarrow.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.bz(), entityarrow, 0.8F); ++ if (event.isCancelled()) { ++ event.getProjectile().remove(); ++ return; ++ } ++ ++ if (event.getProjectile() == entityarrow.getBukkitEntity()) { ++ world.addEntity(entityarrow); + } ++ // CraftBukkit end + + this.makeSound("random.bow", 1.0F, 1.0F / (this.bb().nextFloat() * 0.4F + 0.8F)); +- this.world.addEntity(entityarrow); ++ // this.world.addEntity(entityarrow); // CraftBukkit - moved up + } + + public int getSkeletonType() { diff --git a/nms-patches/EntitySlime.patch b/nms-patches/EntitySlime.patch new file mode 100644 index 00000000..02d48970 --- /dev/null +++ b/nms-patches/EntitySlime.patch @@ -0,0 +1,40 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySlime.java 2014-11-27 08:59:46.729421723 +1100 ++++ src/main/java/net/minecraft/server/EntitySlime.java 2014-11-27 08:42:10.100851012 +1100 +@@ -1,5 +1,9 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.event.entity.SlimeSplitEvent; ++// CraftBukkit end ++ + public class EntitySlime extends EntityInsentient implements IMonster { + + public float a; +@@ -132,6 +136,18 @@ + + if (!this.world.isStatic && i > 1 && this.getHealth() <= 0.0F) { + int j = 2 + this.random.nextInt(3); ++ ++ // CraftBukkit start ++ SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), j); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled() && event.getCount() > 0) { ++ j = event.getCount(); ++ } else { ++ super.die(); ++ return; ++ } ++ // CraftBukkit end + + for (int k = 0; k < j; ++k) { + float f = ((float) (k % 2) - 0.5F) * (float) i / 4.0F; +@@ -148,7 +164,7 @@ + + entityslime.setSize(i / 2); + entityslime.setPositionRotation(this.locX + (double) f, this.locY + 0.5D, this.locZ + (double) f1, this.random.nextFloat() * 360.0F, 0.0F); +- this.world.addEntity(entityslime); ++ this.world.addEntity(entityslime, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason + } + } + diff --git a/nms-patches/EntitySmallFireball.patch b/nms-patches/EntitySmallFireball.patch new file mode 100644 index 00000000..7d2e7589 --- /dev/null +++ b/nms-patches/EntitySmallFireball.patch @@ -0,0 +1,39 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySmallFireball.java 2014-11-27 08:59:46.729421723 +1100 ++++ src/main/java/net/minecraft/server/EntitySmallFireball.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit ++ + public class EntitySmallFireball extends EntityFireball { + + public EntitySmallFireball(World world) { +@@ -26,7 +28,14 @@ + if (flag) { + this.a(this.shooter, movingobjectposition.entity); + if (!movingobjectposition.entity.isFireProof()) { +- movingobjectposition.entity.setOnFire(5); ++ // CraftBukkit start - Entity damage by entity event + combust event ++ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5); ++ movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ movingobjectposition.entity.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + } else { +@@ -39,7 +48,11 @@ + BlockPosition blockposition = movingobjectposition.a().shift(movingobjectposition.direction); + + if (this.world.isEmpty(blockposition)) { +- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ // CraftBukkit start ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/EntitySnowman.patch b/nms-patches/EntitySnowman.patch new file mode 100644 index 00000000..67e4371f --- /dev/null +++ b/nms-patches/EntitySnowman.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySnowman.java 2014-11-27 08:59:46.733421706 +1100 ++++ src/main/java/net/minecraft/server/EntitySnowman.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.event.block.EntityBlockFormEvent; ++// CraftBukkit end ++ + public class EntitySnowman extends EntityGolem implements IRangedEntity { + + public EntitySnowman(World world) { +@@ -31,7 +37,7 @@ + } + + if (this.world.getBiome(new BlockPosition(i, 0, k)).a(new BlockPosition(i, j, k)) > 1.0F) { +- this.damageEntity(DamageSource.BURN, 1.0F); ++ this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING + } + + for (int l = 0; l < 4; ++l) { +@@ -39,7 +45,17 @@ + j = MathHelper.floor(this.locY); + k = MathHelper.floor(this.locZ + (double) ((float) (l / 2 % 2 * 2 - 1) * 0.25F)); + if (this.world.getType(new BlockPosition(i, j, k)).getBlock().getMaterial() == Material.AIR && this.world.getBiome(new BlockPosition(i, 0, k)).a(new BlockPosition(i, j, k)) < 0.8F && Blocks.SNOW_LAYER.canPlace(this.world, new BlockPosition(i, j, k))) { +- this.world.setTypeUpdate(new BlockPosition(i, j, k), Blocks.SNOW_LAYER.getBlockData()); ++ // CraftBukkit start ++ org.bukkit.block.BlockState blockState = this.world.getWorld().getBlockAt(i, j, k).getState(); ++ blockState.setType(CraftMagicNumbers.getMaterial(Blocks.SNOW_LAYER)); ++ ++ EntityBlockFormEvent event = new EntityBlockFormEvent(this.getBukkitEntity(), blockState.getBlock(), blockState); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if(!event.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/EntitySpider.patch b/nms-patches/EntitySpider.patch new file mode 100644 index 00000000..c9c70dc8 --- /dev/null +++ b/nms-patches/EntitySpider.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySpider.java 2014-11-27 08:59:46.733421706 +1100 ++++ src/main/java/net/minecraft/server/EntitySpider.java 2014-11-27 08:42:10.096851020 +1100 +@@ -107,7 +107,7 @@ + + entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); + entityskeleton.prepare(difficultydamagescaler, (GroupDataEntity) null); +- this.world.addEntity(entityskeleton); ++ this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason + entityskeleton.mount(this); + } + diff --git a/nms-patches/EntitySquid.patch b/nms-patches/EntitySquid.patch new file mode 100644 index 00000000..83d481ae --- /dev/null +++ b/nms-patches/EntitySquid.patch @@ -0,0 +1,37 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntitySquid.java 2014-11-27 08:59:46.733421706 +1100 ++++ src/main/java/net/minecraft/server/EntitySquid.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.TrigMath; // CraftBukkit ++ + public class EntitySquid extends EntityWaterAnimal { + + public float a; +@@ -67,9 +69,11 @@ + + } + ++ /* CraftBukkit start - Delegate to Entity to use existing inWater value + public boolean V() { + return this.world.a(this.getBoundingBox().grow(0.0D, -0.6000000238418579D, 0.0D), Material.WATER, (Entity) this); + } ++ // CraftBukkit end */ + + public void m() { + super.m(); +@@ -116,10 +120,12 @@ + } + + f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); +- this.aG += (-((float) Math.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aG) * 0.1F; ++ // CraftBukkit - Math -> TrigMath ++ this.aG += (-((float) TrigMath.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aG) * 0.1F; + this.yaw = this.aG; + this.c = (float) ((double) this.c + 3.141592653589793D * (double) this.bp * 1.5D); +- this.a += (-((float) Math.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.a) * 0.1F; ++ // CraftBukkit - Math -> TrigMath ++ this.a += (-((float) TrigMath.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.a) * 0.1F; + } else { + this.bl = MathHelper.e(MathHelper.sin(this.bj)) * 3.1415927F * 0.25F; + if (!this.world.isStatic) { diff --git a/nms-patches/EntityTNTPrimed.patch b/nms-patches/EntityTNTPrimed.patch new file mode 100644 index 00000000..96c3399a --- /dev/null +++ b/nms-patches/EntityTNTPrimed.patch @@ -0,0 +1,52 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityTNTPrimed.java 2014-11-27 08:59:46.737421688 +1100 ++++ src/main/java/net/minecraft/server/EntityTNTPrimed.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,9 +1,13 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit ++ + public class EntityTNTPrimed extends Entity { + + public int fuseTicks; + private EntityLiving source; ++ public float yield = 4; // CraftBukkit - add field ++ public boolean isIncendiary = false; // CraftBukkit - add field + + public EntityTNTPrimed(World world) { + super(world); +@@ -52,10 +56,13 @@ + } + + if (this.fuseTicks-- <= 0) { +- this.die(); ++ // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event ++ // this.die(); + if (!this.world.isStatic) { + this.explode(); + } ++ this.die(); ++ // CraftBukkit end + } else { + this.W(); + this.world.addParticle(EnumParticle.SMOKE_NORMAL, this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D, new int[0]); +@@ -64,9 +71,18 @@ + } + + private void explode() { +- float f = 4.0F; ++ // CraftBukkit start ++ // float f = 4.0F; + +- this.world.explode(this, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, f, true); ++ org.bukkit.craftbukkit.CraftServer server = this.world.getServer(); ++ ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(server, this)); ++ server.getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, event.getRadius(), event.getFire(), true); ++ } ++ // CraftBukkit end + } + + protected void b(NBTTagCompound nbttagcompound) { diff --git a/nms-patches/EntityThrownExpBottle.patch b/nms-patches/EntityThrownExpBottle.patch new file mode 100644 index 00000000..c6b40039 --- /dev/null +++ b/nms-patches/EntityThrownExpBottle.patch @@ -0,0 +1,22 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityThrownExpBottle.java 2014-11-27 08:59:46.737421688 +1100 ++++ src/main/java/net/minecraft/server/EntityThrownExpBottle.java 2014-11-27 08:42:10.112850989 +1100 +@@ -28,8 +28,17 @@ + + protected void a(MovingObjectPosition movingobjectposition) { + if (!this.world.isStatic) { +- this.world.triggerEffect(2002, new BlockPosition(this), 0); +- int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); ++ // CraftBukkit - moved to after event ++ // this.world.triggerEffect(2002, new BlockPosition(this), 0); ++ int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); ++ ++ // CraftBukkit start ++ org.bukkit.event.entity.ExpBottleEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExpBottleEvent(this, i); ++ i = event.getExperience(); ++ if (event.getShowEffect()) { ++ this.world.triggerEffect(2002, new BlockPosition(this), 0); ++ } ++ // CraftBukkit end + + while (i > 0) { + int j = EntityExperienceOrb.getOrbValue(i); diff --git a/nms-patches/EntityTrackerEntry.patch b/nms-patches/EntityTrackerEntry.patch new file mode 100644 index 00000000..9d0f38de --- /dev/null +++ b/nms-patches/EntityTrackerEntry.patch @@ -0,0 +1,176 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityTrackerEntry.java 2014-11-27 08:59:46.741421670 +1100 ++++ src/main/java/net/minecraft/server/EntityTrackerEntry.java 2014-11-27 08:42:10.136850942 +1100 +@@ -8,6 +8,11 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.event.player.PlayerVelocityEvent; ++// CraftBukkit end ++ + public class EntityTrackerEntry { + + private static final Logger p = LogManager.getLogger(); +@@ -74,13 +79,13 @@ + this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); + } + +- if (this.tracker instanceof EntityItemFrame && this.m % 10 == 0) { ++ if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block + EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker; + ItemStack itemstack = entityitemframe.getItem(); + +- if (itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { ++ if (this.m % 10 == 0 && itemstack != null && itemstack.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks + WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, this.tracker.world); +- Iterator iterator = list.iterator(); ++ Iterator iterator = this.trackedPlayers.iterator(); // CraftBukkit + + while (iterator.hasNext()) { + EntityHuman entityhuman = (EntityHuman) iterator.next(); +@@ -115,6 +120,19 @@ + Object object = null; + boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.m % 60 == 0; + boolean flag1 = Math.abs(l - this.yRot) >= 4 || Math.abs(i1 - this.xRot) >= 4; ++ ++ // CraftBukkit start - Code moved from below ++ if (flag) { ++ this.xLoc = i; ++ this.yLoc = j; ++ this.zLoc = k; ++ } ++ ++ if (flag1) { ++ this.yRot = l; ++ this.xRot = i1; ++ } ++ // CraftBukkit end + + if (this.m > 0 || this.tracker instanceof EntityArrow) { + if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.v <= 400 && !this.x && this.y == this.tracker.onGround) { +@@ -128,6 +146,11 @@ + } else { + this.y = this.tracker.onGround; + this.v = 0; ++ // CraftBukkit start - Refresh list of who can see a player before sending teleport packet ++ if (this.tracker instanceof EntityPlayer) { ++ this.scanPlayers(new java.util.ArrayList(this.trackedPlayers)); ++ } ++ // CraftBukkit end + object = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1, this.tracker.onGround); + } + } +@@ -152,6 +175,7 @@ + } + + this.b(); ++ /* CraftBukkit start - Code moved up + if (flag) { + this.xLoc = i; + this.yLoc = j; +@@ -162,6 +186,7 @@ + this.yRot = l; + this.xRot = i1; + } ++ // CraftBukkit end */ + + this.x = false; + } else { +@@ -193,7 +218,27 @@ + + ++this.m; + if (this.tracker.velocityChanged) { +- this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); ++ // CraftBukkit start - Create PlayerVelocity event ++ boolean cancelled = false; ++ ++ if (this.tracker instanceof EntityPlayer) { ++ Player player = (Player) this.tracker.getBukkitEntity(); ++ org.bukkit.util.Vector velocity = player.getVelocity(); ++ ++ PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity); ++ this.tracker.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ cancelled = true; ++ } else if (!velocity.equals(event.getVelocity())) { ++ player.setVelocity(velocity); ++ } ++ } ++ ++ if (!cancelled) { ++ this.broadcastIncludingSelf(new PacketPlayOutEntityVelocity(this.tracker)); ++ } ++ // CraftBukkit end + this.tracker.velocityChanged = false; + } + +@@ -211,6 +256,11 @@ + Set set = attributemapserver.getAttributes(); + + if (!set.isEmpty()) { ++ // CraftBukkit start - Send scaled max health ++ if (this.tracker instanceof EntityPlayer) { ++ ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(set, false); ++ } ++ // CraftBukkit end + this.broadcastIncludingSelf(new PacketPlayOutUpdateAttributes(this.tracker.getId(), set)); + } + +@@ -260,7 +310,17 @@ + public void updatePlayer(EntityPlayer entityplayer) { + if (entityplayer != this.tracker) { + if (this.c(entityplayer)) { +- if (!this.trackedPlayers.contains(entityplayer) && (this.e(entityplayer) || this.tracker.attachedToPlayer)) { ++ if (!this.trackedPlayers.contains(entityplayer) && (this.e(entityplayer) || this.tracker.attachedToPlayer)) { ++ // CraftBukkit start - respect vanish API ++ if (this.tracker instanceof EntityPlayer) { ++ Player player = ((EntityPlayer) this.tracker).getBukkitEntity(); ++ if (!entityplayer.getBukkitEntity().canSee(player)) { ++ return; ++ } ++ } ++ ++ entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); ++ // CraftBukkit end + this.trackedPlayers.add(entityplayer); + Packet packet = this.c(); + +@@ -278,6 +338,12 @@ + if (this.tracker instanceof EntityLiving) { + AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); + Collection collection = attributemapserver.c(); ++ ++ // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health ++ if (this.tracker.getId() == entityplayer.getId()) { ++ ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(collection, false); ++ } ++ // CraftBukkit end + + if (!collection.isEmpty()) { + entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateAttributes(this.tracker.getId(), collection)); +@@ -316,6 +382,11 @@ + entityplayer.playerConnection.sendPacket(new PacketPlayOutBed(entityhuman, new BlockPosition(this.tracker))); + } + } ++ ++ // CraftBukkit start - Fix for nonsensical head yaw ++ this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); ++ this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); ++ // CraftBukkit end + + if (this.tracker instanceof EntityLiving) { + EntityLiving entityliving = (EntityLiving) this.tracker; +@@ -356,7 +427,10 @@ + + private Packet c() { + if (this.tracker.dead) { +- EntityTrackerEntry.p.warn("Fetching addPacket for removed entity"); ++ // CraftBukkit start - Remove useless error spam, just return ++ // EntityTrackerEntry.p.warn("Fetching addPacket for removed entity"); ++ return null; ++ // CraftBukkit end + } + + if (this.tracker instanceof EntityItem) { diff --git a/nms-patches/EntityVillager.patch b/nms-patches/EntityVillager.patch new file mode 100644 index 00000000..e2b327ae --- /dev/null +++ b/nms-patches/EntityVillager.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityVillager.java 2014-11-27 08:59:46.741421670 +1100 ++++ src/main/java/net/minecraft/server/EntityVillager.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,6 +1,7 @@ + package net.minecraft.server; + + import java.util.Iterator; ++import org.bukkit.craftbukkit.entity.CraftVillager; + + public class EntityVillager extends EntityAgeable implements NPC, IMerchant { + +@@ -28,7 +29,7 @@ + + public EntityVillager(World world, int i) { + super(world); +- this.inventory = new InventorySubcontainer("Items", false, 8); ++ this.inventory = new InventorySubcontainer("Items", false, 8, (CraftVillager) this.getBukkitEntity()); // CraftBukkit add argument + this.setProfession(i); + this.a(0.6F, 1.8F); + ((Navigation) this.getNavigation()).b(true); diff --git a/nms-patches/EntityWither.patch b/nms-patches/EntityWither.patch new file mode 100644 index 00000000..7caa58e9 --- /dev/null +++ b/nms-patches/EntityWither.patch @@ -0,0 +1,78 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityWither.java 2014-11-27 08:59:46.745421653 +1100 ++++ src/main/java/net/minecraft/server/EntityWither.java 2014-11-27 08:42:10.156850903 +1100 +@@ -5,6 +5,12 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityRegainHealthEvent; ++import org.bukkit.event.entity.ExplosionPrimeEvent; ++// CraftBukkit end ++ + public class EntityWither extends EntityMonster implements IRangedEntity { + + private float[] b = new float[2]; +@@ -160,13 +166,38 @@ + if (this.cj() > 0) { + i = this.cj() - 1; + if (i <= 0) { +- this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); +- this.world.a(1013, new BlockPosition(this), 0); ++ // CraftBukkit start ++ // this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); ++ } ++ // CraftBukkit end ++ ++ // CraftBukkit start - Use relative location for far away sounds ++ // this.world.a(1013, new BlockPosition(this), 0); ++ int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; ++ for (EntityPlayer player : (List<EntityPlayer>) this.world.players) { ++ double deltaX = this.locX - player.locX; ++ double deltaZ = this.locZ - player.locZ; ++ double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; ++ if (distanceSquared > viewDistance * viewDistance) { ++ double deltaLength = Math.sqrt(distanceSquared); ++ double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; ++ double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, new BlockPosition((int) relativeX, (int) this.locY, (int) relativeZ), 0, true)); ++ } else { ++ player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0, true)); ++ } ++ } ++ // CraftBukkit end + } + + this.r(i); + if (this.ticksLived % 10 == 0) { +- this.heal(10.0F); ++ this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit + } + + } else { +@@ -251,6 +282,11 @@ + Block block = this.world.getType(new BlockPosition(j2, k2, l2)).getBlock(); + + if (block.getMaterial() != Material.AIR && block != Blocks.BEDROCK && block != Blocks.END_PORTAL && block != Blocks.END_PORTAL_FRAME && block != Blocks.COMMAND_BLOCK && block != Blocks.BARRIER) { ++ // CraftBukkit start ++ if (CraftEventFactory.callEntityChangeBlockEvent(this, j2, k2, l2, Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + flag = this.world.setAir(new BlockPosition(j2, k2, l2), true) || flag; + } + } +@@ -264,7 +300,7 @@ + } + + if (this.ticksLived % 20 == 0) { +- this.heal(1.0F); ++ this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit + } + + } diff --git a/nms-patches/EntityWitherSkull.patch b/nms-patches/EntityWitherSkull.patch new file mode 100644 index 00000000..1428bf51 --- /dev/null +++ b/nms-patches/EntityWitherSkull.patch @@ -0,0 +1,36 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityWitherSkull.java 2014-11-27 08:59:46.745421653 +1100 ++++ src/main/java/net/minecraft/server/EntityWitherSkull.java 2014-11-27 08:42:10.120850973 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit ++ + public class EntityWitherSkull extends EntityFireball { + + public EntityWitherSkull(World world) { +@@ -36,7 +38,7 @@ + if (this.shooter != null) { + if (movingobjectposition.entity.damageEntity(DamageSource.mobAttack(this.shooter), 8.0F)) { + if (!movingobjectposition.entity.isAlive()) { +- this.shooter.heal(5.0F); ++ this.shooter.heal(5.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER); // CraftBukkit + } else { + this.a(this.shooter, movingobjectposition.entity); + } +@@ -60,7 +62,15 @@ + } + } + +- this.world.createExplosion(this, this.locX, this.locY, this.locZ, 1.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); ++ // CraftBukkit start ++ // this.world.createExplosion(this, this.locX, this.locY, this.locZ, 1.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); ++ ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); ++ } ++ // CraftBukkit end + this.die(); + } + diff --git a/nms-patches/EntityWolf.patch b/nms-patches/EntityWolf.patch new file mode 100644 index 00000000..1621a484 --- /dev/null +++ b/nms-patches/EntityWolf.patch @@ -0,0 +1,87 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityWolf.java 2014-11-27 08:59:46.749421635 +1100 ++++ src/main/java/net/minecraft/server/EntityWolf.java 2014-11-27 08:42:10.160850895 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityTargetEvent.TargetReason; ++// CraftBukkit end ++ + public class EntityWolf extends EntityTameableAnimal { + + private float bm; +@@ -51,8 +56,19 @@ + } else if (!this.isTamed()) { + this.setAngry(true); + } ++ } + ++ // CraftBukkit - add overriden version ++ @Override ++ public void setGoalTarget(EntityLiving entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason reason, boolean fire) { ++ super.setGoalTarget(entityliving, reason, fire); ++ if (entityliving == null) { ++ this.setAngry(false); ++ } else if (!this.isTamed()) { ++ this.setAngry(true); ++ } + } ++ // CraftBukkit end + + protected void E() { + this.datawatcher.watch(18, Float.valueOf(this.getHealth())); +@@ -85,7 +101,8 @@ + } + + protected String z() { +- return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < 10.0F ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); ++ // CraftBukkit - (getFloat(18) < 10) -> (getFloat(18) < this.getMaxHealth() / 2) ++ return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < this.getMaxHealth() / 2 ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); + } + + protected String bn() { +@@ -219,7 +236,7 @@ + --itemstack.count; + } + +- this.heal((float) itemfood.getNutrition(itemstack)); ++ this.heal((float) itemfood.getNutrition(itemstack), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit + if (itemstack.count <= 0) { + entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); + } +@@ -244,7 +261,7 @@ + this.bk.setSitting(!this.isSitting()); + this.aW = false; + this.navigation.n(); +- this.setGoalTarget((EntityLiving) null); ++ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); // CraftBukkit - reason + } + } else if (itemstack != null && itemstack.getItem() == Items.BONE && !this.isAngry()) { + if (!entityhuman.abilities.canInstantlyBuild) { +@@ -256,12 +273,13 @@ + } + + if (!this.world.isStatic) { +- if (this.random.nextInt(3) == 0) { ++ // CraftBukkit - added event call and isCancelled check. ++ if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { + this.setTamed(true); + this.navigation.n(); +- this.setGoalTarget((EntityLiving) null); ++ this.setGoalTarget((EntityLiving) null, TargetReason.FORGOT_TARGET, true); + this.bk.setSitting(true); +- this.setHealth(20.0F); ++ this.setHealth(this.getMaxHealth()); // CraftBukkit - 20.0 -> getMaxHealth() + this.setOwnerUUID(entityhuman.getUniqueID().toString()); + this.l(true); + this.world.broadcastEntityEffect(this, (byte) 7); +@@ -348,7 +366,7 @@ + } + + protected boolean isTypeNotPersistent() { +- return !this.isTamed() && this.ticksLived > 2400; ++ return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit + } + + public boolean a(EntityLiving entityliving, EntityLiving entityliving1) { diff --git a/nms-patches/EntityZombie.patch b/nms-patches/EntityZombie.patch new file mode 100644 index 00000000..634ca939 --- /dev/null +++ b/nms-patches/EntityZombie.patch @@ -0,0 +1,108 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/EntityZombie.java 2014-11-27 08:59:46.749421635 +1100 ++++ src/main/java/net/minecraft/server/EntityZombie.java 2014-11-27 08:42:10.144850927 +1100 +@@ -4,6 +4,14 @@ + import java.util.List; + import java.util.UUID; + ++//CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftLivingEntity; ++import org.bukkit.event.entity.CreatureSpawnEvent; ++import org.bukkit.event.entity.EntityCombustByEntityEvent; ++import org.bukkit.event.entity.EntityCombustEvent; ++import org.bukkit.event.entity.EntityTargetEvent; ++//CraftBukkit end ++ + public class EntityZombie extends EntityMonster { + + protected static final IAttribute b = (new AttributeRanged((IAttribute) null, "zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); +@@ -14,6 +22,7 @@ + private boolean bn = false; + private float bo = -1.0F; + private float bp; ++ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field + + public EntityZombie(World world) { + super(world); +@@ -136,7 +145,14 @@ + } + + if (flag) { +- this.setOnFire(8); ++ // CraftBukkit start ++ EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ this.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + } +@@ -170,8 +186,8 @@ + if (World.a((IBlockAccess) this.world, new BlockPosition(i1, j1 - 1, k1)) && this.world.getLightLevel(new BlockPosition(i1, j1, k1)) < 10) { + entityzombie.setPosition((double) i1, (double) j1, (double) k1); + if (!this.world.isPlayerNearby((double) i1, (double) j1, (double) k1, 7.0D) && this.world.a(entityzombie.getBoundingBox(), (Entity) entityzombie) && this.world.getCubes(entityzombie, entityzombie.getBoundingBox()).isEmpty() && !this.world.containsLiquid(entityzombie.getBoundingBox())) { +- this.world.addEntity(entityzombie); +- entityzombie.setGoalTarget(entityliving); ++ this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit ++ entityzombie.setGoalTarget(entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET, true); + entityzombie.prepare(this.world.E(new BlockPosition(entityzombie)), (GroupDataEntity) null); + this.getAttributeInstance(EntityZombie.b).b(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0)); + entityzombie.getAttributeInstance(EntityZombie.b).b(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0)); +@@ -190,6 +206,12 @@ + public void s_() { + if (!this.world.isStatic && this.cn()) { + int i = this.cp(); ++ ++ // CraftBukkit start - Use wall time instead of ticks for villager conversion ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.lastTick = MinecraftServer.currentTick; ++ i *= elapsedTicks; ++ // CraftBukkit end + + this.bm -= i; + if (this.bm <= 0) { +@@ -207,7 +229,14 @@ + int i = this.world.getDifficulty().a(); + + if (this.bz() == null && this.isBurning() && this.random.nextFloat() < (float) i * 0.3F) { +- entity.setOnFire(2 * i); ++ // CraftBukkit start ++ EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * i); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ entity.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end + } + } + +@@ -316,7 +345,7 @@ + entityzombie.setBaby(true); + } + +- this.world.addEntity(entityzombie); ++ this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason + this.world.a((EntityHuman) null, 1016, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); + } + +@@ -369,7 +398,7 @@ + entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); + entitychicken1.prepare(difficultydamagescaler, (GroupDataEntity) null); + entitychicken1.l(true); +- this.world.addEntity(entitychicken1); ++ this.world.addEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); + this.mount(entitychicken1); + } + } +@@ -452,7 +481,7 @@ + } + + this.world.kill(this); +- this.world.addEntity(entityvillager); ++ this.world.addEntity(entityvillager, CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason + entityvillager.addEffect(new MobEffect(MobEffectList.CONFUSION.id, 200, 0)); + this.world.a((EntityHuman) null, 1017, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); + } diff --git a/nms-patches/ExpirableListEntry.patch b/nms-patches/ExpirableListEntry.patch new file mode 100644 index 00000000..6bb3d391 --- /dev/null +++ b/nms-patches/ExpirableListEntry.patch @@ -0,0 +1,42 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ExpirableListEntry.java 2014-11-27 08:59:46.749421635 +1100 ++++ src/main/java/net/minecraft/server/ExpirableListEntry.java 2014-11-27 08:42:10.096851020 +1100 +@@ -22,7 +22,7 @@ + } + + protected ExpirableListEntry(Object object, JsonObject jsonobject) { +- super(object, jsonobject); ++ super(checkExpiry(object, jsonobject), jsonobject); + + Date date; + +@@ -65,4 +65,30 @@ + jsonobject.addProperty("expires", this.d == null ? "forever" : ExpirableListEntry.a.format(this.d)); + jsonobject.addProperty("reason", this.e); + } ++ ++ // CraftBukkit start ++ public String getSource() { ++ return this.c; ++ } ++ ++ public Date getCreated() { ++ return this.b; ++ } ++ ++ private static Object checkExpiry(Object object, JsonObject jsonobject) { ++ Date expires = null; ++ ++ try { ++ expires = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; ++ } catch (ParseException ex) { ++ // Guess we don't have a date ++ } ++ ++ if (expires == null || expires.after(new Date())) { ++ return object; ++ } else { ++ return null; ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/Explosion.patch b/nms-patches/Explosion.patch new file mode 100644 index 00000000..3d0b5b84 --- /dev/null +++ b/nms-patches/Explosion.patch @@ -0,0 +1,127 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Explosion.java 2014-11-27 08:59:46.753421618 +1100 ++++ src/main/java/net/minecraft/server/Explosion.java 2014-11-27 08:42:10.160850895 +1100 +@@ -8,6 +8,12 @@ + import java.util.List; + import java.util.Map; + import java.util.Random; ++ ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityExplodeEvent; ++import org.bukkit.Location; ++// CraftBukkit end + + public class Explosion { + +@@ -22,11 +28,12 @@ + private final float size; + private final List blocks = Lists.newArrayList(); + private final Map k = Maps.newHashMap(); ++ public boolean wasCanceled = false; // CraftBukkit - add field + + public Explosion(World world, Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { + this.world = world; + this.source = entity; +- this.size = f; ++ this.size = (float) Math.max(f, 0.0); // CraftBukkit - clamp bad values + this.posX = d0; + this.posY = d1; + this.posZ = d2; +@@ -35,6 +42,12 @@ + } + + public void a() { ++ // CraftBukkit start ++ if (this.size < 0.1F) { ++ return; ++ } ++ // CraftBukkit end ++ + HashSet hashset = Sets.newHashSet(); + boolean flag = true; + +@@ -68,7 +81,7 @@ + f -= (f2 + 0.3F) * 0.3F; + } + +- if (f > 0.0F && (this.source == null || this.source.a(this, this.world, blockposition, iblockdata, f))) { ++ if (f > 0.0F && (this.source == null || this.source.a(this, this.world, blockposition, iblockdata, f)) && blockposition.getY() < 256 && blockposition.getY() >= 0) { // CraftBukkit - don't wrap explosions + hashset.add(blockposition); + } + +@@ -112,7 +125,14 @@ + double d12 = (double) this.world.a(vec3d, entity.getBoundingBox()); + double d13 = (1.0D - d7) * d12; + ++ // entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D))); ++ ++ // CraftBukkit start ++ CraftEventFactory.entityDamage = source; + entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d13 * d13 + d13) / 2.0D * 8.0D * (double) f3 + 1.0D))); ++ CraftEventFactory.entityDamage = null; ++ // CraftBukkit end ++ + double d14 = EnchantmentProtection.a(entity, d13); + + entity.motX += d8 * d14; +@@ -140,6 +160,35 @@ + BlockPosition blockposition; + + if (this.b) { ++ // CraftBukkit start ++ org.bukkit.World bworld = this.world.getWorld(); ++ org.bukkit.entity.Entity explode = this.source == null ? null : this.source.getBukkitEntity(); ++ Location location = new Location(bworld, this.posX, this.posY, this.posZ); ++ ++ List<org.bukkit.block.Block> blockList = Lists.newArrayList(); ++ for (int i1 = this.blocks.size() - 1; i1 >= 0; i1--) { ++ BlockPosition cpos = (BlockPosition) this.blocks.get(i1); ++ org.bukkit.block.Block bblock = bworld.getBlockAt(cpos.getX(), cpos.getY(), cpos.getZ()); ++ if (bblock.getType() != org.bukkit.Material.AIR) { ++ blockList.add(bblock); ++ } ++ } ++ ++ EntityExplodeEvent event = new EntityExplodeEvent(explode, location, blockList, 0.3F); ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ this.blocks.clear(); ++ ++ for (org.bukkit.block.Block bblock : event.blockList()) { ++ BlockPosition coords = new BlockPosition(bblock.getX(), bblock.getY(), bblock.getZ()); ++ blocks.add(coords); ++ } ++ ++ if (event.isCancelled()) { ++ this.wasCanceled = true; ++ return; ++ } ++ // CraftBukkit end + iterator = this.blocks.iterator(); + + while (iterator.hasNext()) { +@@ -170,7 +219,8 @@ + + if (block.getMaterial() != Material.AIR) { + if (block.a(this)) { +- block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), 1.0F / this.size, 0); ++ // CraftBukkit - add yield ++ block.dropNaturally(this.world, blockposition, this.world.getType(blockposition), event.getYield(), 0); + } + + this.world.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); +@@ -184,8 +234,12 @@ + + while (iterator.hasNext()) { + blockposition = (BlockPosition) iterator.next(); +- if (this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && this.world.getType(blockposition.down()).getBlock().m() && this.c.nextInt(3) == 0) { +- this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ if (this.world.getType(blockposition).getBlock().getMaterial() == Material.AIR && this.world.getType(blockposition.down()).getBlock().m() && this.c.nextInt(3) == 0) { ++ // CraftBukkit start - Ignition by explosion ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this).isCancelled()) { ++ this.world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/FoodMetaData.patch b/nms-patches/FoodMetaData.patch new file mode 100644 index 00000000..bfd974b3 --- /dev/null +++ b/nms-patches/FoodMetaData.patch @@ -0,0 +1,66 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/FoodMetaData.java 2014-11-27 08:59:46.753421618 +1100 ++++ src/main/java/net/minecraft/server/FoodMetaData.java 2014-11-27 08:42:10.104851005 +1100 +@@ -6,9 +6,17 @@ + public float saturationLevel = 5.0F; + public float exhaustionLevel; + public int foodTickTimer; ++ private EntityHuman entityhuman; // CraftBukkit + private int e = 20; + +- public FoodMetaData() {} ++ public FoodMetaData() { throw new AssertionError("Whoopsie, we missed the bukkit."); } // CraftBukkit start - throw an error ++ ++ // CraftBukkit start - added EntityHuman constructor ++ public FoodMetaData(EntityHuman entityhuman) { ++ org.apache.commons.lang.Validate.notNull(entityhuman); ++ this.entityhuman = entityhuman; ++ } ++ // CraftBukkit end + + public void eat(int i, float f) { + this.foodLevel = Math.min(i + this.foodLevel, 20); +@@ -16,7 +24,17 @@ + } + + public void a(ItemFood itemfood, ItemStack itemstack) { +- this.eat(itemfood.getNutrition(itemstack), itemfood.getSaturationModifier(itemstack)); ++ // CraftBukkit start ++ int oldFoodLevel = foodLevel; ++ ++ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, itemfood.getNutrition(itemstack) + oldFoodLevel); ++ ++ if (!event.isCancelled()) { ++ this.eat(event.getFoodLevel() - oldFoodLevel, itemfood.getSaturationModifier(itemstack)); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); ++ // CraftBukkit end + } + + public void a(EntityHuman entityhuman) { +@@ -28,14 +46,23 @@ + if (this.saturationLevel > 0.0F) { + this.saturationLevel = Math.max(this.saturationLevel - 1.0F, 0.0F); + } else if (enumdifficulty != EnumDifficulty.PEACEFUL) { +- this.foodLevel = Math.max(this.foodLevel - 1, 0); ++ // CraftBukkit start ++ org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, Math.max(this.foodLevel - 1, 0)); ++ ++ if (!event.isCancelled()) { ++ this.foodLevel = event.getFoodLevel(); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), this.foodLevel, this.saturationLevel)); ++ // CraftBukkit end + } + } + + if (entityhuman.world.getGameRules().getBoolean("naturalRegeneration") && this.foodLevel >= 18 && entityhuman.cl()) { + ++this.foodTickTimer; + if (this.foodTickTimer >= 80) { +- entityhuman.heal(1.0F); ++ // CraftBukkit - added RegainReason ++ entityhuman.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.SATIATED); + this.a(3.0F); + this.foodTickTimer = 0; + } diff --git a/nms-patches/HandshakeListener.patch b/nms-patches/HandshakeListener.patch new file mode 100644 index 00000000..651b7fee --- /dev/null +++ b/nms-patches/HandshakeListener.patch @@ -0,0 +1,69 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/HandshakeListener.java 2014-11-27 08:59:46.757421600 +1100 ++++ src/main/java/net/minecraft/server/HandshakeListener.java 2014-11-27 08:42:10.100851012 +1100 +@@ -1,6 +1,16 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.net.InetAddress; ++import java.util.HashMap; ++// CraftBukkit end ++ + public class HandshakeListener implements PacketHandshakingInListener { ++ ++ // CraftBukkit start - add fields ++ private static final HashMap<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>(); ++ private static int throttleCounter = 0; ++ // CraftBukkit end + + private final MinecraftServer a; + private final NetworkManager b; +@@ -15,6 +25,41 @@ + case 1: + this.b.a(EnumProtocol.LOGIN); + ChatComponentText chatcomponenttext; ++ ++ // CraftBukkit start - Connection throttle ++ try { ++ long currentTime = System.currentTimeMillis(); ++ long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle(); ++ InetAddress address = ((java.net.InetSocketAddress) this.b.getSocketAddress()).getAddress(); ++ ++ synchronized (throttleTracker) { ++ if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) { ++ throttleTracker.put(address, currentTime); ++ chatcomponenttext = new ChatComponentText("Connection throttled! Please wait before reconnecting."); ++ this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext)); ++ this.b.close(chatcomponenttext); ++ return; ++ } ++ ++ throttleTracker.put(address, currentTime); ++ throttleCounter++; ++ if (throttleCounter > 200) { ++ throttleCounter = 0; ++ ++ // Cleanup stale entries ++ java.util.Iterator iter = throttleTracker.entrySet().iterator(); ++ while (iter.hasNext()) { ++ java.util.Map.Entry<InetAddress, Long> entry = (java.util.Map.Entry) iter.next(); ++ if (entry.getValue() > connectionThrottle) { ++ iter.remove(); ++ } ++ } ++ } ++ } ++ } catch (Throwable t) { ++ org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); ++ } ++ // CraftBukkit end + + if (packethandshakinginsetprotocol.b() > 47) { + chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.8"); +@@ -26,6 +71,7 @@ + this.b.close(chatcomponenttext); + } else { + this.b.a((PacketListener) (new LoginListener(this.a, this.b))); ++ ((LoginListener) this.b.getPacketListener()).hostname = packethandshakinginsetprotocol.b + ":" + packethandshakinginsetprotocol.c; // CraftBukkit - set hostname + } + break; + diff --git a/nms-patches/IDataManager.patch b/nms-patches/IDataManager.patch new file mode 100644 index 00000000..0c8a3723 --- /dev/null +++ b/nms-patches/IDataManager.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/IDataManager.java 2014-11-27 08:59:46.757421600 +1100 ++++ src/main/java/net/minecraft/server/IDataManager.java 2014-11-27 08:42:10.104851005 +1100 +@@ -6,7 +6,7 @@ + + WorldData getWorldData(); + +- void checkSession(); ++ void checkSession() throws ExceptionWorldConflict; // CraftBukkit - throws ExceptionWorldConflict + + IChunkLoader createChunkLoader(WorldProvider worldprovider); + +@@ -23,4 +23,6 @@ + File getDataFile(String s); + + String g(); ++ ++ java.util.UUID getUUID(); // CraftBukkit + } diff --git a/nms-patches/IInventory.patch b/nms-patches/IInventory.patch new file mode 100644 index 00000000..d65dcde8 --- /dev/null +++ b/nms-patches/IInventory.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/IInventory.java 2014-11-27 08:59:46.757421600 +1100 ++++ src/main/java/net/minecraft/server/IInventory.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; // CraftBukkit ++ + public interface IInventory extends INamableTileEntity { + + int getSize(); +@@ -31,4 +33,20 @@ + int g(); + + void l(); ++ ++ // CraftBukkit start ++ ItemStack[] getContents(); ++ ++ void onOpen(CraftHumanEntity who); ++ ++ void onClose(CraftHumanEntity who); ++ ++ java.util.List<org.bukkit.entity.HumanEntity> getViewers(); ++ ++ org.bukkit.inventory.InventoryHolder getOwner(); ++ ++ void setMaxStackSize(int size); ++ ++ int MAX_STACK = 64; ++ // CraftBukkit end + } diff --git a/nms-patches/IRecipe.patch b/nms-patches/IRecipe.patch new file mode 100644 index 00000000..cdc66801 --- /dev/null +++ b/nms-patches/IRecipe.patch @@ -0,0 +1,9 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/IRecipe.java 2014-11-27 08:59:46.769421547 +1100 ++++ src/main/java/net/minecraft/server/IRecipe.java 2014-11-27 08:42:10.168850880 +1100 +@@ -11,4 +11,6 @@ + ItemStack b(); + + ItemStack[] b(InventoryCrafting inventorycrafting); ++ ++ org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit + } diff --git a/nms-patches/InventoryCraftResult.patch b/nms-patches/InventoryCraftResult.patch new file mode 100644 index 00000000..af51f97f --- /dev/null +++ b/nms-patches/InventoryCraftResult.patch @@ -0,0 +1,48 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryCraftResult.java 2014-11-27 08:59:46.761421583 +1100 ++++ src/main/java/net/minecraft/server/InventoryCraftResult.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,8 +1,36 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryCraftResult implements IInventory { + + private ItemStack[] items = new ItemStack[1]; ++ ++ // CraftBukkit start ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return null; // Result slots don't get an owner ++ } ++ ++ // Don't need a transaction; the InventoryCrafting keeps track of it for us ++ public void onOpen(CraftHumanEntity who) {} ++ public void onClose(CraftHumanEntity who) {} ++ public java.util.List<HumanEntity> getViewers() { ++ return new java.util.ArrayList<HumanEntity>(); ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public InventoryCraftResult() {} + +@@ -53,7 +81,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public void update() {} diff --git a/nms-patches/InventoryCrafting.patch b/nms-patches/InventoryCrafting.patch new file mode 100644 index 00000000..84e27a99 --- /dev/null +++ b/nms-patches/InventoryCrafting.patch @@ -0,0 +1,64 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryCrafting.java 2014-11-27 08:59:46.761421583 +1100 ++++ src/main/java/net/minecraft/server/InventoryCrafting.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,11 +1,61 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.InventoryType; ++// CraftBukkit end ++ + public class InventoryCrafting implements IInventory { + + private final ItemStack[] items; + private final int b; + private final int c; + private final Container d; ++ ++ // CraftBukkit start - add fields ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ public IRecipe currentRecipe; ++ public IInventory resultInventory; ++ private EntityHuman owner; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public InventoryType getInvType() { ++ return items.length == 4 ? InventoryType.CRAFTING : InventoryType.WORKBENCH; ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return owner.getBukkitEntity(); ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ resultInventory.setMaxStackSize(size); ++ } ++ ++ public InventoryCrafting(Container container, int i, int j, EntityHuman player) { ++ this(container, i, j); ++ this.owner = player; ++ } ++ // CraftBukkit end + + public InventoryCrafting(Container container, int i, int j) { + int k = i * j; diff --git a/nms-patches/InventoryEnderChest.patch b/nms-patches/InventoryEnderChest.patch new file mode 100644 index 00000000..ee181fb3 --- /dev/null +++ b/nms-patches/InventoryEnderChest.patch @@ -0,0 +1,51 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryEnderChest.java 2014-11-27 08:59:46.761421583 +1100 ++++ src/main/java/net/minecraft/server/InventoryEnderChest.java 2014-11-27 08:42:10.096851020 +1100 +@@ -1,8 +1,48 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryEnderChest extends InventorySubcontainer { + + private TileEntityEnderChest a; ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ public org.bukkit.entity.Player player; ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ ++ public int getMaxStackSize() { ++ return maxStack; ++ } ++ // CraftBukkit end + + public InventoryEnderChest() { + super("container.enderchest", false, 27); diff --git a/nms-patches/InventoryHorseChest.patch b/nms-patches/InventoryHorseChest.patch new file mode 100644 index 00000000..4146987e --- /dev/null +++ b/nms-patches/InventoryHorseChest.patch @@ -0,0 +1,63 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryHorseChest.java 2014-11-27 08:59:46.765421565 +1100 ++++ src/main/java/net/minecraft/server/InventoryHorseChest.java 2014-11-27 08:42:10.172850872 +1100 +@@ -1,8 +1,60 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryHorseChest extends InventorySubcontainer { + + public InventoryHorseChest(String s, int i) { + super(s, false, i); + } ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private EntityHorse horse; ++ private int maxStack = MAX_STACK; ++ ++ public InventoryHorseChest(String s, int i, EntityHorse horse) { ++ super(s, false, i, (org.bukkit.craftbukkit.entity.CraftHorse) horse.getBukkitEntity()); ++ this.horse = horse; ++ } ++ ++ @Override ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ @Override ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ @Override ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ @Override ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ @Override ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return (org.bukkit.entity.Horse) this.horse.getBukkitEntity(); ++ } ++ ++ @Override ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ ++ @Override ++ public int getMaxStackSize() { ++ return maxStack; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/InventoryLargeChest.patch b/nms-patches/InventoryLargeChest.patch new file mode 100644 index 00000000..2e1b2eaa --- /dev/null +++ b/nms-patches/InventoryLargeChest.patch @@ -0,0 +1,66 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryLargeChest.java 2014-11-27 08:59:46.765421565 +1100 ++++ src/main/java/net/minecraft/server/InventoryLargeChest.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,10 +1,54 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryLargeChest implements ITileInventory { + + private String a; + public ITileInventory left; + public ITileInventory right; ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ ++ public ItemStack[] getContents() { ++ ItemStack[] result = new ItemStack[this.getSize()]; ++ for (int i = 0; i < result.length; i++) { ++ result[i] = this.getItem(i); ++ } ++ return result; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ this.left.onOpen(who); ++ this.right.onOpen(who); ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ this.left.onClose(who); ++ this.right.onClose(who); ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return null; // This method won't be called since CraftInventoryDoubleChest doesn't defer to here ++ } ++ ++ public void setMaxStackSize(int size) { ++ this.left.setMaxStackSize(size); ++ this.right.setMaxStackSize(size); ++ } ++ // CraftBukkit end + + public InventoryLargeChest(String s, ITileInventory itileinventory, ITileInventory itileinventory1) { + this.a = s; +@@ -68,7 +112,7 @@ + } + + public int getMaxStackSize() { +- return this.left.getMaxStackSize(); ++ return Math.min(this.left.getMaxStackSize(), this.right.getMaxStackSize()); // CraftBukkit - check both sides + } + + public void update() { diff --git a/nms-patches/InventoryMerchant.patch b/nms-patches/InventoryMerchant.patch new file mode 100644 index 00000000..bc24b3dc --- /dev/null +++ b/nms-patches/InventoryMerchant.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventoryMerchant.java 2014-11-27 08:59:46.769421547 +1100 ++++ src/main/java/net/minecraft/server/InventoryMerchant.java 2014-11-27 08:42:10.136850942 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventoryMerchant implements IInventory { + + private final IMerchant merchant; +@@ -8,6 +14,35 @@ + private MerchantRecipe recipe; + private int e; + ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.itemsInSlots; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int i) { ++ maxStack = i; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return player.getBukkitEntity(); ++ } ++ // CraftBukkit end ++ + public InventoryMerchant(EntityHuman entityhuman, IMerchant imerchant) { + this.player = entityhuman; + this.merchant = imerchant; +@@ -94,7 +129,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { diff --git a/nms-patches/InventorySubcontainer.patch b/nms-patches/InventorySubcontainer.patch new file mode 100644 index 00000000..ddacf613 --- /dev/null +++ b/nms-patches/InventorySubcontainer.patch @@ -0,0 +1,59 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/InventorySubcontainer.java 2014-11-27 08:59:46.769421547 +1100 ++++ src/main/java/net/minecraft/server/InventorySubcontainer.java 2014-11-27 08:42:10.088851036 +1100 +@@ -3,6 +3,12 @@ + import com.google.common.collect.Lists; + import java.util.List; + ++// CraftBukkit start ++import java.util.List; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class InventorySubcontainer implements IInventory { + + private String a; +@@ -10,8 +16,43 @@ + public ItemStack[] items; + private List d; + private boolean e; ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ protected org.bukkit.inventory.InventoryHolder bukkitOwner; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } + ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int i) { ++ maxStack = i; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return bukkitOwner; ++ } ++ + public InventorySubcontainer(String s, boolean flag, int i) { ++ this(s, flag, i, null); ++ } ++ ++ public InventorySubcontainer(String s, boolean flag, int i, org.bukkit.inventory.InventoryHolder owner) { // Added argument ++ this.bukkitOwner = owner; ++ // CraftBukkit end + this.a = s; + this.e = flag; + this.b = i; diff --git a/nms-patches/ItemBoat.patch b/nms-patches/ItemBoat.patch new file mode 100644 index 00000000..29142514 --- /dev/null +++ b/nms-patches/ItemBoat.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemBoat.java 2014-11-27 08:59:46.773421530 +1100 ++++ src/main/java/net/minecraft/server/ItemBoat.java 2014-11-27 08:42:10.156850903 +1100 +@@ -53,6 +53,14 @@ + } else { + if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { + BlockPosition blockposition = movingobjectposition.a(); ++ ++ // CraftBukkit start - Boat placement ++ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockposition, movingobjectposition.direction, itemstack); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + + if (world.getType(blockposition).getBlock() == Blocks.SNOW_LAYER) { + blockposition = blockposition.down(); diff --git a/nms-patches/ItemBow.patch b/nms-patches/ItemBow.patch new file mode 100644 index 00000000..9f8c9f51 --- /dev/null +++ b/nms-patches/ItemBow.patch @@ -0,0 +1,49 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemBow.java 2014-11-27 08:59:46.773421530 +1100 ++++ src/main/java/net/minecraft/server/ItemBow.java 2014-11-27 08:42:10.140850934 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit ++ + public class ItemBow extends Item { + + public static final String[] a = new String[] { "pulling_0", "pulling_1", "pulling_2"}; +@@ -45,9 +47,28 @@ + } + + if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, itemstack) > 0) { +- entityarrow.setOnFire(100); ++ // CraftBukkit start - call EntityCombustEvent ++ EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); ++ entityarrow.world.getServer().getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ entityarrow.setOnFire(event.getDuration()); ++ } ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start ++ org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f); ++ if (event.isCancelled()) { ++ event.getProjectile().remove(); ++ return; + } + ++ if (event.getProjectile() == entityarrow.getBukkitEntity()) { ++ world.addEntity(entityarrow); ++ } ++ // CraftBukkit end ++ + itemstack.damage(1, entityhuman); + world.makeSound(entityhuman, "random.bow", 1.0F, 1.0F / (ItemBow.g.nextFloat() * 0.4F + 1.2F) + f * 0.5F); + if (flag) { +@@ -58,7 +79,7 @@ + + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); + if (!world.isStatic) { +- world.addEntity(entityarrow); ++ // world.addEntity(entityarrow); // CraftBukkit - moved up + } + } + diff --git a/nms-patches/ItemBucket.patch b/nms-patches/ItemBucket.patch new file mode 100644 index 00000000..d037c57b --- /dev/null +++ b/nms-patches/ItemBucket.patch @@ -0,0 +1,102 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemBucket.java 2014-11-27 08:59:46.777421512 +1100 ++++ src/main/java/net/minecraft/server/ItemBucket.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,5 +1,12 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.event.player.PlayerBucketEmptyEvent; ++import org.bukkit.event.player.PlayerBucketFillEvent; ++// CraftBukkit end ++ + public class ItemBucket extends Item { + + private Block a; +@@ -33,19 +40,41 @@ + Material material = iblockdata.getBlock().getMaterial(); + + if (material == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) { ++ // CraftBukkit start ++ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.WATER_BUCKET); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + world.setAir(blockposition); + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); +- return this.a(itemstack, entityhuman, Items.WATER_BUCKET); ++ return this.a(itemstack, entityhuman, Items.WATER_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack + } + + if (material == Material.LAVA && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0) { ++ // CraftBukkit start ++ PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), null, itemstack, Items.LAVA_BUCKET); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + world.setAir(blockposition); + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); +- return this.a(itemstack, entityhuman, Items.LAVA_BUCKET); ++ return this.a(itemstack, entityhuman, Items.LAVA_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack + } + } else { + if (this.a == Blocks.AIR) { +- return new ItemStack(Items.BUCKET); ++ // CraftBukkit start ++ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), movingobjectposition.direction, itemstack); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ ++ return CraftItemStack.asNMSCopy(event.getItemStack()); ++ // CraftBukkit end + } + + BlockPosition blockposition1 = blockposition.shift(movingobjectposition.direction); +@@ -53,10 +82,18 @@ + if (!entityhuman.a(blockposition1, movingobjectposition.direction, itemstack)) { + return itemstack; + } ++ ++ // CraftBukkit start ++ PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, blockposition.getX(), blockposition.getY(), blockposition.getZ(), movingobjectposition.direction, itemstack); ++ ++ if (event.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end + + if (this.a(world, blockposition1) && !entityhuman.abilities.canInstantlyBuild) { + entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this)]); +- return new ItemStack(Items.BUCKET); ++ return CraftItemStack.asNMSCopy(event.getItemStack()); // CraftBukkit + } + } + } +@@ -64,15 +101,16 @@ + return itemstack; + } + } +- +- private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item) { ++ ++ // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this? ++ private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item, org.bukkit.inventory.ItemStack result) { + if (entityhuman.abilities.canInstantlyBuild) { + return itemstack; + } else if (--itemstack.count <= 0) { +- return new ItemStack(item); ++ return CraftItemStack.asNMSCopy(result); // CraftBukkit + } else { +- if (!entityhuman.inventory.pickup(new ItemStack(item))) { +- entityhuman.drop(new ItemStack(item, 1, 0), false); ++ if (!entityhuman.inventory.pickup(CraftItemStack.asNMSCopy(result))) { ++ entityhuman.drop(CraftItemStack.asNMSCopy(result), false); + } + + return itemstack; diff --git a/nms-patches/ItemDye.patch b/nms-patches/ItemDye.patch new file mode 100644 index 00000000..8586e786 --- /dev/null +++ b/nms-patches/ItemDye.patch @@ -0,0 +1,28 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemDye.java 2014-11-27 08:59:46.777421512 +1100 ++++ src/main/java/net/minecraft/server/ItemDye.java 2014-11-27 08:42:10.160850895 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit ++ + public class ItemDye extends Item { + + public static final int[] a = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; +@@ -89,6 +91,17 @@ + EnumColor enumcolor = EnumColor.fromInvColorIndex(itemstack.getData()); + + if (!entitysheep.isSheared() && entitysheep.getColor() != enumcolor) { ++ // CraftBukkit start ++ byte bColor = (byte) enumcolor.getColorIndex(); ++ SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByData(bColor)); ++ entitysheep.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ ++ enumcolor = EnumColor.fromColorIndex((byte) event.getColor().getWoolData()); ++ // CraftBukkit end + entitysheep.setColor(enumcolor); + --itemstack.count; + } diff --git a/nms-patches/ItemFireball.patch b/nms-patches/ItemFireball.patch new file mode 100644 index 00000000..6a754928 --- /dev/null +++ b/nms-patches/ItemFireball.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemFireball.java 2014-11-27 08:59:46.777421512 +1100 ++++ src/main/java/net/minecraft/server/ItemFireball.java 2014-11-27 08:42:10.124850965 +1100 +@@ -15,7 +15,15 @@ + return false; + } else { + if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR) { +- world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "item.fireCharge.use", 1.0F, (ItemFireball.g.nextFloat() - ItemFireball.g.nextFloat()) * 0.2F + 1.0F); ++ // CraftBukkit start - fire BlockIgniteEvent ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, entityhuman).isCancelled()) { ++ if (!entityhuman.abilities.canInstantlyBuild) { ++ --itemstack.count; ++ } ++ return false; ++ } ++ // CraftBukkit end ++ world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "item.fireCharge.use", 1.0F, (g.nextFloat() - g.nextFloat()) * 0.2F + 1.0F); + world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); + } + diff --git a/nms-patches/ItemFishingRod.patch b/nms-patches/ItemFishingRod.patch new file mode 100644 index 00000000..564c24b4 --- /dev/null +++ b/nms-patches/ItemFishingRod.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemFishingRod.java 2014-11-27 08:59:46.781421494 +1100 ++++ src/main/java/net/minecraft/server/ItemFishingRod.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.player.PlayerFishEvent; // CraftBukkit ++ + public class ItemFishingRod extends Item { + + public ItemFishingRod() { +@@ -15,9 +17,18 @@ + itemstack.damage(i, entityhuman); + entityhuman.bv(); + } else { +- world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (ItemFishingRod.g.nextFloat() * 0.4F + 0.8F)); ++ // CraftBukkit start ++ EntityFishingHook hook = new EntityFishingHook(world, entityhuman); ++ PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.Fish) hook.getBukkitEntity(), PlayerFishEvent.State.FISHING); ++ world.getServer().getPluginManager().callEvent(playerFishEvent); ++ ++ if (playerFishEvent.isCancelled()) { ++ return itemstack; ++ } ++ // CraftBukkit end ++ world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F)); + if (!world.isStatic) { +- world.addEntity(new EntityFishingHook(world, entityhuman)); ++ world.addEntity(hook); // CraftBukkit - moved creation up + } + + entityhuman.bv(); diff --git a/nms-patches/ItemFlintAndSteel.patch b/nms-patches/ItemFlintAndSteel.patch new file mode 100644 index 00000000..a27cc0b6 --- /dev/null +++ b/nms-patches/ItemFlintAndSteel.patch @@ -0,0 +1,47 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemFlintAndSteel.java 2014-11-27 08:59:46.781421494 +1100 ++++ src/main/java/net/minecraft/server/ItemFlintAndSteel.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++// CraftBukkit end ++ + public class ItemFlintAndSteel extends Item { + + public ItemFlintAndSteel() { +@@ -9,13 +14,32 @@ + } + + public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { ++ BlockPosition clicked = blockposition; // CraftBukkit + blockposition = blockposition.shift(enumdirection); + if (!entityhuman.a(blockposition, enumdirection, itemstack)) { + return false; + } else { + if (world.getType(blockposition).getBlock().getMaterial() == Material.AIR) { +- world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "fire.ignite", 1.0F, ItemFlintAndSteel.g.nextFloat() * 0.4F + 0.8F); ++ // CraftBukkit start - Store the clicked block ++ if (CraftEventFactory.callBlockIgniteEvent(world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL, entityhuman).isCancelled()) { ++ itemstack.damage(1, entityhuman); ++ return false; ++ } ++ ++ CraftBlockState blockState = CraftBlockState.getBlockState(world, blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ // CraftBukkit end ++ ++ world.makeSound((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F); + world.setTypeUpdate(blockposition, Blocks.FIRE.getBlockData()); ++ ++ // CraftBukkit start ++ org.bukkit.event.block.BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clicked.getX(), clicked.getY(), clicked.getZ()); ++ ++ if (placeEvent.isCancelled() || !placeEvent.canBuild()) { ++ placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte) 0, false); ++ return false; ++ } ++ // CraftBukkit end + } + + itemstack.damage(1, entityhuman); diff --git a/nms-patches/ItemHanging.patch b/nms-patches/ItemHanging.patch new file mode 100644 index 00000000..0a312a80 --- /dev/null +++ b/nms-patches/ItemHanging.patch @@ -0,0 +1,41 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemHanging.java 2014-11-27 08:59:46.785421476 +1100 ++++ src/main/java/net/minecraft/server/ItemHanging.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.event.hanging.HangingPlaceEvent; ++import org.bukkit.event.painting.PaintingPlaceEvent; ++// CraftBukkit end ++ + public class ItemHanging extends Item { + + private final Class a; +@@ -24,6 +30,26 @@ + + if (entityhanging != null && entityhanging.survives()) { + if (!world.isStatic) { ++ // CraftBukkit start - fire HangingPlaceEvent ++ Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity(); ++ org.bukkit.block.Block blockClicked = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(enumdirection); ++ ++ HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ PaintingPlaceEvent paintingEvent = null; ++ if (entityhanging instanceof EntityPainting) { ++ // Fire old painting event until it can be removed ++ paintingEvent = new PaintingPlaceEvent((org.bukkit.entity.Painting) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); ++ paintingEvent.setCancelled(event.isCancelled()); ++ world.getServer().getPluginManager().callEvent(paintingEvent); ++ } ++ ++ if (event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { ++ return false; ++ } ++ // CraftBukkit end + world.addEntity(entityhanging); + } + diff --git a/nms-patches/ItemLeash.patch b/nms-patches/ItemLeash.patch new file mode 100644 index 00000000..2836ac93 --- /dev/null +++ b/nms-patches/ItemLeash.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemLeash.java 2014-11-27 08:59:46.785421476 +1100 ++++ src/main/java/net/minecraft/server/ItemLeash.java 2014-11-27 08:42:10.084851043 +1100 +@@ -3,6 +3,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.hanging.HangingPlaceEvent; // CraftBukkit ++ + public class ItemLeash extends Item { + + public ItemLeash() { +@@ -40,7 +42,23 @@ + if (entityinsentient.cb() && entityinsentient.getLeashHolder() == entityhuman) { + if (entityleash == null) { + entityleash = EntityLeash.a(world, blockposition); ++ ++ // CraftBukkit start - fire HangingPlaceEvent ++ HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityleash.getBukkitEntity(), entityhuman != null ? (org.bukkit.entity.Player) entityhuman.getBukkitEntity() : null, world.getWorld().getBlockAt(i, j, k), org.bukkit.block.BlockFace.SELF); ++ world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ entityleash.die(); ++ return false; ++ } ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, entityleash, entityhuman).isCancelled()) { ++ continue; + } ++ // CraftBukkit end + + entityinsentient.setLeashHolder(entityleash, true); + flag = true; diff --git a/nms-patches/ItemMapEmpty.patch b/nms-patches/ItemMapEmpty.patch new file mode 100644 index 00000000..9159a106 --- /dev/null +++ b/nms-patches/ItemMapEmpty.patch @@ -0,0 +1,24 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemMapEmpty.java 2014-11-27 08:59:46.785421476 +1100 ++++ src/main/java/net/minecraft/server/ItemMapEmpty.java 2014-11-27 08:42:10.164850887 +1100 +@@ -7,15 +7,19 @@ + } + + public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { +- ItemStack itemstack1 = new ItemStack(Items.FILLED_MAP, 1, world.b("map")); ++ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world ++ ItemStack itemstack1 = new ItemStack(Items.FILLED_MAP, 1, worldMain.b("map")); // CraftBukkit - use primary world for maps + String s = "map_" + itemstack1.getData(); + WorldMap worldmap = new WorldMap(s); + + world.a(s, (PersistentBase) worldmap); + worldmap.scale = 0; + worldmap.a(entityhuman.locX, entityhuman.locZ, worldmap.scale); +- worldmap.map = (byte) world.worldProvider.getDimension(); ++ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - use bukkit dimension + worldmap.c(); ++ ++ org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new org.bukkit.event.server.MapInitializeEvent(worldmap.mapView)); // CraftBukkit ++ + --itemstack.count; + if (itemstack.count <= 0) { + return itemstack1; diff --git a/nms-patches/ItemMinecart.patch b/nms-patches/ItemMinecart.patch new file mode 100644 index 00000000..5cff838f --- /dev/null +++ b/nms-patches/ItemMinecart.patch @@ -0,0 +1,16 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemMinecart.java 2014-11-27 08:59:46.789421459 +1100 ++++ src/main/java/net/minecraft/server/ItemMinecart.java 2014-11-27 08:42:10.168850880 +1100 +@@ -23,6 +23,13 @@ + if (enumtrackposition.c()) { + d0 = 0.5D; + } ++ // CraftBukkit start - Minecarts ++ org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end + + EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, (double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.0625D + d0, (double) blockposition.getZ() + 0.5D, this.b); + diff --git a/nms-patches/ItemMonsterEgg.patch b/nms-patches/ItemMonsterEgg.patch new file mode 100644 index 00000000..3a5fbee6 --- /dev/null +++ b/nms-patches/ItemMonsterEgg.patch @@ -0,0 +1,25 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemMonsterEgg.java 2014-11-27 08:59:46.789421459 +1100 ++++ src/main/java/net/minecraft/server/ItemMonsterEgg.java 2014-11-27 08:42:10.172850872 +1100 +@@ -19,7 +19,8 @@ + } + + public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { +- if (world.isStatic) { ++ // CraftBukkit - check ItemStack data ++ if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { + return true; + } else if (!entityhuman.a(blockposition.shift(enumdirection), enumdirection, itemstack)) { + return false; +@@ -109,6 +110,12 @@ + } + + public static Entity a(World world, int i, double d0, double d1, double d2) { ++ // CraftBukkit start - delegate to spawnCreature ++ return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); ++ } ++ ++ public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { ++ // CraftBukkit end + if (!EntityTypes.eggInfo.containsKey(Integer.valueOf(i))) { + return null; + } else { diff --git a/nms-patches/ItemStack.patch b/nms-patches/ItemStack.patch new file mode 100644 index 00000000..da50d5cf --- /dev/null +++ b/nms-patches/ItemStack.patch @@ -0,0 +1,219 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemStack.java 2014-11-27 08:59:46.789421459 +1100 ++++ src/main/java/net/minecraft/server/ItemStack.java 2014-11-27 08:42:10.156850903 +1100 +@@ -5,6 +5,18 @@ + import java.text.DecimalFormat; + import java.util.Random; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.Location; ++import org.bukkit.TreeType; ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.entity.Player; ++import org.bukkit.event.world.StructureGrowEvent; ++// CraftBukkit end ++ + public final class ItemStack { + + public static final DecimalFormat a = new DecimalFormat("#.###"); +@@ -46,11 +58,13 @@ + this.k = false; + this.item = item; + this.count = i; +- this.damage = j; +- if (this.damage < 0) { +- this.damage = 0; +- } +- ++ // CraftBukkit start - Pass to setData to do filtering ++ this.setData(j); ++ //this.damage = j; ++ //if (this.damage < 0) { ++ // this.damage = 0; ++ //} ++ // CraftBukkit end + } + + public static ItemStack createStack(NBTTagCompound nbttagcompound) { +@@ -83,11 +97,96 @@ + } + + public boolean placeItem(EntityHuman entityhuman, World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { ++ // CraftBukkit start - handle all block place event logic here ++ int data = this.getData(); ++ int count = this.count; ++ ++ if (!(this.getItem() instanceof ItemBucket)) { // if not bucket ++ world.captureBlockStates = true; ++ // special case bonemeal ++ if (this.getItem() instanceof ItemDye && this.getData() == 15) { ++ Block block = world.getType(blockposition).getBlock(); ++ if (block == Blocks.SAPLING || block instanceof BlockMushroom) { ++ world.captureTreeGeneration = true; ++ } ++ } ++ } + boolean flag = this.getItem().interactWith(this, entityhuman, world, blockposition, enumdirection, f, f1, f2); ++ int newData = this.getData(); ++ int newCount = this.count; ++ this.count = count; ++ this.setData(data); ++ world.captureBlockStates = false; ++ if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { ++ world.captureTreeGeneration = false; ++ Location location = new Location(world.getWorld(), blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ TreeType treeType = BlockSapling.treeType; ++ BlockSapling.treeType = null; ++ List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone(); ++ world.capturedBlockStates.clear(); ++ StructureGrowEvent event = null; ++ if (treeType != null) { ++ event = new StructureGrowEvent(location, treeType, false, (Player) entityhuman.getBukkitEntity(), blocks); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ } ++ if (event == null || !event.isCancelled()) { ++ // Change the stack to its new contents if it hasn't been tampered with. ++ if (this.count == count && this.getData() == data) { ++ this.setData(newData); ++ this.count = newCount; ++ } ++ for (BlockState blockstate : blocks) { ++ blockstate.update(true); ++ } ++ } ++ ++ return flag; ++ } ++ world.captureTreeGeneration = false; + + if (flag) { +- entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)]); ++ org.bukkit.event.block.BlockPlaceEvent placeEvent = null; ++ List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone(); ++ world.capturedBlockStates.clear(); ++ if (blocks.size() > 1) { ++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, blocks, blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ } else if (blocks.size() == 1) { ++ placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blocks.get(0), blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ } ++ ++ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { ++ flag = false; // cancel placement ++ // revert back all captured blocks ++ for (BlockState blockstate : blocks) { ++ blockstate.update(true, false); ++ } ++ } else { ++ // Change the stack to its new contents if it hasn't been tampered with. ++ if (this.count == count && this.getData() == data) { ++ this.setData(newData); ++ this.count = newCount; ++ } ++ for (BlockState blockstate : blocks) { ++ int x = blockstate.getX(); ++ int y = blockstate.getY(); ++ int z = blockstate.getZ(); ++ int updateFlag = ((CraftBlockState) blockstate).getFlag(); ++ org.bukkit.Material mat = blockstate.getType(); ++ Block oldBlock = CraftMagicNumbers.getBlock(mat); ++ BlockPosition newblockposition = new BlockPosition(x, y, z); ++ IBlockData block = world.getType(newblockposition); ++ ++ if (!(block instanceof BlockContainer)) { // Containers get placed automatically ++ block.getBlock().onPlace(world, newblockposition, block); ++ } ++ ++ world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block.getBlock(), updateFlag); // send null chunk as chunk.k() returns false by this point ++ } ++ entityhuman.b(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)]); ++ } + } ++ world.capturedBlockStates.clear(); ++ // CraftBukkit end + + return flag; + } +@@ -111,7 +210,7 @@ + nbttagcompound.setByte("Count", (byte) this.count); + nbttagcompound.setShort("Damage", (short) this.damage); + if (this.tag != null) { +- nbttagcompound.set("tag", this.tag); ++ nbttagcompound.set("tag", this.tag.clone()); // CraftBukkit - make defensive copy, data is going to another thread + } + + return nbttagcompound; +@@ -125,13 +224,18 @@ + } + + this.count = nbttagcompound.getByte("Count"); ++ /* CraftBukkit start - Route through setData for filtering + this.damage = nbttagcompound.getShort("Damage"); + if (this.damage < 0) { + this.damage = 0; + } ++ */ ++ this.setData(nbttagcompound.getShort("Damage")); ++ // CraftBukkit end + + if (nbttagcompound.hasKeyOfType("tag", 10)) { +- this.tag = nbttagcompound.getCompound("tag"); ++ // CraftBukkit - make defensive copy as this data may be coming from the save thread ++ this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").clone(); + if (this.item != null) { + this.item.a(this.tag); + } +@@ -168,8 +272,29 @@ + } + + public void setData(int i) { ++ // CraftBukkit start - Filter out data for items that shouldn't have it ++ // The crafting system uses this value for a special purpose so we have to allow it ++ if (i == 32767) { ++ this.damage = i; ++ return; ++ } ++ ++ // Is this a block? ++ if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) != Blocks.AIR) { ++ // If vanilla doesn't use data on it don't allow any ++ if (!(this.usesData() || this.getItem().usesDurability())) { ++ i = 0; ++ } ++ } ++ ++ // Filter invalid plant data ++ if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) == Blocks.DOUBLE_PLANT && (i > 5 || i < 0)) { ++ i = 0; ++ } ++ // CraftBukkit end ++ + this.damage = i; +- if (this.damage < 0) { ++ if (this.damage < -1) { // CraftBukkit + this.damage = 0; + } + +@@ -222,6 +347,12 @@ + if (this.count < 0) { + this.count = 0; + } ++ ++ // CraftBukkit start - Check for item breaking ++ if (this.count == 0 && entityliving instanceof EntityHuman) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) entityliving, this); ++ } ++ // CraftBukkit end + + this.damage = 0; + } +@@ -489,6 +620,7 @@ + + public void setItem(Item item) { + this.item = item; ++ this.setData(this.getData()); // CraftBukkit - Set data again to ensure it is filtered properly + } + + public IChatBaseComponent C() { diff --git a/nms-patches/ItemWaterLily.patch b/nms-patches/ItemWaterLily.patch new file mode 100644 index 00000000..2158f642 --- /dev/null +++ b/nms-patches/ItemWaterLily.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemWaterLily.java 2014-11-27 08:59:46.793421441 +1100 ++++ src/main/java/net/minecraft/server/ItemWaterLily.java 2014-11-27 08:42:10.152850911 +1100 +@@ -27,7 +27,15 @@ + IBlockData iblockdata = world.getType(blockposition); + + if (iblockdata.getBlock().getMaterial() == Material.WATER && ((Integer) iblockdata.get(BlockFluids.LEVEL)).intValue() == 0 && world.isEmpty(blockposition1)) { ++ // CraftBukkit start - special case for handling block placement with water lilies ++ org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()); + world.setTypeUpdate(blockposition1, Blocks.WATERLILY.getBlockData()); ++ org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { ++ blockstate.update(true, false); ++ return itemstack; ++ } ++ // CraftBukkit end + if (!entityhuman.abilities.canInstantlyBuild) { + --itemstack.count; + } diff --git a/nms-patches/ItemWorldMap.patch b/nms-patches/ItemWorldMap.patch new file mode 100644 index 00000000..f85596fd --- /dev/null +++ b/nms-patches/ItemWorldMap.patch @@ -0,0 +1,75 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ItemWorldMap.java 2014-11-27 08:59:46.793421441 +1100 ++++ src/main/java/net/minecraft/server/ItemWorldMap.java 2014-11-27 08:42:10.144850927 +1100 +@@ -4,6 +4,11 @@ + import com.google.common.collect.Iterables; + import com.google.common.collect.Multisets; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.event.server.MapInitializeEvent; ++// CraftBukkit end ++ + public class ItemWorldMap extends ItemWorldMapBase { + + protected ItemWorldMap() { +@@ -11,25 +16,32 @@ + } + + public WorldMap getSavedMap(ItemStack itemstack, World world) { ++ World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world + String s = "map_" + itemstack.getData(); +- WorldMap worldmap = (WorldMap) world.a(WorldMap.class, s); ++ WorldMap worldmap = (WorldMap) worldMain.a(WorldMap.class, s); // CraftBukkit - use primary world for maps + + if (worldmap == null && !world.isStatic) { +- itemstack.setData(world.b("map")); ++ itemstack.setData(worldMain.b("map")); // CraftBukkit - use primary world for maps + s = "map_" + itemstack.getData(); + worldmap = new WorldMap(s); + worldmap.scale = 3; + worldmap.a((double) world.getWorldData().c(), (double) world.getWorldData().e(), worldmap.scale); +- worldmap.map = (byte) world.worldProvider.getDimension(); ++ worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - fixes Bukkit multiworld maps + worldmap.c(); +- world.a(s, (PersistentBase) worldmap); ++ worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps ++ ++ // CraftBukkit start ++ MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + } + + return worldmap; + } + + public void a(World world, Entity entity, WorldMap worldmap) { +- if (world.worldProvider.getDimension() == worldmap.map && entity instanceof EntityHuman) { ++ // CraftBukkit - world.worldProvider -> ((WorldServer) world) ++ if (((WorldServer) world).dimension == worldmap.map && entity instanceof EntityHuman) { + int i = 1 << worldmap.scale; + int j = worldmap.centerX; + int k = worldmap.centerZ; +@@ -179,6 +191,8 @@ + if (itemstack.hasTag() && itemstack.getTag().getBoolean("map_is_scaling")) { + WorldMap worldmap = Items.FILLED_MAP.getSavedMap(itemstack, world); + ++ world = world.getServer().getServer().worlds.get(0); // CraftBukkit - use primary world for maps ++ + itemstack.setData(world.b("map")); + WorldMap worldmap1 = new WorldMap("map_" + itemstack.getData()); + +@@ -190,7 +204,12 @@ + worldmap1.a((double) worldmap.centerX, (double) worldmap.centerZ, worldmap1.scale); + worldmap1.map = worldmap.map; + worldmap1.c(); +- world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); ++ world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); ++ ++ // CraftBukkit start ++ MapInitializeEvent event = new MapInitializeEvent(worldmap1.mapView); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/JsonList.patch b/nms-patches/JsonList.patch new file mode 100644 index 00000000..0dcf0352 --- /dev/null +++ b/nms-patches/JsonList.patch @@ -0,0 +1,33 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/JsonList.java 2014-11-27 08:59:46.797421424 +1100 ++++ src/main/java/net/minecraft/server/JsonList.java 2014-11-27 08:42:10.168850880 +1100 +@@ -79,6 +79,12 @@ + public String[] getEntries() { + return (String[]) this.d.keySet().toArray(new String[this.d.size()]); + } ++ ++ // CraftBukkit start ++ public Collection<JsonListEntry> getValues() { ++ return this.d.values(); ++ } ++ // CraftBukkit end + + public boolean isEmpty() { + return this.d.size() < 1; +@@ -122,7 +128,7 @@ + return this.d; + } + +- public void save() { ++ public void save() throws IOException { // CraftBukkit - Added throws + Collection collection = this.d.values(); + String s = this.b.toJson(collection); + BufferedWriter bufferedwriter = null; +@@ -136,7 +142,7 @@ + + } + +- public void load() { ++ public void load() throws IOException { // CraftBukkit - Added throws + Collection collection = null; + BufferedReader bufferedreader = null; + diff --git a/nms-patches/LoginListener.patch b/nms-patches/LoginListener.patch new file mode 100644 index 00000000..b80cdad0 --- /dev/null +++ b/nms-patches/LoginListener.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/LoginListener.java 2014-11-27 08:59:46.797421424 +1100 ++++ src/main/java/net/minecraft/server/LoginListener.java 2014-11-27 08:42:10.172850872 +1100 +@@ -26,6 +26,7 @@ + private GameProfile i; + private String j; + private SecretKey loginKey; ++ public String hostname = ""; // CraftBukkit - add field + + public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { + this.g = EnumProtocolState.HELLO; +@@ -64,10 +65,12 @@ + this.i = this.a(this.i); + } + +- String s = this.server.getPlayerList().attemptLogin(this.networkManager.getSocketAddress(), this.i); ++ // CraftBukkit start - fire PlayerLoginEvent ++ EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.i, hostname); + +- if (s != null) { +- this.disconnect(s); ++ if (s == null) { ++ // this.disconnect(s); ++ // CraftBukkit end + } else { + this.g = EnumProtocolState.ACCEPTED; + if (this.server.aI() >= 0 && !this.networkManager.c()) { +@@ -75,7 +78,7 @@ + } + + this.networkManager.handle(new PacketLoginOutSuccess(this.i)); +- this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i)); ++ this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i, s)); // CraftBukkit - add player reference + } + + } diff --git a/nms-patches/MethodProfiler.patch b/nms-patches/MethodProfiler.patch new file mode 100644 index 00000000..62424983 --- /dev/null +++ b/nms-patches/MethodProfiler.patch @@ -0,0 +1,135 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MethodProfiler.java 2014-11-27 08:59:46.797421424 +1100 ++++ src/main/java/net/minecraft/server/MethodProfiler.java 2014-11-27 08:42:10.132850949 +1100 +@@ -10,129 +10,29 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start - Strip down to empty methods, performance cost + public class MethodProfiler { +- +- private static final Logger b = LogManager.getLogger(); +- private final List c = Lists.newArrayList(); +- private final List d = Lists.newArrayList(); + public boolean a; +- private String e = ""; +- private final Map f = Maps.newHashMap(); + + public MethodProfiler() {} + + public void a() { +- this.f.clear(); +- this.e = ""; +- this.c.clear(); + } + + public void a(String s) { +- if (this.a) { +- if (this.e.length() > 0) { +- this.e = this.e + "."; +- } +- +- this.e = this.e + s; +- this.c.add(this.e); +- this.d.add(Long.valueOf(System.nanoTime())); +- } + } + + public void b() { +- if (this.a) { +- long i = System.nanoTime(); +- long j = ((Long) this.d.remove(this.d.size() - 1)).longValue(); +- +- this.c.remove(this.c.size() - 1); +- long k = i - j; +- +- if (this.f.containsKey(this.e)) { +- this.f.put(this.e, Long.valueOf(((Long) this.f.get(this.e)).longValue() + k)); +- } else { +- this.f.put(this.e, Long.valueOf(k)); +- } +- +- if (k > 100000000L) { +- MethodProfiler.b.warn("Something\'s taking too long! \'" + this.e + "\' took aprox " + (double) k / 1000000.0D + " ms"); +- } +- +- this.e = !this.c.isEmpty() ? (String) this.c.get(this.c.size() - 1) : ""; +- } + } + + public List b(String s) { +- if (!this.a) { +- return null; +- } else { +- long i = this.f.containsKey("root") ? ((Long) this.f.get("root")).longValue() : 0L; +- long j = this.f.containsKey(s) ? ((Long) this.f.get(s)).longValue() : -1L; +- ArrayList arraylist = Lists.newArrayList(); +- +- if (s.length() > 0) { +- s = s + "."; +- } +- +- long k = 0L; +- Iterator iterator = this.f.keySet().iterator(); +- +- while (iterator.hasNext()) { +- String s1 = (String) iterator.next(); +- +- if (s1.length() > s.length() && s1.startsWith(s) && s1.indexOf(".", s.length() + 1) < 0) { +- k += ((Long) this.f.get(s1)).longValue(); +- } +- } +- +- float f = (float) k; +- +- if (k < j) { +- k = j; +- } +- +- if (i < k) { +- i = k; +- } +- +- Iterator iterator1 = this.f.keySet().iterator(); +- +- String s2; +- +- while (iterator1.hasNext()) { +- s2 = (String) iterator1.next(); +- if (s2.length() > s.length() && s2.startsWith(s) && s2.indexOf(".", s.length() + 1) < 0) { +- long l = ((Long) this.f.get(s2)).longValue(); +- double d0 = (double) l * 100.0D / (double) k; +- double d1 = (double) l * 100.0D / (double) i; +- String s3 = s2.substring(s.length()); +- +- arraylist.add(new ProfilerInfo(s3, d0, d1)); +- } +- } +- +- iterator1 = this.f.keySet().iterator(); +- +- while (iterator1.hasNext()) { +- s2 = (String) iterator1.next(); +- this.f.put(s2, Long.valueOf(((Long) this.f.get(s2)).longValue() * 999L / 1000L)); +- } +- +- if ((float) k > f) { +- arraylist.add(new ProfilerInfo("unspecified", (double) ((float) k - f) * 100.0D / (double) k, (double) ((float) k - f) * 100.0D / (double) i)); +- } +- +- Collections.sort(arraylist); +- arraylist.add(0, new ProfilerInfo(s, 100.0D, (double) k * 100.0D / (double) i)); +- return arraylist; +- } ++ return null; + } + + public void c(String s) { +- this.b(); +- this.a(s); + } + + public String c() { +- return this.c.size() == 0 ? "[UNKNOWN]" : (String) this.c.get(this.c.size() - 1); ++ return null; + } + } diff --git a/nms-patches/MinecraftServer.patch b/nms-patches/MinecraftServer.patch new file mode 100644 index 00000000..22d7748f --- /dev/null +++ b/nms-patches/MinecraftServer.patch @@ -0,0 +1,726 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MinecraftServer.java 2014-11-27 08:59:46.801421406 +1100 ++++ src/main/java/net/minecraft/server/MinecraftServer.java 2014-11-27 08:42:10.092851027 +1100 +@@ -37,6 +37,18 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.io.IOException; ++ ++import jline.console.ConsoleReader; ++import joptsimple.OptionSet; ++ ++import org.bukkit.craftbukkit.Main; ++import org.bukkit.World.Environment; ++import org.bukkit.craftbukkit.util.Waitable; ++import org.bukkit.event.server.RemoteServerCommandEvent; ++import org.bukkit.event.world.WorldSaveEvent; ++// CraftBukkit end + public abstract class MinecraftServer implements ICommandListener, Runnable, IAsyncTaskHandler, IMojangStatistics { + + private static final Logger LOGGER = LogManager.getLogger(); +@@ -93,24 +105,66 @@ + private Thread serverThread; + private long ab = ax(); + +- public MinecraftServer(File file, Proxy proxy, File file1) { ++ // CraftBukkit start ++ public List<WorldServer> worlds = new ArrayList<WorldServer>(); ++ public org.bukkit.craftbukkit.CraftServer server; ++ public OptionSet options; ++ public org.bukkit.command.ConsoleCommandSender console; ++ public org.bukkit.command.RemoteConsoleCommandSender remoteConsole; ++ public ConsoleReader reader; ++ public static int currentTick = (int) (System.currentTimeMillis() / 50); ++ public final Thread primaryThread; ++ public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>(); ++ public int autosavePeriod; ++ // CraftBukkit end ++ ++ public MinecraftServer(OptionSet options, Proxy proxy, File file1) { + this.d = proxy; + MinecraftServer.k = this; +- this.universe = file; ++ // this.universe = file; // CraftBukkit + this.q = new ServerConnection(this); + this.Z = new UserCache(this, file1); + this.p = this.h(); +- this.convertable = new WorldLoaderServer(file); ++ // this.convertable = new WorldLoaderServer(file); // CraftBukkit - moved to DedicatedServer.init + this.V = new YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString()); + this.W = this.V.createMinecraftSessionService(); + this.Y = this.V.createProfileRepository(); ++ // CraftBukkit start ++ this.options = options; ++ // Try to see if we're actually running in a terminal, disable jline if not ++ if (System.console() == null) { ++ System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); ++ Main.useJline = false; ++ } ++ ++ try { ++ reader = new ConsoleReader(System.in, System.out); ++ reader.setExpandEvents(false); // Avoid parsing exceptions for uncommonly used event designators ++ } catch (Throwable e) { ++ try { ++ // Try again with jline disabled for Windows users without C++ 2008 Redistributable ++ System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); ++ System.setProperty("user.language", "en"); ++ Main.useJline = false; ++ reader = new ConsoleReader(System.in, System.out); ++ reader.setExpandEvents(false); ++ } catch (IOException ex) { ++ LOGGER.warn((String) null, ex); ++ } ++ } ++ Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this)); ++ ++ this.serverThread = primaryThread = new Thread(this, "Server thread"); // Moved from main + } + ++ public abstract PropertyManager getPropertyManager(); ++ // CraftBukkit end ++ + protected CommandDispatcher h() { + return new CommandDispatcher(); + } + +- protected abstract boolean init(); ++ protected abstract boolean init() throws java.net.UnknownHostException; // CraftBukkit - throws UnknownHostException + + protected void a(String s) { + if (this.getConvertable().isConvertable(s)) { +@@ -129,6 +183,7 @@ + this.a(s); + this.b("menu.loadingLevel"); + this.worldServer = new WorldServer[3]; ++ /* CraftBukkit start - Remove ticktime arrays and worldsettings + this.h = new long[this.worldServer.length][100]; + IDataManager idatamanager = this.convertable.a(s, true); + +@@ -152,37 +207,110 @@ + worlddata.a(s1); + worldsettings = new WorldSettings(worlddata); + } ++ */ ++ int worldCount = 3; + +- for (int j = 0; j < this.worldServer.length; ++j) { +- byte b0 = 0; ++ for (int j = 0; j < worldCount; ++j) { ++ WorldServer world; ++ byte dimension = 0; + + if (j == 1) { +- b0 = -1; ++ if (getAllowNether()) { ++ dimension = -1; ++ } else { ++ continue; ++ } + } + + if (j == 2) { +- b0 = 1; ++ if (server.getAllowEnd()) { ++ dimension = 1; ++ } else { ++ continue; ++ } + } + ++ String worldType = org.bukkit.World.Environment.getEnvironment(dimension).toString().toLowerCase(); ++ String name = (dimension == 0) ? s : s + "_" + worldType; ++ ++ org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); ++ WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); ++ worldsettings.setGeneratorSettings(s2); ++ + if (j == 0) { ++ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, true); ++ WorldData worlddata = idatamanager.getWorldData(); ++ if (worlddata == null) { ++ worlddata = new WorldData(worldsettings, s1); ++ } + if (this.W()) { +- this.worldServer[j] = (WorldServer) (new DemoWorldServer(this, idatamanager, worlddata, b0, this.methodProfiler)).b(); ++ world = (WorldServer) (new DemoWorldServer(this, idatamanager, worlddata, dimension, this.methodProfiler)).b(); + } else { +- this.worldServer[j] = (WorldServer) (new WorldServer(this, idatamanager, worlddata, b0, this.methodProfiler)).b(); ++ world = (WorldServer) (new WorldServer(this, idatamanager, worlddata, dimension, this.methodProfiler, org.bukkit.World.Environment.getEnvironment(dimension), gen)).b(); + } + +- this.worldServer[j].a(worldsettings); ++ world.a(worldsettings); ++ this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard()); + } else { +- this.worldServer[j] = (WorldServer) (new SecondaryWorldServer(this, idatamanager, b0, this.worldServer[0], this.methodProfiler)).b(); ++ String dim = "DIM" + dimension; ++ ++ File newWorld = new File(new File(name), dim); ++ File oldWorld = new File(new File(s), dim); ++ ++ if ((!newWorld.isDirectory()) && (oldWorld.isDirectory())) { ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder required ----"); ++ MinecraftServer.LOGGER.info("Unfortunately due to the way that Minecraft implemented multiworld support in 1.6, Bukkit requires that you move your " + worldType + " folder to a new location in order to operate correctly."); ++ MinecraftServer.LOGGER.info("We will move this folder for you, but it will mean that you need to move it back should you wish to stop using Bukkit in the future."); ++ MinecraftServer.LOGGER.info("Attempting to move " + oldWorld + " to " + newWorld + "..."); ++ ++ if (newWorld.exists()) { ++ MinecraftServer.LOGGER.warn("A file or folder already exists at " + newWorld + "!"); ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); ++ } else if (newWorld.getParentFile().mkdirs()) { ++ if (oldWorld.renameTo(newWorld)) { ++ MinecraftServer.LOGGER.info("Success! To restore " + worldType + " in the future, simply move " + newWorld + " to " + oldWorld); ++ // Migrate world data too. ++ try { ++ com.google.common.io.Files.copy(new File(new File(s), "level.dat"), new File(new File(name), "level.dat")); ++ } catch (IOException exception) { ++ MinecraftServer.LOGGER.warn("Unable to migrate world data."); ++ } ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder complete ----"); ++ } else { ++ MinecraftServer.LOGGER.warn("Could not move folder " + oldWorld + " to " + newWorld + "!"); ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); ++ } ++ } else { ++ MinecraftServer.LOGGER.warn("Could not create path for " + newWorld + "!"); ++ MinecraftServer.LOGGER.info("---- Migration of old " + worldType + " folder failed ----"); ++ } ++ } ++ ++ IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, true); ++ // world =, b0 to dimension, s1 to name, added Environment and gen ++ WorldData worlddata = idatamanager.getWorldData(); ++ if (worlddata == null) { ++ worlddata = new WorldData(worldsettings, name); ++ } ++ world = (WorldServer) new SecondaryWorldServer(this, idatamanager, dimension, this.worlds.get(0), this.methodProfiler, worlddata, org.bukkit.World.Environment.getEnvironment(dimension), gen).b(); + } + +- this.worldServer[j].addIWorldAccess(new WorldManager(this, this.worldServer[j])); ++ if (gen != null) { ++ world.getWorld().getPopulators().addAll(gen.getDefaultPopulators(world.getWorld())); ++ } ++ ++ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld())); ++ ++ world.addIWorldAccess(new WorldManager(this, world)); + if (!this.S()) { +- this.worldServer[j].getWorldData().setGameType(this.getGamemode()); ++ world.getWorldData().setGameType(this.getGamemode()); + } ++ ++ worlds.add(world); ++ getPlayerList().setPlayerFileData(worlds.toArray(new WorldServer[worlds.size()])); + } + +- this.v.setPlayerFileData(this.worldServer); ++ // CraftBukkit end + this.a(this.getDifficulty()); + this.k(); + } +@@ -197,25 +325,38 @@ + this.b("menu.generatingTerrain"); + byte b0 = 0; + +- MinecraftServer.LOGGER.info("Preparing start region for level " + b0); +- WorldServer worldserver = this.worldServer[b0]; +- BlockPosition blockposition = worldserver.getSpawn(); +- long j = ax(); +- +- for (int k = -192; k <= 192 && this.isRunning(); k += 16) { +- for (int l = -192; l <= 192 && this.isRunning(); l += 16) { +- long i1 = ax(); +- +- if (i1 - j > 1000L) { +- this.a_("Preparing spawn area", i * 100 / 625); +- j = i1; +- } ++ // CraftBukkit start - fire WorldLoadEvent and handle whether or not to keep the spawn in memory ++ for (int m = 0; m < worlds.size(); m++) { ++ WorldServer worldserver = this.worlds.get(m); ++ LOGGER.info("Preparing start region for level " + m + " (Seed: " + worldserver.getSeed() + ")"); ++ ++ if (!worldserver.getWorld().getKeepSpawnInMemory()) { ++ continue; ++ } ++ ++ BlockPosition blockposition = worldserver.getSpawn(); ++ long j = ax(); ++ i = 0; ++ ++ for (int k = -192; k <= 192 && this.isRunning(); k += 16) { ++ for (int l = -192; l <= 192 && this.isRunning(); l += 16) { ++ long i1 = ax(); ++ ++ if (i1 - j > 1000L) { ++ this.a_("Preparing spawn area", i * 100 / 625); ++ j = i1; ++ } + +- ++i; +- worldserver.chunkProviderServer.getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4); ++ ++i; ++ worldserver.chunkProviderServer.getChunkAt(blockposition.getX() + k >> 4, blockposition.getZ() + l >> 4); ++ } + } + } + ++ for (WorldServer world : this.worlds) { ++ this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(world.getWorld())); ++ } ++ // CraftBukkit end + this.q(); + } + +@@ -247,35 +388,42 @@ + protected void q() { + this.e = null; + this.f = 0; ++ ++ this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); // CraftBukkit + } + +- protected void saveChunks(boolean flag) { ++ protected void saveChunks(boolean flag) throws ExceptionWorldConflict { // CraftBukkit - added throws + if (!this.N) { +- WorldServer[] aworldserver = this.worldServer; +- int i = aworldserver.length; +- +- for (int j = 0; j < i; ++j) { +- WorldServer worldserver = aworldserver[j]; + ++ // CraftBukkit start ++ for (int j = 0; j < worlds.size(); ++j) { ++ WorldServer worldserver = worlds.get(j); ++ // CraftBukkit end + if (worldserver != null) { + if (!flag) { + MinecraftServer.LOGGER.info("Saving chunks for level \'" + worldserver.getWorldData().getName() + "\'/" + worldserver.worldProvider.getName()); + } + +- try { +- worldserver.save(true, (IProgressUpdate) null); +- } catch (ExceptionWorldConflict exceptionworldconflict) { +- MinecraftServer.LOGGER.warn(exceptionworldconflict.getMessage()); +- } ++ worldserver.save(true, (IProgressUpdate) null); ++ worldserver.saveLevel(); ++ ++ WorldSaveEvent event = new WorldSaveEvent(worldserver.getWorld()); ++ this.server.getPluginManager().callEvent(event); ++ // CraftBukkit end + } + } + + } + } + +- public void stop() { ++ public void stop() throws ExceptionWorldConflict { // CraftBukkit - added throws + if (!this.N) { + MinecraftServer.LOGGER.info("Stopping server"); ++ // CraftBukkit start ++ if (this.server != null) { ++ this.server.disablePlugins(); ++ } ++ // CraftBukkit end + if (this.ao() != null) { + this.ao().b(); + } +@@ -290,11 +438,13 @@ + MinecraftServer.LOGGER.info("Saving worlds"); + this.saveChunks(false); + ++ /* CraftBukkit start - Handled in saveChunks + for (int i = 0; i < this.worldServer.length; ++i) { + WorldServer worldserver = this.worldServer[i]; + + worldserver.saveLevel(); + } ++ // CraftBukkit end */ + } + + if (this.m.d()) { +@@ -335,6 +485,7 @@ + long k = j - this.ab; + + if (k > 2000L && this.ab - this.R >= 15000L) { ++ if (server.getWarnOnOverload()) // CraftBukkit + MinecraftServer.LOGGER.warn("Can\'t keep up! Did the system time change, or is the server overloaded? Running {}ms behind, skipping {} tick(s)", new Object[] { Long.valueOf(k), Long.valueOf(k / 50L)}); + k = 2000L; + this.R = this.ab; +@@ -347,11 +498,12 @@ + + i += k; + this.ab = j; +- if (this.worldServer[0].everyoneDeeplySleeping()) { ++ if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit + this.y(); + i = 0L; + } else { + while (i > 50L) { ++ MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit + i -= 50L; + this.y(); + } +@@ -389,6 +541,12 @@ + } catch (Throwable throwable1) { + MinecraftServer.LOGGER.error("Exception stopping the server", throwable1); + } finally { ++ // CraftBukkit start - Restore terminal to original settings ++ try { ++ reader.getTerminal().restore(); ++ } catch (Exception ignored) { ++ } ++ // CraftBukkit end + this.x(); + } + +@@ -428,7 +586,7 @@ + + protected void x() {} + +- protected void y() { ++ protected void y() throws ExceptionWorldConflict { // CraftBukkit - added throws + long i = System.nanoTime(); + + ++this.ticks; +@@ -454,7 +612,7 @@ + this.r.b().a(agameprofile); + } + +- if (this.ticks % 900 == 0) { ++ if (autosavePeriod > 0 && this.ticks % autosavePeriod == 0) { // CraftBukkit + this.methodProfiler.a("save"); + this.v.savePlayers(); + this.saveChunks(true); +@@ -493,20 +651,40 @@ + + this.methodProfiler.c("levels"); + ++ // CraftBukkit start ++ this.server.getScheduler().mainThreadHeartbeat(this.ticks); ++ ++ // Run tasks that are waiting on processing ++ while (!processQueue.isEmpty()) { ++ processQueue.remove().run(); ++ } ++ ++ org.bukkit.craftbukkit.chunkio.ChunkIOExecutor.tick(); ++ ++ // Send time updates to everyone, it will get the right time from the world the player is in. ++ if (this.ticks % 20 == 0) { ++ for (int i = 0; i < this.getPlayerList().players.size(); ++i) { ++ EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); ++ entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time ++ } ++ } ++ + int i; + +- for (i = 0; i < this.worldServer.length; ++i) { ++ for (i = 0; i < this.worlds.size(); ++i) { + long j = System.nanoTime(); + +- if (i == 0 || this.getAllowNether()) { +- WorldServer worldserver = this.worldServer[i]; ++ // if (i == 0 || this.getAllowNether()) { ++ WorldServer worldserver = this.worlds.get(i); + + this.methodProfiler.a(worldserver.getWorldData().getName()); ++ /* Drop global time updates + if (this.ticks % 20 == 0) { + this.methodProfiler.a("timeSync"); + this.v.a(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle")), worldserver.worldProvider.getDimension()); + this.methodProfiler.b(); + } ++ // CraftBukkit end */ + + this.methodProfiler.a("tick"); + +@@ -533,9 +711,9 @@ + worldserver.getTracker().updatePlayers(); + this.methodProfiler.b(); + this.methodProfiler.b(); +- } ++ // } // CraftBukkit + +- this.h[i][this.ticks % 100] = System.nanoTime() - j; ++ // this.h[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit + } + + this.methodProfiler.c("connection"); +@@ -559,10 +737,11 @@ + this.o.add(iupdateplayerlistbox); + } + +- public static void main(String[] astring) { ++ public static void main(final OptionSet options) { // CraftBukkit - replaces main(String[] astring) + DispenserRegistry.c(); + + try { ++ /* CraftBukkit start - Replace everything + boolean flag = true; + String s = null; + String s1 = "."; +@@ -636,6 +815,29 @@ + + dedicatedserver.B(); + Runtime.getRuntime().addShutdownHook(new ThreadShutdown("Server Shutdown Thread", dedicatedserver)); ++ */ ++ ++ DedicatedServer dedicatedserver = new DedicatedServer(options); ++ ++ if (options.has("port")) { ++ int port = (Integer) options.valueOf("port"); ++ if (port > 0) { ++ dedicatedserver.setPort(port); ++ } ++ } ++ ++ if (options.has("universe")) { ++ dedicatedserver.universe = (File) options.valueOf("universe"); ++ } else { ++ dedicatedserver.universe = new File("."); ++ } ++ ++ if (options.has("world")) { ++ dedicatedserver.setWorld((String) options.valueOf("world")); ++ } ++ ++ dedicatedserver.primaryThread.start(); ++ // CraftBukkit end + } catch (Exception exception) { + MinecraftServer.LOGGER.fatal("Failed to start the minecraft server", exception); + } +@@ -643,8 +845,10 @@ + } + + public void B() { ++ /* CraftBukkit start - prevent abuse + this.serverThread = new Thread(this, "Server thread"); + this.serverThread.start(); ++ // CraftBukkit end */ + } + + public File d(String s) { +@@ -660,7 +864,14 @@ + } + + public WorldServer getWorldServer(int i) { +- return i == -1 ? this.worldServer[1] : (i == 1 ? this.worldServer[2] : this.worldServer[0]); ++ // CraftBukkit start ++ for (WorldServer world : worlds) { ++ if (world.dimension == i) { ++ return world; ++ } ++ } ++ return worlds.get(0); ++ // CraftBukkit end + } + + public String C() { +@@ -696,17 +907,62 @@ + } + + public String getPlugins() { +- return ""; +- } ++ // CraftBukkit start - Whole method ++ StringBuilder result = new StringBuilder(); ++ org.bukkit.plugin.Plugin[] plugins = server.getPluginManager().getPlugins(); ++ ++ result.append(server.getName()); ++ result.append(" on Bukkit "); ++ result.append(server.getBukkitVersion()); ++ ++ if (plugins.length > 0 && server.getQueryPlugins()) { ++ result.append(": "); ++ ++ for (int i = 0; i < plugins.length; i++) { ++ if (i > 0) { ++ result.append("; "); ++ } + +- public String executeRemoteCommand(String s) { +- RemoteControlCommandListener.getInstance().i(); +- this.p.a(RemoteControlCommandListener.getInstance(), s); +- return RemoteControlCommandListener.getInstance().j(); ++ result.append(plugins[i].getDescription().getName()); ++ result.append(" "); ++ result.append(plugins[i].getDescription().getVersion().replaceAll(";", ",")); ++ } ++ } ++ ++ return result.toString(); ++ // CraftBukkit end ++ } ++ ++ // CraftBukkit start - fire RemoteServerCommandEvent ++ public String executeRemoteCommand(final String s) { ++ Waitable<String> waitable = new Waitable<String>() { ++ @Override ++ protected String evaluate() { ++ RemoteControlCommandListener.getInstance().i(); ++ // Event changes start ++ RemoteServerCommandEvent event = new RemoteServerCommandEvent(remoteConsole, s); ++ server.getPluginManager().callEvent(event); ++ // Event change end ++ ServerCommand serverCommand = new ServerCommand(event.getCommand(), RemoteControlCommandListener.getInstance()); ++ server.dispatchServerCommand(remoteConsole, serverCommand); ++ // this.p.a(RemoteControlCommandListener.getInstance(), s); ++ return RemoteControlCommandListener.getInstance().j(); ++ } ++ }; ++ processQueue.add(waitable); ++ try { ++ return waitable.get(); ++ } catch (java.util.concurrent.ExecutionException e) { ++ throw new RuntimeException("Exception processing rcon command " + s, e.getCause()); ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); // Maintain interrupted state ++ throw new RuntimeException("Interrupted processing rcon command " + s, e); ++ } ++ // CraftBukkit end + } + + public boolean isDebugging() { +- return false; ++ return this.getPropertyManager().getBoolean("debug", false); // CraftBukkit - don't hardcode + } + + public void h(String s) { +@@ -721,7 +977,7 @@ + } + + public String getServerModName() { +- return "vanilla"; ++ return server.getName(); // CraftBukkit - cb > vanilla! + } + + public CrashReport b(CrashReport crashreport) { +@@ -734,6 +990,7 @@ + } + + public List tabCompleteCommand(ICommandListener icommandlistener, String s, BlockPosition blockposition) { ++ /* CraftBukkit start - Allow tab-completion of Bukkit commands + ArrayList arraylist = Lists.newArrayList(); + + if (s.startsWith("/")) { +@@ -772,6 +1029,9 @@ + + return arraylist; + } ++ */ ++ return server.tabComplete(icommandlistener, s); ++ // CraftBukkit end + } + + public static MinecraftServer getServer() { +@@ -835,8 +1095,10 @@ + } + + public void a(EnumDifficulty enumdifficulty) { +- for (int i = 0; i < this.worldServer.length; ++i) { +- WorldServer worldserver = this.worldServer[i]; ++ // CraftBukkit start ++ for (int i = 0; i < this.worlds.size(); ++i) { ++ WorldServer worldserver = this.worlds.get(i); ++ // CraftBukkit end + + if (worldserver != null) { + if (worldserver.getWorldData().isHardcore()) { +@@ -878,15 +1140,17 @@ + this.N = true; + this.getConvertable().d(); + +- for (int i = 0; i < this.worldServer.length; ++i) { +- WorldServer worldserver = this.worldServer[i]; ++ // CraftBukkit start ++ for (int i = 0; i < this.worlds.size(); ++i) { ++ WorldServer worldserver = this.worlds.get(i); ++ // CraftBukkit end + + if (worldserver != null) { + worldserver.saveLevel(); + } + } + +- this.getConvertable().e(this.worldServer[0].getDataManager().g()); ++ this.getConvertable().e(this.worlds.get(0).getDataManager().g()); // CraftBukkit + this.safeShutdown(); + } + +@@ -919,9 +1183,11 @@ + int i = 0; + + if (this.worldServer != null) { +- for (int j = 0; j < this.worldServer.length; ++j) { +- if (this.worldServer[j] != null) { +- WorldServer worldserver = this.worldServer[j]; ++ // CraftBukkit start ++ for (int j = 0; j < this.worlds.size(); ++j) { ++ WorldServer worldserver = this.worlds.get(j); ++ if (worldserver != null) { ++ // CraftBukkit end + WorldData worlddata = worldserver.getWorldData(); + + mojangstatisticsgenerator.a("world[" + i + "][dimension]", Integer.valueOf(worldserver.worldProvider.getDimension())); +@@ -954,7 +1220,7 @@ + public abstract boolean ad(); + + public boolean getOnlineMode() { +- return this.onlineMode; ++ return server.getOnlineMode(); // CraftBukkit + } + + public void setOnlineMode(boolean flag) { +@@ -1024,8 +1290,10 @@ + } + + public void setGamemode(EnumGamemode enumgamemode) { +- for (int i = 0; i < this.worldServer.length; ++i) { +- getServer().worldServer[i].getWorldData().setGameType(enumgamemode); ++ // CraftBukkit start ++ for (int i = 0; i < this.worlds.size(); ++i) { ++ getServer().worlds.get(i).getWorldData().setGameType(enumgamemode); ++ // CraftBukkit end + } + + } +@@ -1057,7 +1325,7 @@ + } + + public World getWorld() { +- return this.worldServer[0]; ++ return this.worlds.get(0); // CraftBukkit + } + + public Entity f() { +@@ -1125,11 +1393,10 @@ + } + + public Entity a(UUID uuid) { +- WorldServer[] aworldserver = this.worldServer; +- int i = aworldserver.length; +- +- for (int j = 0; j < i; ++j) { +- WorldServer worldserver = aworldserver[j]; ++ // CraftBukkit start ++ for (int j = 0; j < worlds.size(); ++j) { ++ WorldServer worldserver = worlds.get(j); ++ // CraftBukkit end + + if (worldserver != null) { + Entity entity = worldserver.getEntity(uuid); +@@ -1144,7 +1411,7 @@ + } + + public boolean getSendCommandFeedback() { +- return getServer().worldServer[0].getGameRules().getBoolean("sendCommandFeedback"); ++ return getServer().worlds.get(0).getGameRules().getBoolean("sendCommandFeedback"); // CraftBukkit + } + + public void a(EnumCommandResult enumcommandresult, int i) {} diff --git a/nms-patches/MobEffectList.patch b/nms-patches/MobEffectList.patch new file mode 100644 index 00000000..33ebcae2 --- /dev/null +++ b/nms-patches/MobEffectList.patch @@ -0,0 +1,74 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MobEffectList.java 2014-11-27 08:59:46.801421406 +1100 ++++ src/main/java/net/minecraft/server/MobEffectList.java 2014-11-27 08:42:10.120850973 +1100 +@@ -6,6 +6,11 @@ + import java.util.UUID; + import java.util.Map.Entry; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; ++// CraftBukkit end ++ + public class MobEffectList { + + public static final MobEffectList[] byId = new MobEffectList[32]; +@@ -63,6 +68,8 @@ + } + + this.L = j; ++ org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType(this)); // CraftBukkit ++ + } + + public static MobEffectList b(String s) { +@@ -94,11 +101,11 @@ + public void tick(EntityLiving entityliving, int i) { + if (this.id == MobEffectList.REGENERATION.id) { + if (entityliving.getHealth() < entityliving.getMaxHealth()) { +- entityliving.heal(1.0F); ++ entityliving.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit + } + } else if (this.id == MobEffectList.POISON.id) { + if (entityliving.getHealth() > 1.0F) { +- entityliving.damageEntity(DamageSource.MAGIC, 1.0F); ++ entityliving.damageEntity(CraftEventFactory.POISON, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON + } + } else if (this.id == MobEffectList.WITHER.id) { + entityliving.damageEntity(DamageSource.WITHER, 1.0F); +@@ -106,14 +113,25 @@ + ((EntityHuman) entityliving).applyExhaustion(0.025F * (float) (i + 1)); + } else if (this.id == MobEffectList.SATURATION.id && entityliving instanceof EntityHuman) { + if (!entityliving.world.isStatic) { +- ((EntityHuman) entityliving).getFoodData().eat(i + 1, 1.0F); ++ // CraftBukkit start ++ EntityHuman entityhuman = (EntityHuman) entityliving; ++ int oldFoodLevel = entityhuman.getFoodData().foodLevel; ++ ++ org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); ++ ++ if (!event.isCancelled()) { ++ entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); ++ } ++ ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); ++ // CraftBukkit end + } + } else if ((this.id != MobEffectList.HEAL.id || entityliving.bl()) && (this.id != MobEffectList.HARM.id || !entityliving.bl())) { + if (this.id == MobEffectList.HARM.id && !entityliving.bl() || this.id == MobEffectList.HEAL.id && entityliving.bl()) { + entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i)); + } + } else { +- entityliving.heal((float) Math.max(4 << i, 0)); ++ entityliving.heal((float) Math.max(4 << i, 0), RegainReason.MAGIC); // CraftBukkit + } + + } +@@ -132,7 +150,7 @@ + } + } else { + j = (int) (d0 * (double) (4 << i) + 0.5D); +- entityliving.heal((float) j); ++ entityliving.heal((float) j, RegainReason.MAGIC); // CraftBukkit + } + + } diff --git a/nms-patches/MobSpawnerAbstract.patch b/nms-patches/MobSpawnerAbstract.patch new file mode 100644 index 00000000..1a936183 --- /dev/null +++ b/nms-patches/MobSpawnerAbstract.patch @@ -0,0 +1,38 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/MobSpawnerAbstract.java 2014-11-27 08:59:46.805421389 +1100 ++++ src/main/java/net/minecraft/server/MobSpawnerAbstract.java 2014-11-27 08:42:10.108850996 +1100 +@@ -4,6 +4,8 @@ + import java.util.Iterator; + import java.util.List; + ++import org.bukkit.event.entity.CreatureSpawnEvent; // CraftBukkit ++ + public abstract class MobSpawnerAbstract { + + public int spawnDelay = 20; +@@ -129,7 +131,7 @@ + + entity.f(nbttagcompound); + if (entity.world != null && flag) { +- entity.world.addEntity(entity); ++ entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit + } + + NBTTagCompound nbttagcompound1; +@@ -154,7 +156,7 @@ + entity2.f(nbttagcompound2); + entity2.setPositionRotation(entity1.locX, entity1.locY, entity1.locZ, entity1.yaw, entity1.pitch); + if (entity.world != null && flag) { +- entity.world.addEntity(entity2); ++ entity.world.addEntity(entity2, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit + } + + entity1.mount(entity2); +@@ -164,7 +166,7 @@ + } + } else if (entity instanceof EntityLiving && entity.world != null && flag) { + ((EntityInsentient) entity).prepare(entity.world.E(new BlockPosition(entity)), (GroupDataEntity) null); +- entity.world.addEntity(entity); ++ entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit + } + + return entity; diff --git a/nms-patches/NameReferencingFileConverter.patch b/nms-patches/NameReferencingFileConverter.patch new file mode 100644 index 00000000..621762db --- /dev/null +++ b/nms-patches/NameReferencingFileConverter.patch @@ -0,0 +1,76 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/NameReferencingFileConverter.java 2014-11-27 08:59:46.805421389 +1100 ++++ src/main/java/net/minecraft/server/NameReferencingFileConverter.java 2014-11-27 08:42:10.168850880 +1100 +@@ -32,7 +32,7 @@ + public static final File c = new File("ops.txt"); + public static final File d = new File("white-list.txt"); + +- static List a(File file, Map map) { ++ static List a(File file, Map map) throws IOException { // CraftBukkit - Added throws + List list = Files.readLines(file, Charsets.UTF_8); + Iterator iterator = list.iterator(); + +@@ -77,9 +77,11 @@ + if (gameprofilebanlist.c().exists()) { + try { + gameprofilebanlist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + gameprofilebanlist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + gameprofilebanlist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -111,9 +113,11 @@ + if (ipbanlist.c().exists()) { + try { + ipbanlist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + ipbanlist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + ipbanlist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -152,9 +156,11 @@ + if (oplist.c().exists()) { + try { + oplist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + oplist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + oplist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -184,9 +190,11 @@ + if (whitelist.c().exists()) { + try { + whitelist.load(); +- } catch (FileNotFoundException filenotfoundexception) { +- NameReferencingFileConverter.e.warn("Could not load existing file " + whitelist.c().getName(), filenotfoundexception); ++ // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace ++ } catch (IOException filenotfoundexception) { ++ e.warn("Could not load existing file " + whitelist.c().getName() + ", " + filenotfoundexception.getMessage()); + } ++ // CraftBukkit end + } + + try { +@@ -351,7 +359,7 @@ + + private static File d(PropertyManager propertymanager) { + String s = propertymanager.getString("level-name", "world"); +- File file = new File(s); ++ File file = new File(MinecraftServer.getServer().server.getWorldContainer(), s); // CraftBukkit - Respect container setting + + return new File(file, "players"); + } diff --git a/nms-patches/NetworkManager.patch b/nms-patches/NetworkManager.patch new file mode 100644 index 00000000..99a6dc91 --- /dev/null +++ b/nms-patches/NetworkManager.patch @@ -0,0 +1,20 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/NetworkManager.java 2014-11-27 08:59:46.809421371 +1100 ++++ src/main/java/net/minecraft/server/NetworkManager.java 2014-11-27 08:42:10.120850973 +1100 +@@ -41,7 +41,7 @@ + this.g = enumprotocoldirection; + } + +- public void channelActive(ChannelHandlerContext channelhandlercontext) { ++ public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception { // CraftBukkit - added throws + super.channelActive(channelhandlercontext); + this.i = channelhandlercontext.channel(); + this.j = this.i.remoteAddress(); +@@ -159,7 +159,7 @@ + + public void close(IChatBaseComponent ichatbasecomponent) { + if (this.i.isOpen()) { +- this.i.close().awaitUninterruptibly(); ++ this.i.close(); // We can't wait as this may be called from an event loop. + this.l = ichatbasecomponent; + } + diff --git a/nms-patches/Packet.patch b/nms-patches/Packet.patch new file mode 100644 index 00000000..29864db4 --- /dev/null +++ b/nms-patches/Packet.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Packet.java 2014-11-27 08:59:46.813421353 +1100 ++++ src/main/java/net/minecraft/server/Packet.java 2014-11-27 08:42:10.152850911 +1100 +@@ -2,9 +2,9 @@ + + public interface Packet { + +- void a(PacketDataSerializer packetdataserializer); ++ void a(PacketDataSerializer packetdataserializer) throws java.io.IOException; // CraftBukkit - added throws + +- void b(PacketDataSerializer packetdataserializer); ++ void b(PacketDataSerializer packetdataserializer) throws java.io.IOException; // CraftBukkit - added throws + + void a(PacketListener packetlistener); + } diff --git a/nms-patches/PacketDataSerializer.patch b/nms-patches/PacketDataSerializer.patch new file mode 100644 index 00000000..20a1268c --- /dev/null +++ b/nms-patches/PacketDataSerializer.patch @@ -0,0 +1,122 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketDataSerializer.java 2014-11-27 08:59:46.809421371 +1100 ++++ src/main/java/net/minecraft/server/PacketDataSerializer.java 2014-11-27 08:42:10.108850996 +1100 +@@ -8,7 +8,6 @@ + import io.netty.buffer.ByteBufProcessor; + import io.netty.handler.codec.DecoderException; + import io.netty.handler.codec.EncoderException; +-import io.netty.util.ReferenceCounted; + import java.io.DataInput; + import java.io.DataOutput; + import java.io.IOException; +@@ -21,6 +20,8 @@ + import java.nio.charset.Charset; + import java.util.UUID; + ++import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit ++ + public class PacketDataSerializer extends ByteBuf { + + private final ByteBuf a; +@@ -142,7 +143,7 @@ + } else { + try { + NBTCompressedStreamTools.a(nbttagcompound, (DataOutput) (new ByteBufOutputStream(this))); +- } catch (IOException ioexception) { ++ } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception + throw new EncoderException(ioexception); + } + } +@@ -162,7 +163,7 @@ + } + + public void a(ItemStack itemstack) { +- if (itemstack == null) { ++ if (itemstack == null || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() + this.writeShort(-1); + } else { + this.writeShort(Item.getId(itemstack.getItem())); +@@ -189,6 +190,11 @@ + + itemstack = new ItemStack(Item.getById(short0), b0, short1); + itemstack.setTag(this.h()); ++ // CraftBukkit start ++ if (itemstack.getTag() != null) { ++ CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); ++ } ++ // CraftBukkit end + } + + return itemstack; +@@ -416,11 +422,11 @@ + return this.a.getBytes(i, bytebuffer); + } + +- public ByteBuf getBytes(int i, OutputStream outputstream, int j) { ++ public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.getBytes(i, outputstream, j); + } + +- public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) { ++ public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.getBytes(i, gatheringbytechannel, j); + } + +@@ -484,11 +490,11 @@ + return this.a.setBytes(i, bytebuffer); + } + +- public int setBytes(int i, InputStream inputstream, int j) { ++ public int setBytes(int i, InputStream inputstream, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.setBytes(i, inputstream, j); + } + +- public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) { ++ public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException + return this.a.setBytes(i, scatteringbytechannel, j); + } + +@@ -580,11 +586,11 @@ + return this.a.readBytes(bytebuffer); + } + +- public ByteBuf readBytes(OutputStream outputstream, int i) { ++ public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.readBytes(outputstream, i); + } + +- public int readBytes(GatheringByteChannel gatheringbytechannel, int i) { ++ public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.readBytes(gatheringbytechannel, i); + } + +@@ -652,11 +658,11 @@ + return this.a.writeBytes(bytebuffer); + } + +- public int writeBytes(InputStream inputstream, int i) { ++ public int writeBytes(InputStream inputstream, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.writeBytes(inputstream, i); + } + +- public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) { ++ public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException + return this.a.writeBytes(scatteringbytechannel, i); + } + +@@ -803,16 +809,4 @@ + public boolean release(int i) { + return this.a.release(i); + } +- +- public ReferenceCounted retain(int i) { +- return this.retain(i); +- } +- +- public ReferenceCounted retain() { +- return this.retain(); +- } +- +- public int compareTo(Object object) { +- return this.compareTo((ByteBuf) object); +- } + } diff --git a/nms-patches/PacketPlayInBlockPlace.patch b/nms-patches/PacketPlayInBlockPlace.patch new file mode 100644 index 00000000..d986bc09 --- /dev/null +++ b/nms-patches/PacketPlayInBlockPlace.patch @@ -0,0 +1,32 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketPlayInBlockPlace.java 2014-11-27 08:59:46.813421353 +1100 ++++ src/main/java/net/minecraft/server/PacketPlayInBlockPlace.java 2014-11-27 08:42:10.152850911 +1100 +@@ -9,6 +9,8 @@ + private float e; + private float f; + private float g; ++ ++ public long timestamp; // CraftBukkit + + public PacketPlayInBlockPlace() {} + +@@ -26,6 +28,7 @@ + } + + public void a(PacketDataSerializer packetdataserializer) { ++ timestamp = System.currentTimeMillis(); // CraftBukkit + this.b = packetdataserializer.c(); + this.c = packetdataserializer.readUnsignedByte(); + this.d = packetdataserializer.i(); +@@ -71,7 +74,10 @@ + return this.g; + } + +- public void a(PacketListener packetlistener) { +- this.a((PacketListenerPlayIn) packetlistener); ++ // CraftBukkit start - fix decompile error ++ @Override ++ public void a(PacketListener pl) { ++ a((PacketListenerPlayIn)pl); + } ++ // CraftBukkit end + } diff --git a/nms-patches/PacketPlayInCloseWindow.patch b/nms-patches/PacketPlayInCloseWindow.patch new file mode 100644 index 00000000..14efaf9c --- /dev/null +++ b/nms-patches/PacketPlayInCloseWindow.patch @@ -0,0 +1,29 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketPlayInCloseWindow.java 2014-11-27 08:59:46.817421336 +1100 ++++ src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java 2014-11-27 08:42:10.168850880 +1100 +@@ -6,6 +6,17 @@ + + public PacketPlayInCloseWindow() {} + ++ // CraftBukkit start ++ @Override ++ public void a(PacketListener pl) { ++ a((PacketListenerPlayIn) pl); ++ } ++ ++ public PacketPlayInCloseWindow(int id) { ++ this.id = id; ++ } ++ // CraftBukkit end ++ + public void a(PacketListenerPlayIn packetlistenerplayin) { + packetlistenerplayin.a(this); + } +@@ -17,8 +28,4 @@ + public void b(PacketDataSerializer packetdataserializer) { + packetdataserializer.writeByte(this.id); + } +- +- public void a(PacketListener packetlistener) { +- this.a((PacketListenerPlayIn) packetlistener); +- } + } diff --git a/nms-patches/PacketStatusListener.patch b/nms-patches/PacketStatusListener.patch new file mode 100644 index 00000000..b7aad224 --- /dev/null +++ b/nms-patches/PacketStatusListener.patch @@ -0,0 +1,113 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PacketStatusListener.java 2014-11-27 08:59:46.817421336 +1100 ++++ src/main/java/net/minecraft/server/PacketStatusListener.java 2014-11-27 08:42:10.168850880 +1100 +@@ -1,5 +1,15 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import com.mojang.authlib.GameProfile; ++import java.net.InetSocketAddress; ++import java.util.Iterator; ++ ++import org.bukkit.craftbukkit.util.CraftIconCache; ++import org.bukkit.entity.Player; ++ ++// CraftBukkit end ++ + public class PacketStatusListener implements PacketStatusInListener { + + private final MinecraftServer minecraftServer; +@@ -13,7 +23,93 @@ + public void a(IChatBaseComponent ichatbasecomponent) {} + + public void a(PacketStatusInStart packetstatusinstart) { +- this.networkManager.handle(new PacketStatusOutServerInfo(this.minecraftServer.aE())); ++ // this.networkManager.handle(new PacketStatusOutServerInfo(this.minecraftServer.aE())); ++ // CraftBukkit start - fire ping event ++ final Object[] players = minecraftServer.getPlayerList().players.toArray(); ++ class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent { ++ CraftIconCache icon = minecraftServer.server.getServerIcon(); ++ ++ ServerListPingEvent() { ++ super(((InetSocketAddress) networkManager.getSocketAddress()).getAddress(), minecraftServer.getMotd(), minecraftServer.getPlayerList().getMaxPlayers()); ++ } ++ ++ @Override ++ public void setServerIcon(org.bukkit.util.CachedServerIcon icon) { ++ if (!(icon instanceof CraftIconCache)) { ++ throw new IllegalArgumentException(icon + " was not created by " + org.bukkit.craftbukkit.CraftServer.class); ++ } ++ this.icon = (CraftIconCache) icon; ++ } ++ ++ @Override ++ public Iterator<Player> iterator() throws UnsupportedOperationException { ++ return new Iterator<Player>() { ++ int i; ++ int ret = Integer.MIN_VALUE; ++ EntityPlayer player; ++ ++ @Override ++ public boolean hasNext() { ++ if (player != null) { ++ return true; ++ } ++ final Object[] currentPlayers = players; ++ for (int length = currentPlayers.length, i = this.i; i < length; i++) { ++ final EntityPlayer player = (EntityPlayer) currentPlayers[i]; ++ if (player != null) { ++ this.i = i + 1; ++ this.player = player; ++ return true; ++ } ++ } ++ return false; ++ } ++ ++ @Override ++ public Player next() { ++ if (!hasNext()) { ++ throw new java.util.NoSuchElementException(); ++ } ++ final EntityPlayer player = this.player; ++ this.player = null; ++ this.ret = this.i - 1; ++ return player.getBukkitEntity(); ++ } ++ ++ @Override ++ public void remove() { ++ final Object[] currentPlayers = players; ++ final int i = this.ret; ++ if (i < 0 || currentPlayers[i] == null) { ++ throw new IllegalStateException(); ++ } ++ currentPlayers[i] = null; ++ } ++ }; ++ } ++ } ++ ++ ServerListPingEvent event = new ServerListPingEvent(); ++ this.minecraftServer.server.getPluginManager().callEvent(event); ++ ++ java.util.List<GameProfile> profiles = new java.util.ArrayList<GameProfile>(players.length); ++ for (Object player : players) { ++ if (player != null) { ++ profiles.add(((EntityPlayer) player).getProfile()); ++ } ++ } ++ ++ ServerPingPlayerSample playerSample = new ServerPingPlayerSample(event.getMaxPlayers(), profiles.size()); ++ playerSample.a(profiles.toArray(new GameProfile[profiles.size()])); ++ ++ ServerPing ping = new ServerPing(); ++ ping.setFavicon(event.icon.value); ++ ping.setMOTD(new ChatComponentText(event.getMotd())); ++ ping.setPlayerSample(playerSample); ++ ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 47)); // TODO: Update when protocol changes ++ ++ this.networkManager.handle(new PacketStatusOutServerInfo(ping)); ++ // CraftBukkit end + } + + public void a(PacketStatusInPing packetstatusinping) { diff --git a/nms-patches/Path.patch b/nms-patches/Path.patch new file mode 100644 index 00000000..39db7a87 --- /dev/null +++ b/nms-patches/Path.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Path.java 2014-11-27 08:59:46.849421195 +1100 ++++ src/main/java/net/minecraft/server/Path.java 2014-11-27 08:42:10.088851036 +1100 +@@ -2,7 +2,7 @@ + + public class Path { + +- private PathPoint[] a = new PathPoint[1024]; ++ private PathPoint[] a = new PathPoint[128]; // CraftBukkit - reduce default size + private int b; + + public Path() {} diff --git a/nms-patches/PathfinderGoalBreakDoor.patch b/nms-patches/PathfinderGoalBreakDoor.patch new file mode 100644 index 00000000..c690fcf5 --- /dev/null +++ b/nms-patches/PathfinderGoalBreakDoor.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalBreakDoor.java 2014-11-27 08:59:46.817421336 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java 2014-11-27 08:42:10.152850911 +1100 +@@ -63,6 +63,12 @@ + } + + if (this.g == 240 && this.a.world.getDifficulty() == EnumDifficulty.HARD) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.a, this.b.getX(), this.b.getY(), this.b.getZ()).isCancelled()) { ++ this.c(); ++ return; ++ } ++ // CraftBukkit end + this.a.world.setAir(this.b); + this.a.world.triggerEffect(1012, this.b, 0); + this.a.world.triggerEffect(2001, this.b, Block.getId(this.c)); diff --git a/nms-patches/PathfinderGoalBreed.patch b/nms-patches/PathfinderGoalBreed.patch new file mode 100644 index 00000000..50c07973 --- /dev/null +++ b/nms-patches/PathfinderGoalBreed.patch @@ -0,0 +1,23 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalBreed.java 2014-11-27 08:59:46.821421318 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalBreed.java 2014-11-27 08:42:10.164850887 +1100 +@@ -70,6 +70,11 @@ + EntityAgeable entityageable = this.d.createChild(this.e); + + if (entityageable != null) { ++ // CraftBukkit start - set persistence for tame animals ++ if (entityageable instanceof EntityTameableAnimal && ((EntityTameableAnimal) entityageable).isTamed()) { ++ entityageable.persistent = true; ++ } ++ // CraftBukkit end + EntityHuman entityhuman = this.d.co(); + + if (entityhuman == null && this.e.co() != null) { +@@ -89,7 +94,7 @@ + this.e.cq(); + entityageable.setAgeRaw(-24000); + entityageable.setPositionRotation(this.d.locX, this.d.locY, this.d.locZ, 0.0F, 0.0F); +- this.a.addEntity(entityageable); ++ this.a.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason + Random random = this.d.bb(); + + for (int i = 0; i < 7; ++i) { diff --git a/nms-patches/PathfinderGoalDefendVillage.patch b/nms-patches/PathfinderGoalDefendVillage.patch new file mode 100644 index 00000000..2f2260c3 --- /dev/null +++ b/nms-patches/PathfinderGoalDefendVillage.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalDefendVillage.java 2014-11-27 08:59:46.821421318 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalDefendVillage.java 2014-11-27 08:42:10.172850872 +1100 +@@ -32,7 +32,7 @@ + } + + public void c() { +- this.a.setGoalTarget(this.b); ++ this.a.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.DEFEND_VILLAGE, true); // CraftBukkit - reason + super.c(); + } + } diff --git a/nms-patches/PathfinderGoalEatTile.patch b/nms-patches/PathfinderGoalEatTile.patch new file mode 100644 index 00000000..88f1cd79 --- /dev/null +++ b/nms-patches/PathfinderGoalEatTile.patch @@ -0,0 +1,34 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalEatTile.java 2014-11-27 08:59:46.821421318 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalEatTile.java 2014-11-27 08:42:10.108850996 +1100 +@@ -3,6 +3,11 @@ + import com.google.common.base.Predicate; + import com.google.common.base.Predicates; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.Material; ++// CraftBukkit end ++ + public class PathfinderGoalEatTile extends PathfinderGoal { + + private static final Predicate b = BlockStatePredicate.a((Block) Blocks.TALLGRASS).a(BlockLongGrass.TYPE, Predicates.equalTo(EnumTallGrassType.GRASS)); +@@ -50,7 +55,8 @@ + BlockPosition blockposition = new BlockPosition(this.c.locX, this.c.locY, this.c.locZ); + + if (PathfinderGoalEatTile.b.apply(this.d.getType(blockposition))) { +- if (this.d.getGameRules().getBoolean("mobGriefing")) { ++ // CraftBukkit ++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.c, this.c.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), Material.AIR, !this.d.getGameRules().getBoolean("mobGriefing")).isCancelled()) { + this.d.setAir(blockposition, false); + } + +@@ -59,7 +65,8 @@ + BlockPosition blockposition1 = blockposition.down(); + + if (this.d.getType(blockposition1).getBlock() == Blocks.GRASS) { +- if (this.d.getGameRules().getBoolean("mobGriefing")) { ++ // CraftBukkit ++ if (!CraftEventFactory.callEntityChangeBlockEvent(this.c, this.c.world.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()), Material.DIRT, !this.d.getGameRules().getBoolean("mobGriefing")).isCancelled()) { + this.d.triggerEffect(2001, blockposition1, Block.getId(Blocks.GRASS)); + this.d.setTypeAndData(blockposition1, Blocks.DIRT.getBlockData(), 2); + } diff --git a/nms-patches/PathfinderGoalEndermanPickupBlock.patch b/nms-patches/PathfinderGoalEndermanPickupBlock.patch new file mode 100644 index 00000000..31b450c1 --- /dev/null +++ b/nms-patches/PathfinderGoalEndermanPickupBlock.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalEndermanPickupBlock.java 2014-11-27 08:59:46.825421301 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalEndermanPickupBlock.java 2014-11-27 08:42:10.164850887 +1100 +@@ -25,8 +25,12 @@ + Block block = iblockdata.getBlock(); + + if (EntityEnderman.co().contains(block)) { +- this.enderman.setCarried(iblockdata); +- world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData()); ++ // CraftBukkit start - Pickup event ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.enderman, this.enderman.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), org.bukkit.Material.AIR).isCancelled()) { ++ this.enderman.setCarried(iblockdata); ++ world.setTypeUpdate(blockposition, Blocks.AIR.getBlockData()); ++ } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/PathfinderGoalEndermanPlaceBlock.patch b/nms-patches/PathfinderGoalEndermanPlaceBlock.patch new file mode 100644 index 00000000..e858f052 --- /dev/null +++ b/nms-patches/PathfinderGoalEndermanPlaceBlock.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalEndermanPlaceBlock.java 2014-11-27 08:59:46.825421301 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalEndermanPlaceBlock.java 2014-11-27 08:42:10.172850872 +1100 +@@ -25,8 +25,12 @@ + Block block1 = world.getType(blockposition.down()).getBlock(); + + if (this.a(world, blockposition, this.a.getCarried().getBlock(), block, block1)) { ++ // CraftBukkit start - Place event ++ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.a, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.a.getCarried().getBlock(), this.a.getCarried().getBlock().toLegacyData(this.a.getCarried())).isCancelled()) { + world.setTypeAndData(blockposition, this.a.getCarried(), 3); + this.a.setCarried(Blocks.AIR.getBlockData()); ++ } ++ // CraftBukkit end + } + + } diff --git a/nms-patches/PathfinderGoalGhastAttackTarget.patch b/nms-patches/PathfinderGoalGhastAttackTarget.patch new file mode 100644 index 00000000..adc48e2b --- /dev/null +++ b/nms-patches/PathfinderGoalGhastAttackTarget.patch @@ -0,0 +1,12 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalGhastAttackTarget.java 2014-11-27 08:59:46.829421283 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalGhastAttackTarget.java 2014-11-27 08:42:10.152850911 +1100 +@@ -43,7 +43,8 @@ + world.a((EntityHuman) null, 1008, new BlockPosition(this.b), 0); + EntityLargeFireball entitylargefireball = new EntityLargeFireball(world, this.b, d2, d3, d4); + +- entitylargefireball.yield = this.b.cd(); ++ // CraftBukkit - set bukkitYield when setting explosionpower ++ entitylargefireball.bukkitYield = entitylargefireball.yield = this.b.cd(); + entitylargefireball.locX = this.b.locX + vec3d.a * d1; + entitylargefireball.locY = this.b.locY + (double) (this.b.length / 2.0F) + 0.5D; + entitylargefireball.locZ = this.b.locZ + vec3d.c * d1; diff --git a/nms-patches/PathfinderGoalHurtByTarget.patch b/nms-patches/PathfinderGoalHurtByTarget.patch new file mode 100644 index 00000000..c0763af1 --- /dev/null +++ b/nms-patches/PathfinderGoalHurtByTarget.patch @@ -0,0 +1,19 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalHurtByTarget.java 2014-11-27 08:59:46.829421283 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java 2014-11-27 08:42:10.156850903 +1100 +@@ -23,7 +23,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.e.getLastDamager()); ++ this.e.setGoalTarget(this.e.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit - reason + this.b = this.e.bd(); + if (this.a) { + double d0 = this.f(); +@@ -58,6 +58,6 @@ + } + + protected void a(EntityCreature entitycreature, EntityLiving entityliving) { +- entitycreature.setGoalTarget(entityliving); ++ entitycreature.setGoalTarget(entityliving, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY, true); // CraftBukkit - reason + } + } diff --git a/nms-patches/PathfinderGoalMakeLove.patch b/nms-patches/PathfinderGoalMakeLove.patch new file mode 100644 index 00000000..ce58bcfe --- /dev/null +++ b/nms-patches/PathfinderGoalMakeLove.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalMakeLove.java 2014-11-27 08:59:46.829421283 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java 2014-11-27 08:42:10.140850934 +1100 +@@ -87,7 +87,7 @@ + this.b.o(false); + entityvillager.setAgeRaw(-24000); + entityvillager.setPositionRotation(this.b.locX, this.b.locY, this.b.locZ, 0.0F, 0.0F); +- this.d.addEntity(entityvillager); ++ this.d.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason + this.d.broadcastEntityEffect(entityvillager, (byte) 12); + } + } diff --git a/nms-patches/PathfinderGoalNearestAttackableTarget.patch b/nms-patches/PathfinderGoalNearestAttackableTarget.patch new file mode 100644 index 00000000..438278b0 --- /dev/null +++ b/nms-patches/PathfinderGoalNearestAttackableTarget.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java 2014-11-27 08:59:46.833421266 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTarget.java 2014-11-27 08:42:10.168850880 +1100 +@@ -48,7 +48,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.d); ++ this.e.setGoalTarget(this.d, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // Craftbukkit - reason + super.c(); + } + } diff --git a/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch b/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch new file mode 100644 index 00000000..fefd3ad8 --- /dev/null +++ b/nms-patches/PathfinderGoalNearestAttackableTargetInsentient.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java 2014-11-27 08:59:46.833421266 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalNearestAttackableTargetInsentient.java 2014-11-27 08:42:10.084851043 +1100 +@@ -54,7 +54,7 @@ + } + + public void c() { +- this.b.setGoalTarget(this.e); ++ this.b.setGoalTarget(this.e, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_ENTITY, true); // CraftBukkit - reason + super.c(); + } + diff --git a/nms-patches/PathfinderGoalOwnerHurtByTarget.patch b/nms-patches/PathfinderGoalOwnerHurtByTarget.patch new file mode 100644 index 00000000..b8b709f2 --- /dev/null +++ b/nms-patches/PathfinderGoalOwnerHurtByTarget.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalOwnerHurtByTarget.java 2014-11-27 08:59:46.833421266 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalOwnerHurtByTarget.java 2014-11-27 08:42:10.096851020 +1100 +@@ -30,7 +30,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.b); ++ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER, true); // CraftBukkit - reason + EntityLiving entityliving = this.a.getOwner(); + + if (entityliving != null) { diff --git a/nms-patches/PathfinderGoalOwnerHurtTarget.patch b/nms-patches/PathfinderGoalOwnerHurtTarget.patch new file mode 100644 index 00000000..6e0843f1 --- /dev/null +++ b/nms-patches/PathfinderGoalOwnerHurtTarget.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalOwnerHurtTarget.java 2014-11-27 08:59:46.837421248 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalOwnerHurtTarget.java 2014-11-27 08:42:10.144850927 +1100 +@@ -30,7 +30,7 @@ + } + + public void c() { +- this.e.setGoalTarget(this.b); ++ this.e.setGoalTarget(this.b, org.bukkit.event.entity.EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET, true); // CraftBukkit - reason + EntityLiving entityliving = this.a.getOwner(); + + if (entityliving != null) { diff --git a/nms-patches/PathfinderGoalPanic.patch b/nms-patches/PathfinderGoalPanic.patch new file mode 100644 index 00000000..e6b5dc80 --- /dev/null +++ b/nms-patches/PathfinderGoalPanic.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalPanic.java 2014-11-27 08:59:46.837421248 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalPanic.java 2014-11-27 08:42:10.084851043 +1100 +@@ -36,6 +36,12 @@ + } + + public boolean b() { ++ // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly ++ if ((this.b.ticksLived - this.b.bd/*getHurtTimestamp*/()) > 100) { ++ this.b.b((EntityLiving) null); ++ return false; ++ } ++ // CraftBukkit end + return !this.b.getNavigation().m(); + } + } diff --git a/nms-patches/PathfinderGoalSelector.patch b/nms-patches/PathfinderGoalSelector.patch new file mode 100644 index 00000000..e4b9428f --- /dev/null +++ b/nms-patches/PathfinderGoalSelector.patch @@ -0,0 +1,32 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSelector.java 2014-11-27 08:59:46.837421248 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSelector.java 2014-11-27 08:42:10.164850887 +1100 +@@ -6,11 +6,15 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.craftbukkit.util.UnsafeList; // CraftBukkit ++ + public class PathfinderGoalSelector { + + private static final Logger a = LogManager.getLogger(); +- private List b = Lists.newArrayList(); +- private List c = Lists.newArrayList(); ++ // CraftBukkit start - ArrayList -> UnsafeList ++ private List b = new UnsafeList(); ++ private List c = new UnsafeList(); ++ // CraftBukkit end + private final MethodProfiler d; + private int e; + private int f = 3; +@@ -107,9 +111,11 @@ + if (pathfindergoalselectoritem1 != pathfindergoalselectoritem) { + if (pathfindergoalselectoritem.b >= pathfindergoalselectoritem1.b) { + if (!this.a(pathfindergoalselectoritem, pathfindergoalselectoritem1) && this.c.contains(pathfindergoalselectoritem1)) { ++ ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse + return false; + } + } else if (!pathfindergoalselectoritem1.a.i() && this.c.contains(pathfindergoalselectoritem1)) { ++ ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse + return false; + } + } diff --git a/nms-patches/PathfinderGoalSilverfishHideInBlock.patch b/nms-patches/PathfinderGoalSilverfishHideInBlock.patch new file mode 100644 index 00000000..31d6582b --- /dev/null +++ b/nms-patches/PathfinderGoalSilverfishHideInBlock.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSilverfishHideInBlock.java 2014-11-27 08:59:46.841421230 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSilverfishHideInBlock.java 2014-11-27 08:42:10.176850864 +1100 +@@ -51,6 +51,11 @@ + IBlockData iblockdata = world.getType(blockposition); + + if (BlockMonsterEggs.d(iblockdata)) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition.getX(), blockposition.getY(), blockposition.getZ(), Blocks.MONSTER_EGG, Block.getId(BlockMonsterEggs.getById(iblockdata.getBlock().toLegacyData(iblockdata)))).isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + world.setTypeAndData(blockposition, Blocks.MONSTER_EGG.getBlockData().set(BlockMonsterEggs.VARIANT, EnumMonsterEggVarient.a(iblockdata)), 3); + this.silverfish.y(); + this.silverfish.die(); diff --git a/nms-patches/PathfinderGoalSilverfishWakeOthers.patch b/nms-patches/PathfinderGoalSilverfishWakeOthers.patch new file mode 100644 index 00000000..f8fb1845 --- /dev/null +++ b/nms-patches/PathfinderGoalSilverfishWakeOthers.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSilverfishWakeOthers.java 2014-11-27 08:59:46.841421230 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSilverfishWakeOthers.java 2014-11-27 08:42:10.144850927 +1100 +@@ -36,6 +36,11 @@ + IBlockData iblockdata = world.getType(blockposition1); + + if (iblockdata.getBlock() == Blocks.MONSTER_EGG) { ++ // CraftBukkit start ++ if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityChangeBlockEvent(this.silverfish, blockposition1.getX(), blockposition1.getY(), blockposition1.getZ(), Blocks.AIR, 0).isCancelled()) { ++ continue; ++ } ++ // CraftBukkit end + if (world.getGameRules().getBoolean("mobGriefing")) { + world.setAir(blockposition1, true); + } else { diff --git a/nms-patches/PathfinderGoalSit.patch b/nms-patches/PathfinderGoalSit.patch new file mode 100644 index 00000000..f7333321 --- /dev/null +++ b/nms-patches/PathfinderGoalSit.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalSit.java 2014-11-27 08:59:46.845421213 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalSit.java 2014-11-27 08:42:10.096851020 +1100 +@@ -12,7 +12,7 @@ + + public boolean a() { + if (!this.entity.isTamed()) { +- return false; ++ return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals + } else if (this.entity.V()) { + return false; + } else if (!this.entity.onGround) { diff --git a/nms-patches/PathfinderGoalTame.patch b/nms-patches/PathfinderGoalTame.patch new file mode 100644 index 00000000..94aa0e1b --- /dev/null +++ b/nms-patches/PathfinderGoalTame.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalTame.java 2014-11-27 08:59:46.845421213 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalTame.java 2014-11-27 08:42:10.152850911 +1100 +@@ -45,7 +45,8 @@ + int i = this.entity.getTemper(); + int j = this.entity.getMaxDomestication(); + +- if (j > 0 && this.entity.bb().nextInt(j) < i) { ++ // CraftBukkit - fire EntityTameEvent ++ if (j > 0 && this.entity.bb().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, (EntityHuman) this.entity.passenger).isCancelled() && this.entity.passenger instanceof EntityHuman) { + this.entity.h((EntityHuman) this.entity.passenger); + this.entity.world.broadcastEntityEffect(this.entity, (byte) 7); + return; +@@ -54,8 +55,16 @@ + this.entity.u(5); + } + +- this.entity.passenger.mount((Entity) null); +- this.entity.passenger = null; ++ // CraftBukkit start - Handle dismounting to account for VehicleExitEvent being fired. ++ if (this.entity.passenger != null) { ++ this.entity.passenger.mount((Entity) null); ++ // If the entity still has a passenger, then a plugin cancelled the event. ++ if (this.entity.passenger != null) { ++ return; ++ } ++ } ++ // this.entity.passenger = null; ++ // CraftBukkit end + this.entity.cU(); + this.entity.world.broadcastEntityEffect(this.entity, (byte) 6); + } diff --git a/nms-patches/PathfinderGoalTargetNearestPlayer.patch b/nms-patches/PathfinderGoalTargetNearestPlayer.patch new file mode 100644 index 00000000..054d1b3c --- /dev/null +++ b/nms-patches/PathfinderGoalTargetNearestPlayer.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java 2014-11-27 08:59:46.845421213 +1100 ++++ src/main/java/net/minecraft/server/PathfinderGoalTargetNearestPlayer.java 2014-11-27 08:42:10.120850973 +1100 +@@ -59,7 +59,7 @@ + } + + public void c() { +- this.b.setGoalTarget(this.e); ++ this.b.setGoalTarget(this.e, org.bukkit.event.entity.EntityTargetEvent.TargetReason.CLOSEST_PLAYER, true); // CraftBukkit - added reason + super.c(); + } + diff --git a/nms-patches/PlayerChunk.patch b/nms-patches/PlayerChunk.patch new file mode 100644 index 00000000..6170f804 --- /dev/null +++ b/nms-patches/PlayerChunk.patch @@ -0,0 +1,104 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerChunk.java 2014-11-27 08:59:46.849421195 +1100 ++++ src/main/java/net/minecraft/server/PlayerChunk.java 2014-11-27 08:42:10.136850942 +1100 +@@ -3,6 +3,11 @@ + import com.google.common.collect.Lists; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; ++import java.util.HashMap; ++// CraftBukkit end ++ + class PlayerChunk { + + private final List b; +@@ -12,16 +17,26 @@ + private int f; + private long g; + final PlayerChunkMap playerChunkMap; ++ ++ // CraftBukkit start - add fields ++ private final HashMap<EntityPlayer, Runnable> players = new HashMap<EntityPlayer, Runnable>(); ++ private boolean loaded = false; ++ private Runnable loadedRunnable = new Runnable() { ++ public void run() { ++ PlayerChunk.this.loaded = true; ++ } ++ }; ++ // CraftBukkit end + + public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) { + this.playerChunkMap = playerchunkmap; + this.b = Lists.newArrayList(); + this.dirtyBlocks = new short[64]; + this.location = new ChunkCoordIntPair(i, j); +- playerchunkmap.a().chunkProviderServer.getChunkAt(i, j); ++ playerchunkmap.a().chunkProviderServer.getChunkAt(i, j, loadedRunnable); // CraftBukkit + } + +- public void a(EntityPlayer entityplayer) { ++ public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument + if (this.b.contains(entityplayer)) { + PlayerChunkMap.c().debug("Failed to add player. {} already is in chunk {}, {}", new Object[] { entityplayer, Integer.valueOf(this.location.x), Integer.valueOf(this.location.z)}); + } else { +@@ -30,18 +45,50 @@ + } + + this.b.add(entityplayer); +- entityplayer.chunkCoordIntPairQueue.add(this.location); ++ // CraftBukkit start - use async chunk io ++ Runnable playerRunnable; ++ if (this.loaded) { ++ playerRunnable = null; ++ entityplayer.chunkCoordIntPairQueue.add(this.location); ++ } else { ++ playerRunnable = new Runnable() { ++ public void run() { ++ entityplayer.chunkCoordIntPairQueue.add(PlayerChunk.this.location); ++ } ++ }; ++ this.playerChunkMap.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, playerRunnable); ++ } ++ ++ this.players.put(entityplayer, playerRunnable); ++ // CraftBukkit end + } + } + + public void b(EntityPlayer entityplayer) { + if (this.b.contains(entityplayer)) { ++ // CraftBukkit start - If we haven't loaded yet don't load the chunk just so we can clean it up ++ if (!this.loaded) { ++ ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.players.get(entityplayer)); ++ this.b.remove(entityplayer); ++ this.players.remove(entityplayer); ++ ++ if (this.b.isEmpty()) { ++ ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.loadedRunnable); ++ long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; ++ PlayerChunkMap.b(this.playerChunkMap).remove(i); ++ PlayerChunkMap.c(this.playerChunkMap).remove(this); ++ } ++ ++ return; ++ } ++ // CraftBukkit end + Chunk chunk = PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z); + + if (chunk.isReady()) { + entityplayer.playerConnection.sendPacket(new PacketPlayOutMapChunk(chunk, true, 0)); + } + ++ this.players.remove(entityplayer); // CraftBukkit + this.b.remove(entityplayer); + entityplayer.chunkCoordIntPairQueue.remove(this.location); + if (this.b.isEmpty()) { +@@ -122,7 +169,7 @@ + if (this.dirtyCount == 64) { + i = this.location.x * 16; + j = this.location.z * 16; +- this.a((Packet) (new PacketPlayOutMapChunk(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z), false, this.f))); ++ this.a((Packet) (new PacketPlayOutMapChunk(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z), (this.f == 0xFFFF), this.f))); // CraftBukkit - send everything (including biome) if all sections flagged + + for (k = 0; k < 16; ++k) { + if ((this.f & 1 << k) != 0) { diff --git a/nms-patches/PlayerChunkMap.patch b/nms-patches/PlayerChunkMap.patch new file mode 100644 index 00000000..48b86df8 --- /dev/null +++ b/nms-patches/PlayerChunkMap.patch @@ -0,0 +1,208 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerChunkMap.java 2014-11-27 08:59:46.849421195 +1100 ++++ src/main/java/net/minecraft/server/PlayerChunkMap.java 2014-11-27 08:42:10.152850911 +1100 +@@ -7,17 +7,24 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.Collections; ++import java.util.Queue; ++import java.util.LinkedList; ++// CraftBukkit end ++ + public class PlayerChunkMap { + + private static final Logger a = LogManager.getLogger(); + private final WorldServer world; + private final List managedPlayers = Lists.newArrayList(); + private final LongHashMap d = new LongHashMap(); +- private final List e = Lists.newArrayList(); +- private final List f = Lists.newArrayList(); ++ private final Queue e = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue ++ private final Queue f = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue + private int g; + private long h; + private final int[][] i = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; ++ private boolean wasNotEmpty; // CraftBukkit - add field + + public PlayerChunkMap(WorldServer worldserver) { + this.world = worldserver; +@@ -35,28 +42,39 @@ + + if (i - this.h > 8000L) { + this.h = i; +- +- for (j = 0; j < this.f.size(); ++j) { +- playerchunk = (PlayerChunk) this.f.get(j); ++ ++ // CraftBukkit start - Use iterator ++ java.util.Iterator iterator = this.f.iterator(); ++ while (iterator.hasNext()) { ++ playerchunk = (PlayerChunk) iterator.next(); + playerchunk.b(); + playerchunk.a(); + } + } else { +- for (j = 0; j < this.e.size(); ++j) { +- playerchunk = (PlayerChunk) this.e.get(j); ++ java.util.Iterator iterator = this.e.iterator(); ++ ++ while (iterator.hasNext()) { ++ playerchunk = (PlayerChunk) iterator.next(); + playerchunk.b(); ++ iterator.remove(); ++ // CraftBukkit end + } + } + +- this.e.clear(); ++ // this.e.clear(); // CraftBukkit - Removals are already covered + if (this.managedPlayers.isEmpty()) { ++ if (!wasNotEmpty) return; // CraftBukkit - Only do unload when we go from non-empty to empty + WorldProvider worldprovider = this.world.worldProvider; + + if (!worldprovider.e()) { + this.world.chunkProviderServer.b(); + } ++ // CraftBukkit start ++ wasNotEmpty = false; ++ } else { ++ wasNotEmpty = true; + } +- ++ // CraftBukkit end + } + + public boolean a(int i, int j) { +@@ -77,6 +95,16 @@ + + return playerchunk; + } ++ ++ // CraftBukkit start - add method ++ public final boolean isChunkInUse(int x, int z) { ++ PlayerChunk pi = a(x, z, false); ++ if (pi != null) { ++ return (PlayerChunk.b(pi).size() > 0); ++ } ++ return false; ++ } ++ // CraftBukkit end + + public void flagDirty(BlockPosition blockposition) { + int i = blockposition.getX() >> 4; +@@ -95,13 +123,22 @@ + + entityplayer.d = entityplayer.locX; + entityplayer.e = entityplayer.locZ; ++ ++ // CraftBukkit start - Load nearby chunks first ++ List<ChunkCoordIntPair> chunkList = new LinkedList<ChunkCoordIntPair>(); + + for (int k = i - this.g; k <= i + this.g; ++k) { + for (int l = j - this.g; l <= j + this.g; ++l) { +- this.a(k, l, true).a(entityplayer); ++ chunkList.add(new ChunkCoordIntPair(k, l)); + } + } +- ++ ++ Collections.sort(chunkList, new ChunkCoordComparator(entityplayer)); ++ for (ChunkCoordIntPair pair : chunkList) { ++ this.a(pair.x, pair.z, true).a(entityplayer); ++ } ++ // CraftBukkit end ++ + this.managedPlayers.add(entityplayer); + this.b(entityplayer); + } +@@ -188,12 +225,13 @@ + int i1 = this.g; + int j1 = i - k; + int k1 = j - l; ++ List<ChunkCoordIntPair> chunksToLoad = new LinkedList<ChunkCoordIntPair>(); // CraftBukkit + + if (j1 != 0 || k1 != 0) { + for (int l1 = i - i1; l1 <= i + i1; ++l1) { + for (int i2 = j - i1; i2 <= j + i1; ++i2) { + if (!this.a(l1, i2, k, l, i1)) { +- this.a(l1, i2, true).a(entityplayer); ++ chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit + } + + if (!this.a(l1 - j1, i2 - k1, i, j, i1)) { +@@ -209,6 +247,17 @@ + this.b(entityplayer); + entityplayer.d = entityplayer.locX; + entityplayer.e = entityplayer.locZ; ++ ++ // CraftBukkit start - send nearest chunks first ++ Collections.sort(chunksToLoad, new ChunkCoordComparator(entityplayer)); ++ for (ChunkCoordIntPair pair : chunksToLoad) { ++ this.a(pair.x, pair.z, true).a(entityplayer); ++ } ++ ++ if (j1 > 1 || j1 < -1 || k1 > 1 || k1 < -1) { ++ Collections.sort(entityplayer.chunkCoordIntPairQueue, new ChunkCoordComparator(entityplayer)); ++ } ++ // CraftBukkit end + } + } + } +@@ -274,11 +323,54 @@ + return playerchunkmap.d; + } + +- static List c(PlayerChunkMap playerchunkmap) { ++ static Queue c(PlayerChunkMap playerchunkmap) { // CraftBukkit List -> Queue + return playerchunkmap.f; + } + +- static List d(PlayerChunkMap playerchunkmap) { ++ static Queue d(PlayerChunkMap playerchunkmap) { // CraftBukkit List -> Queue + return playerchunkmap.e; + } ++ ++ // CraftBukkit start - Sorter to load nearby chunks first ++ private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> { ++ private int x; ++ private int z; ++ ++ public ChunkCoordComparator (EntityPlayer entityplayer) { ++ x = (int) entityplayer.locX >> 4; ++ z = (int) entityplayer.locZ >> 4; ++ } ++ ++ public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { ++ if (a.equals(b)) { ++ return 0; ++ } ++ ++ // Subtract current position to set center point ++ int ax = a.x - this.x; ++ int az = a.z - this.z; ++ int bx = b.x - this.x; ++ int bz = b.z - this.z; ++ ++ int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz)); ++ if (result != 0) { ++ return result; ++ } ++ ++ if (ax < 0) { ++ if (bx < 0) { ++ return bz - az; ++ } else { ++ return -1; ++ } ++ } else { ++ if (bx < 0) { ++ return 1; ++ } else { ++ return az - bz; ++ } ++ } ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/PlayerConnection.patch b/nms-patches/PlayerConnection.patch new file mode 100644 index 00000000..577557e6 --- /dev/null +++ b/nms-patches/PlayerConnection.patch @@ -0,0 +1,1458 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerConnection.java 2014-11-27 08:59:46.853421177 +1100 ++++ src/main/java/net/minecraft/server/PlayerConnection.java 2014-11-27 08:42:10.148850918 +1100 +@@ -16,6 +16,48 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.concurrent.ExecutionException; ++import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; ++import java.util.HashSet; ++ ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.craftbukkit.inventory.CraftInventoryView; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.craftbukkit.util.CraftChatMessage; ++import org.bukkit.craftbukkit.util.LazyPlayerSet; ++import org.bukkit.craftbukkit.util.Waitable; ++ ++import org.bukkit.Location; ++import org.bukkit.entity.Player; ++import org.bukkit.event.Event; ++import org.bukkit.event.block.Action; ++import org.bukkit.event.block.SignChangeEvent; ++import org.bukkit.event.inventory.ClickType; ++import org.bukkit.event.inventory.CraftItemEvent; ++import org.bukkit.event.inventory.InventoryAction; ++import org.bukkit.event.inventory.InventoryClickEvent; ++import org.bukkit.event.inventory.InventoryCreativeEvent; ++import org.bukkit.event.inventory.InventoryType.SlotType; ++import org.bukkit.event.player.AsyncPlayerChatEvent; ++import org.bukkit.event.player.PlayerAnimationEvent; ++import org.bukkit.event.player.PlayerChatEvent; ++import org.bukkit.event.player.PlayerCommandPreprocessEvent; ++import org.bukkit.event.player.PlayerInteractEntityEvent; ++import org.bukkit.event.player.PlayerInteractAtEntityEvent; ++import org.bukkit.event.player.PlayerItemHeldEvent; ++import org.bukkit.event.player.PlayerKickEvent; ++import org.bukkit.event.player.PlayerMoveEvent; ++import org.bukkit.event.player.PlayerTeleportEvent; ++import org.bukkit.event.player.PlayerToggleFlightEvent; ++import org.bukkit.event.player.PlayerToggleSneakEvent; ++import org.bukkit.event.player.PlayerToggleSprintEvent; ++import org.bukkit.inventory.CraftingInventory; ++import org.bukkit.inventory.InventoryView; ++import org.bukkit.util.NumberConversions; ++// CraftBukkit end ++ + public class PlayerConnection implements PacketListenerPlayIn, IUpdatePlayerListBox { + + private static final Logger c = LogManager.getLogger(); +@@ -29,13 +71,17 @@ + private int i; + private long j; + private long k; +- private int chatThrottle; ++ // CraftBukkit start - multithreaded fields ++ private volatile int chatThrottle; ++ private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle"); ++ // CraftBukkit end + private int m; + private IntHashMap n = new IntHashMap(); + private double o; + private double p; + private double q; + public boolean checkMovement = true; ++ private boolean processedDisconnect; // CraftBukkit - added + + public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) { + this.minecraftServer = minecraftserver; +@@ -43,7 +89,37 @@ + networkmanager.a((PacketListener) this); + this.player = entityplayer; + entityplayer.playerConnection = this; ++ ++ // CraftBukkit start - add fields and methods ++ this.server = minecraftserver.server; ++ } ++ ++ private final org.bukkit.craftbukkit.CraftServer server; ++ private int lastTick = MinecraftServer.currentTick; ++ private int lastDropTick = MinecraftServer.currentTick; ++ private int dropCount = 0; ++ private static final int SURVIVAL_PLACE_DISTANCE_SQUARED = 6 * 6; ++ private static final int CREATIVE_PLACE_DISTANCE_SQUARED = 7 * 7; ++ ++ // Get position of last block hit for BlockDamageLevel.STOPPED ++ private double lastPosX = Double.MAX_VALUE; ++ private double lastPosY = Double.MAX_VALUE; ++ private double lastPosZ = Double.MAX_VALUE; ++ private float lastPitch = Float.MAX_VALUE; ++ private float lastYaw = Float.MAX_VALUE; ++ private boolean justTeleported = false; ++ ++ // For the PacketPlayOutBlockPlace hack :( ++ Long lastPacket; ++ ++ // Store the last block right clicked and what type it was ++ private Item lastMaterial; ++ ++ public CraftPlayer getPlayer() { ++ return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); + } ++ private final static HashSet<Integer> invalidItems = new HashSet<Integer>(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 43, 51, 52, 55, 59, 60, 62, 63, 64, 68, 71, 74, 75, 83, 90, 92, 93, 94, 104, 105, 115, 117, 118, 119, 125, 127, 132, 140, 141, 142, 144)); // TODO: Check after every update. ++ // CraftBukkit end + + public void c() { + this.h = false; +@@ -57,9 +133,14 @@ + } + + this.minecraftServer.methodProfiler.b(); ++ // CraftBukkit start ++ for (int spam; (spam = this.chatThrottle) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; ++ /* Use thread-safe field access instead + if (this.chatThrottle > 0) { + --this.chatThrottle; + } ++ */ ++ // CraftBukkit end + + if (this.m > 0) { + --this.m; +@@ -76,11 +157,27 @@ + } + + public void disconnect(String s) { ++ // CraftBukkit start - fire PlayerKickEvent ++ String leaveMessage = EnumChatFormat.YELLOW + this.player.getName() + " left the game."; ++ ++ PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage); ++ ++ if (this.server.getServer().isRunning()) { ++ this.server.getPluginManager().callEvent(event); ++ } ++ ++ if (event.isCancelled()) { ++ // Do not kick the player ++ return; ++ } ++ // Send the possibly modified leave message ++ s = event.getReason(); ++ // CraftBukkit end + ChatComponentText chatcomponenttext = new ChatComponentText(s); + + this.networkManager.a(new PacketPlayOutKickDisconnect(chatcomponenttext), new PlayerConnectionFuture(this, chatcomponenttext), new GenericFutureListener[0]); + this.networkManager.k(); +- Futures.getUnchecked(this.minecraftServer.postToMainThread(new PlayerConnectionDisconnector(this))); ++ this.minecraftServer.postToMainThread(new PlayerConnectionDisconnector(this)); // CraftBukkit - Don't wait + } + + public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) { +@@ -90,6 +187,13 @@ + + public void a(PacketPlayInFlying packetplayinflying) { + PlayerConnectionUtils.ensureMainThread(packetplayinflying, this, this.player.u()); ++ // CraftBukkit start - Check for NaN ++ if (Double.isNaN(packetplayinflying.x) || Double.isNaN(packetplayinflying.y) || Double.isNaN(packetplayinflying.z)) { ++ c.warn(player.getName() + " was caught trying to crash the server with an invalid position."); ++ getPlayer().kickPlayer("Nope!"); ++ return; ++ } ++ // CraftBukkit end + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + + this.h = true; +@@ -108,8 +212,65 @@ + this.checkMovement = true; + } + } ++ // CraftBukkit start - fire PlayerMoveEvent ++ Player player = this.getPlayer(); ++ Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location. ++ Location to = player.getLocation().clone(); // Start off the To location as the Players current location. ++ ++ // If the packet contains movement information then we update the To location with the correct XYZ. ++ if (packetplayinflying.hasPos && !(packetplayinflying.hasPos && packetplayinflying.y == -999.0D)) { ++ to.setX(packetplayinflying.x); ++ to.setY(packetplayinflying.y); ++ to.setZ(packetplayinflying.z); ++ } ++ ++ // If the packet contains look information then we update the To location with the correct Yaw & Pitch. ++ if (packetplayinflying.hasLook) { ++ to.setYaw(packetplayinflying.yaw); ++ to.setPitch(packetplayinflying.pitch); ++ } ++ ++ // Prevent 40 event-calls for less than a single pixel of movement >.> ++ double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2); ++ float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); ++ ++ if ((delta > 1f / 256 || deltaAngle > 10f) && (this.checkMovement && !this.player.dead)) { ++ this.lastPosX = to.getX(); ++ this.lastPosY = to.getY(); ++ this.lastPosZ = to.getZ(); ++ this.lastYaw = to.getYaw(); ++ this.lastPitch = to.getPitch(); ++ ++ // Skip the first time we do this ++ if (from.getX() != Double.MAX_VALUE) { ++ PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); ++ this.server.getPluginManager().callEvent(event); ++ ++ // If the event is cancelled we move the player back to their old location. ++ if (event.isCancelled()) { ++ this.player.playerConnection.sendPacket(new PacketPlayOutPosition(from.getX(), from.getY() + 1.6200000047683716D, from.getZ(), from.getYaw(), from.getPitch(), Collections.emptySet())); ++ return; ++ } ++ ++ /* If a Plugin has changed the To destination then we teleport the Player ++ there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. ++ We only do this if the Event was not cancelled. */ ++ if (!to.equals(event.getTo()) && !event.isCancelled()) { ++ this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN); ++ return; ++ } ++ ++ /* Check to see if the Players Location has some how changed during the call of the event. ++ This can happen due to a plugin teleporting the player instead of using .setTo() */ ++ if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) { ++ this.justTeleported = false; ++ return; ++ } ++ } ++ } + +- if (this.checkMovement) { ++ if (this.checkMovement && !this.player.dead) { ++ // CraftBukkit end + this.f = this.e; + double d7; + double d8; +@@ -203,12 +364,14 @@ + double d11 = d7 - this.player.locX; + double d12 = d8 - this.player.locY; + double d13 = d9 - this.player.locZ; +- double d14 = Math.min(Math.abs(d11), Math.abs(this.player.motX)); +- double d15 = Math.min(Math.abs(d12), Math.abs(this.player.motY)); +- double d16 = Math.min(Math.abs(d13), Math.abs(this.player.motZ)); ++ // CraftBukkit start - min to max ++ double d14 = Math.max(Math.abs(d11), Math.abs(this.player.motX)); ++ double d15 = Math.max(Math.abs(d12), Math.abs(this.player.motY)); ++ double d16 = Math.max(Math.abs(d13), Math.abs(this.player.motZ)); ++ // CraftBukkit end + double d17 = d14 * d14 + d15 * d15 + d16 * d16; + +- if (d17 > 100.0D && (!this.minecraftServer.S() || !this.minecraftServer.R().equals(this.player.getName()))) { ++ if (d17 > 100.0D && this.checkMovement && (!this.minecraftServer.S() || !this.minecraftServer.R().equals(this.player.getName()))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports + PlayerConnection.c.warn(this.player.getName() + " moved too quickly! " + d11 + "," + d12 + "," + d13 + " (" + d14 + ", " + d15 + ", " + d16 + ")"); + this.a(this.o, this.p, this.q, this.player.yaw, this.player.pitch); + return; +@@ -281,6 +444,49 @@ + } + + public void a(double d0, double d1, double d2, float f, float f1, Set set) { ++ // CraftBukkit start - Delegate to teleport(Location) ++ Player player = this.getPlayer(); ++ Location from = player.getLocation(); ++ Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); ++ PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, PlayerTeleportEvent.TeleportCause.UNKNOWN); ++ this.server.getPluginManager().callEvent(event); ++ ++ from = event.getFrom(); ++ to = event.isCancelled() ? from : event.getTo(); ++ ++ this.teleport(to, set); ++ } ++ ++ public void teleport(Location dest) { ++ teleport(dest, Collections.emptySet()); ++ } ++ ++ public void teleport(Location dest, Set set) { ++ double d0, d1, d2; ++ float f, f1; ++ ++ d0 = dest.getX(); ++ d1 = dest.getY(); ++ d2 = dest.getZ(); ++ f = dest.getYaw(); ++ f1 = dest.getPitch(); ++ ++ // TODO: make sure this is the best way to address this. ++ if (Float.isNaN(f)) { ++ f = 0; ++ } ++ ++ if (Float.isNaN(f1)) { ++ f1 = 0; ++ } ++ ++ this.lastPosX = d0; ++ this.lastPosY = d1; ++ this.lastPosZ = d2; ++ this.lastYaw = f; ++ this.lastPitch = f1; ++ this.justTeleported = true; ++ // CraftBukkit end + this.checkMovement = false; + this.o = d0; + this.p = d1; +@@ -314,32 +520,49 @@ + + public void a(PacketPlayInBlockDig packetplayinblockdig) { + PlayerConnectionUtils.ensureMainThread(packetplayinblockdig, this, this.player.u()); ++ if (this.player.dead) return; // CraftBukkit + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + BlockPosition blockposition = packetplayinblockdig.a(); + + this.player.z(); ++ // CraftBukkit start + switch (SwitchHelperCommandActionType.a[packetplayinblockdig.c().ordinal()]) { +- case 1: ++ case 1: // DROP_ITEM + if (!this.player.v()) { ++ // limit how quickly items can be dropped ++ // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. ++ if (this.lastDropTick != MinecraftServer.currentTick) { ++ this.dropCount = 0; ++ this.lastDropTick = MinecraftServer.currentTick; ++ } else { ++ // Else we increment the drop count and check the amount. ++ this.dropCount++; ++ if (this.dropCount >= 20) { ++ this.c.warn(this.player.getName() + " dropped their items too quickly!"); ++ this.disconnect("You dropped your items too quickly (Hacking?)"); ++ return; ++ } ++ } ++ // CraftBukkit end + this.player.a(false); + } + + return; + +- case 2: ++ case 2: // DROP_ALL_ITEMS + if (!this.player.v()) { + this.player.a(true); + } + + return; + +- case 3: ++ case 3: // RELEASE_USE_ITEM + this.player.bT(); + return; + +- case 4: +- case 5: +- case 6: ++ case 4: // START_DESTROY_BLOCK ++ case 5: // ABORT_DESTROY_BLOCK ++ case 6: // STOP_DESTROY_BLOCK + double d0 = this.player.locX - ((double) blockposition.getX() + 0.5D); + double d1 = this.player.locY - ((double) blockposition.getY() + 0.5D) + 1.5D; + double d2 = this.player.locZ - ((double) blockposition.getZ() + 0.5D); +@@ -354,7 +577,15 @@ + if (!this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.af().a(blockposition)) { + this.player.playerInteractManager.a(blockposition, packetplayinblockdig.b()); + } else { ++ // CraftBukkit start - fire PlayerInteractEvent ++ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, packetplayinblockdig.b(), this.player.inventory.getItemInHand()); + this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(worldserver, blockposition)); ++ // Update any tile entity data for this block ++ TileEntity tileentity = worldserver.getTileEntity(blockposition); ++ if (tileentity != null) { ++ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); ++ } ++ // CraftBukkit end + } + } else { + if (packetplayinblockdig.c() == EnumPlayerDigType.STOP_DESTROY_BLOCK) { +@@ -374,11 +605,38 @@ + default: + throw new IllegalArgumentException("Invalid player action"); + } ++ // CraftBukkit end + } + + public void a(PacketPlayInBlockPlace packetplayinblockplace) { + PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.u()); + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); ++ ++ // CraftBukkit start ++ if (this.player.dead) return; ++ ++ // This is a horrible hack needed because the client sends 2 packets on 'right mouse click' ++ // aimed at a block. We shouldn't need to get the second packet if the data is handled ++ // but we cannot know what the client will do, so we might still get it ++ // ++ // If the time between packets is small enough, and the 'signature' similar, we discard the ++ // second one. This sadly has to remain until Mojang makes their packets saner. :( ++ // -- Grum ++ if (packetplayinblockplace.getFace() == 255) { ++ if (packetplayinblockplace.getItemStack() != null && packetplayinblockplace.getItemStack().getItem() == this.lastMaterial && this.lastPacket != null && packetplayinblockplace.timestamp - this.lastPacket < 100) { ++ this.lastPacket = null; ++ return; ++ } ++ } else { ++ this.lastMaterial = packetplayinblockplace.getItemStack() == null ? null : packetplayinblockplace.getItemStack().getItem(); ++ this.lastPacket = packetplayinblockplace.timestamp; ++ } ++ // CraftBukkit - if rightclick decremented the item, always send the update packet. */ ++ // this is not here for CraftBukkit's own functionality; rather it is to fix ++ // a notch bug where the item doesn't update correctly. ++ boolean always = false; ++ // CraftBukkit end ++ + ItemStack itemstack = this.player.inventory.getItemInHand(); + boolean flag = false; + BlockPosition blockposition = packetplayinblockplace.a(); +@@ -390,7 +648,18 @@ + return; + } + +- this.player.playerInteractManager.useItem(this.player, worldserver, itemstack); ++ // CraftBukkit start ++ int itemstackAmount = itemstack.count; ++ org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack); ++ if (event.useItemInHand() != Event.Result.DENY) { ++ this.player.playerInteractManager.useItem(this.player, this.player.world, itemstack); ++ } ++ ++ // CraftBukkit - notch decrements the counter by 1 in the above method with food, ++ // snowballs and so forth, but he does it in a place that doesn't cause the ++ // inventory update packet to get sent ++ always = (itemstack.count != itemstackAmount) || itemstack.getItem() == Item.getItemOf(Blocks.WATERLILY); ++ // CraftBukkit end + } else if (blockposition.getY() >= this.minecraftServer.getMaxBuildHeight() - 1 && (enumdirection == EnumDirection.UP || blockposition.getY() >= this.minecraftServer.getMaxBuildHeight())) { + ChatMessage chatmessage = new ChatMessage("build.tooHigh", new Object[] { Integer.valueOf(this.minecraftServer.getMaxBuildHeight())}); + +@@ -398,9 +667,21 @@ + this.player.playerConnection.sendPacket(new PacketPlayOutChat(chatmessage)); + flag = true; + } else { ++ // CraftBukkit start - Check if we can actually do something over this large a distance ++ Location eyeLoc = this.getPlayer().getEyeLocation(); ++ double reachDistance = NumberConversions.square(eyeLoc.getX() - blockposition.getX()) + NumberConversions.square(eyeLoc.getY() - blockposition.getY()) + NumberConversions.square(eyeLoc.getZ() - blockposition.getZ()); ++ if (reachDistance > (this.getPlayer().getGameMode() == org.bukkit.GameMode.CREATIVE ? CREATIVE_PLACE_DISTANCE_SQUARED : SURVIVAL_PLACE_DISTANCE_SQUARED)) { ++ return; ++ } ++ ++ if (!worldserver.af().a(blockposition)) { ++ return; ++ } ++ + if (this.checkMovement && this.player.e((double) blockposition.getX() + 0.5D, (double) blockposition.getY() + 0.5D, (double) blockposition.getZ() + 0.5D) < 64.0D && !this.minecraftServer.a(worldserver, blockposition, this.player) && worldserver.af().a(blockposition)) { +- this.player.playerInteractManager.interact(this.player, worldserver, itemstack, blockposition, enumdirection, packetplayinblockplace.d(), packetplayinblockplace.e(), packetplayinblockplace.f()); ++ always = !this.player.playerInteractManager.interact(this.player, worldserver, itemstack, blockposition, enumdirection, packetplayinblockplace.d(), packetplayinblockplace.e(), packetplayinblockplace.f()); + } ++ // CraftBukkit end + + flag = true; + } +@@ -423,7 +704,8 @@ + + this.player.activeContainer.b(); + this.player.g = false; +- if (!ItemStack.matches(this.player.inventory.getItemInHand(), packetplayinblockplace.getItemStack())) { ++ // CraftBukkit - TODO CHECK IF NEEDED -- new if structure might not need 'always'. Kept it in for now, but may be able to remove in future ++ if (!ItemStack.matches(this.player.inventory.getItemInHand(), packetplayinblockplace.getItemStack()) || always) { + this.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, slot.rawSlotIndex, this.player.inventory.getItemInHand())); + } + } +@@ -437,8 +719,8 @@ + WorldServer[] aworldserver = this.minecraftServer.worldServer; + int i = aworldserver.length; + +- for (int j = 0; j < i; ++j) { +- WorldServer worldserver = aworldserver[j]; ++ // CraftBukkit - use the worlds array list ++ for (WorldServer worldserver : minecraftServer.worlds) { + + if (worldserver != null) { + entity = packetplayinspectate.a(worldserver); +@@ -455,6 +737,7 @@ + WorldServer worldserver1 = this.player.u(); + WorldServer worldserver2 = (WorldServer) entity.world; + ++ /* CraftBukkit start - replace with bukkit handling for multi-world + this.player.dimension = entity.dimension; + this.sendPacket(new PacketPlayOutRespawn(this.player.dimension, worldserver1.getDifficulty(), worldserver1.getWorldData().getType(), this.player.playerInteractManager.getGameMode())); + worldserver1.removeEntity(this.player); +@@ -472,6 +755,9 @@ + this.player.playerInteractManager.a(worldserver2); + this.minecraftServer.getPlayerList().b(this.player, worldserver2); + this.minecraftServer.getPlayerList().updateClient(this.player); ++ */ ++ this.player.getBukkitEntity().teleport(entity.getBukkitEntity()); ++ // CraftBukkit end + } else { + this.player.enderTeleportTo(entity.locX, entity.locY, entity.locZ); + } +@@ -483,14 +769,29 @@ + public void a(PacketPlayInResourcePackStatus packetplayinresourcepackstatus) {} + + public void a(IChatBaseComponent ichatbasecomponent) { +- PlayerConnection.c.info(this.player.getName() + " lost connection: " + ichatbasecomponent); ++ // CraftBukkit start - Rarely it would send a disconnect line twice ++ if (this.processedDisconnect) { ++ return; ++ } else { ++ this.processedDisconnect = true; ++ } ++ // CraftBukkit end ++ c.info(this.player.getName() + " lost connection: " + ichatbasecomponent.c()); // CraftBukkit - Don't toString the component + this.minecraftServer.aF(); ++ // CraftBukkit start - Replace vanilla quit message handling with our own. ++ /* + ChatMessage chatmessage = new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()}); + + chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); + this.minecraftServer.getPlayerList().sendMessage(chatmessage); ++ */ ++ + this.player.q(); +- this.minecraftServer.getPlayerList().disconnect(this.player); ++ String quitMessage = this.minecraftServer.getPlayerList().disconnect(this.player); ++ if ((quitMessage != null) && (quitMessage.length() > 0)) { ++ this.minecraftServer.getPlayerList().sendMessage(CraftChatMessage.fromString(quitMessage)); ++ } ++ // CraftBukkit end + if (this.minecraftServer.S() && this.player.getName().equals(this.minecraftServer.R())) { + PlayerConnection.c.info("Stopping singleplayer server as player logged out"); + this.minecraftServer.safeShutdown(); +@@ -511,6 +812,15 @@ + return; + } + } ++ ++ // CraftBukkit start ++ if (packet == null) { ++ return; ++ } else if (packet instanceof PacketPlayOutSpawnPosition) { ++ PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; ++ this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.position.getX(), packet6.position.getY(), packet6.position.getZ()); ++ } ++ // CraftBukkit end + + try { + this.networkManager.handle(packet); +@@ -524,18 +834,34 @@ + } + + public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { ++ // CraftBukkit start ++ if (this.player.dead) return; + PlayerConnectionUtils.ensureMainThread(packetplayinhelditemslot, this, this.player.u()); + if (packetplayinhelditemslot.a() >= 0 && packetplayinhelditemslot.a() < PlayerInventory.getHotbarSize()) { ++ PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.a()); ++ this.server.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ this.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex)); ++ this.player.z(); // RENAME ++ return; ++ } ++ // CraftBukkit end + this.player.inventory.itemInHandIndex = packetplayinhelditemslot.a(); + this.player.z(); + } else { + PlayerConnection.c.warn(this.player.getName() + " tried to set an invalid carried item"); ++ this.disconnect("Nope!"); // CraftBukkit + } + } + + public void a(PacketPlayInChat packetplayinchat) { +- PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.u()); +- if (this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { ++ // CraftBukkit start - async chat ++ boolean isSync = packetplayinchat.a().startsWith("/"); ++ if (packetplayinchat.a().startsWith("/")) { ++ PlayerConnectionUtils.ensureMainThread(packetplayinchat, this, this.player.u()); ++ } ++ // CraftBukkit end ++ if (this.player.dead || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales + ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); + + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); +@@ -548,39 +874,248 @@ + + for (int i = 0; i < s.length(); ++i) { + if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { +- this.disconnect("Illegal characters in chat"); ++ // CraftBukkit start - threadsafety ++ if (!isSync) { ++ Waitable waitable = new Waitable() { ++ @Override ++ protected Object evaluate() { ++ PlayerConnection.this.disconnect("Illegal characters in chat"); ++ return null; ++ } ++ }; ++ ++ this.minecraftServer.processQueue.add(waitable); ++ ++ try { ++ waitable.get(); ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); ++ } catch (ExecutionException e) { ++ throw new RuntimeException(e); ++ } ++ } else { ++ this.disconnect("Illegal characters in chat"); ++ } ++ // CraftBukkit end + return; + } + } + +- if (s.startsWith("/")) { +- this.handleCommand(s); ++ // CraftBukkit start ++ if (isSync) { ++ try { ++ this.minecraftServer.server.playerCommandState = true; ++ this.handleCommand(s); ++ } finally { ++ this.minecraftServer.server.playerCommandState = false; ++ } ++ } else if (s.isEmpty()) { ++ c.warn(this.player.getName() + " tried to send an empty message"); ++ } else if (getPlayer().isConversing()) { ++ getPlayer().acceptConversationInput(s); ++ } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { // Re-add "Command Only" flag check ++ ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); ++ ++ chatmessage.getChatModifier().setColor(EnumChatFormat.RED); ++ this.sendPacket(new PacketPlayOutChat(chatmessage)); ++ } else if (true) { ++ this.chat(s, true); ++ // CraftBukkit end - the below is for reference. :) + } else { + ChatMessage chatmessage1 = new ChatMessage("chat.type.text", new Object[] { this.player.getScoreboardDisplayName(), s}); + + this.minecraftServer.getPlayerList().sendMessage(chatmessage1, false); + } + +- this.chatThrottle += 20; +- if (this.chatThrottle > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { +- this.disconnect("disconnect.spam"); +- } ++ // CraftBukkit start - replaced with thread safe throttle ++ // this.chatThrottle += 20; ++ if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { ++ if (!isSync) { ++ Waitable waitable = new Waitable() { ++ @Override ++ protected Object evaluate() { ++ PlayerConnection.this.disconnect("disconnect.spam"); ++ return null; ++ } ++ }; ++ ++ this.minecraftServer.processQueue.add(waitable); + ++ try { ++ waitable.get(); ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); ++ } catch (ExecutionException e) { ++ throw new RuntimeException(e); ++ } ++ } else { ++ this.disconnect("disconnect.spam"); ++ } ++ // CraftBukkit end ++ } + } + } ++ ++ // CraftBukkit start - add method ++ public void chat(String s, boolean async) { ++ if (s.isEmpty() || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { ++ return; ++ } ++ ++ if (!async && s.startsWith("/")) { ++ this.handleCommand(s); ++ } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { ++ // Do nothing, this is coming from a plugin ++ } else { ++ Player player = this.getPlayer(); ++ AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet()); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ // Evil plugins still listening to deprecated event ++ final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); ++ queueEvent.setCancelled(event.isCancelled()); ++ Waitable waitable = new Waitable() { ++ @Override ++ protected Object evaluate() { ++ org.bukkit.Bukkit.getPluginManager().callEvent(queueEvent); ++ ++ if (queueEvent.isCancelled()) { ++ return null; ++ } ++ ++ String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); ++ PlayerConnection.this.minecraftServer.console.sendMessage(message); ++ if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { ++ for (Object player : PlayerConnection.this.minecraftServer.getPlayerList().players) { ++ ((EntityPlayer) player).sendMessage(CraftChatMessage.fromString(message)); ++ } ++ } else { ++ for (Player player : queueEvent.getRecipients()) { ++ player.sendMessage(message); ++ } ++ } ++ return null; ++ }}; ++ if (async) { ++ minecraftServer.processQueue.add(waitable); ++ } else { ++ waitable.run(); ++ } ++ try { ++ waitable.get(); ++ } catch (InterruptedException e) { ++ Thread.currentThread().interrupt(); // This is proper habit for java. If we aren't handling it, pass it on! ++ } catch (ExecutionException e) { ++ throw new RuntimeException("Exception processing chat event", e.getCause()); ++ } ++ } else { ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); ++ minecraftServer.console.sendMessage(s); ++ if (((LazyPlayerSet) event.getRecipients()).isLazy()) { ++ for (Object recipient : minecraftServer.getPlayerList().players) { ++ ((EntityPlayer) recipient).sendMessage(CraftChatMessage.fromString(s)); ++ } ++ } else { ++ for (Player recipient : event.getRecipients()) { ++ recipient.sendMessage(s); ++ } ++ } ++ } ++ } ++ } ++ // CraftBukkit end + + private void handleCommand(String s) { +- this.minecraftServer.getCommandHandler().a(this.player, s); ++ // CraftBukkit start - whole method ++ this.c.info(this.player.getName() + " issued server command: " + s); ++ ++ CraftPlayer player = this.getPlayer(); ++ ++ PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ ++ try { ++ if (this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1))) { ++ return; ++ } ++ } catch (org.bukkit.command.CommandException ex) { ++ player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); ++ java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); ++ return; ++ } ++ // this.minecraftServer.getCommandHandler().a(this.player, s); ++ // CraftBukkit end + } + + public void a(PacketPlayInArmAnimation packetplayinarmanimation) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinarmanimation, this, this.player.u()); + this.player.z(); ++ // CraftBukkit start - Raytrace to look for 'rogue armswings' ++ float f = 1.0F; ++ float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f; ++ float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f; ++ double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f; ++ double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.getHeadHeight(); ++ double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; ++ Vec3D vec3d = new Vec3D(d0, d1, d2); ++ ++ float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); ++ float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); ++ float f5 = -MathHelper.cos(-f1 * 0.017453292F); ++ float f6 = MathHelper.sin(-f1 * 0.017453292F); ++ float f7 = f4 * f5; ++ float f8 = f3 * f5; ++ double d3 = 5.0D; ++ Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); ++ MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, false); ++ ++ if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.BLOCK) { ++ CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); ++ } ++ ++ // Arm swing animation ++ PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer()); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) return; ++ // CraftBukkit end + this.player.bv(); + } + + public void a(PacketPlayInEntityAction packetplayinentityaction) { + PlayerConnectionUtils.ensureMainThread(packetplayinentityaction, this, this.player.u()); ++ // CraftBukkit start ++ if (this.player.dead) return; ++ switch (packetplayinentityaction.b()) { ++ case START_SNEAKING: ++ case STOP_SNEAKING: ++ PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.b() == EnumPlayerAction.START_SNEAKING); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ break; ++ case START_SPRINTING: ++ case STOP_SPRINTING: ++ PlayerToggleSprintEvent e2 = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.b() == EnumPlayerAction.START_SPRINTING); ++ this.server.getPluginManager().callEvent(e2); ++ ++ if (e2.isCancelled()) { ++ return; ++ } ++ break; ++ } + this.player.z(); + switch (SwitchHelperCommandActionType.b[packetplayinentityaction.b().ordinal()]) { + case 1: +@@ -601,7 +1136,7 @@ + + case 5: + this.player.a(false, true, true); +- this.checkMovement = false; ++ // this.checkMovement = false; // CraftBukkit - this is handled in teleport + break; + + case 6: +@@ -623,6 +1158,7 @@ + } + + public void a(PacketPlayInUseEntity packetplayinuseentity) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinuseentity, this, this.player.u()); + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); + Entity entity = packetplayinuseentity.a((World) worldserver); +@@ -637,18 +1173,72 @@ + } + + if (this.player.h(entity) < d0) { ++ ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit ++ ++ if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT ++ || packetplayinuseentity.a() == EnumEntityUseAction.INTERACT_AT) { ++ // CraftBukkit start ++ boolean triggerTagUpdate = itemInHand != null && itemInHand.getItem() == Items.NAME_TAG && entity instanceof EntityInsentient; ++ boolean triggerChestUpdate = itemInHand != null && itemInHand.getItem() == Item.getItemOf(Blocks.CHEST) && entity instanceof EntityHorse; ++ boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEAD && entity instanceof EntityInsentient; ++ PlayerInteractEntityEvent event; ++ if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT) { ++ event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity()); ++ } else { ++ Vec3D target = packetplayinuseentity.b(); ++ event = new PlayerInteractAtEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity(), new org.bukkit.util.Vector(target.a, target.b, target.c)); ++ } ++ this.server.getPluginManager().callEvent(event); ++ ++ if (triggerLeashUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.LEAD)) { ++ // Refresh the current leash state ++ this.sendPacket(new PacketPlayOutAttachEntity(1, entity, ((EntityInsentient) entity).getLeashHolder())); ++ } ++ ++ if (triggerTagUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.NAME_TAG)) { ++ // Refresh the current entity metadata ++ this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); ++ } ++ if (triggerChestUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Item.getItemOf(Blocks.CHEST))) { ++ this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); ++ } ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end ++ } ++ + if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT) { + this.player.u(entity); ++ ++ // CraftBukkit start ++ if (itemInHand != null && itemInHand.count <= -1) { ++ this.player.updateInventory(this.player.activeContainer); ++ } ++ // CraftBukkit end + } else if (packetplayinuseentity.a() == EnumEntityUseAction.INTERACT_AT) { + entity.a((EntityHuman) this.player, packetplayinuseentity.b()); ++ ++ // CraftBukkit start ++ if (itemInHand != null && itemInHand.count <= -1) { ++ this.player.updateInventory(this.player.activeContainer); ++ } ++ // CraftBukkit end + } else if (packetplayinuseentity.a() == EnumEntityUseAction.ATTACK) { +- if (entity instanceof EntityItem || entity instanceof EntityExperienceOrb || entity instanceof EntityArrow || entity == this.player) { ++ if (entity instanceof EntityItem || entity instanceof EntityExperienceOrb || entity instanceof EntityArrow || (entity == this.player && !player.v())) { // CraftBukkit, RENAME + this.disconnect("Attempting to attack an invalid entity"); + this.minecraftServer.warning("Player " + this.player.getName() + " tried to attack an invalid entity"); + return; + } + + this.player.attack(entity); ++ ++ // CraftBukkit start ++ if (itemInHand != null && itemInHand.count <= -1) { ++ this.player.updateInventory(this.player.activeContainer); ++ } ++ // CraftBukkit end + } + } + } +@@ -663,7 +1253,8 @@ + switch (SwitchHelperCommandActionType.c[enumclientcommand.ordinal()]) { + case 1: + if (this.player.viewingCredits) { +- this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true); ++ // this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, true); ++ this.minecraftServer.getPlayerList().changeDimension(this.player, 0, PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit - reroute logic through custom portal management + } else if (this.player.u().getWorldData().isHardcore()) { + if (this.minecraftServer.S() && this.player.getName().equals(this.minecraftServer.R())) { + this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); +@@ -694,11 +1285,17 @@ + } + + public void a(PacketPlayInCloseWindow packetplayinclosewindow) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinclosewindow, this, this.player.u()); ++ ++ CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit ++ + this.player.p(); + } + + public void a(PacketPlayInWindowClick packetplayinwindowclick) { ++ if (this.player.dead) return; // CraftBukkit ++ + PlayerConnectionUtils.ensureMainThread(packetplayinwindowclick, this, this.player.u()); + this.player.z(); + if (this.player.activeContainer.windowId == packetplayinwindowclick.a() && this.player.activeContainer.c(this.player)) { +@@ -711,7 +1308,263 @@ + + this.player.a(this.player.activeContainer, (List) arraylist); + } else { +- ItemStack itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); ++ // ItemStack itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); ++ // CraftBukkit start - Call InventoryClickEvent ++ if (packetplayinwindowclick.b() < -1 && packetplayinwindowclick.b() != -999) { ++ return; ++ } ++ ++ InventoryView inventory = this.player.activeContainer.getBukkitView(); ++ SlotType type = CraftInventoryView.getSlotType(inventory, packetplayinwindowclick.b()); ++ ++ InventoryClickEvent event = null; ++ ClickType click = ClickType.UNKNOWN; ++ InventoryAction action = InventoryAction.UNKNOWN; ++ ++ ItemStack itemstack = null; ++ ++ if (packetplayinwindowclick.b() == -1) { ++ type = SlotType.OUTSIDE; // override ++ click = packetplayinwindowclick.c() == 0 ? ClickType.WINDOW_BORDER_LEFT : ClickType.WINDOW_BORDER_RIGHT; ++ action = InventoryAction.NOTHING; ++ } else if (packetplayinwindowclick.f() == 0) { ++ if (packetplayinwindowclick.c() == 0) { ++ click = ClickType.LEFT; ++ } else if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.RIGHT; ++ } ++ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) { ++ action = InventoryAction.NOTHING; // Don't want to repeat ourselves ++ if (packetplayinwindowclick.b() == -999) { ++ if (player.inventory.getCarried() != null) { ++ action = packetplayinwindowclick.c() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR; ++ } ++ } else { ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null) { ++ ItemStack clickedItem = slot.getItem(); ++ ItemStack cursor = player.inventory.getCarried(); ++ if (clickedItem == null) { ++ if (cursor != null) { ++ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE; ++ } ++ } else if (slot.isAllowed(player)) { ++ if (cursor == null) { ++ action = packetplayinwindowclick.c() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; ++ } else if (slot.isAllowed(cursor)) { ++ if (clickedItem.doMaterialsMatch(cursor) && ItemStack.equals(clickedItem, cursor)) { ++ int toPlace = packetplayinwindowclick.c() == 0 ? cursor.count : 1; ++ toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.count); ++ toPlace = Math.min(toPlace, slot.inventory.getMaxStackSize() - clickedItem.count); ++ if (toPlace == 1) { ++ action = InventoryAction.PLACE_ONE; ++ } else if (toPlace == cursor.count) { ++ action = InventoryAction.PLACE_ALL; ++ } else if (toPlace < 0) { ++ action = toPlace != -1 ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE; // this happens with oversized stacks ++ } else if (toPlace != 0) { ++ action = InventoryAction.PLACE_SOME; ++ } ++ } else if (cursor.count <= slot.getMaxStackSize()) { ++ action = InventoryAction.SWAP_WITH_CURSOR; ++ } ++ } else if (cursor.getItem() == clickedItem.getItem() && (!cursor.usesData() || cursor.getData() == clickedItem.getData()) && ItemStack.equals(cursor, clickedItem)) { ++ if (clickedItem.count >= 0) { ++ if (clickedItem.count + cursor.count <= cursor.getMaxStackSize()) { ++ // As of 1.5, this is result slots only ++ action = InventoryAction.PICKUP_ALL; ++ } ++ } ++ } ++ } ++ } ++ } ++ } ++ } else if (packetplayinwindowclick.f() == 1) { ++ if (packetplayinwindowclick.c() == 0) { ++ click = ClickType.SHIFT_LEFT; ++ } else if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.SHIFT_RIGHT; ++ } ++ if (packetplayinwindowclick.c() == 0 || packetplayinwindowclick.c() == 1) { ++ if (packetplayinwindowclick.b() < 0) { ++ action = InventoryAction.NOTHING; ++ } else { ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.isAllowed(this.player) && slot.hasItem()) { ++ action = InventoryAction.MOVE_TO_OTHER_INVENTORY; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } ++ } ++ } else if (packetplayinwindowclick.f() == 2) { ++ if (packetplayinwindowclick.c() >= 0 && packetplayinwindowclick.c() < 9) { ++ click = ClickType.NUMBER_KEY; ++ Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (clickedSlot.isAllowed(player)) { ++ ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.c()); ++ boolean canCleanSwap = hotbar == null || (clickedSlot.inventory == player.inventory && clickedSlot.isAllowed(hotbar)); // the slot will accept the hotbar item ++ if (clickedSlot.hasItem()) { ++ if (canCleanSwap) { ++ action = InventoryAction.HOTBAR_SWAP; ++ } else { ++ int firstEmptySlot = player.inventory.getFirstEmptySlotIndex(); ++ if (firstEmptySlot > -1) { ++ action = InventoryAction.HOTBAR_MOVE_AND_READD; ++ } else { ++ action = InventoryAction.NOTHING; // This is not sane! Mojang: You should test for other slots of same type ++ } ++ } ++ } else if (!clickedSlot.hasItem() && hotbar != null && clickedSlot.isAllowed(hotbar)) { ++ action = InventoryAction.HOTBAR_SWAP; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ // Special constructor for number key ++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); ++ } ++ } else if (packetplayinwindowclick.f() == 3) { ++ if (packetplayinwindowclick.c() == 2) { ++ click = ClickType.MIDDLE; ++ if (packetplayinwindowclick.b() == -999) { ++ action = InventoryAction.NOTHING; ++ } else { ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.hasItem() && player.abilities.canInstantlyBuild && player.inventory.getCarried() == null) { ++ action = InventoryAction.CLONE_STACK; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } ++ } else { ++ click = ClickType.UNKNOWN; ++ action = InventoryAction.UNKNOWN; ++ } ++ } else if (packetplayinwindowclick.f() == 4) { ++ if (packetplayinwindowclick.b() >= 0) { ++ if (packetplayinwindowclick.c() == 0) { ++ click = ClickType.DROP; ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { ++ action = InventoryAction.DROP_ONE_SLOT; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } else if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.CONTROL_DROP; ++ Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.b()); ++ if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { ++ action = InventoryAction.DROP_ALL_SLOT; ++ } else { ++ action = InventoryAction.NOTHING; ++ } ++ } ++ } else { ++ // Sane default (because this happens when they are holding nothing. Don't ask why.) ++ click = ClickType.LEFT; ++ if (packetplayinwindowclick.c() == 1) { ++ click = ClickType.RIGHT; ++ } ++ action = InventoryAction.NOTHING; ++ } ++ } else if (packetplayinwindowclick.f() == 5) { ++ itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), 5, this.player); ++ } else if (packetplayinwindowclick.f() == 6) { ++ click = ClickType.DOUBLE_CLICK; ++ action = InventoryAction.NOTHING; ++ if (packetplayinwindowclick.b() >= 0 && this.player.inventory.getCarried() != null) { ++ ItemStack cursor = this.player.inventory.getCarried(); ++ action = InventoryAction.NOTHING; ++ // Quick check for if we have any of the item ++ if (inventory.getTopInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem()))) || inventory.getBottomInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem())))) { ++ action = InventoryAction.COLLECT_TO_CURSOR; ++ } ++ } ++ } ++ // TODO check on updates ++ ++ if (packetplayinwindowclick.f() != 5) { ++ if (click == ClickType.NUMBER_KEY) { ++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); ++ } else { ++ event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.b(), click, action); ++ } ++ ++ org.bukkit.inventory.Inventory top = inventory.getTopInventory(); ++ if (packetplayinwindowclick.b() == 0 && top instanceof CraftingInventory) { ++ org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); ++ if (recipe != null) { ++ if (click == ClickType.NUMBER_KEY) { ++ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action, packetplayinwindowclick.c()); ++ } else { ++ event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.b(), click, action); ++ } ++ } ++ } ++ ++ server.getPluginManager().callEvent(event); ++ ++ switch (event.getResult()) { ++ case ALLOW: ++ case DEFAULT: ++ itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.b(), packetplayinwindowclick.c(), packetplayinwindowclick.f(), this.player); ++ break; ++ case DENY: ++ /* Needs enum constructor in InventoryAction ++ if (action.modifiesOtherSlots()) { ++ ++ } else { ++ if (action.modifiesCursor()) { ++ this.player.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.player.inventory.getCarried())); ++ } ++ if (action.modifiesClicked()) { ++ this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, packet102windowclick.slot, this.player.activeContainer.getSlot(packet102windowclick.slot).getItem())); ++ } ++ }*/ ++ switch (action) { ++ // Modified other slots ++ case PICKUP_ALL: ++ case MOVE_TO_OTHER_INVENTORY: ++ case HOTBAR_MOVE_AND_READD: ++ case HOTBAR_SWAP: ++ case COLLECT_TO_CURSOR: ++ case UNKNOWN: ++ this.player.updateInventory(this.player.activeContainer); ++ break; ++ // Modified cursor and clicked ++ case PICKUP_SOME: ++ case PICKUP_HALF: ++ case PICKUP_ONE: ++ case PLACE_ALL: ++ case PLACE_SOME: ++ case PLACE_ONE: ++ case SWAP_WITH_CURSOR: ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.b(), this.player.activeContainer.getSlot(packetplayinwindowclick.b()).getItem())); ++ break; ++ // Modified clicked only ++ case DROP_ALL_SLOT: ++ case DROP_ONE_SLOT: ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.b(), this.player.activeContainer.getSlot(packetplayinwindowclick.b()).getItem())); ++ break; ++ // Modified cursor only ++ case DROP_ALL_CURSOR: ++ case DROP_ONE_CURSOR: ++ case CLONE_STACK: ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); ++ break; ++ // Nothing ++ case NOTHING: ++ break; ++ } ++ return; ++ } ++ } ++ // CraftBukkit end + + if (ItemStack.matches(packetplayinwindowclick.e(), itemstack)) { + this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.a(), packetplayinwindowclick.d(), true)); +@@ -772,8 +1625,50 @@ + } + + boolean flag1 = packetplayinsetcreativeslot.a() >= 1 && packetplayinsetcreativeslot.a() < 36 + PlayerInventory.getHotbarSize(); +- boolean flag2 = itemstack == null || itemstack.getItem() != null; ++ // CraftBukkit - Add invalidItems check ++ boolean flag2 = itemstack == null || itemstack.getItem() != null && !invalidItems.contains(Item.getId(itemstack.getItem())); + boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; ++ ++ ++ // CraftBukkit start - Call click event ++ if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot ++ ++ org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); ++ InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); ++ org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack()); ++ ++ SlotType type = SlotType.QUICKBAR; ++ if (flag) { ++ type = SlotType.OUTSIDE; ++ } else if (packetplayinsetcreativeslot.a() < 36) { ++ if (packetplayinsetcreativeslot.a() >= 5 && packetplayinsetcreativeslot.a() < 9) { ++ type = SlotType.ARMOR; ++ } else { ++ type = SlotType.CONTAINER; ++ } ++ } ++ InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.a(), item); ++ server.getPluginManager().callEvent(event); ++ ++ itemstack = CraftItemStack.asNMSCopy(event.getCursor()); ++ ++ switch (event.getResult()) { ++ case ALLOW: ++ // Plugin cleared the id / stacksize checks ++ flag2 = flag3 = true; ++ break; ++ case DEFAULT: ++ break; ++ case DENY: ++ // Reset the slot ++ if (packetplayinsetcreativeslot.a() >= 0) { ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.defaultContainer.windowId, packetplayinsetcreativeslot.a(), this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.a()).getItem())); ++ this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, null)); ++ } ++ return; ++ } ++ } ++ // CraftBukkit end + + if (flag1 && flag2 && flag3) { + if (itemstack == null) { +@@ -796,6 +1691,7 @@ + } + + public void a(PacketPlayInTransaction packetplayintransaction) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayintransaction, this, this.player.u()); + Short oshort = (Short) this.n.get(this.player.activeContainer.windowId); + +@@ -806,6 +1702,7 @@ + } + + public void a(PacketPlayInUpdateSign packetplayinupdatesign) { ++ if (this.player.dead) return; // CraftBukkit + PlayerConnectionUtils.ensureMainThread(packetplayinupdatesign, this, this.player.u()); + this.player.z(); + WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); +@@ -822,10 +1719,24 @@ + + if (!tileentitysign.b() || tileentitysign.c() != this.player) { + this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign"); ++ this.sendPacket(new PacketPlayOutUpdateSign(tileentity.world, packetplayinupdatesign.a(), tileentitysign.lines)); // CraftBukkit + return; + } + +- System.arraycopy(packetplayinupdatesign.b(), 0, tileentitysign.lines, 0, 4); ++ // CraftBukkit start ++ Player player = this.server.getPlayer(this.player); ++ int x = packetplayinupdatesign.a().getX(); ++ int y = packetplayinupdatesign.a().getY(); ++ int z = packetplayinupdatesign.a().getZ(); ++ SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(x, y, z), this.server.getPlayer(this.player), org.bukkit.craftbukkit.block.CraftSign.revertComponents(packetplayinupdatesign.b())); ++ this.server.getPluginManager().callEvent(event); ++ ++ if (!event.isCancelled()) { ++ System.arraycopy(org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()), 0, tileentitysign.lines, 0, 4); ++ tileentitysign.isEditable = false; ++ } ++ // System.arraycopy(packetplayinupdatesign.b(), 0, tileentitysign.lines, 0, 4); ++ // CraftBukkit end + tileentitysign.update(); + worldserver.notify(blockposition); + } +@@ -847,11 +1758,28 @@ + + public void a(PacketPlayInAbilities packetplayinabilities) { + PlayerConnectionUtils.ensureMainThread(packetplayinabilities, this, this.player.u()); +- this.player.abilities.isFlying = packetplayinabilities.isFlying() && this.player.abilities.canFly; ++ // CraftBukkit start ++ if (this.player.abilities.canFly && this.player.abilities.isFlying != packetplayinabilities.isFlying()) { ++ PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packetplayinabilities.isFlying()); ++ this.server.getPluginManager().callEvent(event); ++ if (!event.isCancelled()) { ++ this.player.abilities.isFlying = packetplayinabilities.isFlying(); // Actually set the player's flying status ++ } else { ++ this.player.updateAbilities(); // Tell the player their ability was reverted ++ } ++ } ++ // CraftBukkit end + } + + public void a(PacketPlayInTabComplete packetplayintabcomplete) { + PlayerConnectionUtils.ensureMainThread(packetplayintabcomplete, this, this.player.u()); ++ // CraftBukkit start ++ if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { ++ this.disconnect("disconnect.spam"); ++ return; ++ } ++ // CraftBukkit end ++ + ArrayList arraylist = Lists.newArrayList(); + Iterator iterator = this.minecraftServer.tabCompleteCommand(this.player, packetplayintabcomplete.a(), packetplayintabcomplete.b()).iterator(); + +@@ -891,13 +1819,15 @@ + itemstack1 = this.player.inventory.getItemInHand(); + if (itemstack1 != null) { + if (itemstack.getItem() == Items.WRITABLE_BOOK && itemstack.getItem() == itemstack1.getItem()) { +- itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); ++ // itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); ++ CraftEventFactory.handleEditBookEvent(player, itemstack); // CraftBukkit + } + + return; + } + } catch (Exception exception) { + PlayerConnection.c.error("Couldn\'t handle book info", exception); ++ this.disconnect("Invalid book data!"); // CraftBukkit + return; + } finally { + packetdataserializer.release(); +@@ -909,27 +1839,31 @@ + + try { + itemstack = packetdataserializer.i(); +- if (itemstack == null) { +- return; +- } ++ if (itemstack != null) { ++ if (!ItemWrittenBook.b(itemstack.getTag())) { ++ throw new IOException("Invalid book tag!"); ++ } + +- if (!ItemWrittenBook.b(itemstack.getTag())) { +- throw new IOException("Invalid book tag!"); +- } ++ itemstack1 = this.player.inventory.getItemInHand(); ++ if (itemstack1 == null) { ++ return; ++ } + +- itemstack1 = this.player.inventory.getItemInHand(); +- if (itemstack1 != null) { + if (itemstack.getItem() == Items.WRITTEN_BOOK && itemstack1.getItem() == Items.WRITABLE_BOOK) { +- itemstack1.a("author", (NBTBase) (new NBTTagString(this.player.getName()))); +- itemstack1.a("title", (NBTBase) (new NBTTagString(itemstack.getTag().getString("title")))); +- itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); +- itemstack1.setItem(Items.WRITTEN_BOOK); ++ // CraftBukkit start ++ // itemstack1.a("author", (NBTBase) (new NBTTagString(this.player.getName()))); ++ // itemstack1.a("title", (NBTBase) (new NBTTagString(itemstack.getTag().getString("title")))); ++ // itemstack1.a("pages", (NBTBase) itemstack.getTag().getList("pages", 8)); ++ // itemstack1.setItem(Items.WRITTEN_BOOK); ++ CraftEventFactory.handleEditBookEvent(player, itemstack); ++ // CraftBukkit end + } + + return; + } + } catch (Exception exception1) { + PlayerConnection.c.error("Couldn\'t sign book", exception1); ++ this.disconnect("Invalid book data!"); // CraftBukkit + return; + } finally { + packetdataserializer.release(); +@@ -946,6 +1880,7 @@ + } + } catch (Exception exception2) { + PlayerConnection.c.error("Couldn\'t select trade", exception2); ++ this.disconnect("Invalid trade data!"); // CraftBukkit + } + } else if ("MC|AdvCdm".equals(packetplayincustompayload.a())) { + if (!this.minecraftServer.getEnableCommandBlock()) { +@@ -986,6 +1921,7 @@ + } + } catch (Exception exception3) { + PlayerConnection.c.error("Couldn\'t set command block", exception3); ++ this.disconnect("Invalid CommandBlock data!"); // CraftBukkit + } finally { + packetdataserializer.release(); + } +@@ -1011,6 +1947,7 @@ + } + } catch (Exception exception4) { + PlayerConnection.c.error("Couldn\'t set beacon", exception4); ++ this.disconnect("Invalid beacon data!"); // CraftBukkit + } + } + } else if ("MC|ItemName".equals(packetplayincustompayload.a()) && this.player.activeContainer instanceof ContainerAnvil) { +@@ -1026,6 +1963,27 @@ + containeranvil.a(""); + } + } ++ // CraftBukkit start ++ else if (packetplayincustompayload.a().equals("REGISTER")) { ++ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8); ++ for (String channel : channels.split("\0")) { ++ getPlayer().addChannel(channel); ++ } ++ } else if (packetplayincustompayload.a().equals("UNREGISTER")) { ++ String channels = packetplayincustompayload.b().toString(com.google.common.base.Charsets.UTF_8); ++ for (String channel : channels.split("\0")) { ++ getPlayer().removeChannel(channel); ++ } ++ } else { ++ byte[] data = new byte[packetplayincustompayload.b().readableBytes()]; ++ packetplayincustompayload.b().readBytes(data); ++ server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.a(), data); ++ } ++ // CraftBukkit end ++ } + ++ // CraftBukkit start - Add "isDisconnected" method ++ public final boolean isDisconnected() { ++ return !this.player.joining && !NetworkManager.a(this.networkManager).config().isAutoRead(); + } + } diff --git a/nms-patches/PlayerDatFileConverter.patch b/nms-patches/PlayerDatFileConverter.patch new file mode 100644 index 00000000..a1286509 --- /dev/null +++ b/nms-patches/PlayerDatFileConverter.patch @@ -0,0 +1,33 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerDatFileConverter.java 2014-11-27 08:59:46.857421159 +1100 ++++ src/main/java/net/minecraft/server/PlayerDatFileConverter.java 2014-11-27 08:42:10.168850880 +1100 +@@ -47,6 +47,30 @@ + private void a(File file, String s, String s1) { + File file1 = new File(this.d, s + ".dat"); + File file2 = new File(file, s1 + ".dat"); ++ ++ // CraftBukkit start - Use old file name to seed lastKnownName ++ NBTTagCompound root = null; ++ ++ try { ++ root = NBTCompressedStreamTools.a(new java.io.FileInputStream(file1)); ++ } catch (Exception exception) { ++ exception.printStackTrace(); ++ } ++ ++ if (root != null) { ++ if (!root.hasKey("bukkit")) { ++ root.set("bukkit", new NBTTagCompound()); ++ } ++ NBTTagCompound data = root.getCompound("bukkit"); ++ data.setString("lastKnownName", s); ++ ++ try { ++ NBTCompressedStreamTools.a(root, new java.io.FileOutputStream(file2)); ++ } catch (Exception exception) { ++ exception.printStackTrace(); ++ } ++ } ++ // CraftBukkit end + + NameReferencingFileConverter.a(file); + if (!file1.renameTo(file2)) { diff --git a/nms-patches/PlayerInteractManager.patch b/nms-patches/PlayerInteractManager.patch new file mode 100644 index 00000000..ac0ab569 --- /dev/null +++ b/nms-patches/PlayerInteractManager.patch @@ -0,0 +1,289 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerInteractManager.java 2014-11-27 08:59:46.857421159 +1100 ++++ src/main/java/net/minecraft/server/PlayerInteractManager.java 2014-11-27 08:42:10.108850996 +1100 +@@ -1,5 +1,13 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.event.block.BlockBreakEvent; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.Event; ++import org.bukkit.event.block.Action; ++import org.bukkit.event.player.PlayerInteractEvent; ++// CraftBukkit end ++ + public class PlayerInteractManager { + + public World world; +@@ -50,7 +58,7 @@ + } + + public void a() { +- ++this.currentTick; ++ this.currentTick = MinecraftServer.currentTick; // CraftBukkit; + float f; + int i; + +@@ -95,6 +103,19 @@ + } + + public void a(BlockPosition blockposition, EnumDirection enumdirection) { ++ // CraftBukkit start ++ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, blockposition, enumdirection, this.player.inventory.getItemInHand()); ++ if (event.isCancelled()) { ++ // Let the client know the block still exists ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ // Update any tile entity data for this block ++ TileEntity tileentity = this.world.getTileEntity(blockposition); ++ if (tileentity != null) { ++ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); ++ } ++ return; ++ } ++ // CraftBukkit end + if (this.isCreative()) { + if (!this.world.douseFire((EntityHuman) null, blockposition, enumdirection)) { + this.breakBlock(blockposition); +@@ -121,15 +142,49 @@ + } + } + +- this.world.douseFire((EntityHuman) null, blockposition, enumdirection); ++ // this.world.douseFire((EntityHuman) null, blockposition, enumdirection); // CraftBukkit - Moved down + this.lastDigTick = this.currentTick; + float f = 1.0F; + +- if (block.getMaterial() != Material.AIR) { ++ // CraftBukkit start - Swings at air do *NOT* exist. ++ if (event.useInteractedBlock() == Event.Result.DENY) { ++ // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. ++ IBlockData data = this.world.getType(blockposition); ++ if (block == Blocks.WOODEN_DOOR) { ++ // For some reason *BOTH* the bottom/top part have to be marked updated. ++ boolean bottom = data.get(BlockDoor.HALF) == EnumDoorHalf.LOWER; ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, bottom ? blockposition.up() : blockposition.down())); ++ } else if (block == Blocks.TRAPDOOR) { ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ } ++ } else if (block.getMaterial() != Material.AIR) { + block.attack(this.world, blockposition, this.player); + f = block.getDamage(this.player, this.player.world, blockposition); ++ // Allow fire punching to be blocked ++ this.world.douseFire((EntityHuman) null, blockposition, enumdirection); ++ } ++ ++ if (event.useItemInHand() == Event.Result.DENY) { ++ // If we 'insta destroyed' then the client needs to be informed. ++ if (f > 1.0f) { ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ } ++ return; ++ } ++ org.bukkit.event.block.BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, blockposition.getX(), blockposition.getY(), blockposition.getZ(), this.player.inventory.getItemInHand(), f >= 1.0f); ++ ++ if (blockEvent.isCancelled()) { ++ // Let the client know the block still exists ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ return; + } + ++ if (blockEvent.getInstaBreak()) { ++ f = 2.0f; ++ } ++ // CraftBukkit end ++ + if (block.getMaterial() != Material.AIR && f >= 1.0F) { + this.breakBlock(blockposition); + } else { +@@ -146,6 +201,7 @@ + + public void a(BlockPosition blockposition) { + if (blockposition.equals(this.f)) { ++ this.currentTick = MinecraftServer.currentTick; // CraftBukkit + int i = this.currentTick - this.lastDigTick; + Block block = this.world.getType(blockposition).getBlock(); + +@@ -163,6 +219,10 @@ + this.j = this.lastDigTick; + } + } ++ // CraftBukkit start - Force block reset to client ++ } else { ++ this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ // CraftBukkit end + } + + } +@@ -186,12 +246,72 @@ + } + + public boolean breakBlock(BlockPosition blockposition) { +- if (this.gamemode.d() && this.player.bz() != null && this.player.bz().getItem() instanceof ItemSword) { ++ // CraftBukkit start - fire BlockBreakEvent ++ BlockBreakEvent event = null; ++ ++ if (this.player instanceof EntityPlayer) { ++ org.bukkit.block.Block block = this.world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ ++ // Sword + Creative mode pre-cancel ++ boolean isSwordNoBreak = this.gamemode.d() && this.player.bz() != null && this.player.bz().getItem() instanceof ItemSword; ++ ++ // Tell client the block is gone immediately then process events ++ // Don't tell the client if its a creative sword break because its not broken! ++ if (world.getTileEntity(blockposition) == null && !isSwordNoBreak) { ++ PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(this.world, blockposition); ++ packet.block = Blocks.AIR.getBlockData(); ++ ((EntityPlayer) this.player).playerConnection.sendPacket(packet); ++ } ++ ++ event = new BlockBreakEvent(block, this.player.getBukkitEntity()); ++ ++ // Sword + Creative mode pre-cancel ++ event.setCancelled(isSwordNoBreak); ++ ++ // Calculate default block experience ++ IBlockData nmsData = this.world.getType(blockposition); ++ Block nmsBlock = nmsData.getBlock(); ++ ++ if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.b(nmsBlock)) { ++ // Copied from block.a(World world, EntityHuman entityhuman, BlockPosition blockposition, IBlockData iblockdata, TileEntity tileentity) ++ if (!(nmsBlock.G() && EnchantmentManager.hasSilkTouchEnchantment(this.player))) { ++ int data = block.getData(); ++ int bonusLevel = EnchantmentManager.getBonusBlockLootEnchantmentLevel(this.player); ++ ++ event.setExpToDrop(nmsBlock.getExpDrop(this.world, nmsData, bonusLevel)); ++ } ++ } ++ ++ this.world.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ if (isSwordNoBreak) { ++ return false; ++ } ++ // Let the client know the block still exists ++ ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(this.world, blockposition)); ++ // Update any tile entity data for this block ++ TileEntity tileentity = this.world.getTileEntity(blockposition); ++ if (tileentity != null) { ++ this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); ++ } ++ return false; ++ } ++ } ++ if (false && this.gamemode.d() && this.player.bz() != null && this.player.bz().getItem() instanceof ItemSword) { + return false; + } else { + IBlockData iblockdata = this.world.getType(blockposition); ++ if (iblockdata.getBlock() == Blocks.AIR) return false; // CraftBukkit - A plugin set block to air without cancelling + TileEntity tileentity = this.world.getTileEntity(blockposition); +- ++ ++ // CraftBukkit start - Special case skulls, their item data comes from a tile entity ++ if (iblockdata.getBlock() == Blocks.SKULL && !this.isCreative()) { ++ iblockdata.getBlock().dropNaturally(world, blockposition, iblockdata, 1.0F, 0); ++ return this.c(blockposition); ++ } ++ // CraftBukkit end ++ + if (this.gamemode.c()) { + if (this.gamemode == EnumGamemode.SPECTATOR) { + return false; +@@ -229,7 +349,13 @@ + if (flag && flag1) { + iblockdata.getBlock().a(this.world, this.player, blockposition, iblockdata, tileentity); + } ++ } ++ ++ // CraftBukkit start - Drop event experience ++ if (flag && event != null) { ++ iblockdata.getBlock().dropExperience(this.world, blockposition, event.getExpToDrop()); + } ++ // CraftBukkit end + + return flag; + } +@@ -268,6 +394,7 @@ + } + + public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2) { ++ /* CraftBukkit start - whole method + if (this.gamemode == EnumGamemode.SPECTATOR) { + TileEntity tileentity = world.getTileEntity(blockposition); + +@@ -312,6 +439,75 @@ + return itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); + } + } ++ // Interract event */ ++ IBlockData blockdata = world.getType(blockposition); ++ boolean result = false; ++ if (blockdata.getBlock() != Blocks.AIR) { ++ boolean cancelledBlock = false; ++ ++ if (this.gamemode == EnumGamemode.SPECTATOR) { ++ TileEntity tileentity = world.getTileEntity(blockposition); ++ cancelledBlock = !(tileentity instanceof ITileInventory || tileentity instanceof IInventory); ++ } ++ ++ PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, blockposition, enumdirection, itemstack, cancelledBlock); ++ ++ if (event.useInteractedBlock() == Event.Result.DENY) { ++ // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. ++ if (blockdata.getBlock() instanceof BlockDoor) { ++ boolean bottom = blockdata.get(BlockDoor.HALF) == EnumDoorHalf.LOWER; ++ ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(world, bottom ? blockposition.up() : blockposition.down())); ++ } ++ result = (event.useItemInHand() != Event.Result.ALLOW); ++ } else if (this.gamemode == EnumGamemode.SPECTATOR) { ++ TileEntity tileentity = world.getTileEntity(blockposition); ++ ++ if (tileentity instanceof ITileInventory) { ++ Block block = world.getType(blockposition).getBlock(); ++ ITileInventory itileinventory = (ITileInventory) tileentity; ++ ++ if (itileinventory instanceof TileEntityChest && block instanceof BlockChest) { ++ itileinventory = ((BlockChest) block).d(world, blockposition); ++ } ++ ++ if (itileinventory != null) { ++ entityhuman.openContainer(itileinventory); ++ return true; ++ } ++ } else if (tileentity instanceof IInventory) { ++ entityhuman.openContainer((IInventory) tileentity); ++ return true; ++ } ++ ++ return false; ++ } else if (!entityhuman.isSneaking() || itemstack == null) { ++ result = blockdata.getBlock().interact(world, blockposition, blockdata, entityhuman, enumdirection, f, f1, f2); ++ } ++ ++ if (itemstack != null && !result) { ++ int j1 = itemstack.getData(); ++ int k1 = itemstack.count; ++ ++ result = itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); ++ ++ // The item count should not decrement in Creative mode. ++ if (this.isCreative()) { ++ itemstack.setData(j1); ++ itemstack.count = k1; ++ } ++ } ++ ++ // If we have 'true' and no explicit deny *or* an explicit allow -- run the item part of the hook ++ if (itemstack != null && ((!result && event.useItemInHand() != Event.Result.DENY) || event.useItemInHand() == Event.Result.ALLOW)) { ++ if (itemstack.getItem() instanceof ItemBucket) { ++ this.useItem(entityhuman, world, itemstack); ++ } else { ++ itemstack.placeItem(entityhuman, world, blockposition, enumdirection, f, f1, f2); ++ } ++ } ++ } ++ return result; ++ // CraftBukkit end + } + + public void a(WorldServer worldserver) { diff --git a/nms-patches/PlayerInventory.patch b/nms-patches/PlayerInventory.patch new file mode 100644 index 00000000..e4b36670 --- /dev/null +++ b/nms-patches/PlayerInventory.patch @@ -0,0 +1,100 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerInventory.java 2014-11-27 08:59:46.861421142 +1100 ++++ src/main/java/net/minecraft/server/PlayerInventory.java 2014-11-27 08:42:10.172850872 +1100 +@@ -2,6 +2,13 @@ + + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class PlayerInventory implements IInventory { + + public ItemStack[] items = new ItemStack[36]; +@@ -10,6 +17,39 @@ + public EntityHuman player; + private ItemStack f; + public boolean e; ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public ItemStack[] getArmorContents() { ++ return this.armor; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public org.bukkit.inventory.InventoryHolder getOwner() { ++ return this.player.getBukkitEntity(); ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public PlayerInventory(EntityHuman entityhuman) { + this.player = entityhuman; +@@ -42,6 +82,22 @@ + + return -1; + } ++ ++ // CraftBukkit start - Watch method above! :D ++ public int canHold(ItemStack itemstack) { ++ int remains = itemstack.count; ++ for (int i = 0; i < this.items.length; ++i) { ++ if (this.items[i] == null) return itemstack.count; ++ ++ // Taken from firstPartial(ItemStack) ++ if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { ++ remains -= (this.items[i].getMaxStackSize() < this.getMaxStackSize() ? this.items[i].getMaxStackSize() : this.getMaxStackSize()) - this.items[i].count; ++ } ++ if (remains <= 0) return itemstack.count; ++ } ++ return itemstack.count - remains; ++ } ++ // CraftBukkit end + + public int getFirstEmptySlotIndex() { + for (int i = 0; i < this.items.length; ++i) { +@@ -382,7 +438,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean b(Block block) { +@@ -458,6 +514,11 @@ + } + + public ItemStack getCarried() { ++ // CraftBukkit start ++ if (this.f != null && this.f.count == 0) { ++ this.setCarried(null); ++ } ++ // CraftBukkit end + return this.f; + } + diff --git a/nms-patches/PlayerList.patch b/nms-patches/PlayerList.patch new file mode 100644 index 00000000..f38a5b9d --- /dev/null +++ b/nms-patches/PlayerList.patch @@ -0,0 +1,788 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerList.java 2014-11-27 08:59:46.861421142 +1100 ++++ src/main/java/net/minecraft/server/PlayerList.java 2014-11-27 08:42:10.160850895 +1100 +@@ -18,6 +18,25 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; ++ ++import org.bukkit.Bukkit; ++import org.bukkit.Location; ++import org.bukkit.TravelAgent; ++import org.bukkit.entity.Player; ++import org.bukkit.event.player.PlayerChangedWorldEvent; ++import org.bukkit.event.player.PlayerPortalEvent; ++import org.bukkit.event.player.PlayerJoinEvent; ++import org.bukkit.event.player.PlayerLoginEvent; ++import org.bukkit.event.player.PlayerQuitEvent; ++import org.bukkit.event.player.PlayerRespawnEvent; ++import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; ++import org.bukkit.util.Vector; ++// CraftBukkit end ++ + public abstract class PlayerList { + + public static final File a = new File("banned-players.json"); +@@ -27,7 +46,7 @@ + private static final Logger h = LogManager.getLogger(); + private static final SimpleDateFormat i = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); + private final MinecraftServer server; +- public final List players = Lists.newArrayList(); ++ public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety + public final Map f = Maps.newHashMap(); + private final GameProfileBanList k; + private final IpBanList l; +@@ -42,7 +61,15 @@ + private boolean t; + private int u; + ++ // CraftBukkit start ++ private CraftServer cserver; ++ + public PlayerList(MinecraftServer minecraftserver) { ++ this.cserver = minecraftserver.server = new CraftServer(minecraftserver, this); ++ minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); ++ minecraftserver.reader.addCompleter(new org.bukkit.craftbukkit.command.ConsoleCommandCompleter(minecraftserver.server)); ++ // CraftBukkit end ++ + this.k = new GameProfileBanList(PlayerList.a); + this.l = new IpBanList(PlayerList.b); + this.operators = new OpList(PlayerList.c); +@@ -71,7 +98,8 @@ + s1 = networkmanager.getSocketAddress().toString(); + } + +- PlayerList.h.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); ++ // CraftBukkit - Moved message to after join ++ // PlayerList.h.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); + WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); + WorldData worlddata = worldserver.getWorldData(); + BlockPosition blockposition = worldserver.getSpawn(); +@@ -80,6 +108,7 @@ + PlayerConnection playerconnection = new PlayerConnection(this.server, networkmanager, entityplayer); + + playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worlddata.isHardcore(), worldserver.worldProvider.getDimension(), worldserver.getDifficulty(), this.getMaxPlayers(), worlddata.getType(), worldserver.getGameRules().getBoolean("reducedDebugInfo"))); ++ entityplayer.getBukkitEntity().sendSupportedChannels(); // CraftBukkit + playerconnection.sendPacket(new PacketPlayOutCustomPayload("MC|Brand", (new PacketDataSerializer(Unpooled.buffer())).a(this.getServer().getServerModName()))); + playerconnection.sendPacket(new PacketPlayOutServerDifficulty(worlddata.y(), worlddata.z())); + playerconnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition)); +@@ -89,6 +118,7 @@ + entityplayer.getStatisticManager().updateStatistics(entityplayer); + this.sendScoreboard((ScoreboardServer) worldserver.getScoreboard(), entityplayer); + this.server.aF(); ++ /* CraftBukkit start - login message is handled in the event + ChatMessage chatmessage; + + if (!entityplayer.getName().equalsIgnoreCase(s)) { +@@ -99,7 +129,9 @@ + + chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); + this.sendMessage(chatmessage); ++ // CraftBukkit end */ + this.onPlayerJoin(entityplayer); ++ worldserver = server.getWorldServer(entityplayer.dimension); // CraftBukkit - Update in case join event changed it + playerconnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); + this.b(entityplayer, worldserver); + if (this.server.getResourcePack().length() > 0) { +@@ -126,6 +158,8 @@ + } + } + ++ // CraftBukkit - Moved from above, added world ++ PlayerList.h.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at ([" + entityplayer.world.worldData.getName() + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); + } + + public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { +@@ -158,6 +192,7 @@ + } + + public void setPlayerFileData(WorldServer[] aworldserver) { ++ if (playerFileData != null) return; // CraftBukkit + this.playerFileData = aworldserver[0].getDataManager().getPlayerFileData(); + aworldserver[0].af().a((IWorldBorderListener) (new WorldBorderListener(this))); + } +@@ -178,7 +213,7 @@ + } + + public NBTTagCompound a(EntityPlayer entityplayer) { +- NBTTagCompound nbttagcompound = this.server.worldServer[0].getWorldData().i(); ++ NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); // CraftBukkit + NBTTagCompound nbttagcompound1; + + if (entityplayer.getName().equals(this.server.R()) && nbttagcompound != null) { +@@ -205,30 +240,69 @@ + public void onPlayerJoin(EntityPlayer entityplayer) { + this.players.add(entityplayer); + this.f.put(entityplayer.getUniqueID(), entityplayer); +- this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer})); ++ // this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer})); // CraftBukkit - replaced with loop below + WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); + +- worldserver.addEntity(entityplayer); +- this.a(entityplayer, (WorldServer) null); ++ // CraftBukkit start ++ PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " joined the game."); ++ cserver.getPluginManager().callEvent(playerJoinEvent); ++ ++ String joinMessage = playerJoinEvent.getJoinMessage(); ++ ++ if (joinMessage != null && joinMessage.length() > 0) { ++ for (IChatBaseComponent line : org.bukkit.craftbukkit.util.CraftChatMessage.fromString(joinMessage)) { ++ server.getPlayerList().sendAll(new PacketPlayOutChat(line)); ++ } ++ } ++ ++ ChunkIOExecutor.adjustPoolSize(getPlayerCount()); ++ // CraftBukkit end ++ ++ // CraftBukkit start - sendAll above replaced with this loop ++ PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, entityplayer); + + for (int i = 0; i < this.players.size(); ++i) { + EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); + ++ if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { ++ entityplayer1.playerConnection.sendPacket(packet); ++ } ++ ++ if (!entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { ++ continue; ++ } ++ + entityplayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, new EntityPlayer[] { entityplayer1})); + } ++ // CraftBukkit end + ++ // CraftBukkit start - Only add if the player wasn't moved in the event ++ if (entityplayer.world == worldserver && !worldserver.players.contains(entityplayer)) { ++ worldserver.addEntity(entityplayer); ++ this.a(entityplayer, (WorldServer) null); ++ } ++ // CraftBukkit end + } + + public void d(EntityPlayer entityplayer) { + entityplayer.u().getPlayerChunkMap().movePlayer(entityplayer); + } + +- public void disconnect(EntityPlayer entityplayer) { ++ public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string + entityplayer.b(StatisticList.f); ++ ++ // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it ++ org.bukkit.craftbukkit.event.CraftEventFactory.handleInventoryCloseEvent(entityplayer); ++ ++ PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game."); ++ cserver.getPluginManager().callEvent(playerQuitEvent); ++ entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); ++ // CraftBukkit end ++ + this.savePlayerFile(entityplayer); + WorldServer worldserver = entityplayer.u(); + +- if (entityplayer.vehicle != null) { ++ if (entityplayer.vehicle != null && !(entityplayer.vehicle instanceof EntityPlayer)) { // CraftBukkit - Don't remove players + worldserver.removeEntity(entityplayer.vehicle); + PlayerList.h.debug("removing player mount"); + } +@@ -238,13 +312,40 @@ + this.players.remove(entityplayer); + this.f.remove(entityplayer.getUniqueID()); + this.o.remove(entityplayer.getUniqueID()); +- this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { entityplayer})); ++ // CraftBukkit start ++ // this.sendAll(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, new EntityPlayer[] { entityplayer})); ++ PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, entityplayer); ++ for (int i = 0; i < players.size(); i++) { ++ EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); ++ ++ if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { ++ entityplayer1.playerConnection.sendPacket(packet); ++ } else { ++ entityplayer1.getBukkitEntity().removeDisconnectingPlayer(entityplayer.getBukkitEntity()); ++ } ++ } ++ // This removes the scoreboard (and player reference) for the specific player in the manager ++ cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); ++ // CraftBukkit end ++ ++ ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit ++ ++ return playerQuitEvent.getQuitMessage(); // CraftBukkit + } + +- public String attemptLogin(SocketAddress socketaddress, GameProfile gameprofile) { ++ // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer ++ public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gameprofile, String hostname) { ++ // Instead of kicking then returning, we need to store the kick reason ++ // in the event, check with plugins to see if it's ok, and THEN kick ++ // depending on the outcome. ++ SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); ++ ++ EntityPlayer entity = new EntityPlayer(server, server.getWorldServer(0), gameprofile, new PlayerInteractManager(server.getWorldServer(0))); ++ Player player = entity.getBukkitEntity(); ++ PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); + String s; + +- if (this.k.isBanned(gameprofile)) { ++ if (getProfileBans().isBanned(gameprofile) && !getProfileBans().get(gameprofile).hasExpired()) { + GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.k.get(gameprofile); + + s = "You are banned from this server!\nReason: " + gameprofilebanentry.getReason(); +@@ -252,10 +353,12 @@ + s = s + "\nYour ban will be removed on " + PlayerList.i.format(gameprofilebanentry.getExpires()); + } + +- return s; ++ // return s; ++ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); + } else if (!this.isWhitelisted(gameprofile)) { +- return "You are not white-listed on this server!"; +- } else if (this.l.isBanned(socketaddress)) { ++ // return "You are not white-listed on this server!"; ++ event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); ++ } else if (getIPBans().isBanned(socketaddress) && !getIPBans().get(socketaddress).hasExpired()) { + IpBanEntry ipbanentry = this.l.get(socketaddress); + + s = "Your IP address is banned from this server!\nReason: " + ipbanentry.getReason(); +@@ -263,13 +366,24 @@ + s = s + "\nYour ban will be removed on " + PlayerList.i.format(ipbanentry.getExpires()); + } + +- return s; ++ // return s; ++ event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); + } else { +- return this.players.size() >= this.maxPlayers ? "The server is full!" : null; ++ // return this.players.size() >= this.maxPlayers ? "The server is full!" : null; ++ if (this.players.size() >= this.maxPlayers) { ++ event.disallow(PlayerLoginEvent.Result.KICK_FULL, "The server is full"); ++ } ++ } ++ ++ cserver.getPluginManager().callEvent(event); ++ if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { ++ loginlistener.disconnect(event.getKickMessage()); ++ return null; + } ++ return entity; + } + +- public EntityPlayer processLogin(GameProfile gameprofile) { ++ public EntityPlayer processLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer + UUID uuid = EntityHuman.a(gameprofile); + ArrayList arraylist = Lists.newArrayList(); + +@@ -289,6 +403,7 @@ + entityplayer.playerConnection.disconnect("You logged in from another location"); + } + ++ /* CraftBukkit start + Object object; + + if (this.server.W()) { +@@ -298,17 +413,25 @@ + } + + return new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, (PlayerInteractManager) object); ++ // */ ++ return player; ++ // CraftBukkit end + } + ++ // CraftBukkit start + public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { ++ return this.moveToWorld(entityplayer, i, flag, null, true); ++ } ++ public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) { + entityplayer.u().getTracker().untrackPlayer(entityplayer); +- entityplayer.u().getTracker().untrackEntity(entityplayer); ++ // entityplayer.u().getTracker().untrackEntity(entityplayer); // CraftBukkit + entityplayer.u().getPlayerChunkMap().removePlayer(entityplayer); + this.players.remove(entityplayer); + this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer); + BlockPosition blockposition = entityplayer.getBed(); + boolean flag1 = entityplayer.isRespawnForced(); + ++ /* CraftBukkit start + entityplayer.dimension = i; + Object object; + +@@ -319,80 +442,270 @@ + } + + EntityPlayer entityplayer1 = new EntityPlayer(this.server, this.server.getWorldServer(entityplayer.dimension), entityplayer.getProfile(), (PlayerInteractManager) object); ++ // */ ++ EntityPlayer entityplayer1 = entityplayer; ++ org.bukkit.World fromWorld = entityplayer.getBukkitEntity().getWorld(); ++ entityplayer.viewingCredits = false; ++ // CraftBukkit end + + entityplayer1.playerConnection = entityplayer.playerConnection; + entityplayer1.copyTo(entityplayer, flag); + entityplayer1.d(entityplayer.getId()); + entityplayer1.o(entityplayer); +- WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); ++ // WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - handled later + +- this.a(entityplayer1, entityplayer, worldserver); ++ // this.a(entityplayer1, entityplayer, worldserver); // CraftBukkit - removed + BlockPosition blockposition1; + +- if (blockposition != null) { +- blockposition1 = EntityHuman.getBed(this.server.getWorldServer(entityplayer.dimension), blockposition, flag1); +- if (blockposition1 != null) { +- entityplayer1.setPositionRotation((double) ((float) blockposition1.getX() + 0.5F), (double) ((float) blockposition1.getY() + 0.1F), (double) ((float) blockposition1.getZ() + 0.5F), 0.0F, 0.0F); +- entityplayer1.setRespawnPosition(blockposition, flag1); +- } else { +- entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0.0F)); ++ // CraftBukkit start - fire PlayerRespawnEvent ++ if (location == null) { ++ boolean isBedSpawn = false; ++ CraftWorld cworld = (CraftWorld) this.server.server.getWorld(entityplayer.spawnWorld); ++ if (cworld != null && blockposition != null) { ++ blockposition1 = EntityHuman.getBed(cworld.getHandle(), blockposition, flag1); ++ if (blockposition1 != null) { ++ isBedSpawn = true; ++ location = new Location(cworld, blockposition1.getX() + 0.5, blockposition1.getY(), blockposition1.getZ() + 0.5); ++ } else { ++ entityplayer1.setRespawnPosition(null, true); ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0.0F)); ++ } + } ++ ++ if (location == null) { ++ cworld = (CraftWorld) this.server.server.getWorlds().get(0); ++ blockposition = cworld.getHandle().getSpawn(); ++ location = new Location(cworld, blockposition.getX() + 0.5, blockposition.getY(), blockposition.getZ() + 0.5); ++ } ++ ++ Player respawnPlayer = cserver.getPlayer(entityplayer1); ++ PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn); ++ cserver.getPluginManager().callEvent(respawnEvent); ++ ++ location = respawnEvent.getRespawnLocation(); ++ entityplayer.reset(); ++ } else { ++ location.setWorld(server.getWorldServer(i).getWorld()); + } ++ WorldServer worldserver = ((CraftWorld) location.getWorld()).getHandle(); ++ entityplayer1.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); ++ // CraftBukkit end + + worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4); + +- while (!worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { ++ while (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.getBoundingBox()).isEmpty() && entityplayer1.locY < 256.0D) { // CraftBukkit + entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); + } + +- entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(entityplayer1.dimension, entityplayer1.world.getDifficulty(), entityplayer1.world.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); ++ // CraftBukkit start ++ byte actualDimension = (byte) (worldserver.getWorld().getEnvironment().getId()); ++ // Force the client to refresh their chunk cache ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn((byte) (actualDimension >= 0 ? -1 : 0), worldserver.getDifficulty(), worldserver.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); ++ entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(actualDimension, worldserver.getDifficulty(), worldserver.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); ++ entityplayer1.spawnIn(worldserver); ++ entityplayer1.dead = false; ++ entityplayer1.playerConnection.teleport(new Location(worldserver.getWorld(), entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch)); ++ entityplayer1.setSneaking(false); + blockposition1 = worldserver.getSpawn(); +- entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); ++ // entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); ++ // CraftBukkit end + entityplayer1.playerConnection.sendPacket(new PacketPlayOutSpawnPosition(blockposition1)); + entityplayer1.playerConnection.sendPacket(new PacketPlayOutExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); + this.b(entityplayer1, worldserver); +- worldserver.getPlayerChunkMap().addPlayer(entityplayer1); +- worldserver.addEntity(entityplayer1); +- this.players.add(entityplayer1); +- this.f.put(entityplayer1.getUniqueID(), entityplayer1); +- entityplayer1.syncInventory(); ++ if (!entityplayer.playerConnection.isDisconnected()) { ++ worldserver.getPlayerChunkMap().addPlayer(entityplayer1); ++ worldserver.addEntity(entityplayer1); ++ this.players.add(entityplayer1); ++ this.f.put(entityplayer1.getUniqueID(), entityplayer1); ++ } ++ // Added from changeDimension ++ updateClient(entityplayer); // Update health, etc... ++ entityplayer.updateAbilities(); ++ for (Object o1 : entityplayer.getEffects()) { ++ MobEffect mobEffect = (MobEffect) o1; ++ entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobEffect)); ++ } ++ // entityplayer1.syncInventory(); ++ // CraftBukkit end + entityplayer1.setHealth(entityplayer1.getHealth()); ++ ++ // CraftBukkit start ++ // Don't fire on respawn ++ if (fromWorld != location.getWorld()) { ++ PlayerChangedWorldEvent event = new PlayerChangedWorldEvent(entityplayer.getBukkitEntity(), fromWorld); ++ server.server.getPluginManager().callEvent(event); ++ } ++ ++ // Save player file again if they were disconnected ++ if (entityplayer.playerConnection.isDisconnected()) { ++ this.savePlayerFile(entityplayer); ++ } ++ // CraftBukkit end ++ + return entityplayer1; + } + +- public void changeDimension(EntityPlayer entityplayer, int i) { +- int j = entityplayer.dimension; +- WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); ++ // CraftBukkit start - Replaced the standard handling of portals with a more customised method. ++ public void changeDimension(EntityPlayer entityplayer, int i, TeleportCause cause) { ++ WorldServer exitWorld = null; ++ if (entityplayer.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds ++ // only target existing worlds (compensate for allow-nether/allow-end as false) ++ for (WorldServer world : this.server.worlds) { ++ if (world.dimension == i) { ++ exitWorld = world; ++ } ++ } ++ } + +- entityplayer.dimension = i; +- WorldServer worldserver1 = this.server.getWorldServer(entityplayer.dimension); ++ Location enter = entityplayer.getBukkitEntity().getLocation(); ++ Location exit = null; ++ boolean useTravelAgent = false; // don't use agent for custom worlds or return from THE_END ++ if (exitWorld != null) { ++ if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { ++ // THE_END -> NORMAL; use bed if available, otherwise default spawn ++ exit = ((org.bukkit.craftbukkit.entity.CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); ++ if (exit == null || ((CraftWorld) exit.getWorld()).getHandle().dimension != 0) { ++ exit = exitWorld.getWorld().getSpawnLocation(); ++ } ++ } else { ++ // NORMAL <-> NETHER or NORMAL -> THE_END ++ exit = this.calculateTarget(enter, exitWorld); ++ useTravelAgent = true; ++ } ++ } + +- entityplayer.playerConnection.sendPacket(new PacketPlayOutRespawn(entityplayer.dimension, entityplayer.world.getDifficulty(), entityplayer.world.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); +- worldserver.removeEntity(entityplayer); +- entityplayer.dead = false; +- this.changeWorld(entityplayer, j, worldserver, worldserver1); +- this.a(entityplayer, worldserver); +- entityplayer.playerConnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); +- entityplayer.playerInteractManager.a(worldserver1); +- this.b(entityplayer, worldserver1); +- this.updateClient(entityplayer); +- Iterator iterator = entityplayer.getEffects().iterator(); ++ TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins ++ PlayerPortalEvent event = new PlayerPortalEvent(entityplayer.getBukkitEntity(), enter, exit, agent, cause); ++ event.useTravelAgent(useTravelAgent); ++ Bukkit.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled() || event.getTo() == null) { ++ return; ++ } ++ ++ exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); ++ if (exit == null) { ++ return; ++ } ++ exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); ++ ++ Vector velocity = entityplayer.getBukkitEntity().getVelocity(); ++ boolean before = exitWorld.chunkProviderServer.forceChunkLoad; ++ exitWorld.chunkProviderServer.forceChunkLoad = true; ++ exitWorld.getTravelAgent().adjustExit(entityplayer, exit, velocity); ++ exitWorld.chunkProviderServer.forceChunkLoad = before; ++ ++ this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, false); // Vanilla doesn't check for suffocation when handling portals, so neither should we ++ if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) { ++ entityplayer.getBukkitEntity().setVelocity(velocity); ++ } ++ } + +- while (iterator.hasNext()) { +- MobEffect mobeffect = (MobEffect) iterator.next(); ++ public void changeWorld(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { ++ // CraftBukkit start - Split into modular functions ++ Location exit = calculateTarget(entity.getBukkitEntity().getLocation(), worldserver1); ++ repositionEntity(entity, exit, true); ++ } ++ ++ // Copy of original changeWorld(Entity, int, WorldServer, WorldServer) method with only location calculation logic ++ public Location calculateTarget(Location enter, World target) { ++ WorldServer worldserver = ((CraftWorld) enter.getWorld()).getHandle(); ++ WorldServer worldserver1 = ((CraftWorld) target.getWorld()).getHandle(); ++ int i = worldserver.dimension; ++ ++ double y = enter.getY(); ++ float yaw = enter.getYaw(); ++ float pitch = enter.getPitch(); ++ double d0 = enter.getX(); ++ double d1 = enter.getZ(); ++ double d2 = 8.0D; ++ /* ++ double d0 = entity.locX; ++ double d1 = entity.locZ; ++ double d2 = 8.0D; ++ float f = entity.yaw; ++ ++ worldserver.methodProfiler.a("moving"); ++ */ ++ if (worldserver1.dimension == -1) { ++ d0 = MathHelper.a(d0 / d2, worldserver1.af().b() + 16.0D, worldserver1.af().d() - 16.0D); ++ d1 = MathHelper.a(d1 / d2, worldserver1.af().c() + 16.0D, worldserver1.af().e() - 16.0D); ++ /* ++ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ */ ++ } else if (worldserver1.dimension == 0) { ++ d0 = MathHelper.a(d0 * d2, worldserver1.af().b() + 16.0D, worldserver1.af().d() - 16.0D); ++ d1 = MathHelper.a(d1 * d2, worldserver1.af().c() + 16.0D, worldserver1.af().e() - 16.0D); ++ /* ++ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ */ ++ } else { ++ BlockPosition blockposition; ++ ++ if (i == 1) { ++ // use default NORMAL world spawn instead of target ++ worldserver1 = this.server.worlds.get(0); ++ blockposition = worldserver1.getSpawn(); ++ } else { ++ blockposition = worldserver1.getDimensionSpawn(); ++ } ++ ++ d0 = (double) blockposition.getX(); ++ y = (double) blockposition.getY(); ++ d1 = (double) blockposition.getZ(); ++ /* ++ entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ */ ++ } + +- entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobeffect)); ++ // worldserver.methodProfiler.b(); ++ if (i != 1) { ++ worldserver.methodProfiler.a("placing"); ++ d0 = (double) MathHelper.clamp((int) d0, -29999872, 29999872); ++ d1 = (double) MathHelper.clamp((int) d1, -29999872, 29999872); ++ /* ++ if (entity.isAlive()) { ++ entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ worldserver1.getTravelAgent().a(entity, f); ++ worldserver1.addEntity(entity); ++ worldserver1.entityJoinedWorld(entity, false); ++ } ++ ++ worldserver.methodProfiler.b(); ++ */ + } + ++ // entity.spawnIn(worldserver1); ++ return new Location(worldserver1.getWorld(), d0, y, d1, yaw, pitch); + } + +- public void changeWorld(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { ++ // copy of original a(Entity, int, WorldServer, WorldServer) method with only entity repositioning logic ++ public void repositionEntity(Entity entity, Location exit, boolean portal) { ++ WorldServer worldserver = (WorldServer) entity.world; ++ WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); ++ int i = worldserver.dimension; ++ ++ /* + double d0 = entity.locX; + double d1 = entity.locZ; + double d2 = 8.0D; + float f = entity.yaw; + + worldserver.methodProfiler.a("moving"); ++ */ ++ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); ++ if (entity.isAlive()) { ++ worldserver.entityJoinedWorld(entity, false); ++ } ++ /* + if (entity.dimension == -1) { + d0 = MathHelper.a(d0 / d2, worldserver1.af().b() + 16.0D, worldserver1.af().d() - 16.0D); + d1 = MathHelper.a(d1 / d2, worldserver1.af().c() + 16.0D, worldserver1.af().e() - 16.0D); +@@ -411,6 +724,8 @@ + BlockPosition blockposition; + + if (i == 1) { ++ // use default NORMAL world spawn instead of target ++ worldserver1 = this.server.worlds.get(0); + blockposition = worldserver1.getSpawn(); + } else { + blockposition = worldserver1.getDimensionSpawn(); +@@ -424,15 +739,26 @@ + worldserver.entityJoinedWorld(entity, false); + } + } ++ */ + + worldserver.methodProfiler.b(); + if (i != 1) { + worldserver.methodProfiler.a("placing"); ++ /* + d0 = (double) MathHelper.clamp((int) d0, -29999872, 29999872); + d1 = (double) MathHelper.clamp((int) d1, -29999872, 29999872); ++ */ + if (entity.isAlive()) { +- entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); +- worldserver1.getTravelAgent().a(entity, f); ++ // entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); ++ // worldserver1.getTravelAgent().a(entity, f); ++ if (portal) { ++ Vector velocity = entity.getBukkitEntity().getVelocity(); ++ worldserver1.getTravelAgent().adjustExit(entity, exit, velocity); ++ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); ++ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { ++ entity.getBukkitEntity().setVelocity(velocity); ++ } ++ } + worldserver1.addEntity(entity); + worldserver1.entityJoinedWorld(entity, false); + } +@@ -441,6 +767,7 @@ + } + + entity.spawnIn(worldserver1); ++ // CraftBukkit end + } + + public void tick() { +@@ -549,10 +876,24 @@ + + public void addOp(GameProfile gameprofile) { + this.operators.add(new OpListEntry(gameprofile, this.server.p())); ++ ++ // CraftBukkit start ++ Player player = server.server.getPlayer(gameprofile.getId()); ++ if (player != null) { ++ player.recalculatePermissions(); ++ } ++ // CraftBukkit end + } + + public void removeOp(GameProfile gameprofile) { + this.operators.remove(gameprofile); ++ ++ // CraftBukkit start ++ Player player = server.server.getPlayer(gameprofile.getId()); ++ if (player != null) { ++ player.recalculatePermissions(); ++ } ++ // CraftBukkit end + } + + public boolean isWhitelisted(GameProfile gameprofile) { +@@ -560,7 +901,7 @@ + } + + public boolean isOp(GameProfile gameprofile) { +- return this.operators.d(gameprofile) || this.server.S() && this.server.worldServer[0].getWorldData().v() && this.server.R().equalsIgnoreCase(gameprofile.getName()) || this.t; ++ return this.operators.d(gameprofile) || this.server.S() && this.server.worlds.get(0).getWorldData().v() && this.server.R().equalsIgnoreCase(gameprofile.getName()) || this.t; // CraftBukkit + } + + public EntityPlayer getPlayer(String s) { +@@ -587,6 +928,12 @@ + for (int j = 0; j < this.players.size(); ++j) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); + ++ // CraftBukkit start - Test if player receiving packet can see the source of the packet ++ if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { ++ continue; ++ } ++ // CraftBukkit end ++ + if (entityplayer != entityhuman && entityplayer.dimension == i) { + double d4 = d0 - entityplayer.locX; + double d5 = d1 - entityplayer.locY; +@@ -634,21 +981,25 @@ + public void reloadWhitelist() {} + + public void b(EntityPlayer entityplayer, WorldServer worldserver) { +- WorldBorder worldborder = this.server.worldServer[0].af(); ++ WorldBorder worldborder = this.server.worlds.get(0).af(); // CraftBukkit + + entityplayer.playerConnection.sendPacket(new PacketPlayOutWorldBorder(worldborder, EnumWorldBorderAction.INITIALIZE)); + entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))); + if (worldserver.S()) { +- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); +- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); +- entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); ++ // CraftBukkit start - handle player weather ++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); ++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); ++ // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); ++ entityplayer.setPlayerWeather(org.bukkit.WeatherType.DOWNFALL, false); ++ // CraftBukkit end + } + + } + + public void updateClient(EntityPlayer entityplayer) { + entityplayer.updateInventory(entityplayer.defaultContainer); +- entityplayer.triggerHealthUpdate(); ++ // entityplayer.triggerHealthUpdate(); ++ entityplayer.getBukkitEntity().updateScaledHealth(); // CraftBukkit - Update scaled health on respawn and worldchange + entityplayer.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); + } + +@@ -661,7 +1012,7 @@ + } + + public String[] getSeenPlayers() { +- return this.server.worldServer[0].getDataManager().getPlayerFileData().getSeenPlayers(); ++ return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); // CraftBukkit + } + + public boolean getHasWhitelist() { +@@ -711,10 +1062,17 @@ + + public void v() { + for (int i = 0; i < this.players.size(); ++i) { +- ((EntityPlayer) this.players.get(i)).playerConnection.disconnect("Server closed"); ++ ((EntityPlayer) this.players.get(i)).playerConnection.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message + } ++ } + ++ // CraftBukkit start ++ public void sendMessage(IChatBaseComponent[] iChatBaseComponents) { ++ for (IChatBaseComponent component : iChatBaseComponents) { ++ sendMessage(component, true); ++ } + } ++ // CraftBukkit end + + public void sendMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { + this.server.sendMessage(ichatbasecomponent); +@@ -754,11 +1112,10 @@ + public void a(int i) { + this.r = i; + if (this.server.worldServer != null) { +- WorldServer[] aworldserver = this.server.worldServer; +- int j = aworldserver.length; +- +- for (int k = 0; k < j; ++k) { +- WorldServer worldserver = aworldserver[k]; ++ // CraftBukkit start ++ for (int k = 0; k < server.worlds.size(); ++k) { ++ WorldServer worldserver = server.worlds.get(0); ++ // CraftBukkit end + + if (worldserver != null) { + worldserver.getPlayerChunkMap().a(i); diff --git a/nms-patches/PlayerSelector.patch b/nms-patches/PlayerSelector.patch new file mode 100644 index 00000000..e5583a10 --- /dev/null +++ b/nms-patches/PlayerSelector.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PlayerSelector.java 2014-11-27 08:59:46.865421124 +1100 ++++ src/main/java/net/minecraft/server/PlayerSelector.java 2014-11-27 08:42:10.140850934 +1100 +@@ -52,6 +52,11 @@ + } + + public static List getPlayers(ICommandListener icommandlistener, String s, Class oclass) { ++ // CraftBukkit start - disable playerselections for ICommandListeners other than command blocks ++ if (!(icommandlistener instanceof CommandBlockListenerAbstract)) { ++ return com.google.common.collect.ImmutableList.of(); ++ } ++ // CraftBukkit end + Matcher matcher = PlayerSelector.a.matcher(s); + + if (matcher.matches() && icommandlistener.a(1, "@")) { diff --git a/nms-patches/PortalCreator.patch b/nms-patches/PortalCreator.patch new file mode 100644 index 00000000..5bb4eae9 --- /dev/null +++ b/nms-patches/PortalCreator.patch @@ -0,0 +1,102 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PortalCreator.java 2014-11-27 08:59:46.865421124 +1100 ++++ src/main/java/net/minecraft/server/PortalCreator.java 2014-11-27 08:42:10.132850949 +1100 +@@ -1,5 +1,7 @@ + package net.minecraft.server; + ++import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit ++ + public class PortalCreator { + + private final World a; +@@ -10,6 +12,7 @@ + private BlockPosition f; + private int g; + private int h; ++ java.util.Collection<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); // CraftBukkit - add field + + public PortalCreator(World world, BlockPosition blockposition, EnumAxis enumaxis) { + this.a = world; +@@ -60,6 +63,10 @@ + } + + protected int a() { ++ // CraftBukkit start ++ this.blocks.clear(); ++ org.bukkit.World bworld = this.a.getWorld(); ++ // CraftBukkit end + int i; + + label56: +@@ -80,11 +87,21 @@ + block = this.a.getType(blockposition.shift(this.d)).getBlock(); + if (block != Blocks.OBSIDIAN) { + break label56; ++ // CraftBukkit start - add the block to our list ++ } else { ++ BlockPosition pos = blockposition.shift(this.d); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); ++ // CraftBukkit end + } + } else if (i == this.h - 1) { + block = this.a.getType(blockposition.shift(this.c)).getBlock(); + if (block != Blocks.OBSIDIAN) { + break label56; ++ // CraftBukkit start - add the block to our list ++ } else { ++ BlockPosition pos = blockposition.shift(this.c); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); ++ // CraftBukkit end + } + } + } +@@ -94,6 +111,11 @@ + if (this.a.getType(this.f.shift(this.c, i).up(this.g)).getBlock() != Blocks.OBSIDIAN) { + this.g = 0; + break; ++ // CraftBukkit start - add the block to our list ++ } else { ++ BlockPosition pos = this.f.shift(this.c, i).up(this.g); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); ++ // CraftBukkit end + } + } + +@@ -115,15 +137,36 @@ + return this.f != null && this.h >= 2 && this.h <= 21 && this.g >= 3 && this.g <= 21; + } + +- public void c() { ++ // CraftBukkit start - return boolean ++ public boolean c() { ++ org.bukkit.World bworld = this.a.getWorld(); ++ ++ // Copy below for loop + for (int i = 0; i < this.h; ++i) { + BlockPosition blockposition = this.f.shift(this.c, i); + + for (int j = 0; j < this.g; ++j) { +- this.a.setTypeAndData(blockposition.up(j), Blocks.PORTAL.getBlockData().set(BlockPortal.AXIS, this.b), 2); ++ BlockPosition pos = blockposition.up(j); ++ blocks.add(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ())); + } + } + ++ PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE); ++ this.a.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ for (int i = 0; i < this.h; ++i) { ++ BlockPosition blockposition = this.f.shift(this.c, i); ++ ++ for (int j = 0; j < this.g; ++j) { ++ this.a.setTypeAndData(blockposition.up(j), Blocks.PORTAL.getBlockData().set(BlockPortal.AXIS, this.b), 2); ++ } ++ } ++ ++ return true; // Craft Bukkit + } + + public static int a(PortalCreator portalcreator) { diff --git a/nms-patches/PortalTravelAgent.patch b/nms-patches/PortalTravelAgent.patch new file mode 100644 index 00000000..1a6d02d9 --- /dev/null +++ b/nms-patches/PortalTravelAgent.patch @@ -0,0 +1,273 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PortalTravelAgent.java 2014-11-27 08:59:46.869421107 +1100 ++++ src/main/java/net/minecraft/server/PortalTravelAgent.java 2014-11-27 08:42:10.096851020 +1100 +@@ -5,6 +5,12 @@ + import java.util.List; + import java.util.Random; + ++// CraftBukkit start ++import org.bukkit.Location; ++import org.bukkit.event.entity.EntityPortalExitEvent; ++import org.bukkit.util.Vector; ++// CraftBukkit end ++ + public class PortalTravelAgent { + + private final WorldServer a; +@@ -27,8 +33,21 @@ + int i = MathHelper.floor(entity.locX); + int j = MathHelper.floor(entity.locY) - 1; + int k = MathHelper.floor(entity.locZ); ++ // CraftBukkit start - Modularize end portal creation ++ BlockPosition created = this.createEndPortal(entity.locX, entity.locY, entity.locZ); ++ entity.setPositionRotation((double) created.getX(), (double) created.getY(), (double) created.getZ(), entity.yaw, 0.0F); ++ entity.motX = entity.motY = entity.motZ = 0.0D; ++ } ++ } ++ ++ // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal ++ private BlockPosition createEndPortal(double x, double y, double z) { ++ int i = MathHelper.floor(x); ++ int j = MathHelper.floor(y) - 1; ++ int k = MathHelper.floor(z); + byte b0 = 1; + byte b1 = 0; ++ // CraftBukkit end + + for (int l = -2; l <= 2; ++l) { + for (int i1 = -2; i1 <= 2; ++i1) { +@@ -43,16 +62,63 @@ + } + } + +- entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); +- entity.motX = entity.motY = entity.motZ = 0.0D; ++ // CraftBukkit start ++ return new BlockPosition(i, k, k); ++ } ++ ++ // use logic based on creation to verify end portal ++ private BlockPosition findEndPortal(BlockPosition portal) { ++ int i = portal.getX(); ++ int j = portal.getY() - 1; ++ int k = portal.getZ(); ++ byte b0 = 1; ++ byte b1 = 0; ++ ++ for (int l = -2; l <= 2; ++l) { ++ for (int i1 = -2; i1 <= 2; ++i1) { ++ for (int j1 = -1; j1 < 3; ++j1) { ++ int k1 = i + i1 * b0 + l * b1; ++ int l1 = j + j1; ++ int i2 = k + i1 * b1 - l * b0; ++ boolean flag = j1 < 0; ++ ++ if (this.a.getType(new BlockPosition(k1, l1, i2)).getBlock() != (flag ? Blocks.OBSIDIAN : Blocks.AIR)) { ++ return null; ++ } ++ } ++ } + } ++ return new BlockPosition(i, j, k); + } ++ // CraftBukkit end + + public boolean b(Entity entity, float f) { +- boolean flag = true; ++ // CraftBukkit start - Modularize portal search process and entity teleportation ++ BlockPosition found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); ++ if (found == null) { ++ return false; ++ } ++ ++ Location exit = new Location(this.a.getWorld(), found.getX(), found.getY(), found.getZ(), f, entity.pitch); ++ Vector velocity = entity.getBukkitEntity().getVelocity(); ++ this.adjustExit(entity, exit, velocity); ++ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); ++ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { ++ entity.getBukkitEntity().setVelocity(velocity); ++ } ++ return true; ++ } ++ ++ public BlockPosition findPortal(double x, double y, double z, int short1) { ++ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { ++ return this.findEndPortal(this.a.worldProvider.h()); ++ } ++ // CraftBukkit end + double d0 = -1.0D; +- int i = MathHelper.floor(entity.locX); +- int j = MathHelper.floor(entity.locZ); ++ // CraftBukkit start ++ int i = MathHelper.floor(x); ++ int j = MathHelper.floor(z); ++ // CraftBukkit end + boolean flag1 = true; + Object object = BlockPosition.ZERO; + long k = ChunkCoordIntPair.a(i, j); +@@ -65,7 +131,7 @@ + chunkcoordinatesportal.b = this.a.getTime(); + flag1 = false; + } else { +- BlockPosition blockposition = new BlockPosition(entity); ++ BlockPosition blockposition = new BlockPosition(x, y, z); + + for (int l = -128; l <= 128; ++l) { + BlockPosition blockposition1; +@@ -95,7 +161,29 @@ + this.c.put(k, new ChunkCoordinatesPortal(this, (BlockPosition) object, this.a.getTime())); + this.d.add(Long.valueOf(k)); + } ++ // CraftBukkit start - Move entity teleportation logic into exit ++ return (BlockPosition) object; ++ } else { ++ return null; ++ } ++ } + ++ // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method ++ public void adjustExit(Entity entity, Location position, Vector velocity) { ++ Location from = position.clone(); ++ Vector before = velocity.clone(); ++ BlockPosition object = new BlockPosition(position.getBlockX(), position.getBlockY(), position.getBlockZ()); ++ float f = position.getYaw(); ++ ++ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { ++ // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); ++ // entity.motX = entity.motY = entity.motZ = 0.0D; ++ position.setPitch(0.0F); ++ velocity.setX(0); ++ velocity.setY(0); ++ velocity.setZ(0); ++ } else { ++ // CraftBukkit end + double d2 = (double) ((BlockPosition) object).getX() + 0.5D; + double d3 = (double) ((BlockPosition) object).getY() + 0.5D; + double d4 = (double) ((BlockPosition) object).getZ() + 0.5D; +@@ -170,21 +258,46 @@ + f6 = 1.0F; + } + +- double d5 = entity.motX; +- double d6 = entity.motZ; +- +- entity.motX = d5 * (double) f3 + d6 * (double) f6; +- entity.motZ = d5 * (double) f5 + d6 * (double) f4; +- entity.yaw = f - (float) (enumdirection1.b() * 90) + (float) (enumdirection.b() * 90); ++ // CraftBukkit start ++ double d5 = velocity.getX(); ++ double d6 = velocity.getZ(); ++ // CraftBukkit end ++ ++ // CraftBukkit start - Adjust position and velocity instances instead of entity ++ velocity.setX(d5 * (double) f3 + d6 * (double) f6); ++ velocity.setZ(d5 * (double) f5 + d6 * (double) f4); ++ f = f - (float) (enumdirection1.b() * 90) + (float) (enumdirection.b() * 90); + } else { +- entity.motX = entity.motY = entity.motZ = 0.0D; ++ velocity.setX(0); ++ velocity.setY(0); ++ velocity.setZ(0); + } + +- entity.setPositionRotation(d2, d3, d4, entity.yaw, entity.pitch); +- return true; ++ // entity.setPositionRotation(d2, d3, d4, entity.yaw, entity.pitch); ++ position.setX(d2); ++ position.setY(d3); ++ position.setZ(d4); ++ position.setYaw(f); ++ } ++ EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity); ++ this.a.getServer().getPluginManager().callEvent(event); ++ Location to = event.getTo(); ++ if (event.isCancelled() || to == null || !entity.isAlive()) { ++ position.setX(from.getX()); ++ position.setY(from.getY()); ++ position.setZ(from.getZ()); ++ position.setYaw(from.getYaw()); ++ position.setPitch(from.getPitch()); ++ velocity.copy(before); + } else { +- return false; ++ position.setX(to.getX()); ++ position.setY(to.getY()); ++ position.setZ(to.getZ()); ++ position.setYaw(to.getYaw()); ++ position.setPitch(to.getPitch()); ++ velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in + } ++ // CraftBukkit end + } + + private boolean a(BlockPosition blockposition) { +@@ -192,11 +305,22 @@ + } + + public boolean a(Entity entity) { +- byte b0 = 16; ++ // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity ++ return this.createPortal(entity.locX, entity.locY, entity.locZ, 16); ++ } ++ ++ public boolean createPortal(double x, double y, double z, int b0) { ++ if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { ++ createEndPortal(x, y, z); ++ return true; ++ } ++ // CraftBukkit end + double d0 = -1.0D; +- int i = MathHelper.floor(entity.locX); +- int j = MathHelper.floor(entity.locY); +- int k = MathHelper.floor(entity.locZ); ++ // CraftBukkit start ++ int i = MathHelper.floor(x); ++ int j = MathHelper.floor(y); ++ int k = MathHelper.floor(z); ++ // CraftBukkit end + int l = i; + int i1 = j; + int j1 = k; +@@ -220,10 +344,10 @@ + double d4; + + for (i2 = i - b0; i2 <= i + b0; ++i2) { +- d1 = (double) i2 + 0.5D - entity.locX; ++ d1 = (double) i2 + 0.5D - x; // CraftBukkit + + for (j2 = k - b0; j2 <= k + b0; ++j2) { +- d2 = (double) j2 + 0.5D - entity.locZ; ++ d2 = (double) j2 + 0.5D - z; // CraftBukkit + + label271: + for (k2 = this.a.V() - 1; k2 >= 0; --k2) { +@@ -254,7 +378,7 @@ + } + } + +- d3 = (double) k2 + 0.5D - entity.locY; ++ d3 = (double) k2 + 0.5D - y; // CraftBukkit + d4 = d1 * d1 + d3 * d3 + d2 * d2; + if (d0 < 0.0D || d4 < d0) { + d0 = d4; +@@ -271,10 +395,10 @@ + + if (d0 < 0.0D) { + for (i2 = i - b0; i2 <= i + b0; ++i2) { +- d1 = (double) i2 + 0.5D - entity.locX; ++ d1 = (double) i2 + 0.5D - x; // CraftBukkit + + for (j2 = k - b0; j2 <= k + b0; ++j2) { +- d2 = (double) j2 + 0.5D - entity.locZ; ++ d2 = (double) j2 + 0.5D - z; // CraftBukkit + + label219: + for (k2 = this.a.V() - 1; k2 >= 0; --k2) { +@@ -298,7 +422,7 @@ + } + } + +- d3 = (double) k2 + 0.5D - entity.locY; ++ d3 = (double) k2 + 0.5D - y; // CraftBukkit + d4 = d1 * d1 + d3 * d3 + d2 * d2; + if (d0 < 0.0D || d4 < d0) { + d0 = d4; diff --git a/nms-patches/PropertyManager.patch b/nms-patches/PropertyManager.patch new file mode 100644 index 00000000..9812b439 --- /dev/null +++ b/nms-patches/PropertyManager.patch @@ -0,0 +1,94 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/PropertyManager.java 2014-11-27 08:59:46.869421107 +1100 ++++ src/main/java/net/minecraft/server/PropertyManager.java 2014-11-27 08:42:10.100851012 +1100 +@@ -8,6 +8,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import joptsimple.OptionSet; // CraftBukkit ++ + public class PropertyManager { + + private static final Logger a = LogManager.getLogger(); +@@ -39,8 +41,25 @@ + PropertyManager.a.warn(file + " does not exist"); + this.a(); + } ++ } ++ ++ // CraftBukkit start ++ private OptionSet options = null; ++ ++ public PropertyManager(final OptionSet options) { ++ this((File) options.valueOf("config")); ++ ++ this.options = options; ++ } ++ ++ private <T> T getOverride(String name, T value) { ++ if ((this.options != null) && (this.options.has(name))) { ++ return (T) this.options.valueOf(name); ++ } + ++ return value; + } ++ // CraftBukkit end + + public void a() { + PropertyManager.a.info("Generating new properties file"); +@@ -51,6 +70,12 @@ + FileOutputStream fileoutputstream = null; + + try { ++ // CraftBukkit start - Don't attempt writing to file if it's read only ++ if (this.file.exists() && !this.file.canWrite()) { ++ return; ++ } ++ // CraftBukkit end ++ + fileoutputstream = new FileOutputStream(this.file); + this.properties.store(fileoutputstream, "Minecraft server properties"); + } catch (Exception exception) { +@@ -80,36 +105,36 @@ + this.savePropertiesFile(); + } + +- return this.properties.getProperty(s, s1); ++ return getOverride(s, this.properties.getProperty(s, s1)); // CraftBukkit + } + + public int getInt(String s, int i) { + try { +- return Integer.parseInt(this.getString(s, "" + i)); ++ return getOverride(s, Integer.parseInt(this.getString(s, "" + i))); // CraftBukkit + } catch (Exception exception) { + this.properties.setProperty(s, "" + i); + this.savePropertiesFile(); +- return i; ++ return getOverride(s, i); // CraftBukkit + } + } + + public long getLong(String s, long i) { + try { +- return Long.parseLong(this.getString(s, "" + i)); ++ return getOverride(s, Long.parseLong(this.getString(s, "" + i))); // CraftBukkit + } catch (Exception exception) { + this.properties.setProperty(s, "" + i); + this.savePropertiesFile(); +- return i; ++ return getOverride(s ,i); // CraftBukkit + } + } + + public boolean getBoolean(String s, boolean flag) { + try { +- return Boolean.parseBoolean(this.getString(s, "" + flag)); ++ return getOverride(s, Boolean.parseBoolean(this.getString(s, "" + flag))); // CraftBukkit + } catch (Exception exception) { + this.properties.setProperty(s, "" + flag); + this.savePropertiesFile(); +- return flag; ++ return getOverride(s, flag); // CraftBukkit + } + } + diff --git a/nms-patches/RecipeArmorDye.patch b/nms-patches/RecipeArmorDye.patch new file mode 100644 index 00000000..80002455 --- /dev/null +++ b/nms-patches/RecipeArmorDye.patch @@ -0,0 +1,18 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeArmorDye.java 2014-11-27 08:59:46.869421107 +1100 ++++ src/main/java/net/minecraft/server/RecipeArmorDye.java 2014-11-27 08:42:10.116850981 +1100 +@@ -3,9 +3,13 @@ + import com.google.common.collect.Lists; + import java.util.ArrayList; + +-public class RecipeArmorDye implements IRecipe { ++public class RecipeArmorDye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeArmorDye() {} ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ public RecipeArmorDye() { ++ super(new ItemStack(Items.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Items.DYE, 0, 5))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ItemStack itemstack = null; diff --git a/nms-patches/RecipeBookClone.patch b/nms-patches/RecipeBookClone.patch new file mode 100644 index 00000000..5d14c2db --- /dev/null +++ b/nms-patches/RecipeBookClone.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeBookClone.java 2014-11-27 08:59:46.873421089 +1100 ++++ src/main/java/net/minecraft/server/RecipeBookClone.java 2014-11-27 08:42:10.144850927 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-public class RecipeBookClone implements IRecipe { ++public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeBookClone() {} ++ // CraftBukkit start - Delegate to new parent class ++ public RecipeBookClone() { ++ super(new ItemStack(Items.WRITTEN_BOOK, 0, -1), java.util.Arrays.asList(new ItemStack(Items.WRITABLE_BOOK, 0, 0))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + int i = 0; diff --git a/nms-patches/RecipeFireworks.patch b/nms-patches/RecipeFireworks.patch new file mode 100644 index 00000000..b7b388d0 --- /dev/null +++ b/nms-patches/RecipeFireworks.patch @@ -0,0 +1,21 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeFireworks.java 2014-11-27 08:59:46.873421089 +1100 ++++ src/main/java/net/minecraft/server/RecipeFireworks.java 2014-11-27 08:42:10.088851036 +1100 +@@ -3,11 +3,15 @@ + import com.google.common.collect.Lists; + import java.util.ArrayList; + +-public class RecipeFireworks implements IRecipe { ++public class RecipeFireworks extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + + private ItemStack a; +- +- public RecipeFireworks() {} ++ ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ public RecipeFireworks() { ++ super(new ItemStack(Items.FIREWORKS, 0, 0), java.util.Arrays.asList(new ItemStack(Items.GUNPOWDER, 0, 5))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + this.a = null; diff --git a/nms-patches/RecipeMapClone.patch b/nms-patches/RecipeMapClone.patch new file mode 100644 index 00000000..a33ee9e9 --- /dev/null +++ b/nms-patches/RecipeMapClone.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeMapClone.java 2014-11-27 08:59:46.873421089 +1100 ++++ src/main/java/net/minecraft/server/RecipeMapClone.java 2014-11-27 08:42:10.152850911 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-public class RecipeMapClone implements IRecipe { ++public class RecipeMapClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeMapClone() {} ++ // CraftBukkit start - Delegate to new parent class ++ public RecipeMapClone() { ++ super(new ItemStack(Items.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Items.MAP, 0, 0))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + int i = 0; diff --git a/nms-patches/RecipeRepair.patch b/nms-patches/RecipeRepair.patch new file mode 100644 index 00000000..51349bb2 --- /dev/null +++ b/nms-patches/RecipeRepair.patch @@ -0,0 +1,39 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipeRepair.java 2014-11-27 08:59:46.877421071 +1100 ++++ src/main/java/net/minecraft/server/RecipeRepair.java 2014-11-27 08:42:10.148850918 +1100 +@@ -3,9 +3,13 @@ + import com.google.common.collect.Lists; + import java.util.ArrayList; + +-public class RecipeRepair implements IRecipe { ++public class RecipeRepair extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- public RecipeRepair() {} ++ // CraftBukkit start - Delegate to new parent class ++ public RecipeRepair() { ++ super(new ItemStack(Items.LEATHER_HELMET), java.util.Arrays.asList(new ItemStack(Items.LEATHER_HELMET))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ArrayList arraylist = Lists.newArrayList(); +@@ -61,8 +65,18 @@ + if (i1 < 0) { + i1 = 0; + } +- +- return new ItemStack(itemstack2.getItem(), 1, i1); ++ ++ // CraftBukkit start - Construct a dummy repair recipe ++ ItemStack result = new ItemStack(itemstack.getItem(), 1, i1); ++ java.util.List<ItemStack> ingredients = new ArrayList<ItemStack>(); ++ ingredients.add(itemstack2.cloneItemStack()); ++ ingredients.add(itemstack.cloneItemStack()); ++ ShapelessRecipes recipe = new ShapelessRecipes(result.cloneItemStack(), ingredients); ++ inventorycrafting.currentRecipe = recipe; ++ result = org.bukkit.craftbukkit.event.CraftEventFactory.callPreCraftEvent(inventorycrafting, result, CraftingManager.getInstance().lastCraftView, true); ++ return result; ++ // return new ItemStack(itemstack2.getItem(), 1, i1); ++ // CraftBukkit end + } + } + diff --git a/nms-patches/RecipesBannerInnerClass1.patch b/nms-patches/RecipesBannerInnerClass1.patch new file mode 100644 index 00000000..78471632 --- /dev/null +++ b/nms-patches/RecipesBannerInnerClass1.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipesBannerInnerClass1.java 2014-11-27 08:59:46.877421071 +1100 ++++ src/main/java/net/minecraft/server/RecipesBannerInnerClass1.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-class RecipesBannerInnerClass1 implements IRecipe { ++class RecipesBannerInnerClass1 extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- private RecipesBannerInnerClass1() {} ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ private RecipesBannerInnerClass1() { ++ super(new ItemStack(Items.BANNER, 0, 0), java.util.Arrays.asList(new ItemStack(Items.BANNER))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + ItemStack itemstack = null; diff --git a/nms-patches/RecipesBannerInnerClass2.patch b/nms-patches/RecipesBannerInnerClass2.patch new file mode 100644 index 00000000..3fa03250 --- /dev/null +++ b/nms-patches/RecipesBannerInnerClass2.patch @@ -0,0 +1,17 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipesBannerInnerClass2.java 2014-11-27 08:59:46.881421054 +1100 ++++ src/main/java/net/minecraft/server/RecipesBannerInnerClass2.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,8 +1,12 @@ + package net.minecraft.server; + +-class RecipesBannerInnerClass2 implements IRecipe { ++class RecipesBannerInnerClass2 extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends + +- private RecipesBannerInnerClass2() {} ++ // CraftBukkit start - Delegate to new parent class with bogus info ++ private RecipesBannerInnerClass2() { ++ super(new ItemStack(Items.BANNER, 0, 0), java.util.Arrays.asList(new ItemStack(Items.DYE, 0, 5))); ++ } ++ // CraftBukkit end + + public boolean a(InventoryCrafting inventorycrafting, World world) { + boolean flag = false; diff --git a/nms-patches/RecipesFurnace.patch b/nms-patches/RecipesFurnace.patch new file mode 100644 index 00000000..be4d28fb --- /dev/null +++ b/nms-patches/RecipesFurnace.patch @@ -0,0 +1,49 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RecipesFurnace.java 2014-11-27 08:59:46.881421054 +1100 ++++ src/main/java/net/minecraft/server/RecipesFurnace.java 2014-11-27 08:42:10.132850949 +1100 +@@ -10,6 +10,7 @@ + private static final RecipesFurnace a = new RecipesFurnace(); + public Map recipes = Maps.newHashMap(); + private Map c = Maps.newHashMap(); ++ public Map customRecipes = Maps.newHashMap(); // CraftBukkit - add field + + public static RecipesFurnace getInstance() { + return RecipesFurnace.a; +@@ -52,6 +53,12 @@ + this.registerRecipe(Blocks.LAPIS_ORE, new ItemStack(Items.DYE, 1, EnumColor.BLUE.getInvColorIndex()), 0.2F); + this.registerRecipe(Blocks.QUARTZ_ORE, new ItemStack(Items.QUARTZ), 0.2F); + } ++ ++ // CraftBukkit start - add method ++ public void registerRecipe(ItemStack itemstack, ItemStack itemstack1) { ++ this.customRecipes.put(itemstack, itemstack1); ++ } ++ // CraftBukkit end + + public void registerRecipe(Block block, ItemStack itemstack, float f) { + this.a(Item.getItemOf(block), itemstack, f); +@@ -67,13 +74,23 @@ + } + + public ItemStack getResult(ItemStack itemstack) { +- Iterator iterator = this.recipes.entrySet().iterator(); ++ // CraftBukkit start - initialize to customRecipes ++ boolean vanilla = false; ++ Iterator iterator = this.customRecipes.entrySet().iterator(); ++ // CraftBukkit end + + Entry entry; + + do { + if (!iterator.hasNext()) { +- return null; ++ // CraftBukkit start - fall back to vanilla recipes ++ if (!vanilla && !recipes.isEmpty()) { ++ iterator = this.recipes.entrySet().iterator(); ++ vanilla = true; ++ } else { ++ return null; ++ } ++ // CraftBukkit end + } + + entry = (Entry) iterator.next(); diff --git a/nms-patches/RegionFile.patch b/nms-patches/RegionFile.patch new file mode 100644 index 00000000..80999d9c --- /dev/null +++ b/nms-patches/RegionFile.patch @@ -0,0 +1,81 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RegionFile.java 2014-11-27 08:59:46.881421054 +1100 ++++ src/main/java/net/minecraft/server/RegionFile.java 2014-11-27 08:42:10.160850895 +1100 +@@ -86,8 +86,46 @@ + } catch (IOException ioexception) { + ioexception.printStackTrace(); + } ++ } ++ ++ // CraftBukkit start - This is a copy (sort of) of the method below it, make sure they stay in sync ++ public synchronized boolean chunkExists(int i, int j) { ++ if (this.d(i, j)) { ++ return false; ++ } else { ++ try { ++ int k = this.e(i, j); ++ ++ if (k == 0) { ++ return false; ++ } else { ++ int l = k >> 8; ++ int i1 = k & 255; ++ ++ if (l + i1 > this.f.size()) { ++ return false; ++ } ++ ++ this.c.seek((long) (l * 4096)); ++ int j1 = this.c.readInt(); ++ ++ if (j1 > 4096 * i1 || j1 <= 0) { ++ return false; ++ } ++ ++ byte b0 = this.c.readByte(); ++ if (b0 == 1 || b0 == 2) { ++ return true; ++ } ++ } ++ } catch (IOException ioexception) { ++ return false; ++ } ++ } + ++ return false; + } ++ // CraftBukkit end + + public synchronized DataInputStream a(int i, int j) { + if (this.d(i, j)) { +@@ -214,7 +252,7 @@ + + } + +- private void a(int i, byte[] abyte, int j) { ++ private void a(int i, byte[] abyte, int j) throws IOException { // CraftBukkit - added throws + this.c.seek((long) (i * 4096)); + this.c.writeInt(j + 1); + this.c.writeByte(2); +@@ -233,19 +271,19 @@ + return this.e(i, j) != 0; + } + +- private void a(int i, int j, int k) { ++ private void a(int i, int j, int k) throws IOException { // CraftBukkit - added throws + this.d[i + j * 32] = k; + this.c.seek((long) ((i + j * 32) * 4)); + this.c.writeInt(k); + } + +- private void b(int i, int j, int k) { ++ private void b(int i, int j, int k) throws IOException { // CraftBukkit - added throws + this.e[i + j * 32] = k; + this.c.seek((long) (4096 + (i + j * 32) * 4)); + this.c.writeInt(k); + } + +- public void c() { ++ public void c() throws IOException { // CraftBukkit - added throws + if (this.c != null) { + this.c.close(); + } diff --git a/nms-patches/RemoteControlCommandListener.patch b/nms-patches/RemoteControlCommandListener.patch new file mode 100644 index 00000000..9cf48bf6 --- /dev/null +++ b/nms-patches/RemoteControlCommandListener.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/RemoteControlCommandListener.java 2014-11-27 08:59:46.885421036 +1100 ++++ src/main/java/net/minecraft/server/RemoteControlCommandListener.java 2014-11-27 08:42:10.152850911 +1100 +@@ -26,6 +26,12 @@ + public IChatBaseComponent getScoreboardDisplayName() { + return new ChatComponentText(this.getName()); + } ++ ++ // CraftBukkit start - Send a String ++ public void sendMessage(String message) { ++ this.b.append(message); ++ } ++ // CraftBukkit end + + public void sendMessage(IChatBaseComponent ichatbasecomponent) { + this.b.append(ichatbasecomponent.c()); diff --git a/nms-patches/ScoreboardServer.patch b/nms-patches/ScoreboardServer.patch new file mode 100644 index 00000000..4b480d13 --- /dev/null +++ b/nms-patches/ScoreboardServer.patch @@ -0,0 +1,126 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ScoreboardServer.java 2014-11-27 08:59:46.885421036 +1100 ++++ src/main/java/net/minecraft/server/ScoreboardServer.java 2014-11-27 08:42:10.164850887 +1100 +@@ -21,7 +21,7 @@ + public void handleScoreChanged(ScoreboardScore scoreboardscore) { + super.handleScoreChanged(scoreboardscore); + if (this.b.contains(scoreboardscore.getObjective())) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(scoreboardscore)); ++ this.sendAll(new PacketPlayOutScoreboardScore(scoreboardscore)); // CraftBukkit - Internal packet method + } + + this.b(); +@@ -29,13 +29,13 @@ + + public void handlePlayerRemoved(String s) { + super.handlePlayerRemoved(s); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(s)); ++ this.sendAll(new PacketPlayOutScoreboardScore(s)); // CraftBukkit - Internal packet method + this.b(); + } + + public void a(String s, ScoreboardObjective scoreboardobjective) { + super.a(s, scoreboardobjective); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardScore(s, scoreboardobjective)); ++ this.sendAll(new PacketPlayOutScoreboardScore(s, scoreboardobjective)); // CraftBukkit - Internal packet method + this.b(); + } + +@@ -45,7 +45,7 @@ + super.setDisplaySlot(i, scoreboardobjective); + if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) { + if (this.h(scoreboardobjective1) > 0) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); ++ this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method + } else { + this.g(scoreboardobjective1); + } +@@ -53,7 +53,7 @@ + + if (scoreboardobjective != null) { + if (this.b.contains(scoreboardobjective)) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); ++ this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method + } else { + this.e(scoreboardobjective); + } +@@ -66,7 +66,7 @@ + if (super.addPlayerToTeam(s, s1)) { + ScoreboardTeam scoreboardteam = this.getTeam(s1); + +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); // CraftBukkit - Internal packet method + this.b(); + return true; + } else { +@@ -76,7 +76,7 @@ + + public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) { + super.removePlayerFromTeam(s, scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); // CraftBukkit - Internal packet method + this.b(); + } + +@@ -88,7 +88,7 @@ + public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) { + super.handleObjectiveChanged(scoreboardobjective); + if (this.b.contains(scoreboardobjective)) { +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); ++ this.sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); // CraftBukkit - Internal packet method + } + + this.b(); +@@ -105,19 +105,19 @@ + + public void handleTeamAdded(ScoreboardTeam scoreboardteam) { + super.handleTeamAdded(scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); // CraftBukkit - Internal packet method + this.b(); + } + + public void handleTeamChanged(ScoreboardTeam scoreboardteam) { + super.handleTeamChanged(scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); // CraftBukkit - Internal packet method + this.b(); + } + + public void handleTeamRemoved(ScoreboardTeam scoreboardteam) { + super.handleTeamRemoved(scoreboardteam); +- this.a.getPlayerList().sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); ++ this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); // CraftBukkit - Internal packet method + this.b(); + } + +@@ -160,6 +160,7 @@ + + while (iterator.hasNext()) { + EntityPlayer entityplayer = (EntityPlayer) iterator.next(); ++ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { +@@ -192,6 +193,7 @@ + + while (iterator.hasNext()) { + EntityPlayer entityplayer = (EntityPlayer) iterator.next(); ++ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board + Iterator iterator1 = list.iterator(); + + while (iterator1.hasNext()) { +@@ -215,4 +217,14 @@ + + return i; + } ++ ++ // CraftBukkit start - Send to players ++ private void sendAll(Packet packet) { ++ for (EntityPlayer entityplayer : (List<EntityPlayer>) this.a.getPlayerList().players) { ++ if (entityplayer.getBukkitEntity().getScoreboard().getHandle() == this) { ++ entityplayer.playerConnection.sendPacket(packet); ++ } ++ } ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/SecondaryWorldServer.patch b/nms-patches/SecondaryWorldServer.patch new file mode 100644 index 00000000..935246b6 --- /dev/null +++ b/nms-patches/SecondaryWorldServer.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SecondaryWorldServer.java 2014-11-27 08:59:46.889421019 +1100 ++++ src/main/java/net/minecraft/server/SecondaryWorldServer.java 2014-11-27 08:42:10.088851036 +1100 +@@ -4,8 +4,10 @@ + + private WorldServer a; + +- public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, int i, WorldServer worldserver, MethodProfiler methodprofiler) { +- super(minecraftserver, idatamanager, new SecondaryWorldData(worldserver.getWorldData()), i, methodprofiler); ++ // CraftBukkit start - Add WorldData, Environment and ChunkGenerator arguments ++ public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, int i, WorldServer worldserver, MethodProfiler methodprofiler, WorldData worldData, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { ++ super(minecraftserver, idatamanager, worldData, i, methodprofiler, env, gen); ++ // CraftBukkit end + this.a = worldserver; + worldserver.af().a((IWorldBorderListener) (new SecondaryWorldServerInnerClass1(this))); + } diff --git a/nms-patches/ShapedRecipes.patch b/nms-patches/ShapedRecipes.patch new file mode 100644 index 00000000..5b3908ce --- /dev/null +++ b/nms-patches/ShapedRecipes.patch @@ -0,0 +1,77 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ShapedRecipes.java 2014-11-27 08:59:46.889421019 +1100 ++++ src/main/java/net/minecraft/server/ShapedRecipes.java 2014-11-27 08:42:10.164850887 +1100 +@@ -1,5 +1,11 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; ++// CraftBukkit end ++ ++ + public class ShapedRecipes implements IRecipe { + + private final int width; +@@ -14,6 +20,62 @@ + this.items = aitemstack; + this.result = itemstack; + } ++ ++ // CraftBukkit start ++ public org.bukkit.inventory.ShapedRecipe toBukkitRecipe() { ++ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); ++ CraftShapedRecipe recipe = new CraftShapedRecipe(result, this); ++ switch (this.height) { ++ case 1: ++ switch (this.width) { ++ case 1: ++ recipe.shape("a"); ++ break; ++ case 2: ++ recipe.shape("ab"); ++ break; ++ case 3: ++ recipe.shape("abc"); ++ break; ++ } ++ break; ++ case 2: ++ switch (this.width) { ++ case 1: ++ recipe.shape("a","b"); ++ break; ++ case 2: ++ recipe.shape("ab","cd"); ++ break; ++ case 3: ++ recipe.shape("abc","def"); ++ break; ++ } ++ break; ++ case 3: ++ switch (this.width) { ++ case 1: ++ recipe.shape("a","b","c"); ++ break; ++ case 2: ++ recipe.shape("ab","cd","ef"); ++ break; ++ case 3: ++ recipe.shape("abc","def","ghi"); ++ break; ++ } ++ break; ++ } ++ char c = 'a'; ++ for (ItemStack stack : this.items) { ++ if (stack != null) { ++ recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); ++ } ++ c++; ++ } ++ return recipe; ++ } ++ // CraftBukkit end + + public ItemStack b() { + return this.result; diff --git a/nms-patches/ShapelessRecipes.patch b/nms-patches/ShapelessRecipes.patch new file mode 100644 index 00000000..7e4230c9 --- /dev/null +++ b/nms-patches/ShapelessRecipes.patch @@ -0,0 +1,35 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ShapelessRecipes.java 2014-11-27 08:59:46.889421019 +1100 ++++ src/main/java/net/minecraft/server/ShapelessRecipes.java 2014-11-27 08:42:10.128850958 +1100 +@@ -5,6 +5,11 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; ++// CraftBukkit end ++ + public class ShapelessRecipes implements IRecipe { + + private final ItemStack result; +@@ -14,6 +19,20 @@ + this.result = itemstack; + this.ingredients = list; + } ++ ++ // CraftBukkit start ++ @SuppressWarnings("unchecked") ++ public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe() { ++ CraftItemStack result = CraftItemStack.asCraftMirror(this.result); ++ CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this); ++ for (ItemStack stack : (List<ItemStack>) this.ingredients) { ++ if (stack != null) { ++ recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); ++ } ++ } ++ return recipe; ++ } ++ // CraftBukkit end + + public ItemStack b() { + return this.result; diff --git a/nms-patches/SlotFurnaceResult.patch b/nms-patches/SlotFurnaceResult.patch new file mode 100644 index 00000000..626529de --- /dev/null +++ b/nms-patches/SlotFurnaceResult.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SlotFurnaceResult.java 2014-11-27 08:59:46.893421001 +1100 ++++ src/main/java/net/minecraft/server/SlotFurnaceResult.java 2014-11-27 08:42:10.128850958 +1100 +@@ -1,5 +1,10 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import org.bukkit.entity.Player; ++import org.bukkit.event.inventory.FurnaceExtractEvent; ++// CraftBukkit end ++ + public class SlotFurnaceResult extends Slot { + + private EntityHuman a; +@@ -49,6 +54,17 @@ + + i = j; + } ++ ++ // CraftBukkit start - fire FurnaceExtractEvent ++ Player player = (Player) a.getBukkitEntity(); ++ TileEntityFurnace furnace = ((TileEntityFurnace) this.inventory); ++ org.bukkit.block.Block block = a.world.getWorld().getBlockAt(furnace.position.getX(), furnace.position.getY(), furnace.position.getZ()); ++ ++ FurnaceExtractEvent event = new FurnaceExtractEvent(player, block, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(itemstack.getItem()), itemstack.count, i); ++ a.world.getServer().getPluginManager().callEvent(event); ++ ++ i = event.getExpToDrop(); ++ // CraftBukkit end + + while (i > 0) { + j = EntityExperienceOrb.getOrbValue(i); diff --git a/nms-patches/SpawnerCreature.patch b/nms-patches/SpawnerCreature.patch new file mode 100644 index 00000000..96828173 --- /dev/null +++ b/nms-patches/SpawnerCreature.patch @@ -0,0 +1,109 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SpawnerCreature.java 2014-11-27 08:59:46.893421001 +1100 ++++ src/main/java/net/minecraft/server/SpawnerCreature.java 2014-11-27 08:42:10.164850887 +1100 +@@ -6,10 +6,16 @@ + import java.util.Random; + import java.util.Set; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.LongHash; ++import org.bukkit.craftbukkit.util.LongHashSet; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++// CraftBukkit end ++ + public final class SpawnerCreature { + + private static final int a = (int) Math.pow(17.0D, 2.0D); +- private final Set b = Sets.newHashSet(); ++ private final LongHashSet b = new LongHashSet(); + + public SpawnerCreature() {} + +@@ -36,14 +42,18 @@ + for (int i1 = -b0; i1 <= b0; ++i1) { + for (k = -b0; k <= b0; ++k) { + boolean flag3 = i1 == -b0 || i1 == b0 || k == -b0 || k == b0; +- ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j); ++ // ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i1 + l, k + j); + +- if (!this.b.contains(chunkcoordintpair)) { ++ // CraftBukkit start - use LongHash and LongHashSet ++ long chunkCoords = LongHash.toLong(i1 + l, k + j); ++ ++ if (!this.b.contains(chunkCoords)) { + ++i; +- if (!flag3 && worldserver.af().isInBounds(chunkcoordintpair)) { +- this.b.add(chunkcoordintpair); ++ if (!flag3 && worldserver.af().isInBounds(chunkCoords)) { ++ this.b.add(chunkCoords); + } + } ++ // CraftBukkit end + } + } + } +@@ -57,18 +67,41 @@ + + for (int k1 = 0; k1 < j; ++k1) { + EnumCreatureType enumcreaturetype = aenumcreaturetype[k1]; ++ ++ // CraftBukkit start - Use per-world spawn limits ++ int limit = enumcreaturetype.b(); ++ switch (enumcreaturetype) { ++ case MONSTER: ++ limit = worldserver.getWorld().getMonsterSpawnLimit(); ++ break; ++ case CREATURE: ++ limit = worldserver.getWorld().getAnimalSpawnLimit(); ++ break; ++ case WATER_CREATURE: ++ limit = worldserver.getWorld().getWaterAnimalSpawnLimit(); ++ break; ++ case AMBIENT: ++ limit = worldserver.getWorld().getAmbientSpawnLimit(); ++ break; ++ } ++ ++ if (limit == 0) { ++ continue; ++ } ++ // CraftBukkit end + + if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && (!enumcreaturetype.e() || flag2)) { + k = worldserver.a(enumcreaturetype.a()); +- int l1 = enumcreaturetype.b() * i / SpawnerCreature.a; ++ int l1 = limit * i / a; // CraftBukkit - use per-world limits + + if (k <= l1) { + Iterator iterator1 = this.b.iterator(); + + label115: + while (iterator1.hasNext()) { +- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); +- BlockPosition blockposition1 = getRandomPosition(worldserver, chunkcoordintpair1.x, chunkcoordintpair1.z); ++ // CraftBukkit start = use LongHash and LongObjectHashMap ++ long key = ((Long) iterator1.next()).longValue(); ++ BlockPosition blockposition1 = getRandomPosition(worldserver, LongHash.msw(key), LongHash.lsw(key)); + int i2 = blockposition1.getX(); + int j2 = blockposition1.getY(); + int k2 = blockposition1.getZ(); +@@ -120,7 +153,7 @@ + groupdataentity = entityinsentient.prepare(worldserver.E(new BlockPosition(entityinsentient)), groupdataentity); + if (entityinsentient.canSpawn()) { + ++l2; +- worldserver.addEntity(entityinsentient); ++ worldserver.addEntity(entityinsentient, SpawnReason.NATURAL); // CraftBukkit - Added a reason for spawning this creature + } + + if (l2 >= entityinsentient.bU()) { +@@ -214,8 +247,10 @@ + } + + entityinsentient.setPositionRotation((double) ((float) j1 + 0.5F), (double) blockposition.getY(), (double) ((float) k1 + 0.5F), random.nextFloat() * 360.0F, 0.0F); +- world.addEntity(entityinsentient); ++ // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.prepare(groupdataentity) up + groupdataentity = entityinsentient.prepare(world.E(new BlockPosition(entityinsentient)), groupdataentity); ++ world.addEntity(entityinsentient, SpawnReason.CHUNK_GEN); ++ // CraftBukkit end + flag = true; + } + diff --git a/nms-patches/StatisticManager.patch b/nms-patches/StatisticManager.patch new file mode 100644 index 00000000..5b9486b3 --- /dev/null +++ b/nms-patches/StatisticManager.patch @@ -0,0 +1,15 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/StatisticManager.java 2014-11-27 08:59:46.893421001 +1100 ++++ src/main/java/net/minecraft/server/StatisticManager.java 2014-11-27 08:42:10.172850872 +1100 +@@ -19,6 +19,12 @@ + + public void b(EntityHuman entityhuman, Statistic statistic, int i) { + if (!statistic.d() || this.b((Achievement) statistic)) { ++ // CraftBukkit start - fire Statistic events ++ org.bukkit.event.Cancellable cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.handleStatisticsIncrease(entityhuman, statistic, this.getStatisticValue(statistic), i); ++ if (cancellable != null && cancellable.isCancelled()) { ++ return; ++ } ++ // CraftBukkit end + this.setStatistic(entityhuman, statistic, this.getStatisticValue(statistic) + i); + } + } diff --git a/nms-patches/SwitchHelperLogVariant.patch b/nms-patches/SwitchHelperLogVariant.patch new file mode 100644 index 00000000..e6b38cc5 --- /dev/null +++ b/nms-patches/SwitchHelperLogVariant.patch @@ -0,0 +1,9 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/SwitchHelperLogVariant.java 2014-11-27 08:59:46.897420984 +1100 ++++ src/main/java/net/minecraft/server/SwitchHelperLogVariant.java 2014-11-27 08:42:10.084851043 +1100 +@@ -1,5 +1,6 @@ + package net.minecraft.server; + ++// CraftBukkit - imported for visibility + class SwitchHelperLogVariant { + + static final int[] a = new int[EnumLogVariant.values().length]; diff --git a/nms-patches/ThreadCommandReader.patch b/nms-patches/ThreadCommandReader.patch new file mode 100644 index 00000000..87bf341a --- /dev/null +++ b/nms-patches/ThreadCommandReader.patch @@ -0,0 +1,43 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ThreadCommandReader.java 2014-11-27 08:59:46.897420984 +1100 ++++ src/main/java/net/minecraft/server/ThreadCommandReader.java 2014-11-27 08:42:10.084851043 +1100 +@@ -4,6 +4,8 @@ + import java.io.IOException; + import java.io.InputStreamReader; + ++import static org.bukkit.craftbukkit.Main.*; // CraftBukkit ++ + class ThreadCommandReader extends Thread { + + final DedicatedServer server; +@@ -14,13 +16,28 @@ + } + + public void run() { +- BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(System.in)); ++ // CraftBukkit start ++ if (!useConsole) { ++ return; ++ } ++ // CraftBukkit end ++ ++ jline.console.ConsoleReader bufferedreader = this.server.reader; // CraftBukkit + + String s; + + try { +- while (!this.server.isStopped() && this.server.isRunning() && (s = bufferedreader.readLine()) != null) { +- this.server.issueCommand(s, this.server); ++ // CraftBukkit start - JLine disabling compatibility ++ while (!this.server.isStopped() && this.server.isRunning()) { ++ if (useJline) { ++ s = bufferedreader.readLine(">", null); ++ } else { ++ s = bufferedreader.readLine(); ++ } ++ if (s != null && s.trim().length() > 0) { // Trim to filter lines which are just spaces ++ this.server.issueCommand(s, this.server); ++ } ++ // CraftBukkit end + } + } catch (IOException ioexception) { + DedicatedServer.aR().error("Exception handling console input", ioexception); diff --git a/nms-patches/ThreadPlayerLookupUUID.patch b/nms-patches/ThreadPlayerLookupUUID.patch new file mode 100644 index 00000000..d0732690 --- /dev/null +++ b/nms-patches/ThreadPlayerLookupUUID.patch @@ -0,0 +1,72 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/ThreadPlayerLookupUUID.java 2014-11-27 08:59:46.901420966 +1100 ++++ src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java 2014-11-27 08:42:10.164850887 +1100 +@@ -5,6 +5,12 @@ + import java.math.BigInteger; + import java.util.UUID; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.util.Waitable; ++import org.bukkit.event.player.AsyncPlayerPreLoginEvent; ++import org.bukkit.event.player.PlayerPreLoginEvent; ++// CraftBukkit end ++ + class ThreadPlayerLookupUUID extends Thread { + + final LoginListener a; +@@ -22,6 +28,44 @@ + + LoginListener.a(this.a, LoginListener.a(this.a).aB().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s)); + if (LoginListener.b(this.a) != null) { ++ // CraftBukkit start - fire PlayerPreLoginEvent ++ if (!this.a.networkManager.g()) { ++ return; ++ } ++ ++ String playerName = LoginListener.a(this.a).getName(); ++ java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); ++ java.util.UUID uniqueId = LoginListener.b(this.a).getId(); ++ final org.bukkit.craftbukkit.CraftServer server = LoginListener.a(this.a).server; ++ ++ AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); ++ server.getPluginManager().callEvent(asyncEvent); ++ ++ if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { ++ final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); ++ if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { ++ event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); ++ } ++ Waitable<PlayerPreLoginEvent.Result> waitable = new Waitable<PlayerPreLoginEvent.Result>() { ++ @Override ++ protected PlayerPreLoginEvent.Result evaluate() { ++ server.getPluginManager().callEvent(event); ++ return event.getResult(); ++ }}; ++ ++ LoginListener.a(this.a).processQueue.add(waitable); ++ if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { ++ this.a.disconnect(event.getKickMessage()); ++ return; ++ } ++ } else { ++ if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { ++ this.a.disconnect(asyncEvent.getKickMessage()); ++ return; ++ } ++ } ++ // CraftBukkit end ++ + LoginListener.e().info("UUID of player " + LoginListener.b(this.a).getName() + " is " + LoginListener.b(this.a).getId()); + LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); + } else if (LoginListener.a(this.a).S()) { +@@ -41,6 +85,11 @@ + this.a.disconnect("Authentication servers are down. Please try again later, sorry!"); + LoginListener.e().error("Couldn\'t verify username because servers are unavailable"); + } ++ // CraftBukkit start - catch all exceptions ++ } catch (Exception exception) { ++ this.a.disconnect("Failed to verify username!"); ++ LoginListener.a(this.a).server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + LoginListener.a(this.a).getName(), exception); ++ // CraftBukkit end + } + + } diff --git a/nms-patches/TileEntity.patch b/nms-patches/TileEntity.patch new file mode 100644 index 00000000..dd76aea1 --- /dev/null +++ b/nms-patches/TileEntity.patch @@ -0,0 +1,24 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntity.java 2014-11-27 08:59:46.913420913 +1100 ++++ src/main/java/net/minecraft/server/TileEntity.java 2014-11-27 08:42:10.148850918 +1100 +@@ -6,6 +6,8 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++import org.bukkit.inventory.InventoryHolder; // CraftBukkit ++ + public abstract class TileEntity { + + private static final Logger a = LogManager.getLogger(); +@@ -182,4 +184,12 @@ + a(TileEntityFlowerPot.class, "FlowerPot"); + a(TileEntityBanner.class, "Banner"); + } ++ ++ // CraftBukkit start - add method ++ public InventoryHolder getOwner() { ++ org.bukkit.block.BlockState state = world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()).getState(); ++ if (state instanceof InventoryHolder) return (InventoryHolder) state; ++ return null; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/TileEntityBeacon.patch b/nms-patches/TileEntityBeacon.patch new file mode 100644 index 00000000..a5179536 --- /dev/null +++ b/nms-patches/TileEntityBeacon.patch @@ -0,0 +1,54 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityBeacon.java 2014-11-27 08:59:46.901420966 +1100 ++++ src/main/java/net/minecraft/server/TileEntityBeacon.java 2014-11-27 08:42:10.152850911 +1100 +@@ -5,6 +5,11 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class TileEntityBeacon extends TileEntityContainer implements IUpdatePlayerListBox, IInventory { + + public static final MobEffectList[][] a = new MobEffectList[][] { { MobEffectList.FASTER_MOVEMENT, MobEffectList.FASTER_DIG}, { MobEffectList.RESISTANCE, MobEffectList.JUMP}, { MobEffectList.INCREASE_DAMAGE}, { MobEffectList.REGENERATION}}; +@@ -15,6 +20,30 @@ + private int l; + private ItemStack inventorySlot; + private String n; ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return new ItemStack[] { this.inventorySlot }; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityBeacon() {} + +@@ -182,7 +211,7 @@ + } + + public int getSize() { +- return 1; ++ return maxStack; // CraftBukkit + } + + public ItemStack getItem(int i) { diff --git a/nms-patches/TileEntityBrewingStand.patch b/nms-patches/TileEntityBrewingStand.patch new file mode 100644 index 00000000..80e791ad --- /dev/null +++ b/nms-patches/TileEntityBrewingStand.patch @@ -0,0 +1,94 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityBrewingStand.java 2014-11-27 08:59:46.901420966 +1100 ++++ src/main/java/net/minecraft/server/TileEntityBrewingStand.java 2014-11-27 08:42:10.132850949 +1100 +@@ -3,6 +3,12 @@ + import java.util.Arrays; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.BrewEvent; ++// CraftBukkit end ++ + public class TileEntityBrewingStand extends TileEntityContainer implements IUpdatePlayerListBox, IWorldInventory { + + private static final int[] a = new int[] { 3}; +@@ -12,8 +18,35 @@ + private boolean[] i; + private Item j; + private String k; ++ private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field + + public TileEntityBrewingStand() {} ++ ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = 64; ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public String getName() { + return this.hasCustomName() ? this.k : "container.brewing"; +@@ -32,9 +65,14 @@ + } + + public void c() { ++ // CraftBukkit start - Use wall time instead of ticks for brewing ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.lastTick = MinecraftServer.currentTick; ++ + if (this.brewTime > 0) { +- --this.brewTime; +- if (this.brewTime == 0) { ++ this.brewTime -= elapsedTicks; ++ if (this.brewTime <= 0) { // == -> <= ++ // CraftBukkit end + this.o(); + this.update(); + } else if (!this.n()) { +@@ -109,6 +147,16 @@ + private void o() { + if (this.n()) { + ItemStack itemstack = this.items[3]; ++ ++ // CraftBukkit start ++ if (getOwner() != null) { ++ BrewEvent event = new BrewEvent(world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), (org.bukkit.inventory.BrewerInventory) this.getOwner().getInventory()); ++ org.bukkit.Bukkit.getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end + + for (int i = 0; i < 3; ++i) { + if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { +@@ -221,7 +269,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return this.maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { diff --git a/nms-patches/TileEntityChest.patch b/nms-patches/TileEntityChest.patch new file mode 100644 index 00000000..52d98548 --- /dev/null +++ b/nms-patches/TileEntityChest.patch @@ -0,0 +1,104 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityChest.java 2014-11-27 08:59:46.905420949 +1100 ++++ src/main/java/net/minecraft/server/TileEntityChest.java 2014-11-27 08:42:10.168850880 +1100 +@@ -3,6 +3,11 @@ + import java.util.Iterator; + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class TileEntityChest extends TileEntityContainer implements IUpdatePlayerListBox, IInventory { + + private ItemStack[] items = new ItemStack[27]; +@@ -19,6 +24,31 @@ + private String p; + + public TileEntityChest() {} ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public int getSize() { + return 27; +@@ -125,10 +155,11 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { ++ if (this.world == null) return true; // CraftBukkit + return this.world.getTileEntity(this.position) != this ? false : entityhuman.e((double) this.position.getX() + 0.5D, (double) this.position.getY() + 0.5D, (double) this.position.getZ() + 0.5D) <= 64.0D; + } + +@@ -304,9 +335,22 @@ + if (this.l < 0) { + this.l = 0; + } ++ ++ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added + + ++this.l; ++ if (this.world == null) return; // CraftBukkit + this.world.playBlockAction(this.position, this.w(), 1, this.l); ++ ++ // CraftBukkit start - Call redstone event ++ if (this.w() == Blocks.TRAPPED_CHEST) { ++ int newPower = Math.max(0, Math.min(15, this.l)); ++ ++ if (oldPower != newPower) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower); ++ } ++ } ++ // CraftBukkit end + this.world.applyPhysics(this.position, this.w()); + this.world.applyPhysics(this.position.down(), this.w()); + } +@@ -315,8 +359,21 @@ + + public void closeContainer(EntityHuman entityhuman) { + if (!entityhuman.v() && this.w() instanceof BlockChest) { ++ int oldPower = Math.max(0, Math.min(15, this.l)); // CraftBukkit - Get power before new viewer is added ++ + --this.l; ++ if (this.world == null) return; // CraftBukkit + this.world.playBlockAction(this.position, this.w(), 1, this.l); ++ ++ // CraftBukkit start - Call redstone event ++ if (this.w() == Blocks.TRAPPED_CHEST) { ++ int newPower = Math.max(0, Math.min(15, this.l)); ++ ++ if (oldPower != newPower) { ++ org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, position.getX(), position.getY(), position.getZ(), oldPower, newPower); ++ } ++ } ++ // CraftBukkit end + this.world.applyPhysics(this.position, this.w()); + this.world.applyPhysics(this.position.down(), this.w()); + } diff --git a/nms-patches/TileEntityCommandListener.patch b/nms-patches/TileEntityCommandListener.patch new file mode 100644 index 00000000..92b43a41 --- /dev/null +++ b/nms-patches/TileEntityCommandListener.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityCommandListener.java 2014-11-27 08:59:46.905420949 +1100 ++++ src/main/java/net/minecraft/server/TileEntityCommandListener.java 2014-11-27 08:42:10.132850949 +1100 +@@ -6,6 +6,7 @@ + + TileEntityCommandListener(TileEntityCommand tileentitycommand) { + this.a = tileentitycommand; ++ sender = new org.bukkit.craftbukkit.command.CraftBlockCommandSender(this); // CraftBukkit - add sender + } + + public BlockPosition getChunkCoordinates() { diff --git a/nms-patches/TileEntityDispenser.patch b/nms-patches/TileEntityDispenser.patch new file mode 100644 index 00000000..918eb349 --- /dev/null +++ b/nms-patches/TileEntityDispenser.patch @@ -0,0 +1,63 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityDispenser.java 2014-11-27 08:59:46.905420949 +1100 ++++ src/main/java/net/minecraft/server/TileEntityDispenser.java 2014-11-27 08:42:10.116850981 +1100 +@@ -2,11 +2,43 @@ + + import java.util.Random; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.entity.HumanEntity; ++// CraftBukkit end ++ + public class TileEntityDispenser extends TileEntityContainer implements IInventory { + + private static final Random f = new Random(); + private ItemStack[] items = new ItemStack[9]; + protected String a; ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityDispenser() {} + +@@ -58,6 +90,7 @@ + + for (int k = 0; k < this.items.length; ++k) { + if (this.items[k] != null && TileEntityDispenser.f.nextInt(j++) == 0) { ++ if (this.items[k].count == 0) continue; // CraftBukkit + i = k; + } + } +@@ -140,7 +173,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { diff --git a/nms-patches/TileEntityFurnace.patch b/nms-patches/TileEntityFurnace.patch new file mode 100644 index 00000000..911664c5 --- /dev/null +++ b/nms-patches/TileEntityFurnace.patch @@ -0,0 +1,183 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityFurnace.java 2014-11-27 08:59:46.909420931 +1100 ++++ src/main/java/net/minecraft/server/TileEntityFurnace.java 2014-11-27 08:42:10.156850903 +1100 +@@ -1,5 +1,15 @@ + package net.minecraft.server; + ++// CraftBukkit start ++import java.util.List; ++ ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.FurnaceBurnEvent; ++import org.bukkit.event.inventory.FurnaceSmeltEvent; ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++// CraftBukkit end ++ + public class TileEntityFurnace extends TileEntityContainer implements IUpdatePlayerListBox, IWorldInventory { + + private static final int[] a = new int[] { 0}; +@@ -11,6 +21,32 @@ + public int cookTime; + private int cookTimeTotal; + private String m; ++ ++ // CraftBukkit start - add fields and methods ++ private int lastTick = MinecraftServer.currentTick; ++ private int maxStack = MAX_STACK; ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityFurnace() {} + +@@ -132,7 +168,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean isBurning() { +@@ -142,9 +178,27 @@ + public void c() { + boolean flag = this.isBurning(); + boolean flag1 = false; ++ ++ // CraftBukkit start - Use wall time instead of ticks for cooking ++ int elapsedTicks = MinecraftServer.currentTick - this.lastTick; ++ this.lastTick = MinecraftServer.currentTick; ++ ++ // CraftBukkit - moved from below ++ if (this.isBurning() && this.canBurn()) { ++ this.cookTime += elapsedTicks; ++ if (this.cookTime >= this.cookTimeTotal) { ++ this.cookTime = 0; ++ this.cookTimeTotal = this.a(this.items[0]); ++ this.burn(); ++ flag1 = true; ++ } ++ } else { ++ this.cookTime = 0; ++ } ++ // CraftBukkit end + + if (this.isBurning()) { +- --this.burnTime; ++ this.burnTime -= elapsedTicks; // CraftBukkit - use elapsedTicks in place of constant + } + + if (!this.world.isStatic) { +@@ -153,9 +207,21 @@ + this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.cookTimeTotal); + } + } else { +- if (!this.isBurning() && this.canBurn()) { +- this.ticksForCurrentFuel = this.burnTime = fuelTime(this.items[1]); +- if (this.isBurning()) { ++ // CraftBukkit start - Handle multiple elapsed ticks ++ if (this.burnTime <= 0 && this.canBurn()) { // CraftBukkit - == to <= ++ CraftItemStack fuel = CraftItemStack.asCraftMirror(this.items[1]); ++ ++ FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), fuel, fuelTime(this.items[1])); ++ this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent); ++ ++ if (furnaceBurnEvent.isCancelled()) { ++ return; ++ } ++ ++ this.ticksForCurrentFuel = furnaceBurnEvent.getBurnTime(); ++ this.burnTime += this.ticksForCurrentFuel; ++ if (this.burnTime > 0 && furnaceBurnEvent.isBurning()) { ++ // CraftBukkit end + flag1 = true; + if (this.items[1] != null) { + --this.items[1].count; +@@ -167,7 +233,8 @@ + } + } + } +- ++ ++ /* CraftBukkit start - Moved up + if (this.isBurning() && this.canBurn()) { + ++this.cookTime; + if (this.cookTime == this.cookTimeTotal) { +@@ -179,6 +246,7 @@ + } else { + this.cookTime = 0; + } ++ */ + } + + if (flag != this.isBurning()) { +@@ -202,20 +270,48 @@ + return false; + } else { + ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); +- +- return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count < this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count < itemstack.getMaxStackSize()))); ++ // CraftBukkit - consider resultant count instead of current count ++ return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count + itemstack.count <= this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count + itemstack.count <= itemstack.getMaxStackSize()))); ++ + } + } + + public void burn() { + if (this.canBurn()) { + ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); ++ ++ // CraftBukkit start - fire FurnaceSmeltEvent ++ CraftItemStack source = CraftItemStack.asCraftMirror(this.items[0]); ++ org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack); + ++ FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(this.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()), source, result); ++ this.world.getServer().getPluginManager().callEvent(furnaceSmeltEvent); ++ ++ if (furnaceSmeltEvent.isCancelled()) { ++ return; ++ } ++ ++ result = furnaceSmeltEvent.getResult(); ++ itemstack = CraftItemStack.asNMSCopy(result); ++ ++ if (itemstack != null) { ++ if (this.items[2] == null) { ++ this.items[2] = itemstack; ++ } else if (CraftItemStack.asCraftMirror(this.items[2]).isSimilar(result)) { ++ this.items[2].count += itemstack.count; ++ } else { ++ return; ++ } ++ } ++ ++ /* + if (this.items[2] == null) { + this.items[2] = itemstack.cloneItemStack(); + } else if (this.items[2].getItem() == itemstack.getItem()) { + ++this.items[2].count; + } ++ */ ++ // CraftBukkit end + + if (this.items[0].getItem() == Item.getItemOf(Blocks.SPONGE) && this.items[0].getData() == 1 && this.items[1] != null && this.items[1].getItem() == Items.BUCKET) { + this.items[1] = new ItemStack(Items.WATER_BUCKET); diff --git a/nms-patches/TileEntityHopper.patch b/nms-patches/TileEntityHopper.patch new file mode 100644 index 00000000..a8f1dc57 --- /dev/null +++ b/nms-patches/TileEntityHopper.patch @@ -0,0 +1,154 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityHopper.java 2014-11-27 08:59:46.909420931 +1100 ++++ src/main/java/net/minecraft/server/TileEntityHopper.java 2014-11-27 08:42:10.132850949 +1100 +@@ -2,11 +2,45 @@ + + import java.util.List; + ++// CraftBukkit start ++import org.bukkit.craftbukkit.entity.CraftHumanEntity; ++import org.bukkit.craftbukkit.inventory.CraftItemStack; ++import org.bukkit.entity.HumanEntity; ++import org.bukkit.event.inventory.InventoryMoveItemEvent; ++import org.bukkit.event.inventory.InventoryPickupItemEvent; ++import org.bukkit.inventory.Inventory; ++// CraftBukkit end ++ + public class TileEntityHopper extends TileEntityContainer implements IHopper, IUpdatePlayerListBox { + + private ItemStack[] items = new ItemStack[5]; + private String f; + private int g = -1; ++ ++ // CraftBukkit start - add fields and methods ++ public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); ++ private int maxStack = MAX_STACK; ++ ++ public ItemStack[] getContents() { ++ return this.items; ++ } ++ ++ public void onOpen(CraftHumanEntity who) { ++ transaction.add(who); ++ } ++ ++ public void onClose(CraftHumanEntity who) { ++ transaction.remove(who); ++ } ++ ++ public List<HumanEntity> getViewers() { ++ return transaction; ++ } ++ ++ public void setMaxStackSize(int size) { ++ maxStack = size; ++ } ++ // CraftBukkit end + + public TileEntityHopper() {} + +@@ -119,7 +153,7 @@ + } + + public int getMaxStackSize() { +- return 64; ++ return maxStack; // CraftBukkit + } + + public boolean a(EntityHuman entityhuman) { +@@ -215,10 +249,35 @@ + for (int i = 0; i < this.getSize(); ++i) { + if (this.getItem(i) != null) { + ItemStack itemstack = this.getItem(i).cloneItemStack(); +- ItemStack itemstack1 = addItem(iinventory, this.splitStack(i, 1), enumdirection); ++ // ItemStack itemstack1 = addItem(iinventory, this.splitStack(i, 1), enumdirection); ++ ++ // CraftBukkit start - Call event when pushing items into other inventories ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(i, 1)); ++ ++ Inventory destinationInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ destinationInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); ++ this.getWorld().getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ this.setItem(i, itemstack); ++ this.d(8); // Delay hopper checks ++ return false; ++ } ++ ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), enumdirection); + + if (itemstack1 == null || itemstack1.count == 0) { +- iinventory.update(); ++ if (event.getItem().equals(oitemstack)) { ++ iinventory.update(); ++ } else { ++ this.setItem(i, itemstack); ++ } ++ // CraftBukkit end + return true; + } + +@@ -325,10 +384,41 @@ + + if (itemstack != null && b(iinventory, itemstack, i, enumdirection)) { + ItemStack itemstack1 = itemstack.cloneItemStack(); +- ItemStack itemstack2 = addItem(ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); ++ // ItemStack itemstack2 = addItem(ihopper, iinventory.splitStack(i, 1), (EnumDirection) null); ++ // CraftBukkit start - Call event on collection of items from inventories into the hopper ++ CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); ++ ++ Inventory sourceInventory; ++ // Have to special case large chests as they work oddly ++ if (iinventory instanceof InventoryLargeChest) { ++ sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); ++ } else { ++ sourceInventory = iinventory.getOwner().getInventory(); ++ } ++ ++ InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false); ++ ++ ihopper.getWorld().getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ iinventory.setItem(i, itemstack1); ++ ++ if (ihopper instanceof TileEntityHopper) { ++ ((TileEntityHopper) ihopper).d(8); // Delay hopper checks ++ } else if (ihopper instanceof EntityMinecartHopper) { ++ ((EntityMinecartHopper) ihopper).l(4); // Delay hopper minecart checks ++ } ++ ++ return false; ++ } ++ ItemStack itemstack2 = addItem(ihopper, CraftItemStack.asNMSCopy(event.getItem()), null); + + if (itemstack2 == null || itemstack2.count == 0) { +- iinventory.update(); ++ if (event.getItem().equals(oitemstack)) { ++ iinventory.update(); ++ } else { ++ iinventory.setItem(i, itemstack1); ++ } ++ // CraftBukkit end + return true; + } + +@@ -344,6 +434,14 @@ + if (entityitem == null) { + return false; + } else { ++ // CraftBukkit start ++ InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory.getOwner().getInventory(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); ++ entityitem.world.getServer().getPluginManager().callEvent(event); ++ if (event.isCancelled()) { ++ return false; ++ } ++ // CraftBukkit end ++ + ItemStack itemstack = entityitem.getItemStack().cloneItemStack(); + ItemStack itemstack1 = addItem(iinventory, itemstack, (EnumDirection) null); + diff --git a/nms-patches/TileEntityNote.patch b/nms-patches/TileEntityNote.patch new file mode 100644 index 00000000..fd9a329b --- /dev/null +++ b/nms-patches/TileEntityNote.patch @@ -0,0 +1,16 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityNote.java 2014-11-27 08:59:46.913420913 +1100 ++++ src/main/java/net/minecraft/server/TileEntityNote.java 2014-11-27 08:42:10.172850872 +1100 +@@ -44,7 +44,12 @@ + b0 = 4; + } + +- world.playBlockAction(blockposition, Blocks.NOTEBLOCK, b0, this.note); ++ // CraftBukkit start ++ org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(this.world, blockposition.getX(), blockposition.getY(), blockposition.getZ(), b0, this.note); ++ if (!event.isCancelled()) { ++ world.playBlockAction(blockposition, Blocks.NOTEBLOCK, event.getInstrument().getType(), event.getNote().getId()); ++ } ++ // CraftBukkit end + } + } + } diff --git a/nms-patches/TileEntityPiston.patch b/nms-patches/TileEntityPiston.patch new file mode 100644 index 00000000..0c1fa1d0 --- /dev/null +++ b/nms-patches/TileEntityPiston.patch @@ -0,0 +1,10 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityPiston.java 2014-11-27 08:59:46.917420896 +1100 ++++ src/main/java/net/minecraft/server/TileEntityPiston.java 2014-11-27 08:42:10.152850911 +1100 +@@ -104,6 +104,7 @@ + } + + public void c() { ++ if (this.world == null) return; // CraftBukkit + this.j = this.i; + if (this.j >= 1.0F) { + this.a(1.0F, 0.25F); diff --git a/nms-patches/TileEntityRecordPlayer.patch b/nms-patches/TileEntityRecordPlayer.patch new file mode 100644 index 00000000..068fc0b2 --- /dev/null +++ b/nms-patches/TileEntityRecordPlayer.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntityRecordPlayer.java 2014-11-27 08:59:46.917420896 +1100 ++++ src/main/java/net/minecraft/server/TileEntityRecordPlayer.java 2014-11-27 08:42:10.164850887 +1100 +@@ -29,6 +29,11 @@ + } + + public void setRecord(ItemStack itemstack) { ++ // CraftBukkit start - There can only be one ++ if (itemstack != null) { ++ itemstack.count = 1; ++ } ++ // CraftBukkit end + this.record = itemstack; + this.update(); + } diff --git a/nms-patches/TileEntitySkull.patch b/nms-patches/TileEntitySkull.patch new file mode 100644 index 00000000..1504054f --- /dev/null +++ b/nms-patches/TileEntitySkull.patch @@ -0,0 +1,13 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/TileEntitySkull.java 2014-11-27 08:59:46.917420896 +1100 ++++ src/main/java/net/minecraft/server/TileEntitySkull.java 2014-11-27 08:42:10.168850880 +1100 +@@ -105,4 +105,10 @@ + public void setRotation(int i) { + this.rotation = i; + } ++ ++ // CraftBukkit start - add method ++ public int getRotation() { ++ return this.rotation; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/Village.patch b/nms-patches/Village.patch new file mode 100644 index 00000000..9b58e724 --- /dev/null +++ b/nms-patches/Village.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/Village.java 2014-11-27 08:59:46.921420877 +1100 ++++ src/main/java/net/minecraft/server/Village.java 2014-11-27 08:42:10.104851005 +1100 +@@ -60,7 +60,7 @@ + EntityIronGolem entityirongolem = new EntityIronGolem(this.a); + + entityirongolem.setPosition(vec3d.a, vec3d.b, vec3d.c); +- this.a.addEntity(entityirongolem); ++ this.a.addEntity(entityirongolem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit + ++this.l; + } + } diff --git a/nms-patches/VillageSiege.patch b/nms-patches/VillageSiege.patch new file mode 100644 index 00000000..f6da3f10 --- /dev/null +++ b/nms-patches/VillageSiege.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/VillageSiege.java 2014-11-27 08:59:46.921420877 +1100 ++++ src/main/java/net/minecraft/server/VillageSiege.java 2014-11-27 08:42:10.100851012 +1100 +@@ -140,7 +140,7 @@ + } + + entityzombie.setPositionRotation(vec3d.a, vec3d.b, vec3d.c, this.a.random.nextFloat() * 360.0F, 0.0F); +- this.a.addEntity(entityzombie); ++ this.a.addEntity(entityzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION); // CraftBukkit + BlockPosition blockposition = this.f.a(); + + entityzombie.a(blockposition, this.f.b()); diff --git a/nms-patches/World.patch b/nms-patches/World.patch new file mode 100644 index 00000000..03912ea0 --- /dev/null +++ b/nms-patches/World.patch @@ -0,0 +1,560 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/World.java 2014-11-27 08:59:46.933420825 +1100 ++++ src/main/java/net/minecraft/server/World.java 2014-11-27 08:42:10.132850949 +1100 +@@ -13,6 +13,22 @@ + import java.util.UUID; + import java.util.concurrent.Callable; + ++// CraftBukkit start ++import org.bukkit.Bukkit; ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.util.CraftMagicNumbers; ++import org.bukkit.craftbukkit.util.LongHashSet; ++import org.bukkit.generator.ChunkGenerator; ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.event.CraftEventFactory; ++import org.bukkit.event.block.BlockCanBuildEvent; ++import org.bukkit.event.block.BlockPhysicsEvent; ++import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; ++import org.bukkit.event.weather.WeatherChangeEvent; ++import org.bukkit.event.weather.ThunderChangeEvent; ++// CraftBukkit end ++ + public abstract class World implements IBlockAccess { + + protected boolean e; +@@ -47,7 +63,8 @@ + private final Calendar J = Calendar.getInstance(); + public Scoreboard scoreboard = new Scoreboard(); + public final boolean isStatic; +- protected Set chunkTickList = Sets.newHashSet(); ++ // CraftBukkit - longhashset ++ protected LongHashSet chunkTickList = new LongHashSet(); + private int K; + public boolean allowMonsters; + public boolean allowAnimals; +@@ -55,7 +72,39 @@ + private final WorldBorder M; + int[] H; + +- protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag) { ++ // CraftBukkit start Added the following ++ private final CraftWorld world; ++ public boolean pvpMode; ++ public boolean keepSpawnInMemory = true; ++ public ChunkGenerator generator; ++ ++ public boolean captureBlockStates = false; ++ public boolean captureTreeGeneration = false; ++ public ArrayList<BlockState> capturedBlockStates= new ArrayList<BlockState>(); ++ public long ticksPerAnimalSpawns; ++ public long ticksPerMonsterSpawns; ++ public boolean populating; ++ private int tickPosition; ++ ++ public CraftWorld getWorld() { ++ return this.world; ++ } ++ ++ public CraftServer getServer() { ++ return (CraftServer) Bukkit.getServer(); ++ } ++ ++ public Chunk getChunkIfLoaded(int x, int z) { ++ return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z); ++ } ++ ++ protected World(IDataManager idatamanager, WorldData worlddata, WorldProvider worldprovider, MethodProfiler methodprofiler, boolean flag, ChunkGenerator gen, org.bukkit.World.Environment env) { ++ this.generator = gen; ++ this.world = new CraftWorld((WorldServer) this, gen, env); ++ this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit ++ this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit ++ // CraftBukkit end ++ + this.K = this.random.nextInt(12000); + this.allowMonsters = true; + this.allowAnimals = true; +@@ -66,6 +115,8 @@ + this.worldProvider = worldprovider; + this.isStatic = flag; + this.M = worldprovider.getWorldBorder(); ++ ++ this.getServer().addWorld(this.world); // CraftBukkit + } + + public World b() { +@@ -184,6 +235,27 @@ + } + + public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) { ++ // CraftBukkit start - tree generation ++ if (this.captureTreeGeneration) { ++ BlockState blockstate = null; ++ Iterator<BlockState> it = capturedBlockStates.iterator(); ++ while (it.hasNext()) { ++ BlockState previous = it.next(); ++ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) { ++ blockstate = previous; ++ it.remove(); ++ break; ++ } ++ } ++ if (blockstate == null) { ++ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i); ++ } ++ blockstate.setTypeId(CraftMagicNumbers.getId(iblockdata.getBlock())); ++ blockstate.setRawData((byte) iblockdata.getBlock().toLegacyData(iblockdata)); ++ this.capturedBlockStates.add(blockstate); ++ return true; ++ } ++ // CraftBukkit end + if (!this.isValidLocation(blockposition)) { + return false; + } else if (!this.isStatic && this.worldData.getType() == WorldType.DEBUG_ALL_BLOCK_STATES) { +@@ -191,9 +263,23 @@ + } else { + Chunk chunk = this.getChunkAtWorldCoords(blockposition); + Block block = iblockdata.getBlock(); ++ ++ // CraftBukkit start - capture blockstates ++ BlockState blockstate = null; ++ if (this.captureBlockStates) { ++ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, blockposition.getX(), blockposition.getY(), blockposition.getZ(), i); ++ this.capturedBlockStates.add(blockstate); ++ } ++ // CraftBukkit end ++ + IBlockData iblockdata1 = chunk.a(blockposition, iblockdata); + + if (iblockdata1 == null) { ++ // CraftBukkit start - remove blockstate if failed ++ if (!this.captureBlockStates) { ++ this.capturedBlockStates.remove(blockstate); ++ } ++ // CraftBukkit end + return false; + } else { + Block block1 = iblockdata1.getBlock(); +@@ -204,6 +290,7 @@ + this.methodProfiler.b(); + } + ++ /* + if ((i & 2) != 0 && (!this.isStatic || (i & 4) == 0) && chunk.isReady()) { + this.notify(blockposition); + } +@@ -214,12 +301,35 @@ + this.updateAdjacentComparators(blockposition, block); + } + } ++ */ ++ ++ // CraftBukkit start ++ if (!this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates ++ // Modularize client and physic updates ++ notifyAndUpdatePhysics(blockposition, chunk, block1, block, i); ++ } ++ // CraftBukkit end + + return true; + } + } + } + ++ // CraftBukkit start - Split off from original setTypeAndData(int i, int j, int k, Block block, int l, int i1) method in order to directly send client and physic updates ++ public void notifyAndUpdatePhysics(BlockPosition blockposition, Chunk chunk, Block oldBlock, Block newBLock, int flag) { ++ if ((flag & 2) != 0 && (chunk == null || chunk.isReady())) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement ++ this.notify(blockposition); ++ } ++ ++ if (!this.isStatic && (flag & 1) != 0) { ++ this.update(blockposition, oldBlock); ++ if (newBLock.isComplexRedstone()) { ++ this.updateAdjacentComparators(blockposition, newBLock); ++ } ++ } ++ } ++ // CraftBukkit end ++ + public boolean setAir(BlockPosition blockposition) { + return this.setTypeAndData(blockposition, Blocks.AIR.getBlockData(), 3); + } +@@ -253,6 +363,11 @@ + + public void update(BlockPosition blockposition, Block block) { + if (this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { ++ // CraftBukkit start ++ if (populating) { ++ return; ++ } ++ // CraftBukkit end + this.applyPhysics(blockposition, block); + } + +@@ -328,6 +443,17 @@ + IBlockData iblockdata = this.getType(blockposition); + + try { ++ // CraftBukkit start ++ CraftWorld world = ((WorldServer) this).getWorld(); ++ if (world != null) { ++ BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block)); ++ this.getServer().getPluginManager().callEvent(event); ++ ++ if (event.isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end + iblockdata.getBlock().doPhysics(this, blockposition, iblockdata, block); + } catch (Throwable throwable) { + CrashReport crashreport = CrashReport.a(throwable, "Exception while updating neighbours"); +@@ -497,6 +623,17 @@ + } + + public IBlockData getType(BlockPosition blockposition) { ++ // CraftBukkit start - tree generation ++ if (captureTreeGeneration) { ++ Iterator<BlockState> it = capturedBlockStates.iterator(); ++ while (it.hasNext()) { ++ BlockState previous = it.next(); ++ if (previous.getX() == blockposition.getX() && previous.getY() == blockposition.getY() && previous.getZ() == blockposition.getZ()) { ++ return CraftMagicNumbers.getBlock(previous.getTypeId()).fromLegacyData(previous.getRawData()); ++ } ++ } ++ } ++ // CraftBukkit end + if (!this.isValidLocation(blockposition)) { + return Blocks.AIR.getBlockData(); + } else { +@@ -704,6 +841,13 @@ + } + + public boolean addEntity(Entity entity) { ++ // CraftBukkit start - Used for entities other than creatures ++ return addEntity(entity, SpawnReason.DEFAULT); ++ } ++ ++ public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason ++ if (entity == null) return false; ++ // CraftBukkit end + int i = MathHelper.floor(entity.locX / 16.0D); + int j = MathHelper.floor(entity.locZ / 16.0D); + boolean flag = entity.attachedToPlayer; +@@ -712,7 +856,35 @@ + flag = true; + } + ++ // CraftBukkit start ++ org.bukkit.event.Cancellable event = null; ++ if (entity instanceof EntityLiving && !(entity instanceof EntityPlayer)) { ++ boolean isAnimal = entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal || entity instanceof EntityGolem; ++ boolean isMonster = entity instanceof EntityMonster || entity instanceof EntityGhast || entity instanceof EntitySlime; ++ ++ if (spawnReason != SpawnReason.CUSTOM) { ++ if (isAnimal && !allowAnimals || isMonster && !allowMonsters) { ++ entity.dead = true; ++ return false; ++ } ++ } ++ ++ event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason); ++ } else if (entity instanceof EntityItem) { ++ event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity); ++ } else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) { ++ // Not all projectiles extend EntityProjectile, so check for Bukkit interface instead ++ event = CraftEventFactory.callProjectileLaunchEvent(entity); ++ } ++ ++ if (event != null && (event.isCancelled() || entity.dead)) { ++ entity.dead = true; ++ return false; ++ } ++ // CraftBukkit end ++ + if (!flag && !this.isChunkLoaded(i, j, true)) { ++ entity.dead = true; + return false; + } else { + if (entity instanceof EntityHuman) { +@@ -734,6 +906,7 @@ + ((IWorldAccess) this.u.get(i)).a(entity); + } + ++ entity.valid = true; // CraftBukkit + } + + protected void b(Entity entity) { +@@ -741,6 +914,7 @@ + ((IWorldAccess) this.u.get(i)).b(entity); + } + ++ entity.valid = false; // CraftBukkit + } + + public void kill(Entity entity) { +@@ -775,7 +949,15 @@ + this.getChunkAt(i, j).b(entity); + } + +- this.entityList.remove(entity); ++ // CraftBukkit start - Decrement loop variable field if we've already ticked this entity ++ int index = this.entityList.indexOf(entity); ++ if (index != -1) { ++ if (index <= this.tickPosition) { ++ this.tickPosition--; ++ } ++ this.entityList.remove(index); ++ } ++ // CraftBukkit end + this.b(entity); + } + +@@ -958,6 +1140,11 @@ + + for (i = 0; i < this.k.size(); ++i) { + entity = (Entity) this.k.get(i); ++ // CraftBukkit start - Fixed an NPE ++ if (entity == null) { ++ continue; ++ } ++ // CraftBukkit end + + try { + ++entity.ticksLived; +@@ -1001,8 +1188,10 @@ + this.g.clear(); + this.methodProfiler.c("regular"); + +- for (i = 0; i < this.entityList.size(); ++i) { +- entity = (Entity) this.entityList.get(i); ++ // CraftBukkit start - Use field for loop variable ++ for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { ++ entity = (Entity) this.entityList.get(this.tickPosition); ++ // CraftBukkit end + if (entity.vehicle != null) { + if (!entity.vehicle.dead && entity.vehicle.passenger == entity) { + continue; +@@ -1033,7 +1222,7 @@ + this.getChunkAt(j, k).b(entity); + } + +- this.entityList.remove(i--); ++ this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable + this.b(entity); + } + +@@ -1042,6 +1231,14 @@ + + this.methodProfiler.c("blockEntities"); + this.L = true; ++ // CraftBukkit start - From below, clean up tile entities before ticking them ++ if (!this.b.isEmpty()) { ++ this.tileEntityList.removeAll(this.b); ++ this.h.removeAll(this.b); ++ this.b.clear(); ++ } ++ // CraftBukkit end ++ + Iterator iterator = this.tileEntityList.iterator(); + + while (iterator.hasNext()) { +@@ -1073,11 +1270,13 @@ + } + + this.L = false; ++ /* CraftBukkit start - Moved up + if (!this.b.isEmpty()) { + this.tileEntityList.removeAll(this.b); + this.h.removeAll(this.b); + this.b.clear(); + } ++ */ // CraftBukkit end + + this.methodProfiler.c("pendingBlockEntities"); + if (!this.a.isEmpty()) { +@@ -1085,9 +1284,11 @@ + TileEntity tileentity1 = (TileEntity) this.a.get(l); + + if (!tileentity1.x()) { ++ /* CraftBukkit start - Order matters, moved down + if (!this.h.contains(tileentity1)) { + this.a(tileentity1); + } ++ // CraftBukkit end */ + + if (this.isLoaded(tileentity1.getPosition())) { + this.getChunkAtWorldCoords(tileentity1.getPosition()).a(tileentity1.getPosition(), tileentity1); +@@ -1141,7 +1342,10 @@ + int j = MathHelper.floor(entity.locZ); + byte b0 = 32; + +- if (!flag || this.isAreaLoaded(i - b0, 0, j - b0, i + b0, 0, j + b0, true)) { ++ // CraftBukkit start - Use neighbor cache instead of looking up ++ Chunk startingChunk = this.getChunkIfLoaded(i >> 4, j >> 4); ++ if (!flag || (startingChunk != null && startingChunk.areNeighborsLoaded(2)) /* this.isAreaLoaded(i - b0, 0, j - b0, i + b0, 0, j + b0) */) { ++ // CraftBukkit end + entity.P = entity.locX; + entity.Q = entity.locY; + entity.R = entity.locZ; +@@ -1615,7 +1819,13 @@ + --j; + this.worldData.setThunderDuration(j); + if (j <= 0) { +- this.worldData.setThundering(!this.worldData.isThundering()); ++ // CraftBukkit start ++ ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), !this.worldData.isThundering()); ++ this.getServer().getPluginManager().callEvent(thunder); ++ if (!thunder.isCancelled()) { ++ this.worldData.setThundering(!this.worldData.isThundering()); ++ } ++ // CraftBukkit end + } + } + +@@ -1639,7 +1849,14 @@ + --k; + this.worldData.setWeatherDuration(k); + if (k <= 0) { +- this.worldData.setStorm(!this.worldData.hasStorm()); ++ // CraftBukkit start ++ WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), !this.worldData.hasStorm()); ++ this.getServer().getPluginManager().callEvent(weather); ++ ++ if (!weather.isCancelled()) { ++ this.worldData.setStorm(!this.worldData.hasStorm()); ++ } ++ // CraftBukkit end + } + } + +@@ -1656,7 +1873,7 @@ + } + + protected void D() { +- this.chunkTickList.clear(); ++ // this.chunkTickList.clear(); // CraftBukkit - removed + this.methodProfiler.a("buildList"); + + int i; +@@ -1673,7 +1890,7 @@ + + for (int i1 = -l; i1 <= l; ++i1) { + for (int j1 = -l; j1 <= l; ++j1) { +- this.chunkTickList.add(new ChunkCoordIntPair(i1 + j, j1 + k)); ++ this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(i1 + j, j1 + k)); + } + } + } +@@ -1851,7 +2068,10 @@ + } + + public boolean c(EnumSkyBlock enumskyblock, BlockPosition blockposition) { +- if (!this.areChunksLoaded(blockposition, 17, false)) { ++ // CraftBukkit start - Use neighbor cache instead of looking up ++ Chunk chunk = this.getChunkIfLoaded(blockposition.getX() >> 4, blockposition.getZ() >> 4); ++ if (chunk == null || !chunk.areNeighborsLoaded(1) /*!this.areChunksLoaded(blockposition, 17, false)*/) { ++ // CraftBukkit end + return false; + } else { + int i = 0; +@@ -2095,8 +2315,17 @@ + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); ++ // CraftBukkit start - Split out persistent check, don't apply it to special persistent mobs ++ if (entity instanceof EntityInsentient) { ++ EntityInsentient entityinsentient = (EntityInsentient) entity; ++ if (entityinsentient.isTypeNotPersistent() && entityinsentient.isPersistent()) { ++ continue; ++ } ++ } + +- if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { ++ if (oclass.isAssignableFrom(entity.getClass())) { ++ // if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { ++ // CraftBukkit end + ++i; + } + } +@@ -2105,12 +2334,17 @@ + } + + public void b(Collection collection) { +- this.entityList.addAll(collection); ++ // CraftBukkit start ++ // this.entityList.addAll(collection); + Iterator iterator = collection.iterator(); + + while (iterator.hasNext()) { + Entity entity = (Entity) iterator.next(); +- ++ if (entity == null) { ++ continue; ++ } ++ this.entityList.add(entity); ++ // CraftBukkit end + this.a(entity); + } + +@@ -2124,7 +2358,13 @@ + Block block1 = this.getType(blockposition).getBlock(); + AxisAlignedBB axisalignedbb = flag ? null : block.a(this, blockposition, block.getBlockData()); + +- return axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection, itemstack)); ++ // CraftBukkit start - store default return ++ boolean defaultReturn = axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, blockposition, enumdirection, itemstack)); ++ BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()), CraftMagicNumbers.getId(block), defaultReturn); ++ this.getServer().getPluginManager().callEvent(event); ++ ++ return event.isBuildable(); ++ // CraftBukkit end + } + + public int getBlockPower(BlockPosition blockposition, EnumDirection enumdirection) { +@@ -2215,6 +2455,11 @@ + + for (int i = 0; i < this.players.size(); ++i) { + EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); ++ // CraftBukkit start - Fixed an NPE ++ if (entityhuman1 == null || entityhuman1.dead) { ++ continue; ++ } ++ // CraftBukkit end + + if (IEntitySelector.d.apply(entityhuman1)) { + double d5 = entityhuman1.e(d0, d1, d2); +@@ -2269,7 +2514,7 @@ + return null; + } + +- public void checkSession() { ++ public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - added throws + this.dataManager.checkSession(); + } + +@@ -2331,6 +2576,16 @@ + + public void everyoneSleeping() {} + ++ // CraftBukkit start ++ // Calls the method that checks to see if players are sleeping ++ // Called by CraftPlayer.setPermanentSleeping() ++ public void checkSleepStatus() { ++ if (!this.isStatic) { ++ this.everyoneSleeping(); ++ } ++ } ++ // CraftBukkit end ++ + public float h(float f) { + return (this.q + (this.r - this.q) * f) * this.j(f); + } +@@ -2538,6 +2793,6 @@ + int l = j * 16 + 8 - blockposition.getZ(); + short short0 = 128; + +- return k >= -short0 && k <= short0 && l >= -short0 && l <= short0; ++ return k >= -short0 && k <= short0 && l >= -short0 && l <= short0 || !this.keepSpawnInMemory; // CraftBukkit - Added 'this.world.keepSpawnInMemory' + } + } diff --git a/nms-patches/WorldBorder.patch b/nms-patches/WorldBorder.patch new file mode 100644 index 00000000..37416ef7 --- /dev/null +++ b/nms-patches/WorldBorder.patch @@ -0,0 +1,25 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldBorder.java 2014-11-27 08:59:46.925420860 +1100 ++++ src/main/java/net/minecraft/server/WorldBorder.java 2014-11-27 08:42:10.168850880 +1100 +@@ -32,9 +32,21 @@ + return (double) (blockposition.getX() + 1) > this.b() && (double) blockposition.getX() < this.d() && (double) (blockposition.getZ() + 1) > this.c() && (double) blockposition.getZ() < this.e(); + } + ++ // CraftBukkit start - split method + public boolean isInBounds(ChunkCoordIntPair chunkcoordintpair) { +- return (double) chunkcoordintpair.e() > this.b() && (double) chunkcoordintpair.c() < this.d() && (double) chunkcoordintpair.f() > this.c() && (double) chunkcoordintpair.d() < this.e(); ++ return isInBounds(chunkcoordintpair.x, chunkcoordintpair.z); + } ++ ++ // Inlined the getters from ChunkCoordIntPair ++ public boolean isInBounds(long chunkcoords) { ++ return isInBounds(org.bukkit.craftbukkit.util.LongHash.msw(chunkcoords), org.bukkit.craftbukkit.util.LongHash.lsw(chunkcoords)); ++ } ++ ++ // Inlined the getters from ChunkCoordIntPair ++ public boolean isInBounds(int x, int z) { ++ return (double) ((x << 4) + 15) > this.b() && (double) (x << 4) < this.d() && (double) ((z << 4) + 15) > this.c() && (double) (x << 4) < this.e(); ++ } ++ // CraftBukkit end + + public boolean a(AxisAlignedBB axisalignedbb) { + return axisalignedbb.d > this.b() && axisalignedbb.a < this.d() && axisalignedbb.f > this.c() && axisalignedbb.c < this.e(); diff --git a/nms-patches/WorldGenGroundBush.patch b/nms-patches/WorldGenGroundBush.patch new file mode 100644 index 00000000..9a633c3b --- /dev/null +++ b/nms-patches/WorldGenGroundBush.patch @@ -0,0 +1,14 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenGroundBush.java 2014-11-27 08:59:46.925420860 +1100 ++++ src/main/java/net/minecraft/server/WorldGenGroundBush.java 2014-11-27 08:42:10.144850927 +1100 +@@ -46,7 +46,11 @@ + } + } + } ++ // CraftBukkit start - Return false if gen was unsuccessful ++ } else { ++ return false; + } ++ // CraftBukkit end + + return true; + } diff --git a/nms-patches/WorldGenMegaTreeAbstract.patch b/nms-patches/WorldGenMegaTreeAbstract.patch new file mode 100644 index 00000000..4dcc8625 --- /dev/null +++ b/nms-patches/WorldGenMegaTreeAbstract.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenMegaTreeAbstract.java 2014-11-27 08:59:46.925420860 +1100 ++++ src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java 2014-11-27 08:42:10.140850934 +1100 +@@ -42,7 +42,7 @@ + + for (int k = -b0; k <= b0 && flag; ++k) { + for (int l = -b0; l <= b0 && flag; ++l) { +- if (blockposition.getY() + j < 0 || blockposition.getY() + j >= 256 || !this.a(world.getType(blockposition.a(k, j, l)).getBlock())) { ++ if (blockposition.getY() + j < 0 || blockposition.getY() + j >= 256 || (!this.a(world.getType(blockposition.a(k, j, l)).getBlock()) && world.getType(blockposition.a(k, j, l)).getBlock() != Blocks.SAPLING)) { // CraftBukkit - ignore our own saplings + flag = false; + } + } diff --git a/nms-patches/WorldGenVillagePiece.patch b/nms-patches/WorldGenVillagePiece.patch new file mode 100644 index 00000000..ff11ea6a --- /dev/null +++ b/nms-patches/WorldGenVillagePiece.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenVillagePiece.java 2014-11-27 08:59:46.929420842 +1100 ++++ src/main/java/net/minecraft/server/WorldGenVillagePiece.java 2014-11-27 08:42:10.144850927 +1100 +@@ -114,7 +114,7 @@ + entityvillager.setPositionRotation((double) j1 + 0.5D, (double) k1, (double) l1 + 0.5D, 0.0F, 0.0F); + entityvillager.prepare(world.E(new BlockPosition(entityvillager)), (GroupDataEntity) null); + entityvillager.setProfession(this.c(i1, entityvillager.getProfession())); +- world.addEntity(entityvillager); ++ world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason + } + + } diff --git a/nms-patches/WorldGenVillagePieces.patch b/nms-patches/WorldGenVillagePieces.patch new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/nms-patches/WorldGenVillagePieces.patch diff --git a/nms-patches/WorldGenWitchHut.patch b/nms-patches/WorldGenWitchHut.patch new file mode 100644 index 00000000..cfd76bed --- /dev/null +++ b/nms-patches/WorldGenWitchHut.patch @@ -0,0 +1,11 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldGenWitchHut.java 2014-11-27 08:59:46.933420825 +1100 ++++ src/main/java/net/minecraft/server/WorldGenWitchHut.java 2014-11-27 08:42:10.152850911 +1100 +@@ -77,7 +77,7 @@ + + entitywitch.setPositionRotation((double) i1 + 0.5D, (double) j1, (double) k1 + 0.5D, 0.0F, 0.0F); + entitywitch.prepare(world.E(new BlockPosition(i1, j1, k1)), (GroupDataEntity) null); +- world.addEntity(entitywitch); ++ world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason + } + } + diff --git a/nms-patches/WorldManager.patch b/nms-patches/WorldManager.patch new file mode 100644 index 00000000..a7f97b03 --- /dev/null +++ b/nms-patches/WorldManager.patch @@ -0,0 +1,28 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldManager.java 2014-11-27 08:59:46.937420807 +1100 ++++ src/main/java/net/minecraft/server/WorldManager.java 2014-11-27 08:42:10.132850949 +1100 +@@ -23,11 +23,13 @@ + } + + public void a(String s, double d0, double d1, double d2, float f, float f1) { +- this.a.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.worldProvider.getDimension(), new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); ++ // CraftBukkit - this.world.dimension ++ this.a.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); + } + + public void a(EntityHuman entityhuman, String s, double d0, double d1, double d2, float f, float f1) { +- this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.worldProvider.getDimension(), new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); ++ // CraftBukkit - this.world.dimension ++ this.a.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); + } + + public void a(int i, int j, int k, int l, int i1, int j1) {} +@@ -41,7 +43,8 @@ + public void a(String s, BlockPosition blockposition) {} + + public void a(EntityHuman entityhuman, int i, BlockPosition blockposition, int j) { +- this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.worldProvider.getDimension(), new PacketPlayOutWorldEvent(i, blockposition, j, false)); ++ // CraftBukkit - this.world.dimension ++ this.a.getPlayerList().sendPacketNearby(entityhuman, (double) blockposition.getX(), (double) blockposition.getY(), (double) blockposition.getZ(), 64.0D, this.world.dimension, new PacketPlayOutWorldEvent(i, blockposition, j, false)); + } + + public void a(int i, BlockPosition blockposition, int j) { diff --git a/nms-patches/WorldMap.patch b/nms-patches/WorldMap.patch new file mode 100644 index 00000000..86ba2aa6 --- /dev/null +++ b/nms-patches/WorldMap.patch @@ -0,0 +1,95 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldMap.java 2014-11-27 08:59:46.941420790 +1100 ++++ src/main/java/net/minecraft/server/WorldMap.java 2014-11-27 08:42:10.152850911 +1100 +@@ -6,6 +6,14 @@ + import java.util.List; + import java.util.Map; + ++// CraftBukkit start ++import java.util.UUID; ++ ++import org.bukkit.craftbukkit.CraftServer; ++import org.bukkit.craftbukkit.CraftWorld; ++import org.bukkit.craftbukkit.map.CraftMapView; ++// CraftBukkit end ++ + public class WorldMap extends PersistentBase { + + public int centerX; +@@ -16,9 +24,19 @@ + public List g = Lists.newArrayList(); + private Map i = Maps.newHashMap(); + public Map decorations = Maps.newLinkedHashMap(); ++ ++ // CraftBukkit start ++ public final CraftMapView mapView; ++ private CraftServer server; ++ private UUID uniqueId = null; ++ // CraftBukkit end + + public WorldMap(String s) { + super(s); ++ // CraftBukkit start ++ mapView = new CraftMapView(this); ++ server = (CraftServer) org.bukkit.Bukkit.getServer(); ++ // CraftBukkit end + } + + public void a(double d0, double d1, int i) { +@@ -31,7 +49,30 @@ + } + + public void a(NBTTagCompound nbttagcompound) { +- this.map = nbttagcompound.getByte("dimension"); ++ // CraftBukkit start ++ byte dimension = nbttagcompound.getByte("dimension"); ++ ++ if (dimension >= 10) { ++ long least = nbttagcompound.getLong("UUIDLeast"); ++ long most = nbttagcompound.getLong("UUIDMost"); ++ ++ if (least != 0L && most != 0L) { ++ this.uniqueId = new UUID(most, least); ++ ++ CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId); ++ // Check if the stored world details are correct. ++ if (world == null) { ++ /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached. ++ This is to prevent them being corrupted with the wrong map data. */ ++ dimension = 127; ++ } else { ++ dimension = (byte) world.getHandle().dimension; ++ } ++ } ++ } ++ ++ this.map = dimension; ++ // CraftBukkit end + this.centerX = nbttagcompound.getInt("xCenter"); + this.centerZ = nbttagcompound.getInt("zCenter"); + this.scale = nbttagcompound.getByte("scale"); +@@ -66,6 +107,25 @@ + } + + public void b(NBTTagCompound nbttagcompound) { ++ // CraftBukkit start ++ if (this.map >= 10) { ++ if (this.uniqueId == null) { ++ for (org.bukkit.World world : server.getWorlds()) { ++ CraftWorld cWorld = (CraftWorld) world; ++ if (cWorld.getHandle().dimension == this.map) { ++ this.uniqueId = cWorld.getUID(); ++ break; ++ } ++ } ++ } ++ /* Perform a second check to see if a matching world was found, this is a necessary ++ change incase Maps are forcefully unlinked from a World and lack a UID.*/ ++ if (this.uniqueId != null) { ++ nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); ++ nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); ++ } ++ } ++ // CraftBukkit end + nbttagcompound.setByte("dimension", this.map); + nbttagcompound.setInt("xCenter", this.centerX); + nbttagcompound.setInt("zCenter", this.centerZ); diff --git a/nms-patches/WorldMapHumanTracker.patch b/nms-patches/WorldMapHumanTracker.patch new file mode 100644 index 00000000..627bbbfd --- /dev/null +++ b/nms-patches/WorldMapHumanTracker.patch @@ -0,0 +1,31 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldMapHumanTracker.java 2014-11-27 08:59:46.937420807 +1100 ++++ src/main/java/net/minecraft/server/WorldMapHumanTracker.java 2014-11-27 08:42:10.168850880 +1100 +@@ -23,12 +23,26 @@ + } + + public Packet a(ItemStack itemstack) { ++ // CraftBukkit start ++ org.bukkit.craftbukkit.map.RenderData render = this.worldMap.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) this.trackee.getBukkitEntity()); // CraftBukkit ++ ++ java.util.Collection<MapIcon> icons = new java.util.ArrayList<MapIcon>(); ++ ++ for ( org.bukkit.map.MapCursor cursor : render.cursors) { ++ ++ if (cursor.isVisible()) { ++ icons.add(new MapIcon(cursor.getRawType(), cursor.getX(), cursor.getY(), cursor.getDirection())); ++ } ++ } ++ ++ + if (this.d) { + this.d = false; +- return new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, this.worldMap.decorations.values(), this.worldMap.colors, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); ++ return new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, icons, render.buffer, this.e, this.f, this.g + 1 - this.e, this.h + 1 - this.f); + } else { +- return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, this.worldMap.decorations.values(), this.worldMap.colors, 0, 0, 0, 0) : null; ++ return this.i++ % 5 == 0 ? new PacketPlayOutMap(itemstack.getData(), this.worldMap.scale, icons, render.buffer, 0, 0, 0, 0) : null; + } ++ // CraftBukkit end + } + + public void a(int i, int j) { diff --git a/nms-patches/WorldNBTStorage.patch b/nms-patches/WorldNBTStorage.patch new file mode 100644 index 00000000..503af702 --- /dev/null +++ b/nms-patches/WorldNBTStorage.patch @@ -0,0 +1,123 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldNBTStorage.java 2014-11-27 08:59:46.941420790 +1100 ++++ src/main/java/net/minecraft/server/WorldNBTStorage.java 2014-11-27 08:42:10.156850903 +1100 +@@ -11,6 +11,12 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.UUID; ++ ++import org.bukkit.craftbukkit.entity.CraftPlayer; ++// CraftBukkit end ++ + public class WorldNBTStorage implements IDataManager, IPlayerFileData { + + private static final Logger a = LogManager.getLogger(); +@@ -19,6 +25,7 @@ + private final File dataDir; + private final long sessionId = MinecraftServer.ax(); + private final String f; ++ private UUID uuid = null; // CraftBukkit + + public WorldNBTStorage(File file, String s, boolean flag) { + this.baseDir = new File(file, s); +@@ -55,7 +62,7 @@ + return this.baseDir; + } + +- public void checkSession() { ++ public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - throws ExceptionWorldConflict + try { + File file = new File(this.baseDir, "session.lock"); + DataInputStream datainputstream = new DataInputStream(new FileInputStream(file)); +@@ -202,12 +209,39 @@ + } + + if (nbttagcompound != null) { ++ // CraftBukkit start ++ if (entityhuman instanceof EntityPlayer) { ++ CraftPlayer player = (CraftPlayer) entityhuman.getBukkitEntity(); ++ // Only update first played if it is older than the one we have ++ long modified = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat").lastModified(); ++ if (modified < player.getFirstPlayed()) { ++ player.setFirstPlayed(modified); ++ } ++ } ++ // CraftBukkit end ++ + entityhuman.f(nbttagcompound); + } + + return nbttagcompound; + } + ++ // CraftBukkit start ++ public NBTTagCompound getPlayerData(String s) { ++ try { ++ File file1 = new File(this.playerDir, s + ".dat"); ++ ++ if (file1.exists()) { ++ return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); ++ } ++ } catch (Exception exception) { ++ a.warn("Failed to load player data for " + s); ++ } ++ ++ return null; ++ } ++ // CraftBukkit end ++ + public IPlayerFileData getPlayerFileData() { + return this; + } +@@ -237,4 +271,50 @@ + public String g() { + return this.f; + } ++ ++ // CraftBukkit start ++ public UUID getUUID() { ++ if (uuid != null) return uuid; ++ File file1 = new File(this.baseDir, "uid.dat"); ++ if (file1.exists()) { ++ DataInputStream dis = null; ++ try { ++ dis = new DataInputStream(new FileInputStream(file1)); ++ return uuid = new UUID(dis.readLong(), dis.readLong()); ++ } catch (IOException ex) { ++ a.warn("Failed to read " + file1 + ", generating new random UUID", ex); ++ } finally { ++ if (dis != null) { ++ try { ++ dis.close(); ++ } catch (IOException ex) { ++ // NOOP ++ } ++ } ++ } ++ } ++ uuid = UUID.randomUUID(); ++ DataOutputStream dos = null; ++ try { ++ dos = new DataOutputStream(new FileOutputStream(file1)); ++ dos.writeLong(uuid.getMostSignificantBits()); ++ dos.writeLong(uuid.getLeastSignificantBits()); ++ } catch (IOException ex) { ++ a.warn("Failed to write " + file1, ex); ++ } finally { ++ if (dos != null) { ++ try { ++ dos.close(); ++ } catch (IOException ex) { ++ // NOOP ++ } ++ } ++ } ++ return uuid; ++ } ++ ++ public File getPlayerDir() { ++ return playerDir; ++ } ++ // CraftBukkit end + } diff --git a/nms-patches/WorldServer.patch b/nms-patches/WorldServer.patch new file mode 100644 index 00000000..b1ad5607 --- /dev/null +++ b/nms-patches/WorldServer.patch @@ -0,0 +1,550 @@ +--- ../work/decompile-bb26c12b/net/minecraft/server/WorldServer.java 2014-11-27 08:59:46.945420772 +1100 ++++ src/main/java/net/minecraft/server/WorldServer.java 2014-11-27 08:42:10.140850934 +1100 +@@ -16,6 +16,20 @@ + import org.apache.logging.log4j.LogManager; + import org.apache.logging.log4j.Logger; + ++// CraftBukkit start ++import java.util.*; ++import java.util.logging.Level; ++ ++import org.bukkit.WeatherType; ++import org.bukkit.block.BlockState; ++import org.bukkit.craftbukkit.util.LongHash; ++ ++import org.bukkit.event.block.BlockFormEvent; ++import org.bukkit.event.weather.LightningStrikeEvent; ++import org.bukkit.event.weather.ThunderChangeEvent; ++import org.bukkit.event.weather.WeatherChangeEvent; ++// CraftBukkit end ++ + public class WorldServer extends World implements IAsyncTaskHandler { + + private static final Logger a = LogManager.getLogger(); +@@ -37,14 +51,21 @@ + private static final List U = Lists.newArrayList(new StructurePieceTreasure[] { new StructurePieceTreasure(Items.STICK, 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.PLANKS), 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG), 0, 1, 3, 10), new StructurePieceTreasure(Items.STONE_AXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOODEN_AXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.STONE_PICKAXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOODEN_PICKAXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.APPLE, 0, 2, 3, 5), new StructurePieceTreasure(Items.BREAD, 0, 2, 3, 3), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG2), 0, 1, 3, 10)}); + private List V = Lists.newArrayList(); + +- public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler) { +- super(idatamanager, worlddata, WorldProvider.byDimension(i), methodprofiler, false); ++ // CraftBukkit start ++ public final int dimension; ++ ++ // Add env and gen to constructor ++ public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, WorldData worlddata, int i, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { ++ super(idatamanager, worlddata, WorldProvider.byDimension(env.getId()), methodprofiler, false, gen, env); ++ this.dimension = i; ++ this.pvpMode = minecraftserver.getPVP(); ++ // CraftBukkit end + this.server = minecraftserver; + this.tracker = new EntityTracker(this); + this.manager = new PlayerChunkMap(this); + this.worldProvider.a(this); + this.chunkProvider = this.k(); +- this.Q = new PortalTravelAgent(this); ++ this.Q = new org.bukkit.craftbukkit.CraftTravelAgent(this); // CraftBukkit + this.B(); + this.C(); + this.af().a(minecraftserver.aG()); +@@ -86,6 +107,89 @@ + + return this; + } ++ ++ // CraftBukkit start ++ @Override ++ public TileEntity getTileEntity(BlockPosition pos) { ++ TileEntity result = super.getTileEntity(pos); ++ Block type = getType(pos).getBlock(); ++ ++ if (type == Blocks.CHEST) { ++ if (!(result instanceof TileEntityChest)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.FURNACE) { ++ if (!(result instanceof TileEntityFurnace)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.DROPPER) { ++ if (!(result instanceof TileEntityDropper)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.DISPENSER) { ++ if (!(result instanceof TileEntityDispenser)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.JUKEBOX) { ++ if (!(result instanceof TileEntityRecordPlayer)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.NOTEBLOCK) { ++ if (!(result instanceof TileEntityNote)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.MOB_SPAWNER) { ++ if (!(result instanceof TileEntityMobSpawner)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if ((type == Blocks.STANDING_SIGN) || (type == Blocks.WALL_SIGN)) { ++ if (!(result instanceof TileEntitySign)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.ENDER_CHEST) { ++ if (!(result instanceof TileEntityEnderChest)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.BREWING_STAND) { ++ if (!(result instanceof TileEntityBrewingStand)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.BEACON) { ++ if (!(result instanceof TileEntityBeacon)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } else if (type == Blocks.HOPPER) { ++ if (!(result instanceof TileEntityHopper)) { ++ result = fixTileEntity(pos, type, result); ++ } ++ } ++ ++ return result; ++ } ++ ++ private TileEntity fixTileEntity(BlockPosition pos, Block type, TileEntity found) { ++ this.getServer().getLogger().log(Level.SEVERE, "Block at {0},{1},{2} is {3} but has {4}" + ". " ++ + "Bukkit will attempt to fix this, but there may be additional damage that we cannot recover.", new Object[]{pos.getX(), pos.getY(), pos.getZ(), org.bukkit.Material.getMaterial(Block.getId(type)).toString(), found}); ++ ++ if (type instanceof IContainer) { ++ TileEntity replacement = ((IContainer) type).a(this, type.toLegacyData(this.getType(pos))); ++ replacement.world = this; ++ this.setTileEntity(pos, replacement); ++ return replacement; ++ } else { ++ this.getServer().getLogger().severe("Don't know how to fix for this type... Can't do anything! :("); ++ return found; ++ } ++ } ++ ++ private boolean canSpawn(int x, int z) { ++ if (this.generator != null) { ++ return this.generator.canSpawn(this.getWorld(), x, z); ++ } else { ++ return this.worldProvider.canSpawn(x, z); ++ } ++ } ++ // CraftBukkit end + + public void doTick() { + super.doTick(); +@@ -105,8 +209,11 @@ + } + + this.methodProfiler.a("mobSpawner"); +- if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES) { +- this.R.a(this, this.allowMonsters, this.allowAnimals, this.worldData.getTime() % 400L == 0L); ++ // CraftBukkit start - Only call spawner if we have players online and the world allows for mobs or animals ++ long time = this.worldData.getTime(); ++ if (this.getGameRules().getBoolean("doMobSpawning") && this.worldData.getType() != WorldType.DEBUG_ALL_BLOCK_STATES && (this.allowMonsters || this.allowAnimals) && (this instanceof WorldServer && this.players.size() > 0)) { ++ this.R.a(this, this.allowMonsters && (this.ticksPerMonsterSpawns != 0 && time % this.ticksPerMonsterSpawns == 0L), this.allowAnimals && (this.ticksPerAnimalSpawns != 0 && time % this.ticksPerAnimalSpawns == 0L), this.worldData.getTime() % 400L == 0L); ++ // CraftBukkit end + } + + this.methodProfiler.c("chunkSource"); +@@ -135,6 +242,8 @@ + this.Q.a(this.getTime()); + this.methodProfiler.b(); + this.ak(); ++ ++ this.getWorld().processChunkGC(); // CraftBukkit + } + + public BiomeMeta a(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { +@@ -161,7 +270,7 @@ + + if (entityhuman.v()) { + ++i; +- } else if (entityhuman.isSleeping()) { ++ } else if (entityhuman.isSleeping() || entityhuman.fauxSleeping) { // CraftBukkit + ++j; + } + } +@@ -187,26 +296,45 @@ + } + + private void ag() { +- this.worldData.setWeatherDuration(0); +- this.worldData.setStorm(false); +- this.worldData.setThunderDuration(0); +- this.worldData.setThundering(false); ++ // CraftBukkit start ++ WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), false); ++ this.getServer().getPluginManager().callEvent(weather); ++ ++ ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), false); ++ this.getServer().getPluginManager().callEvent(thunder); ++ if (!weather.isCancelled()) { ++ this.worldData.setWeatherDuration(0); ++ this.worldData.setStorm(false); ++ } ++ if (!thunder.isCancelled()) { ++ this.worldData.setThunderDuration(0); ++ this.worldData.setThundering(false); ++ } ++ // CraftBukkit end + } + + public boolean everyoneDeeplySleeping() { + if (this.O && !this.isStatic) { + Iterator iterator = this.players.iterator(); + ++ // CraftBukkit - This allows us to assume that some people are in bed but not really, allowing time to pass in spite of AFKers ++ boolean foundActualSleepers = false; ++ + EntityHuman entityhuman; + + do { + if (!iterator.hasNext()) { +- return true; ++ return foundActualSleepers; + } + + entityhuman = (EntityHuman) iterator.next(); +- } while (!entityhuman.v() && entityhuman.isDeeplySleeping()); +- ++ // CraftBukkit start ++ if (entityhuman.isDeeplySleeping()) { ++ foundActualSleepers = true; ++ } ++ } while (!entityhuman.v() && (entityhuman.isDeeplySleeping() || entityhuman.fauxSleeping)); ++ // CraftBukkit end ++ + return false; + } else { + return false; +@@ -227,15 +355,22 @@ + } else { + int i = 0; + int j = 0; +- +- for (Iterator iterator1 = this.chunkTickList.iterator(); iterator1.hasNext(); this.methodProfiler.b()) { +- ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); +- int k = chunkcoordintpair1.x * 16; +- int l = chunkcoordintpair1.z * 16; +- ++ ++ // CraftBukkit start ++ //for (Iterator iterator1 = this.chunkTickList.iterator(); iterator1.hasNext(); this.methodProfiler.b()) { ++ // ChunkCoordIntPair chunkcoordintpair1 = (ChunkCoordIntPair) iterator1.next(); ++ // int k = chunkcoordintpair1.x * 16; ++ // int l = chunkcoordintpair1.z * 16; ++ for (long chunkCoord : chunkTickList.popAll()) { ++ int chunkX = LongHash.msw(chunkCoord); ++ int chunkZ = LongHash.lsw(chunkCoord); ++ int k = chunkX * 16; ++ int l = chunkZ * 16; ++ + this.methodProfiler.a("getChunk"); +- Chunk chunk = this.getChunkAt(chunkcoordintpair1.x, chunkcoordintpair1.z); +- ++ Chunk chunk = this.getChunkAt(chunkX, chunkZ); ++ // CraftBukkit end ++ + this.a(k, l, chunk); + this.methodProfiler.c("tickChunk"); + chunk.b(false); +@@ -260,11 +395,29 @@ + BlockPosition blockposition1 = blockposition.down(); + + if (this.w(blockposition1)) { +- this.setTypeUpdate(blockposition1, Blocks.ICE.getBlockData()); ++ // CraftBukkit start ++ BlockState blockState = this.getWorld().getBlockAt(blockposition1.getX(), blockposition1.getY(), blockposition1.getZ()).getState(); ++ blockState.setTypeId(Block.getId(Blocks.ICE)); ++ ++ BlockFormEvent iceBlockForm = new BlockFormEvent(blockState.getBlock(), blockState); ++ this.getServer().getPluginManager().callEvent(iceBlockForm); ++ if (!iceBlockForm.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + + if (this.S() && this.f(blockposition, true)) { +- this.setTypeUpdate(blockposition, Blocks.SNOW_LAYER.getBlockData()); ++ // CraftBukkit start ++ BlockState blockState = this.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); ++ blockState.setTypeId(Block.getId(Blocks.SNOW_LAYER)); ++ ++ BlockFormEvent snow = new BlockFormEvent(blockState.getBlock(), blockState); ++ this.getServer().getPluginManager().callEvent(snow); ++ if (!snow.isCancelled()) { ++ blockState.update(true); ++ } ++ // CraftBukkit end + } + + if (this.S() && this.getBiome(blockposition1).e()) { +@@ -376,7 +529,7 @@ + } + + public void tickEntities() { +- if (this.players.isEmpty()) { ++ if (false && this.players.isEmpty()) { // CraftBukkit - this prevents entity cleanup, other issues on servers with no players + if (this.emptyTime++ >= 1200) { + return; + } +@@ -401,7 +554,13 @@ + throw new IllegalStateException("TickNextTick list out of synch"); + } else { + if (i > 1000) { +- i = 1000; ++ // CraftBukkit start - If the server has too much to process over time, try to alleviate that ++ if (i > 20 * 1000) { ++ i = i / 20; ++ } else { ++ i = 1000; ++ } ++ // CraftBukkit end + } + + this.methodProfiler.a("cleaning"); +@@ -501,6 +660,7 @@ + return arraylist; + } + ++ /* CraftBukkit start - We prevent spawning in general, so this butchering is not needed + public void entityJoinedWorld(Entity entity, boolean flag) { + if (!this.getSpawnAnimals() && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) { + entity.die(); +@@ -511,7 +671,9 @@ + } + + super.entityJoinedWorld(entity, flag); ++ + } ++ // CraftBukkit end */ + + private boolean getSpawnNPCs() { + return this.server.getSpawnNPCs(); +@@ -523,14 +685,44 @@ + + protected IChunkProvider k() { + IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider); ++ ++ // CraftBukkit start ++ org.bukkit.craftbukkit.generator.InternalChunkGenerator gen; ++ ++ if (this.generator != null) { ++ gen = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, this.getSeed(), this.generator); ++ } else if (this.worldProvider instanceof WorldProviderHell) { ++ gen = new org.bukkit.craftbukkit.generator.NetherChunkGenerator(this, this.getSeed()); ++ } else if (this.worldProvider instanceof WorldProviderTheEnd) { ++ gen = new org.bukkit.craftbukkit.generator.SkyLandsChunkGenerator(this, this.getSeed()); ++ } else { ++ gen = new org.bukkit.craftbukkit.generator.NormalChunkGenerator(this, this.getSeed()); ++ } + +- this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, this.worldProvider.getChunkProvider()); ++ this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, gen); ++ // CraftBukkit end + return this.chunkProviderServer; + } + + public List getTileEntities(int i, int j, int k, int l, int i1, int j1) { + ArrayList arraylist = Lists.newArrayList(); +- ++ ++ // CraftBukkit start - Get tile entities from chunks instead of world ++ for (int chunkX = (i >> 4); chunkX <= ((l - 1) >> 4); chunkX++) { ++ for (int chunkZ = (k >> 4); chunkZ <= ((j1 - 1) >> 4); chunkZ++) { ++ Chunk chunk = getChunkAt(chunkX, chunkZ); ++ if (chunk == null) { ++ continue; ++ } ++ for (Object te : chunk.tileEntities.values()) { ++ TileEntity tileentity = (TileEntity) te; ++ if ((tileentity.position.getX() >= i) && (tileentity.position.getY() >= j) && (tileentity.position.getZ() >= k) && (tileentity.position.getX() < l) && (tileentity.position.getY() < i1) && (tileentity.position.getZ() < j1)) { ++ arraylist.add(tileentity); ++ } ++ } ++ } ++ } ++ /* + for (int k1 = 0; k1 < this.h.size(); ++k1) { + TileEntity tileentity = (TileEntity) this.h.get(k1); + BlockPosition blockposition = tileentity.getPosition(); +@@ -539,6 +731,8 @@ + arraylist.add(tileentity); + } + } ++ */ ++ // CraftBukkit end + + return arraylist; + } +@@ -601,6 +795,23 @@ + int i = 0; + int j = this.worldProvider.getSeaLevel(); + int k = 0; ++ ++ // CraftBukkit start ++ if (this.generator != null) { ++ Random rand = new Random(this.getSeed()); ++ org.bukkit.Location spawn = this.generator.getFixedSpawnLocation(((WorldServer) this).getWorld(), rand); ++ ++ if (spawn != null) { ++ if (spawn.getWorld() != ((WorldServer) this).getWorld()) { ++ throw new IllegalStateException("Cannot set spawn point for " + this.worldData.getName() + " to be in another world (" + spawn.getWorld().getName() + ")"); ++ } else { ++ this.worldData.setSpawn(new BlockPosition(spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ())); ++ this.isLoading = false; ++ return; ++ } ++ } ++ } ++ // CraftBukkit end + + if (blockposition != null) { + i = blockposition.getX(); +@@ -611,7 +822,7 @@ + + int l = 0; + +- while (!this.worldProvider.canSpawn(i, k)) { ++ while (!this.canSpawn(i, k)) { // CraftBukkit - use our own canSpawn + i += random.nextInt(64) - random.nextInt(64); + k += random.nextInt(64) - random.nextInt(64); + ++l; +@@ -648,7 +859,7 @@ + return this.worldProvider.h(); + } + +- public void save(boolean flag, IProgressUpdate iprogressupdate) { ++ public void save(boolean flag, IProgressUpdate iprogressupdate) throws ExceptionWorldConflict { // CraftBukkit - added throws + if (this.chunkProvider.canSave()) { + if (iprogressupdate != null) { + iprogressupdate.a("Saving level"); +@@ -660,7 +871,8 @@ + } + + this.chunkProvider.saveChunks(flag, iprogressupdate); +- List list = this.chunkProviderServer.a(); ++ // CraftBukkit - ArrayList -> Collection ++ Collection list = this.chunkProviderServer.a(); + Iterator iterator = list.iterator(); + + while (iterator.hasNext()) { +@@ -680,7 +892,7 @@ + } + } + +- protected void a() { ++ protected void a() throws ExceptionWorldConflict { // CraftBukkit - added throws + this.checkSession(); + this.worldData.a(this.af().h()); + this.worldData.d(this.af().f()); +@@ -692,7 +904,11 @@ + this.worldData.b(this.af().j()); + this.worldData.e(this.af().i()); + this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().u()); +- this.worldMaps.a(); ++ // CraftBukkit start - save worldMaps once, rather than once per shared world ++ if (!(this instanceof SecondaryWorldServer)) { ++ this.worldMaps.a(); ++ } ++ // CraftBukkit end + } + + protected void a(Entity entity) { +@@ -724,8 +940,16 @@ + } + + public boolean strikeLightning(Entity entity) { ++ // CraftBukkit start ++ LightningStrikeEvent lightning = new LightningStrikeEvent(this.getWorld(), (org.bukkit.entity.LightningStrike) entity.getBukkitEntity()); ++ this.getServer().getPluginManager().callEvent(lightning); ++ ++ if (lightning.isCancelled()) { ++ return false; ++ } + if (super.strikeLightning(entity)) { +- this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.worldProvider.getDimension(), new PacketPlayOutSpawnEntityWeather(entity)); ++ this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new PacketPlayOutSpawnEntityWeather(entity)); ++ // CraftBukkit end + return true; + } else { + return false; +@@ -737,10 +961,20 @@ + } + + public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { ++ // CraftBukkit start ++ Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag, flag1); ++ ++ if (explosion.wasCanceled) { ++ return explosion; ++ } ++ ++ /* Remove + Explosion explosion = new Explosion(this, entity, d0, d1, d2, f, flag, flag1); + + explosion.a(); + explosion.a(false); ++ */ ++ // CraftBukkit end - TODO: Check if explosions are still properly implemented + if (!flag1) { + explosion.clearBlocks(); + } +@@ -786,7 +1020,8 @@ + BlockActionData blockactiondata = (BlockActionData) iterator.next(); + + if (this.a(blockactiondata)) { +- this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.worldProvider.getDimension(), new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); ++ // CraftBukkit - this.worldProvider.dimension -> this.dimension ++ this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a().getX(), (double) blockactiondata.a().getY(), (double) blockactiondata.a().getZ(), 64.0D, this.dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.d(), blockactiondata.b(), blockactiondata.c())); + } + } + +@@ -809,6 +1044,7 @@ + boolean flag = this.S(); + + super.p(); ++ /* CraftBukkit start + if (this.o != this.p) { + this.server.getPlayerList().a(new PacketPlayOutGameStateChange(7, this.p), this.worldProvider.getDimension()); + } +@@ -827,6 +1063,16 @@ + this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.p)); + this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.r)); + } ++ // */ ++ if (flag != this.S()) { ++ // Only send weather packets to those affected ++ for (int i = 0; i < this.players.size(); ++i) { ++ if (((EntityPlayer) this.players.get(i)).world == this) { ++ ((EntityPlayer) this.players.get(i)).setPlayerWeather((!flag ? WeatherType.DOWNFALL : WeatherType.CLEAR), false); ++ } ++ } ++ // CraftBukkit end ++ } + + } + +@@ -855,10 +1101,17 @@ + } + + public void a(EnumParticle enumparticle, boolean flag, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, int... aint) { ++ // CraftBukkit - visibility api support ++ sendParticles(null, enumparticle, flag, d0, d1, d2, i, d3, d4, d5, d6, aint); ++ } ++ ++ public void sendParticles(EntityPlayer sender, EnumParticle enumparticle, boolean flag, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6, int... aint) { ++ // CraftBukkit end + PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(enumparticle, flag, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i, aint); + + for (int j = 0; j < this.players.size(); ++j) { + EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); ++ if (sender != null && !sender.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) continue; // CraftBukkit + BlockPosition blockposition = entityplayer.getChunkCoordinates(); + double d7 = blockposition.c(d0, d1, d2); + @@ -4,7 +4,7 @@ <groupId>org.bukkit</groupId> <artifactId>craftbukkit</artifactId> <packaging>jar</packaging> - <version>1.7.10-R0.1-SNAPSHOT</version> + <version>1.8-R0.1-SNAPSHOT</version> <name>CraftBukkit</name> <url>http://www.bukkit.org</url> @@ -12,31 +12,12 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <api.version>unknown</api.version> <junit.version>4.11</junit.version> - <minecraft.version>1.7.10</minecraft.version> - <minecraft_version>1_7_R4</minecraft_version> + <minecraft.version>1.8</minecraft.version> + <minecraft_version>1_8_R1</minecraft_version> <buildtag.prefix>git-Bukkit-</buildtag.prefix> <buildtag.suffix></buildtag.suffix> </properties> - <scm> - <connection>scm:git:git://github.com/Bukkit/CraftBukkit.git</connection> - <developerConnection>scm:git:ssh://git@github.com/Bukkit/CraftBukkit.git</developerConnection> - <url>https://github.com/Bukkit/CraftBukkit</url> - </scm> - - <distributionManagement> - <repository> - <id>repobo-rel</id> - <name>repo.bukkit.org Releases</name> - <url>http://repo.bukkit.org/content/repositories/releases/</url> - </repository> - <snapshotRepository> - <id>repobo-snap</id> - <name>repo.bukkit.org Snapshots</name> - <url>http://repo.bukkit.org/content/repositories/snapshots/</url> - </snapshotRepository> - </distributionManagement> - <repositories> <repository> <id>repobo-snap</id> @@ -60,9 +41,9 @@ <scope>compile</scope> </dependency> <dependency> - <groupId>org.bukkit</groupId> + <groupId>org.spigotmc</groupId> <artifactId>minecraft-server</artifactId> - <version>${minecraft.version}</version> + <version>${minecraft.version}-SNAPSHOT</version> <type>jar</type> <scope>compile</scope> </dependency> @@ -124,7 +105,7 @@ <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> - <version>10.0</version> + <version>17.0</version> <type>jar</type> <scope>provided</scope> </dependency> diff --git a/src/main/java/net/minecraft/server/BiomeTheEndDecorator.java b/src/main/java/net/minecraft/server/BiomeTheEndDecorator.java deleted file mode 100644 index 2f4e7495..00000000 --- a/src/main/java/net/minecraft/server/BiomeTheEndDecorator.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.minecraft.server; - -public class BiomeTheEndDecorator extends BiomeDecorator { - - protected WorldGenerator J; - - public BiomeTheEndDecorator() { - this.J = new WorldGenEnder(Blocks.WHITESTONE); - } - - protected void a(BiomeBase biomebase) { - this.a(); - if (this.b.nextInt(5) == 0) { - int i = this.c + this.b.nextInt(16) + 8; - int j = this.d + this.b.nextInt(16) + 8; - int k = this.a.i(i, j); - - this.J.generate(this.a, this.b, i, k, j); - } - - if (this.c == 0 && this.d == 0) { - EntityEnderDragon entityenderdragon = new EntityEnderDragon(this.a); - - entityenderdragon.setPositionRotation(0.0D, 128.0D, 0.0D, this.b.nextFloat() * 360.0F, 0.0F); - this.a.addEntity(entityenderdragon, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } -} diff --git a/src/main/java/net/minecraft/server/Block.java b/src/main/java/net/minecraft/server/Block.java deleted file mode 100644 index 9876ebfa..00000000 --- a/src/main/java/net/minecraft/server/Block.java +++ /dev/null @@ -1,807 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -public class Block { - - public static final RegistryMaterials REGISTRY = new RegistryBlocks("air"); - private CreativeModeTab creativeTab; - protected String d; - public static final StepSound e = new StepSound("stone", 1.0F, 1.0F); - public static final StepSound f = new StepSound("wood", 1.0F, 1.0F); - public static final StepSound g = new StepSound("gravel", 1.0F, 1.0F); - public static final StepSound h = new StepSound("grass", 1.0F, 1.0F); - public static final StepSound i = new StepSound("stone", 1.0F, 1.0F); - public static final StepSound j = new StepSound("stone", 1.0F, 1.5F); - public static final StepSound k = new StepSoundStone("stone", 1.0F, 1.0F); - public static final StepSound l = new StepSound("cloth", 1.0F, 1.0F); - public static final StepSound m = new StepSound("sand", 1.0F, 1.0F); - public static final StepSound n = new StepSound("snow", 1.0F, 1.0F); - public static final StepSound o = new StepSoundLadder("ladder", 1.0F, 1.0F); - public static final StepSound p = new StepSoundAnvil("anvil", 0.3F, 1.0F); - protected boolean q; - protected int r; - protected boolean s; - protected int t; - protected boolean u; - protected float strength; - protected float durability; - protected boolean x = true; - protected boolean y = true; - protected boolean z; - protected boolean isTileEntity; - protected double minX; - protected double minY; - protected double minZ; - protected double maxX; - protected double maxY; - protected double maxZ; - public StepSound stepSound; - public float I; - protected final Material material; - public float frictionFactor; - private String name; - - public static int getId(Block block) { - return REGISTRY.b(block); - } - - public static Block getById(int i) { - return (Block) REGISTRY.a(i); - } - - public static Block a(Item item) { - return getById(Item.getId(item)); - } - - public static Block b(String s) { - if (REGISTRY.b(s)) { - return (Block) REGISTRY.get(s); - } else { - try { - return (Block) REGISTRY.a(Integer.parseInt(s)); - } catch (NumberFormatException numberformatexception) { - return null; - } - } - } - - public boolean j() { - return this.q; - } - - public int k() { - return this.r; - } - - public int m() { - return this.t; - } - - public boolean n() { - return this.u; - } - - public Material getMaterial() { - return this.material; - } - - public MaterialMapColor f(int i) { - return this.getMaterial().r(); - } - - public static void p() { - REGISTRY.a(0, "air", (new BlockAir()).c("air")); - REGISTRY.a(1, "stone", (new BlockStone()).c(1.5F).b(10.0F).a(i).c("stone").d("stone")); - REGISTRY.a(2, "grass", (new BlockGrass()).c(0.6F).a(h).c("grass").d("grass")); - REGISTRY.a(3, "dirt", (new BlockDirt()).c(0.5F).a(g).c("dirt").d("dirt")); - Block block = (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("stonebrick").a(CreativeModeTab.b).d("cobblestone"); - - REGISTRY.a(4, "cobblestone", block); - Block block1 = (new BlockWood()).c(2.0F).b(5.0F).a(f).c("wood").d("planks"); - - REGISTRY.a(5, "planks", block1); - REGISTRY.a(6, "sapling", (new BlockSapling()).c(0.0F).a(h).c("sapling").d("sapling")); - REGISTRY.a(7, "bedrock", (new Block(Material.STONE)).s().b(6000000.0F).a(i).c("bedrock").H().a(CreativeModeTab.b).d("bedrock")); - REGISTRY.a(8, "flowing_water", (new BlockFlowing(Material.WATER)).c(100.0F).g(3).c("water").H().d("water_flow")); - REGISTRY.a(9, "water", (new BlockStationary(Material.WATER)).c(100.0F).g(3).c("water").H().d("water_still")); - REGISTRY.a(10, "flowing_lava", (new BlockFlowing(Material.LAVA)).c(100.0F).a(1.0F).c("lava").H().d("lava_flow")); - REGISTRY.a(11, "lava", (new BlockStationary(Material.LAVA)).c(100.0F).a(1.0F).c("lava").H().d("lava_still")); - REGISTRY.a(12, "sand", (new BlockSand()).c(0.5F).a(m).c("sand").d("sand")); - REGISTRY.a(13, "gravel", (new BlockGravel()).c(0.6F).a(g).c("gravel").d("gravel")); - REGISTRY.a(14, "gold_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreGold").d("gold_ore")); - REGISTRY.a(15, "iron_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreIron").d("iron_ore")); - REGISTRY.a(16, "coal_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreCoal").d("coal_ore")); - REGISTRY.a(17, "log", (new BlockLog1()).c("log").d("log")); - REGISTRY.a(18, "leaves", (new BlockLeaves1()).c("leaves").d("leaves")); - REGISTRY.a(19, "sponge", (new BlockSponge()).c(0.6F).a(h).c("sponge").d("sponge")); - REGISTRY.a(20, "glass", (new BlockGlass(Material.SHATTERABLE, false)).c(0.3F).a(k).c("glass").d("glass")); - REGISTRY.a(21, "lapis_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreLapis").d("lapis_ore")); - REGISTRY.a(22, "lapis_block", (new BlockOreBlock(MaterialMapColor.H)).c(3.0F).b(5.0F).a(i).c("blockLapis").a(CreativeModeTab.b).d("lapis_block")); - REGISTRY.a(23, "dispenser", (new BlockDispenser()).c(3.5F).a(i).c("dispenser").d("dispenser")); - Block block2 = (new BlockSandStone()).a(i).c(0.8F).c("sandStone").d("sandstone"); - - REGISTRY.a(24, "sandstone", block2); - REGISTRY.a(25, "noteblock", (new BlockNote()).c(0.8F).c("musicBlock").d("noteblock")); - REGISTRY.a(26, "bed", (new BlockBed()).c(0.2F).c("bed").H().d("bed")); - REGISTRY.a(27, "golden_rail", (new BlockPoweredRail()).c(0.7F).a(j).c("goldenRail").d("rail_golden")); - REGISTRY.a(28, "detector_rail", (new BlockMinecartDetector()).c(0.7F).a(j).c("detectorRail").d("rail_detector")); - REGISTRY.a(29, "sticky_piston", (new BlockPiston(true)).c("pistonStickyBase")); - REGISTRY.a(30, "web", (new BlockWeb()).g(1).c(4.0F).c("web").d("web")); - REGISTRY.a(31, "tallgrass", (new BlockLongGrass()).c(0.0F).a(h).c("tallgrass")); - REGISTRY.a(32, "deadbush", (new BlockDeadBush()).c(0.0F).a(h).c("deadbush").d("deadbush")); - REGISTRY.a(33, "piston", (new BlockPiston(false)).c("pistonBase")); - REGISTRY.a(34, "piston_head", new BlockPistonExtension()); - REGISTRY.a(35, "wool", (new BlockCloth(Material.CLOTH)).c(0.8F).a(l).c("cloth").d("wool_colored")); - REGISTRY.a(36, "piston_extension", new BlockPistonMoving()); - REGISTRY.a(37, "yellow_flower", (new BlockFlowers(0)).c(0.0F).a(h).c("flower1").d("flower_dandelion")); - REGISTRY.a(38, "red_flower", (new BlockFlowers(1)).c(0.0F).a(h).c("flower2").d("flower_rose")); - REGISTRY.a(39, "brown_mushroom", (new BlockMushroom()).c(0.0F).a(h).a(0.125F).c("mushroom").d("mushroom_brown")); - REGISTRY.a(40, "red_mushroom", (new BlockMushroom()).c(0.0F).a(h).c("mushroom").d("mushroom_red")); - REGISTRY.a(41, "gold_block", (new BlockOreBlock(MaterialMapColor.F)).c(3.0F).b(10.0F).a(j).c("blockGold").d("gold_block")); - REGISTRY.a(42, "iron_block", (new BlockOreBlock(MaterialMapColor.h)).c(5.0F).b(10.0F).a(j).c("blockIron").d("iron_block")); - REGISTRY.a(43, "double_stone_slab", (new BlockStep(true)).c(2.0F).b(10.0F).a(i).c("stoneSlab")); - REGISTRY.a(44, "stone_slab", (new BlockStep(false)).c(2.0F).b(10.0F).a(i).c("stoneSlab")); - Block block3 = (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("brick").a(CreativeModeTab.b).d("brick"); - - REGISTRY.a(45, "brick_block", block3); - REGISTRY.a(46, "tnt", (new BlockTNT()).c(0.0F).a(h).c("tnt").d("tnt")); - REGISTRY.a(47, "bookshelf", (new BlockBookshelf()).c(1.5F).a(f).c("bookshelf").d("bookshelf")); - REGISTRY.a(48, "mossy_cobblestone", (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("stoneMoss").a(CreativeModeTab.b).d("cobblestone_mossy")); - REGISTRY.a(49, "obsidian", (new BlockObsidian()).c(50.0F).b(2000.0F).a(i).c("obsidian").d("obsidian")); - REGISTRY.a(50, "torch", (new BlockTorch()).c(0.0F).a(0.9375F).a(f).c("torch").d("torch_on")); - REGISTRY.a(51, "fire", (new BlockFire()).c(0.0F).a(1.0F).a(f).c("fire").H().d("fire")); - REGISTRY.a(52, "mob_spawner", (new BlockMobSpawner()).c(5.0F).a(j).c("mobSpawner").H().d("mob_spawner")); - REGISTRY.a(53, "oak_stairs", (new BlockStairs(block1, 0)).c("stairsWood")); - REGISTRY.a(54, "chest", (new BlockChest(0)).c(2.5F).a(f).c("chest")); - REGISTRY.a(55, "redstone_wire", (new BlockRedstoneWire()).c(0.0F).a(e).c("redstoneDust").H().d("redstone_dust")); - REGISTRY.a(56, "diamond_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreDiamond").d("diamond_ore")); - REGISTRY.a(57, "diamond_block", (new BlockOreBlock(MaterialMapColor.G)).c(5.0F).b(10.0F).a(j).c("blockDiamond").d("diamond_block")); - REGISTRY.a(58, "crafting_table", (new BlockWorkbench()).c(2.5F).a(f).c("workbench").d("crafting_table")); - REGISTRY.a(59, "wheat", (new BlockCrops()).c("crops").d("wheat")); - Block block4 = (new BlockSoil()).c(0.6F).a(g).c("farmland").d("farmland"); - - REGISTRY.a(60, "farmland", block4); - REGISTRY.a(61, "furnace", (new BlockFurnace(false)).c(3.5F).a(i).c("furnace").a(CreativeModeTab.c)); - REGISTRY.a(62, "lit_furnace", (new BlockFurnace(true)).c(3.5F).a(i).a(0.875F).c("furnace")); - REGISTRY.a(63, "standing_sign", (new BlockSign(TileEntitySign.class, true)).c(1.0F).a(f).c("sign").H()); - REGISTRY.a(64, "wooden_door", (new BlockDoor(Material.WOOD)).c(3.0F).a(f).c("doorWood").H().d("door_wood")); - REGISTRY.a(65, "ladder", (new BlockLadder()).c(0.4F).a(o).c("ladder").d("ladder")); - REGISTRY.a(66, "rail", (new BlockMinecartTrack()).c(0.7F).a(j).c("rail").d("rail_normal")); - REGISTRY.a(67, "stone_stairs", (new BlockStairs(block, 0)).c("stairsStone")); - REGISTRY.a(68, "wall_sign", (new BlockSign(TileEntitySign.class, false)).c(1.0F).a(f).c("sign").H()); - REGISTRY.a(69, "lever", (new BlockLever()).c(0.5F).a(f).c("lever").d("lever")); - REGISTRY.a(70, "stone_pressure_plate", (new BlockPressurePlateBinary("stone", Material.STONE, EnumMobType.MOBS)).c(0.5F).a(i).c("pressurePlate")); - REGISTRY.a(71, "iron_door", (new BlockDoor(Material.ORE)).c(5.0F).a(j).c("doorIron").H().d("door_iron")); - REGISTRY.a(72, "wooden_pressure_plate", (new BlockPressurePlateBinary("planks_oak", Material.WOOD, EnumMobType.EVERYTHING)).c(0.5F).a(f).c("pressurePlate")); - REGISTRY.a(73, "redstone_ore", (new BlockRedstoneOre(false)).c(3.0F).b(5.0F).a(i).c("oreRedstone").a(CreativeModeTab.b).d("redstone_ore")); - REGISTRY.a(74, "lit_redstone_ore", (new BlockRedstoneOre(true)).a(0.625F).c(3.0F).b(5.0F).a(i).c("oreRedstone").d("redstone_ore")); - REGISTRY.a(75, "unlit_redstone_torch", (new BlockRedstoneTorch(false)).c(0.0F).a(f).c("notGate").d("redstone_torch_off")); - REGISTRY.a(76, "redstone_torch", (new BlockRedstoneTorch(true)).c(0.0F).a(0.5F).a(f).c("notGate").a(CreativeModeTab.d).d("redstone_torch_on")); - REGISTRY.a(77, "stone_button", (new BlockStoneButton()).c(0.5F).a(i).c("button")); - REGISTRY.a(78, "snow_layer", (new BlockSnow()).c(0.1F).a(n).c("snow").g(0).d("snow")); - REGISTRY.a(79, "ice", (new BlockIce()).c(0.5F).g(3).a(k).c("ice").d("ice")); - REGISTRY.a(80, "snow", (new BlockSnowBlock()).c(0.2F).a(n).c("snow").d("snow")); - REGISTRY.a(81, "cactus", (new BlockCactus()).c(0.4F).a(l).c("cactus").d("cactus")); - REGISTRY.a(82, "clay", (new BlockClay()).c(0.6F).a(g).c("clay").d("clay")); - REGISTRY.a(83, "reeds", (new BlockReed()).c(0.0F).a(h).c("reeds").H().d("reeds")); - REGISTRY.a(84, "jukebox", (new BlockJukeBox()).c(2.0F).b(10.0F).a(i).c("jukebox").d("jukebox")); - REGISTRY.a(85, "fence", (new BlockFence("planks_oak", Material.WOOD)).c(2.0F).b(5.0F).a(f).c("fence")); - Block block5 = (new BlockPumpkin(false)).c(1.0F).a(f).c("pumpkin").d("pumpkin"); - - REGISTRY.a(86, "pumpkin", block5); - REGISTRY.a(87, "netherrack", (new BlockBloodStone()).c(0.4F).a(i).c("hellrock").d("netherrack")); - REGISTRY.a(88, "soul_sand", (new BlockSlowSand()).c(0.5F).a(m).c("hellsand").d("soul_sand")); - REGISTRY.a(89, "glowstone", (new BlockLightStone(Material.SHATTERABLE)).c(0.3F).a(k).a(1.0F).c("lightgem").d("glowstone")); - REGISTRY.a(90, "portal", (new BlockPortal()).c(-1.0F).a(k).a(0.75F).c("portal").d("portal")); - REGISTRY.a(91, "lit_pumpkin", (new BlockPumpkin(true)).c(1.0F).a(f).a(1.0F).c("litpumpkin").d("pumpkin")); - REGISTRY.a(92, "cake", (new BlockCake()).c(0.5F).a(l).c("cake").H().d("cake")); - REGISTRY.a(93, "unpowered_repeater", (new BlockRepeater(false)).c(0.0F).a(f).c("diode").H().d("repeater_off")); - REGISTRY.a(94, "powered_repeater", (new BlockRepeater(true)).c(0.0F).a(0.625F).a(f).c("diode").H().d("repeater_on")); - REGISTRY.a(95, "stained_glass", (new BlockStainedGlass(Material.SHATTERABLE)).c(0.3F).a(k).c("stainedGlass").d("glass")); - REGISTRY.a(96, "trapdoor", (new BlockTrapdoor(Material.WOOD)).c(3.0F).a(f).c("trapdoor").H().d("trapdoor")); - REGISTRY.a(97, "monster_egg", (new BlockMonsterEggs()).c(0.75F).c("monsterStoneEgg")); - Block block6 = (new BlockSmoothBrick()).c(1.5F).b(10.0F).a(i).c("stonebricksmooth").d("stonebrick"); - - REGISTRY.a(98, "stonebrick", block6); - REGISTRY.a(99, "brown_mushroom_block", (new BlockHugeMushroom(Material.WOOD, 0)).c(0.2F).a(f).c("mushroom").d("mushroom_block")); - REGISTRY.a(100, "red_mushroom_block", (new BlockHugeMushroom(Material.WOOD, 1)).c(0.2F).a(f).c("mushroom").d("mushroom_block")); - REGISTRY.a(101, "iron_bars", (new BlockThin("iron_bars", "iron_bars", Material.ORE, true)).c(5.0F).b(10.0F).a(j).c("fenceIron")); - REGISTRY.a(102, "glass_pane", (new BlockThin("glass", "glass_pane_top", Material.SHATTERABLE, false)).c(0.3F).a(k).c("thinGlass")); - Block block7 = (new BlockMelon()).c(1.0F).a(f).c("melon").d("melon"); - - REGISTRY.a(103, "melon_block", block7); - REGISTRY.a(104, "pumpkin_stem", (new BlockStem(block5)).c(0.0F).a(f).c("pumpkinStem").d("pumpkin_stem")); - REGISTRY.a(105, "melon_stem", (new BlockStem(block7)).c(0.0F).a(f).c("pumpkinStem").d("melon_stem")); - REGISTRY.a(106, "vine", (new BlockVine()).c(0.2F).a(h).c("vine").d("vine")); - REGISTRY.a(107, "fence_gate", (new BlockFenceGate()).c(2.0F).b(5.0F).a(f).c("fenceGate")); - REGISTRY.a(108, "brick_stairs", (new BlockStairs(block3, 0)).c("stairsBrick")); - REGISTRY.a(109, "stone_brick_stairs", (new BlockStairs(block6, 0)).c("stairsStoneBrickSmooth")); - REGISTRY.a(110, "mycelium", (new BlockMycel()).c(0.6F).a(h).c("mycel").d("mycelium")); - REGISTRY.a(111, "waterlily", (new BlockWaterLily()).c(0.0F).a(h).c("waterlily").d("waterlily")); - Block block8 = (new Block(Material.STONE)).c(2.0F).b(10.0F).a(i).c("netherBrick").a(CreativeModeTab.b).d("nether_brick"); - - REGISTRY.a(112, "nether_brick", block8); - REGISTRY.a(113, "nether_brick_fence", (new BlockFence("nether_brick", Material.STONE)).c(2.0F).b(10.0F).a(i).c("netherFence")); - REGISTRY.a(114, "nether_brick_stairs", (new BlockStairs(block8, 0)).c("stairsNetherBrick")); - REGISTRY.a(115, "nether_wart", (new BlockNetherWart()).c("netherStalk").d("nether_wart")); - REGISTRY.a(116, "enchanting_table", (new BlockEnchantmentTable()).c(5.0F).b(2000.0F).c("enchantmentTable").d("enchanting_table")); - REGISTRY.a(117, "brewing_stand", (new BlockBrewingStand()).c(0.5F).a(0.125F).c("brewingStand").d("brewing_stand")); - REGISTRY.a(118, "cauldron", (new BlockCauldron()).c(2.0F).c("cauldron").d("cauldron")); - REGISTRY.a(119, "end_portal", (new BlockEnderPortal(Material.PORTAL)).c(-1.0F).b(6000000.0F)); - REGISTRY.a(120, "end_portal_frame", (new BlockEnderPortalFrame()).a(k).a(0.125F).c(-1.0F).c("endPortalFrame").b(6000000.0F).a(CreativeModeTab.c).d("endframe")); - REGISTRY.a(121, "end_stone", (new Block(Material.STONE)).c(3.0F).b(15.0F).a(i).c("whiteStone").a(CreativeModeTab.b).d("end_stone")); - REGISTRY.a(122, "dragon_egg", (new BlockDragonEgg()).c(3.0F).b(15.0F).a(i).a(0.125F).c("dragonEgg").d("dragon_egg")); - REGISTRY.a(123, "redstone_lamp", (new BlockRedstoneLamp(false)).c(0.3F).a(k).c("redstoneLight").a(CreativeModeTab.d).d("redstone_lamp_off")); - REGISTRY.a(124, "lit_redstone_lamp", (new BlockRedstoneLamp(true)).c(0.3F).a(k).c("redstoneLight").d("redstone_lamp_on")); - REGISTRY.a(125, "double_wooden_slab", (new BlockWoodStep(true)).c(2.0F).b(5.0F).a(f).c("woodSlab")); - REGISTRY.a(126, "wooden_slab", (new BlockWoodStep(false)).c(2.0F).b(5.0F).a(f).c("woodSlab")); - REGISTRY.a(127, "cocoa", (new BlockCocoa()).c(0.2F).b(5.0F).a(f).c("cocoa").d("cocoa")); - REGISTRY.a(128, "sandstone_stairs", (new BlockStairs(block2, 0)).c("stairsSandStone")); - REGISTRY.a(129, "emerald_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("oreEmerald").d("emerald_ore")); - REGISTRY.a(130, "ender_chest", (new BlockEnderChest()).c(22.5F).b(1000.0F).a(i).c("enderChest").a(0.5F)); - REGISTRY.a(131, "tripwire_hook", (new BlockTripwireHook()).c("tripWireSource").d("trip_wire_source")); - REGISTRY.a(132, "tripwire", (new BlockTripwire()).c("tripWire").d("trip_wire")); - REGISTRY.a(133, "emerald_block", (new BlockOreBlock(MaterialMapColor.I)).c(5.0F).b(10.0F).a(j).c("blockEmerald").d("emerald_block")); - REGISTRY.a(134, "spruce_stairs", (new BlockStairs(block1, 1)).c("stairsWoodSpruce")); - REGISTRY.a(135, "birch_stairs", (new BlockStairs(block1, 2)).c("stairsWoodBirch")); - REGISTRY.a(136, "jungle_stairs", (new BlockStairs(block1, 3)).c("stairsWoodJungle")); - REGISTRY.a(137, "command_block", (new BlockCommand()).s().b(6000000.0F).c("commandBlock").d("command_block")); - REGISTRY.a(138, "beacon", (new BlockBeacon()).c("beacon").a(1.0F).d("beacon")); - REGISTRY.a(139, "cobblestone_wall", (new BlockCobbleWall(block)).c("cobbleWall")); - REGISTRY.a(140, "flower_pot", (new BlockFlowerPot()).c(0.0F).a(e).c("flowerPot").d("flower_pot")); - REGISTRY.a(141, "carrots", (new BlockCarrots()).c("carrots").d("carrots")); - REGISTRY.a(142, "potatoes", (new BlockPotatoes()).c("potatoes").d("potatoes")); - REGISTRY.a(143, "wooden_button", (new BlockWoodButton()).c(0.5F).a(f).c("button")); - REGISTRY.a(144, "skull", (new BlockSkull()).c(1.0F).a(i).c("skull").d("skull")); - REGISTRY.a(145, "anvil", (new BlockAnvil()).c(5.0F).a(p).b(2000.0F).c("anvil")); - REGISTRY.a(146, "trapped_chest", (new BlockChest(1)).c(2.5F).a(f).c("chestTrap")); - REGISTRY.a(147, "light_weighted_pressure_plate", (new BlockPressurePlateWeighted("gold_block", Material.ORE, 15)).c(0.5F).a(f).c("weightedPlate_light")); - REGISTRY.a(148, "heavy_weighted_pressure_plate", (new BlockPressurePlateWeighted("iron_block", Material.ORE, 150)).c(0.5F).a(f).c("weightedPlate_heavy")); - REGISTRY.a(149, "unpowered_comparator", (new BlockRedstoneComparator(false)).c(0.0F).a(f).c("comparator").H().d("comparator_off")); - REGISTRY.a(150, "powered_comparator", (new BlockRedstoneComparator(true)).c(0.0F).a(0.625F).a(f).c("comparator").H().d("comparator_on")); - REGISTRY.a(151, "daylight_detector", (new BlockDaylightDetector()).c(0.2F).a(f).c("daylightDetector").d("daylight_detector")); - REGISTRY.a(152, "redstone_block", (new BlockRedstone(MaterialMapColor.f)).c(5.0F).b(10.0F).a(j).c("blockRedstone").d("redstone_block")); - REGISTRY.a(153, "quartz_ore", (new BlockOre()).c(3.0F).b(5.0F).a(i).c("netherquartz").d("quartz_ore")); - REGISTRY.a(154, "hopper", (new BlockHopper()).c(3.0F).b(8.0F).a(f).c("hopper").d("hopper")); - Block block9 = (new BlockQuartz()).a(i).c(0.8F).c("quartzBlock").d("quartz_block"); - - REGISTRY.a(155, "quartz_block", block9); - REGISTRY.a(156, "quartz_stairs", (new BlockStairs(block9, 0)).c("stairsQuartz")); - REGISTRY.a(157, "activator_rail", (new BlockPoweredRail()).c(0.7F).a(j).c("activatorRail").d("rail_activator")); - REGISTRY.a(158, "dropper", (new BlockDropper()).c(3.5F).a(i).c("dropper").d("dropper")); - REGISTRY.a(159, "stained_hardened_clay", (new BlockCloth(Material.STONE)).c(1.25F).b(7.0F).a(i).c("clayHardenedStained").d("hardened_clay_stained")); - REGISTRY.a(160, "stained_glass_pane", (new BlockStainedGlassPane()).c(0.3F).a(k).c("thinStainedGlass").d("glass")); - REGISTRY.a(161, "leaves2", (new BlockLeaves2()).c("leaves").d("leaves")); - REGISTRY.a(162, "log2", (new BlockLog2()).c("log").d("log")); - REGISTRY.a(163, "acacia_stairs", (new BlockStairs(block1, 4)).c("stairsWoodAcacia")); - REGISTRY.a(164, "dark_oak_stairs", (new BlockStairs(block1, 5)).c("stairsWoodDarkOak")); - REGISTRY.a(170, "hay_block", (new BlockHay()).c(0.5F).a(h).c("hayBlock").a(CreativeModeTab.b).d("hay_block")); - REGISTRY.a(171, "carpet", (new BlockCarpet()).c(0.1F).a(l).c("woolCarpet").g(0)); - REGISTRY.a(172, "hardened_clay", (new BlockHardenedClay()).c(1.25F).b(7.0F).a(i).c("clayHardened").d("hardened_clay")); - REGISTRY.a(173, "coal_block", (new Block(Material.STONE)).c(5.0F).b(10.0F).a(i).c("blockCoal").a(CreativeModeTab.b).d("coal_block")); - REGISTRY.a(174, "packed_ice", (new BlockPackedIce()).c(0.5F).a(k).c("icePacked").d("ice_packed")); - REGISTRY.a(175, "double_plant", new BlockTallPlant()); - Iterator iterator = REGISTRY.iterator(); - - while (iterator.hasNext()) { - Block block10 = (Block) iterator.next(); - - if (block10.material == Material.AIR) { - block10.u = false; - } else { - boolean flag = false; - boolean flag1 = block10.b() == 10; - boolean flag2 = block10 instanceof BlockStepAbstract; - boolean flag3 = block10 == block4; - boolean flag4 = block10.s; - boolean flag5 = block10.r == 0; - - if (flag1 || flag2 || flag3 || flag4 || flag5) { - flag = true; - } - - block10.u = flag; - } - } - } - - protected Block(Material material) { - this.stepSound = e; - this.I = 1.0F; - this.frictionFactor = 0.6F; - this.material = material; - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - this.q = this.c(); - this.r = this.c() ? 255 : 0; - this.s = !material.blocksLight(); - } - - protected Block a(StepSound stepsound) { - this.stepSound = stepsound; - return this; - } - - protected Block g(int i) { - this.r = i; - return this; - } - - protected Block a(float f) { - this.t = (int) (15.0F * f); - return this; - } - - protected Block b(float f) { - this.durability = f * 3.0F; - return this; - } - - public boolean r() { - return this.material.k() && this.d() && !this.isPowerSource(); - } - - public boolean d() { - return true; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return !this.material.isSolid(); - } - - public int b() { - return 0; - } - - protected Block c(float f) { - this.strength = f; - if (this.durability < f * 5.0F) { - this.durability = f * 5.0F; - } - - return this; - } - - protected Block s() { - this.c(-1.0F); - return this; - } - - public float f(World world, int i, int j, int k) { - return this.strength; - } - - protected Block a(boolean flag) { - this.z = flag; - return this; - } - - public boolean isTicking() { - return this.z; - } - - public boolean isTileEntity() { - return this.isTileEntity; - } - - protected final void a(float f, float f1, float f2, float f3, float f4, float f5) { - this.minX = (double) f; - this.minY = (double) f1; - this.minZ = (double) f2; - this.maxX = (double) f3; - this.maxY = (double) f4; - this.maxZ = (double) f5; - } - - public boolean d(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return iblockaccess.getType(i, j, k).getMaterial().isBuildable(); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - AxisAlignedBB axisalignedbb1 = this.a(world, i, j, k); - - if (axisalignedbb1 != null && axisalignedbb.b(axisalignedbb1)) { - list.add(axisalignedbb1); - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ); - } - - public boolean c() { - return true; - } - - public boolean a(int i, boolean flag) { - return this.v(); - } - - public boolean v() { - return true; - } - - public void a(World world, int i, int j, int k, Random random) {} - - public void postBreak(World world, int i, int j, int k, int l) {} - - public void doPhysics(World world, int i, int j, int k, Block block) {} - - public int a(World world) { - return 10; - } - - public void onPlace(World world, int i, int j, int k) {} - - public void remove(World world, int i, int j, int k, Block block, int l) {} - - public int a(Random random) { - return 1; - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(this); - } - - public float getDamage(EntityHuman entityhuman, World world, int i, int j, int k) { - float f = this.f(world, i, j, k); - - return f < 0.0F ? 0.0F : (!entityhuman.a(this) ? entityhuman.a(this, false) / f / 100.0F : entityhuman.a(this, true) / f / 30.0F); - } - - public final void b(World world, int i, int j, int k, int l, int i1) { - this.dropNaturally(world, i, j, k, l, 1.0F, i1); - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - int j1 = this.getDropCount(i1, world.random); - - for (int k1 = 0; k1 < j1; ++k1) { - // CraftBukkit - <= to < to allow for plugins to completely disable block drops from explosions - if (world.random.nextFloat() < f) { - Item item = this.getDropType(l, world.random, i1); - - if (item != null) { - this.a(world, i, j, k, new ItemStack(item, 1, this.getDropData(l))); - } - } - } - } - } - - protected void a(World world, int i, int j, int k, ItemStack itemstack) { - if (!world.isStatic && world.getGameRules().getBoolean("doTileDrops")) { - float f = 0.7F; - double d0 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - double d1 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - double d2 = (double) (world.random.nextFloat() * f) + (double) (1.0F - f) * 0.5D; - EntityItem entityitem = new EntityItem(world, (double) i + d0, (double) j + d1, (double) k + d2, itemstack); - - entityitem.pickupDelay = 10; - world.addEntity(entityitem); - } - } - - protected void dropExperience(World world, int i, int j, int k, int l) { - if (!world.isStatic) { - while (l > 0) { - int i1 = EntityExperienceOrb.getOrbValue(l); - - l -= i1; - world.addEntity(new EntityExperienceOrb(world, (double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, i1)); - } - } - } - - public int getDropData(int i) { - return 0; - } - - public float a(Entity entity) { - return this.durability / 5.0F; - } - - public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) { - this.updateShape(world, i, j, k); - vec3d = vec3d.add((double) (-i), (double) (-j), (double) (-k)); - vec3d1 = vec3d1.add((double) (-i), (double) (-j), (double) (-k)); - Vec3D vec3d2 = vec3d.b(vec3d1, this.minX); - Vec3D vec3d3 = vec3d.b(vec3d1, this.maxX); - Vec3D vec3d4 = vec3d.c(vec3d1, this.minY); - Vec3D vec3d5 = vec3d.c(vec3d1, this.maxY); - Vec3D vec3d6 = vec3d.d(vec3d1, this.minZ); - Vec3D vec3d7 = vec3d.d(vec3d1, this.maxZ); - - if (!this.a(vec3d2)) { - vec3d2 = null; - } - - if (!this.a(vec3d3)) { - vec3d3 = null; - } - - if (!this.b(vec3d4)) { - vec3d4 = null; - } - - if (!this.b(vec3d5)) { - vec3d5 = null; - } - - if (!this.c(vec3d6)) { - vec3d6 = null; - } - - if (!this.c(vec3d7)) { - vec3d7 = null; - } - - Vec3D vec3d8 = null; - - if (vec3d2 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d2) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d2; - } - - if (vec3d3 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d3) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d3; - } - - if (vec3d4 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d4) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d4; - } - - if (vec3d5 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d5) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d5; - } - - if (vec3d6 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d6) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d6; - } - - if (vec3d7 != null && (vec3d8 == null || vec3d.distanceSquared(vec3d7) < vec3d.distanceSquared(vec3d8))) { - vec3d8 = vec3d7; - } - - if (vec3d8 == null) { - return null; - } else { - byte b0 = -1; - - if (vec3d8 == vec3d2) { - b0 = 4; - } - - if (vec3d8 == vec3d3) { - b0 = 5; - } - - if (vec3d8 == vec3d4) { - b0 = 0; - } - - if (vec3d8 == vec3d5) { - b0 = 1; - } - - if (vec3d8 == vec3d6) { - b0 = 2; - } - - if (vec3d8 == vec3d7) { - b0 = 3; - } - - return new MovingObjectPosition(i, j, k, b0, vec3d8.add((double) i, (double) j, (double) k)); - } - } - - private boolean a(Vec3D vec3d) { - return vec3d == null ? false : vec3d.b >= this.minY && vec3d.b <= this.maxY && vec3d.c >= this.minZ && vec3d.c <= this.maxZ; - } - - private boolean b(Vec3D vec3d) { - return vec3d == null ? false : vec3d.a >= this.minX && vec3d.a <= this.maxX && vec3d.c >= this.minZ && vec3d.c <= this.maxZ; - } - - private boolean c(Vec3D vec3d) { - return vec3d == null ? false : vec3d.a >= this.minX && vec3d.a <= this.maxX && vec3d.b >= this.minY && vec3d.b <= this.maxY; - } - - public void wasExploded(World world, int i, int j, int k, Explosion explosion) {} - - public boolean canPlace(World world, int i, int j, int k, int l, ItemStack itemstack) { - return this.canPlace(world, i, j, k, l); - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return this.canPlace(world, i, j, k); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i, j, k).material.isReplaceable(); - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - return false; - } - - public void b(World world, int i, int j, int k, Entity entity) {} - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - return i1; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public void a(World world, int i, int j, int k, Entity entity, Vec3D vec3d) {} - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) {} - - public final double x() { - return this.minX; - } - - public final double y() { - return this.maxX; - } - - public final double z() { - return this.minY; - } - - public final double A() { - return this.maxY; - } - - public final double B() { - return this.minZ; - } - - public final double C() { - return this.maxZ; - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return 0; - } - - public boolean isPowerSource() { - return false; - } - - public void a(World world, int i, int j, int k, Entity entity) {} - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return 0; - } - - public void g() {} - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[getId(this)], 1); - entityhuman.applyExhaustion(0.025F); - if (this.E() && EnchantmentManager.hasSilkTouchEnchantment(entityhuman)) { - ItemStack itemstack = this.j(l); - - if (itemstack != null) { - this.a(world, i, j, k, itemstack); - } - } else { - int i1 = EnchantmentManager.getBonusBlockLootEnchantmentLevel(entityhuman); - - this.b(world, i, j, k, l, i1); - } - } - - protected boolean E() { - return this.d() && !this.isTileEntity; - } - - protected ItemStack j(int i) { - int j = 0; - Item item = Item.getItemOf(this); - - if (item != null && item.n()) { - j = i; - } - - return new ItemStack(item, 1, j); - } - - public int getDropCount(int i, Random random) { - return this.a(random); - } - - public boolean j(World world, int i, int j, int k) { - return true; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) {} - - public void postPlace(World world, int i, int j, int k, int l) {} - - public Block c(String s) { - this.name = s; - return this; - } - - public String getName() { - return LocaleI18n.get(this.a() + ".name"); - } - - public String a() { - return "tile." + this.name; - } - - public boolean a(World world, int i, int j, int k, int l, int i1) { - return false; - } - - public boolean G() { - return this.y; - } - - protected Block H() { - this.y = false; - return this; - } - - public int h() { - return this.material.getPushReaction(); - } - - public void a(World world, int i, int j, int k, Entity entity, float f) {} - - public int getDropData(World world, int i, int j, int k) { - return this.getDropData(world.getData(i, j, k)); - } - - public Block a(CreativeModeTab creativemodetab) { - this.creativeTab = creativemodetab; - return this; - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) {} - - public void f(World world, int i, int j, int k, int l) {} - - public void l(World world, int i, int j, int k) {} - - public boolean L() { - return true; - } - - public boolean a(Explosion explosion) { - return true; - } - - public boolean c(Block block) { - return this == block; - } - - public static boolean a(Block block, Block block1) { - return block != null && block1 != null ? (block == block1 ? true : block.c(block1)) : false; - } - - public boolean isComplexRedstone() { - return false; - } - - public int g(World world, int i, int j, int k, int l) { - return 0; - } - - protected Block d(String s) { - this.d = s; - return this; - } - - // CraftBukkit start - public int getExpDrop(World world, int data, int enchantmentLevel) { - return 0; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockActionDataList.java b/src/main/java/net/minecraft/server/BlockActionDataList.java deleted file mode 100644 index 30109ecc..00000000 --- a/src/main/java/net/minecraft/server/BlockActionDataList.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -// CraftBukkit - imported class because the constructor is package private -class BlockActionDataList extends ArrayList { - - private BlockActionDataList() {} - - BlockActionDataList(BananaAPI bananaapi) { - this(); - } -} diff --git a/src/main/java/net/minecraft/server/BlockBloodStone.java b/src/main/java/net/minecraft/server/BlockBloodStone.java deleted file mode 100644 index ca46ea62..00000000 --- a/src/main/java/net/minecraft/server/BlockBloodStone.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockBloodStone extends Block { - - public BlockBloodStone() { - super(Material.STONE); - this.a(CreativeModeTab.b); - } - - public MaterialMapColor f(int i) { - return MaterialMapColor.K; - } - - // CraftBukkit start - public void doPhysics(World world, int i, int j, int k, int l) { - if (net.minecraft.server.Block.getById(l) != null && net.minecraft.server.Block.getById(l).isPowerSource()) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int power = block.getBlockPower(); - - BlockRedstoneEvent event = new BlockRedstoneEvent(block, power, power); - world.getServer().getPluginManager().callEvent(event); - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockButtonAbstract.java b/src/main/java/net/minecraft/server/BlockButtonAbstract.java deleted file mode 100644 index 6e542058..00000000 --- a/src/main/java/net/minecraft/server/BlockButtonAbstract.java +++ /dev/null @@ -1,332 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.entity.EntityInteractEvent; -// CraftBukkit end - -public abstract class BlockButtonAbstract extends Block { - - private final boolean a; - - protected BlockButtonAbstract(boolean flag) { - super(Material.ORIENTABLE); - this.a(true); - this.a(CreativeModeTab.d); - this.a = flag; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public int a(World world) { - return this.a ? 30 : 20; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return l == 2 && world.getType(i, j, k + 1).r() ? true : (l == 3 && world.getType(i, j, k - 1).r() ? true : (l == 4 && world.getType(i + 1, j, k).r() ? true : l == 5 && world.getType(i - 1, j, k).r())); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? true : (world.getType(i + 1, j, k).r() ? true : (world.getType(i, j, k - 1).r() ? true : world.getType(i, j, k + 1).r())); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = world.getData(i, j, k); - int k1 = j1 & 8; - - j1 &= 7; - if (l == 2 && world.getType(i, j, k + 1).r()) { - j1 = 4; - } else if (l == 3 && world.getType(i, j, k - 1).r()) { - j1 = 3; - } else if (l == 4 && world.getType(i + 1, j, k).r()) { - j1 = 2; - } else if (l == 5 && world.getType(i - 1, j, k).r()) { - j1 = 1; - } else { - j1 = this.e(world, i, j, k); - } - - return j1 + k1; - } - - private int e(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? 1 : (world.getType(i + 1, j, k).r() ? 2 : (world.getType(i, j, k - 1).r() ? 3 : (world.getType(i, j, k + 1).r() ? 4 : 1))); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (this.m(world, i, j, k)) { - int l = world.getData(i, j, k) & 7; - boolean flag = false; - - if (!world.getType(i - 1, j, k).r() && l == 1) { - flag = true; - } - - if (!world.getType(i + 1, j, k).r() && l == 2) { - flag = true; - } - - if (!world.getType(i, j, k - 1).r() && l == 3) { - flag = true; - } - - if (!world.getType(i, j, k + 1).r() && l == 4) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - } - - private boolean m(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - - this.b(l); - } - - private void b(int i) { - int j = i & 7; - boolean flag = (i & 8) > 0; - float f = 0.375F; - float f1 = 0.625F; - float f2 = 0.1875F; - float f3 = 0.125F; - - if (flag) { - f3 = 0.0625F; - } - - if (j == 1) { - this.a(0.0F, f, 0.5F - f2, f3, f1, 0.5F + f2); - } else if (j == 2) { - this.a(1.0F - f3, f, 0.5F - f2, 1.0F, f1, 0.5F + f2); - } else if (j == 3) { - this.a(0.5F - f2, f, 0.0F, 0.5F + f2, f1, f3); - } else if (j == 4) { - this.a(0.5F - f2, f, 1.0F - f3, 0.5F + f2, f1, 1.0F); - } - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - int i1 = world.getData(i, j, k); - int j1 = i1 & 7; - int k1 = 8 - (i1 & 8); - - if (k1 == 0) { - return true; - } else { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int old = (k1 != 8) ? 15 : 0; - int current = (k1 == 8) ? 15 : 0; - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if ((eventRedstone.getNewCurrent() > 0) != (k1 == 8)) { - return true; - } - // CraftBukkit end - - world.setData(i, j, k, j1 + k1, 3); - world.c(i, j, k, i, j, k); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.6F); - this.a(world, i, j, k, j1); - world.a(i, j, k, this, this.a(world)); - return true; - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if ((l & 8) > 0) { - int i1 = l & 7; - - this.a(world, i, j, k, i1); - } - - super.remove(world, i, j, k, block, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) > 0 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if ((i1 & 8) == 0) { - return 0; - } else { - int j1 = i1 & 7; - - return j1 == 5 && l == 1 ? 15 : (j1 == 4 && l == 2 ? 15 : (j1 == 3 && l == 3 ? 15 : (j1 == 2 && l == 4 ? 15 : (j1 == 1 && l == 5 ? 15 : 0)))); - } - } - - public boolean isPowerSource() { - return true; - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) != 0) { - if (this.a) { - this.n(world, i, j, k); - } else { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() > 0) { - return; - } - // CraftBukkit end - world.setData(i, j, k, l & 7, 3); - int i1 = l & 7; - - this.a(world, i, j, k, i1); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.5F); - world.c(i, j, k, i, j, k); - } - } - } - } - - public void g() { - float f = 0.1875F; - float f1 = 0.125F; - float f2 = 0.125F; - - this.a(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2); - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - if (this.a) { - if ((world.getData(i, j, k) & 8) == 0) { - this.n(world, i, j, k); - } - } - } - } - - private void n(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = l & 7; - boolean flag = (l & 8) != 0; - - this.b(l); - List list = world.a(EntityArrow.class, AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ)); - boolean flag1 = !list.isEmpty(); - - // CraftBukkit start - Call interact event when arrows turn on wooden buttons - if (flag != flag1 && flag1) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - boolean allowed = false; - - // If all of the events are cancelled block the button press, else allow - for (Object object : list) { - if (object != null) { - EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - allowed = true; - break; - } - } - } - - if (!allowed) { - return; - } - } - // CraftBukkit end - - if (flag1 && !flag) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 0, 15); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() <= 0) { - return; - } - // CraftBukkit end - world.setData(i, j, k, i1 | 8, 3); - this.a(world, i, j, k, i1); - world.c(i, j, k, i, j, k); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.6F); - } - - if (!flag1 && flag) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() > 0) { - return; - } - // CraftBukkit end - world.setData(i, j, k, i1, 3); - this.a(world, i, j, k, i1); - world.c(i, j, k, i, j, k); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, 0.5F); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - } - - private void a(World world, int i, int j, int k, int l) { - world.applyPhysics(i, j, k, this); - if (l == 1) { - world.applyPhysics(i - 1, j, k, this); - } else if (l == 2) { - world.applyPhysics(i + 1, j, k, this); - } else if (l == 3) { - world.applyPhysics(i, j, k - 1, this); - } else if (l == 4) { - world.applyPhysics(i, j, k + 1, this); - } else { - world.applyPhysics(i, j - 1, k, this); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockCactus.java b/src/main/java/net/minecraft/server/BlockCactus.java deleted file mode 100644 index e920c6f4..00000000 --- a/src/main/java/net/minecraft/server/BlockCactus.java +++ /dev/null @@ -1,86 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockCactus extends Block { - - protected BlockCactus() { - super(Material.CACTUS); - this.a(true); - this.a(CreativeModeTab.c); - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.isEmpty(i, j + 1, k)) { - int l; - - for (l = 1; world.getType(i, j - l, k) == this; ++l) { - ; - } - - if (l < 3) { - int i1 = world.getData(i, j, k); - - if (i1 == 15) { - CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 0); // CraftBukkit - world.setData(i, j, k, 0, 4); - this.doPhysics(world, i, j + 1, k, this); - } else { - world.setData(i, j, k, i1 + 1, 4); - } - } - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - float f = 0.0625F; - - return AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f)); - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public int b() { - return 13; - } - - public boolean canPlace(World world, int i, int j, int k) { - return !super.canPlace(world, i, j, k) ? false : this.j(world, i, j, k); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - world.setAir(i, j, k, true); - } - } - - public boolean j(World world, int i, int j, int k) { - if (world.getType(i - 1, j, k).getMaterial().isBuildable()) { - return false; - } else if (world.getType(i + 1, j, k).getMaterial().isBuildable()) { - return false; - } else if (world.getType(i, j, k - 1).getMaterial().isBuildable()) { - return false; - } else if (world.getType(i, j, k + 1).getMaterial().isBuildable()) { - return false; - } else { - Block block = world.getType(i, j - 1, k); - - return block == Blocks.CACTUS || block == Blocks.SAND; - } - } - - public void a(World world, int i, int j, int k, Entity entity) { - CraftEventFactory.blockDamage = world.getWorld().getBlockAt(i, j, k); // CraftBukkit - entity.damageEntity(DamageSource.CACTUS, 1.0F); - CraftEventFactory.blockDamage = null; // CraftBukkit - } -} diff --git a/src/main/java/net/minecraft/server/BlockCake.java b/src/main/java/net/minecraft/server/BlockCake.java deleted file mode 100644 index e65a2705..00000000 --- a/src/main/java/net/minecraft/server/BlockCake.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockCake extends Block { - - protected BlockCake() { - super(Material.CAKE); - this.a(true); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - float f = 0.0625F; - float f1 = (float) (1 + l * 2) / 16.0F; - float f2 = 0.5F; - - this.a(f1, 0.0F, f, 1.0F - f, f2, 1.0F - f); - } - - public void g() { - float f = 0.0625F; - float f1 = 0.5F; - - this.a(f, 0.0F, f, 1.0F - f, f1, 1.0F - f); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - float f = 0.0625F; - float f1 = (float) (1 + l * 2) / 16.0F; - float f2 = 0.5F; - - return AxisAlignedBB.a((double) ((float) i + f1), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) j + f2 - f), (double) ((float) (k + 1) - f)); - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - this.b(world, i, j, k, entityhuman); - return true; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) { - this.b(world, i, j, k, entityhuman); - } - - private void b(World world, int i, int j, int k, EntityHuman entityhuman) { - if (entityhuman.g(false)) { - // CraftBukkit start - int oldFoodLevel = entityhuman.getFoodData().foodLevel; - - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, 2 + oldFoodLevel); - - if (!event.isCancelled()) { - entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 0.1F); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); - // CraftBukkit end - int l = world.getData(i, j, k) + 1; - - if (l >= 6) { - world.setAir(i, j, k); - } else { - world.setData(i, j, k, l, 2); - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - return !super.canPlace(world, i, j, k) ? false : this.j(world, i, j, k); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - world.setAir(i, j, k); - } - } - - public boolean j(World world, int i, int j, int k) { - return world.getType(i, j - 1, k).getMaterial().isBuildable(); - } - - public int a(Random random) { - return 0; - } - - public Item getDropType(int i, Random random, int j) { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/BlockCocoa.java b/src/main/java/net/minecraft/server/BlockCocoa.java deleted file mode 100644 index 5584fbd9..00000000 --- a/src/main/java/net/minecraft/server/BlockCocoa.java +++ /dev/null @@ -1,144 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockCocoa extends BlockDirectional implements IBlockFragilePlantElement { - - public BlockCocoa() { - super(Material.PLANT); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setTypeAndData(i, j, k, getById(0), 0, 2); - } else if (world.random.nextInt(5) == 0) { - int l = world.getData(i, j, k); - int i1 = c(l); - - if (i1 < 2) { - ++i1; - // CraftBukkit - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, i1 << 2 | l(l)); - } - } - } - - public boolean j(World world, int i, int j, int k) { - int l = l(world.getData(i, j, k)); - - i += Direction.a[l]; - k += Direction.b[l]; - Block block = world.getType(i, j, k); - - return block == Blocks.LOG && BlockLogAbstract.c(world.getData(i, j, k)) == 3; - } - - public int b() { - return 28; - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - int i1 = l(l); - int j1 = c(l); - int k1 = 4 + j1 * 2; - int l1 = 5 + j1 * 2; - float f = (float) k1 / 2.0F; - - switch (i1) { - case 0: - this.a((8.0F - f) / 16.0F, (12.0F - (float) l1) / 16.0F, (15.0F - (float) k1) / 16.0F, (8.0F + f) / 16.0F, 0.75F, 0.9375F); - break; - - case 1: - this.a(0.0625F, (12.0F - (float) l1) / 16.0F, (8.0F - f) / 16.0F, (1.0F + (float) k1) / 16.0F, 0.75F, (8.0F + f) / 16.0F); - break; - - case 2: - this.a((8.0F - f) / 16.0F, (12.0F - (float) l1) / 16.0F, 0.0625F, (8.0F + f) / 16.0F, 0.75F, (1.0F + (float) k1) / 16.0F); - break; - - case 3: - this.a((15.0F - (float) k1) / 16.0F, (12.0F - (float) l1) / 16.0F, (8.0F - f) / 16.0F, 0.9375F, 0.75F, (8.0F + f) / 16.0F); - } - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3) + 0) % 4; - - world.setData(i, j, k, l, 2); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - if (l == 1 || l == 0) { - l = 2; - } - - return Direction.f[Direction.e[l]]; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setTypeAndData(i, j, k, getById(0), 0, 2); - } - } - - public static int c(int i) { - return (i & 12) >> 2; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - int j1 = c(l); - byte b0 = 1; - - if (j1 >= 2) { - b0 = 3; - } - - for (int k1 = 0; k1 < b0; ++k1) { - this.a(world, i, j, k, new ItemStack(Items.INK_SACK, 1, 3)); - } - } - - public int getDropData(World world, int i, int j, int k) { - return 3; - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - int l = world.getData(i, j, k); - int i1 = c(l); - - return i1 < 2; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = BlockDirectional.l(l); - int j1 = c(l); - - ++j1; - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, j1 << 2 | i1); // CraftBukkit - } -} diff --git a/src/main/java/net/minecraft/server/BlockCommand.java b/src/main/java/net/minecraft/server/BlockCommand.java deleted file mode 100644 index c60f0a94..00000000 --- a/src/main/java/net/minecraft/server/BlockCommand.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockCommand extends BlockContainer { - - public BlockCommand() { - super(Material.ORE); - } - - public TileEntity a(World world, int i) { - return new TileEntityCommand(); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - boolean flag = world.isBlockIndirectlyPowered(i, j, k); - int l = world.getData(i, j, k); - boolean flag1 = (l & 1) != 0; - - // CraftBukkit start - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k); - int old = flag1 ? 15 : 0; - int current = flag ? 15 : 0; - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current); - world.getServer().getPluginManager().callEvent(eventRedstone); - // CraftBukkit end - - if (eventRedstone.getNewCurrent() > 0 && !(eventRedstone.getOldCurrent() > 0)) { // CraftBukkit - world.setData(i, j, k, l | 1, 4); - world.a(i, j, k, this, this.a(world)); - } else if (!(eventRedstone.getNewCurrent() > 0) && eventRedstone.getOldCurrent() > 0) { // CraftBukkit - world.setData(i, j, k, l & -2, 4); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - TileEntity tileentity = world.getTileEntity(i, j, k); - - if (tileentity != null && tileentity instanceof TileEntityCommand) { - CommandBlockListenerAbstract commandblocklistenerabstract = ((TileEntityCommand) tileentity).getCommandBlock(); - - commandblocklistenerabstract.a(world); - world.updateAdjacentComparators(i, j, k, this); - } - } - - public int a(World world) { - return 1; - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - TileEntityCommand tileentitycommand = (TileEntityCommand) world.getTileEntity(i, j, k); - - if (tileentitycommand != null) { - entityhuman.a((TileEntity) tileentitycommand); - } - - return true; - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - TileEntity tileentity = world.getTileEntity(i, j, k); - - return tileentity != null && tileentity instanceof TileEntityCommand ? ((TileEntityCommand) tileentity).getCommandBlock().g() : 0; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - TileEntityCommand tileentitycommand = (TileEntityCommand) world.getTileEntity(i, j, k); - - if (itemstack.hasName()) { - tileentitycommand.getCommandBlock().setName(itemstack.getName()); - } - } - - public int a(Random random) { - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockCrops.java b/src/main/java/net/minecraft/server/BlockCrops.java deleted file mode 100644 index 875181f5..00000000 --- a/src/main/java/net/minecraft/server/BlockCrops.java +++ /dev/null @@ -1,136 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockCrops extends BlockPlant implements IBlockFragilePlantElement { - - protected BlockCrops() { - this.a(true); - float f = 0.5F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - this.a((CreativeModeTab) null); - this.c(0.0F); - this.a(h); - this.H(); - } - - protected boolean a(Block block) { - return block == Blocks.SOIL; - } - - public void a(World world, int i, int j, int k, Random random) { - super.a(world, i, j, k, random); - if (world.getLightLevel(i, j + 1, k) >= 9) { - int l = world.getData(i, j, k); - - if (l < 7) { - float f = this.n(world, i, j, k); - - if (random.nextInt((int) (25.0F / f) + 1) == 0) { - ++l; - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - } - } - } - - public void m(World world, int i, int j, int k) { - int l = world.getData(i, j, k) + MathHelper.nextInt(world.random, 2, 5); - - if (l > 7) { - l = 7; - } - - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - - private float n(World world, int i, int j, int k) { - float f = 1.0F; - Block block = world.getType(i, j, k - 1); - Block block1 = world.getType(i, j, k + 1); - Block block2 = world.getType(i - 1, j, k); - Block block3 = world.getType(i + 1, j, k); - Block block4 = world.getType(i - 1, j, k - 1); - Block block5 = world.getType(i + 1, j, k - 1); - Block block6 = world.getType(i + 1, j, k + 1); - Block block7 = world.getType(i - 1, j, k + 1); - boolean flag = block2 == this || block3 == this; - boolean flag1 = block == this || block1 == this; - boolean flag2 = block4 == this || block5 == this || block6 == this || block7 == this; - - for (int l = i - 1; l <= i + 1; ++l) { - for (int i1 = k - 1; i1 <= k + 1; ++i1) { - float f1 = 0.0F; - - if (world.getType(l, j - 1, i1) == Blocks.SOIL) { - f1 = 1.0F; - if (world.getData(l, j - 1, i1) > 0) { - f1 = 3.0F; - } - } - - if (l != i || i1 != k) { - f1 /= 4.0F; - } - - f += f1; - } - } - - if (flag2 || flag && flag1) { - f /= 2.0F; - } - - return f; - } - - public int b() { - return 6; - } - - protected Item i() { - return Items.SEEDS; - } - - protected Item P() { - return Items.WHEAT; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, 0); - if (!world.isStatic) { - if (l >= 7) { - int j1 = 3 + i1; - - for (int k1 = 0; k1 < j1; ++k1) { - if (world.random.nextInt(15) <= l) { - this.a(world, i, j, k, new ItemStack(this.i(), 1, 0)); - } - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return i == 7 ? this.P() : this.i(); - } - - public int a(Random random) { - return 1; - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return world.getData(i, j, k) != 7; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - this.m(world, i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDaylightDetector.java b/src/main/java/net/minecraft/server/BlockDaylightDetector.java deleted file mode 100644 index 96e9c37e..00000000 --- a/src/main/java/net/minecraft/server/BlockDaylightDetector.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockDaylightDetector extends BlockContainer { - - private IIcon[] a = new IIcon[2]; - - public BlockDaylightDetector() { - super(Material.WOOD); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.375F, 1.0F); - this.a(CreativeModeTab.d); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.375F, 1.0F); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return iblockaccess.getData(i, j, k); - } - - public void a(World world, int i, int j, int k, Random random) {} - - public void doPhysics(World world, int i, int j, int k, Block block) {} - - public void onPlace(World world, int i, int j, int k) {} - - public void e(World world, int i, int j, int k) { - if (!world.worldProvider.g) { - int l = world.getData(i, j, k); - int i1 = world.b(EnumSkyBlock.SKY, i, j, k) - world.j; - float f = world.d(1.0F); - - if (f < 3.1415927F) { - f += (0.0F - f) * 0.2F; - } else { - f += (6.2831855F - f) * 0.2F; - } - - i1 = Math.round((float) i1 * MathHelper.cos(f)); - if (i1 < 0) { - i1 = 0; - } - - if (i1 > 15) { - i1 = 15; - } - - if (l != i1) { - i1 = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, i, j, k, l, i1).getNewCurrent(); // CraftBukkit - Call BlockRedstoneEvent - world.setData(i, j, k, i1, 3); - } - } - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public boolean isPowerSource() { - return true; - } - - public TileEntity a(World world, int i) { - return new TileEntityLightDetector(); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDiodeAbstract.java b/src/main/java/net/minecraft/server/BlockDiodeAbstract.java deleted file mode 100644 index ec581e0f..00000000 --- a/src/main/java/net/minecraft/server/BlockDiodeAbstract.java +++ /dev/null @@ -1,259 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public abstract class BlockDiodeAbstract extends BlockDirectional { - - protected final boolean a; - - protected BlockDiodeAbstract(boolean flag) { - super(Material.ORIENTABLE); - this.a = flag; - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); - } - - public boolean d() { - return false; - } - - public boolean canPlace(World world, int i, int j, int k) { - return !World.a((IBlockAccess) world, i, j - 1, k) ? false : super.canPlace(world, i, j, k); - } - - public boolean j(World world, int i, int j, int k) { - return !World.a((IBlockAccess) world, i, j - 1, k) ? false : super.j(world, i, j, k); - } - - public void a(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - - if (!this.g((IBlockAccess) world, i, j, k, l)) { // CraftBukkit - Cast world to IBlockAccess to call the right method. - boolean flag = this.a(world, i, j, k, l); - - if (this.a && !flag) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 15, 0).getNewCurrent() != 0) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, this.i(), l, 2); - } else if (!this.a) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() != 15) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, this.e(), l, 2); - if (!flag) { - world.a(i, j, k, this.e(), this.k(l), -1); - } - } - } - } - - public int b() { - return 36; - } - - protected boolean c(int i) { - return this.a; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return this.b(iblockaccess, i, j, k, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if (!this.c(i1)) { - return 0; - } else { - int j1 = l(i1); - - return j1 == 0 && l == 3 ? this.f(iblockaccess, i, j, k, i1) : (j1 == 1 && l == 4 ? this.f(iblockaccess, i, j, k, i1) : (j1 == 2 && l == 2 ? this.f(iblockaccess, i, j, k, i1) : (j1 == 3 && l == 5 ? this.f(iblockaccess, i, j, k, i1) : 0))); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - } else { - this.b(world, i, j, k, block); - } - } - - protected void b(World world, int i, int j, int k, Block block) { - int l = world.getData(i, j, k); - - if (!this.g((IBlockAccess) world, i, j, k, l)) { // CraftBukkit - Cast world to IBlockAccess to call the right method. - boolean flag = this.a(world, i, j, k, l); - - if ((this.a && !flag || !this.a && flag) && !world.a(i, j, k, (Block) this)) { - byte b0 = -1; - - if (this.i(world, i, j, k, l)) { - b0 = -3; - } else if (this.a) { - b0 = -2; - } - - world.a(i, j, k, this, this.b(l), b0); - } - } - } - - public boolean g(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return false; - } - - protected boolean a(World world, int i, int j, int k, int l) { - return this.h(world, i, j, k, l) > 0; - } - - protected int h(World world, int i, int j, int k, int l) { - int i1 = l(l); - int j1 = i + Direction.a[i1]; - int k1 = k + Direction.b[i1]; - int l1 = world.getBlockFacePower(j1, j, k1, Direction.d[i1]); - - return l1 >= 15 ? l1 : Math.max(l1, world.getType(j1, j, k1) == Blocks.REDSTONE_WIRE ? world.getData(j1, j, k1) : 0); - } - - protected int h(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = l(l); - - switch (i1) { - case 0: - case 2: - return Math.max(this.i(iblockaccess, i - 1, j, k, 4), this.i(iblockaccess, i + 1, j, k, 5)); - - case 1: - case 3: - return Math.max(this.i(iblockaccess, i, j, k + 1, 3), this.i(iblockaccess, i, j, k - 1, 2)); - - default: - return 0; - } - } - - protected int i(IBlockAccess iblockaccess, int i, int j, int k, int l) { - Block block = iblockaccess.getType(i, j, k); - - return this.a(block) ? (block == Blocks.REDSTONE_WIRE ? iblockaccess.getData(i, j, k) : iblockaccess.getBlockPower(i, j, k, l)) : 0; - } - - public boolean isPowerSource() { - return true; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4; - - world.setData(i, j, k, l, 3); - boolean flag = this.a(world, i, j, k, l); - - if (flag) { - world.a(i, j, k, this, 1); - } - } - - public void onPlace(World world, int i, int j, int k) { - this.e(world, i, j, k); - } - - protected void e(World world, int i, int j, int k) { - int l = l(world.getData(i, j, k)); - - if (l == 1) { - world.e(i + 1, j, k, this); - world.b(i + 1, j, k, this, 4); - } - - if (l == 3) { - world.e(i - 1, j, k, this); - world.b(i - 1, j, k, this, 5); - } - - if (l == 2) { - world.e(i, j, k + 1, this); - world.b(i, j, k + 1, this, 2); - } - - if (l == 0) { - world.e(i, j, k - 1, this); - world.b(i, j, k - 1, this, 3); - } - } - - public void postBreak(World world, int i, int j, int k, int l) { - if (this.a) { - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - } - - super.postBreak(world, i, j, k, l); - } - - public boolean c() { - return false; - } - - protected boolean a(Block block) { - return block.isPowerSource(); - } - - protected int f(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return 15; - } - - public static boolean d(Block block) { - return Blocks.DIODE_OFF.e(block) || Blocks.REDSTONE_COMPARATOR_OFF.e(block); - } - - public boolean e(Block block) { - return block == this.e() || block == this.i(); - } - - public boolean i(World world, int i, int j, int k, int l) { - int i1 = l(l); - - if (d(world.getType(i - Direction.a[i1], j, k - Direction.b[i1]))) { - int j1 = world.getData(i - Direction.a[i1], j, k - Direction.b[i1]); - int k1 = l(j1); - - return k1 != i1; - } else { - return false; - } - } - - protected int k(int i) { - return this.b(i); - } - - protected abstract int b(int i); - - protected abstract BlockDiodeAbstract e(); - - protected abstract BlockDiodeAbstract i(); - - public boolean c(Block block) { - return this.e(block); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDispenser.java b/src/main/java/net/minecraft/server/BlockDispenser.java deleted file mode 100644 index 9450df9b..00000000 --- a/src/main/java/net/minecraft/server/BlockDispenser.java +++ /dev/null @@ -1,189 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockDispenser extends BlockContainer { - - public static final IRegistry a = new RegistryDefault(new DispenseBehaviorItem()); - protected Random b = new Random(); - public static boolean eventFired = false; // CraftBukkit - - protected BlockDispenser() { - super(Material.STONE); - this.a(CreativeModeTab.d); - } - - public int a(World world) { - return 4; - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - this.m(world, i, j, k); - } - - private void m(World world, int i, int j, int k) { - if (!world.isStatic) { - Block block = world.getType(i, j, k - 1); - Block block1 = world.getType(i, j, k + 1); - Block block2 = world.getType(i - 1, j, k); - Block block3 = world.getType(i + 1, j, k); - byte b0 = 3; - - if (block.j() && !block1.j()) { - b0 = 3; - } - - if (block1.j() && !block.j()) { - b0 = 2; - } - - if (block2.j() && !block3.j()) { - b0 = 5; - } - - if (block3.j() && !block2.j()) { - b0 = 4; - } - - world.setData(i, j, k, b0, 2); - } - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) world.getTileEntity(i, j, k); - - if (tileentitydispenser != null) { - entityhuman.openDispenser(tileentitydispenser); - } - - return true; - } - } - - // CraftBukkit - protected -> public - public void dispense(World world, int i, int j, int k) { - SourceBlock sourceblock = new SourceBlock(world, i, j, k); - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) sourceblock.getTileEntity(); - - if (tileentitydispenser != null) { - int l = tileentitydispenser.i(); - - if (l < 0) { - world.triggerEffect(1001, i, j, k, 0); - } else { - ItemStack itemstack = tileentitydispenser.getItem(l); - IDispenseBehavior idispensebehavior = this.a(itemstack); - - if (idispensebehavior != IDispenseBehavior.a) { - ItemStack itemstack1 = idispensebehavior.a(sourceblock, itemstack); - eventFired = false; // CraftBukkit - reset event status - - tileentitydispenser.setItem(l, itemstack1.count == 0 ? null : itemstack1); - } - } - } - } - - protected IDispenseBehavior a(ItemStack itemstack) { - return (IDispenseBehavior) a.get(itemstack.getItem()); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - boolean flag = world.isBlockIndirectlyPowered(i, j, k) || world.isBlockIndirectlyPowered(i, j + 1, k); - int l = world.getData(i, j, k); - boolean flag1 = (l & 8) != 0; - - if (flag && !flag1) { - world.a(i, j, k, this, this.a(world)); - world.setData(i, j, k, l | 8, 4); - } else if (!flag && flag1) { - world.setData(i, j, k, l & -9, 4); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - this.dispense(world, i, j, k); - } - } - - public TileEntity a(World world, int i) { - return new TileEntityDispenser(); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = BlockPiston.a(world, i, j, k, entityliving); - - world.setData(i, j, k, l, 2); - if (itemstack.hasName()) { - ((TileEntityDispenser) world.getTileEntity(i, j, k)).a(itemstack.getName()); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) world.getTileEntity(i, j, k); - - if (tileentitydispenser != null) { - for (int i1 = 0; i1 < tileentitydispenser.getSize(); ++i1) { - ItemStack itemstack = tileentitydispenser.getItem(i1); - - if (itemstack != null) { - float f = this.b.nextFloat() * 0.8F + 0.1F; - float f1 = this.b.nextFloat() * 0.8F + 0.1F; - float f2 = this.b.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j1 = this.b.nextInt(21) + 10; - - if (j1 > itemstack.count) { - j1 = itemstack.count; - } - - itemstack.count -= j1; - EntityItem entityitem = new EntityItem(world, (double) ((float) i + f), (double) ((float) j + f1), (double) ((float) k + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getData())); - - if (itemstack.hasTag()) { - entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); - } - - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.b.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.b.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.b.nextGaussian() * f3); - world.addEntity(entityitem); - } - } - } - - world.updateAdjacentComparators(i, j, k, block); - } - - super.remove(world, i, j, k, block, l); - } - - public static IPosition a(ISourceBlock isourceblock) { - EnumFacing enumfacing = b(isourceblock.h()); - double d0 = isourceblock.getX() + 0.7D * (double) enumfacing.getAdjacentX(); - double d1 = isourceblock.getY() + 0.7D * (double) enumfacing.getAdjacentY(); - double d2 = isourceblock.getZ() + 0.7D * (double) enumfacing.getAdjacentZ(); - - return new Position(d0, d1, d2); - } - - public static EnumFacing b(int i) { - return EnumFacing.a(i & 7); - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - return Container.b((IInventory) world.getTileEntity(i, j, k)); - } -} diff --git a/src/main/java/net/minecraft/server/BlockDoor.java b/src/main/java/net/minecraft/server/BlockDoor.java deleted file mode 100644 index 9c3ae2e1..00000000 --- a/src/main/java/net/minecraft/server/BlockDoor.java +++ /dev/null @@ -1,240 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockDoor extends Block { - - protected BlockDoor(Material material) { - super(material); - float f = 0.5F; - float f1 = 1.0F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - } - - public boolean c() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - int l = this.g(iblockaccess, i, j, k); - - return (l & 4) != 0; - } - - public boolean d() { - return false; - } - - public int b() { - return 7; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(this.g(iblockaccess, i, j, k)); - } - - public int e(IBlockAccess iblockaccess, int i, int j, int k) { - return this.g(iblockaccess, i, j, k) & 3; - } - - public boolean f(IBlockAccess iblockaccess, int i, int j, int k) { - return (this.g(iblockaccess, i, j, k) & 4) != 0; - } - - private void b(int i) { - float f = 0.1875F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F); - int j = i & 3; - boolean flag = (i & 4) != 0; - boolean flag1 = (i & 16) != 0; - - if (j == 0) { - if (flag) { - if (!flag1) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } else { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } else if (j == 1) { - if (flag) { - if (!flag1) { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } else { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - } else if (j == 2) { - if (flag) { - if (!flag1) { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - } else { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } else if (j == 3) { - if (flag) { - if (!flag1) { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } else { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - } - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (this.material == Material.ORE) { - return true; - } else { - int i1 = this.g(world, i, j, k); - int j1 = i1 & 7; - - j1 ^= 4; - if ((i1 & 8) == 0) { - world.setData(i, j, k, j1, 2); - world.c(i, j, k, i, j, k); - } else { - world.setData(i, j - 1, k, j1, 2); - world.c(i, j - 1, k, i, j, k); - } - - world.a(entityhuman, 1003, i, j, k, 0); - return true; - } - } - - public void setDoor(World world, int i, int j, int k, boolean flag) { - int l = this.g(world, i, j, k); - boolean flag1 = (l & 4) != 0; - - if (flag1 != flag) { - int i1 = l & 7; - - i1 ^= 4; - if ((l & 8) == 0) { - world.setData(i, j, k, i1, 2); - world.c(i, j, k, i, j, k); - } else { - world.setData(i, j - 1, k, i1, 2); - world.c(i, j - 1, k, i, j, k); - } - - world.a((EntityHuman) null, 1003, i, j, k, 0); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = world.getData(i, j, k); - - if ((l & 8) == 0) { - boolean flag = false; - - if (world.getType(i, j + 1, k) != this) { - world.setAir(i, j, k); - flag = true; - } - - if (!World.a((IBlockAccess) world, i, j - 1, k)) { - world.setAir(i, j, k); - flag = true; - if (world.getType(i, j + 1, k) == this) { - world.setAir(i, j + 1, k); - } - } - - if (flag) { - if (!world.isStatic) { - this.b(world, i, j, k, l, 0); - } - // CraftBukkit start - } else if (block.isPowerSource()) { - org.bukkit.World bworld = world.getWorld(); - org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(i, j, k); - org.bukkit.block.Block blockTop = bworld.getBlockAt(i, j + 1, k); - - int power = bukkitBlock.getBlockPower(); - int powerTop = blockTop.getBlockPower(); - if (powerTop > power) power = powerTop; - int oldPower = (world.getData(i, j, k) & 4) > 0 ? 15 : 0; - - if (oldPower == 0 ^ power == 0) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - - this.setDoor(world, i, j, k, eventRedstone.getNewCurrent() > 0); - } - // CraftBukkit end - } - } else { - if (world.getType(i, j - 1, k) != this) { - world.setAir(i, j, k); - } - - if (block != this) { - this.doPhysics(world, i, j - 1, k, block); - } - } - } - - public Item getDropType(int i, Random random, int j) { - return (i & 8) != 0 ? null : (this.material == Material.ORE ? Items.IRON_DOOR : Items.WOOD_DOOR); - } - - public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k, vec3d, vec3d1); - } - - public boolean canPlace(World world, int i, int j, int k) { - return j >= 255 ? false : World.a((IBlockAccess) world, i, j - 1, k) && super.canPlace(world, i, j, k) && super.canPlace(world, i, j + 1, k); - } - - public int h() { - return 1; - } - - public int g(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - boolean flag = (l & 8) != 0; - int i1; - int j1; - - if (flag) { - i1 = iblockaccess.getData(i, j - 1, k); - j1 = l; - } else { - i1 = l; - j1 = iblockaccess.getData(i, j + 1, k); - } - - boolean flag1 = (j1 & 1) != 0; - - return i1 & 7 | (flag ? 8 : 0) | (flag1 ? 16 : 0); - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild && (l & 8) != 0 && world.getType(i, j - 1, k) == this) { - world.setAir(i, j - 1, k); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockDragonEgg.java b/src/main/java/net/minecraft/server/BlockDragonEgg.java deleted file mode 100644 index b1c3f10e..00000000 --- a/src/main/java/net/minecraft/server/BlockDragonEgg.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockFromToEvent; // CraftBukkit - -public class BlockDragonEgg extends Block { - - public BlockDragonEgg() { - super(Material.DRAGON_EGG); - this.a(0.0625F, 0.0F, 0.0625F, 0.9375F, 1.0F, 0.9375F); - } - - public void onPlace(World world, int i, int j, int k) { - world.a(i, j, k, this, this.a(world)); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - world.a(i, j, k, this, this.a(world)); - } - - public void a(World world, int i, int j, int k, Random random) { - this.e(world, i, j, k); - } - - private void e(World world, int i, int j, int k) { - if (BlockFalling.canFall(world, i, j - 1, k) && j >= 0) { - byte b0 = 32; - - if (!BlockFalling.instaFall && world.b(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { - // CraftBukkit - added data - EntityFallingBlock entityfallingblock = new EntityFallingBlock(world, (double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this, world.getData(i, j, k)); - - world.addEntity(entityfallingblock); - } else { - world.setAir(i, j, k); - - while (BlockFalling.canFall(world, i, j - 1, k) && j > 0) { - --j; - } - - if (j > 0) { - world.setTypeAndData(i, j, k, this, 0, 2); - } - } - } - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - this.m(world, i, j, k); - return true; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) { - this.m(world, i, j, k); - } - - private void m(World world, int i, int j, int k) { - if (world.getType(i, j, k) == this) { - for (int l = 0; l < 1000; ++l) { - int i1 = i + world.random.nextInt(16) - world.random.nextInt(16); - int j1 = j + world.random.nextInt(8) - world.random.nextInt(8); - int k1 = k + world.random.nextInt(16) - world.random.nextInt(16); - - if (world.getType(i1, j1, k1).material == Material.AIR) { - // CraftBukkit start - org.bukkit.block.Block from = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block to = world.getWorld().getBlockAt(i1, j1, k1); - BlockFromToEvent event = new BlockFromToEvent(from, to); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - i1 = event.getToBlock().getX(); - j1 = event.getToBlock().getY(); - k1 = event.getToBlock().getZ(); - // CraftBukkit end - - if (!world.isStatic) { - world.setTypeAndData(i1, j1, k1, this, world.getData(i, j, k), 2); - world.setAir(i, j, k); - } else { - short short1 = 128; - - for (int l1 = 0; l1 < short1; ++l1) { - double d0 = world.random.nextDouble(); - float f = (world.random.nextFloat() - 0.5F) * 0.2F; - float f1 = (world.random.nextFloat() - 0.5F) * 0.2F; - float f2 = (world.random.nextFloat() - 0.5F) * 0.2F; - double d1 = (double) i1 + (double) (i - i1) * d0 + (world.random.nextDouble() - 0.5D) * 1.0D + 0.5D; - double d2 = (double) j1 + (double) (j - j1) * d0 + world.random.nextDouble() * 1.0D - 0.5D; - double d3 = (double) k1 + (double) (k - k1) * d0 + (world.random.nextDouble() - 0.5D) * 1.0D + 0.5D; - - world.addParticle("portal", d1, d2, d3, (double) f, (double) f1, (double) f2); - } - } - - return; - } - } - } - } - - public int a(World world) { - return 5; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 27; - } -} diff --git a/src/main/java/net/minecraft/server/BlockDropper.java b/src/main/java/net/minecraft/server/BlockDropper.java deleted file mode 100644 index 039afd39..00000000 --- a/src/main/java/net/minecraft/server/BlockDropper.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.inventory.InventoryMoveItemEvent; -// CraftBukkit end - -public class BlockDropper extends BlockDispenser { - - private final IDispenseBehavior P = new DispenseBehaviorItem(); - - public BlockDropper() {} - - protected IDispenseBehavior a(ItemStack itemstack) { - return this.P; - } - - public TileEntity a(World world, int i) { - return new TileEntityDropper(); - } - - public void dispense(World world, int i, int j, int k) { // CraftBukkit - protected -> public - SourceBlock sourceblock = new SourceBlock(world, i, j, k); - TileEntityDispenser tileentitydispenser = (TileEntityDispenser) sourceblock.getTileEntity(); - - if (tileentitydispenser != null) { - int l = tileentitydispenser.i(); - - if (l < 0) { - world.triggerEffect(1001, i, j, k, 0); - } else { - ItemStack itemstack = tileentitydispenser.getItem(l); - int i1 = world.getData(i, j, k) & 7; - IInventory iinventory = TileEntityHopper.getInventoryAt(world, (double) (i + Facing.b[i1]), (double) (j + Facing.c[i1]), (double) (k + Facing.d[i1])); - ItemStack itemstack1; - - if (iinventory != null) { - // CraftBukkit start - Fire event when pushing items into other inventories - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(itemstack.cloneItemStack().a(1)); - - org.bukkit.inventory.Inventory destinationInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - destinationInventory = iinventory.getOwner().getInventory(); - } - - InventoryMoveItemEvent event = new InventoryMoveItemEvent(tileentitydispenser.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); - world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - itemstack1 = TileEntityHopper.addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), Facing.OPPOSITE_FACING[i1]); - if (event.getItem().equals(oitemstack) && itemstack1 == null) { - // CraftBukkit end - itemstack1 = itemstack.cloneItemStack(); - if (--itemstack1.count == 0) { - itemstack1 = null; - } - } else { - itemstack1 = itemstack.cloneItemStack(); - } - } else { - itemstack1 = this.P.a(sourceblock, itemstack); - if (itemstack1 != null && itemstack1.count == 0) { - itemstack1 = null; - } - } - - tileentitydispenser.setItem(l, itemstack1); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockEnderPortal.java b/src/main/java/net/minecraft/server/BlockEnderPortal.java deleted file mode 100644 index 0b24c153..00000000 --- a/src/main/java/net/minecraft/server/BlockEnderPortal.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit - -public class BlockEnderPortal extends BlockContainer { - - public static boolean a; - - protected BlockEnderPortal(Material material) { - super(material); - this.a(1.0F); - } - - public TileEntity a(World world, int i) { - return new TileEntityEnderPortal(); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - float f = 0.0625F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) {} - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (entity.vehicle == null && entity.passenger == null && !world.isStatic) { - // CraftBukkit start - Entity in portal - EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), i, j, k)); - world.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - entity.b(1); - } - } - - public int b() { - return -1; - } - - public void onPlace(World world, int i, int j, int k) { - if (!a) { - if (world.worldProvider.dimension != 0) { - world.setAir(i, j, k); - } - } - } - - public MaterialMapColor f(int i) { - return MaterialMapColor.J; - } -} diff --git a/src/main/java/net/minecraft/server/BlockFire.java b/src/main/java/net/minecraft/server/BlockFire.java deleted file mode 100644 index 44994a14..00000000 --- a/src/main/java/net/minecraft/server/BlockFire.java +++ /dev/null @@ -1,281 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.block.BlockBurnEvent; -import org.bukkit.event.block.BlockSpreadEvent; -// CraftBukkit end - -public class BlockFire extends Block { - - private int[] a = new int[256]; - private int[] b = new int[256]; - - protected BlockFire() { - super(Material.FIRE); - this.a(true); - } - - public static void e() { - Blocks.FIRE.a(getId(Blocks.WOOD), 5, 20); - Blocks.FIRE.a(getId(Blocks.WOOD_DOUBLE_STEP), 5, 20); - Blocks.FIRE.a(getId(Blocks.WOOD_STEP), 5, 20); - Blocks.FIRE.a(getId(Blocks.FENCE), 5, 20); - Blocks.FIRE.a(getId(Blocks.WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.BIRCH_WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.SPRUCE_WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.JUNGLE_WOOD_STAIRS), 5, 20); - Blocks.FIRE.a(getId(Blocks.LOG), 5, 5); - Blocks.FIRE.a(getId(Blocks.LOG2), 5, 5); - Blocks.FIRE.a(getId(Blocks.LEAVES), 30, 60); - Blocks.FIRE.a(getId(Blocks.LEAVES2), 30, 60); - Blocks.FIRE.a(getId(Blocks.BOOKSHELF), 30, 20); - Blocks.FIRE.a(getId(Blocks.TNT), 15, 100); - Blocks.FIRE.a(getId(Blocks.LONG_GRASS), 60, 100); - Blocks.FIRE.a(getId(Blocks.DOUBLE_PLANT), 60, 100); - Blocks.FIRE.a(getId(Blocks.YELLOW_FLOWER), 60, 100); - Blocks.FIRE.a(getId(Blocks.RED_ROSE), 60, 100); - Blocks.FIRE.a(getId(Blocks.WOOL), 30, 60); - Blocks.FIRE.a(getId(Blocks.VINE), 15, 100); - Blocks.FIRE.a(getId(Blocks.COAL_BLOCK), 5, 5); - Blocks.FIRE.a(getId(Blocks.HAY_BLOCK), 60, 20); - Blocks.FIRE.a(getId(Blocks.WOOL_CARPET), 60, 20); - } - - public void a(int i, int j, int k) { - this.a[i] = j; - this.b[i] = k; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 3; - } - - public int a(Random random) { - return 0; - } - - public int a(World world) { - return 30; - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.getGameRules().getBoolean("doFireTick")) { - boolean flag = world.getType(i, j - 1, k) == Blocks.NETHERRACK; - - if (world.worldProvider instanceof WorldProviderTheEnd && world.getType(i, j - 1, k) == Blocks.BEDROCK) { - flag = true; - } - - if (!this.canPlace(world, i, j, k)) { - fireExtinguished(world, i, j, k); // CraftBukkit - invalid place location - } - - if (!flag && world.Q() && (world.isRainingAt(i, j, k) || world.isRainingAt(i - 1, j, k) || world.isRainingAt(i + 1, j, k) || world.isRainingAt(i, j, k - 1) || world.isRainingAt(i, j, k + 1))) { - fireExtinguished(world, i, j, k); // CraftBukkit - extinguished by rain - } else { - int l = world.getData(i, j, k); - - if (l < 15) { - world.setData(i, j, k, l + random.nextInt(3) / 2, 4); - } - - world.a(i, j, k, this, this.a(world) + random.nextInt(10)); - if (!flag && !this.e(world, i, j, k)) { - if (!World.a((IBlockAccess) world, i, j - 1, k) || l > 3) { - fireExtinguished(world, i, j, k); // CraftBukkit - burn out of inflammable block - } - } else if (!flag && !this.e((IBlockAccess) world, i, j - 1, k) && l == 15 && random.nextInt(4) == 0) { - fireExtinguished(world, i, j, k); // CraftBukkit - burn out - } else { - boolean flag1 = world.z(i, j, k); - byte b0 = 0; - - if (flag1) { - b0 = -50; - } - - this.a(world, i + 1, j, k, 300 + b0, random, l); - this.a(world, i - 1, j, k, 300 + b0, random, l); - this.a(world, i, j - 1, k, 250 + b0, random, l); - this.a(world, i, j + 1, k, 250 + b0, random, l); - this.a(world, i, j, k - 1, 300 + b0, random, l); - this.a(world, i, j, k + 1, 300 + b0, random, l); - - for (int i1 = i - 1; i1 <= i + 1; ++i1) { - for (int j1 = k - 1; j1 <= k + 1; ++j1) { - for (int k1 = j - 1; k1 <= j + 4; ++k1) { - if (i1 != i || k1 != j || j1 != k) { - int l1 = 100; - - if (k1 > j + 1) { - l1 += (k1 - (j + 1)) * 100; - } - - int i2 = this.m(world, i1, k1, j1); - - if (i2 > 0) { - int j2 = (i2 + 40 + world.difficulty.a() * 7) / (l + 30); - - if (flag1) { - j2 /= 2; - } - - if (j2 > 0 && random.nextInt(l1) <= j2 && (!world.Q() || !world.isRainingAt(i1, k1, j1)) && !world.isRainingAt(i1 - 1, k1, k) && !world.isRainingAt(i1 + 1, k1, j1) && !world.isRainingAt(i1, k1, j1 - 1) && !world.isRainingAt(i1, k1, j1 + 1)) { - int k2 = l + random.nextInt(5) / 4; - - if (k2 > 15) { - k2 = 15; - } - - // CraftBukkit start - Call to stop spread of fire - if (world.getType(i1, k1, j1) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, i1, k1, j1, i, j, k).isCancelled()) { - continue; - } - - org.bukkit.Server server = world.getServer(); - org.bukkit.World bworld = world.getWorld(); - org.bukkit.block.BlockState blockState = bworld.getBlockAt(i1, k1, j1).getState(); - blockState.setTypeId(Block.getId(this)); - blockState.setData(new org.bukkit.material.MaterialData(Block.getId(this), (byte) k2)); - - BlockSpreadEvent spreadEvent = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); - server.getPluginManager().callEvent(spreadEvent); - - if (!spreadEvent.isCancelled()) { - blockState.update(true); - } - } - // CraftBukkit end - } - } - } - } - } - } - } - } - } - } - - public boolean L() { - return false; - } - - private void a(World world, int i, int j, int k, int l, Random random, int i1) { - int j1 = this.b[Block.getId(world.getType(i, j, k))]; - - if (random.nextInt(l) < j1) { - boolean flag = world.getType(i, j, k) == Blocks.TNT; - - // CraftBukkit start - org.bukkit.block.Block theBlock = world.getWorld().getBlockAt(i, j, k); - - BlockBurnEvent event = new BlockBurnEvent(theBlock); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - if (random.nextInt(i1 + 10) < 5 && !world.isRainingAt(i, j, k)) { - int k1 = i1 + random.nextInt(5) / 4; - - if (k1 > 15) { - k1 = 15; - } - - world.setTypeAndData(i, j, k, this, k1, 3); - } else { - world.setAir(i, j, k); - } - - if (flag) { - Blocks.TNT.postBreak(world, i, j, k, 1); - } - } - } - - private boolean e(World world, int i, int j, int k) { - return this.e((IBlockAccess) world, i + 1, j, k) ? true : (this.e((IBlockAccess) world, i - 1, j, k) ? true : (this.e((IBlockAccess) world, i, j - 1, k) ? true : (this.e((IBlockAccess) world, i, j + 1, k) ? true : (this.e((IBlockAccess) world, i, j, k - 1) ? true : this.e((IBlockAccess) world, i, j, k + 1))))); - } - - private int m(World world, int i, int j, int k) { - byte b0 = 0; - - if (!world.isEmpty(i, j, k)) { - return 0; - } else { - int l = this.a(world, i + 1, j, k, b0); - - l = this.a(world, i - 1, j, k, l); - l = this.a(world, i, j - 1, k, l); - l = this.a(world, i, j + 1, k, l); - l = this.a(world, i, j, k - 1, l); - l = this.a(world, i, j, k + 1, l); - return l; - } - } - - public boolean v() { - return false; - } - - public boolean e(IBlockAccess iblockaccess, int i, int j, int k) { - return this.a[Block.getId(iblockaccess.getType(i, j, k))] > 0; - } - - public int a(World world, int i, int j, int k, int l) { - int i1 = this.a[Block.getId(world.getType(i, j, k))]; - - return i1 > l ? i1 : l; - } - - public boolean canPlace(World world, int i, int j, int k) { - return World.a((IBlockAccess) world, i, j - 1, k) || this.e(world, i, j, k); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!World.a((IBlockAccess) world, i, j - 1, k) && !this.e(world, i, j, k)) { - fireExtinguished(world, i, j, k); // CraftBukkit - fuel block gone - } - } - - public void onPlace(World world, int i, int j, int k) { - if (world.worldProvider.dimension > 0 || !Blocks.PORTAL.e(world, i, j, k)) { - if (!World.a((IBlockAccess) world, i, j - 1, k) && !this.e(world, i, j, k)) { - fireExtinguished(world, i, j, k); // CraftBukkit - fuel block broke - } else { - world.a(i, j, k, this, this.a(world) + world.random.nextInt(10)); - } - } - } - - public MaterialMapColor f(int i) { - return MaterialMapColor.f; - } - - // CraftBukkit start - private void fireExtinguished(World world, int x, int y, int z) { - if (!CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(x, y, z), Blocks.AIR).isCancelled()) { - world.setAir(x, y, z); - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockFlowing.java b/src/main/java/net/minecraft/server/BlockFlowing.java deleted file mode 100644 index cdce3ff1..00000000 --- a/src/main/java/net/minecraft/server/BlockFlowing.java +++ /dev/null @@ -1,299 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.block.BlockFace; -import org.bukkit.event.block.BlockFromToEvent; -// CraftBukkit end - -public class BlockFlowing extends BlockFluids { - - int a; - boolean[] b = new boolean[4]; - int[] M = new int[4]; - - protected BlockFlowing(Material material) { - super(material); - } - - private void n(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - world.setTypeAndData(i, j, k, Block.getById(Block.getId(this) + 1), l, 2); - } - - public void a(World world, int i, int j, int k, Random random) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - org.bukkit.Server server = world.getServer(); - org.bukkit.block.Block source = bworld == null ? null : bworld.getBlockAt(i, j, k); - // CraftBukkit end - - int l = this.e(world, i, j, k); - byte b0 = 1; - - if (this.material == Material.LAVA && !world.worldProvider.f) { - b0 = 2; - } - - boolean flag = true; - int i1 = this.a(world); - int j1; - - if (l > 0) { - byte b1 = -100; - - this.a = 0; - int k1 = this.a(world, i - 1, j, k, b1); - - k1 = this.a(world, i + 1, j, k, k1); - k1 = this.a(world, i, j, k - 1, k1); - k1 = this.a(world, i, j, k + 1, k1); - j1 = k1 + b0; - if (j1 >= 8 || k1 < 0) { - j1 = -1; - } - - if (this.e(world, i, j + 1, k) >= 0) { - int l1 = this.e(world, i, j + 1, k); - - if (l1 >= 8) { - j1 = l1; - } else { - j1 = l1 + 8; - } - } - - if (this.a >= 2 && this.material == Material.WATER) { - if (world.getType(i, j - 1, k).getMaterial().isBuildable()) { - j1 = 0; - } else if (world.getType(i, j - 1, k).getMaterial() == this.material && world.getData(i, j - 1, k) == 0) { - j1 = 0; - } - } - - if (this.material == Material.LAVA && l < 8 && j1 < 8 && j1 > l && random.nextInt(4) != 0) { - i1 *= 4; - } - - if (j1 == l) { - if (flag) { - this.n(world, i, j, k); - } - } else { - l = j1; - if (j1 < 0) { - world.setAir(i, j, k); - } else { - world.setData(i, j, k, j1, 2); - world.a(i, j, k, this, i1); - world.applyPhysics(i, j, k, this); - } - } - } else { - this.n(world, i, j, k); - } - - if (this.q(world, i, j - 1, k)) { - // CraftBukkit start - Send "down" to the server - BlockFromToEvent event = new BlockFromToEvent(source, BlockFace.DOWN); - if (server != null) { - server.getPluginManager().callEvent(event); - } - - if (!event.isCancelled()) { - if (this.material == Material.LAVA && world.getType(i, j - 1, k).getMaterial() == Material.WATER) { - world.setTypeUpdate(i, j - 1, k, Blocks.STONE); - this.fizz(world, i, j - 1, k); - return; - } - - if (l >= 8) { - this.flow(world, i, j - 1, k, l); - } else { - this.flow(world, i, j - 1, k, l + 8); - } - } - // CraftBukkit end - } else if (l >= 0 && (l == 0 || this.p(world, i, j - 1, k))) { - boolean[] aboolean = this.o(world, i, j, k); - - j1 = l + b0; - if (l >= 8) { - j1 = 1; - } - - if (j1 >= 8) { - return; - } - - // CraftBukkit start - All four cardinal directions. Do not change the order! - BlockFace[] faces = new BlockFace[] { BlockFace.WEST, BlockFace.EAST, BlockFace.NORTH, BlockFace.SOUTH }; - int index = 0; - - for (BlockFace currentFace : faces) { - if (aboolean[index]) { - BlockFromToEvent event = new BlockFromToEvent(source, currentFace); - - if (server != null) { - server.getPluginManager().callEvent(event); - } - - if (!event.isCancelled()) { - this.flow(world, i + currentFace.getModX(), j, k + currentFace.getModZ(), j1); - } - } - index++; - } - // CraftBukkit end - } - } - - private void flow(World world, int i, int j, int k, int l) { - if (this.q(world, i, j, k)) { - Block block = world.getType(i, j, k); - - if (this.material == Material.LAVA) { - this.fizz(world, i, j, k); - } else { - block.b(world, i, j, k, world.getData(i, j, k), 0); - } - - world.setTypeAndData(i, j, k, this, l, 3); - } - } - - private int c(World world, int i, int j, int k, int l, int i1) { - int j1 = 1000; - - for (int k1 = 0; k1 < 4; ++k1) { - if ((k1 != 0 || i1 != 1) && (k1 != 1 || i1 != 0) && (k1 != 2 || i1 != 3) && (k1 != 3 || i1 != 2)) { - int l1 = i; - int i2 = k; - - if (k1 == 0) { - l1 = i - 1; - } - - if (k1 == 1) { - ++l1; - } - - if (k1 == 2) { - i2 = k - 1; - } - - if (k1 == 3) { - ++i2; - } - - if (!this.p(world, l1, j, i2) && (world.getType(l1, j, i2).getMaterial() != this.material || world.getData(l1, j, i2) != 0)) { - if (!this.p(world, l1, j - 1, i2)) { - return l; - } - - if (l < 4) { - int j2 = this.c(world, l1, j, i2, l + 1, k1); - - if (j2 < j1) { - j1 = j2; - } - } - } - } - } - - return j1; - } - - private boolean[] o(World world, int i, int j, int k) { - int l; - int i1; - - for (l = 0; l < 4; ++l) { - this.M[l] = 1000; - i1 = i; - int j1 = k; - - if (l == 0) { - i1 = i - 1; - } - - if (l == 1) { - ++i1; - } - - if (l == 2) { - j1 = k - 1; - } - - if (l == 3) { - ++j1; - } - - if (!this.p(world, i1, j, j1) && (world.getType(i1, j, j1).getMaterial() != this.material || world.getData(i1, j, j1) != 0)) { - if (this.p(world, i1, j - 1, j1)) { - this.M[l] = this.c(world, i1, j, j1, 1, l); - } else { - this.M[l] = 0; - } - } - } - - l = this.M[0]; - - for (i1 = 1; i1 < 4; ++i1) { - if (this.M[i1] < l) { - l = this.M[i1]; - } - } - - for (i1 = 0; i1 < 4; ++i1) { - this.b[i1] = this.M[i1] == l; - } - - return this.b; - } - - private boolean p(World world, int i, int j, int k) { - Block block = world.getType(i, j, k); - - return block != Blocks.WOODEN_DOOR && block != Blocks.IRON_DOOR_BLOCK && block != Blocks.SIGN_POST && block != Blocks.LADDER && block != Blocks.SUGAR_CANE_BLOCK ? (block.material == Material.PORTAL ? true : block.material.isSolid()) : true; - } - - protected int a(World world, int i, int j, int k, int l) { - int i1 = this.e(world, i, j, k); - - if (i1 < 0) { - return l; - } else { - if (i1 == 0) { - ++this.a; - } - - if (i1 >= 8) { - i1 = 0; - } - - return l >= 0 && i1 >= l ? l : i1; - } - } - - private boolean q(World world, int i, int j, int k) { - Material material = world.getType(i, j, k).getMaterial(); - - return material == this.material ? false : (material == Material.LAVA ? false : !this.p(world, i, j, k)); - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - if (world.getType(i, j, k) == this) { - world.a(i, j, k, this, this.a(world)); - } - } - - public boolean L() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/BlockGrass.java b/src/main/java/net/minecraft/server/BlockGrass.java deleted file mode 100644 index abd991b4..00000000 --- a/src/main/java/net/minecraft/server/BlockGrass.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.event.block.BlockSpreadEvent; -import org.bukkit.event.block.BlockFadeEvent; -// CraftBukkit end - -public class BlockGrass extends Block implements IBlockFragilePlantElement { - - private static final Logger a = LogManager.getLogger(); - - protected BlockGrass() { - super(Material.GRASS); - this.a(true); - this.a(CreativeModeTab.b); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - if (world.getLightLevel(i, j + 1, k) < 4 && world.getType(i, j + 1, k).k() > 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i, j, k).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); - - BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } else if (world.getLightLevel(i, j + 1, k) >= 9) { - for (int l = 0; l < 4; ++l) { - int i1 = i + random.nextInt(3) - 1; - int j1 = j + random.nextInt(5) - 3; - int k1 = k + random.nextInt(3) - 1; - Block block = world.getType(i1, j1 + 1, k1); - - if (world.getType(i1, j1, k1) == Blocks.DIRT && world.getData(i1, j1, k1) == 0 && world.getLightLevel(i1, j1 + 1, k1) >= 4 && block.k() <= 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.GRASS)); - - BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return Blocks.DIRT.getDropType(0, random, j); - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return true; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - int l = 0; - - while (l < 128) { - int i1 = i; - int j1 = j + 1; - int k1 = k; - int l1 = 0; - - while (true) { - if (l1 < l / 16) { - i1 += random.nextInt(3) - 1; - j1 += (random.nextInt(3) - 1) * random.nextInt(3) / 2; - k1 += random.nextInt(3) - 1; - if (world.getType(i1, j1 - 1, k1) == Blocks.GRASS && !world.getType(i1, j1, k1).r()) { - ++l1; - continue; - } - } else if (world.getType(i1, j1, k1).material == Material.AIR) { - if (random.nextInt(8) != 0) { - if (Blocks.LONG_GRASS.j(world, i1, j1, k1)) { - CraftEventFactory.handleBlockGrowEvent(world, i1, j1, k1, Blocks.LONG_GRASS, 1); // CraftBukkit - } - } else { - String s = world.getBiome(i1, k1).a(random, i1, j1, k1); - - a.debug("Flower in " + world.getBiome(i1, k1).af + ": " + s); - BlockFlowers blockflowers = BlockFlowers.e(s); - - if (blockflowers != null && blockflowers.j(world, i1, j1, k1)) { - int i2 = BlockFlowers.f(s); - - CraftEventFactory.handleBlockGrowEvent(world, i1, j1, k1, blockflowers, i2); // CraftBukkit - } - } - } - - ++l; - break; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockHopper.java b/src/main/java/net/minecraft/server/BlockHopper.java deleted file mode 100644 index b85b72f3..00000000 --- a/src/main/java/net/minecraft/server/BlockHopper.java +++ /dev/null @@ -1,166 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -public class BlockHopper extends BlockContainer { - - private final Random a = new Random(); - - public BlockHopper() { - super(Material.ORE); - this.a(CreativeModeTab.d); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.625F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - float f = 0.125F; - - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = Facing.OPPOSITE_FACING[l]; - - if (j1 == 1) { - j1 = 0; - } - - return j1; - } - - public TileEntity a(World world, int i) { - return new TileEntityHopper(); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - super.postPlace(world, i, j, k, entityliving, itemstack); - if (itemstack.hasName()) { - TileEntityHopper tileentityhopper = e((IBlockAccess) world, i, j, k); - - tileentityhopper.a(itemstack.getName()); - } - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - this.e(world, i, j, k); - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - TileEntityHopper tileentityhopper = e((IBlockAccess) world, i, j, k); - - if (tileentityhopper != null) { - entityhuman.openHopper(tileentityhopper); - } - - return true; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - this.e(world, i, j, k); - } - - private void e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = b(l); - boolean flag = !world.isBlockIndirectlyPowered(i, j, k); - boolean flag1 = c(l); - - if (flag != flag1) { - world.setData(i, j, k, i1 | (flag ? 0 : 8), 4); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - TileEntityHopper tileentityhopper = (TileEntityHopper) world.getTileEntity(i, j, k); - - if (tileentityhopper != null) { - for (int i1 = 0; i1 < tileentityhopper.getSize(); ++i1) { - ItemStack itemstack = tileentityhopper.getItem(i1); - - if (itemstack != null) { - float f = this.a.nextFloat() * 0.8F + 0.1F; - float f1 = this.a.nextFloat() * 0.8F + 0.1F; - float f2 = this.a.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j1 = this.a.nextInt(21) + 10; - - if (j1 > itemstack.count) { - j1 = itemstack.count; - } - - itemstack.count -= j1; - EntityItem entityitem = new EntityItem(world, (double) ((float) i + f), (double) ((float) j + f1), (double) ((float) k + f2), new ItemStack(itemstack.getItem(), j1, itemstack.getData())); - - if (itemstack.hasTag()) { - entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); - } - - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.a.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.a.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.a.nextGaussian() * f3); - world.addEntity(entityitem); - } - } - } - - world.updateAdjacentComparators(i, j, k, block); - } - - super.remove(world, i, j, k, block, l); - } - - public int b() { - return 38; - } - - public boolean d() { - return false; - } - - public boolean c() { - return false; - } - - public static int b(int i) { - return Math.min(i & 7, 5); // CraftBukkit - Fix AIOOBE in callers - } - - public static boolean c(int i) { - return (i & 8) != 8; - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - return Container.b((IInventory) e((IBlockAccess) world, i, j, k)); - } - - public static TileEntityHopper e(IBlockAccess iblockaccess, int i, int j, int k) { - return (TileEntityHopper) iblockaccess.getTileEntity(i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockIce.java b/src/main/java/net/minecraft/server/BlockIce.java deleted file mode 100644 index 25cb3271..00000000 --- a/src/main/java/net/minecraft/server/BlockIce.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockIce extends BlockHalfTransparent { - - public BlockIce() { - super("ice", Material.ICE, false); - this.frictionFactor = 0.98F; - this.a(true); - this.a(CreativeModeTab.b); - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - entityhuman.applyExhaustion(0.025F); - if (this.E() && EnchantmentManager.hasSilkTouchEnchantment(entityhuman)) { - ItemStack itemstack = this.j(l); - - if (itemstack != null) { - this.a(world, i, j, k, itemstack); - } - } else { - if (world.worldProvider.f) { - world.setAir(i, j, k); - return; - } - - int i1 = EnchantmentManager.getBonusBlockLootEnchantmentLevel(entityhuman); - - this.b(world, i, j, k, l, i1); - Material material = world.getType(i, j - 1, k).getMaterial(); - - if (material.isSolid() || material.isLiquid()) { - world.setTypeUpdate(i, j, k, Blocks.WATER); - } - } - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.b(EnumSkyBlock.BLOCK, i, j, k) > 11 - this.k()) { - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(i, j, k), world.worldProvider.f ? Blocks.AIR : Blocks.STATIONARY_WATER).isCancelled()) { - return; - } - // CraftBukkit end - - if (world.worldProvider.f) { - world.setAir(i, j, k); - return; - } - - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setTypeUpdate(i, j, k, Blocks.STATIONARY_WATER); - } - } - - public int h() { - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockLeaves.java b/src/main/java/net/minecraft/server/BlockLeaves.java deleted file mode 100644 index d6afe5b0..00000000 --- a/src/main/java/net/minecraft/server/BlockLeaves.java +++ /dev/null @@ -1,203 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.LeavesDecayEvent; // CraftBukkit - -public abstract class BlockLeaves extends BlockTransparent { - - int[] a; - protected IIcon[][] M = new IIcon[2][]; - - public BlockLeaves() { - super(Material.LEAVES, false); - this.a(true); - this.a(CreativeModeTab.c); - this.c(0.2F); - this.g(1); - this.a(h); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - byte b0 = 1; - int i1 = b0 + 1; - - if (world.b(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1)) { - for (int j1 = -b0; j1 <= b0; ++j1) { - for (int k1 = -b0; k1 <= b0; ++k1) { - for (int l1 = -b0; l1 <= b0; ++l1) { - if (world.getType(i + j1, j + k1, k + l1).getMaterial() == Material.LEAVES) { - int i2 = world.getData(i + j1, j + k1, k + l1); - - world.setData(i + j1, j + k1, k + l1, i2 | 8, 4); - } - } - } - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) != 0 && (l & 4) == 0) { - byte b0 = 4; - int i1 = b0 + 1; - byte b1 = 32; - int j1 = b1 * b1; - int k1 = b1 / 2; - - if (this.a == null) { - this.a = new int[b1 * b1 * b1]; - } - - int l1; - - if (world.b(i - i1, j - i1, k - i1, i + i1, j + i1, k + i1)) { - int i2; - int j2; - - for (l1 = -b0; l1 <= b0; ++l1) { - for (i2 = -b0; i2 <= b0; ++i2) { - for (j2 = -b0; j2 <= b0; ++j2) { - Block block = world.getType(i + l1, j + i2, k + j2); - - if (block != Blocks.LOG && block != Blocks.LOG2) { - if (block.getMaterial() == Material.LEAVES) { - this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = -2; - } else { - this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = -1; - } - } else { - this.a[(l1 + k1) * j1 + (i2 + k1) * b1 + j2 + k1] = 0; - } - } - } - } - - for (l1 = 1; l1 <= 4; ++l1) { - for (i2 = -b0; i2 <= b0; ++i2) { - for (j2 = -b0; j2 <= b0; ++j2) { - for (int k2 = -b0; k2 <= b0; ++k2) { - if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1] == l1 - 1) { - if (this.a[(i2 + k1 - 1) * j1 + (j2 + k1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1 - 1) * j1 + (j2 + k1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1 + 1) * j1 + (j2 + k1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1 + 1) * j1 + (j2 + k1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1 - 1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1 - 1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1 + 1) * b1 + k2 + k1] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1 + 1) * b1 + k2 + k1] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + (k2 + k1 - 1)] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + (k2 + k1 - 1)] = l1; - } - - if (this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1 + 1] == -2) { - this.a[(i2 + k1) * j1 + (j2 + k1) * b1 + k2 + k1 + 1] = l1; - } - } - } - } - } - } - } - - l1 = this.a[k1 * j1 + k1 * b1 + k1]; - if (l1 >= 0) { - world.setData(i, j, k, l & -9, 4); - } else { - this.e(world, i, j, k); - } - } - } - } - - private void e(World world, int i, int j, int k) { - // CraftBukkit start - LeavesDecayEvent event = new LeavesDecayEvent(world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - - public int a(Random random) { - return random.nextInt(20) == 0 ? 1 : 0; - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(Blocks.SAPLING); - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - int j1 = this.b(l); - - if (i1 > 0) { - j1 -= 2 << i1; - if (j1 < 10) { - j1 = 10; - } - } - - if (world.random.nextInt(j1) == 0) { - Item item = this.getDropType(l, world.random, i1); - - this.a(world, i, j, k, new ItemStack(item, 1, this.getDropData(l))); - } - - j1 = 200; - if (i1 > 0) { - j1 -= 10 << i1; - if (j1 < 40) { - j1 = 40; - } - } - - this.c(world, i, j, k, l, j1); - } - } - - protected void c(World world, int i, int j, int k, int l, int i1) {} - - protected int b(int i) { - return 20; - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (!world.isStatic && entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - this.a(world, i, j, k, new ItemStack(Item.getItemOf(this), 1, l & 3)); - } else { - super.a(world, entityhuman, i, j, k, l); - } - } - - public int getDropData(int i) { - return i & 3; - } - - public boolean c() { - return !this.P; - } - - protected ItemStack j(int i) { - return new ItemStack(Item.getItemOf(this), 1, i & 3); - } - - public abstract String[] e(); -} diff --git a/src/main/java/net/minecraft/server/BlockLever.java b/src/main/java/net/minecraft/server/BlockLever.java deleted file mode 100644 index e00cea3d..00000000 --- a/src/main/java/net/minecraft/server/BlockLever.java +++ /dev/null @@ -1,278 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockLever extends Block { - - protected BlockLever() { - super(Material.ORIENTABLE); - this.a(CreativeModeTab.d); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 12; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return l == 0 && world.getType(i, j + 1, k).r() ? true : (l == 1 && World.a((IBlockAccess) world, i, j - 1, k) ? true : (l == 2 && world.getType(i, j, k + 1).r() ? true : (l == 3 && world.getType(i, j, k - 1).r() ? true : (l == 4 && world.getType(i + 1, j, k).r() ? true : l == 5 && world.getType(i - 1, j, k).r())))); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? true : (world.getType(i + 1, j, k).r() ? true : (world.getType(i, j, k - 1).r() ? true : (world.getType(i, j, k + 1).r() ? true : (World.a((IBlockAccess) world, i, j - 1, k) ? true : world.getType(i, j + 1, k).r())))); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = i1 & 8; - int k1 = i1 & 7; - byte b0 = -1; - - if (l == 0 && world.getType(i, j + 1, k).r()) { - b0 = 0; - } - - if (l == 1 && World.a((IBlockAccess) world, i, j - 1, k)) { - b0 = 5; - } - - if (l == 2 && world.getType(i, j, k + 1).r()) { - b0 = 4; - } - - if (l == 3 && world.getType(i, j, k - 1).r()) { - b0 = 3; - } - - if (l == 4 && world.getType(i + 1, j, k).r()) { - b0 = 2; - } - - if (l == 5 && world.getType(i - 1, j, k).r()) { - b0 = 1; - } - - return b0 + j1; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = world.getData(i, j, k); - int i1 = l & 7; - int j1 = l & 8; - - if (i1 == b(1)) { - if ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 1) == 0) { - world.setData(i, j, k, 5 | j1, 2); - } else { - world.setData(i, j, k, 6 | j1, 2); - } - } else if (i1 == b(0)) { - if ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 1) == 0) { - world.setData(i, j, k, 7 | j1, 2); - } else { - world.setData(i, j, k, 0 | j1, 2); - } - } - } - - public static int b(int i) { - switch (i) { - case 0: - return 0; - - case 1: - return 5; - - case 2: - return 4; - - case 3: - return 3; - - case 4: - return 2; - - case 5: - return 1; - - default: - return -1; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (this.e(world, i, j, k)) { - int l = world.getData(i, j, k) & 7; - boolean flag = false; - - if (!world.getType(i - 1, j, k).r() && l == 1) { - flag = true; - } - - if (!world.getType(i + 1, j, k).r() && l == 2) { - flag = true; - } - - if (!world.getType(i, j, k - 1).r() && l == 3) { - flag = true; - } - - if (!world.getType(i, j, k + 1).r() && l == 4) { - flag = true; - } - - if (!World.a((IBlockAccess) world, i, j - 1, k) && l == 5) { - flag = true; - } - - if (!World.a((IBlockAccess) world, i, j - 1, k) && l == 6) { - flag = true; - } - - if (!world.getType(i, j + 1, k).r() && l == 0) { - flag = true; - } - - if (!world.getType(i, j + 1, k).r() && l == 7) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - } - - private boolean e(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k) & 7; - float f = 0.1875F; - - if (l == 1) { - this.a(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f); - } else if (l == 2) { - this.a(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f); - } else if (l == 3) { - this.a(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F); - } else if (l == 4) { - this.a(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F); - } else if (l != 5 && l != 6) { - if (l == 0 || l == 7) { - f = 0.25F; - this.a(0.5F - f, 0.4F, 0.5F - f, 0.5F + f, 1.0F, 0.5F + f); - } - } else { - f = 0.25F; - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.6F, 0.5F + f); - } - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - int i1 = world.getData(i, j, k); - int j1 = i1 & 7; - int k1 = 8 - (i1 & 8); - - // CraftBukkit start - Interact Lever - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int old = (k1 != 8) ? 15 : 0; - int current = (k1 == 8) ? 15 : 0; - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if ((eventRedstone.getNewCurrent() > 0) != (k1 == 8)) { - return true; - } - // CraftBukkit end - - world.setData(i, j, k, j1 + k1, 3); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "random.click", 0.3F, k1 > 0 ? 0.6F : 0.5F); - world.applyPhysics(i, j, k, this); - if (j1 == 1) { - world.applyPhysics(i - 1, j, k, this); - } else if (j1 == 2) { - world.applyPhysics(i + 1, j, k, this); - } else if (j1 == 3) { - world.applyPhysics(i, j, k - 1, this); - } else if (j1 == 4) { - world.applyPhysics(i, j, k + 1, this); - } else if (j1 != 5 && j1 != 6) { - if (j1 == 0 || j1 == 7) { - world.applyPhysics(i, j + 1, k, this); - } - } else { - world.applyPhysics(i, j - 1, k, this); - } - - return true; - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if ((l & 8) > 0) { - world.applyPhysics(i, j, k, this); - int i1 = l & 7; - - if (i1 == 1) { - world.applyPhysics(i - 1, j, k, this); - } else if (i1 == 2) { - world.applyPhysics(i + 1, j, k, this); - } else if (i1 == 3) { - world.applyPhysics(i, j, k - 1, this); - } else if (i1 == 4) { - world.applyPhysics(i, j, k + 1, this); - } else if (i1 != 5 && i1 != 6) { - if (i1 == 0 || i1 == 7) { - world.applyPhysics(i, j + 1, k, this); - } - } else { - world.applyPhysics(i, j - 1, k, this); - } - } - - super.remove(world, i, j, k, block, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) > 0 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if ((i1 & 8) == 0) { - return 0; - } else { - int j1 = i1 & 7; - - return j1 == 0 && l == 0 ? 15 : (j1 == 7 && l == 0 ? 15 : (j1 == 6 && l == 1 ? 15 : (j1 == 5 && l == 1 ? 15 : (j1 == 4 && l == 2 ? 15 : (j1 == 3 && l == 3 ? 15 : (j1 == 2 && l == 4 ? 15 : (j1 == 1 && l == 5 ? 15 : 0))))))); - } - } - - public boolean isPowerSource() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/BlockMinecartDetector.java b/src/main/java/net/minecraft/server/BlockMinecartDetector.java deleted file mode 100644 index 207da243..00000000 --- a/src/main/java/net/minecraft/server/BlockMinecartDetector.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockMinecartDetector extends BlockMinecartTrackAbstract { - - public BlockMinecartDetector() { - super(true); - this.a(true); - } - - public int a(World world) { - return 20; - } - - public boolean isPowerSource() { - return true; - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) == 0) { - this.a(world, i, j, k, l); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - - if ((l & 8) != 0) { - this.a(world, i, j, k, l); - } - } - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) != 0 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) == 0 ? 0 : (l == 1 ? 15 : 0); - } - - private void a(World world, int i, int j, int k, int l) { - boolean flag = (l & 8) != 0; - boolean flag1 = false; - float f = 0.125F; - List list = world.a(EntityMinecartAbstract.class, AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f))); - - if (!list.isEmpty()) { - flag1 = true; - } - - // CraftBukkit start - if (flag != flag1) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, flag ? 15 : 0, flag1 ? 15 : 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - flag1 = eventRedstone.getNewCurrent() > 0; - } - // CraftBukkit end - - if (flag1 && !flag) { - world.setData(i, j, k, l | 8, 3); - world.applyPhysics(i, j, k, this); - world.applyPhysics(i, j - 1, k, this); - world.c(i, j, k, i, j, k); - } - - if (!flag1 && flag) { - world.setData(i, j, k, l & 7, 3); - world.applyPhysics(i, j, k, this); - world.applyPhysics(i, j - 1, k, this); - world.c(i, j, k, i, j, k); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - - world.updateAdjacentComparators(i, j, k, this); - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - this.a(world, i, j, k, world.getData(i, j, k)); - } - - public boolean isComplexRedstone() { - return true; - } - - public int g(World world, int i, int j, int k, int l) { - if ((world.getData(i, j, k) & 8) > 0) { - float f = 0.125F; - List list = world.a(EntityMinecartCommandBlock.class, AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f))); - - if (list.size() > 0) { - return ((EntityMinecartCommandBlock) list.get(0)).getCommandBlock().g(); - } - - List list1 = world.a(EntityMinecartAbstract.class, AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) ((float) (j + 1) - f), (double) ((float) (k + 1) - f)), IEntitySelector.c); - - if (list1.size() > 0) { - return Container.b((IInventory) list1.get(0)); - } - } - - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockMobSpawner.java b/src/main/java/net/minecraft/server/BlockMobSpawner.java deleted file mode 100644 index c32db8f6..00000000 --- a/src/main/java/net/minecraft/server/BlockMobSpawner.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockMobSpawner extends BlockContainer { - - protected BlockMobSpawner() { - super(Material.STONE); - } - - public TileEntity a(World world, int i) { - return new TileEntityMobSpawner(); - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 0; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - /* CraftBukkit start - Delegate to getExpDrop - int j1 = 15 + world.random.nextInt(15) + world.random.nextInt(15); - - this.dropExperience(world, i, j, k, j1)*/ - } - - public int getExpDrop(World world, int data, int enchantmentLevel) { - int j1 = 15 + world.random.nextInt(15) + world.random.nextInt(15); - - return j1; - // CraftBukkit end - } - - public boolean c() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/BlockMonsterEggs.java b/src/main/java/net/minecraft/server/BlockMonsterEggs.java deleted file mode 100644 index d9f87415..00000000 --- a/src/main/java/net/minecraft/server/BlockMonsterEggs.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import net.minecraft.util.org.apache.commons.lang3.tuple.ImmutablePair; - -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; // CraftBukkit - -public class BlockMonsterEggs extends Block { - - public static final String[] a = new String[] { "stone", "cobble", "brick", "mossybrick", "crackedbrick", "chiseledbrick"}; - - public BlockMonsterEggs() { - super(Material.CLAY); - this.c(0.0F); - this.a(CreativeModeTab.c); - } - - public void postBreak(World world, int i, int j, int k, int l) { - if (!world.isStatic) { - EntitySilverfish entitysilverfish = new EntitySilverfish(world); - - entitysilverfish.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, 0.0F, 0.0F); - world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason - entitysilverfish.s(); - } - - super.postBreak(world, i, j, k, l); - } - - public int a(Random random) { - return 0; - } - - public static boolean a(Block block) { - return block == Blocks.STONE || block == Blocks.COBBLESTONE || block == Blocks.SMOOTH_BRICK; - } - - public static int a(Block block, int i) { - if (i == 0) { - if (block == Blocks.COBBLESTONE) { - return 1; - } - - if (block == Blocks.SMOOTH_BRICK) { - return 2; - } - } else if (block == Blocks.SMOOTH_BRICK) { - switch (i) { - case 1: - return 3; - - case 2: - return 4; - - case 3: - return 5; - } - } - - return 0; - } - - public static ImmutablePair b(int i) { - switch (i) { - case 1: - return new ImmutablePair(Blocks.COBBLESTONE, Integer.valueOf(0)); - - case 2: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(0)); - - case 3: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(1)); - - case 4: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(2)); - - case 5: - return new ImmutablePair(Blocks.SMOOTH_BRICK, Integer.valueOf(3)); - - default: - return new ImmutablePair(Blocks.STONE, Integer.valueOf(0)); - } - } - - protected ItemStack j(int i) { - switch (i) { - case 1: - return new ItemStack(Blocks.COBBLESTONE); - - case 2: - return new ItemStack(Blocks.SMOOTH_BRICK); - - case 3: - return new ItemStack(Blocks.SMOOTH_BRICK, 1, 1); - - case 4: - return new ItemStack(Blocks.SMOOTH_BRICK, 1, 2); - - case 5: - return new ItemStack(Blocks.SMOOTH_BRICK, 1, 3); - - default: - return new ItemStack(Blocks.STONE); - } - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - EntitySilverfish entitysilverfish = new EntitySilverfish(world); - - entitysilverfish.setPositionRotation((double) i + 0.5D, (double) j, (double) k + 0.5D, 0.0F, 0.0F); - world.addEntity(entitysilverfish, SpawnReason.SILVERFISH_BLOCK); // CraftBukkit - add SpawnReason - entitysilverfish.s(); - } - } - - public int getDropData(World world, int i, int j, int k) { - return world.getData(i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockMushroom.java b/src/main/java/net/minecraft/server/BlockMushroom.java deleted file mode 100644 index 6671a84b..00000000 --- a/src/main/java/net/minecraft/server/BlockMushroom.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.TreeType; -import org.bukkit.block.BlockState; -import org.bukkit.event.block.BlockSpreadEvent; -// CraftBukkit end - -public class BlockMushroom extends BlockPlant implements IBlockFragilePlantElement { - - protected BlockMushroom() { - float f = 0.2F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - final int sourceX = i, sourceY = j, sourceZ = k; // CraftBukkit - if (random.nextInt(25) == 0) { - byte b0 = 4; - int l = 5; - - int i1; - int j1; - int k1; - - for (i1 = i - b0; i1 <= i + b0; ++i1) { - for (j1 = k - b0; j1 <= k + b0; ++j1) { - for (k1 = j - 1; k1 <= j + 1; ++k1) { - if (world.getType(i1, k1, j1) == this) { - --l; - if (l <= 0) { - return; - } - } - } - } - } - - i1 = i + random.nextInt(3) - 1; - j1 = j + random.nextInt(2) - random.nextInt(2); - k1 = k + random.nextInt(3) - 1; - - for (int l1 = 0; l1 < 4; ++l1) { - if (world.isEmpty(i1, j1, k1) && this.j(world, i1, j1, k1)) { - i = i1; - j = j1; - k = k1; - } - - i1 = i + random.nextInt(3) - 1; - j1 = j + random.nextInt(2) - random.nextInt(2); - k1 = k + random.nextInt(3) - 1; - } - - if (world.isEmpty(i1, j1, k1) && this.j(world, i1, j1, k1)) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState(); - blockState.setType(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(this)); // nms: this.id, 0, 2 - - BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(sourceX, sourceY, sourceZ), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - return super.canPlace(world, i, j, k) && this.j(world, i, j, k); - } - - protected boolean a(Block block) { - return block.j(); - } - - public boolean j(World world, int i, int j, int k) { - if (j >= 0 && j < 256) { - Block block = world.getType(i, j - 1, k); - - return block == Blocks.MYCEL || block == Blocks.DIRT && world.getData(i, j - 1, k) == 2 || world.j(i, j, k) < 13 && this.a(block); - } else { - return false; - } - } - - public boolean grow(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - world.setAir(i, j, k); - WorldGenHugeMushroom worldgenhugemushroom = null; - - if (this == Blocks.BROWN_MUSHROOM) { - BlockSapling.treeType = TreeType.BROWN_MUSHROOM; // CraftBukkit - worldgenhugemushroom = new WorldGenHugeMushroom(0); - } else if (this == Blocks.RED_MUSHROOM) { - BlockSapling.treeType = TreeType.RED_MUSHROOM; // CraftBukkit - worldgenhugemushroom = new WorldGenHugeMushroom(1); - } - - if (worldgenhugemushroom != null && worldgenhugemushroom.generate(world, random, i, j, k)) { - return true; - } else { - world.setTypeAndData(i, j, k, this, l, 3); - return false; - } - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return true; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return (double) random.nextFloat() < 0.4D; - } - - public void b(World world, Random random, int i, int j, int k) { - this.grow(world, i, j, k, random); - } -} diff --git a/src/main/java/net/minecraft/server/BlockMycel.java b/src/main/java/net/minecraft/server/BlockMycel.java deleted file mode 100644 index a01a6e62..00000000 --- a/src/main/java/net/minecraft/server/BlockMycel.java +++ /dev/null @@ -1,64 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.event.block.BlockFadeEvent; -import org.bukkit.event.block.BlockSpreadEvent; -// CraftBukkit end - -public class BlockMycel extends Block { - - protected BlockMycel() { - super(Material.GRASS); - this.a(true); - this.a(CreativeModeTab.b); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - if (world.getLightLevel(i, j + 1, k) < 4 && world.getType(i, j + 1, k).k() > 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i, j, k).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.DIRT)); - - BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } else if (world.getLightLevel(i, j + 1, k) >= 9) { - for (int l = 0; l < 4; ++l) { - int i1 = i + random.nextInt(3) - 1; - int j1 = j + random.nextInt(5) - 3; - int k1 = k + random.nextInt(3) - 1; - Block block = world.getType(i1, j1 + 1, k1); - - if (world.getType(i1, j1, k1) == Blocks.DIRT && world.getData(i1, j1, k1) == 0 && world.getLightLevel(i1, j1 + 1, k1) >= 4 && block.k() <= 2) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - BlockState blockState = bworld.getBlockAt(i1, j1, k1).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(this)); - - BlockSpreadEvent event = new BlockSpreadEvent(blockState.getBlock(), bworld.getBlockAt(i, j, k), blockState); - world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return Blocks.DIRT.getDropType(0, random, j); - } -} diff --git a/src/main/java/net/minecraft/server/BlockNetherWart.java b/src/main/java/net/minecraft/server/BlockNetherWart.java deleted file mode 100644 index ea12b917..00000000 --- a/src/main/java/net/minecraft/server/BlockNetherWart.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockNetherWart extends BlockPlant { - - protected BlockNetherWart() { - this.a(true); - float f = 0.5F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - this.a((CreativeModeTab) null); - } - - protected boolean a(Block block) { - return block == Blocks.SOUL_SAND; - } - - public boolean j(World world, int i, int j, int k) { - return this.a(world.getType(i, j - 1, k)); - } - - public void a(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - - if (l < 3 && random.nextInt(10) == 0) { - ++l; - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - - super.a(world, i, j, k, random); - } - - public int b() { - return 6; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (!world.isStatic) { - int j1 = 1; - - if (l >= 3) { - j1 = 2 + world.random.nextInt(3); - if (i1 > 0) { - j1 += world.random.nextInt(i1 + 1); - } - } - - for (int k1 = 0; k1 < j1; ++k1) { - this.a(world, i, j, k, new ItemStack(Items.NETHER_STALK)); - } - } - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockOre.java b/src/main/java/net/minecraft/server/BlockOre.java deleted file mode 100644 index 42f44006..00000000 --- a/src/main/java/net/minecraft/server/BlockOre.java +++ /dev/null @@ -1,83 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockOre extends Block { - - public BlockOre() { - super(Material.STONE); - this.a(CreativeModeTab.b); - } - - public Item getDropType(int i, Random random, int j) { - return this == Blocks.COAL_ORE ? Items.COAL : (this == Blocks.DIAMOND_ORE ? Items.DIAMOND : (this == Blocks.LAPIS_ORE ? Items.INK_SACK : (this == Blocks.EMERALD_ORE ? Items.EMERALD : (this == Blocks.QUARTZ_ORE ? Items.QUARTZ : Item.getItemOf(this))))); - } - - public int a(Random random) { - return this == Blocks.LAPIS_ORE ? 4 + random.nextInt(5) : 1; - } - - public int getDropCount(int i, Random random) { - if (i > 0 && Item.getItemOf(this) != this.getDropType(0, random, i)) { - int j = random.nextInt(i + 2) - 1; - - if (j < 0) { - j = 0; - } - - return this.a(random) * (j + 1); - } else { - return this.a(random); - } - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - /* CraftBukkit start - Delegated to getExpDrop - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 0; - - if (this == Blocks.COAL_ORE) { - j1 = MathHelper.nextInt(world.random, 0, 2); - } else if (this == Blocks.DIAMOND_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.EMERALD_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.LAPIS_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } else if (this == Blocks.QUARTZ_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } - - this.dropExperience(world, i, j, k, j1); - } - // */ - } - - public int getExpDrop(World world, int l, int i1) { - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 0; - - if (this == Blocks.COAL_ORE) { - j1 = MathHelper.nextInt(world.random, 0, 2); - } else if (this == Blocks.DIAMOND_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.EMERALD_ORE) { - j1 = MathHelper.nextInt(world.random, 3, 7); - } else if (this == Blocks.LAPIS_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } else if (this == Blocks.QUARTZ_ORE) { - j1 = MathHelper.nextInt(world.random, 2, 5); - } - - return j1; - } - - return 0; - // CraftBukkit end - } - - public int getDropData(int i) { - return this == Blocks.LAPIS_ORE ? 4 : 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPiston.java b/src/main/java/net/minecraft/server/BlockPiston.java deleted file mode 100644 index 8d8963cc..00000000 --- a/src/main/java/net/minecraft/server/BlockPiston.java +++ /dev/null @@ -1,400 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.block.CraftBlock; -import org.bukkit.event.block.BlockPistonRetractEvent; -import org.bukkit.event.block.BlockPistonExtendEvent; -// CraftBukkit end - -public class BlockPiston extends Block { - - private final boolean a; - - public BlockPiston(boolean flag) { - super(Material.PISTON); - this.a = flag; - this.a(i); - this.c(0.5F); - this.a(CreativeModeTab.d); - } - - public int b() { - return 16; - } - - public boolean c() { - return false; - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - return false; - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = a(world, i, j, k, entityliving); - - world.setData(i, j, k, l, 2); - if (!world.isStatic) { - this.e(world, i, j, k); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - this.e(world, i, j, k); - } - } - - public void onPlace(World world, int i, int j, int k) { - if (!world.isStatic && world.getTileEntity(i, j, k) == null) { - this.e(world, i, j, k); - } - } - - private void e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = b(l); - - if (i1 != 7) { - boolean flag = this.a(world, i, j, k, i1); - - if (flag && !c(l)) { - // CraftBukkit start - int length = h(world, i, j, k, i1); - if (length >= 0) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - BlockPistonExtendEvent event = new BlockPistonExtendEvent(block, length, CraftBlock.notchToBlockFace(i1)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - world.playBlockAction(i, j, k, this, 0, i1); - } - } else if (!flag && c(l)) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, CraftBlock.notchToBlockFace(i1)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - world.setData(i, j, k, i1, 2); - world.playBlockAction(i, j, k, this, 1, i1); - } - } - } - - private boolean a(World world, int i, int j, int k, int l) { - return l != 0 && world.isBlockFacePowered(i, j - 1, k, 0) ? true : (l != 1 && world.isBlockFacePowered(i, j + 1, k, 1) ? true : (l != 2 && world.isBlockFacePowered(i, j, k - 1, 2) ? true : (l != 3 && world.isBlockFacePowered(i, j, k + 1, 3) ? true : (l != 5 && world.isBlockFacePowered(i + 1, j, k, 5) ? true : (l != 4 && world.isBlockFacePowered(i - 1, j, k, 4) ? true : (world.isBlockFacePowered(i, j, k, 0) ? true : (world.isBlockFacePowered(i, j + 2, k, 1) ? true : (world.isBlockFacePowered(i, j + 1, k - 1, 2) ? true : (world.isBlockFacePowered(i, j + 1, k + 1, 3) ? true : (world.isBlockFacePowered(i - 1, j + 1, k, 4) ? true : world.isBlockFacePowered(i + 1, j + 1, k, 5))))))))))); - } - - public boolean a(World world, int i, int j, int k, int l, int i1) { - if (!world.isStatic) { - boolean flag = this.a(world, i, j, k, i1); - - if (flag && l == 1) { - world.setData(i, j, k, i1 | 8, 2); - return false; - } - - if (!flag && l == 0) { - return false; - } - } - - if (l == 0) { - if (!this.i(world, i, j, k, i1)) { - return false; - } - - world.setData(i, j, k, i1 | 8, 2); - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "tile.piston.out", 0.5F, world.random.nextFloat() * 0.25F + 0.6F); - } else if (l == 1) { - TileEntity tileentity = world.getTileEntity(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1]); - - if (tileentity instanceof TileEntityPiston) { - ((TileEntityPiston) tileentity).f(); - } - - world.setTypeAndData(i, j, k, Blocks.PISTON_MOVING, i1, 3); - world.setTileEntity(i, j, k, BlockPistonMoving.a(this, i1, i1, false, true)); - if (this.a) { - int j1 = i + Facing.b[i1] * 2; - int k1 = j + Facing.c[i1] * 2; - int l1 = k + Facing.d[i1] * 2; - Block block = world.getType(j1, k1, l1); - int i2 = world.getData(j1, k1, l1); - boolean flag1 = false; - - if (block == Blocks.PISTON_MOVING) { - TileEntity tileentity1 = world.getTileEntity(j1, k1, l1); - - if (tileentity1 instanceof TileEntityPiston) { - TileEntityPiston tileentitypiston = (TileEntityPiston) tileentity1; - - if (tileentitypiston.c() == i1 && tileentitypiston.b()) { - tileentitypiston.f(); - block = tileentitypiston.a(); - i2 = tileentitypiston.p(); - flag1 = true; - } - } - } - - if (!flag1 && block.getMaterial() != Material.AIR && a(block, world, j1, k1, l1, false) && (block.h() == 0 || block == Blocks.PISTON || block == Blocks.PISTON_STICKY)) { - i += Facing.b[i1]; - j += Facing.c[i1]; - k += Facing.d[i1]; - world.setTypeAndData(i, j, k, Blocks.PISTON_MOVING, i2, 3); - world.setTileEntity(i, j, k, BlockPistonMoving.a(block, i2, i1, false, false)); - world.setAir(j1, k1, l1); - } else if (!flag1) { - world.setAir(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1]); - } - } else { - world.setAir(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1]); - } - - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "tile.piston.in", 0.5F, world.random.nextFloat() * 0.15F + 0.6F); - } - - return true; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - - if (c(l)) { - float f = 0.25F; - - switch (b(l)) { - case 0: - this.a(0.0F, 0.25F, 0.0F, 1.0F, 1.0F, 1.0F); - break; - - case 1: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.75F, 1.0F); - break; - - case 2: - this.a(0.0F, 0.0F, 0.25F, 1.0F, 1.0F, 1.0F); - break; - - case 3: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.75F); - break; - - case 4: - this.a(0.25F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - break; - - case 5: - this.a(0.0F, 0.0F, 0.0F, 0.75F, 1.0F, 1.0F); - } - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - - public void g() { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public boolean d() { - return false; - } - - public static int b(int i) { - if ((i & 7) >= Facing.OPPOSITE_FACING.length) return 7; // CraftBukkit - check for AIOOB on piston data - return i & 7; - } - - public static boolean c(int i) { - return (i & 8) != 0; - } - - public static int a(World world, int i, int j, int k, EntityLiving entityliving) { - if (MathHelper.abs((float) entityliving.locX - (float) i) < 2.0F && MathHelper.abs((float) entityliving.locZ - (float) k) < 2.0F) { - double d0 = entityliving.locY + 1.82D - (double) entityliving.height; - - if (d0 - (double) j > 2.0D) { - return 1; - } - - if ((double) j - d0 > 0.0D) { - return 0; - } - } - - int l = MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3; - - return l == 0 ? 2 : (l == 1 ? 5 : (l == 2 ? 3 : (l == 3 ? 4 : 0))); - } - - private static boolean a(Block block, World world, int i, int j, int k, boolean flag) { - if (block == Blocks.OBSIDIAN) { - return false; - } else { - if (block != Blocks.PISTON && block != Blocks.PISTON_STICKY) { - if (block.f(world, i, j, k) == -1.0F) { - return false; - } - - if (block.h() == 2) { - return false; - } - - if (block.h() == 1) { - if (!flag) { - return false; - } - - return true; - } - } else if (c(world.getData(i, j, k))) { - return false; - } - - return !(block instanceof IContainer); - } - } - - // CraftBukkit - boolean -> int return - private static int h(World world, int i, int j, int k, int l) { - int i1 = i + Facing.b[l]; - int j1 = j + Facing.c[l]; - int k1 = k + Facing.d[l]; - int l1 = 0; - - while (true) { - if (l1 < 13) { - if (j1 <= 0 || j1 >= 255) { - return -1; // CraftBukkit - } - - Block block = world.getType(i1, j1, k1); - - if (block.getMaterial() != Material.AIR) { - if (!a(block, world, i1, j1, k1, true)) { - return -1; // CraftBukkit - } - - if (block.h() != 1) { - if (l1 == 12) { - return -1; // CraftBukkit - } - - i1 += Facing.b[l]; - j1 += Facing.c[l]; - k1 += Facing.d[l]; - ++l1; - continue; - } - } - } - - return l1; // CraftBukkit - } - } - - private boolean i(World world, int i, int j, int k, int l) { - int i1 = i + Facing.b[l]; - int j1 = j + Facing.c[l]; - int k1 = k + Facing.d[l]; - int l1 = 0; - - while (true) { - if (l1 < 13) { - if (j1 <= 0 || j1 >= 255) { - return false; - } - - Block block = world.getType(i1, j1, k1); - - if (block.getMaterial() != Material.AIR) { - if (!a(block, world, i1, j1, k1, true)) { - return false; - } - - if (block.h() != 1) { - if (l1 == 12) { - return false; - } - - i1 += Facing.b[l]; - j1 += Facing.c[l]; - k1 += Facing.d[l]; - ++l1; - continue; - } - - block.b(world, i1, j1, k1, world.getData(i1, j1, k1), 0); - world.setAir(i1, j1, k1); - } - } - - l1 = i1; - int i2 = j1; - int j2 = k1; - int k2 = 0; - - Block[] ablock; - int l2; - int i3; - int j3; - - for (ablock = new Block[13]; i1 != i || j1 != j || k1 != k; k1 = j3) { - l2 = i1 - Facing.b[l]; - i3 = j1 - Facing.c[l]; - j3 = k1 - Facing.d[l]; - Block block1 = world.getType(l2, i3, j3); - int k3 = world.getData(l2, i3, j3); - - if (block1 == this && l2 == i && i3 == j && j3 == k) { - world.setTypeAndData(i1, j1, k1, Blocks.PISTON_MOVING, l | (this.a ? 8 : 0), 4); - world.setTileEntity(i1, j1, k1, BlockPistonMoving.a(Blocks.PISTON_EXTENSION, l | (this.a ? 8 : 0), l, true, false)); - } else { - world.setTypeAndData(i1, j1, k1, Blocks.PISTON_MOVING, k3, 4); - world.setTileEntity(i1, j1, k1, BlockPistonMoving.a(block1, k3, l, true, false)); - } - - ablock[k2++] = block1; - i1 = l2; - j1 = i3; - } - - i1 = l1; - j1 = i2; - k1 = j2; - - for (k2 = 0; i1 != i || j1 != j || k1 != k; k1 = j3) { - l2 = i1 - Facing.b[l]; - i3 = j1 - Facing.c[l]; - j3 = k1 - Facing.d[l]; - world.applyPhysics(l2, i3, j3, ablock[k2++]); - i1 = l2; - j1 = i3; - } - - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockPistonExtension.java b/src/main/java/net/minecraft/server/BlockPistonExtension.java deleted file mode 100644 index cb7455da..00000000 --- a/src/main/java/net/minecraft/server/BlockPistonExtension.java +++ /dev/null @@ -1,169 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -public class BlockPistonExtension extends Block { - - public BlockPistonExtension() { - super(Material.PISTON); - this.a(i); - this.c(0.5F); - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild) { - int i1 = b(l); - Block block = world.getType(i - Facing.b[i1], j - Facing.c[i1], k - Facing.d[i1]); - - if (block == Blocks.PISTON || block == Blocks.PISTON_STICKY) { - world.setAir(i - Facing.b[i1], j - Facing.c[i1], k - Facing.d[i1]); - } - } - - super.a(world, i, j, k, l, entityhuman); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - super.remove(world, i, j, k, block, l); - if ((l & 7) >= Facing.OPPOSITE_FACING.length) return; // CraftBukkit - fix a piston AIOOBE issue - int i1 = Facing.OPPOSITE_FACING[b(l)]; - - i += Facing.b[i1]; - j += Facing.c[i1]; - k += Facing.d[i1]; - Block block1 = world.getType(i, j, k); - - if (block1 == Blocks.PISTON || block1 == Blocks.PISTON_STICKY) { - l = world.getData(i, j, k); - if (BlockPiston.c(l)) { - block1.b(world, i, j, k, l, 0); - world.setAir(i, j, k); - } - } - } - - public int b() { - return 17; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean canPlace(World world, int i, int j, int k) { - return false; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return false; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, AxisAlignedBB axisalignedbb, List list, Entity entity) { - int l = world.getData(i, j, k); - float f = 0.25F; - float f1 = 0.375F; - float f2 = 0.625F; - float f3 = 0.25F; - float f4 = 0.75F; - - switch (b(l)) { - case 0: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.375F, 0.25F, 0.375F, 0.625F, 1.0F, 0.625F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 1: - this.a(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.375F, 0.0F, 0.375F, 0.625F, 0.75F, 0.625F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 2: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.25F, 0.375F, 0.25F, 0.75F, 0.625F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 3: - this.a(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.25F, 0.375F, 0.0F, 0.75F, 0.625F, 0.75F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 4: - this.a(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.375F, 0.25F, 0.25F, 0.625F, 0.75F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - break; - - case 5: - this.a(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - super.a(world, i, j, k, axisalignedbb, list, entity); - this.a(0.0F, 0.375F, 0.25F, 0.75F, 0.625F, 0.75F); - super.a(world, i, j, k, axisalignedbb, list, entity); - } - - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - float f = 0.25F; - - switch (b(l)) { - case 0: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.25F, 1.0F); - break; - - case 1: - this.a(0.0F, 0.75F, 0.0F, 1.0F, 1.0F, 1.0F); - break; - - case 2: - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 0.25F); - break; - - case 3: - this.a(0.0F, 0.0F, 0.75F, 1.0F, 1.0F, 1.0F); - break; - - case 4: - this.a(0.0F, 0.0F, 0.0F, 0.25F, 1.0F, 1.0F); - break; - - case 5: - this.a(0.75F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = b(world.getData(i, j, k)); - if ((l & 7) >= Facing.OPPOSITE_FACING.length) return; // CraftBukkit - fix a piston AIOOBE issue - Block block1 = world.getType(i - Facing.b[l], j - Facing.c[l], k - Facing.d[l]); - - if (block1 != Blocks.PISTON && block1 != Blocks.PISTON_STICKY) { - world.setAir(i, j, k); - } else { - block1.doPhysics(world, i - Facing.b[l], j - Facing.c[l], k - Facing.d[l], block); - } - } - - public static int b(int i) { - return MathHelper.a(i & 7, 0, Facing.b.length - 1); - } -} diff --git a/src/main/java/net/minecraft/server/BlockPortal.java b/src/main/java/net/minecraft/server/BlockPortal.java deleted file mode 100644 index bec5aa8a..00000000 --- a/src/main/java/net/minecraft/server/BlockPortal.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.entity.EntityPortalEnterEvent; // CraftBukkit - -public class BlockPortal extends BlockHalfTransparent { - - public static final int[][] a = new int[][] { new int[0], { 3, 1}, { 2, 0}}; - - public BlockPortal() { - super("portal", Material.PORTAL, false); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - super.a(world, i, j, k, random); - if (world.worldProvider.d() && world.getGameRules().getBoolean("doMobSpawning") && random.nextInt(2000) < world.difficulty.a()) { - int l; - - for (l = j; !World.a((IBlockAccess) world, i, l, k) && l > 0; --l) { - ; - } - - if (l > 0 && !world.getType(i, l + 1, k).r()) { - // CraftBukkit - set spawn reason to NETHER_PORTAL - Entity entity = ItemMonsterEgg.spawnCreature(world, 57, (double) i + 0.5D, (double) l + 1.1D, (double) k + 0.5D, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NETHER_PORTAL); - - if (entity != null) { - entity.portalCooldown = entity.ai(); - } - } - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = b(iblockaccess.getData(i, j, k)); - - if (l == 0) { - if (iblockaccess.getType(i - 1, j, k) != this && iblockaccess.getType(i + 1, j, k) != this) { - l = 2; - } else { - l = 1; - } - - if (iblockaccess instanceof World && !((World) iblockaccess).isStatic) { - ((World) iblockaccess).setData(i, j, k, l, 2); - } - } - - float f = 0.125F; - float f1 = 0.125F; - - if (l == 1) { - f = 0.5F; - } - - if (l == 2) { - f1 = 0.5F; - } - - this.a(0.5F - f, 0.0F, 0.5F - f1, 0.5F + f, 1.0F, 0.5F + f1); - } - - public boolean d() { - return false; - } - - public boolean e(World world, int i, int j, int k) { - PortalCreator portalcreator = new PortalCreator(world, i, j, k, 1); - PortalCreator portalcreator1 = new PortalCreator(world, i, j, k, 2); - - if (portalcreator.b() && PortalCreator.a(portalcreator) == 0) { - // CraftBukkit start - return portalcreator - return portalcreator.c(); - // return true; - } else if (portalcreator1.b() && PortalCreator.a(portalcreator1) == 0) { - return portalcreator1.c(); - // return true; - // CraftBukkit end - } else { - return false; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = b(world.getData(i, j, k)); - PortalCreator portalcreator = new PortalCreator(world, i, j, k, 1); - PortalCreator portalcreator1 = new PortalCreator(world, i, j, k, 2); - - if (l == 1 && (!portalcreator.b() || PortalCreator.a(portalcreator) < PortalCreator.b(portalcreator) * PortalCreator.c(portalcreator))) { - world.setTypeUpdate(i, j, k, Blocks.AIR); - } else if (l == 2 && (!portalcreator1.b() || PortalCreator.a(portalcreator1) < PortalCreator.b(portalcreator1) * PortalCreator.c(portalcreator1))) { - world.setTypeUpdate(i, j, k, Blocks.AIR); - } else if (l == 0 && !portalcreator.b() && !portalcreator1.b()) { - world.setTypeUpdate(i, j, k, Blocks.AIR); - } - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (entity.vehicle == null && entity.passenger == null) { - // CraftBukkit start - Entity in portal - EntityPortalEnterEvent event = new EntityPortalEnterEvent(entity.getBukkitEntity(), new org.bukkit.Location(world.getWorld(), i, j, k)); - world.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - - entity.ah(); - } - } - - public static int b(int i) { - return i & 3; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPoweredRail.java b/src/main/java/net/minecraft/server/BlockPoweredRail.java deleted file mode 100644 index cd209058..00000000 --- a/src/main/java/net/minecraft/server/BlockPoweredRail.java +++ /dev/null @@ -1,146 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockPoweredRail extends BlockMinecartTrackAbstract { - protected BlockPoweredRail() { - super(true); - } - - protected boolean a(World world, int i, int j, int k, int l, boolean flag, int i1) { - if (i1 >= 8) { - return false; - } else { - int j1 = l & 0x7; - boolean flag1 = true; - - switch (j1) { - case 0: - if (flag) { - ++k; - } else { - --k; - } - break; - - case 1: - if (flag) { - --i; - } else { - ++i; - } - break; - - case 2: - if (flag) { - i--; - } else { - ++i; - ++j; - flag1 = false; - } - - j1 = 1; - break; - - case 3: - if (flag) { - --i; - ++j; - flag1 = false; - } else { - ++i; - } - - j1 = 1; - break; - - case 4: - if (flag) { - ++k; - } else { - --k; - ++j; - flag1 = false; - } - - j1 = 0; - break; - - case 5: - if (flag) { - ++k; - ++j; - flag1 = false; - } else { - --k; - } - - j1 = 0; - } - - return this.a(world, i, j, k, flag, i1, j1) ? true : flag1 && this.a(world, i, j - 1, k, flag, i1, j1); - } - } - - protected boolean a(World world, int i, int j, int k, boolean flag, int l, int i1) { - Block block = world.getType(i, j, k); - - if (block == this) { - int j1 = world.getData(i, j, k); - int k1 = j1 & 0x7; - - if (i1 == 1 && (k1 == 0 || k1 == 4 || k1 == 5)) { - return false; - } - - if (i1 == 0 && (k1 == 1 || k1 == 2 || k1 == 3)) { - return false; - } - - if ((j1 & 0x8) != 0) { - if (world.isBlockIndirectlyPowered(i, j, k)) { - return true; - } - - return this.a(world, i, j, k, j1, flag, l + 1); - } - } - - return false; - } - - protected void a(World world, int i, int j, int k, int l, int i1, Block block) { - boolean flag = world.isBlockIndirectlyPowered(i, j, k); - - flag = flag || this.a(world, i, j, k, l, true, 0) || this.a(world, i, j, k, l, false, 0); - boolean flag1 = false; - - if (flag && (l & 0x8) == 0) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() <= 0) { - return; - } - // CraftBukkit end - - world.setData(i, j, k, i1 | 0x8, 3); - flag1 = true; - } else if (!flag && (l & 0x8) != 0) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 15, 0).getNewCurrent() > 0) { - return; - } - // CraftBukkit end - - world.setData(i, j, k, i1, 3); - flag1 = true; - } - - if (flag1) { - world.applyPhysics(i, j - 1, k, this); - if (i1 == 2 || i1 == 3 || i1 == 4 || i1 == 5) { - world.applyPhysics(i, j + 1, k, this); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java b/src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java deleted file mode 100644 index c2dfc861..00000000 --- a/src/main/java/net/minecraft/server/BlockPressurePlateAbstract.java +++ /dev/null @@ -1,174 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public abstract class BlockPressurePlateAbstract extends Block { - - private String a; - - protected BlockPressurePlateAbstract(String s, Material material) { - super(material); - this.a = s; - this.a(CreativeModeTab.d); - this.a(true); - this.b(this.d(15)); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(iblockaccess.getData(i, j, k)); - } - - protected void b(int i) { - boolean flag = this.c(i) > 0; - float f = 0.0625F; - - if (flag) { - this.a(f, 0.0F, f, 1.0F - f, 0.03125F, 1.0F - f); - } else { - this.a(f, 0.0F, f, 1.0F - f, 0.0625F, 1.0F - f); - } - } - - public int a(World world) { - return 20; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return true; - } - - public boolean canPlace(World world, int i, int j, int k) { - return World.a((IBlockAccess) world, i, j - 1, k) || BlockFence.a(world.getType(i, j - 1, k)); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - boolean flag = false; - - if (!World.a((IBlockAccess) world, i, j - 1, k) && !BlockFence.a(world.getType(i, j - 1, k))) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - int l = this.c(world.getData(i, j, k)); - - if (l > 0) { - this.a(world, i, j, k, l); - } - } - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - int l = this.c(world.getData(i, j, k)); - - if (l == 0) { - this.a(world, i, j, k, l); - } - } - } - - protected void a(World world, int i, int j, int k, int l) { - int i1 = this.e(world, i, j, k); - boolean flag = l > 0; - boolean flag1 = i1 > 0; - - // CraftBukkit start - Interact Pressure Plate - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - - if (flag != flag1) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bworld.getBlockAt(i, j, k), l, i1); - manager.callEvent(eventRedstone); - - flag1 = eventRedstone.getNewCurrent() > 0; - i1 = eventRedstone.getNewCurrent(); - } - // CraftBukkit end - - if (l != i1) { - world.setData(i, j, k, this.d(i1), 2); - this.a_(world, i, j, k); - world.c(i, j, k, i, j, k); - } - - if (!flag1 && flag) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.3F, 0.5F); - } else if (flag1 && !flag) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.3F, 0.6F); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - } - - protected AxisAlignedBB a(int i, int j, int k) { - float f = 0.125F; - - return AxisAlignedBB.a((double) ((float) i + f), (double) j, (double) ((float) k + f), (double) ((float) (i + 1) - f), (double) j + 0.25D, (double) ((float) (k + 1) - f)); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if (this.c(l) > 0) { - this.a_(world, i, j, k); - } - - super.remove(world, i, j, k, block, l); - } - - protected void a_(World world, int i, int j, int k) { - world.applyPhysics(i, j, k, this); - world.applyPhysics(i, j - 1, k, this); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return this.c(iblockaccess.getData(i, j, k)); - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return l == 1 ? this.c(iblockaccess.getData(i, j, k)) : 0; - } - - public boolean isPowerSource() { - return true; - } - - public void g() { - float f = 0.5F; - float f1 = 0.125F; - float f2 = 0.5F; - - this.a(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2); - } - - public int h() { - return 1; - } - - protected abstract int e(World world, int i, int j, int k); - - protected abstract int c(int i); - - protected abstract int d(int i); -} diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java b/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java deleted file mode 100644 index 25ef883d..00000000 --- a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit - -public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { - - private EnumMobType a; - - protected BlockPressurePlateBinary(String s, Material material, EnumMobType enummobtype) { - super(s, material); - this.a = enummobtype; - } - - protected int d(int i) { - return i > 0 ? 1 : 0; - } - - protected int c(int i) { - return i == 1 ? 15 : 0; - } - - protected int e(World world, int i, int j, int k) { - List list = null; - - if (this.a == EnumMobType.EVERYTHING) { - list = world.getEntities((Entity) null, this.a(i, j, k)); - } - - if (this.a == EnumMobType.MOBS) { - list = world.a(EntityLiving.class, this.a(i, j, k)); - } - - if (this.a == EnumMobType.PLAYERS) { - list = world.a(EntityHuman.class, this.a(i, j, k)); - } - - if (list != null && !list.isEmpty()) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - // CraftBukkit start - Call interact event when turning on a pressure plate - if (this.c(world.getData(i, j, k)) == 0) { - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.event.Cancellable cancellable; - - if (entity instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else { - cancellable = new EntityInteractEvent(entity.getBukkitEntity(), bworld.getBlockAt(i, j, k)); - manager.callEvent((EntityInteractEvent) cancellable); - } - - // We only want to block turning the plate on if all events are cancelled - if (cancellable.isCancelled()) { - continue; - } - } - // CraftBukkit end - - if (!entity.az()) { - return 15; - } - } - } - - return 0; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java b/src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java deleted file mode 100644 index b6f22f02..00000000 --- a/src/main/java/net/minecraft/server/BlockPressurePlateWeighted.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit - -public class BlockPressurePlateWeighted extends BlockPressurePlateAbstract { - private final int a; - - protected BlockPressurePlateWeighted(String s, Material material, int i) { - super(s, material); - this.a = i; - } - - protected int e(World world, int i, int j, int k) { - // CraftBukkit start - int l = 0; - java.util.Iterator iterator = world.a(Entity.class, this.a(i, j, k)).iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - org.bukkit.event.Cancellable cancellable; - - if (entity instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else { - cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); - } - - // We only want to block turning the plate on if all events are cancelled - if (!cancellable.isCancelled()) { - l++; - } - } - - l = Math.min(l, this.a); - // CraftBukkit end - - if (l <= 0) { - return 0; - } - - float f = (float) Math.min(this.a, l) / (float) this.a; - return MathHelper.f(f * 15.0F); - } - - protected int c(int i) { - return i; - } - - protected int d(int i) { - return i; - } - - public int a(World world) { - return 10; - } -} diff --git a/src/main/java/net/minecraft/server/BlockPumpkin.java b/src/main/java/net/minecraft/server/BlockPumpkin.java deleted file mode 100644 index a8632a77..00000000 --- a/src/main/java/net/minecraft/server/BlockPumpkin.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.BlockStateListPopulator; -import org.bukkit.event.block.BlockRedstoneEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -// CraftBukkit end - -public class BlockPumpkin extends BlockDirectional { - - private boolean a; - - protected BlockPumpkin(boolean flag) { - super(Material.PUMPKIN); - this.a(true); - this.a = flag; - this.a(CreativeModeTab.b); - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - if (world.getType(i, j - 1, k) == Blocks.SNOW_BLOCK && world.getType(i, j - 2, k) == Blocks.SNOW_BLOCK) { - if (!world.isStatic) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - blockList.setTypeId(i, j, k, 0); - blockList.setTypeId(i, j - 1, k, 0); - blockList.setTypeId(i, j - 2, k, 0); - EntitySnowman entitysnowman = new EntitySnowman(world); - - entitysnowman.setPositionRotation((double) i + 0.5D, (double) j - 1.95D, (double) k + 0.5D, 0.0F, 0.0F); - if (world.addEntity(entitysnowman, SpawnReason.BUILD_SNOWMAN)) { - blockList.updateList(); - } - // CraftBukkit end - } - - for (int l = 0; l < 120; ++l) { - world.addParticle("snowshovel", (double) i + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 2.5D, (double) k + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - } else if (world.getType(i, j - 1, k) == Blocks.IRON_BLOCK && world.getType(i, j - 2, k) == Blocks.IRON_BLOCK) { - boolean flag = world.getType(i - 1, j - 1, k) == Blocks.IRON_BLOCK && world.getType(i + 1, j - 1, k) == Blocks.IRON_BLOCK; - boolean flag1 = world.getType(i, j - 1, k - 1) == Blocks.IRON_BLOCK && world.getType(i, j - 1, k + 1) == Blocks.IRON_BLOCK; - - if (flag || flag1) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - blockList.setTypeId(i, j, k, 0); - blockList.setTypeId(i, j - 1, k, 0); - blockList.setTypeId(i, j - 2, k, 0); - if (flag) { - blockList.setTypeId(i - 1, j - 1, k, 0); - blockList.setTypeId(i + 1, j - 1, k, 0); - } else { - blockList.setTypeId(i, j - 1, k - 1, 0); - blockList.setTypeId(i, j - 1, k + 1, 0); - } - - EntityIronGolem entityirongolem = new EntityIronGolem(world); - - entityirongolem.setPlayerCreated(true); - entityirongolem.setPositionRotation((double) i + 0.5D, (double) j - 1.95D, (double) k + 0.5D, 0.0F, 0.0F); - if (world.addEntity(entityirongolem, SpawnReason.BUILD_IRONGOLEM)) { - for (int i1 = 0; i1 < 120; ++i1) { - world.addParticle("snowballpoof", (double) i + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 3.9D, (double) k + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - - blockList.updateList(); - } - // CraftBukkit end - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i, j, k).material.isReplaceable() && World.a((IBlockAccess) world, i, j - 1, k); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 2.5D) & 3; - - world.setData(i, j, k, l, 2); - } - - // CraftBukkit start - public void doPhysics(World world, int i, int j, int k, Block block) { - if (block != null && block.isPowerSource()) { - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k); - int power = bukkitBlock.getBlockPower(); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneLamp.java b/src/main/java/net/minecraft/server/BlockRedstoneLamp.java deleted file mode 100644 index cb802e80..00000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneLamp.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockRedstoneLamp extends Block { - - private final boolean a; - - public BlockRedstoneLamp(boolean flag) { - super(Material.BUILDABLE_GLASS); - this.a = flag; - if (flag) { - this.a(1.0F); - } - } - - public void onPlace(World world, int i, int j, int k) { - if (!world.isStatic) { - if (this.a && !world.isBlockIndirectlyPowered(i, j, k)) { - world.a(i, j, k, this, 4); - } else if (!this.a && world.isBlockIndirectlyPowered(i, j, k)) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() != 15) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_LAMP_ON, 0, 2); - } - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - if (this.a && !world.isBlockIndirectlyPowered(i, j, k)) { - world.a(i, j, k, this, 4); - } else if (!this.a && world.isBlockIndirectlyPowered(i, j, k)) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 0, 15).getNewCurrent() != 15) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_LAMP_ON, 0, 2); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic && this.a && !world.isBlockIndirectlyPowered(i, j, k)) { - // CraftBukkit start - if (CraftEventFactory.callRedstoneChange(world, i, j, k, 15, 0).getNewCurrent() != 0) { - return; - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_LAMP_OFF, 0, 2); - } - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(Blocks.REDSTONE_LAMP_OFF); - } - - protected ItemStack j(int i) { - return new ItemStack(Blocks.REDSTONE_LAMP_OFF); - } -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneOre.java b/src/main/java/net/minecraft/server/BlockRedstoneOre.java deleted file mode 100644 index 0cd2e04e..00000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneOre.java +++ /dev/null @@ -1,155 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityInteractEvent; -// CraftBukkit end - -public class BlockRedstoneOre extends Block { - - private boolean a; - - public BlockRedstoneOre(boolean flag) { - super(Material.STONE); - if (flag) { - this.a(true); - } - - this.a = flag; - } - - public int a(World world) { - return 30; - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) { - this.e(world, i, j, k, entityhuman); // CraftBukkit - add entityhuman - super.attack(world, i, j, k, entityhuman); - } - - public void b(World world, int i, int j, int k, Entity entity) { - // CraftBukkit start - if (entity instanceof EntityHuman) { - org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - if (!event.isCancelled()) { - this.e(world, i, j, k, entity); // add entity - super.b(world, i, j, k, entity); - } - } else { - EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.e(world, i, j, k, entity); // add entity - super.b(world, i, j, k, entity); - } - } - // CraftBukkit end - } - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - this.e(world, i, j, k, entityhuman); // CraftBukkit - add entityhuman - return super.interact(world, i, j, k, entityhuman, l, f, f1, f2); - } - - private void e(World world, int i, int j, int k, Entity entity) { // CraftBukkit - add Entity - this.m(world, i, j, k); - if (this == Blocks.REDSTONE_ORE) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(entity, i, j, k, Blocks.GLOWING_REDSTONE_ORE, 0).isCancelled()) { - return; - } - // CraftBukkit end - world.setTypeUpdate(i, j, k, Blocks.GLOWING_REDSTONE_ORE); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (this == Blocks.GLOWING_REDSTONE_ORE) { - // CraftBukkit start - if (CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(i, j, k), Blocks.REDSTONE_ORE).isCancelled()) { - return; - } - // CraftBukkit end - world.setTypeUpdate(i, j, k, Blocks.REDSTONE_ORE); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.REDSTONE; - } - - public int getDropCount(int i, Random random) { - return this.a(random) + random.nextInt(i + 1); - } - - public int a(Random random) { - return 4 + random.nextInt(2); - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - /* CraftBukkit start - Delegated to getExpDrop - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 1 + world.random.nextInt(5); - - this.dropExperience(world, i, j, k, j1); - } - // */ - } - - public int getExpDrop(World world, int l, int i1) { - if (this.getDropType(l, world.random, i1) != Item.getItemOf(this)) { - int j1 = 1 + world.random.nextInt(5); - - return j1; - } - - return 0; - // CraftBukkit end - } - - private void m(World world, int i, int j, int k) { - Random random = world.random; - double d0 = 0.0625D; - - for (int l = 0; l < 6; ++l) { - double d1 = (double) ((float) i + random.nextFloat()); - double d2 = (double) ((float) j + random.nextFloat()); - double d3 = (double) ((float) k + random.nextFloat()); - - if (l == 0 && !world.getType(i, j + 1, k).c()) { - d2 = (double) (j + 1) + d0; - } - - if (l == 1 && !world.getType(i, j - 1, k).c()) { - d2 = (double) (j + 0) - d0; - } - - if (l == 2 && !world.getType(i, j, k + 1).c()) { - d3 = (double) (k + 1) + d0; - } - - if (l == 3 && !world.getType(i, j, k - 1).c()) { - d3 = (double) (k + 0) - d0; - } - - if (l == 4 && !world.getType(i + 1, j, k).c()) { - d1 = (double) (i + 1) + d0; - } - - if (l == 5 && !world.getType(i - 1, j, k).c()) { - d1 = (double) (i + 0) - d0; - } - - if (d1 < (double) i || d1 > (double) (i + 1) || d2 < 0.0D || d2 > (double) (j + 1) || d3 < (double) k || d3 > (double) (k + 1)) { - world.addParticle("reddust", d1, d2, d3, 0.0D, 0.0D, 0.0D); - } - } - } - - protected ItemStack j(int i) { - return new ItemStack(Blocks.REDSTONE_ORE); - } -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java b/src/main/java/net/minecraft/server/BlockRedstoneTorch.java deleted file mode 100644 index 8e014149..00000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneTorch.java +++ /dev/null @@ -1,176 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockRedstoneTorch extends BlockTorch { - - private boolean isOn; - private static Map b = new HashMap(); - - private boolean a(World world, int i, int j, int k, boolean flag) { - if (!b.containsKey(world)) { - b.put(world, new ArrayList()); - } - - List list = (List) b.get(world); - - if (flag) { - list.add(new RedstoneUpdateInfo(i, j, k, world.getTime())); - } - - int l = 0; - - for (int i1 = 0; i1 < list.size(); ++i1) { - RedstoneUpdateInfo redstoneupdateinfo = (RedstoneUpdateInfo) list.get(i1); - - if (redstoneupdateinfo.a == i && redstoneupdateinfo.b == j && redstoneupdateinfo.c == k) { - ++l; - if (l >= 8) { - return true; - } - } - } - - return false; - } - - protected BlockRedstoneTorch(boolean flag) { - this.isOn = flag; - this.a(true); - this.a((CreativeModeTab) null); - } - - public int a(World world) { - return 2; - } - - public void onPlace(World world, int i, int j, int k) { - if (world.getData(i, j, k) == 0) { - super.onPlace(world, i, j, k); - } - - if (this.isOn) { - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j, k + 1, this); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if (this.isOn) { - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j, k + 1, this); - } - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - if (!this.isOn) { - return 0; - } else { - int i1 = iblockaccess.getData(i, j, k); - - return i1 == 5 && l == 1 ? 0 : (i1 == 3 && l == 3 ? 0 : (i1 == 4 && l == 2 ? 0 : (i1 == 1 && l == 5 ? 0 : (i1 == 2 && l == 4 ? 0 : 15)))); - } - } - - private boolean m(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - return l == 5 && world.isBlockFacePowered(i, j - 1, k, 0) ? true : (l == 3 && world.isBlockFacePowered(i, j, k - 1, 2) ? true : (l == 4 && world.isBlockFacePowered(i, j, k + 1, 3) ? true : (l == 1 && world.isBlockFacePowered(i - 1, j, k, 4) ? true : l == 2 && world.isBlockFacePowered(i + 1, j, k, 5)))); - } - - public void a(World world, int i, int j, int k, Random random) { - boolean flag = this.m(world, i, j, k); - List list = (List) b.get(world); - - while (list != null && !list.isEmpty() && world.getTime() - ((RedstoneUpdateInfo) list.get(0)).d > 60L) { - list.remove(0); - } - - // CraftBukkit start - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - int oldCurrent = this.isOn ? 15 : 0; - - BlockRedstoneEvent event = new BlockRedstoneEvent(block, oldCurrent, oldCurrent); - // CraftBukkit end - - if (this.isOn) { - if (flag) { - // CraftBukkit start - if (oldCurrent != 0) { - event.setNewCurrent(0); - manager.callEvent(event); - if (event.getNewCurrent() != 0) { - return; - } - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_TORCH_OFF, world.getData(i, j, k), 3); - if (this.a(world, i, j, k, true)) { - world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); - - for (int l = 0; l < 5; ++l) { - double d0 = (double) i + random.nextDouble() * 0.6D + 0.2D; - double d1 = (double) j + random.nextDouble() * 0.6D + 0.2D; - double d2 = (double) k + random.nextDouble() * 0.6D + 0.2D; - - world.addParticle("smoke", d0, d1, d2, 0.0D, 0.0D, 0.0D); - } - } - } - } else if (!flag && !this.a(world, i, j, k, false)) { - // CraftBukkit start - if (oldCurrent != 15) { - event.setNewCurrent(15); - manager.callEvent(event); - if (event.getNewCurrent() != 15) { - return; - } - } - // CraftBukkit end - - world.setTypeAndData(i, j, k, Blocks.REDSTONE_TORCH_ON, world.getData(i, j, k), 3); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!this.b(world, i, j, k, block)) { - boolean flag = this.m(world, i, j, k); - - if (this.isOn && flag || !this.isOn && !flag) { - world.a(i, j, k, this, this.a(world)); - } - } - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return l == 0 ? this.b(iblockaccess, i, j, k, l) : 0; - } - - public Item getDropType(int i, Random random, int j) { - return Item.getItemOf(Blocks.REDSTONE_TORCH_ON); - } - - public boolean isPowerSource() { - return true; - } - - public boolean c(Block block) { - return block == Blocks.REDSTONE_TORCH_OFF || block == Blocks.REDSTONE_TORCH_ON; - } -} diff --git a/src/main/java/net/minecraft/server/BlockRedstoneWire.java b/src/main/java/net/minecraft/server/BlockRedstoneWire.java deleted file mode 100644 index 3cec3789..00000000 --- a/src/main/java/net/minecraft/server/BlockRedstoneWire.java +++ /dev/null @@ -1,323 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Random; -import java.util.Set; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockRedstoneWire extends Block { - - private boolean a = true; - private Set b = new HashSet(); - - public BlockRedstoneWire() { - super(Material.ORIENTABLE); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.0625F, 1.0F); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 5; - } - - public boolean canPlace(World world, int i, int j, int k) { - return World.a((IBlockAccess) world, i, j - 1, k) || world.getType(i, j - 1, k) == Blocks.GLOWSTONE; - } - - private void e(World world, int i, int j, int k) { - this.a(world, i, j, k, i, j, k); - ArrayList arraylist = new ArrayList(this.b); - - this.b.clear(); - - for (int l = 0; l < arraylist.size(); ++l) { - ChunkPosition chunkposition = (ChunkPosition) arraylist.get(l); - - world.applyPhysics(chunkposition.x, chunkposition.y, chunkposition.z, this); - } - } - - private void a(World world, int i, int j, int k, int l, int i1, int j1) { - int k1 = world.getData(i, j, k); - byte b0 = 0; - int l1 = this.getPower(world, l, i1, j1, b0); - - this.a = false; - int i2 = world.getHighestNeighborSignal(i, j, k); - - this.a = true; - if (i2 > 0 && i2 > l1 - 1) { - l1 = i2; - } - - int j2 = 0; - - for (int k2 = 0; k2 < 4; ++k2) { - int l2 = i; - int i3 = k; - - if (k2 == 0) { - l2 = i - 1; - } - - if (k2 == 1) { - ++l2; - } - - if (k2 == 2) { - i3 = k - 1; - } - - if (k2 == 3) { - ++i3; - } - - if (l2 != l || i3 != j1) { - j2 = this.getPower(world, l2, j, i3, j2); - } - - if (world.getType(l2, j, i3).r() && !world.getType(i, j + 1, k).r()) { - if ((l2 != l || i3 != j1) && j >= i1) { - j2 = this.getPower(world, l2, j + 1, i3, j2); - } - } else if (!world.getType(l2, j, i3).r() && (l2 != l || i3 != j1) && j <= i1) { - j2 = this.getPower(world, l2, j - 1, i3, j2); - } - } - - if (j2 > l1) { - l1 = j2 - 1; - } else if (l1 > 0) { - --l1; - } else { - l1 = 0; - } - - if (i2 > l1 - 1) { - l1 = i2; - } - - // CraftBukkit start - if (k1 != l1) { - BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(i, j, k), k1, l1); - world.getServer().getPluginManager().callEvent(event); - - l1 = event.getNewCurrent(); - } - // CraftBukkit end - if (k1 != l1) { - world.setData(i, j, k, l1, 2); - this.b.add(new ChunkPosition(i, j, k)); - this.b.add(new ChunkPosition(i - 1, j, k)); - this.b.add(new ChunkPosition(i + 1, j, k)); - this.b.add(new ChunkPosition(i, j - 1, k)); - this.b.add(new ChunkPosition(i, j + 1, k)); - this.b.add(new ChunkPosition(i, j, k - 1)); - this.b.add(new ChunkPosition(i, j, k + 1)); - } - } - - private void m(World world, int i, int j, int k) { - if (world.getType(i, j, k) == this) { - world.applyPhysics(i, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i, j, k - 1, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i, j + 1, k, this); - } - } - - public void onPlace(World world, int i, int j, int k) { - super.onPlace(world, i, j, k); - if (!world.isStatic) { - this.e(world, i, j, k); - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i, j - 1, k, this); - this.m(world, i - 1, j, k); - this.m(world, i + 1, j, k); - this.m(world, i, j, k - 1); - this.m(world, i, j, k + 1); - if (world.getType(i - 1, j, k).r()) { - this.m(world, i - 1, j + 1, k); - } else { - this.m(world, i - 1, j - 1, k); - } - - if (world.getType(i + 1, j, k).r()) { - this.m(world, i + 1, j + 1, k); - } else { - this.m(world, i + 1, j - 1, k); - } - - if (world.getType(i, j, k - 1).r()) { - this.m(world, i, j + 1, k - 1); - } else { - this.m(world, i, j - 1, k - 1); - } - - if (world.getType(i, j, k + 1).r()) { - this.m(world, i, j + 1, k + 1); - } else { - this.m(world, i, j - 1, k + 1); - } - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - super.remove(world, i, j, k, block, l); - if (!world.isStatic) { - world.applyPhysics(i, j + 1, k, this); - world.applyPhysics(i, j - 1, k, this); - world.applyPhysics(i + 1, j, k, this); - world.applyPhysics(i - 1, j, k, this); - world.applyPhysics(i, j, k + 1, this); - world.applyPhysics(i, j, k - 1, this); - this.e(world, i, j, k); - this.m(world, i - 1, j, k); - this.m(world, i + 1, j, k); - this.m(world, i, j, k - 1); - this.m(world, i, j, k + 1); - if (world.getType(i - 1, j, k).r()) { - this.m(world, i - 1, j + 1, k); - } else { - this.m(world, i - 1, j - 1, k); - } - - if (world.getType(i + 1, j, k).r()) { - this.m(world, i + 1, j + 1, k); - } else { - this.m(world, i + 1, j - 1, k); - } - - if (world.getType(i, j, k - 1).r()) { - this.m(world, i, j + 1, k - 1); - } else { - this.m(world, i, j - 1, k - 1); - } - - if (world.getType(i, j, k + 1).r()) { - this.m(world, i, j + 1, k + 1); - } else { - this.m(world, i, j - 1, k + 1); - } - } - } - - // CraftBukkit - private -> public - public int getPower(World world, int i, int j, int k, int l) { - if (world.getType(i, j, k) != this) { - return l; - } else { - int i1 = world.getData(i, j, k); - - return i1 > l ? i1 : l; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - boolean flag = this.canPlace(world, i, j, k); - - if (flag) { - this.e(world, i, j, k); - } else { - this.b(world, i, j, k, 0, 0); - world.setAir(i, j, k); - } - - super.doPhysics(world, i, j, k, block); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.REDSTONE; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return !this.a ? 0 : this.b(iblockaccess, i, j, k, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - if (!this.a) { - return 0; - } else { - int i1 = iblockaccess.getData(i, j, k); - - if (i1 == 0) { - return 0; - } else if (l == 1) { - return i1; - } else { - boolean flag = g(iblockaccess, i - 1, j, k, 1) || !iblockaccess.getType(i - 1, j, k).r() && g(iblockaccess, i - 1, j - 1, k, -1); - boolean flag1 = g(iblockaccess, i + 1, j, k, 3) || !iblockaccess.getType(i + 1, j, k).r() && g(iblockaccess, i + 1, j - 1, k, -1); - boolean flag2 = g(iblockaccess, i, j, k - 1, 2) || !iblockaccess.getType(i, j, k - 1).r() && g(iblockaccess, i, j - 1, k - 1, -1); - boolean flag3 = g(iblockaccess, i, j, k + 1, 0) || !iblockaccess.getType(i, j, k + 1).r() && g(iblockaccess, i, j - 1, k + 1, -1); - - if (!iblockaccess.getType(i, j + 1, k).r()) { - if (iblockaccess.getType(i - 1, j, k).r() && g(iblockaccess, i - 1, j + 1, k, -1)) { - flag = true; - } - - if (iblockaccess.getType(i + 1, j, k).r() && g(iblockaccess, i + 1, j + 1, k, -1)) { - flag1 = true; - } - - if (iblockaccess.getType(i, j, k - 1).r() && g(iblockaccess, i, j + 1, k - 1, -1)) { - flag2 = true; - } - - if (iblockaccess.getType(i, j, k + 1).r() && g(iblockaccess, i, j + 1, k + 1, -1)) { - flag3 = true; - } - } - - return !flag2 && !flag1 && !flag && !flag3 && l >= 2 && l <= 5 ? i1 : (l == 2 && flag2 && !flag && !flag1 ? i1 : (l == 3 && flag3 && !flag && !flag1 ? i1 : (l == 4 && flag && !flag2 && !flag3 ? i1 : (l == 5 && flag1 && !flag2 && !flag3 ? i1 : 0)))); - } - } - } - - public boolean isPowerSource() { - return this.a; - } - - public static boolean f(IBlockAccess iblockaccess, int i, int j, int k, int l) { - Block block = iblockaccess.getType(i, j, k); - - if (block == Blocks.REDSTONE_WIRE) { - return true; - } else if (!Blocks.DIODE_OFF.e(block)) { - return block.isPowerSource() && l != -1; - } else { - int i1 = iblockaccess.getData(i, j, k); - - return l == (i1 & 3) || l == Direction.f[i1 & 3]; - } - } - - public static boolean g(IBlockAccess iblockaccess, int i, int j, int k, int l) { - if (f(iblockaccess, i, j, k, l)) { - return true; - } else if (iblockaccess.getType(i, j, k) == Blocks.DIODE_ON) { - int i1 = iblockaccess.getData(i, j, k); - - return l == (i1 & 3); - } else { - return false; - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockReed.java b/src/main/java/net/minecraft/server/BlockReed.java deleted file mode 100644 index a1350f62..00000000 --- a/src/main/java/net/minecraft/server/BlockReed.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockReed extends Block { - - protected BlockReed() { - super(Material.PLANT); - float f = 0.375F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 1.0F, 0.5F + f); - this.a(true); - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.getType(i, j - 1, k) == Blocks.SUGAR_CANE_BLOCK || this.e(world, i, j, k)) { - if (world.isEmpty(i, j + 1, k)) { - int l; - - for (l = 1; world.getType(i, j - l, k) == this; ++l) { - ; - } - - if (l < 3) { - int i1 = world.getData(i, j, k); - - if (i1 == 15) { - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 0); // CraftBukkit - world.setData(i, j, k, 0, 4); - } else { - world.setData(i, j, k, i1 + 1, 4); - } - } - } - } - } - - public boolean canPlace(World world, int i, int j, int k) { - Block block = world.getType(i, j - 1, k); - - return block == this ? true : (block != Blocks.GRASS && block != Blocks.DIRT && block != Blocks.SAND ? false : (world.getType(i - 1, j - 1, k).getMaterial() == Material.WATER ? true : (world.getType(i + 1, j - 1, k).getMaterial() == Material.WATER ? true : (world.getType(i, j - 1, k - 1).getMaterial() == Material.WATER ? true : world.getType(i, j - 1, k + 1).getMaterial() == Material.WATER)))); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - this.e(world, i, j, k); - } - - protected final boolean e(World world, int i, int j, int k) { - if (!this.j(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public boolean j(World world, int i, int j, int k) { - return this.canPlace(world, i, j, k); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public Item getDropType(int i, Random random, int j) { - return Items.SUGAR_CANE; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 1; - } -} diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java deleted file mode 100644 index 89e60a88..00000000 --- a/src/main/java/net/minecraft/server/BlockSapling.java +++ /dev/null @@ -1,203 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.TreeType; -import org.bukkit.block.BlockState; -import org.bukkit.event.world.StructureGrowEvent; -// CraftBukkit end - -public class BlockSapling extends BlockPlant implements IBlockFragilePlantElement { - - public static final String[] a = new String[] { "oak", "spruce", "birch", "jungle", "acacia", "roofed_oak"}; - private static final IIcon[] b = new IIcon[a.length]; - public static TreeType treeType; // CraftBukkit - - protected BlockSapling() { - float f = 0.4F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 2.0F, 0.5F + f); - this.a(CreativeModeTab.c); - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - super.a(world, i, j, k, random); - if (world.getLightLevel(i, j + 1, k) >= 9 && random.nextInt(7) == 0) { - // CraftBukkit start - world.captureTreeGeneration = true; - // CraftBukkit end - this.grow(world, i, j, k, random); - // CraftBukkit start - world.captureTreeGeneration = false; - if (world.capturedBlockStates.size() > 0) { - TreeType treeType = BlockSapling.treeType; - BlockSapling.treeType = null; - Location location = new Location(world.getWorld(), i, j, k); - List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone(); - world.capturedBlockStates.clear(); - StructureGrowEvent event = null; - if (treeType != null) { - event = new StructureGrowEvent(location, treeType, false, null, blocks); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - } - if (event == null || !event.isCancelled()) { - for (BlockState blockstate : blocks) { - blockstate.update(true); - } - } - } - // CraftBukkit end - } - } - } - - public void grow(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k); - - if ((l & 8) == 0) { - world.setData(i, j, k, l | 8, 4); - } else { - this.d(world, i, j, k, random); - } - } - - public void d(World world, int i, int j, int k, Random random) { - int l = world.getData(i, j, k) & 7; - // CraftBukkit start - Turn ternary operator into if statement to set treeType - // Object object = random.nextInt(10) == 0 ? new WorldGenBigTree(true) : new WorldGenTrees(true); - Object object; - if (random.nextInt(10) == 0) { - treeType = TreeType.BIG_TREE; - object = new WorldGenBigTree(true); - } else { - treeType = TreeType.TREE; - object = new WorldGenTrees(true); - } - // CraftBukkit end - int i1 = 0; - int j1 = 0; - boolean flag = false; - - switch (l) { - case 0: - default: - break; - - case 1: - label78: - for (i1 = 0; i1 >= -1; --i1) { - for (j1 = 0; j1 >= -1; --j1) { - if (this.a(world, i + i1, j, k + j1, 1) && this.a(world, i + i1 + 1, j, k + j1, 1) && this.a(world, i + i1, j, k + j1 + 1, 1) && this.a(world, i + i1 + 1, j, k + j1 + 1, 1)) { - treeType = TreeType.MEGA_REDWOOD; // CraftBukkit - object = new WorldGenMegaTree(false, random.nextBoolean()); - flag = true; - break label78; - } - } - } - - if (!flag) { - j1 = 0; - i1 = 0; - treeType = TreeType.REDWOOD; // CraftBukkit - object = new WorldGenTaiga2(true); - } - break; - - case 2: - treeType = TreeType.BIRCH; // CraftBukkit - object = new WorldGenForest(true, false); - break; - - case 3: - label93: - for (i1 = 0; i1 >= -1; --i1) { - for (j1 = 0; j1 >= -1; --j1) { - if (this.a(world, i + i1, j, k + j1, 3) && this.a(world, i + i1 + 1, j, k + j1, 3) && this.a(world, i + i1, j, k + j1 + 1, 3) && this.a(world, i + i1 + 1, j, k + j1 + 1, 3)) { - treeType = TreeType.JUNGLE; // CraftBukkit - object = new WorldGenJungleTree(true, 10, 20, 3, 3); - flag = true; - break label93; - } - } - } - - if (!flag) { - j1 = 0; - i1 = 0; - treeType = TreeType.SMALL_JUNGLE; // CraftBukkit - object = new WorldGenTrees(true, 4 + random.nextInt(7), 3, 3, false); - } - break; - - case 4: - treeType = TreeType.ACACIA; // CraftBukkit - object = new WorldGenAcaciaTree(true); - break; - - case 5: - label108: - for (i1 = 0; i1 >= -1; --i1) { - for (j1 = 0; j1 >= -1; --j1) { - if (this.a(world, i + i1, j, k + j1, 5) && this.a(world, i + i1 + 1, j, k + j1, 5) && this.a(world, i + i1, j, k + j1 + 1, 5) && this.a(world, i + i1 + 1, j, k + j1 + 1, 5)) { - object = new WorldGenForestTree(true); - treeType = TreeType.DARK_OAK; // CraftBukkit - flag = true; - break label108; - } - } - } - - if (!flag) { - return; - } - } - - Block block = Blocks.AIR; - - if (flag) { - world.setTypeAndData(i + i1, j, k + j1, block, 0, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1, block, 0, 4); - world.setTypeAndData(i + i1, j, k + j1 + 1, block, 0, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1 + 1, block, 0, 4); - } else { - world.setTypeAndData(i, j, k, block, 0, 4); - } - - if (!((WorldGenerator) object).generate(world, random, i + i1, j, k + j1)) { - if (flag) { - world.setTypeAndData(i + i1, j, k + j1, this, l, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1, this, l, 4); - world.setTypeAndData(i + i1, j, k + j1 + 1, this, l, 4); - world.setTypeAndData(i + i1 + 1, j, k + j1 + 1, this, l, 4); - } else { - world.setTypeAndData(i, j, k, this, l, 4); - } - } - } - - public boolean a(World world, int i, int j, int k, int l) { - return world.getType(i, j, k) == this && (world.getData(i, j, k) & 7) == l; - } - - public int getDropData(int i) { - return MathHelper.a(i & 7, 0, 5); - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return true; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return (double) world.random.nextFloat() < 0.45D; - } - - public void b(World world, Random random, int i, int j, int k) { - this.grow(world, i, j, k, random); - } -} diff --git a/src/main/java/net/minecraft/server/BlockSign.java b/src/main/java/net/minecraft/server/BlockSign.java deleted file mode 100644 index 4ee33197..00000000 --- a/src/main/java/net/minecraft/server/BlockSign.java +++ /dev/null @@ -1,127 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockSign extends BlockContainer { - - private Class a; - private boolean b; - - protected BlockSign(Class oclass, boolean flag) { - super(Material.WOOD); - this.b = flag; - this.a = oclass; - float f = 0.25F; - float f1 = 1.0F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - if (!this.b) { - int l = iblockaccess.getData(i, j, k); - float f = 0.28125F; - float f1 = 0.78125F; - float f2 = 0.0F; - float f3 = 1.0F; - float f4 = 0.125F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - if (l == 2) { - this.a(f2, f, 1.0F - f4, f3, f1, 1.0F); - } - - if (l == 3) { - this.a(f2, f, 0.0F, f3, f1, f4); - } - - if (l == 4) { - this.a(1.0F - f4, f, f2, 1.0F, f1, f3); - } - - if (l == 5) { - this.a(0.0F, f, f2, f4, f1, f3); - } - } - } - - public int b() { - return -1; - } - - public boolean d() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return true; - } - - public boolean c() { - return false; - } - - public TileEntity a(World world, int i) { - try { - return (TileEntity) this.a.newInstance(); - } catch (Exception exception) { - throw new RuntimeException(exception); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.SIGN; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - boolean flag = false; - - if (this.b) { - if (!world.getType(i, j - 1, k).getMaterial().isBuildable()) { - flag = true; - } - } else { - int l = world.getData(i, j, k); - - flag = true; - if (l == 2 && world.getType(i, j, k + 1).getMaterial().isBuildable()) { - flag = false; - } - - if (l == 3 && world.getType(i, j, k - 1).getMaterial().isBuildable()) { - flag = false; - } - - if (l == 4 && world.getType(i + 1, j, k).getMaterial().isBuildable()) { - flag = false; - } - - if (l == 5 && world.getType(i - 1, j, k).getMaterial().isBuildable()) { - flag = false; - } - } - - if (flag) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - - super.doPhysics(world, i, j, k, block); - - // CraftBukkit start - if (block != null && block.isPowerSource()) { - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j, k); - int power = bukkitBlock.getBlockPower(); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, power, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - } - // CraftBukkit end - } -} diff --git a/src/main/java/net/minecraft/server/BlockSkull.java b/src/main/java/net/minecraft/server/BlockSkull.java deleted file mode 100644 index 3075dbc8..00000000 --- a/src/main/java/net/minecraft/server/BlockSkull.java +++ /dev/null @@ -1,244 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.BlockStateListPopulator; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -// CraftBukkit end - -public class BlockSkull extends BlockContainer { - - protected BlockSkull() { - super(Material.ORIENTABLE); - this.a(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - } - - public int b() { - return -1; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k) & 7; - - switch (l) { - case 1: - default: - this.a(0.25F, 0.0F, 0.25F, 0.75F, 0.5F, 0.75F); - break; - - case 2: - this.a(0.25F, 0.25F, 0.5F, 0.75F, 0.75F, 1.0F); - break; - - case 3: - this.a(0.25F, 0.25F, 0.0F, 0.75F, 0.75F, 0.5F); - break; - - case 4: - this.a(0.5F, 0.25F, 0.25F, 1.0F, 0.75F, 0.75F); - break; - - case 5: - this.a(0.0F, 0.25F, 0.25F, 0.5F, 0.75F, 0.75F); - } - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 2.5D) & 3; - - world.setData(i, j, k, l, 2); - } - - public TileEntity a(World world, int i) { - return new TileEntitySkull(); - } - - public int getDropData(World world, int i, int j, int k) { - TileEntity tileentity = world.getTileEntity(i, j, k); - - return tileentity != null && tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() : super.getDropData(world, i, j, k); - } - - public int getDropData(int i) { - return i; - } - - // CraftBukkit start - Special case dropping so we can get info from the tile entity - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - if (world.random.nextFloat() < f) { - ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, i, j, k)); - TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(i, j, k); - - if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { - itemstack.setTag(new NBTTagCompound()); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); - itemstack.getTag().set("SkullOwner", nbttagcompound); - } - - this.a(world, i, j, k, itemstack); - } - } - // CraftBukkit end - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild) { - l |= 8; - world.setData(i, j, k, l, 4); - } - - super.a(world, i, j, k, l, entityhuman); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - if (!world.isStatic) { - // CraftBukkit start - Drop item in code above, not here - // if ((l & 8) == 0) { - if (false) { - // CraftBukkit end - ItemStack itemstack = new ItemStack(Items.SKULL, 1, this.getDropData(world, i, j, k)); - TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(i, j, k); - - if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { - itemstack.setTag(new NBTTagCompound()); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); - itemstack.getTag().set("SkullOwner", nbttagcompound); - } - - this.a(world, i, j, k, itemstack); - } - - super.remove(world, i, j, k, block, l); - } - } - - public Item getDropType(int i, Random random, int j) { - return Items.SKULL; - } - - public void a(World world, int i, int j, int k, TileEntitySkull tileentityskull) { - if (tileentityskull.getSkullType() == 1 && j >= 2 && world.difficulty != EnumDifficulty.PEACEFUL && !world.isStatic) { - int l; - EntityWither entitywither; - Iterator iterator; - EntityHuman entityhuman; - int i1; - - for (l = -2; l <= 0; ++l) { - if (world.getType(i, j - 1, k + l) == Blocks.SOUL_SAND && world.getType(i, j - 1, k + l + 1) == Blocks.SOUL_SAND && world.getType(i, j - 2, k + l + 1) == Blocks.SOUL_SAND && world.getType(i, j - 1, k + l + 2) == Blocks.SOUL_SAND && this.a(world, i, j, k + l, 1) && this.a(world, i, j, k + l + 1, 1) && this.a(world, i, j, k + l + 2, 1)) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - world.setData(i, j, k + l, 8, 2); - world.setData(i, j, k + l + 1, 8, 2); - world.setData(i, j, k + l + 2, 8, 2); - - blockList.setTypeAndData(i, j, k + l, getById(0), 0, 2); - blockList.setTypeAndData(i, j, k + l + 1, getById(0), 0, 2); - blockList.setTypeAndData(i, j, k + l + 2, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 1, k + l, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 1, k + l + 1, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 1, k + l + 2, getById(0), 0, 2); - blockList.setTypeAndData(i, j - 2, k + l + 1, getById(0), 0, 2); - - if (!world.isStatic) { - entitywither = new EntityWither(world); - entitywither.setPositionRotation((double) i + 0.5D, (double) j - 1.45D, (double) (k + l) + 1.5D, 90.0F, 0.0F); - entitywither.aM = 90.0F; - entitywither.bZ(); - - if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { - if (!world.isStatic) { - iterator = world.a(EntityHuman.class, entitywither.boundingBox.grow(50.0D, 50.0D, 50.0D)).iterator(); - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.a((Statistic) AchievementList.I); - } - } - - blockList.updateList(); - } - } - - for (i1 = 0; i1 < 120; ++i1) { - world.addParticle("snowballpoof", (double) i + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 3.9D, (double) (k + l + 1) + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - // CraftBukkit end - return; - } - } - - for (l = -2; l <= 0; ++l) { - if (world.getType(i + l, j - 1, k) == Blocks.SOUL_SAND && world.getType(i + l + 1, j - 1, k) == Blocks.SOUL_SAND && world.getType(i + l + 1, j - 2, k) == Blocks.SOUL_SAND && world.getType(i + l + 2, j - 1, k) == Blocks.SOUL_SAND && this.a(world, i + l, j, k, 1) && this.a(world, i + l + 1, j, k, 1) && this.a(world, i + l + 2, j, k, 1)) { - // CraftBukkit start - Use BlockStateListPopulator - BlockStateListPopulator blockList = new BlockStateListPopulator(world.getWorld()); - - world.setData(i + l, j, k, 8, 2); - world.setData(i + l + 1, j, k, 8, 2); - world.setData(i + l + 2, j, k, 8, 2); - - blockList.setTypeAndData(i + l, j, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 1, j, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 2, j, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l, j - 1, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 1, j - 1, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 2, j - 1, k, getById(0), 0, 2); - blockList.setTypeAndData(i + l + 1, j - 2, k, getById(0), 0, 2); - if (!world.isStatic) { - entitywither = new EntityWither(world); - entitywither.setPositionRotation((double) (i + l) + 1.5D, (double) j - 1.45D, (double) k + 0.5D, 0.0F, 0.0F); - entitywither.bZ(); - - if (world.addEntity(entitywither, SpawnReason.BUILD_WITHER)) { - if (!world.isStatic) { - iterator = world.a(EntityHuman.class, entitywither.boundingBox.grow(50.0D, 50.0D, 50.0D)).iterator(); - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.a((Statistic) AchievementList.I); - } - } - blockList.updateList(); - } - } - - for (i1 = 0; i1 < 120; ++i1) { - world.addParticle("snowballpoof", (double) (i + l + 1) + world.random.nextDouble(), (double) (j - 2) + world.random.nextDouble() * 3.9D, (double) k + world.random.nextDouble(), 0.0D, 0.0D, 0.0D); - } - // CraftBukkit end - - return; - } - } - } - } - - private boolean a(World world, int i, int j, int k, int l) { - if (world.getType(i, j, k) != this) { - return false; - } else { - TileEntity tileentity = world.getTileEntity(i, j, k); - - return tileentity != null && tileentity instanceof TileEntitySkull ? ((TileEntitySkull) tileentity).getSkullType() == l : false; - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockSnow.java b/src/main/java/net/minecraft/server/BlockSnow.java deleted file mode 100644 index 02f428e5..00000000 --- a/src/main/java/net/minecraft/server/BlockSnow.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockSnow extends Block { - - protected BlockSnow() { - super(Material.PACKED_ICE); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); - this.a(true); - this.a(CreativeModeTab.c); - this.b(0); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - int l = world.getData(i, j, k) & 7; - float f = 0.125F; - - return AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) ((float) j + (float) l * f), (double) k + this.maxZ); - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void g() { - this.b(0); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(iblockaccess.getData(i, j, k)); - } - - protected void b(int i) { - int j = i & 7; - float f = (float) (2 * (1 + j)) / 16.0F; - - this.a(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F); - } - - public boolean canPlace(World world, int i, int j, int k) { - Block block = world.getType(i, j - 1, k); - - return block != Blocks.ICE && block != Blocks.PACKED_ICE ? (block.getMaterial() == Material.LEAVES ? true : (block == this && (world.getData(i, j - 1, k) & 7) == 7 ? true : block.c() && block.material.isSolid())) : false; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - this.m(world, i, j, k); - } - - private boolean m(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - int i1 = l & 7; - - this.a(world, i, j, k, new ItemStack(Items.SNOW_BALL, i1 + 1, 0)); - world.setAir(i, j, k); - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - } - - public Item getDropType(int i, Random random, int j) { - return Items.SNOW_BALL; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, int i, int j, int k, Random random) { - if (world.b(EnumSkyBlock.BLOCK, i, j, k) > 11) { - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockFadeEvent(world.getWorld().getBlockAt(i, j, k), Blocks.AIR).isCancelled()) { - return; - } - // CraftBukkit end - - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockSoil.java b/src/main/java/net/minecraft/server/BlockSoil.java deleted file mode 100644 index b234a537..00000000 --- a/src/main/java/net/minecraft/server/BlockSoil.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.event.entity.EntityInteractEvent; -import org.bukkit.craftbukkit.event.CraftEventFactory; -// CraftBukkit end - -public class BlockSoil extends Block { - - protected BlockSoil() { - super(Material.EARTH); - this.a(true); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.9375F, 1.0F); - this.g(255); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return AxisAlignedBB.a((double) (i + 0), (double) (j + 0), (double) (k + 0), (double) (i + 1), (double) (j + 1), (double) (k + 1)); - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void a(World world, int i, int j, int k, Random random) { - if (!this.m(world, i, j, k) && !world.isRainingAt(i, j + 1, k)) { - int l = world.getData(i, j, k); - - if (l > 0) { - world.setData(i, j, k, l - 1, 2); - } else if (!this.e(world, i, j, k)) { - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - if (CraftEventFactory.callBlockFadeEvent(block, Blocks.DIRT).isCancelled()) { - return; - } - // CraftBukkit end - - world.setTypeUpdate(i, j, k, Blocks.DIRT); - } - } else { - world.setData(i, j, k, 7, 2); - } - } - - public void a(World world, int i, int j, int k, Entity entity, float f) { - if (!world.isStatic && world.random.nextFloat() < f - 0.5F) { - if (!(entity instanceof EntityHuman) && !world.getGameRules().getBoolean("mobGriefing")) { - return; - } - - // CraftBukkit start - Interact soil - org.bukkit.event.Cancellable cancellable; - if (entity instanceof EntityHuman) { - cancellable = CraftEventFactory.callPlayerInteractEvent((EntityHuman) entity, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else { - cancellable = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent((EntityInteractEvent) cancellable); - } - - if (cancellable.isCancelled()) { - return; - } - - if (CraftEventFactory.callEntityChangeBlockEvent(entity, i, j, k, Blocks.DIRT, 0).isCancelled()) { - return; - } - // CraftBukkit end - world.setTypeUpdate(i, j, k, Blocks.DIRT); - } - } - - private boolean e(World world, int i, int j, int k) { - byte b0 = 0; - - for (int l = i - b0; l <= i + b0; ++l) { - for (int i1 = k - b0; i1 <= k + b0; ++i1) { - Block block = world.getType(l, j + 1, i1); - - if (block == Blocks.CROPS || block == Blocks.MELON_STEM || block == Blocks.PUMPKIN_STEM || block == Blocks.POTATOES || block == Blocks.CARROTS) { - return true; - } - } - } - - return false; - } - - private boolean m(World world, int i, int j, int k) { - for (int l = i - 4; l <= i + 4; ++l) { - for (int i1 = j; i1 <= j + 1; ++i1) { - for (int j1 = k - 4; j1 <= k + 4; ++j1) { - if (world.getType(l, i1, j1).getMaterial() == Material.WATER) { - return true; - } - } - } - } - - return false; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - super.doPhysics(world, i, j, k, block); - Material material = world.getType(i, j + 1, k).getMaterial(); - - if (material.isBuildable()) { - world.setTypeUpdate(i, j, k, Blocks.DIRT); - } - } - - public Item getDropType(int i, Random random, int j) { - return Blocks.DIRT.getDropType(0, random, j); - } -} diff --git a/src/main/java/net/minecraft/server/BlockStationary.java b/src/main/java/net/minecraft/server/BlockStationary.java deleted file mode 100644 index 51b9604a..00000000 --- a/src/main/java/net/minecraft/server/BlockStationary.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockStationary extends BlockFluids { - - protected BlockStationary(Material material) { - super(material); - this.a(false); - if (material == Material.LAVA) { - this.a(true); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - super.doPhysics(world, i, j, k, block); - if (world.getType(i, j, k) == this) { - this.n(world, i, j, k); - } - } - - private void n(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - world.setTypeAndData(i, j, k, Block.getById(Block.getId(this) - 1), l, 2); - world.a(i, j, k, Block.getById(Block.getId(this) - 1), this.a(world)); - } - - public void a(World world, int i, int j, int k, Random random) { - if (this.material == Material.LAVA) { - int l = random.nextInt(3); - - int i1; - - // CraftBukkit start - Prevent lava putting something on fire, remember igniter block coords - int x = i; - int y = j; - int z = k; - // CraftBukkit end - - for (i1 = 0; i1 < l; ++i1) { - i += random.nextInt(3) - 1; - ++j; - k += random.nextInt(3) - 1; - Block block = world.getType(i, j, k); - - if (block.material == Material.AIR) { - if (this.o(world, i - 1, j, k) || this.o(world, i + 1, j, k) || this.o(world, i, j, k - 1) || this.o(world, i, j, k + 1) || this.o(world, i, j - 1, k) || this.o(world, i, j + 1, k)) { - // CraftBukkit start - Prevent lava putting something on fire - if (world.getType(i, j, k) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, i, j, k, x, y, z).isCancelled()) { - continue; - } - } - // CraftBukkit end - - world.setTypeUpdate(i, j, k, Blocks.FIRE); - return; - } - } else if (block.material.isSolid()) { - return; - } - } - - if (l == 0) { - i1 = i; - int j1 = k; - - for (int k1 = 0; k1 < 3; ++k1) { - i = i1 + random.nextInt(3) - 1; - k = j1 + random.nextInt(3) - 1; - if (world.isEmpty(i, j + 1, k) && this.o(world, i, j, k)) { - // CraftBukkit start - Prevent lava putting something on fire - if (world.getType(i, j + 1, k) != Blocks.FIRE) { - if (CraftEventFactory.callBlockIgniteEvent(world, i, j + 1, k, x, y, z).isCancelled()) { - continue; - } - } - // CraftBukkit end - - world.setTypeUpdate(i, j + 1, k, Blocks.FIRE); - } - } - } - } - } - - private boolean o(World world, int i, int j, int k) { - return world.getType(i, j, k).getMaterial().isBurnable(); - } -} diff --git a/src/main/java/net/minecraft/server/BlockStem.java b/src/main/java/net/minecraft/server/BlockStem.java deleted file mode 100644 index 40ad1c65..00000000 --- a/src/main/java/net/minecraft/server/BlockStem.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockStem extends BlockPlant implements IBlockFragilePlantElement { - - private final Block blockFruit; - - protected BlockStem(Block block) { - this.blockFruit = block; - this.a(true); - float f = 0.125F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - this.a((CreativeModeTab) null); - } - - protected boolean a(Block block) { - return block == Blocks.SOIL; - } - - public void a(World world, int i, int j, int k, Random random) { - super.a(world, i, j, k, random); - if (world.getLightLevel(i, j + 1, k) >= 9) { - float f = this.n(world, i, j, k); - - if (random.nextInt((int) (25.0F / f) + 1) == 0) { - int l = world.getData(i, j, k); - - if (l < 7) { - ++l; - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } else { - if (world.getType(i - 1, j, k) == this.blockFruit) { - return; - } - - if (world.getType(i + 1, j, k) == this.blockFruit) { - return; - } - - if (world.getType(i, j, k - 1) == this.blockFruit) { - return; - } - - if (world.getType(i, j, k + 1) == this.blockFruit) { - return; - } - - int i1 = random.nextInt(4); - int j1 = i; - int k1 = k; - - if (i1 == 0) { - j1 = i - 1; - } - - if (i1 == 1) { - ++j1; - } - - if (i1 == 2) { - k1 = k - 1; - } - - if (i1 == 3) { - ++k1; - } - - Block block = world.getType(j1, j - 1, k1); - - if (world.getType(j1, j, k1).material == Material.AIR && (block == Blocks.SOIL || block == Blocks.DIRT || block == Blocks.GRASS)) { - CraftEventFactory.handleBlockGrowEvent(world, j1, j, k1, this.blockFruit, 0); // CraftBukkit - } - } - } - } - } - - public void m(World world, int i, int j, int k) { - int l = world.getData(i, j, k) + MathHelper.nextInt(world.random, 2, 5); - - if (l > 7) { - l = 7; - } - - CraftEventFactory.handleBlockGrowEvent(world, i, j, k, this, l); // CraftBukkit - } - - private float n(World world, int i, int j, int k) { - float f = 1.0F; - Block block = world.getType(i, j, k - 1); - Block block1 = world.getType(i, j, k + 1); - Block block2 = world.getType(i - 1, j, k); - Block block3 = world.getType(i + 1, j, k); - Block block4 = world.getType(i - 1, j, k - 1); - Block block5 = world.getType(i + 1, j, k - 1); - Block block6 = world.getType(i + 1, j, k + 1); - Block block7 = world.getType(i - 1, j, k + 1); - boolean flag = block2 == this || block3 == this; - boolean flag1 = block == this || block1 == this; - boolean flag2 = block4 == this || block5 == this || block6 == this || block7 == this; - - for (int l = i - 1; l <= i + 1; ++l) { - for (int i1 = k - 1; i1 <= k + 1; ++i1) { - Block block8 = world.getType(l, j - 1, i1); - float f1 = 0.0F; - - if (block8 == Blocks.SOIL) { - f1 = 1.0F; - if (world.getData(l, j - 1, i1) > 0) { - f1 = 3.0F; - } - } - - if (l != i || i1 != k) { - f1 /= 4.0F; - } - - f += f1; - } - } - - if (flag2 || flag && flag1) { - f /= 2.0F; - } - - return f; - } - - public void g() { - float f = 0.125F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, 0.25F, 0.5F + f); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.maxY = (double) ((float) (iblockaccess.getData(i, j, k) * 2 + 2) / 16.0F); - float f = 0.125F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, (float) this.maxY, 0.5F + f); - } - - public int b() { - return 19; - } - - public void dropNaturally(World world, int i, int j, int k, int l, float f, int i1) { - super.dropNaturally(world, i, j, k, l, f, i1); - if (!world.isStatic) { - Item item = null; - - if (this.blockFruit == Blocks.PUMPKIN) { - item = Items.PUMPKIN_SEEDS; - } - - if (this.blockFruit == Blocks.MELON) { - item = Items.MELON_SEEDS; - } - - for (int j1 = 0; j1 < 3; ++j1) { - if (world.random.nextInt(15) <= l) { - this.a(world, i, j, k, new ItemStack(item)); - } - } - } - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 1; - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - return world.getData(i, j, k) != 7; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - this.m(world, i, j, k); - } -} diff --git a/src/main/java/net/minecraft/server/BlockTallPlant.java b/src/main/java/net/minecraft/server/BlockTallPlant.java deleted file mode 100644 index f8adc614..00000000 --- a/src/main/java/net/minecraft/server/BlockTallPlant.java +++ /dev/null @@ -1,160 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class BlockTallPlant extends BlockPlant implements IBlockFragilePlantElement { - - public static final String[] a = new String[] { "sunflower", "syringa", "grass", "fern", "rose", "paeonia"}; - - public BlockTallPlant() { - super(Material.PLANT); - this.c(0.0F); - this.a(h); - this.c("doublePlant"); - } - - public int b() { - return 40; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public int e(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - - return !c(l) ? l & 7 : iblockaccess.getData(i, j - 1, k) & 7; - } - - public boolean canPlace(World world, int i, int j, int k) { - return super.canPlace(world, i, j, k) && world.isEmpty(i, j + 1, k); - } - - protected void e(World world, int i, int j, int k) { - if (!this.j(world, i, j, k)) { - int l = world.getData(i, j, k); - - if (!c(l)) { - this.b(world, i, j, k, l, 0); - if (world.getType(i, j + 1, k) == this) { - world.setTypeAndData(i, j + 1, k, Blocks.AIR, 0, 2); - } - } - - world.setTypeAndData(i, j, k, Blocks.AIR, 0, 2); - } - } - - public boolean j(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - return c(l) ? world.getType(i, j - 1, k) == this : world.getType(i, j + 1, k) == this && super.j(world, i, j, k); - } - - public Item getDropType(int i, Random random, int j) { - if (c(i)) { - return null; - } else { - int k = d(i); - - return k != 3 && k != 2 ? Item.getItemOf(this) : null; - } - } - - public int getDropData(int i) { - return c(i) ? 0 : i & 7; - } - - public static boolean c(int i) { - return (i & 8) != 0; - } - - public static int d(int i) { - return i & 7; - } - - public void c(World world, int i, int j, int k, int l, int i1) { - world.setTypeAndData(i, j, k, this, l, i1); - org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockGrowEvent(world, i, j + 1, k, this, 8); // CraftBukkit - } - - public void postPlace(World world, int i, int j, int k, EntityLiving entityliving, ItemStack itemstack) { - int l = ((MathHelper.floor((double) (entityliving.yaw * 4.0F / 360.0F) + 0.5D) & 3) + 2) % 4; - - world.setTypeAndData(i, j + 1, k, this, 8 | l, 2); - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (world.isStatic || entityhuman.bF() == null || entityhuman.bF().getItem() != Items.SHEARS || c(l) || !this.b(world, i, j, k, l, entityhuman)) { - super.a(world, entityhuman, i, j, k, l); - } - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (c(l)) { - if (world.getType(i, j - 1, k) == this) { - if (!entityhuman.abilities.canInstantlyBuild) { - int i1 = world.getData(i, j - 1, k); - int j1 = d(i1); - - if (j1 != 3 && j1 != 2) { - world.setAir(i, j - 1, k, true); - } else { - if (!world.isStatic && entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - this.b(world, i, j, k, i1, entityhuman); - } - - world.setAir(i, j - 1, k); - } - } else { - world.setAir(i, j - 1, k); - } - } - } else if (entityhuman.abilities.canInstantlyBuild && world.getType(i, j + 1, k) == this) { - world.setTypeAndData(i, j + 1, k, Blocks.AIR, 0, 2); - } - - super.a(world, i, j, k, l, entityhuman); - } - - private boolean b(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - int i1 = d(l); - - if (i1 != 3 && i1 != 2) { - return false; - } else { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - byte b0 = 1; - - if (i1 == 3) { - b0 = 2; - } - - this.a(world, i, j, k, new ItemStack(Blocks.LONG_GRASS, 2, b0)); - return true; - } - } - - public int getDropData(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - - return c(l) ? d(world.getData(i, j - 1, k)) : d(l); - } - - public boolean a(World world, int i, int j, int k, boolean flag) { - int l = this.e((IBlockAccess) world, i, j, k); - - return l != 2 && l != 3; - } - - public boolean a(World world, Random random, int i, int j, int k) { - return true; - } - - public void b(World world, Random random, int i, int j, int k) { - int l = this.e((IBlockAccess) world, i, j, k); - - this.a(world, i, j, k, new ItemStack(this, 1, l)); - } -} diff --git a/src/main/java/net/minecraft/server/BlockTrapdoor.java b/src/main/java/net/minecraft/server/BlockTrapdoor.java deleted file mode 100644 index ecc429ea..00000000 --- a/src/main/java/net/minecraft/server/BlockTrapdoor.java +++ /dev/null @@ -1,212 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockTrapdoor extends Block { - - protected BlockTrapdoor(Material material) { - super(material); - float f = 0.5F; - float f1 = 1.0F; - - this.a(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f1, 0.5F + f); - this.a(CreativeModeTab.d); - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public boolean b(IBlockAccess iblockaccess, int i, int j, int k) { - return !d(iblockaccess.getData(i, j, k)); - } - - public int b() { - return 0; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k); - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - this.b(iblockaccess.getData(i, j, k)); - } - - public void g() { - float f = 0.1875F; - - this.a(0.0F, 0.5F - f / 2.0F, 0.0F, 1.0F, 0.5F + f / 2.0F, 1.0F); - } - - public void b(int i) { - float f = 0.1875F; - - if ((i & 8) != 0) { - this.a(0.0F, 1.0F - f, 0.0F, 1.0F, 1.0F, 1.0F); - } else { - this.a(0.0F, 0.0F, 0.0F, 1.0F, f, 1.0F); - } - - if (d(i)) { - if ((i & 3) == 0) { - this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F); - } - - if ((i & 3) == 1) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f); - } - - if ((i & 3) == 2) { - this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - if ((i & 3) == 3) { - this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F); - } - } - } - - public void attack(World world, int i, int j, int k, EntityHuman entityhuman) {} - - public boolean interact(World world, int i, int j, int k, EntityHuman entityhuman, int l, float f, float f1, float f2) { - if (this.material == Material.ORE) { - return true; - } else { - int i1 = world.getData(i, j, k); - - world.setData(i, j, k, i1 ^ 4, 2); - world.a(entityhuman, 1003, i, j, k, 0); - return true; - } - } - - public void setOpen(World world, int i, int j, int k, boolean flag) { - int l = world.getData(i, j, k); - boolean flag1 = (l & 4) > 0; - - if (flag1 != flag) { - world.setData(i, j, k, l ^ 4, 2); - world.a((EntityHuman) null, 1003, i, j, k, 0); - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic) { - int l = world.getData(i, j, k); - int i1 = i; - int j1 = k; - - if ((l & 3) == 0) { - j1 = k + 1; - } - - if ((l & 3) == 1) { - --j1; - } - - if ((l & 3) == 2) { - i1 = i + 1; - } - - if ((l & 3) == 3) { - --i1; - } - - if (!a(world.getType(i1, j, j1))) { - world.setAir(i, j, k); - this.b(world, i, j, k, l, 0); - } - - boolean flag = world.isBlockIndirectlyPowered(i, j, k); - - if (flag || block.isPowerSource()) { - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - org.bukkit.block.Block bblock = bworld.getBlockAt(i, j, k); - - int power = bblock.getBlockPower(); - int oldPower = (world.getData(i, j, k) & 4) > 0 ? 15 : 0; - - if (oldPower == 0 ^ power == 0 || block.isPowerSource()) { - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bblock, oldPower, power); - world.getServer().getPluginManager().callEvent(eventRedstone); - flag = eventRedstone.getNewCurrent() > 0; - } - // CraftBukkit end - - this.setOpen(world, i, j, k, flag); - } - } - } - - public MovingObjectPosition a(World world, int i, int j, int k, Vec3D vec3d, Vec3D vec3d1) { - this.updateShape(world, i, j, k); - return super.a(world, i, j, k, vec3d, vec3d1); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - int j1 = 0; - - if (l == 2) { - j1 = 0; - } - - if (l == 3) { - j1 = 1; - } - - if (l == 4) { - j1 = 2; - } - - if (l == 5) { - j1 = 3; - } - - if (l != 1 && l != 0 && f1 > 0.5F) { - j1 |= 8; - } - - return j1; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - if (l == 0) { - return false; - } else if (l == 1) { - return false; - } else { - if (l == 2) { - ++k; - } - - if (l == 3) { - --k; - } - - if (l == 4) { - ++i; - } - - if (l == 5) { - --i; - } - - return a(world.getType(i, j, k)); - } - } - - public static boolean d(int i) { - return (i & 4) != 0; - } - - private static boolean a(Block block) { - return block.material.k() && block.d() || block == Blocks.GLOWSTONE || block instanceof BlockStepAbstract || block instanceof BlockStairs; - } -} diff --git a/src/main/java/net/minecraft/server/BlockTripwire.java b/src/main/java/net/minecraft/server/BlockTripwire.java deleted file mode 100644 index cf84d794..00000000 --- a/src/main/java/net/minecraft/server/BlockTripwire.java +++ /dev/null @@ -1,201 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit - -public class BlockTripwire extends Block { - - public BlockTripwire() { - super(Material.ORIENTABLE); - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.15625F, 1.0F); - this.a(true); - } - - public int a(World world) { - return 10; - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 30; - } - - public Item getDropType(int i, Random random, int j) { - return Items.STRING; - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - int l = world.getData(i, j, k); - boolean flag = (l & 2) == 2; - boolean flag1 = !World.a((IBlockAccess) world, i, j - 1, k); - - if (flag != flag1) { - this.b(world, i, j, k, l, 0); - world.setAir(i, j, k); - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k); - boolean flag = (l & 4) == 4; - boolean flag1 = (l & 2) == 2; - - if (!flag1) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.09375F, 1.0F); - } else if (!flag) { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); - } else { - this.a(0.0F, 0.0625F, 0.0F, 1.0F, 0.15625F, 1.0F); - } - } - - public void onPlace(World world, int i, int j, int k) { - int l = World.a((IBlockAccess) world, i, j - 1, k) ? 0 : 2; - - world.setData(i, j, k, l, 3); - this.a(world, i, j, k, l); - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - this.a(world, i, j, k, l | 1); - } - - public void a(World world, int i, int j, int k, int l, EntityHuman entityhuman) { - if (!world.isStatic) { - if (entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - world.setData(i, j, k, l | 8, 4); - } - } - } - - private void a(World world, int i, int j, int k, int l) { - int i1 = 0; - - while (i1 < 2) { - int j1 = 1; - - while (true) { - if (j1 < 42) { - int k1 = i + Direction.a[i1] * j1; - int l1 = k + Direction.b[i1] * j1; - Block block = world.getType(k1, j, l1); - - if (block == Blocks.TRIPWIRE_SOURCE) { - int i2 = world.getData(k1, j, l1) & 3; - - if (i2 == Direction.f[i1]) { - Blocks.TRIPWIRE_SOURCE.a(world, k1, j, l1, false, world.getData(k1, j, l1), true, j1, l); - } - } else if (block == Blocks.TRIPWIRE) { - ++j1; - continue; - } - } - - ++i1; - break; - } - } - } - - public void a(World world, int i, int j, int k, Entity entity) { - if (!world.isStatic) { - if ((world.getData(i, j, k) & 1) != 1) { - this.e(world, i, j, k); - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic) { - if ((world.getData(i, j, k) & 1) == 1) { - this.e(world, i, j, k); - } - } - } - - private void e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - boolean flag = (l & 1) == 1; - boolean flag1 = false; - List list = world.getEntities((Entity) null, AxisAlignedBB.a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ)); - - if (!list.isEmpty()) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - if (!entity.az()) { - flag1 = true; - break; - } - } - } - - // CraftBukkit start - Call interact even when triggering connected tripwire - if (flag != flag1 && flag1 && (world.getData(i, j, k) & 4) == 4) { - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); - org.bukkit.block.Block block = bworld.getBlockAt(i, j, k); - boolean allowed = false; - - // If all of the events are cancelled block the tripwire trigger, else allow - for (Object object : list) { - if (object != null) { - org.bukkit.event.Cancellable cancellable; - - if (object instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else if (object instanceof Entity) { - cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); - manager.callEvent((EntityInteractEvent) cancellable); - } else { - continue; - } - - if (!cancellable.isCancelled()) { - allowed = true; - break; - } - } - } - - if (!allowed) { - return; - } - } - // CraftBukkit end - - if (flag1 && !flag) { - l |= 1; - } - - if (!flag1 && flag) { - l &= -2; - } - - if (flag1 != flag) { - world.setData(i, j, k, l, 3); - this.a(world, i, j, k, l); - } - - if (flag1) { - world.a(i, j, k, this, this.a(world)); - } - } -} diff --git a/src/main/java/net/minecraft/server/BlockTripwireHook.java b/src/main/java/net/minecraft/server/BlockTripwireHook.java deleted file mode 100644 index c2342658..00000000 --- a/src/main/java/net/minecraft/server/BlockTripwireHook.java +++ /dev/null @@ -1,300 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit - -public class BlockTripwireHook extends Block { - - public BlockTripwireHook() { - super(Material.ORIENTABLE); - this.a(CreativeModeTab.d); - this.a(true); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public int b() { - return 29; - } - - public int a(World world) { - return 10; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - return l == 2 && world.getType(i, j, k + 1).r() ? true : (l == 3 && world.getType(i, j, k - 1).r() ? true : (l == 4 && world.getType(i + 1, j, k).r() ? true : l == 5 && world.getType(i - 1, j, k).r())); - } - - public boolean canPlace(World world, int i, int j, int k) { - return world.getType(i - 1, j, k).r() ? true : (world.getType(i + 1, j, k).r() ? true : (world.getType(i, j, k - 1).r() ? true : world.getType(i, j, k + 1).r())); - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - byte b0 = 0; - - if (l == 2 && world.c(i, j, k + 1, true)) { - b0 = 2; - } - - if (l == 3 && world.c(i, j, k - 1, true)) { - b0 = 0; - } - - if (l == 4 && world.c(i + 1, j, k, true)) { - b0 = 1; - } - - if (l == 5 && world.c(i - 1, j, k, true)) { - b0 = 3; - } - - return b0; - } - - public void postPlace(World world, int i, int j, int k, int l) { - this.a(world, i, j, k, false, l, false, -1, 0); - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (block != this) { - if (this.e(world, i, j, k)) { - int l = world.getData(i, j, k); - int i1 = l & 3; - boolean flag = false; - - if (!world.getType(i - 1, j, k).r() && i1 == 3) { - flag = true; - } - - if (!world.getType(i + 1, j, k).r() && i1 == 1) { - flag = true; - } - - if (!world.getType(i, j, k - 1).r() && i1 == 0) { - flag = true; - } - - if (!world.getType(i, j, k + 1).r() && i1 == 2) { - flag = true; - } - - if (flag) { - this.b(world, i, j, k, l, 0); - world.setAir(i, j, k); - } - } - } - } - - public void a(World world, int i, int j, int k, boolean flag, int l, boolean flag1, int i1, int j1) { - int k1 = l & 3; - boolean flag2 = (l & 4) == 4; - boolean flag3 = (l & 8) == 8; - boolean flag4 = !flag; - boolean flag5 = false; - boolean flag6 = !World.a((IBlockAccess) world, i, j - 1, k); - int l1 = Direction.a[k1]; - int i2 = Direction.b[k1]; - int j2 = 0; - int[] aint = new int[42]; - - int k2; - int l2; - int i3; - int j3; - - for (l2 = 1; l2 < 42; ++l2) { - k2 = i + l1 * l2; - i3 = k + i2 * l2; - Block block = world.getType(k2, j, i3); - - if (block == Blocks.TRIPWIRE_SOURCE) { - j3 = world.getData(k2, j, i3); - if ((j3 & 3) == Direction.f[k1]) { - j2 = l2; - } - break; - } - - if (block != Blocks.TRIPWIRE && l2 != i1) { - aint[l2] = -1; - flag4 = false; - } else { - j3 = l2 == i1 ? j1 : world.getData(k2, j, i3); - boolean flag7 = (j3 & 8) != 8; - boolean flag8 = (j3 & 1) == 1; - boolean flag9 = (j3 & 2) == 2; - - flag4 &= flag9 == flag6; - flag5 |= flag7 && flag8; - aint[l2] = j3; - if (l2 == i1) { - world.a(i, j, k, this, this.a(world)); - flag4 &= flag7; - } - } - } - - flag4 &= j2 > 1; - flag5 &= flag4; - l2 = (flag4 ? 4 : 0) | (flag5 ? 8 : 0); - l = k1 | l2; - int k3; - - if (j2 > 0) { - k2 = i + l1 * j2; - i3 = k + i2 * j2; - k3 = Direction.f[k1]; - world.setData(k2, j, i3, k3 | l2, 3); - this.a(world, k2, j, i3, k3); - this.a(world, k2, j, i3, flag4, flag5, flag2, flag3); - } - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - - BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, 15, 0); - world.getServer().getPluginManager().callEvent(eventRedstone); - - if (eventRedstone.getNewCurrent() > 0) { - return; - } - // CraftBukkit end - - this.a(world, i, j, k, flag4, flag5, flag2, flag3); - if (!flag) { - world.setData(i, j, k, l, 3); - if (flag1) { - this.a(world, i, j, k, k1); - } - } - - if (flag2 != flag4) { - for (k2 = 1; k2 < j2; ++k2) { - i3 = i + l1 * k2; - k3 = k + i2 * k2; - j3 = aint[k2]; - if (j3 >= 0) { - if (flag4) { - j3 |= 4; - } else { - j3 &= -5; - } - - world.setData(i3, j, k3, j3, 3); - } - } - } - } - - public void a(World world, int i, int j, int k, Random random) { - this.a(world, i, j, k, false, world.getData(i, j, k), true, -1, 0); - } - - private void a(World world, int i, int j, int k, boolean flag, boolean flag1, boolean flag2, boolean flag3) { - if (flag1 && !flag3) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.4F, 0.6F); - } else if (!flag1 && flag3) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.4F, 0.5F); - } else if (flag && !flag2) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.click", 0.4F, 0.7F); - } else if (!flag && flag2) { - world.makeSound((double) i + 0.5D, (double) j + 0.1D, (double) k + 0.5D, "random.bowhit", 0.4F, 1.2F / (world.random.nextFloat() * 0.2F + 0.9F)); - } - } - - private void a(World world, int i, int j, int k, int l) { - world.applyPhysics(i, j, k, this); - if (l == 3) { - world.applyPhysics(i - 1, j, k, this); - } else if (l == 1) { - world.applyPhysics(i + 1, j, k, this); - } else if (l == 0) { - world.applyPhysics(i, j, k - 1, this); - } else if (l == 2) { - world.applyPhysics(i, j, k + 1, this); - } - } - - private boolean e(World world, int i, int j, int k) { - if (!this.canPlace(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - return false; - } else { - return true; - } - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - int l = iblockaccess.getData(i, j, k) & 3; - float f = 0.1875F; - - if (l == 3) { - this.a(0.0F, 0.2F, 0.5F - f, f * 2.0F, 0.8F, 0.5F + f); - } else if (l == 1) { - this.a(1.0F - f * 2.0F, 0.2F, 0.5F - f, 1.0F, 0.8F, 0.5F + f); - } else if (l == 0) { - this.a(0.5F - f, 0.2F, 0.0F, 0.5F + f, 0.8F, f * 2.0F); - } else if (l == 2) { - this.a(0.5F - f, 0.2F, 1.0F - f * 2.0F, 0.5F + f, 0.8F, 1.0F); - } - } - - public void remove(World world, int i, int j, int k, Block block, int l) { - boolean flag = (l & 4) == 4; - boolean flag1 = (l & 8) == 8; - - if (flag || flag1) { - this.a(world, i, j, k, true, l, false, -1, 0); - } - - if (flag1) { - world.applyPhysics(i, j, k, this); - int i1 = l & 3; - - if (i1 == 3) { - world.applyPhysics(i - 1, j, k, this); - } else if (i1 == 1) { - world.applyPhysics(i + 1, j, k, this); - } else if (i1 == 0) { - world.applyPhysics(i, j, k - 1, this); - } else if (i1 == 2) { - world.applyPhysics(i, j, k + 1, this); - } - } - - super.remove(world, i, j, k, block, l); - } - - public int b(IBlockAccess iblockaccess, int i, int j, int k, int l) { - return (iblockaccess.getData(i, j, k) & 8) == 8 ? 15 : 0; - } - - public int c(IBlockAccess iblockaccess, int i, int j, int k, int l) { - int i1 = iblockaccess.getData(i, j, k); - - if ((i1 & 8) != 8) { - return 0; - } else { - int j1 = i1 & 3; - - return j1 == 2 && l == 2 ? 15 : (j1 == 0 && l == 3 ? 15 : (j1 == 1 && l == 4 ? 15 : (j1 == 3 && l == 5 ? 15 : 0))); - } - } - - public boolean isPowerSource() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/BlockVine.java b/src/main/java/net/minecraft/server/BlockVine.java deleted file mode 100644 index ed007140..00000000 --- a/src/main/java/net/minecraft/server/BlockVine.java +++ /dev/null @@ -1,304 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class BlockVine extends Block { - - public BlockVine() { - super(Material.REPLACEABLE_PLANT); - this.a(true); - this.a(CreativeModeTab.c); - } - - public void g() { - this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F); - } - - public int b() { - return 20; - } - - public boolean c() { - return false; - } - - public boolean d() { - return false; - } - - public void updateShape(IBlockAccess iblockaccess, int i, int j, int k) { - float f = 0.0625F; - int l = iblockaccess.getData(i, j, k); - float f1 = 1.0F; - float f2 = 1.0F; - float f3 = 1.0F; - float f4 = 0.0F; - float f5 = 0.0F; - float f6 = 0.0F; - boolean flag = l > 0; - - if ((l & 2) != 0) { - f4 = Math.max(f4, 0.0625F); - f1 = 0.0F; - f2 = 0.0F; - f5 = 1.0F; - f3 = 0.0F; - f6 = 1.0F; - flag = true; - } - - if ((l & 8) != 0) { - f1 = Math.min(f1, 0.9375F); - f4 = 1.0F; - f2 = 0.0F; - f5 = 1.0F; - f3 = 0.0F; - f6 = 1.0F; - flag = true; - } - - if ((l & 4) != 0) { - f6 = Math.max(f6, 0.0625F); - f3 = 0.0F; - f1 = 0.0F; - f4 = 1.0F; - f2 = 0.0F; - f5 = 1.0F; - flag = true; - } - - if ((l & 1) != 0) { - f3 = Math.min(f3, 0.9375F); - f6 = 1.0F; - f1 = 0.0F; - f4 = 1.0F; - f2 = 0.0F; - f5 = 1.0F; - flag = true; - } - - if (!flag && this.a(iblockaccess.getType(i, j + 1, k))) { - f2 = Math.min(f2, 0.9375F); - f5 = 1.0F; - f1 = 0.0F; - f4 = 1.0F; - f3 = 0.0F; - f6 = 1.0F; - } - - this.a(f1, f2, f3, f4, f5, f6); - } - - public AxisAlignedBB a(World world, int i, int j, int k) { - return null; - } - - public boolean canPlace(World world, int i, int j, int k, int l) { - switch (l) { - case 1: - return this.a(world.getType(i, j + 1, k)); - - case 2: - return this.a(world.getType(i, j, k + 1)); - - case 3: - return this.a(world.getType(i, j, k - 1)); - - case 4: - return this.a(world.getType(i + 1, j, k)); - - case 5: - return this.a(world.getType(i - 1, j, k)); - - default: - return false; - } - } - - private boolean a(Block block) { - return block.d() && block.material.isSolid(); - } - - private boolean e(World world, int i, int j, int k) { - int l = world.getData(i, j, k); - int i1 = l; - - if (l > 0) { - for (int j1 = 0; j1 <= 3; ++j1) { - int k1 = 1 << j1; - - if ((l & k1) != 0 && !this.a(world.getType(i + Direction.a[j1], j, k + Direction.b[j1])) && (world.getType(i, j + 1, k) != this || (world.getData(i, j + 1, k) & k1) == 0)) { - i1 &= ~k1; - } - } - } - - if (i1 == 0 && !this.a(world.getType(i, j + 1, k))) { - return false; - } else { - if (i1 != l) { - world.setData(i, j, k, i1, 2); - } - - return true; - } - } - - public void doPhysics(World world, int i, int j, int k, Block block) { - if (!world.isStatic && !this.e(world, i, j, k)) { - this.b(world, i, j, k, world.getData(i, j, k), 0); - world.setAir(i, j, k); - } - } - - public void a(World world, int i, int j, int k, Random random) { - if (!world.isStatic && world.random.nextInt(4) == 0) { - byte b0 = 4; - int l = 5; - boolean flag = false; - - int i1; - int j1; - int k1; - - label134: - for (i1 = i - b0; i1 <= i + b0; ++i1) { - for (j1 = k - b0; j1 <= k + b0; ++j1) { - for (k1 = j - 1; k1 <= j + 1; ++k1) { - if (world.getType(i1, k1, j1) == this) { - --l; - if (l <= 0) { - flag = true; - break label134; - } - } - } - } - } - - i1 = world.getData(i, j, k); - j1 = world.random.nextInt(6); - k1 = Direction.e[j1]; - int l1; - - if (j1 == 1 && j < 255 && world.isEmpty(i, j + 1, k)) { - if (flag) { - return; - } - - int i2 = world.random.nextInt(16) & i1; - - if (i2 > 0) { - for (l1 = 0; l1 <= 3; ++l1) { - if (!this.a(world.getType(i + Direction.a[l1], j + 1, k + Direction.b[l1]))) { - i2 &= ~(1 << l1); - } - } - - if (i2 > 0) { - // CraftBukkit start - Call BlockSpreadEvent - org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j + 1, k); - CraftEventFactory.handleBlockSpreadEvent(block, source, this, l1); - // CraftBukkit end - } - } - } else { - Block block; - int j2; - - if (j1 >= 2 && j1 <= 5 && (i1 & 1 << k1) == 0) { - if (flag) { - return; - } - - block = world.getType(i + Direction.a[k1], j, k + Direction.b[k1]); - if (block.material == Material.AIR) { - l1 = k1 + 1 & 3; - j2 = k1 + 3 & 3; - - // CraftBukkit start - Call BlockSpreadEvent - org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i + Direction.a[k1], j, k + Direction.b[k1]); - if ((i1 & 1 << l1) != 0 && this.a(world.getType(i + Direction.a[k1] + Direction.a[l1], j, k + Direction.b[k1] + Direction.b[l1]))) { - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << l1); - } else if ((i1 & 1 << j2) != 0 && this.a(world.getType(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]))) { - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << j2); - } else if ((i1 & 1 << l1) != 0 && world.isEmpty(i + Direction.a[k1] + Direction.a[l1], j, k + Direction.b[k1] + Direction.b[l1]) && this.a(world.getType(i + Direction.a[l1], j, k + Direction.b[l1]))) { - bukkitBlock = world.getWorld().getBlockAt(i + Direction.a[k1] + Direction.a[l1], j, k + Direction.b[k1] + Direction.b[l1]); - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << (k1 + 2 & 3)); - } else if ((i1 & 1 << j2) != 0 && world.isEmpty(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]) && this.a(world.getType(i + Direction.a[j2], j, k + Direction.b[j2]))) { - bukkitBlock = world.getWorld().getBlockAt(i + Direction.a[k1] + Direction.a[j2], j, k + Direction.b[k1] + Direction.b[j2]); - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 1 << (k1 + 2 & 3)); - } else if (this.a(world.getType(i + Direction.a[k1], j + 1, k + Direction.b[k1]))) { - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, 0); - } - // CraftBukkit end - } else if (block.material.k() && block.d()) { - world.setData(i, j, k, i1 | 1 << k1, 2); - } - } else if (j > 1) { - block = world.getType(i, j - 1, k); - if (block.material == Material.AIR) { - l1 = world.random.nextInt(16) & i1; - if (l1 > 0) { - // CraftBukkit start - Call BlockSpreadEvent - org.bukkit.block.Block source = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(i, j - 1, k); - CraftEventFactory.handleBlockSpreadEvent(bukkitBlock, source, this, l1); - // CraftBukkit end - } - } else if (block == this) { - l1 = world.random.nextInt(16) & i1; - j2 = world.getData(i, j - 1, k); - if (j2 != (j2 | l1)) { - world.setData(i, j - 1, k, j2 | l1, 2); - } - } - } - } - } - } - - public int getPlacedData(World world, int i, int j, int k, int l, float f, float f1, float f2, int i1) { - byte b0 = 0; - - switch (l) { - case 2: - b0 = 1; - break; - - case 3: - b0 = 4; - break; - - case 4: - b0 = 8; - break; - - case 5: - b0 = 2; - } - - return b0 != 0 ? b0 : i1; - } - - public Item getDropType(int i, Random random, int j) { - return null; - } - - public int a(Random random) { - return 0; - } - - public void a(World world, EntityHuman entityhuman, int i, int j, int k, int l) { - if (!world.isStatic && entityhuman.bF() != null && entityhuman.bF().getItem() == Items.SHEARS) { - entityhuman.a(StatisticList.MINE_BLOCK_COUNT[Block.getId(this)], 1); - this.a(world, i, j, k, new ItemStack(Blocks.VINE, 1, 0)); - } else { - super.a(world, entityhuman, i, j, k, l); - } - } -} diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java deleted file mode 100644 index 3ac0ae47..00000000 --- a/src/main/java/net/minecraft/server/Chunk.java +++ /dev/null @@ -1,1093 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.Bukkit; // CraftBukkit - -public class Chunk { - - private static final Logger t = LogManager.getLogger(); - public static boolean a; - private ChunkSection[] sections; - private byte[] v; - public int[] b; - public boolean[] c; - public boolean d; - public World world; - public int[] heightMap; - public final int locX; - public final int locZ; - private boolean w; - public Map tileEntities; - public List[] entitySlices; - public boolean done; - public boolean lit; - public boolean m; - public boolean n; - public boolean o; - public long lastSaved; - public boolean q; - public int r; - public long s; - private int x; - - // CraftBukkit start - Neighbor loaded cache for chunk lighting and entity ticking - private int neighbors = 0x1 << 12; - - public boolean areNeighborsLoaded(final int radius) { - switch(radius) { - case 2: - return this.neighbors == Integer.MAX_VALUE >> 6; - case 1: - final int mask = - // x z offset x z offset x z offset - ( 0x1 << (1 * 5 + 1 + 12) ) | ( 0x1 << (0 * 5 + 1 + 12) ) | ( 0x1 << (-1 * 5 + 1 + 12) ) | - ( 0x1 << (1 * 5 + 0 + 12) ) | ( 0x1 << (0 * 5 + 0 + 12) ) | ( 0x1 << (-1 * 5 + 0 + 12) ) | - ( 0x1 << (1 * 5 + -1 + 12) ) | ( 0x1 << (0 * 5 + -1 + 12) ) | ( 0x1 << (-1 * 5 + -1 + 12) ); - return (this.neighbors & mask) == mask; - default: - throw new UnsupportedOperationException(String.valueOf(radius)); - } - } - - public void setNeighborLoaded(final int x, final int z) { - this.neighbors |= 0x1 << (x * 5 + 12 + z); - } - - public void setNeighborUnloaded(final int x, final int z) { - this.neighbors &= ~(0x1 << (x * 5 + 12 + z)); - } - // CraftBukkit end - - public Chunk(World world, int i, int j) { - this.sections = new ChunkSection[16]; - this.v = new byte[256]; - this.b = new int[256]; - this.c = new boolean[256]; - this.tileEntities = new HashMap(); - this.x = 4096; - this.entitySlices = new List[16]; - this.world = world; - this.locX = i; - this.locZ = j; - this.heightMap = new int[256]; - - for (int k = 0; k < this.entitySlices.length; ++k) { - this.entitySlices[k] = new org.bukkit.craftbukkit.util.UnsafeList(); // CraftBukkit - ArrayList -> UnsafeList - } - - Arrays.fill(this.b, -999); - Arrays.fill(this.v, (byte) -1); - - // CraftBukkit start - if (!(this instanceof EmptyChunk)) { - this.bukkitChunk = new org.bukkit.craftbukkit.CraftChunk(this); - } - } - - public org.bukkit.Chunk bukkitChunk; - public boolean mustSave; - // CraftBukkit end - - public Chunk(World world, Block[] ablock, int i, int j) { - this(world, i, j); - int k = ablock.length / 256; - boolean flag = !world.worldProvider.g; - - for (int l = 0; l < 16; ++l) { - for (int i1 = 0; i1 < 16; ++i1) { - for (int j1 = 0; j1 < k; ++j1) { - Block block = ablock[l << 11 | i1 << 7 | j1]; - - if (block != null && block.getMaterial() != Material.AIR) { - int k1 = j1 >> 4; - - if (this.sections[k1] == null) { - this.sections[k1] = new ChunkSection(k1 << 4, flag); - } - - this.sections[k1].setTypeId(l, j1 & 15, i1, block); - } - } - } - } - } - - public Chunk(World world, Block[] ablock, byte[] abyte, int i, int j) { - this(world, i, j); - int k = ablock.length / 256; - boolean flag = !world.worldProvider.g; - - for (int l = 0; l < 16; ++l) { - for (int i1 = 0; i1 < 16; ++i1) { - for (int j1 = 0; j1 < k; ++j1) { - int k1 = l * k * 16 | i1 * k | j1; - Block block = ablock[k1]; - - if (block != null && block != Blocks.AIR) { - int l1 = j1 >> 4; - - if (this.sections[l1] == null) { - this.sections[l1] = new ChunkSection(l1 << 4, flag); - } - - this.sections[l1].setTypeId(l, j1 & 15, i1, block); - this.sections[l1].setData(l, j1 & 15, i1, abyte[k1]); - } - } - } - } - } - - public boolean a(int i, int j) { - return i == this.locX && j == this.locZ; - } - - public int b(int i, int j) { - return this.heightMap[j << 4 | i]; - } - - public int h() { - for (int i = this.sections.length - 1; i >= 0; --i) { - if (this.sections[i] != null) { - return this.sections[i].getYPosition(); - } - } - - return 0; - } - - public ChunkSection[] getSections() { - return this.sections; - } - - public void initLighting() { - int i = this.h(); - - this.r = Integer.MAX_VALUE; - - for (int j = 0; j < 16; ++j) { - int k = 0; - - while (k < 16) { - this.b[j + (k << 4)] = -999; - int l = i + 16 - 1; - - while (true) { - if (l > 0) { - if (this.b(j, l - 1, k) == 0) { - --l; - continue; - } - - this.heightMap[k << 4 | j] = l; - if (l < this.r) { - this.r = l; - } - } - - if (!this.world.worldProvider.g) { - l = 15; - int i1 = i + 16 - 1; - - do { - int j1 = this.b(j, i1, k); - - if (j1 == 0 && l != 15) { - j1 = 1; - } - - l -= j1; - if (l > 0) { - ChunkSection chunksection = this.sections[i1 >> 4]; - - if (chunksection != null) { - chunksection.setSkyLight(j, i1 & 15, k, l); - this.world.m((this.locX << 4) + j, i1, (this.locZ << 4) + k); - } - } - - --i1; - } while (i1 > 0 && l > 0); - } - - ++k; - break; - } - } - } - - this.n = true; - } - - private void e(int i, int j) { - this.c[i + j * 16] = true; - this.w = true; - } - - private void c(boolean flag) { - this.world.methodProfiler.a("recheckGaps"); - if (this.world.areChunksLoaded(this.locX * 16 + 8, 0, this.locZ * 16 + 8, 16)) { - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - if (this.c[i + j * 16]) { - this.c[i + j * 16] = false; - int k = this.b(i, j); - int l = this.locX * 16 + i; - int i1 = this.locZ * 16 + j; - int j1 = this.world.g(l - 1, i1); - int k1 = this.world.g(l + 1, i1); - int l1 = this.world.g(l, i1 - 1); - int i2 = this.world.g(l, i1 + 1); - - if (k1 < j1) { - j1 = k1; - } - - if (l1 < j1) { - j1 = l1; - } - - if (i2 < j1) { - j1 = i2; - } - - this.g(l, i1, j1); - this.g(l - 1, i1, k); - this.g(l + 1, i1, k); - this.g(l, i1 - 1, k); - this.g(l, i1 + 1, k); - if (flag) { - this.world.methodProfiler.b(); - return; - } - } - } - } - - this.w = false; - } - - this.world.methodProfiler.b(); - } - - private void g(int i, int j, int k) { - int l = this.world.getHighestBlockYAt(i, j); - - if (l > k) { - this.c(i, j, k, l + 1); - } else if (l < k) { - this.c(i, j, l, k + 1); - } - } - - private void c(int i, int j, int k, int l) { - if (l > k && this.world.areChunksLoaded(i, 0, j, 16)) { - for (int i1 = k; i1 < l; ++i1) { - this.world.c(EnumSkyBlock.SKY, i, i1, j); - } - - this.n = true; - } - } - - private void h(int i, int j, int k) { - int l = this.heightMap[k << 4 | i] & 255; - int i1 = l; - - if (j > l) { - i1 = j; - } - - while (i1 > 0 && this.b(i, i1 - 1, k) == 0) { - --i1; - } - - if (i1 != l) { - this.world.b(i + this.locX * 16, k + this.locZ * 16, i1, l); - this.heightMap[k << 4 | i] = i1; - int j1 = this.locX * 16 + i; - int k1 = this.locZ * 16 + k; - int l1; - int i2; - - if (!this.world.worldProvider.g) { - ChunkSection chunksection; - - if (i1 < l) { - for (l1 = i1; l1 < l; ++l1) { - chunksection = this.sections[l1 >> 4]; - if (chunksection != null) { - chunksection.setSkyLight(i, l1 & 15, k, 15); - this.world.m((this.locX << 4) + i, l1, (this.locZ << 4) + k); - } - } - } else { - for (l1 = l; l1 < i1; ++l1) { - chunksection = this.sections[l1 >> 4]; - if (chunksection != null) { - chunksection.setSkyLight(i, l1 & 15, k, 0); - this.world.m((this.locX << 4) + i, l1, (this.locZ << 4) + k); - } - } - } - - l1 = 15; - - while (i1 > 0 && l1 > 0) { - --i1; - i2 = this.b(i, i1, k); - if (i2 == 0) { - i2 = 1; - } - - l1 -= i2; - if (l1 < 0) { - l1 = 0; - } - - ChunkSection chunksection1 = this.sections[i1 >> 4]; - - if (chunksection1 != null) { - chunksection1.setSkyLight(i, i1 & 15, k, l1); - } - } - } - - l1 = this.heightMap[k << 4 | i]; - i2 = l; - int j2 = l1; - - if (l1 < l) { - i2 = l1; - j2 = l; - } - - if (l1 < this.r) { - this.r = l1; - } - - if (!this.world.worldProvider.g) { - this.c(j1 - 1, k1, i2, j2); - this.c(j1 + 1, k1, i2, j2); - this.c(j1, k1 - 1, i2, j2); - this.c(j1, k1 + 1, i2, j2); - this.c(j1, k1, i2, j2); - } - - this.n = true; - } - } - - public int b(int i, int j, int k) { - return this.getType(i, j, k).k(); - } - - public Block getType(int i, int j, int k) { - Block block = Blocks.AIR; - - if (j >> 4 < this.sections.length) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection != null) { - try { - block = chunksection.getTypeId(i, j & 15, k); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Getting block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being got"); - - crashreportsystemdetails.a("Location", (Callable) (new CrashReportLocation(this, i, j, k))); - throw new ReportedException(crashreport); - } - } - } - - return block; - } - - public int getData(int i, int j, int k) { - if (j >> 4 >= this.sections.length) { - return 0; - } else { - ChunkSection chunksection = this.sections[j >> 4]; - - return chunksection != null ? chunksection.getData(i, j & 15, k) : 0; - } - } - - public boolean a(int i, int j, int k, Block block, int l) { - int i1 = k << 4 | i; - - if (j >= this.b[i1] - 1) { - this.b[i1] = -999; - } - - int j1 = this.heightMap[i1]; - Block block1 = this.getType(i, j, k); - int k1 = this.getData(i, j, k); - - if (block1 == block && k1 == l) { - return false; - } else { - ChunkSection chunksection = this.sections[j >> 4]; - boolean flag = false; - - if (chunksection == null) { - if (block == Blocks.AIR) { - return false; - } - - chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4, !this.world.worldProvider.g); - flag = j >= j1; - } - - int l1 = this.locX * 16 + i; - int i2 = this.locZ * 16 + k; - - if (!this.world.isStatic) { - block1.f(this.world, l1, j, i2, k1); - } - - // CraftBukkit start - Delay removing containers until after they're cleaned up - if (!(block1 instanceof IContainer)) { - chunksection.setTypeId(i, j & 15, k, block); - } - // CraftBukkit end - - if (!this.world.isStatic) { - block1.remove(this.world, l1, j, i2, block1, k1); - } else if (block1 instanceof IContainer && block1 != block) { - this.world.p(l1, j, i2); - } - - // CraftBukkit start - Remove containers now after cleanup - if (block1 instanceof IContainer) { - chunksection.setTypeId(i, j & 15, k, block); - } - // CraftBukkit end - - if (chunksection.getTypeId(i, j & 15, k) != block) { - return false; - } else { - chunksection.setData(i, j & 15, k, l); - if (flag) { - this.initLighting(); - } else { - int j2 = block.k(); - int k2 = block1.k(); - - if (j2 > 0) { - if (j >= j1) { - this.h(i, j + 1, k); - } - } else if (j == j1 - 1) { - this.h(i, j, k); - } - - if (j2 != k2 && (j2 < k2 || this.getBrightness(EnumSkyBlock.SKY, i, j, k) > 0 || this.getBrightness(EnumSkyBlock.BLOCK, i, j, k) > 0)) { - this.e(i, k); - } - } - - TileEntity tileentity; - - if (block1 instanceof IContainer) { - tileentity = this.e(i, j, k); - if (tileentity != null) { - tileentity.u(); - } - } - - // CraftBukkit - Don't place while processing the BlockPlaceEvent, unless it's a BlockContainer. Prevents blocks such as TNT from activating when cancelled. - if (!this.world.isStatic && (!this.world.captureBlockStates || block instanceof BlockContainer)) { - block.onPlace(this.world, l1, j, i2); - } - - if (block instanceof IContainer) { - - tileentity = this.e(i, j, k); - if (tileentity == null) { - tileentity = ((IContainer) block).a(this.world, l); - this.world.setTileEntity(l1, j, i2, tileentity); - } - - if (tileentity != null) { - tileentity.u(); - } - } - - this.n = true; - return true; - } - } - } - - public boolean a(int i, int j, int k, int l) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection == null) { - return false; - } else { - int i1 = chunksection.getData(i, j & 15, k); - - if (i1 == l) { - return false; - } else { - this.n = true; - chunksection.setData(i, j & 15, k, l); - if (chunksection.getTypeId(i, j & 15, k) instanceof IContainer) { - TileEntity tileentity = this.e(i, j, k); - - if (tileentity != null) { - tileentity.u(); - tileentity.g = l; - } - } - - return true; - } - } - } - - public int getBrightness(EnumSkyBlock enumskyblock, int i, int j, int k) { - ChunkSection chunksection = this.sections[j >> 4]; - - return chunksection == null ? (this.d(i, j, k) ? enumskyblock.c : 0) : (enumskyblock == EnumSkyBlock.SKY ? (this.world.worldProvider.g ? 0 : chunksection.getSkyLight(i, j & 15, k)) : (enumskyblock == EnumSkyBlock.BLOCK ? chunksection.getEmittedLight(i, j & 15, k) : enumskyblock.c)); - } - - public void a(EnumSkyBlock enumskyblock, int i, int j, int k, int l) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection == null) { - chunksection = this.sections[j >> 4] = new ChunkSection(j >> 4 << 4, !this.world.worldProvider.g); - this.initLighting(); - } - - this.n = true; - if (enumskyblock == EnumSkyBlock.SKY) { - if (!this.world.worldProvider.g) { - chunksection.setSkyLight(i, j & 15, k, l); - } - } else if (enumskyblock == EnumSkyBlock.BLOCK) { - chunksection.setEmittedLight(i, j & 15, k, l); - } - } - - public int b(int i, int j, int k, int l) { - ChunkSection chunksection = this.sections[j >> 4]; - - if (chunksection == null) { - return !this.world.worldProvider.g && l < EnumSkyBlock.SKY.c ? EnumSkyBlock.SKY.c - l : 0; - } else { - int i1 = this.world.worldProvider.g ? 0 : chunksection.getSkyLight(i, j & 15, k); - - if (i1 > 0) { - a = true; - } - - i1 -= l; - int j1 = chunksection.getEmittedLight(i, j & 15, k); - - if (j1 > i1) { - i1 = j1; - } - - return i1; - } - } - - public void a(Entity entity) { - this.o = true; - int i = MathHelper.floor(entity.locX / 16.0D); - int j = MathHelper.floor(entity.locZ / 16.0D); - - if (i != this.locX || j != this.locZ) { - // CraftBukkit start - Bukkit.getLogger().warning("Wrong location for " + entity + " in world '" + world.getWorld().getName() + "'!"); - // t.warn("Wrong location! " + entity + " (at " + i + ", " + j + " instead of " + this.locX + ", " + this.locZ + ")"); - // Thread.dumpStack(); - Bukkit.getLogger().warning("Entity is at " + entity.locX + "," + entity.locZ + " (chunk " + i + "," + j + ") but was stored in chunk " + this.locX + "," + this.locZ); - // CraftBukkit end - } - - int k = MathHelper.floor(entity.locY / 16.0D); - - if (k < 0) { - k = 0; - } - - if (k >= this.entitySlices.length) { - k = this.entitySlices.length - 1; - } - - entity.ag = true; - entity.ah = this.locX; - entity.ai = k; - entity.aj = this.locZ; - this.entitySlices[k].add(entity); - } - - public void b(Entity entity) { - this.a(entity, entity.ai); - } - - public void a(Entity entity, int i) { - if (i < 0) { - i = 0; - } - - if (i >= this.entitySlices.length) { - i = this.entitySlices.length - 1; - } - - this.entitySlices[i].remove(entity); - } - - public boolean d(int i, int j, int k) { - return j >= this.heightMap[k << 4 | i]; - } - - public TileEntity e(int i, int j, int k) { - ChunkPosition chunkposition = new ChunkPosition(i, j, k); - TileEntity tileentity = (TileEntity) this.tileEntities.get(chunkposition); - - if (tileentity == null) { - Block block = this.getType(i, j, k); - - if (!block.isTileEntity()) { - return null; - } - - tileentity = ((IContainer) block).a(this.world, this.getData(i, j, k)); - this.world.setTileEntity(this.locX * 16 + i, j, this.locZ * 16 + k, tileentity); - } - - if (tileentity != null && tileentity.r()) { - this.tileEntities.remove(chunkposition); - return null; - } else { - return tileentity; - } - } - - public void a(TileEntity tileentity) { - int i = tileentity.x - this.locX * 16; - int j = tileentity.y; - int k = tileentity.z - this.locZ * 16; - - this.a(i, j, k, tileentity); - if (this.d) { - this.world.tileEntityList.add(tileentity); - } - } - - public void a(int i, int j, int k, TileEntity tileentity) { - ChunkPosition chunkposition = new ChunkPosition(i, j, k); - - tileentity.a(this.world); - tileentity.x = this.locX * 16 + i; - tileentity.y = j; - tileentity.z = this.locZ * 16 + k; - if (this.getType(i, j, k) instanceof IContainer) { - if (this.tileEntities.containsKey(chunkposition)) { - ((TileEntity) this.tileEntities.get(chunkposition)).s(); - } - - tileentity.t(); - this.tileEntities.put(chunkposition, tileentity); - // CraftBukkit start - } else { - System.out.println("Attempted to place a tile entity (" + tileentity + ") at " + tileentity.x + "," + tileentity.y + "," + tileentity.z - + " (" + org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(getType(i, j, k)) + ") where there was no entity tile!"); - System.out.println("Chunk coordinates: " + (this.locX * 16) + "," + (this.locZ * 16)); - new Exception().printStackTrace(); - // CraftBukkit end - } - } - - public void f(int i, int j, int k) { - ChunkPosition chunkposition = new ChunkPosition(i, j, k); - - if (this.d) { - TileEntity tileentity = (TileEntity) this.tileEntities.remove(chunkposition); - - if (tileentity != null) { - tileentity.s(); - } - } - } - - public void addEntities() { - this.d = true; - this.world.a(this.tileEntities.values()); - - for (int i = 0; i < this.entitySlices.length; ++i) { - Iterator iterator = this.entitySlices[i].iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - entity.X(); - } - - this.world.a(this.entitySlices[i]); - } - } - - public void removeEntities() { - this.d = false; - Iterator iterator = this.tileEntities.values().iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity = (TileEntity) iterator.next(); - - this.world.a(tileentity); - } - - for (int i = 0; i < this.entitySlices.length; ++i) { - // CraftBukkit start - java.util.Iterator<Object> iter = this.entitySlices[i].iterator(); - while (iter.hasNext()) { - Entity entity = (Entity) iter.next(); - - // Do not pass along players, as doing so can get them stuck outside of time. - // (which for example disables inventory icon updates and prevents block breaking) - if (entity instanceof EntityPlayer) { - iter.remove(); - } - } - // CraftBukkit end - - this.world.b(this.entitySlices[i]); - } - } - - public void e() { - this.n = true; - } - - public void a(Entity entity, AxisAlignedBB axisalignedbb, List list, IEntitySelector ientityselector) { - int i = MathHelper.floor((axisalignedbb.b - 2.0D) / 16.0D); - int j = MathHelper.floor((axisalignedbb.e + 2.0D) / 16.0D); - - i = MathHelper.a(i, 0, this.entitySlices.length - 1); - j = MathHelper.a(j, 0, this.entitySlices.length - 1); - - for (int k = i; k <= j; ++k) { - List list1 = this.entitySlices[k]; - - for (int l = 0; l < list1.size(); ++l) { - Entity entity1 = (Entity) list1.get(l); - - if (entity1 != entity && entity1.boundingBox.b(axisalignedbb) && (ientityselector == null || ientityselector.a(entity1))) { - list.add(entity1); - Entity[] aentity = entity1.at(); - - if (aentity != null) { - for (int i1 = 0; i1 < aentity.length; ++i1) { - entity1 = aentity[i1]; - if (entity1 != entity && entity1.boundingBox.b(axisalignedbb) && (ientityselector == null || ientityselector.a(entity1))) { - list.add(entity1); - } - } - } - } - } - } - } - - public void a(Class oclass, AxisAlignedBB axisalignedbb, List list, IEntitySelector ientityselector) { - int i = MathHelper.floor((axisalignedbb.b - 2.0D) / 16.0D); - int j = MathHelper.floor((axisalignedbb.e + 2.0D) / 16.0D); - - i = MathHelper.a(i, 0, this.entitySlices.length - 1); - j = MathHelper.a(j, 0, this.entitySlices.length - 1); - - for (int k = i; k <= j; ++k) { - List list1 = this.entitySlices[k]; - - for (int l = 0; l < list1.size(); ++l) { - Entity entity = (Entity) list1.get(l); - - if (oclass.isAssignableFrom(entity.getClass()) && entity.boundingBox.b(axisalignedbb) && (ientityselector == null || ientityselector.a(entity))) { - list.add(entity); - } - } - } - } - - public boolean a(boolean flag) { - if (flag) { - if (this.o && this.world.getTime() != this.lastSaved || this.n) { - return true; - } - } else if (this.o && this.world.getTime() >= this.lastSaved + 600L) { - return true; - } - - return this.n; - } - - public Random a(long i) { - return new Random(this.world.getSeed() + (long) (this.locX * this.locX * 4987142) + (long) (this.locX * 5947611) + (long) (this.locZ * this.locZ) * 4392871L + (long) (this.locZ * 389711) ^ i); - } - - public boolean isEmpty() { - return false; - } - - public void loadNearby(IChunkProvider ichunkprovider, IChunkProvider ichunkprovider1, int i, int j) { - if (!this.done && ichunkprovider.isChunkLoaded(i + 1, j + 1) && ichunkprovider.isChunkLoaded(i, j + 1) && ichunkprovider.isChunkLoaded(i + 1, j)) { - ichunkprovider.getChunkAt(ichunkprovider1, i, j); - } - - if (ichunkprovider.isChunkLoaded(i - 1, j) && !ichunkprovider.getOrCreateChunk(i - 1, j).done && ichunkprovider.isChunkLoaded(i - 1, j + 1) && ichunkprovider.isChunkLoaded(i, j + 1) && ichunkprovider.isChunkLoaded(i - 1, j + 1)) { - ichunkprovider.getChunkAt(ichunkprovider1, i - 1, j); - } - - if (ichunkprovider.isChunkLoaded(i, j - 1) && !ichunkprovider.getOrCreateChunk(i, j - 1).done && ichunkprovider.isChunkLoaded(i + 1, j - 1) && ichunkprovider.isChunkLoaded(i + 1, j - 1) && ichunkprovider.isChunkLoaded(i + 1, j)) { - ichunkprovider.getChunkAt(ichunkprovider1, i, j - 1); - } - - if (ichunkprovider.isChunkLoaded(i - 1, j - 1) && !ichunkprovider.getOrCreateChunk(i - 1, j - 1).done && ichunkprovider.isChunkLoaded(i, j - 1) && ichunkprovider.isChunkLoaded(i - 1, j)) { - ichunkprovider.getChunkAt(ichunkprovider1, i - 1, j - 1); - } - } - - public int d(int i, int j) { - int k = i | j << 4; - int l = this.b[k]; - - if (l == -999) { - int i1 = this.h() + 15; - - l = -1; - - while (i1 > 0 && l == -1) { - Block block = this.getType(i, i1, j); - Material material = block.getMaterial(); - - if (!material.isSolid() && !material.isLiquid()) { - --i1; - } else { - l = i1 + 1; - } - } - - this.b[k] = l; - } - - return l; - } - - public void b(boolean flag) { - if (this.w && !this.world.worldProvider.g && !flag) { - this.c(this.world.isStatic); - } - - this.m = true; - if (!this.lit && this.done) { - this.p(); - } - } - - public boolean isReady() { - return this.m && this.done && this.lit; - } - - public ChunkCoordIntPair l() { - return new ChunkCoordIntPair(this.locX, this.locZ); - } - - public boolean c(int i, int j) { - if (i < 0) { - i = 0; - } - - if (j >= 256) { - j = 255; - } - - for (int k = i; k <= j; k += 16) { - ChunkSection chunksection = this.sections[k >> 4]; - - if (chunksection != null && !chunksection.isEmpty()) { - return false; - } - } - - return true; - } - - public void a(ChunkSection[] achunksection) { - this.sections = achunksection; - } - - public BiomeBase getBiome(int i, int j, WorldChunkManager worldchunkmanager) { - int k = this.v[j << 4 | i] & 255; - - if (k == 255) { - BiomeBase biomebase = worldchunkmanager.getBiome((this.locX << 4) + i, (this.locZ << 4) + j); - - k = biomebase.id; - this.v[j << 4 | i] = (byte) (k & 255); - } - - return BiomeBase.getBiome(k) == null ? BiomeBase.PLAINS : BiomeBase.getBiome(k); - } - - public byte[] m() { - return this.v; - } - - public void a(byte[] abyte) { - this.v = abyte; - } - - public void n() { - this.x = 0; - } - - public void o() { - for (int i = 0; i < 8; ++i) { - if (this.x >= 4096) { - return; - } - - int j = this.x % 16; - int k = this.x / 16 % 16; - int l = this.x / 256; - - ++this.x; - int i1 = (this.locX << 4) + k; - int j1 = (this.locZ << 4) + l; - - for (int k1 = 0; k1 < 16; ++k1) { - int l1 = (j << 4) + k1; - - if (this.sections[j] == null && (k1 == 0 || k1 == 15 || k == 0 || k == 15 || l == 0 || l == 15) || this.sections[j] != null && this.sections[j].getTypeId(k, k1, l).getMaterial() == Material.AIR) { - if (this.world.getType(i1, l1 - 1, j1).m() > 0) { - this.world.t(i1, l1 - 1, j1); - } - - if (this.world.getType(i1, l1 + 1, j1).m() > 0) { - this.world.t(i1, l1 + 1, j1); - } - - if (this.world.getType(i1 - 1, l1, j1).m() > 0) { - this.world.t(i1 - 1, l1, j1); - } - - if (this.world.getType(i1 + 1, l1, j1).m() > 0) { - this.world.t(i1 + 1, l1, j1); - } - - if (this.world.getType(i1, l1, j1 - 1).m() > 0) { - this.world.t(i1, l1, j1 - 1); - } - - if (this.world.getType(i1, l1, j1 + 1).m() > 0) { - this.world.t(i1, l1, j1 + 1); - } - - this.world.t(i1, l1, j1); - } - } - } - } - - public void p() { - this.done = true; - this.lit = true; - if (!this.world.worldProvider.g) { - if (this.world.b(this.locX * 16 - 1, 0, this.locZ * 16 - 1, this.locX * 16 + 1, 63, this.locZ * 16 + 1)) { - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - if (!this.f(i, j)) { - this.lit = false; - break; - } - } - } - - if (this.lit) { - Chunk chunk = this.world.getChunkAtWorldCoords(this.locX * 16 - 1, this.locZ * 16); - - chunk.a(3); - chunk = this.world.getChunkAtWorldCoords(this.locX * 16 + 16, this.locZ * 16); - chunk.a(1); - chunk = this.world.getChunkAtWorldCoords(this.locX * 16, this.locZ * 16 - 1); - chunk.a(0); - chunk = this.world.getChunkAtWorldCoords(this.locX * 16, this.locZ * 16 + 16); - chunk.a(2); - } - } else { - this.lit = false; - } - } - } - - private void a(int i) { - if (this.done) { - int j; - - if (i == 3) { - for (j = 0; j < 16; ++j) { - this.f(15, j); - } - } else if (i == 1) { - for (j = 0; j < 16; ++j) { - this.f(0, j); - } - } else if (i == 0) { - for (j = 0; j < 16; ++j) { - this.f(j, 15); - } - } else if (i == 2) { - for (j = 0; j < 16; ++j) { - this.f(j, 0); - } - } - } - } - - private boolean f(int i, int j) { - int k = this.h(); - boolean flag = false; - boolean flag1 = false; - - int l; - - for (l = k + 16 - 1; l > 63 || l > 0 && !flag1; --l) { - int i1 = this.b(i, l, j); - - if (i1 == 255 && l < 63) { - flag1 = true; - } - - if (!flag && i1 > 0) { - flag = true; - } else if (flag && i1 == 0 && !this.world.t(this.locX * 16 + i, l, this.locZ * 16 + j)) { - return false; - } - } - - for (; l > 0; --l) { - if (this.getType(i, l, j).m() > 0) { - this.world.t(this.locX * 16 + i, l, this.locZ * 16 + j); - } - } - - return true; - } -} diff --git a/src/main/java/net/minecraft/server/ChunkProviderServer.java b/src/main/java/net/minecraft/server/ChunkProviderServer.java deleted file mode 100644 index c88d5d4d..00000000 --- a/src/main/java/net/minecraft/server/ChunkProviderServer.java +++ /dev/null @@ -1,399 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.util.com.google.common.collect.Lists; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.util.Random; - -import org.bukkit.Server; -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -import org.bukkit.craftbukkit.util.LongHash; -import org.bukkit.craftbukkit.util.LongHashSet; -import org.bukkit.craftbukkit.util.LongObjectHashMap; -import org.bukkit.event.world.ChunkUnloadEvent; -// CraftBukkit end - -public class ChunkProviderServer implements IChunkProvider { - - private static final Logger b = LogManager.getLogger(); - // CraftBukkit start - private -> public - public LongHashSet unloadQueue = new LongHashSet(); // LongHashSet - public Chunk emptyChunk; - public IChunkProvider chunkProvider; - private IChunkLoader f; - public boolean forceChunkLoad = false; // true -> false - public LongObjectHashMap<Chunk> chunks = new LongObjectHashMap<Chunk>(); - public WorldServer world; - // CraftBukkit end - - public ChunkProviderServer(WorldServer worldserver, IChunkLoader ichunkloader, IChunkProvider ichunkprovider) { - this.emptyChunk = new EmptyChunk(worldserver, 0, 0); - this.world = worldserver; - this.f = ichunkloader; - this.chunkProvider = ichunkprovider; - } - - public boolean isChunkLoaded(int i, int j) { - return this.chunks.containsKey(LongHash.toLong(i, j)); // CraftBukkit - } - - // CraftBukkit start - Change return type to Collection and return the values of our chunk map - public java.util.Collection a() { - // return this.chunkList; - return this.chunks.values(); - // CraftBukkit end - } - - public void queueUnload(int i, int j) { - if (this.world.worldProvider.e()) { - ChunkCoordinates chunkcoordinates = this.world.getSpawn(); - int k = i * 16 + 8 - chunkcoordinates.x; - int l = j * 16 + 8 - chunkcoordinates.z; - short short1 = 128; - - // CraftBukkit start - if (k < -short1 || k > short1 || l < -short1 || l > short1 || !(this.world.keepSpawnInMemory)) { // Added 'this.world.keepSpawnInMemory' - this.unloadQueue.add(i, j); - - Chunk c = this.chunks.get(LongHash.toLong(i, j)); - if (c != null) { - c.mustSave = true; - } - } - // CraftBukkit end - } else { - // CraftBukkit start - this.unloadQueue.add(i, j); - - Chunk c = this.chunks.get(LongHash.toLong(i, j)); - if (c != null) { - c.mustSave = true; - } - // CraftBukkit end - } - } - - public void b() { - Iterator iterator = this.chunks.values().iterator(); // CraftBukkit - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); - - this.queueUnload(chunk.locX, chunk.locZ); - } - } - - // CraftBukkit start - Add async variant, provide compatibility - public Chunk getChunkIfLoaded(int x, int z) { - return this.chunks.get(LongHash.toLong(x, z)); - } - - public Chunk getChunkAt(int i, int j) { - return getChunkAt(i, j, null); - } - - public Chunk getChunkAt(int i, int j, Runnable runnable) { - this.unloadQueue.remove(i, j); - Chunk chunk = this.chunks.get(LongHash.toLong(i, j)); - ChunkRegionLoader loader = null; - - if (this.f instanceof ChunkRegionLoader) { - loader = (ChunkRegionLoader) this.f; - } - - // We can only use the queue for already generated chunks - if (chunk == null && loader != null && loader.chunkExists(this.world, i, j)) { - if (runnable != null) { - ChunkIOExecutor.queueChunkLoad(this.world, loader, this, i, j, runnable); - return null; - } else { - chunk = ChunkIOExecutor.syncChunkLoad(this.world, loader, this, i, j); - } - } else if (chunk == null) { - chunk = this.originalGetChunkAt(i, j); - } - - // If we didn't load the chunk async and have a callback run it now - if (runnable != null) { - runnable.run(); - } - - return chunk; - } - - public Chunk originalGetChunkAt(int i, int j) { - this.unloadQueue.remove(i, j); - Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); - boolean newChunk = false; - - if (chunk == null) { - chunk = this.loadChunk(i, j); - if (chunk == null) { - if (this.chunkProvider == null) { - chunk = this.emptyChunk; - } else { - try { - chunk = this.chunkProvider.getOrCreateChunk(i, j); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception generating new chunk"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Chunk to be generated"); - - crashreportsystemdetails.a("Location", String.format("%d,%d", new Object[] { Integer.valueOf(i), Integer.valueOf(j)})); - crashreportsystemdetails.a("Position hash", Long.valueOf(LongHash.toLong(i, j))); // CraftBukkit - Use LongHash - crashreportsystemdetails.a("Generator", this.chunkProvider.getName()); - throw new ReportedException(crashreport); - } - } - newChunk = true; // CraftBukkit - } - - this.chunks.put(LongHash.toLong(i, j), chunk); // CraftBukkit - chunk.addEntities(); - - // CraftBukkit start - Server server = this.world.getServer(); - if (server != null) { - /* - * If it's a new world, the first few chunks are generated inside - * the World constructor. We can't reliably alter that, so we have - * no way of creating a CraftWorld/CraftServer at that point. - */ - server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, newChunk)); - } - - // Update neighbor counts - for (int x = -2; x < 3; x++) { - for (int z = -2; z < 3; z++) { - if (x == 0 && z == 0) { - continue; - } - - Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); - if (neighbor != null) { - neighbor.setNeighborLoaded(-x, -z); - chunk.setNeighborLoaded(x, z); - } - } - } - // CraftBukkit end - chunk.loadNearby(this, this, i, j); - } - - return chunk; - } - - public Chunk getOrCreateChunk(int i, int j) { - // CraftBukkit start - Chunk chunk = (Chunk) this.chunks.get(LongHash.toLong(i, j)); - - chunk = chunk == null ? (!this.world.isLoading && !this.forceChunkLoad ? this.emptyChunk : this.getChunkAt(i, j)) : chunk; - if (chunk == this.emptyChunk) return chunk; - if (i != chunk.locX || j != chunk.locZ) { - b.error("Chunk (" + chunk.locX + ", " + chunk.locZ + ") stored at (" + i + ", " + j + ") in world '" + world.getWorld().getName() + "'"); - b.error(chunk.getClass().getName()); - Throwable ex = new Throwable(); - ex.fillInStackTrace(); - ex.printStackTrace(); - } - return chunk; - // CraftBukkit end - } - - public Chunk loadChunk(int i, int j) { // CraftBukkit - private -> public - if (this.f == null) { - return null; - } else { - try { - Chunk chunk = this.f.a(this.world, i, j); - - if (chunk != null) { - chunk.lastSaved = this.world.getTime(); - if (this.chunkProvider != null) { - this.chunkProvider.recreateStructures(i, j); - } - } - - return chunk; - } catch (Exception exception) { - b.error("Couldn\'t load chunk", exception); - return null; - } - } - } - - public void saveChunkNOP(Chunk chunk) { // CraftBukkit - private -> public - if (this.f != null) { - try { - this.f.b(this.world, chunk); - } catch (Exception exception) { - b.error("Couldn\'t save entities", exception); - } - } - } - - public void saveChunk(Chunk chunk) { // CraftBukkit - private -> public - if (this.f != null) { - try { - chunk.lastSaved = this.world.getTime(); - this.f.a(this.world, chunk); - // CraftBukkit start - IOException to Exception - } catch (Exception ioexception) { - b.error("Couldn\'t save chunk", ioexception); - /* Remove extra exception - } catch (ExceptionWorldConflict exceptionworldconflict) { - b.error("Couldn\'t save chunk; already in use by another instance of Minecraft?", exceptionworldconflict); - // CraftBukkit end */ - } - } - } - - public void getChunkAt(IChunkProvider ichunkprovider, int i, int j) { - Chunk chunk = this.getOrCreateChunk(i, j); - - if (!chunk.done) { - chunk.p(); - if (this.chunkProvider != null) { - this.chunkProvider.getChunkAt(ichunkprovider, i, j); - - // CraftBukkit start - BlockSand.instaFall = true; - Random random = new Random(); - random.setSeed(world.getSeed()); - long xRand = random.nextLong() / 2L * 2L + 1L; - long zRand = random.nextLong() / 2L * 2L + 1L; - random.setSeed((long) i * xRand + (long) j * zRand ^ world.getSeed()); - - org.bukkit.World world = this.world.getWorld(); - if (world != null) { - this.world.populating = true; - try { - for (org.bukkit.generator.BlockPopulator populator : world.getPopulators()) { - populator.populate(world, random, chunk.bukkitChunk); - } - } finally { - this.world.populating = false; - } - } - BlockSand.instaFall = false; - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.world.ChunkPopulateEvent(chunk.bukkitChunk)); - // CraftBukkit end - - chunk.e(); - } - } - } - - public boolean saveChunks(boolean flag, IProgressUpdate iprogressupdate) { - int i = 0; - // CraftBukkit start - Iterator iterator = this.chunks.values().iterator(); - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); - // CraftBukkit end - - if (flag) { - this.saveChunkNOP(chunk); - } - - if (chunk.a(flag)) { - this.saveChunk(chunk); - chunk.n = false; - ++i; - if (i == 24 && !flag) { - return false; - } - } - } - - return true; - } - - public void c() { - if (this.f != null) { - this.f.b(); - } - } - - public boolean unloadChunks() { - if (!this.world.savingDisabled) { - // CraftBukkit start - Server server = this.world.getServer(); - for (int i = 0; i < 100 && !this.unloadQueue.isEmpty(); i++) { - long chunkcoordinates = this.unloadQueue.popFirst(); - Chunk chunk = this.chunks.get(chunkcoordinates); - if (chunk == null) continue; - - ChunkUnloadEvent event = new ChunkUnloadEvent(chunk.bukkitChunk); - server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - if (chunk != null) { - chunk.removeEntities(); - this.saveChunk(chunk); - this.saveChunkNOP(chunk); - this.chunks.remove(chunkcoordinates); // CraftBukkit - } - - // this.unloadQueue.remove(olong); - // this.chunks.remove(olong.longValue()); - - // Update neighbor counts - for (int x = -2; x < 3; x++) { - for (int z = -2; z < 3; z++) { - if (x == 0 && z == 0) { - continue; - } - - Chunk neighbor = this.getChunkIfLoaded(chunk.locX + x, chunk.locZ + z); - if (neighbor != null) { - neighbor.setNeighborUnloaded(-x, -z); - chunk.setNeighborUnloaded(x, z); - } - } - } - } - } - // CraftBukkit end - - if (this.f != null) { - this.f.a(); - } - } - - return this.chunkProvider.unloadChunks(); - } - - public boolean canSave() { - return !this.world.savingDisabled; - } - - public String getName() { - // CraftBukkit - this.chunks.count() -> .values().size() - return "ServerChunkCache: " + this.chunks.values().size() + " Drop: " + this.unloadQueue.size(); - } - - public List getMobsFor(EnumCreatureType enumcreaturetype, int i, int j, int k) { - return this.chunkProvider.getMobsFor(enumcreaturetype, i, j, k); - } - - public ChunkPosition findNearestMapFeature(World world, String s, int i, int j, int k) { - return this.chunkProvider.findNearestMapFeature(world, s, i, j, k); - } - - public int getLoadedChunks() { - // CraftBukkit - this.chunks.count() -> this.chunks.size() - return this.chunks.size(); - } - - public void recreateStructures(int i, int j) {} -} diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java deleted file mode 100644 index 9402f0fd..00000000 --- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java +++ /dev/null @@ -1,406 +0,0 @@ -package net.minecraft.server; - -import java.io.DataInputStream; -import java.io.DataOutput; -import java.io.DataOutputStream; -import java.io.File; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class ChunkRegionLoader implements IChunkLoader, IAsyncChunkSaver { - - private static final Logger a = LogManager.getLogger(); - private List b = new ArrayList(); - private Set c = new HashSet(); - private Object d = new Object(); - private final File e; - - public ChunkRegionLoader(File file1) { - this.e = file1; - } - - // CraftBukkit start - public boolean chunkExists(World world, int i, int j) { - ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); - - synchronized (this.d) { - if (this.c.contains(chunkcoordintpair)) { - for (int k = 0; k < this.b.size(); ++k) { - if (((PendingChunkToSave) this.b.get(k)).a.equals(chunkcoordintpair)) { - return true; - } - } - } - } - - return RegionFileCache.a(this.e, i, j).chunkExists(i & 31, j & 31); - } - // CraftBukkit end - - // CraftBukkit start - Add async variant, provide compatibility - public Chunk a(World world, int i, int j) { - Object[] data = this.loadChunk(world, i, j); - if (data != null) { - Chunk chunk = (Chunk) data[0]; - NBTTagCompound nbttagcompound = (NBTTagCompound) data[1]; - this.loadEntities(chunk, nbttagcompound.getCompound("Level"), world); - return chunk; - } - - return null; - } - - public Object[] loadChunk(World world, int i, int j) { - // CraftBukkit end - NBTTagCompound nbttagcompound = null; - ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(i, j); - Object object = this.d; - - synchronized (this.d) { - if (this.c.contains(chunkcoordintpair)) { - for (int k = 0; k < this.b.size(); ++k) { - if (((PendingChunkToSave) this.b.get(k)).a.equals(chunkcoordintpair)) { - nbttagcompound = ((PendingChunkToSave) this.b.get(k)).b; - break; - } - } - } - } - - if (nbttagcompound == null) { - DataInputStream datainputstream = RegionFileCache.c(this.e, i, j); - - if (datainputstream == null) { - return null; - } - - nbttagcompound = NBTCompressedStreamTools.a(datainputstream); - } - - return this.a(world, i, j, nbttagcompound); - } - - protected Object[] a(World world, int i, int j, NBTTagCompound nbttagcompound) { // CraftBukkit - return Chunk -> Object[] - if (!nbttagcompound.hasKeyOfType("Level", 10)) { - a.error("Chunk file at " + i + "," + j + " is missing level data, skipping"); - return null; - } else if (!nbttagcompound.getCompound("Level").hasKeyOfType("Sections", 9)) { - a.error("Chunk file at " + i + "," + j + " is missing block data, skipping"); - return null; - } else { - Chunk chunk = this.a(world, nbttagcompound.getCompound("Level")); - - if (!chunk.a(i, j)) { - a.error("Chunk file at " + i + "," + j + " is in the wrong location; relocating. (Expected " + i + ", " + j + ", got " + chunk.locX + ", " + chunk.locZ + ")"); - nbttagcompound.getCompound("Level").setInt("xPos", i); // CraftBukkit - .getCompound("Level") - nbttagcompound.getCompound("Level").setInt("zPos", j); // CraftBukkit - .getCompound("Level") - - // CraftBukkit start - Have to move tile entities since we don't load them at this stage - NBTTagList tileEntities = nbttagcompound.getCompound("Level").getList("TileEntities", 10); - if (tileEntities != null) { - for (int te = 0; te < tileEntities.size(); te++) { - NBTTagCompound tileEntity = (NBTTagCompound) tileEntities.get(te); - int x = tileEntity.getInt("x") - chunk.locX * 16; - int z = tileEntity.getInt("z") - chunk.locZ * 16; - tileEntity.setInt("x", i * 16 + x); - tileEntity.setInt("z", j * 16 + z); - } - } - // CraftBukkit end - chunk = this.a(world, nbttagcompound.getCompound("Level")); - } - - // CraftBukkit start - Object[] data = new Object[2]; - data[0] = chunk; - data[1] = nbttagcompound; - return data; - // CraftBukkit end - } - } - - public void a(World world, Chunk chunk) { - // CraftBukkit start - "handle" exception - try { - world.G(); - } catch (ExceptionWorldConflict ex) { - ex.printStackTrace(); - } - // CraftBukkit end - - try { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound.set("Level", nbttagcompound1); - this.a(chunk, world, nbttagcompound1); - this.a(chunk.l(), nbttagcompound); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - protected void a(ChunkCoordIntPair chunkcoordintpair, NBTTagCompound nbttagcompound) { - Object object = this.d; - - synchronized (this.d) { - if (this.c.contains(chunkcoordintpair)) { - for (int i = 0; i < this.b.size(); ++i) { - if (((PendingChunkToSave) this.b.get(i)).a.equals(chunkcoordintpair)) { - this.b.set(i, new PendingChunkToSave(chunkcoordintpair, nbttagcompound)); - return; - } - } - } - - this.b.add(new PendingChunkToSave(chunkcoordintpair, nbttagcompound)); - this.c.add(chunkcoordintpair); - FileIOThread.a.a(this); - } - } - - public boolean c() { - PendingChunkToSave pendingchunktosave = null; - Object object = this.d; - - synchronized (this.d) { - if (this.b.isEmpty()) { - return false; - } - - pendingchunktosave = (PendingChunkToSave) this.b.remove(0); - this.c.remove(pendingchunktosave.a); - } - - if (pendingchunktosave != null) { - try { - this.a(pendingchunktosave); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - return true; - } - - public void a(PendingChunkToSave pendingchunktosave) throws java.io.IOException { // CraftBukkit - public -> private, added throws - DataOutputStream dataoutputstream = RegionFileCache.d(this.e, pendingchunktosave.a.x, pendingchunktosave.a.z); - - NBTCompressedStreamTools.a(pendingchunktosave.b, (DataOutput) dataoutputstream); - dataoutputstream.close(); - } - - public void b(World world, Chunk chunk) {} - - public void a() {} - - public void b() { - while (this.c()) { - ; - } - } - - private void a(Chunk chunk, World world, NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("V", (byte) 1); - nbttagcompound.setInt("xPos", chunk.locX); - nbttagcompound.setInt("zPos", chunk.locZ); - nbttagcompound.setLong("LastUpdate", world.getTime()); - nbttagcompound.setIntArray("HeightMap", chunk.heightMap); - nbttagcompound.setBoolean("TerrainPopulated", chunk.done); - nbttagcompound.setBoolean("LightPopulated", chunk.lit); - nbttagcompound.setLong("InhabitedTime", chunk.s); - ChunkSection[] achunksection = chunk.getSections(); - NBTTagList nbttaglist = new NBTTagList(); - boolean flag = !world.worldProvider.g; - ChunkSection[] achunksection1 = achunksection; - int i = achunksection.length; - - NBTTagCompound nbttagcompound1; - - for (int j = 0; j < i; ++j) { - ChunkSection chunksection = achunksection1[j]; - - if (chunksection != null) { - nbttagcompound1 = new NBTTagCompound(); - nbttagcompound1.setByte("Y", (byte) (chunksection.getYPosition() >> 4 & 255)); - nbttagcompound1.setByteArray("Blocks", chunksection.getIdArray()); - if (chunksection.getExtendedIdArray() != null) { - nbttagcompound1.setByteArray("Add", chunksection.getExtendedIdArray().a); - } - - nbttagcompound1.setByteArray("Data", chunksection.getDataArray().a); - nbttagcompound1.setByteArray("BlockLight", chunksection.getEmittedLightArray().a); - if (flag) { - nbttagcompound1.setByteArray("SkyLight", chunksection.getSkyLightArray().a); - } else { - nbttagcompound1.setByteArray("SkyLight", new byte[chunksection.getEmittedLightArray().a.length]); - } - - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Sections", nbttaglist); - nbttagcompound.setByteArray("Biomes", chunk.m()); - chunk.o = false; - NBTTagList nbttaglist1 = new NBTTagList(); - - Iterator iterator; - - for (i = 0; i < chunk.entitySlices.length; ++i) { - iterator = chunk.entitySlices[i].iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - nbttagcompound1 = new NBTTagCompound(); - if (entity.d(nbttagcompound1)) { - chunk.o = true; - nbttaglist1.add(nbttagcompound1); - } - } - } - - nbttagcompound.set("Entities", nbttaglist1); - NBTTagList nbttaglist2 = new NBTTagList(); - - iterator = chunk.tileEntities.values().iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity = (TileEntity) iterator.next(); - - nbttagcompound1 = new NBTTagCompound(); - tileentity.b(nbttagcompound1); - nbttaglist2.add(nbttagcompound1); - } - - nbttagcompound.set("TileEntities", nbttaglist2); - List list = world.a(chunk, false); - - if (list != null) { - long k = world.getTime(); - NBTTagList nbttaglist3 = new NBTTagList(); - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - NextTickListEntry nextticklistentry = (NextTickListEntry) iterator1.next(); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - nbttagcompound2.setInt("i", Block.getId(nextticklistentry.a())); - nbttagcompound2.setInt("x", nextticklistentry.a); - nbttagcompound2.setInt("y", nextticklistentry.b); - nbttagcompound2.setInt("z", nextticklistentry.c); - nbttagcompound2.setInt("t", (int) (nextticklistentry.d - k)); - nbttagcompound2.setInt("p", nextticklistentry.e); - nbttaglist3.add(nbttagcompound2); - } - - nbttagcompound.set("TileTicks", nbttaglist3); - } - } - - private Chunk a(World world, NBTTagCompound nbttagcompound) { - int i = nbttagcompound.getInt("xPos"); - int j = nbttagcompound.getInt("zPos"); - Chunk chunk = new Chunk(world, i, j); - - chunk.heightMap = nbttagcompound.getIntArray("HeightMap"); - chunk.done = nbttagcompound.getBoolean("TerrainPopulated"); - chunk.lit = nbttagcompound.getBoolean("LightPopulated"); - chunk.s = nbttagcompound.getLong("InhabitedTime"); - NBTTagList nbttaglist = nbttagcompound.getList("Sections", 10); - byte b0 = 16; - ChunkSection[] achunksection = new ChunkSection[b0]; - boolean flag = !world.worldProvider.g; - - for (int k = 0; k < nbttaglist.size(); ++k) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(k); - byte b1 = nbttagcompound1.getByte("Y"); - ChunkSection chunksection = new ChunkSection(b1 << 4, flag); - - chunksection.setIdArray(nbttagcompound1.getByteArray("Blocks")); - if (nbttagcompound1.hasKeyOfType("Add", 7)) { - chunksection.setExtendedIdArray(new NibbleArray(nbttagcompound1.getByteArray("Add"), 4)); - } - - chunksection.setDataArray(new NibbleArray(nbttagcompound1.getByteArray("Data"), 4)); - chunksection.setEmittedLightArray(new NibbleArray(nbttagcompound1.getByteArray("BlockLight"), 4)); - if (flag) { - chunksection.setSkyLightArray(new NibbleArray(nbttagcompound1.getByteArray("SkyLight"), 4)); - } - - chunksection.recalcBlockCounts(); - achunksection[b1] = chunksection; - } - - chunk.a(achunksection); - if (nbttagcompound.hasKeyOfType("Biomes", 7)) { - chunk.a(nbttagcompound.getByteArray("Biomes")); - } - - // CraftBukkit start - End this method here and split off entity loading to another method - return chunk; - } - - public void loadEntities(Chunk chunk, NBTTagCompound nbttagcompound, World world) { - // CraftBukkit end - NBTTagList nbttaglist1 = nbttagcompound.getList("Entities", 10); - - if (nbttaglist1 != null) { - for (int l = 0; l < nbttaglist1.size(); ++l) { - NBTTagCompound nbttagcompound2 = nbttaglist1.get(l); - Entity entity = EntityTypes.a(nbttagcompound2, world); - - chunk.o = true; - if (entity != null) { - chunk.a(entity); - Entity entity1 = entity; - - for (NBTTagCompound nbttagcompound3 = nbttagcompound2; nbttagcompound3.hasKeyOfType("Riding", 10); nbttagcompound3 = nbttagcompound3.getCompound("Riding")) { - Entity entity2 = EntityTypes.a(nbttagcompound3.getCompound("Riding"), world); - - if (entity2 != null) { - chunk.a(entity2); - entity1.mount(entity2); - } - - entity1 = entity2; - } - } - } - } - - NBTTagList nbttaglist2 = nbttagcompound.getList("TileEntities", 10); - - if (nbttaglist2 != null) { - for (int i1 = 0; i1 < nbttaglist2.size(); ++i1) { - NBTTagCompound nbttagcompound4 = nbttaglist2.get(i1); - TileEntity tileentity = TileEntity.c(nbttagcompound4); - - if (tileentity != null) { - chunk.a(tileentity); - } - } - } - - if (nbttagcompound.hasKeyOfType("TileTicks", 9)) { - NBTTagList nbttaglist3 = nbttagcompound.getList("TileTicks", 10); - - if (nbttaglist3 != null) { - for (int j1 = 0; j1 < nbttaglist3.size(); ++j1) { - NBTTagCompound nbttagcompound5 = nbttaglist3.get(j1); - - world.b(nbttagcompound5.getInt("x"), nbttagcompound5.getInt("y"), nbttagcompound5.getInt("z"), Block.getById(nbttagcompound5.getInt("i")), nbttagcompound5.getInt("t"), nbttagcompound5.getInt("p")); - } - } - } - - // return chunk; // CraftBukkit - } -} diff --git a/src/main/java/net/minecraft/server/ChunkSection.java b/src/main/java/net/minecraft/server/ChunkSection.java deleted file mode 100644 index db1e52c9..00000000 --- a/src/main/java/net/minecraft/server/ChunkSection.java +++ /dev/null @@ -1,488 +0,0 @@ -package net.minecraft.server; - -import java.util.Arrays; // CraftBukkit - -public class ChunkSection { - - private int yPos; - private int nonEmptyBlockCount; - private int tickingBlockCount; - private byte[] blockIds; - private NibbleArray extBlockIds; - private NibbleArray blockData; - private NibbleArray emittedLight; - private NibbleArray skyLight; - // CraftBukkit start - Compact storage - private int compactId; - private byte compactExtId; - private byte compactData; - private byte compactEmitted; - private byte compactSky; - - // Pre-generated (read-only!) NibbleArrays for every possible value, used for chunk saving - private static NibbleArray[] compactPregen = new NibbleArray[16]; - static { - for (int i = 0; i < 16; i++) { - compactPregen[i] = expandCompactNibble((byte) i); - } - } - - private static NibbleArray expandCompactNibble(byte value) { - byte[] data = new byte[2048]; - Arrays.fill(data, (byte) (value | (value << 4))); - return new NibbleArray(data, 4); - } - - private boolean canBeCompact(byte[] array) { - byte value = array[0]; - for (int i = 1; i < array.length; i++) { - if (value != array[i]) { - return false; - } - } - - return true; - } - // CraftBukkit end - - public ChunkSection(int i, boolean flag) { - this.yPos = i; - /* CraftBukkit - Start as null, using compact storage - this.blockIds = new byte[4096]; - this.blockData = new NibbleArray(this.blockIds.length, 4); - this.emittedLight = new NibbleArray(this.blockIds.length, 4); - if (flag) { - this.skyLight = new NibbleArray(this.blockIds.length, 4); - } - */ - if (!flag) { - this.compactSky = -1; - } - // CraftBukkit end - } - - // CraftBukkit start - public ChunkSection(int y, boolean flag, byte[] blkIds, byte[] extBlkIds) { - this.yPos = y; - this.setIdArray(blkIds); - if (extBlkIds != null) { - this.setExtendedIdArray(new NibbleArray(extBlkIds, 4)); - } - if (!flag) { - this.compactSky = -1; - } - this.recalcBlockCounts(); - } - // CraftBukkit end - - public Block getTypeId(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.blockIds == null) { - int id = this.compactId; - if (this.extBlockIds == null) { - id |= this.compactExtId << 8; - } else { - id |= this.extBlockIds.a(i, j, k) << 8; - } - - return Block.getById(id); - } - // CraftBukkit end - - int l = this.blockIds[j << 8 | k << 4 | i] & 255; - - if (this.extBlockIds != null) { - l |= this.extBlockIds.a(i, j, k) << 8; - } - - return Block.getById(l); - } - - public void setTypeId(int i, int j, int k, Block block) { - // CraftBukkit start - Compact storage - Block block1 = this.getTypeId(i, j, k); - if (block == block1) { - return; - } - // CraftBukkit end - - if (block1 != Blocks.AIR) { - --this.nonEmptyBlockCount; - if (block1.isTicking()) { - --this.tickingBlockCount; - } - } - - if (block != Blocks.AIR) { - ++this.nonEmptyBlockCount; - if (block.isTicking()) { - ++this.tickingBlockCount; - } - } - - int i1 = Block.getId(block); - - // CraftBukkit start - Compact storage - if (this.blockIds == null) { - this.blockIds = new byte[4096]; - Arrays.fill(this.blockIds, (byte) (this.compactId & 255)); - } - // CraftBukkit end - - this.blockIds[j << 8 | k << 4 | i] = (byte) (i1 & 255); - if (i1 > 255) { - if (this.extBlockIds == null) { - this.extBlockIds = expandCompactNibble(this.compactExtId); // CraftBukkit - Compact storage - } - - this.extBlockIds.a(i, j, k, (i1 & 3840) >> 8); - } else if (this.extBlockIds != null) { - this.extBlockIds.a(i, j, k, 0); - } - } - - public int getData(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.blockData == null) { - return this.compactData; - } - // CraftBukkit end - return this.blockData.a(i, j, k); - } - - public void setData(int i, int j, int k, int l) { - // CraftBukkit start - Compact storage - if (this.blockData == null) { - if (this.compactData == l) { - return; - } - this.blockData = expandCompactNibble(this.compactData); - } - // CraftBukkit end - this.blockData.a(i, j, k, l); - } - - public boolean isEmpty() { - return this.nonEmptyBlockCount == 0; - } - - public boolean shouldTick() { - return this.tickingBlockCount > 0; - } - - public int getYPosition() { - return this.yPos; - } - - public void setSkyLight(int i, int j, int k, int l) { - // CraftBukkit start - Compact storage - if (this.skyLight == null) { - if (this.compactSky == l) { - return; - } - this.skyLight = expandCompactNibble(this.compactSky); - } - // CraftBukkit end - this.skyLight.a(i, j, k, l); - } - - public int getSkyLight(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.skyLight == null) { - return this.compactSky; - } - // CraftBukkit end - return this.skyLight.a(i, j, k); - } - - public void setEmittedLight(int i, int j, int k, int l) { - // CraftBukkit start - Compact storage - if (this.emittedLight == null) { - if (this.compactEmitted == l) { - return; - } - this.emittedLight = expandCompactNibble(this.compactEmitted); - } - // CraftBukkit end - this.emittedLight.a(i, j, k, l); - } - - public int getEmittedLight(int i, int j, int k) { - // CraftBukkit start - Compact storage - if (this.emittedLight == null) { - return this.compactEmitted; - } - // CraftBukkit end - return this.emittedLight.a(i, j, k); - } - - public void recalcBlockCounts() { - // CraftBukkit start - Optimize for speed - int cntNonEmpty = 0; - int cntTicking = 0; - - if (this.blockIds == null) { - int id = this.compactId; - if (this.extBlockIds == null) { - id |= this.compactExtId << 8; - if (id > 0) { - Block block = Block.getById(id); - if (block == null) { - this.compactId = 0; - this.compactExtId = 0; - } else { - cntNonEmpty = 4096; - if (block.isTicking()) { - cntTicking = 4096; - } - } - } - } else { - byte[] ext = this.extBlockIds.a; - for (int off = 0, off2 = 0; off < 4096;) { - byte extid = ext[off2]; - int l = (id & 0xFF) | ((extid & 0xF) << 8); // Even data - if (l > 0) { - Block block = Block.getById(l); - if (block == null) { - this.compactId = 0; - ext[off2] &= 0xF0; - } else { - ++cntNonEmpty; - if (block.isTicking()) { - ++cntTicking; - } - } - } - off++; - l = (id & 0xFF) | ((extid & 0xF0) << 4); // Odd data - if (l > 0) { - Block block = Block.getById(l); - if (block == null) { - this.compactId = 0; - ext[off2] &= 0x0F; - } else { - ++cntNonEmpty; - if (block.isTicking()) { - ++cntTicking; - } - } - } - off++; - off2++; - } - } - } else { - byte[] blkIds = this.blockIds; - if (this.extBlockIds == null) { // No extended block IDs? Don't waste time messing with them - for (int off = 0; off < blkIds.length; off++) { - int l = blkIds[off] & 0xFF; - if (l > 0) { - if (Block.getById(l) == null) { - blkIds[off] = 0; - } else { - ++cntNonEmpty; - if (Block.getById(l).isTicking()) { - ++cntTicking; - } - } - } - } - } else { - byte[] ext = this.extBlockIds.a; - for (int off = 0, off2 = 0; off < blkIds.length;) { - byte extid = ext[off2]; - int l = (blkIds[off] & 0xFF) | ((extid & 0xF) << 8); // Even data - if (l > 0) { - if (Block.getById(l) == null) { - blkIds[off] = 0; - ext[off2] &= 0xF0; - } else { - ++cntNonEmpty; - if (Block.getById(l).isTicking()) { - ++cntTicking; - } - } - } - off++; - l = (blkIds[off] & 0xFF) | ((extid & 0xF0) << 4); // Odd data - if (l > 0) { - if (Block.getById(l) == null) { - blkIds[off] = 0; - ext[off2] &= 0x0F; - } else { - ++cntNonEmpty; - if (Block.getById(l).isTicking()) { - ++cntTicking; - } - } - } - off++; - off2++; - } - } - } - this.nonEmptyBlockCount = cntNonEmpty; - this.tickingBlockCount = cntTicking; - } - - public void old_recalcBlockCounts() { - // CraftBukkit end - this.nonEmptyBlockCount = 0; - this.tickingBlockCount = 0; - - for (int i = 0; i < 16; ++i) { - for (int j = 0; j < 16; ++j) { - for (int k = 0; k < 16; ++k) { - Block block = this.getTypeId(i, j, k); - - if (block != Blocks.AIR) { - ++this.nonEmptyBlockCount; - if (block.isTicking()) { - ++this.tickingBlockCount; - } - } - } - } - } - } - - public byte[] getIdArray() { - // CraftBukkit start - Compact storage - if (this.blockIds == null) { - byte[] ids = new byte[4096]; - Arrays.fill(ids, (byte) (this.compactId & 255)); - return ids; - } - // CraftBukkit end - return this.blockIds; - } - - public NibbleArray getExtendedIdArray() { - // CraftBukkit start - Compact storage - if (this.extBlockIds == null && this.compactExtId != 0) { - return compactPregen[this.compactExtId]; - } - // CraftBukkit end - return this.extBlockIds; - } - - public NibbleArray getDataArray() { - // CraftBukkit start - Compact storage - if (this.blockData == null) { - return compactPregen[this.compactData]; - } - // CraftBukkit end - return this.blockData; - } - - public NibbleArray getEmittedLightArray() { - // CraftBukkit start - Compact storage - if (this.emittedLight == null) { - return compactPregen[this.compactEmitted]; - } - // CraftBukkit end - return this.emittedLight; - } - - public NibbleArray getSkyLightArray() { - // CraftBukkit start - Compact storage - if (this.skyLight == null && this.compactSky != -1) { - return compactPregen[this.compactSky]; - } - // CraftBukkit end - return this.skyLight; - } - - public void setIdArray(byte[] abyte) { - // CraftBukkit start - Compact storage - if (abyte == null) { - this.compactId = 0; - this.blockIds = null; - return; - } else if (canBeCompact(abyte)) { - this.compactId = abyte[0] & 255; - return; - } - // CraftBukkit end - this.blockIds = this.validateByteArray(abyte); // CraftBukkit - Validate data - } - - public void setExtendedIdArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactExtId = 0; - this.extBlockIds = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactExtId = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.extBlockIds = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - public void setDataArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactData = 0; - this.blockData = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactData = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.blockData = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - public void setEmittedLightArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactEmitted = 0; - this.emittedLight = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactEmitted = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.emittedLight = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - public void setSkyLightArray(NibbleArray nibblearray) { - // CraftBukkit start - Compact storage - if (nibblearray == null) { - this.compactSky = -1; - this.skyLight = null; - return; - } else if (canBeCompact(nibblearray.a)) { - this.compactSky = (byte) (nibblearray.a(0, 0, 0) & 0xF); - return; - } - // CraftBukkit end - this.skyLight = this.validateNibbleArray(nibblearray); // CraftBukkit - Validate data - } - - // CraftBukkit start - Validate array lengths - private NibbleArray validateNibbleArray(NibbleArray nibbleArray) { - if (nibbleArray != null && nibbleArray.a.length < 2048) { - byte[] newArray = new byte[2048]; - System.arraycopy(nibbleArray.a, 0, newArray, 0, nibbleArray.a.length); - nibbleArray = new NibbleArray(newArray, 4); - } - - return nibbleArray; - } - - private byte[] validateByteArray(byte[] byteArray) { - if (byteArray != null && byteArray.length < 4096) { - byte[] newArray = new byte[4096]; - System.arraycopy(byteArray, 0, newArray, 0, byteArray.length); - byteArray = newArray; - } - - return byteArray; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java b/src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java deleted file mode 100644 index 04eacb8e..00000000 --- a/src/main/java/net/minecraft/server/ClientCommandOrdinalWrapper.java +++ /dev/null @@ -1,27 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - import package private class -class ClientCommandOrdinalWrapper { - - static final int[] a = new int[EnumClientCommand.values().length]; - - static { - try { - a[EnumClientCommand.PERFORM_RESPAWN.ordinal()] = 1; - } catch (NoSuchFieldError nosuchfielderror) { - ; - } - - try { - a[EnumClientCommand.REQUEST_STATS.ordinal()] = 2; - } catch (NoSuchFieldError nosuchfielderror1) { - ; - } - - try { - a[EnumClientCommand.OPEN_INVENTORY_ACHIEVEMENT.ordinal()] = 3; - } catch (NoSuchFieldError nosuchfielderror2) { - ; - } - } -} diff --git a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java deleted file mode 100644 index 0cd512d5..00000000 --- a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java +++ /dev/null @@ -1,230 +0,0 @@ -package net.minecraft.server; - -import java.text.SimpleDateFormat; -import java.util.Date; - -// CraftBukkit start -import java.util.ArrayList; -import org.apache.logging.log4j.Level; -import org.bukkit.craftbukkit.command.VanillaCommandWrapper; -import com.google.common.base.Joiner; -// CraftBukkit end - -public abstract class CommandBlockListenerAbstract implements ICommandListener { - - private static final SimpleDateFormat a = new SimpleDateFormat("HH:mm:ss"); - private int b; - private boolean c = true; - private IChatBaseComponent d = null; - public String e = ""; // CraftBukkit - private -> public - private String f = "@"; - protected org.bukkit.command.CommandSender sender; // CraftBukkit - add sender; - - public CommandBlockListenerAbstract() {} - - public int g() { - return this.b; - } - - public IChatBaseComponent h() { - return this.d; - } - - public void a(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("Command", this.e); - nbttagcompound.setInt("SuccessCount", this.b); - nbttagcompound.setString("CustomName", this.f); - if (this.d != null) { - nbttagcompound.setString("LastOutput", ChatSerializer.a(this.d)); - } - - nbttagcompound.setBoolean("TrackOutput", this.c); - } - - public void b(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getString("Command"); - this.b = nbttagcompound.getInt("SuccessCount"); - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.f = nbttagcompound.getString("CustomName"); - } - - if (nbttagcompound.hasKeyOfType("LastOutput", 8)) { - this.d = ChatSerializer.a(nbttagcompound.getString("LastOutput")); - } - - if (nbttagcompound.hasKeyOfType("TrackOutput", 1)) { - this.c = nbttagcompound.getBoolean("TrackOutput"); - } - } - - public boolean a(int i, String s) { - return i <= 2; - } - - public void setCommand(String s) { - this.e = s; - } - - public String getCommand() { - return this.e; - } - - public void a(World world) { - if (world.isStatic) { - this.b = 0; - } - - MinecraftServer minecraftserver = MinecraftServer.getServer(); - - if (minecraftserver != null && minecraftserver.getEnableCommandBlock()) { - // CraftBukkit start - Handle command block commands using Bukkit dispatcher - org.bukkit.command.SimpleCommandMap commandMap = minecraftserver.server.getCommandMap(); - Joiner joiner = Joiner.on(" "); - String command = this.e; - if (this.e.startsWith("/")) { - command = this.e.substring(1); - } - String[] args = command.split(" "); - ArrayList<String[]> commands = new ArrayList<String[]>(); - - // Block disallowed commands - if (args[0].equalsIgnoreCase("stop") || args[0].equalsIgnoreCase("kick") || args[0].equalsIgnoreCase("op") || - args[0].equalsIgnoreCase("deop") || args[0].equalsIgnoreCase("ban") || args[0].equalsIgnoreCase("ban-ip") || - args[0].equalsIgnoreCase("pardon") || args[0].equalsIgnoreCase("pardon-ip") || args[0].equalsIgnoreCase("reload")) { - this.b = 0; - return; - } - - // If the world has no players don't run - if (this.getWorld().players.isEmpty()) { - this.b = 0; - return; - } - - // Handle vanilla commands; - if (minecraftserver.server.getCommandBlockOverride(args[0])) { - org.bukkit.command.Command commandBlockCommand = commandMap.getCommand("minecraft:" + args[0]); - if (commandBlockCommand instanceof VanillaCommandWrapper) { - this.b = ((VanillaCommandWrapper) commandBlockCommand).dispatchVanillaCommandBlock(this, this.e); - return; - } - } - - // Make sure this is a valid command - if (commandMap.getCommand(args[0]) == null) { - this.b = 0; - return; - } - - // testfor command requires special handling - if (args[0].equalsIgnoreCase("testfor")) { - if (args.length < 2) { - this.b = 0; - return; - } - - EntityPlayer[] players = PlayerSelector.getPlayers(this, args[1]); - - if (players != null && players.length > 0) { - this.b = players.length; - return; - } else { - EntityPlayer player = MinecraftServer.getServer().getPlayerList().getPlayer(args[1]); - if (player == null) { - this.b = 0; - return; - } else { - this.b = 1; - return; - } - } - } - - commands.add(args); - - // Find positions of command block syntax, if any - ArrayList<String[]> newCommands = new ArrayList<String[]>(); - for (int i = 0; i < args.length; i++) { - if (PlayerSelector.isPattern(args[i])) { - for (int j = 0; j < commands.size(); j++) { - newCommands.addAll(this.buildCommands(commands.get(j), i)); - } - ArrayList<String[]> temp = commands; - commands = newCommands; - newCommands = temp; - newCommands.clear(); - } - } - - int completed = 0; - - // Now dispatch all of the commands we ended up with - for (int i = 0; i < commands.size(); i++) { - try { - if (commandMap.dispatch(sender, joiner.join(java.util.Arrays.asList(commands.get(i))))) { - completed++; - } - } catch (Throwable exception) { - if(this instanceof TileEntityCommandListener) { - TileEntityCommandListener listener = (TileEntityCommandListener) this; - MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), exception); - } else if (this instanceof EntityMinecartCommandBlockListener) { - EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) this; - MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), exception); - } else { - MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), exception); - } - } - } - - this.b = completed; - // CraftBukkit end - } else { - this.b = 0; - } - } - - // CraftBukkit start - private ArrayList<String[]> buildCommands(String[] args, int pos) { - ArrayList<String[]> commands = new ArrayList<String[]>(); - EntityPlayer[] players = PlayerSelector.getPlayers(this, args[pos]); - if (players != null) { - for (EntityPlayer player : players) { - if (player.world != this.getWorld()) { - continue; - } - String[] command = args.clone(); - command[pos] = player.getName(); - commands.add(command); - } - } - - return commands; - } - // CraftBukkit end - - public String getName() { - return this.f; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - public void setName(String s) { - this.f = s; - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - if (this.c && this.getWorld() != null && !this.getWorld().isStatic) { - this.d = (new ChatComponentText("[" + a.format(new Date()) + "] ")).addSibling(ichatbasecomponent); - this.e(); - } - } - - public abstract void e(); - - public void b(IChatBaseComponent ichatbasecomponent) { - this.d = ichatbasecomponent; - } -} diff --git a/src/main/java/net/minecraft/server/Container.java b/src/main/java/net/minecraft/server/Container.java deleted file mode 100644 index a10108b9..00000000 --- a/src/main/java/net/minecraft/server/Container.java +++ /dev/null @@ -1,615 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -// CraftBukkit start -import java.util.HashMap; -import java.util.Map; -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.Event.Result; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.inventory.InventoryView; -// CraftBukkit end - -public abstract class Container { - - public List b = new ArrayList(); - public List c = new ArrayList(); - public int windowId; - private int dragType = -1; - public int g; // CraftBukkit - private -> public - private final Set h = new HashSet(); - protected List listeners = new ArrayList(); - private Set i = new HashSet(); - - // CraftBukkit start - public boolean checkReachable = true; - public abstract InventoryView getBukkitView(); - public void transferTo(Container other, org.bukkit.craftbukkit.entity.CraftHumanEntity player) { - InventoryView source = this.getBukkitView(), destination = other.getBukkitView(); - ((CraftInventory) source.getTopInventory()).getInventory().onClose(player); - ((CraftInventory) source.getBottomInventory()).getInventory().onClose(player); - ((CraftInventory) destination.getTopInventory()).getInventory().onOpen(player); - ((CraftInventory) destination.getBottomInventory()).getInventory().onOpen(player); - } - // CraftBukkit end - - public Container() {} - - protected Slot a(Slot slot) { - slot.rawSlotIndex = this.c.size(); - this.c.add(slot); - this.b.add(null); - return slot; - } - - public void addSlotListener(ICrafting icrafting) { - if (this.listeners.contains(icrafting)) { - throw new IllegalArgumentException("Listener already listening"); - } else { - this.listeners.add(icrafting); - icrafting.a(this, this.a()); - this.b(); - } - } - - public List a() { - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < this.c.size(); ++i) { - arraylist.add(((Slot) this.c.get(i)).getItem()); - } - - return arraylist; - } - - public void b() { - for (int i = 0; i < this.c.size(); ++i) { - ItemStack itemstack = ((Slot) this.c.get(i)).getItem(); - ItemStack itemstack1 = (ItemStack) this.b.get(i); - - if (!ItemStack.matches(itemstack1, itemstack)) { - itemstack1 = itemstack == null ? null : itemstack.cloneItemStack(); - this.b.set(i, itemstack1); - - for (int j = 0; j < this.listeners.size(); ++j) { - ((ICrafting) this.listeners.get(j)).a(this, i, itemstack1); - } - } - } - } - - public boolean a(EntityHuman entityhuman, int i) { - return false; - } - - public Slot getSlot(IInventory iinventory, int i) { - for (int j = 0; j < this.c.size(); ++j) { - Slot slot = (Slot) this.c.get(j); - - if (slot.a(iinventory, i)) { - return slot; - } - } - - return null; - } - - public Slot getSlot(int i) { - return (Slot) this.c.get(i); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - Slot slot = (Slot) this.c.get(i); - - return slot != null ? slot.getItem() : null; - } - - public ItemStack clickItem(int i, int j, int k, EntityHuman entityhuman) { - ItemStack itemstack = null; - PlayerInventory playerinventory = entityhuman.inventory; - int l; - ItemStack itemstack1; - - if (k == 5) { - int i1 = this.g; - - this.g = c(j); - if ((i1 != 1 || this.g != 2) && i1 != this.g) { - this.d(); - } else if (playerinventory.getCarried() == null) { - this.d(); - } else if (this.g == 0) { - this.dragType = b(j); - if (d(this.dragType)) { - this.g = 1; - this.h.clear(); - } else { - this.d(); - } - } else if (this.g == 1) { - Slot slot = (Slot) this.c.get(i); - - if (slot != null && a(slot, playerinventory.getCarried(), true) && slot.isAllowed(playerinventory.getCarried()) && playerinventory.getCarried().count > this.h.size() && this.b(slot)) { - this.h.add(slot); - } - } else if (this.g == 2) { - if (!this.h.isEmpty()) { - itemstack1 = playerinventory.getCarried().cloneItemStack(); - l = playerinventory.getCarried().count; - Iterator iterator = this.h.iterator(); - - Map<Integer, ItemStack> draggedSlots = new HashMap<Integer, ItemStack>(); // CraftBukkit - Store slots from drag in map (raw slot id -> new stack) - while (iterator.hasNext()) { - Slot slot1 = (Slot) iterator.next(); - - if (slot1 != null && a(slot1, playerinventory.getCarried(), true) && slot1.isAllowed(playerinventory.getCarried()) && playerinventory.getCarried().count >= this.h.size() && this.b(slot1)) { - ItemStack itemstack2 = itemstack1.cloneItemStack(); - int j1 = slot1.hasItem() ? slot1.getItem().count : 0; - - a(this.h, this.dragType, itemstack2, j1); - if (itemstack2.count > itemstack2.getMaxStackSize()) { - itemstack2.count = itemstack2.getMaxStackSize(); - } - - if (itemstack2.count > slot1.getMaxStackSize()) { - itemstack2.count = slot1.getMaxStackSize(); - } - - l -= itemstack2.count - j1; - draggedSlots.put(slot1.rawSlotIndex, itemstack2); // CraftBukkit - Put in map instead of setting - } - } - - // CraftBukkit start - InventoryDragEvent - InventoryView view = getBukkitView(); - org.bukkit.inventory.ItemStack newcursor = CraftItemStack.asCraftMirror(itemstack1); - newcursor.setAmount(l); - Map<Integer, org.bukkit.inventory.ItemStack> eventmap = new HashMap<Integer, org.bukkit.inventory.ItemStack>(); - for (Map.Entry<Integer, ItemStack> ditem : draggedSlots.entrySet()) { - eventmap.put(ditem.getKey(), CraftItemStack.asBukkitCopy(ditem.getValue())); - } - - // It's essential that we set the cursor to the new value here to prevent item duplication if a plugin closes the inventory. - ItemStack oldCursor = playerinventory.getCarried(); - playerinventory.setCarried(CraftItemStack.asNMSCopy(newcursor)); - - InventoryDragEvent event = new InventoryDragEvent(view, (newcursor.getType() != org.bukkit.Material.AIR ? newcursor : null), CraftItemStack.asBukkitCopy(oldCursor), this.dragType == 1, eventmap); - entityhuman.world.getServer().getPluginManager().callEvent(event); - - // Whether or not a change was made to the inventory that requires an update. - boolean needsUpdate = event.getResult() != Result.DEFAULT; - - if (event.getResult() != Result.DENY) { - for (Map.Entry<Integer, ItemStack> dslot : draggedSlots.entrySet()) { - view.setItem(dslot.getKey(), CraftItemStack.asBukkitCopy(dslot.getValue())); - } - // The only time the carried item will be set to null is if the inventory is closed by the server. - // If the inventory is closed by the server, then the cursor items are dropped. This is why we change the cursor early. - if (playerinventory.getCarried() != null) { - playerinventory.setCarried(CraftItemStack.asNMSCopy(event.getCursor())); - needsUpdate = true; - - } - } else { - playerinventory.setCarried(oldCursor); - } - - if (needsUpdate && entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).updateInventory(this); - } - // CraftBukkit end - } - - this.d(); - } else { - this.d(); - } - } else if (this.g != 0) { - this.d(); - } else { - Slot slot2; - int k1; - ItemStack itemstack3; - - if ((k == 0 || k == 1) && (j == 0 || j == 1)) { - if (i == -999) { - if (playerinventory.getCarried() != null && i == -999) { - if (j == 0) { - entityhuman.drop(playerinventory.getCarried(), true); - playerinventory.setCarried((ItemStack) null); - } - - if (j == 1) { - // CraftBukkit start - Store a reference - ItemStack itemstack4 = playerinventory.getCarried(); - if (itemstack4.count > 0) { - entityhuman.drop(itemstack4.a(1), true); - } - - if (itemstack4.count == 0) { - // CraftBukkit end - playerinventory.setCarried((ItemStack) null); - } - } - } - } else if (k == 1) { - if (i < 0) { - return null; - } - - slot2 = (Slot) this.c.get(i); - if (slot2 != null && slot2.isAllowed(entityhuman)) { - itemstack1 = this.b(entityhuman, i); - if (itemstack1 != null) { - Item item = itemstack1.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (slot2.getItem() != null && slot2.getItem().getItem() == item) { - this.a(i, j, true, entityhuman); - } - } - } - } else { - if (i < 0) { - return null; - } - - slot2 = (Slot) this.c.get(i); - if (slot2 != null) { - itemstack1 = slot2.getItem(); - ItemStack itemstack4 = playerinventory.getCarried(); - - if (itemstack1 != null) { - itemstack = itemstack1.cloneItemStack(); - } - - if (itemstack1 == null) { - if (itemstack4 != null && slot2.isAllowed(itemstack4)) { - k1 = j == 0 ? itemstack4.count : 1; - if (k1 > slot2.getMaxStackSize()) { - k1 = slot2.getMaxStackSize(); - } - - if (itemstack4.count >= k1) { - slot2.set(itemstack4.a(k1)); - } - - if (itemstack4.count == 0) { - playerinventory.setCarried((ItemStack) null); - // CraftBukkit start - Update client cursor if we didn't empty it - } else if (entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } - // CraftBukkit end - } - } else if (slot2.isAllowed(entityhuman)) { - if (itemstack4 == null) { - k1 = j == 0 ? itemstack1.count : (itemstack1.count + 1) / 2; - itemstack3 = slot2.a(k1); - playerinventory.setCarried(itemstack3); - if (itemstack1.count == 0) { - slot2.set((ItemStack) null); - } - - slot2.a(entityhuman, playerinventory.getCarried()); - } else if (slot2.isAllowed(itemstack4)) { - if (itemstack1.getItem() == itemstack4.getItem() && itemstack1.getData() == itemstack4.getData() && ItemStack.equals(itemstack1, itemstack4)) { - k1 = j == 0 ? itemstack4.count : 1; - if (k1 > slot2.getMaxStackSize() - itemstack1.count) { - k1 = slot2.getMaxStackSize() - itemstack1.count; - } - - if (k1 > itemstack4.getMaxStackSize() - itemstack1.count) { - k1 = itemstack4.getMaxStackSize() - itemstack1.count; - } - - itemstack4.a(k1); - if (itemstack4.count == 0) { - playerinventory.setCarried((ItemStack) null); - // CraftBukkit start - Update client cursor if we didn't empty it - } else if (entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } - // CraftBukkit end - - itemstack1.count += k1; - } else if (itemstack4.count <= slot2.getMaxStackSize()) { - slot2.set(itemstack4); - playerinventory.setCarried(itemstack1); - } - } else if (itemstack1.getItem() == itemstack4.getItem() && itemstack4.getMaxStackSize() > 1 && (!itemstack1.usesData() || itemstack1.getData() == itemstack4.getData()) && ItemStack.equals(itemstack1, itemstack4)) { - k1 = itemstack1.count; - // CraftBukkit start - itemstack4.getMaxStackSize() -> maxStack - int maxStack = Math.min(itemstack4.getMaxStackSize(), slot2.getMaxStackSize()); - if (k1 > 0 && k1 + itemstack4.count <= maxStack) { - // CraftBukkit end - itemstack4.count += k1; - itemstack1 = slot2.a(k1); - if (itemstack1.count == 0) { - slot2.set((ItemStack) null); - } - - slot2.a(entityhuman, playerinventory.getCarried()); - // CraftBukkit start - Update client cursor if we didn't empty it - } else if (entityhuman instanceof EntityPlayer) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, entityhuman.inventory.getCarried())); - } - // CraftBukkit end - } - } - - slot2.f(); - // CraftBukkit start - Make sure the client has the right slot contents - if (entityhuman instanceof EntityPlayer && slot2.getMaxStackSize() != 64) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, slot2.rawSlotIndex, slot2.getItem())); - // Updating a crafting inventory makes the client reset the result slot, have to send it again - if (this.getBukkitView().getType() == InventoryType.WORKBENCH || this.getBukkitView().getType() == InventoryType.CRAFTING) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutSetSlot(this.windowId, 0, this.getSlot(0).getItem())); - } - } - // CraftBukkit end - } - } - } else if (k == 2 && j >= 0 && j < 9) { - slot2 = (Slot) this.c.get(i); - if (slot2.isAllowed(entityhuman)) { - itemstack1 = playerinventory.getItem(j); - boolean flag = itemstack1 == null || slot2.inventory == playerinventory && slot2.isAllowed(itemstack1); - - k1 = -1; - if (!flag) { - k1 = playerinventory.getFirstEmptySlotIndex(); - flag |= k1 > -1; - } - - if (slot2.hasItem() && flag) { - itemstack3 = slot2.getItem(); - playerinventory.setItem(j, itemstack3.cloneItemStack()); - if ((slot2.inventory != playerinventory || !slot2.isAllowed(itemstack1)) && itemstack1 != null) { - if (k1 > -1) { - playerinventory.pickup(itemstack1); - slot2.a(itemstack3.count); - slot2.set((ItemStack) null); - slot2.a(entityhuman, itemstack3); - } - } else { - slot2.a(itemstack3.count); - slot2.set(itemstack1); - slot2.a(entityhuman, itemstack3); - } - } else if (!slot2.hasItem() && itemstack1 != null && slot2.isAllowed(itemstack1)) { - playerinventory.setItem(j, (ItemStack) null); - slot2.set(itemstack1); - } - } - } else if (k == 3 && entityhuman.abilities.canInstantlyBuild && playerinventory.getCarried() == null && i >= 0) { - slot2 = (Slot) this.c.get(i); - if (slot2 != null && slot2.hasItem()) { - itemstack1 = slot2.getItem().cloneItemStack(); - itemstack1.count = itemstack1.getMaxStackSize(); - playerinventory.setCarried(itemstack1); - } - } else if (k == 4 && playerinventory.getCarried() == null && i >= 0) { - slot2 = (Slot) this.c.get(i); - if (slot2 != null && slot2.hasItem() && slot2.isAllowed(entityhuman)) { - itemstack1 = slot2.a(j == 0 ? 1 : slot2.getItem().count); - slot2.a(entityhuman, itemstack1); - entityhuman.drop(itemstack1, true); - } - } else if (k == 6 && i >= 0) { - slot2 = (Slot) this.c.get(i); - itemstack1 = playerinventory.getCarried(); - if (itemstack1 != null && (slot2 == null || !slot2.hasItem() || !slot2.isAllowed(entityhuman))) { - l = j == 0 ? 0 : this.c.size() - 1; - k1 = j == 0 ? 1 : -1; - - for (int l1 = 0; l1 < 2; ++l1) { - for (int i2 = l; i2 >= 0 && i2 < this.c.size() && itemstack1.count < itemstack1.getMaxStackSize(); i2 += k1) { - Slot slot3 = (Slot) this.c.get(i2); - - if (slot3.hasItem() && a(slot3, itemstack1, true) && slot3.isAllowed(entityhuman) && this.a(itemstack1, slot3) && (l1 != 0 || slot3.getItem().count != slot3.getItem().getMaxStackSize())) { - int j2 = Math.min(itemstack1.getMaxStackSize() - itemstack1.count, slot3.getItem().count); - ItemStack itemstack5 = slot3.a(j2); - - itemstack1.count += j2; - if (itemstack5.count <= 0) { - slot3.set((ItemStack) null); - } - - slot3.a(entityhuman, itemstack5); - } - } - } - } - - this.b(); - } - } - - return itemstack; - } - - public boolean a(ItemStack itemstack, Slot slot) { - return true; - } - - protected void a(int i, int j, boolean flag, EntityHuman entityhuman) { - this.clickItem(i, j, 1, entityhuman); - } - - public void b(EntityHuman entityhuman) { - PlayerInventory playerinventory = entityhuman.inventory; - - if (playerinventory.getCarried() != null) { - entityhuman.drop(playerinventory.getCarried(), false); - playerinventory.setCarried((ItemStack) null); - } - } - - public void a(IInventory iinventory) { - this.b(); - } - - public void setItem(int i, ItemStack itemstack) { - this.getSlot(i).set(itemstack); - } - - public boolean c(EntityHuman entityhuman) { - return !this.i.contains(entityhuman); - } - - public void a(EntityHuman entityhuman, boolean flag) { - if (flag) { - this.i.remove(entityhuman); - } else { - this.i.add(entityhuman); - } - } - - public abstract boolean a(EntityHuman entityhuman); - - protected boolean a(ItemStack itemstack, int i, int j, boolean flag) { - boolean flag1 = false; - int k = i; - - if (flag) { - k = j - 1; - } - - Slot slot; - ItemStack itemstack1; - - if (itemstack.isStackable()) { - while (itemstack.count > 0 && (!flag && k < j || flag && k >= i)) { - slot = (Slot) this.c.get(k); - itemstack1 = slot.getItem(); - if (itemstack1 != null && itemstack1.getItem() == itemstack.getItem() && (!itemstack.usesData() || itemstack.getData() == itemstack1.getData()) && ItemStack.equals(itemstack, itemstack1)) { - int l = itemstack1.count + itemstack.count; - - // CraftBukkit start - itemstack.getMaxStackSize() -> maxStack - int maxStack = Math.min(itemstack.getMaxStackSize(), slot.getMaxStackSize()); - if (l <= maxStack) { - itemstack.count = 0; - itemstack1.count = l; - slot.f(); - flag1 = true; - } else if (itemstack1.count < maxStack) { - itemstack.count -= maxStack - itemstack1.count; - itemstack1.count = maxStack; - slot.f(); - flag1 = true; - } - // CraftBukkit end - } - - if (flag) { - --k; - } else { - ++k; - } - } - } - - if (itemstack.count > 0) { - if (flag) { - k = j - 1; - } else { - k = i; - } - - while (!flag && k < j || flag && k >= i) { - slot = (Slot) this.c.get(k); - itemstack1 = slot.getItem(); - if (itemstack1 == null) { - slot.set(itemstack.cloneItemStack()); - slot.f(); - itemstack.count = 0; - flag1 = true; - break; - } - - if (flag) { - --k; - } else { - ++k; - } - } - } - - return flag1; - } - - public static int b(int i) { - return i >> 2 & 3; - } - - public static int c(int i) { - return i & 3; - } - - public static boolean d(int i) { - return i == 0 || i == 1; - } - - protected void d() { - this.g = 0; - this.h.clear(); - } - - public static boolean a(Slot slot, ItemStack itemstack, boolean flag) { - boolean flag1 = slot == null || !slot.hasItem(); - - if (slot != null && slot.hasItem() && itemstack != null && itemstack.doMaterialsMatch(slot.getItem()) && ItemStack.equals(slot.getItem(), itemstack)) { - int i = flag ? 0 : itemstack.count; - - flag1 |= slot.getItem().count + i <= itemstack.getMaxStackSize(); - } - - return flag1; - } - - public static void a(Set set, int i, ItemStack itemstack, int j) { - switch (i) { - case 0: - itemstack.count = MathHelper.d((float) itemstack.count / (float) set.size()); - break; - - case 1: - itemstack.count = 1; - } - - itemstack.count += j; - } - - public boolean b(Slot slot) { - return true; - } - - public static int b(IInventory iinventory) { - if (iinventory == null) { - return 0; - } else { - int i = 0; - float f = 0.0F; - - for (int j = 0; j < iinventory.getSize(); ++j) { - ItemStack itemstack = iinventory.getItem(j); - - if (itemstack != null) { - f += (float) itemstack.count / (float) Math.min(iinventory.getMaxStackSize(), itemstack.getMaxStackSize()); - ++i; - } - } - - f /= (float) iinventory.getSize(); - return MathHelper.d(f * 14.0F) + (i > 0 ? 1 : 0); - } - } -} diff --git a/src/main/java/net/minecraft/server/ContainerAnvil.java b/src/main/java/net/minecraft/server/ContainerAnvil.java deleted file mode 100644 index af8847f1..00000000 --- a/src/main/java/net/minecraft/server/ContainerAnvil.java +++ /dev/null @@ -1,400 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.Map; - -import net.minecraft.util.org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit - -public class ContainerAnvil extends Container { - - private static final Logger f = LogManager.getLogger(); - private IInventory g = new InventoryCraftResult(); - private IInventory h = new ContainerAnvilInventory(this, "Repair", true, 2); - private World i; - private int j; - private int k; - private int l; - public int a; - private int m; - private String n; - private final EntityHuman o; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerAnvil(PlayerInventory playerinventory, World world, int i, int j, int k, EntityHuman entityhuman) { - this.player = playerinventory; // CraftBukkit - this.i = world; - this.j = i; - this.k = j; - this.l = k; - this.o = entityhuman; - this.a(new Slot(this.h, 0, 27, 47)); - this.a(new Slot(this.h, 1, 76, 47)); - this.a((Slot) (new SlotAnvilResult(this, this.g, 2, 134, 47, world, i, j, k))); - - int l; - - for (l = 0; l < 3; ++l) { - for (int i1 = 0; i1 < 9; ++i1) { - this.a(new Slot(playerinventory, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); - } - } - - for (l = 0; l < 9; ++l) { - this.a(new Slot(playerinventory, l, 8 + l * 18, 142)); - } - } - - public void a(IInventory iinventory) { - super.a(iinventory); - if (iinventory == this.h) { - this.e(); - } - } - - public void e() { - ItemStack itemstack = this.h.getItem(0); - - this.a = 0; - int i = 0; - byte b0 = 0; - int j = 0; - - if (itemstack == null) { - this.g.setItem(0, (ItemStack) null); - this.a = 0; - } else { - ItemStack itemstack1 = itemstack.cloneItemStack(); - ItemStack itemstack2 = this.h.getItem(1); - Map map = EnchantmentManager.a(itemstack1); - boolean flag = false; - int k = b0 + itemstack.getRepairCost() + (itemstack2 == null ? 0 : itemstack2.getRepairCost()); - - this.m = 0; - int l; - int i1; - int j1; - int k1; - int l1; - Iterator iterator; - Enchantment enchantment; - - if (itemstack2 != null) { - flag = itemstack2.getItem() == Items.ENCHANTED_BOOK && Items.ENCHANTED_BOOK.g(itemstack2).size() > 0; - if (itemstack1.g() && itemstack1.getItem().a(itemstack, itemstack2)) { - l = Math.min(itemstack1.j(), itemstack1.l() / 4); - if (l <= 0) { - this.g.setItem(0, (ItemStack) null); - this.a = 0; - return; - } - - for (i1 = 0; l > 0 && i1 < itemstack2.count; ++i1) { - j1 = itemstack1.j() - l; - itemstack1.setData(j1); - i += Math.max(1, l / 100) + map.size(); - l = Math.min(itemstack1.j(), itemstack1.l() / 4); - } - - this.m = i1; - } else { - if (!flag && (itemstack1.getItem() != itemstack2.getItem() || !itemstack1.g())) { - this.g.setItem(0, (ItemStack) null); - this.a = 0; - return; - } - - if (itemstack1.g() && !flag) { - l = itemstack.l() - itemstack.j(); - i1 = itemstack2.l() - itemstack2.j(); - j1 = i1 + itemstack1.l() * 12 / 100; - int i2 = l + j1; - - k1 = itemstack1.l() - i2; - if (k1 < 0) { - k1 = 0; - } - - if (k1 < itemstack1.getData()) { - itemstack1.setData(k1); - i += Math.max(1, j1 / 100); - } - } - - Map map1 = EnchantmentManager.a(itemstack2); - - iterator = map1.keySet().iterator(); - - while (iterator.hasNext()) { - j1 = ((Integer) iterator.next()).intValue(); - enchantment = Enchantment.byId[j1]; - k1 = map.containsKey(Integer.valueOf(j1)) ? ((Integer) map.get(Integer.valueOf(j1))).intValue() : 0; - l1 = ((Integer) map1.get(Integer.valueOf(j1))).intValue(); - int j2; - - if (k1 == l1) { - ++l1; - j2 = l1; - } else { - j2 = Math.max(l1, k1); - } - - l1 = j2; - int k2 = l1 - k1; - boolean flag1 = enchantment.canEnchant(itemstack); - - if (this.o.abilities.canInstantlyBuild || itemstack.getItem() == Items.ENCHANTED_BOOK) { - flag1 = true; - } - - Iterator iterator1 = map.keySet().iterator(); - - while (iterator1.hasNext()) { - int l2 = ((Integer) iterator1.next()).intValue(); - - if (l2 != j1 && !enchantment.a(Enchantment.byId[l2])) { - flag1 = false; - i += k2; - } - } - - if (flag1) { - if (l1 > enchantment.getMaxLevel()) { - l1 = enchantment.getMaxLevel(); - } - - map.put(Integer.valueOf(j1), Integer.valueOf(l1)); - int i3 = 0; - - switch (enchantment.getRandomWeight()) { - case 1: - i3 = 8; - break; - - case 2: - i3 = 4; - - case 3: - case 4: - case 6: - case 7: - case 8: - case 9: - default: - break; - - case 5: - i3 = 2; - break; - - case 10: - i3 = 1; - } - - if (flag) { - i3 = Math.max(1, i3 / 2); - } - - i += i3 * k2; - } - } - } - } - - if (StringUtils.isBlank(this.n)) { - if (itemstack.hasName()) { - j = itemstack.g() ? 7 : itemstack.count * 5; - i += j; - itemstack1.t(); - } - } else if (!this.n.equals(itemstack.getName())) { - j = itemstack.g() ? 7 : itemstack.count * 5; - i += j; - if (itemstack.hasName()) { - k += j / 2; - } - - itemstack1.c(this.n); - } - - l = 0; - - for (iterator = map.keySet().iterator(); iterator.hasNext(); k += l + k1 * l1) { - j1 = ((Integer) iterator.next()).intValue(); - enchantment = Enchantment.byId[j1]; - k1 = ((Integer) map.get(Integer.valueOf(j1))).intValue(); - l1 = 0; - ++l; - switch (enchantment.getRandomWeight()) { - case 1: - l1 = 8; - break; - - case 2: - l1 = 4; - - case 3: - case 4: - case 6: - case 7: - case 8: - case 9: - default: - break; - - case 5: - l1 = 2; - break; - - case 10: - l1 = 1; - } - - if (flag) { - l1 = Math.max(1, l1 / 2); - } - } - - if (flag) { - k = Math.max(1, k / 2); - } - - this.a = k + i; - if (i <= 0) { - itemstack1 = null; - } - - if (j == i && j > 0 && this.a >= 40) { - this.a = 39; - } - - if (this.a >= 40 && !this.o.abilities.canInstantlyBuild) { - itemstack1 = null; - } - - if (itemstack1 != null) { - i1 = itemstack1.getRepairCost(); - if (itemstack2 != null && i1 < itemstack2.getRepairCost()) { - i1 = itemstack2.getRepairCost(); - } - - if (itemstack1.hasName()) { - i1 -= 9; - } - - if (i1 < 0) { - i1 = 0; - } - - i1 += 2; - itemstack1.setRepairCost(i1); - EnchantmentManager.a(map, itemstack1); - } - - this.g.setItem(0, itemstack1); - this.b(); - } - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.a); - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - if (!this.i.isStatic) { - for (int i = 0; i < this.h.getSize(); ++i) { - ItemStack itemstack = this.h.splitWithoutUpdate(i); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.i.getType(this.j, this.k, this.l) != Blocks.ANVIL ? false : entityhuman.e((double) this.j + 0.5D, (double) this.k + 0.5D, (double) this.l + 0.5D) <= 64.0D; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 2) { - if (!this.a(itemstack1, 3, 39, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i != 0 && i != 1) { - if (i >= 3 && i < 39 && !this.a(itemstack1, 0, 2, false)) { - return null; - } - } else if (!this.a(itemstack1, 3, 39, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public void a(String s) { - this.n = s; - if (this.getSlot(2).hasItem()) { - ItemStack itemstack = this.getSlot(2).getItem(); - - if (StringUtils.isBlank(s)) { - itemstack.t(); - } else { - itemstack.c(this.n); - } - } - - this.e(); - } - - static IInventory a(ContainerAnvil containeranvil) { - return containeranvil.h; - } - - static int b(ContainerAnvil containeranvil) { - return containeranvil.m; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryAnvil(this.h, this.g); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerAnvilInventory.java b/src/main/java/net/minecraft/server/ContainerAnvilInventory.java deleted file mode 100644 index 6cc0d924..00000000 --- a/src/main/java/net/minecraft/server/ContainerAnvilInventory.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class ContainerAnvilInventory extends InventorySubcontainer { // CraftBukkit - public - - final ContainerAnvil a; - - // CraftBukkit start - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - public org.bukkit.entity.Player player; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - ContainerAnvilInventory(ContainerAnvil containeranvil, String s, boolean flag, int i) { - super(s, flag, i); - this.a = containeranvil; - } - - // CraftBukkit start - override inherited maxStack from InventorySubcontainer - public int getMaxStackSize() { - return maxStack; - } - // CraftBukkit end - - public void update() { - super.update(); - this.a.a((IInventory) this); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerBeacon.java b/src/main/java/net/minecraft/server/ContainerBeacon.java deleted file mode 100644 index b7fa7b42..00000000 --- a/src/main/java/net/minecraft/server/ContainerBeacon.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit - -public class ContainerBeacon extends Container { - - private TileEntityBeacon a; - private final SlotBeacon f; - private int g; - private int h; - private int i; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerBeacon(PlayerInventory playerinventory, TileEntityBeacon tileentitybeacon) { - player = playerinventory; // CraftBukkit - this.a = tileentitybeacon; - this.a(this.f = new SlotBeacon(this, tileentitybeacon, 0, 136, 110)); - byte b0 = 36; - short short1 = 137; - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, b0 + j * 18, short1 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, b0 + i * 18, 58 + short1)); - } - - this.g = tileentitybeacon.l(); - this.h = tileentitybeacon.j(); - this.i = tileentitybeacon.k(); - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.g); - icrafting.setContainerData(this, 1, this.h); - icrafting.setContainerData(this, 2, this.i); - } - - public TileEntityBeacon e() { - return this.a; - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.a.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 1, 37, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (!this.f.hasItem() && this.f.isAllowed(itemstack1) && itemstack1.count == 1) { - if (!this.a(itemstack1, 0, 1, false)) { - return null; - } - } else if (i >= 1 && i < 28) { - if (!this.a(itemstack1, 28, 37, false)) { - return null; - } - } else if (i >= 28 && i < 37) { - if (!this.a(itemstack1, 1, 28, false)) { - return null; - } - } else if (!this.a(itemstack1, 1, 37, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - org.bukkit.craftbukkit.inventory.CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryBeacon(this.a); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerBrewingStand.java b/src/main/java/net/minecraft/server/ContainerBrewingStand.java deleted file mode 100644 index 903489ae..00000000 --- a/src/main/java/net/minecraft/server/ContainerBrewingStand.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerBrewingStand extends Container { - - private TileEntityBrewingStand brewingStand; - private final Slot f; - private int g; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerBrewingStand(PlayerInventory playerinventory, TileEntityBrewingStand tileentitybrewingstand) { - player = playerinventory; // CraftBukkit - this.brewingStand = tileentitybrewingstand; - this.a(new SlotPotionBottle(playerinventory.player, tileentitybrewingstand, 0, 56, 46)); - this.a(new SlotPotionBottle(playerinventory.player, tileentitybrewingstand, 1, 79, 53)); - this.a(new SlotPotionBottle(playerinventory.player, tileentitybrewingstand, 2, 102, 46)); - this.f = this.a(new SlotBrewing(this, tileentitybrewingstand, 3, 79, 17)); - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.brewingStand.i()); - } - - public void b() { - super.b(); - - for (int i = 0; i < this.listeners.size(); ++i) { - ICrafting icrafting = (ICrafting) this.listeners.get(i); - - if (this.g != this.brewingStand.i()) { - icrafting.setContainerData(this, 0, this.brewingStand.i()); - } - } - - this.g = this.brewingStand.i(); - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.brewingStand.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if ((i < 0 || i > 2) && i != 3) { - if (!this.f.hasItem() && this.f.isAllowed(itemstack1)) { - if (!this.a(itemstack1, 3, 4, false)) { - return null; - } - } else if (SlotPotionBottle.b_(itemstack)) { - if (!this.a(itemstack1, 0, 3, false)) { - return null; - } - } else if (i >= 4 && i < 31) { - if (!this.a(itemstack1, 31, 40, false)) { - return null; - } - } else if (i >= 31 && i < 40) { - if (!this.a(itemstack1, 4, 31, false)) { - return null; - } - } else if (!this.a(itemstack1, 4, 40, false)) { - return null; - } - } else { - if (!this.a(itemstack1, 4, 40, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryBrewer inventory = new CraftInventoryBrewer(this.brewingStand); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerChest.java b/src/main/java/net/minecraft/server/ContainerChest.java deleted file mode 100644 index c2c4fb53..00000000 --- a/src/main/java/net/minecraft/server/ContainerChest.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerChest extends Container { - - public IInventory container; // CraftBukkit - private->public - private int f; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory; - if (this.container instanceof PlayerInventory) { - inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryPlayer((PlayerInventory) this.container); - } else if (this.container instanceof InventoryLargeChest) { - inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) this.container); - } else { - inventory = new CraftInventory(this.container); - } - - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end - - public ContainerChest(IInventory iinventory, IInventory iinventory1) { - this.container = iinventory1; - this.f = iinventory1.getSize() / 9; - iinventory1.startOpen(); - int i = (this.f - 4) * 18; - // CraftBukkit start - Save player - // TODO: Should we check to make sure it really is an InventoryPlayer? - this.player = (PlayerInventory) iinventory; - // CraftBukkit end - - int j; - int k; - - for (j = 0; j < this.f; ++j) { - for (k = 0; k < 9; ++k) { - this.a(new Slot(iinventory1, k + j * 9, 8 + k * 18, 18 + j * 18)); - } - } - - for (j = 0; j < 3; ++j) { - for (k = 0; k < 9; ++k) { - this.a(new Slot(iinventory, k + j * 9 + 9, 8 + k * 18, 103 + j * 18 + i)); - } - } - - for (j = 0; j < 9; ++j) { - this.a(new Slot(iinventory, j, 8 + j * 18, 161 + i)); - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.container.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < this.f * 9) { - if (!this.a(itemstack1, this.f * 9, this.c.size(), true)) { - return null; - } - } else if (!this.a(itemstack1, 0, this.f * 9, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.container.closeContainer(); - } - - public IInventory e() { - return this.container; - } -} diff --git a/src/main/java/net/minecraft/server/ContainerDispenser.java b/src/main/java/net/minecraft/server/ContainerDispenser.java deleted file mode 100644 index 32187ec1..00000000 --- a/src/main/java/net/minecraft/server/ContainerDispenser.java +++ /dev/null @@ -1,91 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerDispenser extends Container { - - public TileEntityDispenser items; // CraftBukkit - private -> public - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerDispenser(IInventory iinventory, TileEntityDispenser tileentitydispenser) { - this.items = tileentitydispenser; - // CraftBukkit start - Save player - // TODO: Should we check to make sure it really is an InventoryPlayer? - this.player = (PlayerInventory)iinventory; - // CraftBukkit end - - int i; - int j; - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 3; ++j) { - this.a(new Slot(tileentitydispenser, j + i * 3, 62 + j * 18, 17 + i * 18)); - } - } - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 9; ++j) { - this.a(new Slot(iinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(iinventory, i, 8 + i * 18, 142)); - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.items.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < 9) { - if (!this.a(itemstack1, 9, 45, true)) { - return null; - } - } else if (!this.a(itemstack1, 0, 9, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory = new CraftInventory(this.items); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerEnchantTable.java b/src/main/java/net/minecraft/server/ContainerEnchantTable.java deleted file mode 100644 index 5f948e47..00000000 --- a/src/main/java/net/minecraft/server/ContainerEnchantTable.java +++ /dev/null @@ -1,284 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import java.util.Map; - -import org.bukkit.craftbukkit.inventory.CraftInventoryEnchanting; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.enchantment.EnchantItemEvent; -import org.bukkit.event.enchantment.PrepareItemEnchantEvent; -import org.bukkit.entity.Player; -// CraftBukkit end - -public class ContainerEnchantTable extends Container { - - // CraftBukkit - make type specific (changed from IInventory) - public ContainerEnchantTableInventory enchantSlots = new ContainerEnchantTableInventory(this, "Enchant", true, 1); - private World world; - private int x; - private int y; - private int z; - private Random l = new Random(); - public long f; - public int[] costs = new int[3]; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private Player player; - // CraftBukkit end - - public ContainerEnchantTable(PlayerInventory playerinventory, World world, int i, int j, int k) { - this.world = world; - this.x = i; - this.y = j; - this.z = k; - this.a((Slot) (new SlotEnchant(this, this.enchantSlots, 0, 25, 47))); - - int l; - - for (l = 0; l < 3; ++l) { - for (int i1 = 0; i1 < 9; ++i1) { - this.a(new Slot(playerinventory, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); - } - } - - for (l = 0; l < 9; ++l) { - this.a(new Slot(playerinventory, l, 8 + l * 18, 142)); - } - - // CraftBukkit start - player = (Player) playerinventory.player.getBukkitEntity(); - enchantSlots.player = player; - // CraftBukkit end - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.costs[0]); - icrafting.setContainerData(this, 1, this.costs[1]); - icrafting.setContainerData(this, 2, this.costs[2]); - } - - public void b() { - super.b(); - - for (int i = 0; i < this.listeners.size(); ++i) { - ICrafting icrafting = (ICrafting) this.listeners.get(i); - - icrafting.setContainerData(this, 0, this.costs[0]); - icrafting.setContainerData(this, 1, this.costs[1]); - icrafting.setContainerData(this, 2, this.costs[2]); - } - } - - public void a(IInventory iinventory) { - if (iinventory == this.enchantSlots) { - ItemStack itemstack = iinventory.getItem(0); - int i; - - if (itemstack != null) { // CraftBukkit - relax condition - this.f = this.l.nextLong(); - if (!this.world.isStatic) { - i = 0; - - int j; - - for (j = -1; j <= 1; ++j) { - for (int k = -1; k <= 1; ++k) { - if ((j != 0 || k != 0) && this.world.isEmpty(this.x + k, this.y, this.z + j) && this.world.isEmpty(this.x + k, this.y + 1, this.z + j)) { - if (this.world.getType(this.x + k * 2, this.y, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k * 2, this.y + 1, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - - if (k != 0 && j != 0) { - if (this.world.getType(this.x + k * 2, this.y, this.z + j) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k * 2, this.y + 1, this.z + j) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k, this.y, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - - if (this.world.getType(this.x + k, this.y + 1, this.z + j * 2) == Blocks.BOOKSHELF) { - ++i; - } - } - } - } - } - - for (j = 0; j < 3; ++j) { - this.costs[j] = EnchantmentManager.a(this.l, j, i, itemstack); - } - - // CraftBukkit start - CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); - PrepareItemEnchantEvent event = new PrepareItemEnchantEvent(player, this.getBukkitView(), this.world.getWorld().getBlockAt(this.x, this.y, this.z), item, this.costs, i); - event.setCancelled(!itemstack.x()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - for (i = 0; i < 3; ++i) { - this.costs[i] = 0; - } - return; - } - // CraftBukkit end - - this.b(); - } - } else { - for (i = 0; i < 3; ++i) { - this.costs[i] = 0; - } - } - } - } - - public boolean a(EntityHuman entityhuman, int i) { - ItemStack itemstack = this.enchantSlots.getItem(0); - - if (this.costs[i] > 0 && itemstack != null && (entityhuman.expLevel >= this.costs[i] || entityhuman.abilities.canInstantlyBuild)) { - if (!this.world.isStatic) { - List list = EnchantmentManager.b(this.l, itemstack, this.costs[i]); - // CraftBukkit start - Provide an empty enchantment list - if (list == null) { - list = new java.util.ArrayList<EnchantmentInstance>(); - } - // CraftBukkit end - - boolean flag = itemstack.getItem() == Items.BOOK; - - if (list != null) { - // CraftBukkit start - Map<org.bukkit.enchantments.Enchantment, Integer> enchants = new java.util.HashMap<org.bukkit.enchantments.Enchantment, Integer>(); - for (Object obj : list) { - EnchantmentInstance instance = (EnchantmentInstance) obj; - enchants.put(org.bukkit.enchantments.Enchantment.getById(instance.enchantment.id), instance.level); - } - CraftItemStack item = CraftItemStack.asCraftMirror(itemstack); - - EnchantItemEvent event = new EnchantItemEvent((Player) entityhuman.getBukkitEntity(), this.getBukkitView(), this.world.getWorld().getBlockAt(this.x, this.y, this.z), item, this.costs[i], enchants, i); - this.world.getServer().getPluginManager().callEvent(event); - - int level = event.getExpLevelCost(); - if (event.isCancelled() || (level > entityhuman.expLevel && !entityhuman.abilities.canInstantlyBuild) || event.getEnchantsToAdd().isEmpty()) { - return false; - } - - if (flag) { - itemstack.setItem(Items.ENCHANTED_BOOK); - } - - for (Map.Entry<org.bukkit.enchantments.Enchantment, Integer> entry : event.getEnchantsToAdd().entrySet()) { - try { - if (flag) { - int enchantId = entry.getKey().getId(); - if (Enchantment.byId[enchantId] == null) { - continue; - } - - EnchantmentInstance enchantment = new EnchantmentInstance(enchantId, entry.getValue()); - Items.ENCHANTED_BOOK.a(itemstack, enchantment); - } else { - item.addUnsafeEnchantment(entry.getKey(), entry.getValue()); - } - } catch (IllegalArgumentException e) { - /* Just swallow invalid enchantments */ - } - } - - entityhuman.levelDown(-level); - // CraftBukkit end - - this.a(this.enchantSlots); - } - } - - return true; - } else { - return false; - } - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - if (!this.world.isStatic) { - ItemStack itemstack = this.enchantSlots.splitWithoutUpdate(0); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.world.getType(this.x, this.y, this.z) != Blocks.ENCHANTMENT_TABLE ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 1, 37, true)) { - return null; - } - } else { - if (((Slot) this.c.get(0)).hasItem() || !((Slot) this.c.get(0)).isAllowed(itemstack1)) { - return null; - } - - if (itemstack1.hasTag() && itemstack1.count == 1) { - ((Slot) this.c.get(0)).set(itemstack1.cloneItemStack()); - itemstack1.count = 0; - } else if (itemstack1.count >= 1) { - ((Slot) this.c.get(0)).set(new ItemStack(itemstack1.getItem(), 1, itemstack1.getData())); - --itemstack1.count; - } - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryEnchanting inventory = new CraftInventoryEnchanting(this.enchantSlots); - bukkitEntity = new CraftInventoryView(this.player, inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java b/src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java deleted file mode 100644 index b9dbf60a..00000000 --- a/src/main/java/net/minecraft/server/ContainerEnchantTableInventory.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class ContainerEnchantTableInventory extends InventorySubcontainer { // CraftBukkit -> public - - final ContainerEnchantTable enchantTable; - - // CraftBukkit start - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - public org.bukkit.entity.Player player; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - ContainerEnchantTableInventory(ContainerEnchantTable containerenchanttable, String s, boolean flag, int i) { - super(s, flag, i); - this.enchantTable = containerenchanttable; - this.setMaxStackSize(1); // CraftBukkit - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void update() { - super.update(); - this.enchantTable.a((IInventory) this); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerFurnace.java b/src/main/java/net/minecraft/server/ContainerFurnace.java deleted file mode 100644 index 24385282..00000000 --- a/src/main/java/net/minecraft/server/ContainerFurnace.java +++ /dev/null @@ -1,135 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerFurnace extends Container { - - private TileEntityFurnace furnace; - private int f; - private int g; - private int h; - - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryFurnace inventory = new CraftInventoryFurnace(this.furnace); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end - - public ContainerFurnace(PlayerInventory playerinventory, TileEntityFurnace tileentityfurnace) { - this.furnace = tileentityfurnace; - this.a(new Slot(tileentityfurnace, 0, 56, 17)); - this.a(new Slot(tileentityfurnace, 1, 56, 53)); - this.a(new SlotFurnaceResult(playerinventory.player, tileentityfurnace, 2, 116, 35)); - this.player = playerinventory; // CraftBukkit - save player - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - icrafting.setContainerData(this, 0, this.furnace.cookTime); - icrafting.setContainerData(this, 1, this.furnace.burnTime); - icrafting.setContainerData(this, 2, this.furnace.ticksForCurrentFuel); - } - - public void b() { - super.b(); - - for (int i = 0; i < this.listeners.size(); ++i) { - ICrafting icrafting = (ICrafting) this.listeners.get(i); - - if (this.f != this.furnace.cookTime) { - icrafting.setContainerData(this, 0, this.furnace.cookTime); - } - - if (this.g != this.furnace.burnTime) { - icrafting.setContainerData(this, 1, this.furnace.burnTime); - } - - if (this.h != this.furnace.ticksForCurrentFuel) { - icrafting.setContainerData(this, 2, this.furnace.ticksForCurrentFuel); - } - } - - this.f = this.furnace.cookTime; - this.g = this.furnace.burnTime; - this.h = this.furnace.ticksForCurrentFuel; - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.furnace.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 2) { - if (!this.a(itemstack1, 3, 39, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i != 1 && i != 0) { - if (RecipesFurnace.getInstance().getResult(itemstack1) != null) { - if (!this.a(itemstack1, 0, 1, false)) { - return null; - } - } else if (TileEntityFurnace.isFuel(itemstack1)) { - if (!this.a(itemstack1, 1, 2, false)) { - return null; - } - } else if (i >= 3 && i < 30) { - if (!this.a(itemstack1, 30, 39, false)) { - return null; - } - } else if (i >= 30 && i < 39 && !this.a(itemstack1, 3, 30, false)) { - return null; - } - } else if (!this.a(itemstack1, 3, 39, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/ContainerHopper.java b/src/main/java/net/minecraft/server/ContainerHopper.java deleted file mode 100644 index e2c789b4..00000000 --- a/src/main/java/net/minecraft/server/ContainerHopper.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerHopper extends Container { - - private final IInventory hopper; - - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory = new CraftInventory(this.hopper); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end - - public ContainerHopper(PlayerInventory playerinventory, IInventory iinventory) { - this.hopper = iinventory; - this.player = playerinventory; // CraftBukkit - save player - iinventory.startOpen(); - byte b0 = 51; - - int i; - - for (i = 0; i < iinventory.getSize(); ++i) { - this.a(new Slot(iinventory, i, 44 + i * 18, 20)); - } - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, i * 18 + b0)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 58 + b0)); - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.hopper.a(entityhuman); - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < this.hopper.getSize()) { - if (!this.a(itemstack1, this.hopper.getSize(), this.c.size(), true)) { - return null; - } - } else if (!this.a(itemstack1, 0, this.hopper.getSize(), false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.hopper.closeContainer(); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerHorse.java b/src/main/java/net/minecraft/server/ContainerHorse.java deleted file mode 100644 index 79aa1826..00000000 --- a/src/main/java/net/minecraft/server/ContainerHorse.java +++ /dev/null @@ -1,104 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.inventory.InventoryView; -// CraftBukkit end - -public class ContainerHorse extends Container { - - private IInventory a; - private EntityHorse f; - - // CraftBukkit start - org.bukkit.craftbukkit.inventory.CraftInventoryView bukkitEntity; - PlayerInventory player; - - @Override - public InventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventory inventory = new org.bukkit.craftbukkit.inventory.CraftInventoryHorse(this.a); - return bukkitEntity = new CraftInventoryView(player.player.getBukkitEntity(), inventory, this); - } - - public ContainerHorse(IInventory iinventory, IInventory iinventory1, EntityHorse entityhorse) { - player = (PlayerInventory) iinventory; - // CraftBukkit end - this.a = iinventory1; - this.f = entityhorse; - byte b0 = 3; - - iinventory1.startOpen(); - int i = (b0 - 4) * 18; - - this.a(new SlotHorseSaddle(this, iinventory1, 0, 8, 18)); - this.a(new SlotHorseArmor(this, iinventory1, 1, 8, 36, entityhorse)); - int j; - int k; - - if (entityhorse.hasChest()) { - for (j = 0; j < b0; ++j) { - for (k = 0; k < 5; ++k) { - this.a(new Slot(iinventory1, 2 + k + j * 5, 80 + k * 18, 18 + j * 18)); - } - } - } - - for (j = 0; j < 3; ++j) { - for (k = 0; k < 9; ++k) { - this.a(new Slot(iinventory, k + j * 9 + 9, 8 + k * 18, 102 + j * 18 + i)); - } - } - - for (j = 0; j < 9; ++j) { - this.a(new Slot(iinventory, j, 8 + j * 18, 160 + i)); - } - } - - public boolean a(EntityHuman entityhuman) { - return this.a.a(entityhuman) && this.f.isAlive() && this.f.e(entityhuman) < 8.0F; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i < this.a.getSize()) { - if (!this.a(itemstack1, this.a.getSize(), this.c.size(), true)) { - return null; - } - } else if (this.getSlot(1).isAllowed(itemstack1) && !this.getSlot(1).hasItem()) { - if (!this.a(itemstack1, 1, 2, false)) { - return null; - } - } else if (this.getSlot(0).isAllowed(itemstack1)) { - if (!this.a(itemstack1, 0, 1, false)) { - return null; - } - } else if (this.a.getSize() <= 2 || !this.a(itemstack1, 2, this.a.getSize(), false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.a.closeContainer(); - } -} diff --git a/src/main/java/net/minecraft/server/ContainerMerchant.java b/src/main/java/net/minecraft/server/ContainerMerchant.java deleted file mode 100644 index 97f97f3e..00000000 --- a/src/main/java/net/minecraft/server/ContainerMerchant.java +++ /dev/null @@ -1,131 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.inventory.CraftInventoryView; // CraftBukkit - -public class ContainerMerchant extends Container { - - private IMerchant merchant; - private InventoryMerchant f; - private final World g; - - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - - @Override - public CraftInventoryView getBukkitView() { - if (bukkitEntity == null) { - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), new org.bukkit.craftbukkit.inventory.CraftInventoryMerchant(this.getMerchantInventory()), this); - } - return bukkitEntity; - } - // CraftBukkit end - - - public ContainerMerchant(PlayerInventory playerinventory, IMerchant imerchant, World world) { - this.merchant = imerchant; - this.g = world; - this.f = new InventoryMerchant(playerinventory.player, imerchant); - this.a(new Slot(this.f, 0, 36, 53)); - this.a(new Slot(this.f, 1, 62, 53)); - this.a((Slot) (new SlotMerchantResult(playerinventory.player, imerchant, this.f, 2, 120, 53))); - this.player = playerinventory; // CraftBukkit - save player - - int i; - - for (i = 0; i < 3; ++i) { - for (int j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - } - - public InventoryMerchant getMerchantInventory() { - return this.f; - } - - public void addSlotListener(ICrafting icrafting) { - super.addSlotListener(icrafting); - } - - public void b() { - super.b(); - } - - public void a(IInventory iinventory) { - this.f.h(); - super.a(iinventory); - } - - public void e(int i) { - this.f.c(i); - } - - public boolean a(EntityHuman entityhuman) { - return this.merchant.b() == entityhuman; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 2) { - if (!this.a(itemstack1, 3, 39, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i != 0 && i != 1) { - if (i >= 3 && i < 30) { - if (!this.a(itemstack1, 30, 39, false)) { - return null; - } - } else if (i >= 30 && i < 39 && !this.a(itemstack1, 3, 30, false)) { - return null; - } - } else if (!this.a(itemstack1, 3, 39, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - this.merchant.a_((EntityHuman) null); - super.b(entityhuman); - if (!this.g.isStatic) { - ItemStack itemstack = this.f.splitWithoutUpdate(0); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - - itemstack = this.f.splitWithoutUpdate(1); - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ContainerPlayer.java b/src/main/java/net/minecraft/server/ContainerPlayer.java deleted file mode 100644 index 587ee261..00000000 --- a/src/main/java/net/minecraft/server/ContainerPlayer.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerPlayer extends Container { - - public InventoryCrafting craftInventory = new InventoryCrafting(this, 2, 2); - public IInventory resultInventory = new InventoryCraftResult(); - public boolean g; - private final EntityHuman h; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerPlayer(PlayerInventory playerinventory, boolean flag, EntityHuman entityhuman) { - this.g = flag; - this.h = entityhuman; - this.resultInventory = new InventoryCraftResult(); // CraftBukkit - moved to before InventoryCrafting construction - this.craftInventory = new InventoryCrafting(this, 2, 2, playerinventory.player); // CraftBukkit - pass player - this.craftInventory.resultInventory = this.resultInventory; // CraftBukkit - let InventoryCrafting know about its result slot - this.player = playerinventory; // CraftBukkit - save player - this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 144, 36))); - - int i; - int j; - - for (i = 0; i < 2; ++i) { - for (j = 0; j < 2; ++j) { - this.a(new Slot(this.craftInventory, j + i * 2, 88 + j * 18, 26 + i * 18)); - } - } - - for (i = 0; i < 4; ++i) { - this.a((Slot) (new SlotArmor(this, playerinventory, playerinventory.getSize() - 1 - i, 8, 8 + i * 18, i))); - } - - for (i = 0; i < 3; ++i) { - for (j = 0; j < 9; ++j) { - this.a(new Slot(playerinventory, j + (i + 1) * 9, 8 + j * 18, 84 + i * 18)); - } - } - - for (i = 0; i < 9; ++i) { - this.a(new Slot(playerinventory, i, 8 + i * 18, 142)); - } - - // this.a((IInventory) this.craftInventory); // CraftBukkit - unneeded since it just sets result slot to empty - } - - public void a(IInventory iinventory) { - // CraftBukkit start (Note: the following line would cause an error if called during construction) - CraftingManager.getInstance().lastCraftView = getBukkitView(); - ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.h.world); - this.resultInventory.setItem(0, craftResult); - if (super.listeners.size() < 1) { - return; - } - - EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. - player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); - // CraftBukkit end - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - - for (int i = 0; i < 4; ++i) { - ItemStack itemstack = this.craftInventory.splitWithoutUpdate(i); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - - this.resultInventory.setItem(0, (ItemStack) null); - } - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 9, 45, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i >= 1 && i < 5) { - if (!this.a(itemstack1, 9, 45, false)) { - return null; - } - } else if (i >= 5 && i < 9) { - if (!this.a(itemstack1, 9, 45, false)) { - return null; - } - } else if (itemstack.getItem() instanceof ItemArmor && !((Slot) this.c.get(5 + ((ItemArmor) itemstack.getItem()).b)).hasItem()) { - int j = 5 + ((ItemArmor) itemstack.getItem()).b; - - if (!this.a(itemstack1, j, j + 1, false)) { - return null; - } - } else if (i >= 9 && i < 36) { - if (!this.a(itemstack1, 36, 45, false)) { - return null; - } - } else if (i >= 36 && i < 45) { - if (!this.a(itemstack1, 9, 36, false)) { - return null; - } - } else if (!this.a(itemstack1, 9, 45, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public boolean a(ItemStack itemstack, Slot slot) { - return slot.inventory != this.resultInventory && super.a(itemstack, slot); - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ContainerWorkbench.java b/src/main/java/net/minecraft/server/ContainerWorkbench.java deleted file mode 100644 index 37c61054..00000000 --- a/src/main/java/net/minecraft/server/ContainerWorkbench.java +++ /dev/null @@ -1,145 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftInventoryCrafting; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -// CraftBukkit end - -public class ContainerWorkbench extends Container { - - public InventoryCrafting craftInventory; // CraftBukkit - move initialization into constructor - public IInventory resultInventory; // CraftBukkit - move initialization into constructor - private World g; - private int h; - private int i; - private int j; - // CraftBukkit start - private CraftInventoryView bukkitEntity = null; - private PlayerInventory player; - // CraftBukkit end - - public ContainerWorkbench(PlayerInventory playerinventory, World world, int i, int j, int k) { - // CraftBukkit start - Switched order of IInventory construction and stored player - this.resultInventory = new InventoryCraftResult(); - this.craftInventory = new InventoryCrafting(this, 3, 3, playerinventory.player); // CraftBukkit - pass player - this.craftInventory.resultInventory = this.resultInventory; - this.player = playerinventory; - // CraftBukkit end - this.g = world; - this.h = i; - this.i = j; - this.j = k; - this.a((Slot) (new SlotResult(playerinventory.player, this.craftInventory, this.resultInventory, 0, 124, 35))); - - int l; - int i1; - - for (l = 0; l < 3; ++l) { - for (i1 = 0; i1 < 3; ++i1) { - this.a(new Slot(this.craftInventory, i1 + l * 3, 30 + i1 * 18, 17 + l * 18)); - } - } - - for (l = 0; l < 3; ++l) { - for (i1 = 0; i1 < 9; ++i1) { - this.a(new Slot(playerinventory, i1 + l * 9 + 9, 8 + i1 * 18, 84 + l * 18)); - } - } - - for (l = 0; l < 9; ++l) { - this.a(new Slot(playerinventory, l, 8 + l * 18, 142)); - } - - this.a((IInventory) this.craftInventory); - } - - public void a(IInventory iinventory) { - // CraftBukkit start - CraftingManager.getInstance().lastCraftView = getBukkitView(); - ItemStack craftResult = CraftingManager.getInstance().craft(this.craftInventory, this.g); - this.resultInventory.setItem(0, craftResult); - if (super.listeners.size() < 1) { - return; - } - - EntityPlayer player = (EntityPlayer) super.listeners.get(0); // TODO: Is this _always_ correct? Seems like it. - player.playerConnection.sendPacket(new PacketPlayOutSetSlot(player.activeContainer.windowId, 0, craftResult)); - // CraftBukkit end - } - - public void b(EntityHuman entityhuman) { - super.b(entityhuman); - if (!this.g.isStatic) { - for (int i = 0; i < 9; ++i) { - ItemStack itemstack = this.craftInventory.splitWithoutUpdate(i); - - if (itemstack != null) { - entityhuman.drop(itemstack, false); - } - } - } - } - - public boolean a(EntityHuman entityhuman) { - if (!this.checkReachable) return true; // CraftBukkit - return this.g.getType(this.h, this.i, this.j) != Blocks.WORKBENCH ? false : entityhuman.e((double) this.h + 0.5D, (double) this.i + 0.5D, (double) this.j + 0.5D) <= 64.0D; - } - - public ItemStack b(EntityHuman entityhuman, int i) { - ItemStack itemstack = null; - Slot slot = (Slot) this.c.get(i); - - if (slot != null && slot.hasItem()) { - ItemStack itemstack1 = slot.getItem(); - - itemstack = itemstack1.cloneItemStack(); - if (i == 0) { - if (!this.a(itemstack1, 10, 46, true)) { - return null; - } - - slot.a(itemstack1, itemstack); - } else if (i >= 10 && i < 37) { - if (!this.a(itemstack1, 37, 46, false)) { - return null; - } - } else if (i >= 37 && i < 46) { - if (!this.a(itemstack1, 10, 37, false)) { - return null; - } - } else if (!this.a(itemstack1, 10, 46, false)) { - return null; - } - - if (itemstack1.count == 0) { - slot.set((ItemStack) null); - } else { - slot.f(); - } - - if (itemstack1.count == itemstack.count) { - return null; - } - - slot.a(entityhuman, itemstack1); - } - - return itemstack; - } - - public boolean a(ItemStack itemstack, Slot slot) { - return slot.inventory != this.resultInventory && super.a(itemstack, slot); - } - - // CraftBukkit start - public CraftInventoryView getBukkitView() { - if (bukkitEntity != null) { - return bukkitEntity; - } - - CraftInventoryCrafting inventory = new CraftInventoryCrafting(this.craftInventory, this.resultInventory); - bukkitEntity = new CraftInventoryView(this.player.player.getBukkitEntity(), inventory, this); - return bukkitEntity; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/ControllerLook.java b/src/main/java/net/minecraft/server/ControllerLook.java deleted file mode 100644 index f1e8b3dc..00000000 --- a/src/main/java/net/minecraft/server/ControllerLook.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.TrigMath; // CraftBukkit - -public class ControllerLook { - - private EntityInsentient a; - private float b; - private float c; - private boolean d; - private double e; - private double f; - private double g; - - public ControllerLook(EntityInsentient entityinsentient) { - this.a = entityinsentient; - } - - public void a(Entity entity, float f, float f1) { - this.e = entity.locX; - if (entity instanceof EntityLiving) { - this.f = entity.locY + (double) entity.getHeadHeight(); - } else { - this.f = (entity.boundingBox.b + entity.boundingBox.e) / 2.0D; - } - - this.g = entity.locZ; - this.b = f; - this.c = f1; - this.d = true; - } - - public void a(double d0, double d1, double d2, float f, float f1) { - this.e = d0; - this.f = d1; - this.g = d2; - this.b = f; - this.c = f1; - this.d = true; - } - - public void a() { - this.a.pitch = 0.0F; - if (this.d) { - this.d = false; - double d0 = this.e - this.a.locX; - double d1 = this.f - (this.a.locY + (double) this.a.getHeadHeight()); - double d2 = this.g - this.a.locZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - // CraftBukkit start - Math -> TrigMath - float f = (float) (TrigMath.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - float f1 = (float) (-(TrigMath.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); - // CraftBukkit end - - this.a.pitch = this.a(this.a.pitch, f1, this.c); - this.a.aO = this.a(this.a.aO, f, this.b); - } else { - this.a.aO = this.a(this.a.aO, this.a.aM, 10.0F); - } - - float f2 = MathHelper.g(this.a.aO - this.a.aM); - - if (!this.a.getNavigation().g()) { - if (f2 < -75.0F) { - this.a.aO = this.a.aM - 75.0F; - } - - if (f2 > 75.0F) { - this.a.aO = this.a.aM + 75.0F; - } - } - } - - private float a(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } -} diff --git a/src/main/java/net/minecraft/server/ControllerMove.java b/src/main/java/net/minecraft/server/ControllerMove.java deleted file mode 100644 index 525a4d17..00000000 --- a/src/main/java/net/minecraft/server/ControllerMove.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.minecraft.server; - -public class ControllerMove { - - private EntityInsentient a; - private double b; - private double c; - private double d; - private double e; - private boolean f; - - public ControllerMove(EntityInsentient entityinsentient) { - this.a = entityinsentient; - this.b = entityinsentient.locX; - this.c = entityinsentient.locY; - this.d = entityinsentient.locZ; - } - - public boolean a() { - return this.f; - } - - public double b() { - return this.e; - } - - public void a(double d0, double d1, double d2, double d3) { - this.b = d0; - this.c = d1; - this.d = d2; - this.e = d3; - this.f = true; - } - - public void c() { - this.a.n(0.0F); - if (this.f) { - this.f = false; - int i = MathHelper.floor(this.a.boundingBox.b + 0.5D); - double d0 = this.b - this.a.locX; - double d1 = this.d - this.a.locZ; - double d2 = this.c - (double) i; - double d3 = d0 * d0 + d2 * d2 + d1 * d1; - - if (d3 >= 2.500000277905201E-7D) { - // CraftBukkit - Math -> TrigMath - float f = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - - this.a.yaw = this.a(this.a.yaw, f, 30.0F); - this.a.i((float) (this.e * this.a.getAttributeInstance(GenericAttributes.d).getValue())); - if (d2 > 0.0D && d0 * d0 + d1 * d1 < 1.0D) { - this.a.getControllerJump().a(); - } - } - } - } - - private float a(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } -} diff --git a/src/main/java/net/minecraft/server/CraftingManager.java b/src/main/java/net/minecraft/server/CraftingManager.java deleted file mode 100644 index 9675edb2..00000000 --- a/src/main/java/net/minecraft/server/CraftingManager.java +++ /dev/null @@ -1,313 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class CraftingManager { - - private static final CraftingManager a = new CraftingManager(); - // CraftBukkit start - public List recipes = new ArrayList(); // private -> public - public IRecipe lastRecipe; - public org.bukkit.inventory.InventoryView lastCraftView; - // CraftBukkit end - - public static final CraftingManager getInstance() { - return a; - } - - // CraftBukkit - private -> public - public CraftingManager() { - (new RecipesTools()).a(this); - (new RecipesWeapons()).a(this); - (new RecipeIngots()).a(this); - (new RecipesFood()).a(this); - (new RecipesCrafting()).a(this); - (new RecipesArmor()).a(this); - (new RecipesDyes()).a(this); - this.recipes.add(new RecipeArmorDye()); - this.recipes.add(new RecipeBookClone()); - this.recipes.add(new RecipeMapClone()); - this.recipes.add(new RecipeMapExtend()); - this.recipes.add(new RecipeFireworks()); - this.registerShapedRecipe(new ItemStack(Items.PAPER, 3), new Object[] { "###", Character.valueOf('#'), Items.SUGAR_CANE}); - this.registerShapelessRecipe(new ItemStack(Items.BOOK, 1), new Object[] { Items.PAPER, Items.PAPER, Items.PAPER, Items.LEATHER}); - this.registerShapelessRecipe(new ItemStack(Items.BOOK_AND_QUILL, 1), new Object[] { Items.BOOK, new ItemStack(Items.INK_SACK, 1, 0), Items.FEATHER}); - this.registerShapedRecipe(new ItemStack(Blocks.FENCE, 2), new Object[] { "###", "###", Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.COBBLE_WALL, 6, 0), new Object[] { "###", "###", Character.valueOf('#'), Blocks.COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.COBBLE_WALL, 6, 1), new Object[] { "###", "###", Character.valueOf('#'), Blocks.MOSSY_COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.NETHER_FENCE, 6), new Object[] { "###", "###", Character.valueOf('#'), Blocks.NETHER_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.FENCE_GATE, 1), new Object[] { "#W#", "#W#", Character.valueOf('#'), Items.STICK, Character.valueOf('W'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.JUKEBOX, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.DIAMOND}); - this.registerShapedRecipe(new ItemStack(Items.LEASH, 2), new Object[] { "~~ ", "~O ", " ~", Character.valueOf('~'), Items.STRING, Character.valueOf('O'), Items.SLIME_BALL}); - this.registerShapedRecipe(new ItemStack(Blocks.NOTE_BLOCK, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.BOOKSHELF, 1), new Object[] { "###", "XXX", "###", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.BOOK}); - this.registerShapedRecipe(new ItemStack(Blocks.SNOW_BLOCK, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.SNOW_BALL}); - this.registerShapedRecipe(new ItemStack(Blocks.SNOW, 6), new Object[] { "###", Character.valueOf('#'), Blocks.SNOW_BLOCK}); - this.registerShapedRecipe(new ItemStack(Blocks.CLAY, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.CLAY_BALL}); - this.registerShapedRecipe(new ItemStack(Blocks.BRICK, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.CLAY_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.GLOWSTONE, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.GLOWSTONE_DUST}); - this.registerShapedRecipe(new ItemStack(Blocks.QUARTZ_BLOCK, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.QUARTZ}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOL, 1), new Object[] { "##", "##", Character.valueOf('#'), Items.STRING}); - this.registerShapedRecipe(new ItemStack(Blocks.TNT, 1), new Object[] { "X#X", "#X#", "X#X", Character.valueOf('X'), Items.SULPHUR, Character.valueOf('#'), Blocks.SAND}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 3), new Object[] { "###", Character.valueOf('#'), Blocks.COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 0), new Object[] { "###", Character.valueOf('#'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 1), new Object[] { "###", Character.valueOf('#'), Blocks.SANDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 4), new Object[] { "###", Character.valueOf('#'), Blocks.BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 5), new Object[] { "###", Character.valueOf('#'), Blocks.SMOOTH_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 6), new Object[] { "###", Character.valueOf('#'), Blocks.NETHER_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STEP, 6, 7), new Object[] { "###", Character.valueOf('#'), Blocks.QUARTZ_BLOCK}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 0), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 2), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 2)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 1), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 3), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 3)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 4), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 4)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STEP, 6, 5), new Object[] { "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 5)}); - this.registerShapedRecipe(new ItemStack(Blocks.LADDER, 3), new Object[] { "# #", "###", "# #", Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Items.WOOD_DOOR, 1), new Object[] { "##", "##", "##", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.TRAP_DOOR, 2), new Object[] { "###", "###", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Items.IRON_DOOR, 1), new Object[] { "##", "##", "##", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.SIGN, 3), new Object[] { "###", "###", " X ", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('X'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Items.CAKE, 1), new Object[] { "AAA", "BEB", "CCC", Character.valueOf('A'), Items.MILK_BUCKET, Character.valueOf('B'), Items.SUGAR, Character.valueOf('C'), Items.WHEAT, Character.valueOf('E'), Items.EGG}); - this.registerShapedRecipe(new ItemStack(Items.SUGAR, 1), new Object[] { "#", Character.valueOf('#'), Items.SUGAR_CANE}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 0), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 1), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 2), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 2)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 3), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG, 1, 3)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 4), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG2, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD, 4, 5), new Object[] { "#", Character.valueOf('#'), new ItemStack(Blocks.LOG2, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Items.STICK, 4), new Object[] { "#", "#", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.TORCH, 4), new Object[] { "X", "#", Character.valueOf('X'), Items.COAL, Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.TORCH, 4), new Object[] { "X", "#", Character.valueOf('X'), new ItemStack(Items.COAL, 1, 1), Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Items.BOWL, 4), new Object[] { "# #", " # ", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Items.GLASS_BOTTLE, 3), new Object[] { "# #", " # ", Character.valueOf('#'), Blocks.GLASS}); - this.registerShapedRecipe(new ItemStack(Blocks.RAILS, 16), new Object[] { "X X", "X#X", "X X", Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.GOLDEN_RAIL, 6), new Object[] { "X X", "X#X", "XRX", Character.valueOf('X'), Items.GOLD_INGOT, Character.valueOf('R'), Items.REDSTONE, Character.valueOf('#'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.ACTIVATOR_RAIL, 6), new Object[] { "XSX", "X#X", "XSX", Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('#'), Blocks.REDSTONE_TORCH_ON, Character.valueOf('S'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.DETECTOR_RAIL, 6), new Object[] { "X X", "X#X", "XRX", Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('R'), Items.REDSTONE, Character.valueOf('#'), Blocks.STONE_PLATE}); - this.registerShapedRecipe(new ItemStack(Items.MINECART, 1), new Object[] { "# #", "###", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.CAULDRON, 1), new Object[] { "# #", "# #", "###", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.BREWING_STAND, 1), new Object[] { " B ", "###", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('B'), Items.BLAZE_ROD}); - this.registerShapedRecipe(new ItemStack(Blocks.JACK_O_LANTERN, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.PUMPKIN, Character.valueOf('B'), Blocks.TORCH}); - this.registerShapedRecipe(new ItemStack(Items.STORAGE_MINECART, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.CHEST, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.POWERED_MINECART, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.FURNACE, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.MINECART_TNT, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.TNT, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.MINECART_HOPPER, 1), new Object[] { "A", "B", Character.valueOf('A'), Blocks.HOPPER, Character.valueOf('B'), Items.MINECART}); - this.registerShapedRecipe(new ItemStack(Items.BOAT, 1), new Object[] { "# #", "###", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Items.BUCKET, 1), new Object[] { "# #", " # ", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Items.FLOWER_POT, 1), new Object[] { "# #", " # ", Character.valueOf('#'), Items.CLAY_BRICK}); - this.registerShapelessRecipe(new ItemStack(Items.FLINT_AND_STEEL, 1), new Object[] { new ItemStack(Items.IRON_INGOT, 1), new ItemStack(Items.FLINT, 1)}); - this.registerShapedRecipe(new ItemStack(Items.BREAD, 1), new Object[] { "###", Character.valueOf('#'), Items.WHEAT}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 0)}); - this.registerShapedRecipe(new ItemStack(Blocks.BIRCH_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 2)}); - this.registerShapedRecipe(new ItemStack(Blocks.SPRUCE_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.JUNGLE_WOOD_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 3)}); - this.registerShapedRecipe(new ItemStack(Blocks.ACACIA_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 4)}); - this.registerShapedRecipe(new ItemStack(Blocks.DARK_OAK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), new ItemStack(Blocks.WOOD, 1, 5)}); - this.registerShapedRecipe(new ItemStack(Items.FISHING_ROD, 1), new Object[] { " #", " #X", "# X", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Items.STRING}); - this.registerShapedRecipe(new ItemStack(Items.CARROT_STICK, 1), new Object[] { "# ", " X", Character.valueOf('#'), Items.FISHING_ROD, Character.valueOf('X'), Items.CARROT}).c(); - this.registerShapedRecipe(new ItemStack(Blocks.COBBLESTONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.COBBLESTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.BRICK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.STONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.SMOOTH_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.NETHER_BRICK_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.NETHER_BRICK}); - this.registerShapedRecipe(new ItemStack(Blocks.SANDSTONE_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.SANDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.QUARTZ_STAIRS, 4), new Object[] { "# ", "## ", "###", Character.valueOf('#'), Blocks.QUARTZ_BLOCK}); - this.registerShapedRecipe(new ItemStack(Items.PAINTING, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Blocks.WOOL}); - this.registerShapedRecipe(new ItemStack(Items.ITEM_FRAME, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Items.LEATHER}); - this.registerShapedRecipe(new ItemStack(Items.GOLDEN_APPLE, 1, 0), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.GOLD_INGOT, Character.valueOf('X'), Items.APPLE}); - this.registerShapedRecipe(new ItemStack(Items.GOLDEN_APPLE, 1, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Blocks.GOLD_BLOCK, Character.valueOf('X'), Items.APPLE}); - this.registerShapedRecipe(new ItemStack(Items.CARROT_GOLDEN, 1, 0), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.GOLD_NUGGET, Character.valueOf('X'), Items.CARROT}); - this.registerShapedRecipe(new ItemStack(Items.SPECKLED_MELON, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.GOLD_NUGGET, Character.valueOf('X'), Items.MELON}); - this.registerShapedRecipe(new ItemStack(Blocks.LEVER, 1), new Object[] { "X", "#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('X'), Items.STICK}); - this.registerShapedRecipe(new ItemStack(Blocks.TRIPWIRE_SOURCE, 2), new Object[] { "I", "S", "#", Character.valueOf('#'), Blocks.WOOD, Character.valueOf('S'), Items.STICK, Character.valueOf('I'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Blocks.REDSTONE_TORCH_ON, 1), new Object[] { "X", "#", Character.valueOf('#'), Items.STICK, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Items.DIODE, 1), new Object[] { "#X#", "III", Character.valueOf('#'), Blocks.REDSTONE_TORCH_ON, Character.valueOf('X'), Items.REDSTONE, Character.valueOf('I'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Items.REDSTONE_COMPARATOR, 1), new Object[] { " # ", "#X#", "III", Character.valueOf('#'), Blocks.REDSTONE_TORCH_ON, Character.valueOf('X'), Items.QUARTZ, Character.valueOf('I'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Items.WATCH, 1), new Object[] { " # ", "#X#", " # ", Character.valueOf('#'), Items.GOLD_INGOT, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Items.COMPASS, 1), new Object[] { " # ", "#X#", " # ", Character.valueOf('#'), Items.IRON_INGOT, Character.valueOf('X'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Items.MAP_EMPTY, 1), new Object[] { "###", "#X#", "###", Character.valueOf('#'), Items.PAPER, Character.valueOf('X'), Items.COMPASS}); - this.registerShapedRecipe(new ItemStack(Blocks.STONE_BUTTON, 1), new Object[] { "#", Character.valueOf('#'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_BUTTON, 1), new Object[] { "#", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.STONE_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Blocks.STONE}); - this.registerShapedRecipe(new ItemStack(Blocks.WOOD_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.IRON_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Items.IRON_INGOT}); - this.registerShapedRecipe(new ItemStack(Blocks.GOLD_PLATE, 1), new Object[] { "##", Character.valueOf('#'), Items.GOLD_INGOT}); - this.registerShapedRecipe(new ItemStack(Blocks.DISPENSER, 1), new Object[] { "###", "#X#", "#R#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('X'), Items.BOW, Character.valueOf('R'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.DROPPER, 1), new Object[] { "###", "# #", "#R#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('R'), Items.REDSTONE}); - this.registerShapedRecipe(new ItemStack(Blocks.PISTON, 1), new Object[] { "TTT", "#X#", "#R#", Character.valueOf('#'), Blocks.COBBLESTONE, Character.valueOf('X'), Items.IRON_INGOT, Character.valueOf('R'), Items.REDSTONE, Character.valueOf('T'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.PISTON_STICKY, 1), new Object[] { "S", "P", Character.valueOf('S'), Items.SLIME_BALL, Character.valueOf('P'), Blocks.PISTON}); - this.registerShapedRecipe(new ItemStack(Items.BED, 1), new Object[] { "###", "XXX", Character.valueOf('#'), Blocks.WOOL, Character.valueOf('X'), Blocks.WOOD}); - this.registerShapedRecipe(new ItemStack(Blocks.ENCHANTMENT_TABLE, 1), new Object[] { " B ", "D#D", "###", Character.valueOf('#'), Blocks.OBSIDIAN, Character.valueOf('B'), Items.BOOK, Character.valueOf('D'), Items.DIAMOND}); - this.registerShapedRecipe(new ItemStack(Blocks.ANVIL, 1), new Object[] { "III", " i ", "iii", Character.valueOf('I'), Blocks.IRON_BLOCK, Character.valueOf('i'), Items.IRON_INGOT}); - this.registerShapelessRecipe(new ItemStack(Items.EYE_OF_ENDER, 1), new Object[] { Items.ENDER_PEARL, Items.BLAZE_POWDER}); - this.registerShapelessRecipe(new ItemStack(Items.FIREBALL, 3), new Object[] { Items.SULPHUR, Items.BLAZE_POWDER, Items.COAL}); - this.registerShapelessRecipe(new ItemStack(Items.FIREBALL, 3), new Object[] { Items.SULPHUR, Items.BLAZE_POWDER, new ItemStack(Items.COAL, 1, 1)}); - this.registerShapedRecipe(new ItemStack(Blocks.DAYLIGHT_DETECTOR), new Object[] { "GGG", "QQQ", "WWW", Character.valueOf('G'), Blocks.GLASS, Character.valueOf('Q'), Items.QUARTZ, Character.valueOf('W'), Blocks.WOOD_STEP}); - this.registerShapedRecipe(new ItemStack(Blocks.HOPPER), new Object[] { "I I", "ICI", " I ", Character.valueOf('I'), Items.IRON_INGOT, Character.valueOf('C'), Blocks.CHEST}); - // Collections.sort(this.recipes, new RecipeSorter(this)); // CraftBukkit - moved below - this.sort(); // CraftBukkit - call new sort method - } - - // CraftBukkit start - public void sort() { - Collections.sort(this.recipes, new RecipeSorter(this)); - } - // CraftBukkit end - - // CraftBukkit - default -> public - public ShapedRecipes registerShapedRecipe(ItemStack itemstack, Object... aobject) { - String s = ""; - int i = 0; - int j = 0; - int k = 0; - - if (aobject[i] instanceof String[]) { - String[] astring = (String[]) ((String[]) aobject[i++]); - - for (int l = 0; l < astring.length; ++l) { - String s1 = astring[l]; - - ++k; - j = s1.length(); - s = s + s1; - } - } else { - while (aobject[i] instanceof String) { - String s2 = (String) aobject[i++]; - - ++k; - j = s2.length(); - s = s + s2; - } - } - - HashMap hashmap; - - for (hashmap = new HashMap(); i < aobject.length; i += 2) { - Character character = (Character) aobject[i]; - ItemStack itemstack1 = null; - - if (aobject[i + 1] instanceof Item) { - itemstack1 = new ItemStack((Item) aobject[i + 1]); - } else if (aobject[i + 1] instanceof Block) { - itemstack1 = new ItemStack((Block) aobject[i + 1], 1, 32767); - } else if (aobject[i + 1] instanceof ItemStack) { - itemstack1 = (ItemStack) aobject[i + 1]; - } - - hashmap.put(character, itemstack1); - } - - ItemStack[] aitemstack = new ItemStack[j * k]; - - for (int i1 = 0; i1 < j * k; ++i1) { - char c0 = s.charAt(i1); - - if (hashmap.containsKey(Character.valueOf(c0))) { - aitemstack[i1] = ((ItemStack) hashmap.get(Character.valueOf(c0))).cloneItemStack(); - } else { - aitemstack[i1] = null; - } - } - - ShapedRecipes shapedrecipes = new ShapedRecipes(j, k, aitemstack, itemstack); - - this.recipes.add(shapedrecipes); - return shapedrecipes; - } - - // CraftBukkit - default -> public - public void registerShapelessRecipe(ItemStack itemstack, Object... aobject) { - ArrayList arraylist = new ArrayList(); - Object[] aobject1 = aobject; - int i = aobject.length; - - for (int j = 0; j < i; ++j) { - Object object = aobject1[j]; - - if (object instanceof ItemStack) { - arraylist.add(((ItemStack) object).cloneItemStack()); - } else if (object instanceof Item) { - arraylist.add(new ItemStack((Item) object)); - } else { - if (!(object instanceof Block)) { - throw new RuntimeException("Invalid shapeless recipy!"); - } - - arraylist.add(new ItemStack((Block) object)); - } - } - - this.recipes.add(new ShapelessRecipes(itemstack, arraylist)); - } - - public ItemStack craft(InventoryCrafting inventorycrafting, World world) { - int i = 0; - ItemStack itemstack = null; - ItemStack itemstack1 = null; - - int j; - - for (j = 0; j < inventorycrafting.getSize(); ++j) { - ItemStack itemstack2 = inventorycrafting.getItem(j); - - if (itemstack2 != null) { - if (i == 0) { - itemstack = itemstack2; - } - - if (i == 1) { - itemstack1 = itemstack2; - } - - ++i; - } - } - - if (i == 2 && itemstack.getItem() == itemstack1.getItem() && itemstack.count == 1 && itemstack1.count == 1 && itemstack.getItem().usesDurability()) { - Item item = itemstack.getItem(); - int k = item.getMaxDurability() - itemstack.j(); - int l = item.getMaxDurability() - itemstack1.j(); - int i1 = k + l + item.getMaxDurability() * 5 / 100; - int j1 = item.getMaxDurability() - i1; - - if (j1 < 0) { - j1 = 0; - } - - // CraftBukkit start - Construct a dummy repair recipe - ItemStack result = new ItemStack(itemstack.getItem(), 1, j1); - List<ItemStack> ingredients = new ArrayList<ItemStack>(); - ingredients.add(itemstack.cloneItemStack()); - ingredients.add(itemstack1.cloneItemStack()); - ShapelessRecipes recipe = new ShapelessRecipes(result.cloneItemStack(), ingredients); - inventorycrafting.currentRecipe = recipe; - result = CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, true); - return result; - // CraftBukkit end - } else { - for (j = 0; j < this.recipes.size(); ++j) { - IRecipe irecipe = (IRecipe) this.recipes.get(j); - - if (irecipe.a(inventorycrafting, world)) { - // CraftBukkit start - INVENTORY_PRE_CRAFT event - inventorycrafting.currentRecipe = irecipe; - ItemStack result = irecipe.a(inventorycrafting); - return CraftEventFactory.callPreCraftEvent(inventorycrafting, result, lastCraftView, false); - // CraftBukkit end - } - } - - inventorycrafting.currentRecipe = null; // CraftBukkit - Clear recipe when no recipe is found - return null; - } - } - - public List getRecipes() { - return this.recipes; - } -} diff --git a/src/main/java/net/minecraft/server/CrashReport.java b/src/main/java/net/minecraft/server/CrashReport.java deleted file mode 100644 index 7e060027..00000000 --- a/src/main/java/net/minecraft/server/CrashReport.java +++ /dev/null @@ -1,235 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.FileWriter; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.Callable; - -import net.minecraft.util.org.apache.commons.io.IOUtils; -import net.minecraft.util.org.apache.commons.lang3.ArrayUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class CrashReport { - - private static final Logger a = LogManager.getLogger(); - private final String b; - private final Throwable c; - private final CrashReportSystemDetails d = new CrashReportSystemDetails(this, "System Details"); - private final List e = new ArrayList(); - private File f; - private boolean g = true; - private StackTraceElement[] h = new StackTraceElement[0]; - - public CrashReport(String s, Throwable throwable) { - this.b = s; - this.c = throwable; - this.h(); - } - - private void h() { - this.d.a("Minecraft Version", (Callable) (new CrashReportVersion(this))); - this.d.a("Operating System", (Callable) (new CrashReportOperatingSystem(this))); - this.d.a("Java Version", (Callable) (new CrashReportJavaVersion(this))); - this.d.a("Java VM Version", (Callable) (new CrashReportJavaVMVersion(this))); - this.d.a("Memory", (Callable) (new CrashReportMemory(this))); - this.d.a("JVM Flags", (Callable) (new CrashReportJVMFlags(this))); - this.d.a("AABB Pool Size", (Callable) (new CrashReportAABBPoolSize(this))); - this.d.a("IntCache", (Callable) (new CrashReportIntCacheSize(this))); - this.d.a("CraftBukkit Information", (Callable) (new org.bukkit.craftbukkit.CraftCrashReport())); // CraftBukkit - } - - public String a() { - return this.b; - } - - public Throwable b() { - return this.c; - } - - public void a(StringBuilder stringbuilder) { - if ((this.h == null || this.h.length <= 0) && this.e.size() > 0) { - this.h = (StackTraceElement[]) ArrayUtils.subarray(((CrashReportSystemDetails) this.e.get(0)).a(), 0, 1); - } - - if (this.h != null && this.h.length > 0) { - stringbuilder.append("-- Head --\n"); - stringbuilder.append("Stacktrace:\n"); - StackTraceElement[] astacktraceelement = this.h; - int i = astacktraceelement.length; - - for (int j = 0; j < i; ++j) { - StackTraceElement stacktraceelement = astacktraceelement[j]; - - stringbuilder.append("\t").append("at ").append(stacktraceelement.toString()); - stringbuilder.append("\n"); - } - - stringbuilder.append("\n"); - } - - Iterator iterator = this.e.iterator(); - - while (iterator.hasNext()) { - CrashReportSystemDetails crashreportsystemdetails = (CrashReportSystemDetails) iterator.next(); - - crashreportsystemdetails.a(stringbuilder); - stringbuilder.append("\n\n"); - } - - this.d.a(stringbuilder); - } - - public String d() { - StringWriter stringwriter = null; - PrintWriter printwriter = null; - Object object = this.c; - - if (((Throwable) object).getMessage() == null) { - if (object instanceof NullPointerException) { - object = new NullPointerException(this.b); - } else if (object instanceof StackOverflowError) { - object = new StackOverflowError(this.b); - } else if (object instanceof OutOfMemoryError) { - object = new OutOfMemoryError(this.b); - } - - ((Throwable) object).setStackTrace(this.c.getStackTrace()); - } - - String s = ((Throwable) object).toString(); - - try { - stringwriter = new StringWriter(); - printwriter = new PrintWriter(stringwriter); - ((Throwable) object).printStackTrace(printwriter); - s = stringwriter.toString(); - } finally { - IOUtils.closeQuietly(stringwriter); - IOUtils.closeQuietly(printwriter); - } - - return s; - } - - public String e() { - StringBuilder stringbuilder = new StringBuilder(); - - stringbuilder.append("---- Minecraft Crash Report ----\n"); - stringbuilder.append("// "); - stringbuilder.append(i()); - stringbuilder.append("\n\n"); - stringbuilder.append("Time: "); - stringbuilder.append((new SimpleDateFormat()).format(new Date())); - stringbuilder.append("\n"); - stringbuilder.append("Description: "); - stringbuilder.append(this.b); - stringbuilder.append("\n\n"); - stringbuilder.append(this.d()); - stringbuilder.append("\n\nA detailed walkthrough of the error, its code path and all known details is as follows:\n"); - - for (int i = 0; i < 87; ++i) { - stringbuilder.append("-"); - } - - stringbuilder.append("\n\n"); - this.a(stringbuilder); - return stringbuilder.toString(); - } - - public boolean a(File file1) { - if (this.f != null) { - return false; - } else { - if (file1.getParentFile() != null) { - file1.getParentFile().mkdirs(); - } - - try { - FileWriter filewriter = new FileWriter(file1); - - filewriter.write(this.e()); - filewriter.close(); - this.f = file1; - return true; - } catch (Throwable throwable) { - a.error("Could not save crash report to " + file1, throwable); - return false; - } - } - } - - public CrashReportSystemDetails g() { - return this.d; - } - - public CrashReportSystemDetails a(String s) { - return this.a(s, 1); - } - - public CrashReportSystemDetails a(String s, int i) { - CrashReportSystemDetails crashreportsystemdetails = new CrashReportSystemDetails(this, s); - - if (this.g) { - int j = crashreportsystemdetails.a(i); - StackTraceElement[] astacktraceelement = this.c.getStackTrace(); - StackTraceElement stacktraceelement = null; - StackTraceElement stacktraceelement1 = null; - int k = astacktraceelement.length - j; - - if (k < 0) { - System.out.println("Negative index in crash report handler (" + astacktraceelement.length + "/" + j + ")"); - } - - if (astacktraceelement != null && 0 <= k && k < astacktraceelement.length) { - stacktraceelement = astacktraceelement[k]; - if (astacktraceelement.length + 1 - j < astacktraceelement.length) { - stacktraceelement1 = astacktraceelement[astacktraceelement.length + 1 - j]; - } - } - - this.g = crashreportsystemdetails.a(stacktraceelement, stacktraceelement1); - if (j > 0 && !this.e.isEmpty()) { - CrashReportSystemDetails crashreportsystemdetails1 = (CrashReportSystemDetails) this.e.get(this.e.size() - 1); - - crashreportsystemdetails1.b(j); - } else if (astacktraceelement != null && astacktraceelement.length >= j && 0 <= k && k < astacktraceelement.length) { - this.h = new StackTraceElement[astacktraceelement.length - j]; - System.arraycopy(astacktraceelement, 0, this.h, 0, this.h.length); - } else { - this.g = false; - } - } - - this.e.add(crashreportsystemdetails); - return crashreportsystemdetails; - } - - private static String i() { - String[] astring = new String[] { "Who set us up the TNT?", "Everything\'s going to plan. No, really, that was supposed to happen.", "Uh... Did I do that?", "Oops.", "Why did you do that?", "I feel sad now :(", "My bad.", "I\'m sorry, Dave.", "I let you down. Sorry :(", "On the bright side, I bought you a teddy bear!", "Daisy, daisy...", "Oh - I know what I did wrong!", "Hey, that tickles! Hehehe!", "I blame Dinnerbone.", "You should try our sister game, Minceraft!", "Don\'t be sad. I\'ll do better next time, I promise!", "Don\'t be sad, have a hug! <3", "I just don\'t know what went wrong :(", "Shall we play a game?", "Quite honestly, I wouldn\'t worry myself about that.", "I bet Cylons wouldn\'t have this problem.", "Sorry :(", "Surprise! Haha. Well, this is awkward.", "Would you like a cupcake?", "Hi. I\'m Minecraft, and I\'m a crashaholic.", "Ooh. Shiny.", "This doesn\'t make any sense!", "Why is it breaking :(", "Don\'t do that.", "Ouch. That hurt :(", "You\'re mean.", "This is a token for 1 free hug. Redeem at your nearest Mojangsta: [~~HUG~~]", "There are four lights!", "But it works on my machine."}; - - try { - return astring[(int) (System.nanoTime() % (long) astring.length)]; - } catch (Throwable throwable) { - return "Witty comment unavailable :("; - } - } - - public static CrashReport a(Throwable throwable, String s) { - CrashReport crashreport; - - if (throwable instanceof ReportedException) { - crashreport = ((ReportedException) throwable).a(); - } else { - crashreport = new CrashReport(s, throwable); - } - - return crashreport; - } -} diff --git a/src/main/java/net/minecraft/server/DedicatedServer.java b/src/main/java/net/minecraft/server/DedicatedServer.java deleted file mode 100644 index 83f2dad5..00000000 --- a/src/main/java/net/minecraft/server/DedicatedServer.java +++ /dev/null @@ -1,472 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.IOException; -import java.net.InetAddress; -import java.net.Proxy; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.io.PrintStream; -import org.apache.logging.log4j.Level; - -import org.bukkit.craftbukkit.LoggerOutputStream; -import org.bukkit.event.server.ServerCommandEvent; -// CraftBukkit end - -public class DedicatedServer extends MinecraftServer implements IMinecraftServer { - - private static final Logger i = LogManager.getLogger(); - private final List j = Collections.synchronizedList(new ArrayList()); - private RemoteStatusListener k; - private RemoteControlListener l; - public PropertyManager propertyManager; // CraftBukkit - private -> public - private EULA n; - private boolean generateStructures; - private EnumGamemode p; - private boolean q; - - // CraftBukkit start - Signature changed - public DedicatedServer(joptsimple.OptionSet options) { - super(options, Proxy.NO_PROXY); - // super(file1, Proxy.NO_PROXY); - // CraftBukkit end - new ThreadSleepForever(this, "Server Infinisleeper"); - } - - protected boolean init() throws java.net.UnknownHostException { // CraftBukkit - throws UnknownHostException - ThreadCommandReader threadcommandreader = new ThreadCommandReader(this, "Server console handler"); - - threadcommandreader.setDaemon(true); - threadcommandreader.start(); - - // CraftBukkit start - TODO: handle command-line logging arguments - java.util.logging.Logger global = java.util.logging.Logger.getLogger(""); - global.setUseParentHandlers(false); - for (java.util.logging.Handler handler : global.getHandlers()) { - global.removeHandler(handler); - } - global.addHandler(new org.bukkit.craftbukkit.util.ForwardLogHandler()); - - final org.apache.logging.log4j.core.Logger logger = ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()); - for (org.apache.logging.log4j.core.Appender appender : logger.getAppenders().values()) { - if (appender instanceof org.apache.logging.log4j.core.appender.ConsoleAppender) { - logger.removeAppender(appender); - } - } - - new Thread(new org.bukkit.craftbukkit.util.TerminalConsoleWriterThread(System.out, this.reader)).start(); - - System.setOut(new PrintStream(new LoggerOutputStream(logger, Level.INFO), true)); - System.setErr(new PrintStream(new LoggerOutputStream(logger, Level.WARN), true)); - // CraftBukkit end - - i.info("Starting minecraft server version 1.7.10"); - if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { - i.warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\""); - } - - i.info("Loading properties"); - this.propertyManager = new PropertyManager(this.options); // CraftBukkit - CLI argument support - this.n = new EULA(new File("eula.txt")); - if (!this.n.a()) { - i.info("You need to agree to the EULA in order to run the server. Go to eula.txt for more info."); - this.n.b(); - return false; - } else { - if (this.N()) { - this.c("127.0.0.1"); - } else { - this.setOnlineMode(this.propertyManager.getBoolean("online-mode", true)); - this.c(this.propertyManager.getString("server-ip", "")); - } - - this.setSpawnAnimals(this.propertyManager.getBoolean("spawn-animals", true)); - this.setSpawnNPCs(this.propertyManager.getBoolean("spawn-npcs", true)); - this.setPvP(this.propertyManager.getBoolean("pvp", true)); - this.setAllowFlight(this.propertyManager.getBoolean("allow-flight", false)); - this.setTexturePack(this.propertyManager.getString("resource-pack", "")); - this.setMotd(this.propertyManager.getString("motd", "A Minecraft Server")); - this.setForceGamemode(this.propertyManager.getBoolean("force-gamemode", false)); - this.setIdleTimeout(this.propertyManager.getInt("player-idle-timeout", 0)); - if (this.propertyManager.getInt("difficulty", 1) < 0) { - this.propertyManager.setProperty("difficulty", Integer.valueOf(0)); - } else if (this.propertyManager.getInt("difficulty", 1) > 3) { - this.propertyManager.setProperty("difficulty", Integer.valueOf(3)); - } - - this.generateStructures = this.propertyManager.getBoolean("generate-structures", true); - int gamemode = this.propertyManager.getInt("gamemode", EnumGamemode.SURVIVAL.getId()); // CraftBukkit - Unique name to avoid stomping on logger - - this.p = WorldSettings.a(gamemode); // CraftBukkit - Use new name - i.info("Default game type: " + this.p); - InetAddress inetaddress = null; - - if (this.getServerIp().length() > 0) { - inetaddress = InetAddress.getByName(this.getServerIp()); - } - - if (this.L() < 0) { - this.setPort(this.propertyManager.getInt("server-port", 25565)); - } - - i.info("Generating keypair"); - this.a(MinecraftEncryption.b()); - i.info("Starting Minecraft server on " + (this.getServerIp().length() == 0 ? "*" : this.getServerIp()) + ":" + this.L()); - - try { - this.ai().a(inetaddress, this.L()); - } catch (Throwable ioexception) { // CraftBukkit - IOException -> Throwable - i.warn("**** FAILED TO BIND TO PORT!"); - i.warn("The exception was: {}", new Object[] { ioexception.toString()}); - i.warn("Perhaps a server is already running on that port?"); - return false; - } - - this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - - if (!this.getOnlineMode()) { - i.warn("**** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!"); - i.warn("The server will make no attempt to authenticate usernames. Beware."); - i.warn("While this makes the game possible to play without internet access, it also opens up the ability for hackers to connect with any username they choose."); - i.warn("To change this, set \"online-mode\" to \"true\" in the server.properties file."); - } - - if (this.aE()) { - this.getUserCache().c(); - } - - if (!NameReferencingFileConverter.a(this.propertyManager)) { - return false; - } else { - // this.a((PlayerList) (new DedicatedPlayerList(this))); // CraftBukkit - moved up - this.convertable = new WorldLoaderServer(server.getWorldContainer()); // CraftBukkit - moved from MinecraftServer constructor - long j = System.nanoTime(); - - if (this.O() == null) { - this.k(this.propertyManager.getString("level-name", "world")); - } - - String s = this.propertyManager.getString("level-seed", ""); - String s1 = this.propertyManager.getString("level-type", "DEFAULT"); - String s2 = this.propertyManager.getString("generator-settings", ""); - long k = (new Random()).nextLong(); - - if (s.length() > 0) { - try { - long l = Long.parseLong(s); - - if (l != 0L) { - k = l; - } - } catch (NumberFormatException numberformatexception) { - k = (long) s.hashCode(); - } - } - - WorldType worldtype = WorldType.getType(s1); - - if (worldtype == null) { - worldtype = WorldType.NORMAL; - } - - this.at(); - this.getEnableCommandBlock(); - this.l(); - this.getSnooperEnabled(); - this.c(this.propertyManager.getInt("max-build-height", 256)); - this.c((this.getMaxBuildHeight() + 8) / 16 * 16); - this.c(MathHelper.a(this.getMaxBuildHeight(), 64, 256)); - this.propertyManager.setProperty("max-build-height", Integer.valueOf(this.getMaxBuildHeight())); - i.info("Preparing level \"" + this.O() + "\""); - this.a(this.O(), this.O(), k, worldtype, s2); - long i1 = System.nanoTime() - j; - String s3 = String.format("%.3fs", new Object[] { Double.valueOf((double) i1 / 1.0E9D)}); - - i.info("Done (" + s3 + ")! For help, type \"help\" or \"?\""); - if (this.propertyManager.getBoolean("enable-query", false)) { - i.info("Starting GS4 status listener"); - this.k = new RemoteStatusListener(this); - this.k.a(); - } - - if (this.propertyManager.getBoolean("enable-rcon", false)) { - i.info("Starting remote control listener"); - this.l = new RemoteControlListener(this); - this.l.a(); - this.remoteConsole = new org.bukkit.craftbukkit.command.CraftRemoteConsoleCommandSender(); // CraftBukkit - } - - // CraftBukkit start - if (this.server.getBukkitSpawnRadius() > -1) { - i.info("'settings.spawn-radius' in bukkit.yml has been moved to 'spawn-protection' in server.properties. I will move your config for you."); - this.propertyManager.properties.remove("spawn-protection"); - this.propertyManager.getInt("spawn-protection", this.server.getBukkitSpawnRadius()); - this.server.removeBukkitSpawnRadius(); - this.propertyManager.savePropertiesFile(); - } - // CraftBukkit end - - return true; - } - } - } - - // CraftBukkit start - public PropertyManager getPropertyManager() { - return this.propertyManager; - } - // CraftBukkit end - - public boolean getGenerateStructures() { - return this.generateStructures; - } - - public EnumGamemode getGamemode() { - return this.p; - } - - public EnumDifficulty getDifficulty() { - return EnumDifficulty.getById(this.propertyManager.getInt("difficulty", 1)); - } - - public boolean isHardcore() { - return this.propertyManager.getBoolean("hardcore", false); - } - - protected void a(CrashReport crashreport) {} - - public CrashReport b(CrashReport crashreport) { - crashreport = super.b(crashreport); - crashreport.g().a("Is Modded", (Callable) (new CrashReportModded(this))); - crashreport.g().a("Type", (Callable) (new CrashReportType(this))); - return crashreport; - } - - protected void t() { - System.exit(0); - } - - public void v() { // CraftBukkit - protected -> public (decompile error?) - super.v(); - this.aB(); - } - - public boolean getAllowNether() { - return this.propertyManager.getBoolean("allow-nether", true); - } - - public boolean getSpawnMonsters() { - return this.propertyManager.getBoolean("spawn-monsters", true); - } - - public void a(MojangStatisticsGenerator mojangstatisticsgenerator) { - mojangstatisticsgenerator.a("whitelist_enabled", Boolean.valueOf(this.aC().getHasWhitelist())); - mojangstatisticsgenerator.a("whitelist_count", Integer.valueOf(this.aC().getWhitelisted().length)); - super.a(mojangstatisticsgenerator); - } - - public boolean getSnooperEnabled() { - return this.propertyManager.getBoolean("snooper-enabled", true); - } - - public void issueCommand(String s, ICommandListener icommandlistener) { - this.j.add(new ServerCommand(s, icommandlistener)); - } - - public void aB() { - while (!this.j.isEmpty()) { - ServerCommand servercommand = (ServerCommand) this.j.remove(0); - - // CraftBukkit start - ServerCommand for preprocessing - ServerCommandEvent event = new ServerCommandEvent(this.console, servercommand.command); - this.server.getPluginManager().callEvent(event); - servercommand = new ServerCommand(event.getCommand(), servercommand.source); - - // this.getCommandHandler().a(servercommand.source, servercommand.command); // Called in dispatchServerCommand - this.server.dispatchServerCommand(this.console, servercommand); - // CraftBukkit end - } - } - - public boolean X() { - return true; - } - - public DedicatedPlayerList aC() { - return (DedicatedPlayerList) super.getPlayerList(); - } - - public int a(String s, int i) { - return this.propertyManager.getInt(s, i); - } - - public String a(String s, String s1) { - return this.propertyManager.getString(s, s1); - } - - public boolean a(String s, boolean flag) { - return this.propertyManager.getBoolean(s, flag); - } - - public void a(String s, Object object) { - this.propertyManager.setProperty(s, object); - } - - public void a() { - this.propertyManager.savePropertiesFile(); - } - - public String b() { - File file1 = this.propertyManager.c(); - - return file1 != null ? file1.getAbsolutePath() : "No settings file"; - } - - public void aD() { - ServerGUI.a(this); - this.q = true; - } - - public boolean ak() { - return this.q; - } - - public String a(EnumGamemode enumgamemode, boolean flag) { - return ""; - } - - public boolean getEnableCommandBlock() { - return this.propertyManager.getBoolean("enable-command-block", false); - } - - public int getSpawnProtection() { - return this.propertyManager.getInt("spawn-protection", super.getSpawnProtection()); - } - - public boolean a(World world, int i, int j, int k, EntityHuman entityhuman) { - if (world.worldProvider.dimension != 0) { - return false; - } else if (this.aC().getOPs().isEmpty()) { - return false; - } else if (this.aC().isOp(entityhuman.getProfile())) { - return false; - } else if (this.getSpawnProtection() <= 0) { - return false; - } else { - ChunkCoordinates chunkcoordinates = world.getSpawn(); - int l = MathHelper.a(i - chunkcoordinates.x); - int i1 = MathHelper.a(k - chunkcoordinates.z); - int j1 = Math.max(l, i1); - - return j1 <= this.getSpawnProtection(); - } - } - - public int l() { - return this.propertyManager.getInt("op-permission-level", 4); - } - - public void setIdleTimeout(int i) { - super.setIdleTimeout(i); - this.propertyManager.setProperty("player-idle-timeout", Integer.valueOf(i)); - this.a(); - } - - public boolean m() { - return this.propertyManager.getBoolean("broadcast-rcon-to-ops", true); - } - - public boolean at() { - return this.propertyManager.getBoolean("announce-player-achievements", true); - } - - protected boolean aE() { - boolean flag = false; - - int i; - - for (i = 0; !flag && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the user banlist, retrying in a few seconds"); - this.aG(); - } - - flag = NameReferencingFileConverter.a((MinecraftServer) this); - } - - boolean flag1 = false; - - for (i = 0; !flag1 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the ip banlist, retrying in a few seconds"); - this.aG(); - } - - flag1 = NameReferencingFileConverter.b((MinecraftServer) this); - } - - boolean flag2 = false; - - for (i = 0; !flag2 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the op list, retrying in a few seconds"); - this.aG(); - } - - flag2 = NameReferencingFileConverter.c((MinecraftServer) this); - } - - boolean flag3 = false; - - for (i = 0; !flag3 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the whitelist, retrying in a few seconds"); - this.aG(); - } - - flag3 = NameReferencingFileConverter.d((MinecraftServer) this); - } - - boolean flag4 = false; - - for (i = 0; !flag4 && i <= 2; ++i) { - if (i > 0) { - // CraftBukkit - Fix decompiler stomping on field - DedicatedServer.i.warn("Encountered a problem while converting the player save files, retrying in a few seconds"); - this.aG(); - } - - flag4 = NameReferencingFileConverter.a(this, this.propertyManager); - } - - return flag || flag1 || flag2 || flag3 || flag4; - } - - private void aG() { - try { - Thread.sleep(5000L); - } catch (InterruptedException interruptedexception) { - ; - } - } - - public PlayerList getPlayerList() { - return this.aC(); - } - - static Logger aF() { - return i; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorArmor.java b/src/main/java/net/minecraft/server/DispenseBehaviorArmor.java deleted file mode 100644 index 9df12c0f..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorArmor.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorArmor extends DispenseBehaviorItem { - - DispenseBehaviorArmor() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - AxisAlignedBB axisalignedbb = AxisAlignedBB.a((double) i, (double) j, (double) k, (double) (i + 1), (double) (j + 1), (double) (k + 1)); - List list = isourceblock.k().a(EntityLiving.class, axisalignedbb, (IEntitySelector) (new EntitySelectorEquipable(itemstack))); - - if (list.size() > 0) { - EntityLiving entityliving = (EntityLiving) list.get(0); - int l = entityliving instanceof EntityHuman ? 1 : 0; - int i1 = EntityInsentient.b(itemstack); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - World world = isourceblock.k(); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - itemstack1.count = 1; - entityliving.setEquipment(i1 - l, itemstack1); - if (entityliving instanceof EntityInsentient) { - ((EntityInsentient) entityliving).a(i1, 2.0F); - } - - // --itemstack.count; // CraftBukkit - handled above - return itemstack; - } else { - return super.b(isourceblock, itemstack); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorBoat.java b/src/main/java/net/minecraft/server/DispenseBehaviorBoat.java deleted file mode 100644 index 5bd6ec75..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorBoat.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorBoat extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorBoat() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - double d0 = isourceblock.getX() + (double) ((float) enumfacing.getAdjacentX() * 1.125F); - double d1 = isourceblock.getY() + (double) ((float) enumfacing.getAdjacentY() * 1.125F); - double d2 = isourceblock.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 1.125F); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - Material material = world.getType(i, j, k).getMaterial(); - double d3; - - if (Material.WATER.equals(material)) { - d3 = 1.0D; - } else { - if (!Material.AIR.equals(material) || !Material.WATER.equals(world.getType(i, j - 1, k).getMaterial())) { - return this.b.a(isourceblock, itemstack); - } - - d3 = 0.0D; - } - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - EntityBoat entityboat = new EntityBoat(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); - // CraftBukkit end - - world.addEntity(entityboat); - // itemstack.a(1); // CraftBukkit - handled during event processing - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java b/src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java deleted file mode 100644 index b547bc97..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorBonemeal.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorBonemeal extends DispenseBehaviorItem { - - private boolean b = true; - - DispenseBehaviorBonemeal() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - if (itemstack.getData() == 15) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asNewCraftStack(itemstack.getItem()); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - if (ItemDye.a(itemstack, world, i, j, k)) { - if (!world.isStatic) { - world.triggerEffect(2005, i, j, k, 0); - } - } else { - this.b = false; - } - - return itemstack; - } else { - return super.b(isourceblock, itemstack); - } - } - - protected void a(ISourceBlock isourceblock) { - if (this.b) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } else { - isourceblock.k().triggerEffect(1001, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java b/src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java deleted file mode 100644 index d7decfce..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorEmptyBucket.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorEmptyBucket extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorEmptyBucket() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - Material material = world.getType(i, j, k).getMaterial(); - int l = world.getData(i, j, k); - Item item; - - if (Material.WATER.equals(material) && l == 0) { - item = Items.WATER_BUCKET; - } else { - if (!Material.LAVA.equals(material) || l != 0) { - return super.b(isourceblock, itemstack); - } - - item = Items.LAVA_BUCKET; - } - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(i, j, k)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - world.setAir(i, j, k); - if (--itemstack.count == 0) { - itemstack.setItem(item); - itemstack.count = 1; - } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { - this.b.a(isourceblock, new ItemStack(item)); - } - - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java b/src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java deleted file mode 100644 index 4a3691a1..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFilledBucket.java +++ /dev/null @@ -1,69 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFilledBucket extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorFilledBucket() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - ItemBucket itembucket = (ItemBucket) itemstack.getItem(); - int i = isourceblock.getBlockX(); - int j = isourceblock.getBlockY(); - int k = isourceblock.getBlockZ(); - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - - // CraftBukkit start - World world = isourceblock.k(); - int x = i + enumfacing.getAdjacentX(); - int y = j + enumfacing.getAdjacentY(); - int z = k + enumfacing.getAdjacentZ(); - if (world.isEmpty(x, y, z) || !world.getType(x, y, z).getMaterial().isBuildable()) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(x, y, z)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itembucket = (ItemBucket) CraftItemStack.asNMSCopy(event.getItem()).getItem(); - } - // CraftBukkit end - - if (itembucket.a(isourceblock.k(), i + enumfacing.getAdjacentX(), j + enumfacing.getAdjacentY(), k + enumfacing.getAdjacentZ())) { - // CraftBukkit start - Handle stacked buckets - Item item = Items.BUCKET; - if (--itemstack.count == 0) { - itemstack.setItem(Items.BUCKET); - itemstack.count = 1; - } else if (((TileEntityDispenser) isourceblock.getTileEntity()).addItem(new ItemStack(item)) < 0) { - this.b.a(isourceblock, new ItemStack(item)); - } - // CraftBukkit end - - return itemstack; - } else { - return this.b.a(isourceblock, itemstack); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFireball.java b/src/main/java/net/minecraft/server/DispenseBehaviorFireball.java deleted file mode 100644 index d16f035f..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFireball.java +++ /dev/null @@ -1,65 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFireball extends DispenseBehaviorItem { - - DispenseBehaviorFireball() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - IPosition iposition = BlockDispenser.a(isourceblock); - double d0 = iposition.getX() + (double) ((float) enumfacing.getAdjacentX() * 0.3F); - double d1 = iposition.getY() + (double) ((float) enumfacing.getAdjacentY() * 0.3F); - double d2 = iposition.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 0.3F); - World world = isourceblock.k(); - Random random = world.random; - double d3 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentX(); - double d4 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentY(); - double d5 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentZ(); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d3, d4, d5)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - EntitySmallFireball entitysmallfireball = new EntitySmallFireball(world, d0, d1, d2, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ()); - entitysmallfireball.projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); - - world.addEntity(entitysmallfireball); - // itemstack.a(1); // Handled during event processing - // CraftBukkit end - - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1009, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java b/src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java deleted file mode 100644 index 09a0842b..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFireworks.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFireworks extends DispenseBehaviorItem { - - DispenseBehaviorFireworks() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - double d0 = isourceblock.getX() + (double) enumfacing.getAdjacentX(); - double d1 = (double) ((float) isourceblock.getBlockY() + 0.2F); - double d2 = isourceblock.getZ() + (double) enumfacing.getAdjacentZ(); - - // CraftBukkit start - World world = isourceblock.k(); - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - EntityFireworks entityfireworks = new EntityFireworks(isourceblock.k(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), itemstack1); - - isourceblock.k().addEntity(entityfireworks); - // itemstack.a(1); // Handled during event processing - // CraftBukkit end - - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1002, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java b/src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java deleted file mode 100644 index c4bbd6b3..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorFlintAndSteel.java +++ /dev/null @@ -1,71 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorFlintAndSteel extends DispenseBehaviorItem { - - private boolean b = true; - - DispenseBehaviorFlintAndSteel() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(0, 0, 0)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - // CraftBukkit end - - if (world.isEmpty(i, j, k)) { - // CraftBukkit start - Ignition by dispensing flint and steel - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()).isCancelled()) { - world.setTypeUpdate(i, j, k, Blocks.FIRE); - if (itemstack.isDamaged(1, world.random)) { - itemstack.count = 0; - } - } - // CraftBukkit end - } else if (world.getType(i, j, k) == Blocks.TNT) { - Blocks.TNT.postBreak(world, i, j, k, 1); - world.setAir(i, j, k); - } else { - this.b = false; - } - - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - if (this.b) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } else { - isourceblock.k().triggerEffect(1001, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorItem.java b/src/main/java/net/minecraft/server/DispenseBehaviorItem.java deleted file mode 100644 index e7196db0..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorItem.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -public class DispenseBehaviorItem implements IDispenseBehavior { - - public DispenseBehaviorItem() {} - - public final ItemStack a(ISourceBlock isourceblock, ItemStack itemstack) { - ItemStack itemstack1 = this.b(isourceblock, itemstack); - - this.a(isourceblock); - this.a(isourceblock, BlockDispenser.b(isourceblock.h())); - return itemstack1; - } - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - IPosition iposition = BlockDispenser.a(isourceblock); - ItemStack itemstack1 = itemstack.a(1); - - // CraftBukkit start - if (!a(isourceblock.k(), itemstack1, 6, enumfacing, isourceblock)) { - itemstack.count++; - } - // CraftBukkit end - - return itemstack; - } - - // CraftBukkit start - void -> boolean return, IPosition -> ISourceBlock last argument - public static boolean a(World world, ItemStack itemstack, int i, EnumFacing enumfacing, ISourceBlock isourceblock) { - IPosition iposition = BlockDispenser.a(isourceblock); - // CraftBukkit end - double d0 = iposition.getX(); - double d1 = iposition.getY(); - double d2 = iposition.getZ(); - EntityItem entityitem = new EntityItem(world, d0, d1 - 0.3D, d2, itemstack); - double d3 = world.random.nextDouble() * 0.1D + 0.2D; - - entityitem.motX = (double) enumfacing.getAdjacentX() * d3; - entityitem.motY = 0.20000000298023224D; - entityitem.motZ = (double) enumfacing.getAdjacentZ() * d3; - entityitem.motX += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - entityitem.motY += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - entityitem.motZ += world.random.nextGaussian() * 0.007499999832361937D * (double) i; - - // CraftBukkit start - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(entityitem.motX, entityitem.motY, entityitem.motZ)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - return false; - } - - entityitem.setItemStack(CraftItemStack.asNMSCopy(event.getItem())); - entityitem.motX = event.getVelocity().getX(); - entityitem.motY = event.getVelocity().getY(); - entityitem.motZ = event.getVelocity().getZ(); - - if (!event.getItem().equals(craftItem)) { - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior.getClass() != DispenseBehaviorItem.class) { - idispensebehavior.a(isourceblock, eventStack); - } else { - world.addEntity(entityitem); - } - return false; - } - - world.addEntity(entityitem); - - return true; - // CraftBukkit end - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - - protected void a(ISourceBlock isourceblock, EnumFacing enumfacing) { - isourceblock.k().triggerEffect(2000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), this.a(enumfacing)); - } - - private int a(EnumFacing enumfacing) { - return enumfacing.getAdjacentX() + 1 + (enumfacing.getAdjacentZ() + 1) * 3; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java b/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java deleted file mode 100644 index 3df54aad..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorMinecart.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorMinecart extends DispenseBehaviorItem { - - private final DispenseBehaviorItem b = new DispenseBehaviorItem(); - - DispenseBehaviorMinecart() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - double d0 = isourceblock.getX() + (double) ((float) enumfacing.getAdjacentX() * 1.125F); - double d1 = isourceblock.getY() + (double) ((float) enumfacing.getAdjacentY() * 1.125F); - double d2 = isourceblock.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 1.125F); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - Block block = world.getType(i, j, k); - double d3; - - if (BlockMinecartTrackAbstract.a(block)) { - d3 = 0.0D; - } else { - if (block.getMaterial() != Material.AIR || !BlockMinecartTrackAbstract.a(world.getType(i, j - 1, k))) { - return this.b.a(isourceblock, itemstack); - } - - d3 = -1.0D; - } - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block2 = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block2, craftItem.clone(), new org.bukkit.util.Vector(d0, d1 + d3, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), ((ItemMinecart) itemstack1.getItem()).a); - // CraftBukkit end - - if (itemstack.hasName()) { - entityminecartabstract.a(itemstack.getName()); - } - - world.addEntity(entityminecartabstract); - // itemstack.a(1); // CraftBukkit - handled during event processing - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1000, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java b/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java deleted file mode 100644 index c3454101..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorMonsterEgg.java +++ /dev/null @@ -1,57 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorMonsterEgg extends DispenseBehaviorItem { - - DispenseBehaviorMonsterEgg() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - double d0 = isourceblock.getX() + (double) enumfacing.getAdjacentX(); - double d1 = (double) ((float) isourceblock.getBlockY() + 0.2F); - double d2 = isourceblock.getZ() + (double) enumfacing.getAdjacentZ(); - - // CraftBukkit start - World world = isourceblock.k(); - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(d0, d1, d2)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - itemstack1 = CraftItemStack.asNMSCopy(event.getItem()); - - Entity entity = ItemMonsterEgg.spawnCreature(isourceblock.k(), itemstack.getData(), event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.DISPENSE_EGG); - - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - - // itemstack.a(1); // Handled during event processing - // CraftBukkit end - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java b/src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java deleted file mode 100644 index b9063735..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorProjectile.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -public abstract class DispenseBehaviorProjectile extends DispenseBehaviorItem { - - public DispenseBehaviorProjectile() {} - - public ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - World world = isourceblock.k(); - IPosition iposition = BlockDispenser.a(isourceblock); - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - IProjectile iprojectile = this.a(world, iposition); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector((double) enumfacing.getAdjacentX(), (double) ((float) enumfacing.getAdjacentY() + 0.1F), (double) enumfacing.getAdjacentZ())); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - iprojectile.shoot(event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), this.b(), this.a()); - ((Entity) iprojectile).projectileSource = new org.bukkit.craftbukkit.projectiles.CraftBlockProjectileSource((TileEntityDispenser) isourceblock.getTileEntity()); - // CraftBukkit end - - world.addEntity((Entity) iprojectile); - // itemstack.a(1); // CraftBukkit - Handled during event processing - return itemstack; - } - - protected void a(ISourceBlock isourceblock) { - isourceblock.k().triggerEffect(1002, isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ(), 0); - } - - protected abstract IProjectile a(World world, IPosition iposition); - - protected float a() { - return 6.0F; - } - - protected float b() { - return 1.1F; - } -} diff --git a/src/main/java/net/minecraft/server/DispenseBehaviorTNT.java b/src/main/java/net/minecraft/server/DispenseBehaviorTNT.java deleted file mode 100644 index d9493393..00000000 --- a/src/main/java/net/minecraft/server/DispenseBehaviorTNT.java +++ /dev/null @@ -1,52 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.block.BlockDispenseEvent; -// CraftBukkit end - -final class DispenseBehaviorTNT extends DispenseBehaviorItem { - - DispenseBehaviorTNT() {} - - protected ItemStack b(ISourceBlock isourceblock, ItemStack itemstack) { - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); - World world = isourceblock.k(); - int i = isourceblock.getBlockX() + enumfacing.getAdjacentX(); - int j = isourceblock.getBlockY() + enumfacing.getAdjacentY(); - int k = isourceblock.getBlockZ() + enumfacing.getAdjacentZ(); - - // CraftBukkit start - ItemStack itemstack1 = itemstack.a(1); - org.bukkit.block.Block block = world.getWorld().getBlockAt(isourceblock.getBlockX(), isourceblock.getBlockY(), isourceblock.getBlockZ()); - CraftItemStack craftItem = CraftItemStack.asCraftMirror(itemstack1); - - BlockDispenseEvent event = new BlockDispenseEvent(block, craftItem.clone(), new org.bukkit.util.Vector(i + 0.5, j + 0.5, k + 0.5)); - if (!BlockDispenser.eventFired) { - world.getServer().getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - itemstack.count++; - return itemstack; - } - - if (!event.getItem().equals(craftItem)) { - itemstack.count++; - // Chain to handler for new item - ItemStack eventStack = CraftItemStack.asNMSCopy(event.getItem()); - IDispenseBehavior idispensebehavior = (IDispenseBehavior) BlockDispenser.a.get(eventStack.getItem()); - if (idispensebehavior != IDispenseBehavior.a && idispensebehavior != this) { - idispensebehavior.a(isourceblock, eventStack); - return itemstack; - } - } - - EntityTNTPrimed entitytntprimed = new EntityTNTPrimed(world, event.getVelocity().getX(), event.getVelocity().getY(), event.getVelocity().getZ(), (EntityLiving) null); - // CraftBukkit end - - world.addEntity(entitytntprimed); - // --itemstack.count; // CraftBukkit - handled above - return itemstack; - } -} diff --git a/src/main/java/net/minecraft/server/Enchantment.java b/src/main/java/net/minecraft/server/Enchantment.java deleted file mode 100644 index d96ca7d4..00000000 --- a/src/main/java/net/minecraft/server/Enchantment.java +++ /dev/null @@ -1,122 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -public abstract class Enchantment { - - // CraftBukkit - update CraftEnchant.getName(i) if this changes - public static final Enchantment[] byId = new Enchantment[256]; - public static final Enchantment[] c; - 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 THORNS = new EnchantmentThorns(7, 1); - 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 static final Enchantment ARROW_DAMAGE = new EnchantmentArrowDamage(48, 10); - public static final Enchantment ARROW_KNOCKBACK = new EnchantmentArrowKnockback(49, 2); - public static final Enchantment ARROW_FIRE = new EnchantmentFlameArrows(50, 2); - public static final Enchantment ARROW_INFINITE = new EnchantmentInfiniteArrows(51, 1); - public static final Enchantment LUCK = new EnchantmentLootBonus(61, 2, EnchantmentSlotType.FISHING_ROD); - public static final Enchantment LURE = new EnchantmentLure(62, 2, EnchantmentSlotType.FISHING_ROD); - 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; - } - - org.bukkit.enchantments.Enchantment.registerEnchantment(new org.bukkit.craftbukkit.enchantments.CraftEnchantment(this)); // CraftBukkit - } - - 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 float a(int i, EnumMonsterType enummonstertype) { - return 0.0F; - } - - public boolean a(Enchantment enchantment) { - return this != enchantment; - } - - public Enchantment b(String s) { - this.name = s; - return this; - } - - public String a() { - return "enchantment." + this.name; - } - - public String c(int i) { - String s = LocaleI18n.get(this.a()); - - return s + " " + LocaleI18n.get("enchantment.level." + i); - } - - public boolean canEnchant(ItemStack itemstack) { - return this.slot.canEnchant(itemstack.getItem()); - } - - public void a(EntityLiving entityliving, Entity entity, int i) {} - - public void b(EntityLiving entityliving, Entity entity, int i) {} - - static { - ArrayList arraylist = new ArrayList(); - Enchantment[] aenchantment = byId; - int i = aenchantment.length; - - for (int j = 0; j < i; ++j) { - Enchantment enchantment = aenchantment[j]; - - if (enchantment != null) { - arraylist.add(enchantment); - } - } - - c = (Enchantment[]) arraylist.toArray(new Enchantment[0]); - } -} diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java deleted file mode 100644 index 09c9c8ee..00000000 --- a/src/main/java/net/minecraft/server/Entity.java +++ /dev/null @@ -1,1892 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.Callable; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Server; -import org.bukkit.TravelAgent; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.Hanging; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Painting; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.hanging.HangingBreakByEntityEvent; -import org.bukkit.event.painting.PaintingBreakByEntityEvent; -import org.bukkit.event.vehicle.VehicleBlockCollisionEvent; -import org.bukkit.event.vehicle.VehicleEnterEvent; -import org.bukkit.event.vehicle.VehicleExitEvent; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.EntityPortalEvent; -import org.bukkit.plugin.PluginManager; -// CraftBukkit end - -public abstract class Entity { - - // CraftBukkit start - private static final int CURRENT_LEVEL = 2; - static boolean isLevelAtLeast(NBTTagCompound tag, int level) { - return tag.hasKey("Bukkit.updateLevel") && tag.getInt("Bukkit.updateLevel") >= level; - } - // CraftBukkit end - - private static int entityCount; - private int id; - public double j; - public boolean k; - public Entity passenger; - public Entity vehicle; - public boolean attachedToPlayer; - public World world; - public double lastX; - public double lastY; - public double lastZ; - public double locX; - public double locY; - public double locZ; - public double motX; - public double motY; - public double motZ; - public float yaw; - public float pitch; - public float lastYaw; - public float lastPitch; - public final AxisAlignedBB boundingBox; - public boolean onGround; - public boolean positionChanged; - public boolean F; - public boolean G; - public boolean velocityChanged; - protected boolean I; - public boolean J; - public boolean dead; - public float height; - public float width; - public float length; - public float O; - public float P; - public float Q; - public float fallDistance; - private int d; - public double S; - public double T; - public double U; - public float V; - public float W; - public boolean X; - public float Y; - public float Z; - protected Random random; - public int ticksLived; - public int maxFireTicks; - public int fireTicks; // CraftBukkit - private -> public - protected boolean inWater; - public int noDamageTicks; - private boolean justCreated; - protected boolean fireProof; - protected DataWatcher datawatcher; - private double g; - private double h; - public boolean ag; - public int ah; - public int ai; - public int aj; - public boolean ak; - public boolean al; - public int portalCooldown; - protected boolean an; - protected int ao; - public int dimension; - protected int aq; - private boolean invulnerable; - public UUID uniqueID; // CraftBukkit - protected -> public - public EnumEntitySize as; - public boolean valid; // CraftBukkit - public org.bukkit.projectiles.ProjectileSource projectileSource; // CraftBukkit - For projectiles only - - public int getId() { - return this.id; - } - - public void d(int i) { - this.id = i; - } - - public Entity(World world) { - this.id = entityCount++; - this.j = 1.0D; - this.boundingBox = AxisAlignedBB.a(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D); - this.J = true; - this.width = 0.6F; - this.length = 1.8F; - this.d = 1; - this.random = new Random(); - this.maxFireTicks = 1; - this.justCreated = true; - this.uniqueID = UUID.randomUUID(); - this.as = EnumEntitySize.SIZE_2; - this.world = world; - this.setPosition(0.0D, 0.0D, 0.0D); - if (world != null) { - this.dimension = world.worldProvider.dimension; - } - - this.datawatcher = new DataWatcher(this); - this.datawatcher.a(0, Byte.valueOf((byte) 0)); - this.datawatcher.a(1, Short.valueOf((short) 300)); - this.c(); - } - - protected abstract void c(); - - public DataWatcher getDataWatcher() { - return this.datawatcher; - } - - public boolean equals(Object object) { - return object instanceof Entity ? ((Entity) object).id == this.id : false; - } - - public int hashCode() { - return this.id; - } - - public void die() { - this.dead = true; - } - - protected void a(float f, float f1) { - float f2; - - if (f != this.width || f1 != this.length) { - f2 = this.width; - this.width = f; - this.length = f1; - this.boundingBox.d = this.boundingBox.a + (double) this.width; - this.boundingBox.f = this.boundingBox.c + (double) this.width; - this.boundingBox.e = this.boundingBox.b + (double) this.length; - if (this.width > f2 && !this.justCreated && !this.world.isStatic) { - this.move((double) (f2 - this.width), 0.0D, (double) (f2 - this.width)); - } - } - - f2 = f % 2.0F; - if ((double) f2 < 0.375D) { - this.as = EnumEntitySize.SIZE_1; - } else if ((double) f2 < 0.75D) { - this.as = EnumEntitySize.SIZE_2; - } else if ((double) f2 < 1.0D) { - this.as = EnumEntitySize.SIZE_3; - } else if ((double) f2 < 1.375D) { - this.as = EnumEntitySize.SIZE_4; - } else if ((double) f2 < 1.75D) { - this.as = EnumEntitySize.SIZE_5; - } else { - this.as = EnumEntitySize.SIZE_6; - } - } - - protected void b(float f, float f1) { - // CraftBukkit start - yaw was sometimes set to NaN, so we need to set it back to 0 - if (Float.isNaN(f)) { - f = 0; - } - - if ((f == Float.POSITIVE_INFINITY) || (f == Float.NEGATIVE_INFINITY)) { - if (this instanceof EntityPlayer) { - this.world.getServer().getLogger().warning(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid yaw"); - ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); - } - f = 0; - } - - // pitch was sometimes set to NaN, so we need to set it back to 0. - if (Float.isNaN(f1)) { - f1 = 0; - } - - if ((f1 == Float.POSITIVE_INFINITY) || (f1 == Float.NEGATIVE_INFINITY)) { - if (this instanceof EntityPlayer) { - this.world.getServer().getLogger().warning(((CraftPlayer) this.getBukkitEntity()).getName() + " was caught trying to crash the server with an invalid pitch"); - ((CraftPlayer) this.getBukkitEntity()).kickPlayer("Nope"); - } - f1 = 0; - } - // CraftBukkit end - - this.yaw = f % 360.0F; - this.pitch = f1 % 360.0F; - } - - public void setPosition(double d0, double d1, double d2) { - this.locX = d0; - this.locY = d1; - this.locZ = d2; - float f = this.width / 2.0F; - float f1 = this.length; - - this.boundingBox.b(d0 - (double) f, d1 - (double) this.height + (double) this.V, d2 - (double) f, d0 + (double) f, d1 - (double) this.height + (double) this.V + (double) f1, d2 + (double) f); - } - - public void h() { - this.C(); - } - - public void C() { - this.world.methodProfiler.a("entityBaseTick"); - if (this.vehicle != null && this.vehicle.dead) { - this.vehicle = null; - } - - this.O = this.P; - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.lastPitch = this.pitch; - this.lastYaw = this.yaw; - int i; - - if (!this.world.isStatic && this.world instanceof WorldServer) { - this.world.methodProfiler.a("portal"); - MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); - - i = this.D(); - if (this.an) { - if (true || minecraftserver.getAllowNether()) { // CraftBukkit - if (this.vehicle == null && this.ao++ >= i) { - this.ao = i; - this.portalCooldown = this.ai(); - byte b0; - - if (this.world.worldProvider.dimension == -1) { - b0 = 0; - } else { - b0 = -1; - } - - this.b(b0); - } - - this.an = false; - } - } else { - if (this.ao > 0) { - this.ao -= 4; - } - - if (this.ao < 0) { - this.ao = 0; - } - } - - if (this.portalCooldown > 0) { - --this.portalCooldown; - } - - this.world.methodProfiler.b(); - } - - if (this.isSprinting() && !this.M()) { - int j = MathHelper.floor(this.locX); - - i = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(j, i, k); - - if (block.getMaterial() != Material.AIR) { - this.world.addParticle("blockcrack_" + Block.getId(block) + "_" + this.world.getData(j, i, k), this.locX + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, this.boundingBox.b + 0.1D, this.locZ + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, -this.motX * 4.0D, 1.5D, -this.motZ * 4.0D); - } - } - - this.N(); - if (this.world.isStatic) { - this.fireTicks = 0; - } else if (this.fireTicks > 0) { - if (this.fireProof) { - this.fireTicks -= 4; - if (this.fireTicks < 0) { - this.fireTicks = 0; - } - } else { - if (this.fireTicks % 20 == 0) { - this.damageEntity(DamageSource.BURN, 1.0F); - } - - --this.fireTicks; - } - } - - if (this.P()) { - this.E(); - this.fallDistance *= 0.5F; - } - - if (this.locY < -64.0D) { - this.G(); - } - - if (!this.world.isStatic) { - this.a(0, this.fireTicks > 0); - } - - this.justCreated = false; - this.world.methodProfiler.b(); - } - - public int D() { - return 0; - } - - protected void E() { - if (!this.fireProof) { - this.damageEntity(DamageSource.LAVA, 4); - - // CraftBukkit start - Fallen in lava TODO: this event spams! - if (this instanceof EntityLiving) { - if (this.fireTicks <= 0) { - // not on fire yet - // TODO: shouldn't be sending null for the block. - org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k); - org.bukkit.entity.Entity damagee = this.getBukkitEntity(); - EntityCombustEvent combustEvent = new org.bukkit.event.entity.EntityCombustByBlockEvent(damager, damagee, 15); - this.world.getServer().getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - this.setOnFire(combustEvent.getDuration()); - } - } else { - // This will be called every single tick the entity is in lava, so don't throw an event - this.setOnFire(15); - } - return; - } - // CraftBukkit end - we also don't throw an event unless the object in lava is living, to save on some event calls - - this.setOnFire(15); - } - } - - public void setOnFire(int i) { - int j = i * 20; - - j = EnchantmentProtection.a(this, j); - if (this.fireTicks < j) { - this.fireTicks = j; - } - } - - public void extinguish() { - this.fireTicks = 0; - } - - protected void G() { - this.die(); - } - - public boolean c(double d0, double d1, double d2) { - AxisAlignedBB axisalignedbb = this.boundingBox.c(d0, d1, d2); - List list = this.world.getCubes(this, axisalignedbb); - - return !list.isEmpty() ? false : !this.world.containsLiquid(axisalignedbb); - } - - public void move(double d0, double d1, double d2) { - // CraftBukkit start - Don't do anything if we aren't moving - // We need to do this regardless of whether or not we are moving thanks to portals - try { - this.I(); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - // Check if we're moving - if (d0 == 0 && d1 == 0 && d2 == 0 && this.vehicle == null && this.passenger == null) { - return; - } - // CraftBukkit end - if (this.X) { - this.boundingBox.d(d0, d1, d2); - this.locX = (this.boundingBox.a + this.boundingBox.d) / 2.0D; - this.locY = this.boundingBox.b + (double) this.height - (double) this.V; - this.locZ = (this.boundingBox.c + this.boundingBox.f) / 2.0D; - } else { - this.world.methodProfiler.a("move"); - this.V *= 0.4F; - double d3 = this.locX; - double d4 = this.locY; - double d5 = this.locZ; - - if (this.I) { - this.I = false; - d0 *= 0.25D; - d1 *= 0.05000000074505806D; - d2 *= 0.25D; - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - } - - double d6 = d0; - double d7 = d1; - double d8 = d2; - AxisAlignedBB axisalignedbb = this.boundingBox.clone(); - boolean flag = this.onGround && this.isSneaking() && this instanceof EntityHuman; - - if (flag) { - double d9; - - for (d9 = 0.05D; d0 != 0.0D && this.world.getCubes(this, this.boundingBox.c(d0, -1.0D, 0.0D)).isEmpty(); d6 = d0) { - if (d0 < d9 && d0 >= -d9) { - d0 = 0.0D; - } else if (d0 > 0.0D) { - d0 -= d9; - } else { - d0 += d9; - } - } - - for (; d2 != 0.0D && this.world.getCubes(this, this.boundingBox.c(0.0D, -1.0D, d2)).isEmpty(); d8 = d2) { - if (d2 < d9 && d2 >= -d9) { - d2 = 0.0D; - } else if (d2 > 0.0D) { - d2 -= d9; - } else { - d2 += d9; - } - } - - while (d0 != 0.0D && d2 != 0.0D && this.world.getCubes(this, this.boundingBox.c(d0, -1.0D, d2)).isEmpty()) { - if (d0 < d9 && d0 >= -d9) { - d0 = 0.0D; - } else if (d0 > 0.0D) { - d0 -= d9; - } else { - d0 += d9; - } - - if (d2 < d9 && d2 >= -d9) { - d2 = 0.0D; - } else if (d2 > 0.0D) { - d2 -= d9; - } else { - d2 += d9; - } - - d6 = d0; - d8 = d2; - } - } - - List list = this.world.getCubes(this, this.boundingBox.a(d0, d1, d2)); - - for (int i = 0; i < list.size(); ++i) { - d1 = ((AxisAlignedBB) list.get(i)).b(this.boundingBox, d1); - } - - this.boundingBox.d(0.0D, d1, 0.0D); - if (!this.J && d7 != d1) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - boolean flag1 = this.onGround || d7 != d1 && d7 < 0.0D; - - int j; - - for (j = 0; j < list.size(); ++j) { - d0 = ((AxisAlignedBB) list.get(j)).a(this.boundingBox, d0); - } - - this.boundingBox.d(d0, 0.0D, 0.0D); - if (!this.J && d6 != d0) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - for (j = 0; j < list.size(); ++j) { - d2 = ((AxisAlignedBB) list.get(j)).c(this.boundingBox, d2); - } - - this.boundingBox.d(0.0D, 0.0D, d2); - if (!this.J && d8 != d2) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - double d10; - double d11; - double d12; - int k; - - if (this.W > 0.0F && flag1 && (flag || this.V < 0.05F) && (d6 != d0 || d8 != d2)) { - d10 = d0; - d11 = d1; - d12 = d2; - d0 = d6; - d1 = (double) this.W; - d2 = d8; - AxisAlignedBB axisalignedbb1 = this.boundingBox.clone(); - - this.boundingBox.d(axisalignedbb); - list = this.world.getCubes(this, this.boundingBox.a(d6, d1, d8)); - - for (k = 0; k < list.size(); ++k) { - d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1); - } - - this.boundingBox.d(0.0D, d1, 0.0D); - if (!this.J && d7 != d1) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - for (k = 0; k < list.size(); ++k) { - d0 = ((AxisAlignedBB) list.get(k)).a(this.boundingBox, d0); - } - - this.boundingBox.d(d0, 0.0D, 0.0D); - if (!this.J && d6 != d0) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - for (k = 0; k < list.size(); ++k) { - d2 = ((AxisAlignedBB) list.get(k)).c(this.boundingBox, d2); - } - - this.boundingBox.d(0.0D, 0.0D, d2); - if (!this.J && d8 != d2) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } - - if (!this.J && d7 != d1) { - d2 = 0.0D; - d1 = 0.0D; - d0 = 0.0D; - } else { - d1 = (double) (-this.W); - - for (k = 0; k < list.size(); ++k) { - d1 = ((AxisAlignedBB) list.get(k)).b(this.boundingBox, d1); - } - - this.boundingBox.d(0.0D, d1, 0.0D); - } - - if (d10 * d10 + d12 * d12 >= d0 * d0 + d2 * d2) { - d0 = d10; - d1 = d11; - d2 = d12; - this.boundingBox.d(axisalignedbb1); - } - } - - this.world.methodProfiler.b(); - this.world.methodProfiler.a("rest"); - this.locX = (this.boundingBox.a + this.boundingBox.d) / 2.0D; - this.locY = this.boundingBox.b + (double) this.height - (double) this.V; - this.locZ = (this.boundingBox.c + this.boundingBox.f) / 2.0D; - this.positionChanged = d6 != d0 || d8 != d2; - this.F = d7 != d1; - this.onGround = d7 != d1 && d7 < 0.0D; - this.G = this.positionChanged || this.F; - this.a(d1, this.onGround); - if (d6 != d0) { - this.motX = 0.0D; - } - - if (d7 != d1) { - this.motY = 0.0D; - } - - if (d8 != d2) { - this.motZ = 0.0D; - } - - d10 = this.locX - d3; - d11 = this.locY - d4; - d12 = this.locZ - d5; - - // CraftBukkit start - if ((this.positionChanged) && (this.getBukkitEntity() instanceof Vehicle)) { - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.block.Block block = this.world.getWorld().getBlockAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY - (double) this.height), MathHelper.floor(this.locZ)); - - if (d6 > d0) { - block = block.getRelative(BlockFace.EAST); - } else if (d6 < d0) { - block = block.getRelative(BlockFace.WEST); - } else if (d8 > d2) { - block = block.getRelative(BlockFace.SOUTH); - } else if (d8 < d2) { - block = block.getRelative(BlockFace.NORTH); - } - - VehicleBlockCollisionEvent event = new VehicleBlockCollisionEvent(vehicle, block); - this.world.getServer().getPluginManager().callEvent(event); - } - // CraftBukkit end - - if (this.g_() && !flag && this.vehicle == null) { - int l = MathHelper.floor(this.locX); - - k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int i1 = MathHelper.floor(this.locZ); - Block block = this.world.getType(l, k, i1); - int j1 = this.world.getType(l, k - 1, i1).b(); - - if (j1 == 11 || j1 == 32 || j1 == 21) { - block = this.world.getType(l, k - 1, i1); - } - - if (block != Blocks.LADDER) { - d11 = 0.0D; - } - - this.P = (float) ((double) this.P + (double) MathHelper.sqrt(d10 * d10 + d12 * d12) * 0.6D); - this.Q = (float) ((double) this.Q + (double) MathHelper.sqrt(d10 * d10 + d11 * d11 + d12 * d12) * 0.6D); - if (this.Q > (float) this.d && block.getMaterial() != Material.AIR) { - this.d = (int) this.Q + 1; - if (this.M()) { - float f = MathHelper.sqrt(this.motX * this.motX * 0.20000000298023224D + this.motY * this.motY + this.motZ * this.motZ * 0.20000000298023224D) * 0.35F; - - if (f > 1.0F) { - f = 1.0F; - } - - this.makeSound(this.H(), f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - } - - this.a(l, k, i1, block); - block.b(this.world, l, k, i1, this); - } - } - - // CraftBukkit start - Move to the top of the method - /* - try { - this.I(); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Checking entity block collision"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being checked for collision"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - */ - // CraftBukkit end - boolean flag2 = this.L(); - - if (this.world.e(this.boundingBox.shrink(0.001D, 0.001D, 0.001D))) { - this.burn(1); - if (!flag2) { - ++this.fireTicks; - // CraftBukkit start - Not on fire yet - if (this.fireTicks <= 0) { // Only throw events on the first combust, otherwise it spams - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - } else { - // CraftBukkit end - this.setOnFire(8); - } - } - } else if (this.fireTicks <= 0) { - this.fireTicks = -this.maxFireTicks; - } - - if (flag2 && this.fireTicks > 0) { - this.makeSound("random.fizz", 0.7F, 1.6F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - this.fireTicks = -this.maxFireTicks; - } - - this.world.methodProfiler.b(); - } - } - - protected String H() { - return "game.neutral.swim"; - } - - protected void I() { - int i = MathHelper.floor(this.boundingBox.a + 0.001D); - int j = MathHelper.floor(this.boundingBox.b + 0.001D); - int k = MathHelper.floor(this.boundingBox.c + 0.001D); - int l = MathHelper.floor(this.boundingBox.d - 0.001D); - int i1 = MathHelper.floor(this.boundingBox.e - 0.001D); - int j1 = MathHelper.floor(this.boundingBox.f - 0.001D); - - if (this.world.b(i, j, k, l, i1, j1)) { - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = j; l1 <= i1; ++l1) { - for (int i2 = k; i2 <= j1; ++i2) { - Block block = this.world.getType(k1, l1, i2); - - try { - block.a(this.world, k1, l1, i2, this); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Colliding entity with block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being collided with"); - - CrashReportSystemDetails.a(crashreportsystemdetails, k1, l1, i2, block, this.world.getData(k1, l1, i2)); - throw new ReportedException(crashreport); - } - } - } - } - } - } - - protected void a(int i, int j, int k, Block block) { - StepSound stepsound = block.stepSound; - - if (this.world.getType(i, j + 1, k) == Blocks.SNOW) { - stepsound = Blocks.SNOW.stepSound; - this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } else if (!block.getMaterial().isLiquid()) { - this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } - } - - public void makeSound(String s, float f, float f1) { - this.world.makeSound(this, s, f, f1); - } - - protected boolean g_() { - return true; - } - - protected void a(double d0, boolean flag) { - if (flag) { - if (this.fallDistance > 0.0F) { - this.b(this.fallDistance); - this.fallDistance = 0.0F; - } - } else if (d0 < 0.0D) { - this.fallDistance = (float) ((double) this.fallDistance - d0); - } - } - - public AxisAlignedBB J() { - return null; - } - - protected void burn(float i) { // CraftBukkit - int -> float - if (!this.fireProof) { - this.damageEntity(DamageSource.FIRE, (float) i); - } - } - - public final boolean isFireproof() { - return this.fireProof; - } - - protected void b(float f) { - if (this.passenger != null) { - this.passenger.b(f); - } - } - - public boolean L() { - return this.inWater || this.world.isRainingAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) || this.world.isRainingAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY + (double) this.length), MathHelper.floor(this.locZ)); - } - - public boolean M() { - return this.inWater; - } - - public boolean N() { - if (this.world.a(this.boundingBox.grow(0.0D, -0.4000000059604645D, 0.0D).shrink(0.001D, 0.001D, 0.001D), Material.WATER, this)) { - if (!this.inWater && !this.justCreated) { - float f = MathHelper.sqrt(this.motX * this.motX * 0.20000000298023224D + this.motY * this.motY + this.motZ * this.motZ * 0.20000000298023224D) * 0.2F; - - if (f > 1.0F) { - f = 1.0F; - } - - this.makeSound(this.O(), f, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - float f1 = (float) MathHelper.floor(this.boundingBox.b); - - int i; - float f2; - float f3; - - for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) { - f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - this.world.addParticle("bubble", this.locX + (double) f2, (double) (f1 + 1.0F), this.locZ + (double) f3, this.motX, this.motY - (double) (this.random.nextFloat() * 0.2F), this.motZ); - } - - for (i = 0; (float) i < 1.0F + this.width * 20.0F; ++i) { - f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - f3 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width; - this.world.addParticle("splash", this.locX + (double) f2, (double) (f1 + 1.0F), this.locZ + (double) f3, this.motX, this.motY, this.motZ); - } - } - - this.fallDistance = 0.0F; - this.inWater = true; - this.fireTicks = 0; - } else { - this.inWater = false; - } - - return this.inWater; - } - - protected String O() { - return "game.neutral.swim.splash"; - } - - public boolean a(Material material) { - double d0 = this.locY + (double) this.getHeadHeight(); - int i = MathHelper.floor(this.locX); - int j = MathHelper.d((float) MathHelper.floor(d0)); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() == material) { - float f = BlockFluids.b(this.world.getData(i, j, k)) - 0.11111111F; - float f1 = (float) (j + 1) - f; - - return d0 < (double) f1; - } else { - return false; - } - } - - public float getHeadHeight() { - return 0.0F; - } - - public boolean P() { - return this.world.a(this.boundingBox.grow(-0.10000000149011612D, -0.4000000059604645D, -0.10000000149011612D), Material.LAVA); - } - - public void a(float f, float f1, float f2) { - float f3 = f * f + f1 * f1; - - if (f3 >= 1.0E-4F) { - f3 = MathHelper.c(f3); - if (f3 < 1.0F) { - f3 = 1.0F; - } - - f3 = f2 / f3; - f *= f3; - f1 *= f3; - float f4 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F); - float f5 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F); - - this.motX += (double) (f * f5 - f1 * f4); - this.motZ += (double) (f1 * f5 + f * f4); - } - } - - public float d(float f) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locZ); - - if (this.world.isLoaded(i, 0, j)) { - double d0 = (this.boundingBox.e - this.boundingBox.b) * 0.66D; - int k = MathHelper.floor(this.locY - (double) this.height + d0); - - return this.world.n(i, k, j); - } else { - return 0.0F; - } - } - - public void spawnIn(World world) { - // CraftBukkit start - if (world == null) { - this.die(); - this.world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); - return; - } - // CraftBukkit end - - this.world = world; - } - - public void setLocation(double d0, double d1, double d2, float f, float f1) { - this.lastX = this.locX = d0; - this.lastY = this.locY = d1; - this.lastZ = this.locZ = d2; - this.lastYaw = this.yaw = f; - this.lastPitch = this.pitch = f1; - this.V = 0.0F; - double d3 = (double) (this.lastYaw - f); - - if (d3 < -180.0D) { - this.lastYaw += 360.0F; - } - - if (d3 >= 180.0D) { - this.lastYaw -= 360.0F; - } - - this.setPosition(this.locX, this.locY, this.locZ); - this.b(f, f1); - } - - public void setPositionRotation(double d0, double d1, double d2, float f, float f1) { - this.S = this.lastX = this.locX = d0; - this.T = this.lastY = this.locY = d1 + (double) this.height; - this.U = this.lastZ = this.locZ = d2; - this.yaw = f; - this.pitch = f1; - this.setPosition(this.locX, this.locY, this.locZ); - } - - public float e(Entity entity) { - float f = (float) (this.locX - entity.locX); - float f1 = (float) (this.locY - entity.locY); - float f2 = (float) (this.locZ - entity.locZ); - - return MathHelper.c(f * f + f1 * f1 + f2 * f2); - } - - public double e(double d0, double d1, double d2) { - double d3 = this.locX - d0; - double d4 = this.locY - d1; - double d5 = this.locZ - d2; - - return d3 * d3 + d4 * d4 + d5 * d5; - } - - public double f(double d0, double d1, double d2) { - double d3 = this.locX - d0; - double d4 = this.locY - d1; - double d5 = this.locZ - d2; - - return (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - } - - public double f(Entity entity) { - double d0 = this.locX - entity.locX; - double d1 = this.locY - entity.locY; - double d2 = this.locZ - entity.locZ; - - return d0 * d0 + d1 * d1 + d2 * d2; - } - - public void b_(EntityHuman entityhuman) {} - - public void collide(Entity entity) { - if (entity.passenger != this && entity.vehicle != this) { - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - double d2 = MathHelper.a(d0, d1); - - if (d2 >= 0.009999999776482582D) { - d2 = (double) MathHelper.sqrt(d2); - d0 /= d2; - d1 /= d2; - double d3 = 1.0D / d2; - - if (d3 > 1.0D) { - d3 = 1.0D; - } - - d0 *= d3; - d1 *= d3; - d0 *= 0.05000000074505806D; - d1 *= 0.05000000074505806D; - d0 *= (double) (1.0F - this.Y); - d1 *= (double) (1.0F - this.Y); - this.g(-d0, 0.0D, -d1); - entity.g(d0, 0.0D, d1); - } - } - } - - public void g(double d0, double d1, double d2) { - this.motX += d0; - this.motY += d1; - this.motZ += d2; - this.al = true; - } - - protected void Q() { - this.velocityChanged = true; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.Q(); - return false; - } - } - - public boolean R() { - return false; - } - - public boolean S() { - return false; - } - - public void b(Entity entity, int i) {} - - public boolean c(NBTTagCompound nbttagcompound) { - String s = this.W(); - - if (!this.dead && s != null) { - nbttagcompound.setString("id", s); - this.e(nbttagcompound); - return true; - } else { - return false; - } - } - - public boolean d(NBTTagCompound nbttagcompound) { - String s = this.W(); - - if (!this.dead && s != null && this.passenger == null) { - nbttagcompound.setString("id", s); - this.e(nbttagcompound); - return true; - } else { - return false; - } - } - - public void e(NBTTagCompound nbttagcompound) { - try { - nbttagcompound.set("Pos", this.a(new double[] { this.locX, this.locY + (double) this.V, this.locZ})); - nbttagcompound.set("Motion", this.a(new double[] { this.motX, this.motY, this.motZ})); - - // CraftBukkit start - Checking for NaN pitch/yaw and resetting to zero - // TODO: make sure this is the best way to address this. - if (Float.isNaN(this.yaw)) { - this.yaw = 0; - } - - if (Float.isNaN(this.pitch)) { - this.pitch = 0; - } - // CraftBukkit end - - nbttagcompound.set("Rotation", this.a(new float[] { this.yaw, this.pitch})); - nbttagcompound.setFloat("FallDistance", this.fallDistance); - nbttagcompound.setShort("Fire", (short) this.fireTicks); - nbttagcompound.setShort("Air", (short) this.getAirTicks()); - nbttagcompound.setBoolean("OnGround", this.onGround); - nbttagcompound.setInt("Dimension", this.dimension); - nbttagcompound.setBoolean("Invulnerable", this.invulnerable); - nbttagcompound.setInt("PortalCooldown", this.portalCooldown); - nbttagcompound.setLong("UUIDMost", this.getUniqueID().getMostSignificantBits()); - nbttagcompound.setLong("UUIDLeast", this.getUniqueID().getLeastSignificantBits()); - // CraftBukkit start - nbttagcompound.setLong("WorldUUIDLeast", this.world.getDataManager().getUUID().getLeastSignificantBits()); - nbttagcompound.setLong("WorldUUIDMost", this.world.getDataManager().getUUID().getMostSignificantBits()); - nbttagcompound.setInt("Bukkit.updateLevel", CURRENT_LEVEL); - // CraftBukkit end - this.b(nbttagcompound); - if (this.vehicle != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - if (this.vehicle.c(nbttagcompound1)) { - nbttagcompound.set("Riding", nbttagcompound1); - } - } - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Saving entity NBT"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being saved"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - public void f(NBTTagCompound nbttagcompound) { - try { - NBTTagList nbttaglist = nbttagcompound.getList("Pos", 6); - NBTTagList nbttaglist1 = nbttagcompound.getList("Motion", 6); - NBTTagList nbttaglist2 = nbttagcompound.getList("Rotation", 5); - - this.motX = nbttaglist1.d(0); - this.motY = nbttaglist1.d(1); - this.motZ = nbttaglist1.d(2); - /* CraftBukkit start - Moved section down - if (Math.abs(this.motX) > 10.0D) { - this.motX = 0.0D; - } - - if (Math.abs(this.motY) > 10.0D) { - this.motY = 0.0D; - } - - if (Math.abs(this.motZ) > 10.0D) { - this.motZ = 0.0D; - } - // CraftBukkit end */ - - this.lastX = this.S = this.locX = nbttaglist.d(0); - this.lastY = this.T = this.locY = nbttaglist.d(1); - this.lastZ = this.U = this.locZ = nbttaglist.d(2); - this.lastYaw = this.yaw = nbttaglist2.e(0); - this.lastPitch = this.pitch = nbttaglist2.e(1); - this.fallDistance = nbttagcompound.getFloat("FallDistance"); - this.fireTicks = nbttagcompound.getShort("Fire"); - this.setAirTicks(nbttagcompound.getShort("Air")); - this.onGround = nbttagcompound.getBoolean("OnGround"); - this.dimension = nbttagcompound.getInt("Dimension"); - this.invulnerable = nbttagcompound.getBoolean("Invulnerable"); - this.portalCooldown = nbttagcompound.getInt("PortalCooldown"); - if (nbttagcompound.hasKeyOfType("UUIDMost", 4) && nbttagcompound.hasKeyOfType("UUIDLeast", 4)) { - this.uniqueID = new UUID(nbttagcompound.getLong("UUIDMost"), nbttagcompound.getLong("UUIDLeast")); - } - - this.setPosition(this.locX, this.locY, this.locZ); - this.b(this.yaw, this.pitch); - this.a(nbttagcompound); - if (this.V()) { - this.setPosition(this.locX, this.locY, this.locZ); - } - - // CraftBukkit start - if (this instanceof EntityLiving) { - EntityLiving entity = (EntityLiving) this; - - // Reset the persistence for tamed animals - if (entity instanceof EntityTameableAnimal && !isLevelAtLeast(nbttagcompound, 2) && !nbttagcompound.getBoolean("PersistenceRequired")) { - EntityInsentient entityinsentient = (EntityInsentient) entity; - entityinsentient.persistent = !entityinsentient.isTypeNotPersistent(); - } - } - // CraftBukkit end - - // CraftBukkit start - Exempt Vehicles from notch's sanity check - if (!(this.getBukkitEntity() instanceof Vehicle)) { - if (Math.abs(this.motX) > 10.0D) { - this.motX = 0.0D; - } - - if (Math.abs(this.motY) > 10.0D) { - this.motY = 0.0D; - } - - if (Math.abs(this.motZ) > 10.0D) { - this.motZ = 0.0D; - } - } - // CraftBukkit end - - // CraftBukkit start - Reset world - if (this instanceof EntityPlayer) { - Server server = Bukkit.getServer(); - org.bukkit.World bworld = null; - - // TODO: Remove World related checks, replaced with WorldUID. - String worldName = nbttagcompound.getString("World"); - - if (nbttagcompound.hasKey("WorldUUIDMost") && nbttagcompound.hasKey("WorldUUIDLeast")) { - UUID uid = new UUID(nbttagcompound.getLong("WorldUUIDMost"), nbttagcompound.getLong("WorldUUIDLeast")); - bworld = server.getWorld(uid); - } else { - bworld = server.getWorld(worldName); - } - - if (bworld == null) { - EntityPlayer entityPlayer = (EntityPlayer) this; - bworld = ((org.bukkit.craftbukkit.CraftServer) server).getServer().getWorldServer(entityPlayer.dimension).getWorld(); - } - - this.spawnIn(bworld == null ? null : ((CraftWorld) bworld).getHandle()); - } - // CraftBukkit end - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Loading entity NBT"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity being loaded"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - protected boolean V() { - return true; - } - - protected final String W() { - return EntityTypes.b(this); - } - - protected abstract void a(NBTTagCompound nbttagcompound); - - protected abstract void b(NBTTagCompound nbttagcompound); - - public void X() {} - - protected NBTTagList a(double... adouble) { - NBTTagList nbttaglist = new NBTTagList(); - double[] adouble1 = adouble; - int i = adouble.length; - - for (int j = 0; j < i; ++j) { - double d0 = adouble1[j]; - - nbttaglist.add(new NBTTagDouble(d0)); - } - - return nbttaglist; - } - - protected NBTTagList a(float... afloat) { - NBTTagList nbttaglist = new NBTTagList(); - float[] afloat1 = afloat; - int i = afloat.length; - - for (int j = 0; j < i; ++j) { - float f = afloat1[j]; - - nbttaglist.add(new NBTTagFloat(f)); - } - - return nbttaglist; - } - - public EntityItem a(Item item, int i) { - return this.a(item, i, 0.0F); - } - - public EntityItem a(Item item, int i, float f) { - return this.a(new ItemStack(item, i, 0), f); - } - - public EntityItem a(ItemStack itemstack, float f) { - if (itemstack.count != 0 && itemstack.getItem() != null) { - // CraftBukkit start - Capture drops for death event - if (this instanceof EntityLiving && ((EntityLiving) this).drops != null) { - ((EntityLiving) this).drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); - return null; - } - // CraftBukkit end - - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY + (double) f, this.locZ, itemstack); - - entityitem.pickupDelay = 10; - this.world.addEntity(entityitem); - return entityitem; - } else { - return null; - } - } - - public boolean isAlive() { - return !this.dead; - } - - public boolean inBlock() { - for (int i = 0; i < 8; ++i) { - float f = ((float) ((i >> 0) % 2) - 0.5F) * this.width * 0.8F; - float f1 = ((float) ((i >> 1) % 2) - 0.5F) * 0.1F; - float f2 = ((float) ((i >> 2) % 2) - 0.5F) * this.width * 0.8F; - int j = MathHelper.floor(this.locX + (double) f); - int k = MathHelper.floor(this.locY + (double) this.getHeadHeight() + (double) f1); - int l = MathHelper.floor(this.locZ + (double) f2); - - if (this.world.getType(j, k, l).r()) { - return true; - } - } - - return false; - } - - public boolean c(EntityHuman entityhuman) { - return false; - } - - public AxisAlignedBB h(Entity entity) { - return null; - } - - public void ab() { - if (this.vehicle.dead) { - this.vehicle = null; - } else { - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.h(); - if (this.vehicle != null) { - this.vehicle.ac(); - this.h += (double) (this.vehicle.yaw - this.vehicle.lastYaw); - - for (this.g += (double) (this.vehicle.pitch - this.vehicle.lastPitch); this.h >= 180.0D; this.h -= 360.0D) { - ; - } - - while (this.h < -180.0D) { - this.h += 360.0D; - } - - while (this.g >= 180.0D) { - this.g -= 360.0D; - } - - while (this.g < -180.0D) { - this.g += 360.0D; - } - - double d0 = this.h * 0.5D; - double d1 = this.g * 0.5D; - float f = 10.0F; - - if (d0 > (double) f) { - d0 = (double) f; - } - - if (d0 < (double) (-f)) { - d0 = (double) (-f); - } - - if (d1 > (double) f) { - d1 = (double) f; - } - - if (d1 < (double) (-f)) { - d1 = (double) (-f); - } - - this.h -= d0; - this.g -= d1; - } - } - } - - public void ac() { - if (this.passenger != null) { - this.passenger.setPosition(this.locX, this.locY + this.ad() + this.passenger.ad(), this.locZ); - } - } - - public double ad() { - return (double) this.height; - } - - public double ae() { - return (double) this.length * 0.75D; - } - - public void mount(Entity entity) { - // CraftBukkit start - this.setPassengerOf(entity); - } - - protected CraftEntity bukkitEntity; - - public CraftEntity getBukkitEntity() { - if (this.bukkitEntity == null) { - this.bukkitEntity = CraftEntity.getEntity(this.world.getServer(), this); - } - return this.bukkitEntity; - } - - public void setPassengerOf(Entity entity) { - // b(null) doesn't really fly for overloaded methods, - // so this method is needed - - Entity originalVehicle = this.vehicle; - Entity originalPassenger = this.vehicle == null ? null : this.vehicle.passenger; - PluginManager pluginManager = Bukkit.getPluginManager(); - this.getBukkitEntity(); // make sure bukkitEntity is initialised - // CraftBukkit end - this.g = 0.0D; - this.h = 0.0D; - if (entity == null) { - if (this.vehicle != null) { - // CraftBukkit start - if ((this.bukkitEntity instanceof LivingEntity) && (this.vehicle.getBukkitEntity() instanceof Vehicle)) { - VehicleExitEvent event = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); - pluginManager.callEvent(event); - - if (event.isCancelled() || this.vehicle != originalVehicle) { - return; - } - } - // CraftBukkit end - - this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); - this.vehicle.passenger = null; - } - - this.vehicle = null; - } else { - // CraftBukkit start - if ((this.bukkitEntity instanceof LivingEntity) && (entity.getBukkitEntity() instanceof Vehicle) && entity.world.isChunkLoaded((int) entity.locX >> 4, (int) entity.locZ >> 4)) { - // It's possible to move from one vehicle to another. We need to check if they're already in a vehicle, and fire an exit event if they are. - VehicleExitEvent exitEvent = null; - if (this.vehicle != null && this.vehicle.getBukkitEntity() instanceof Vehicle) { - exitEvent = new VehicleExitEvent((Vehicle) this.vehicle.getBukkitEntity(), (LivingEntity) this.bukkitEntity); - pluginManager.callEvent(exitEvent); - - if (exitEvent.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { - return; - } - } - - VehicleEnterEvent event = new VehicleEnterEvent((Vehicle) entity.getBukkitEntity(), this.bukkitEntity); - pluginManager.callEvent(event); - - // If a plugin messes with the vehicle or the vehicle's passenger - if (event.isCancelled() || this.vehicle != originalVehicle || (this.vehicle != null && this.vehicle.passenger != originalPassenger)) { - // If we only cancelled the enterevent then we need to put the player in a decent position. - if (exitEvent != null && this.vehicle == originalVehicle && this.vehicle != null && this.vehicle.passenger == originalPassenger) { - this.setPositionRotation(this.vehicle.locX, this.vehicle.boundingBox.b + (double) this.vehicle.length, this.vehicle.locZ, this.yaw, this.pitch); - this.vehicle.passenger = null; - this.vehicle = null; - } - return; - } - } - // CraftBukkit end - - if (this.vehicle != null) { - this.vehicle.passenger = null; - } - - if (entity != null) { - for (Entity entity1 = entity.vehicle; entity1 != null; entity1 = entity1.vehicle) { - if (entity1 == this) { - return; - } - } - } - - this.vehicle = entity; - entity.passenger = this; - } - } - - public float af() { - return 0.1F; - } - - public Vec3D ag() { - return null; - } - - public void ah() { - if (this.portalCooldown > 0) { - this.portalCooldown = this.ai(); - } else { - double d0 = this.lastX - this.locX; - double d1 = this.lastZ - this.locZ; - - if (!this.world.isStatic && !this.an) { - this.aq = Direction.a(d0, d1); - } - - this.an = true; - } - } - - public int ai() { - return 300; - } - - public ItemStack[] getEquipment() { - return null; - } - - public void setEquipment(int i, ItemStack itemstack) {} - - public boolean isBurning() { - boolean flag = this.world != null && this.world.isStatic; - - return !this.fireProof && (this.fireTicks > 0 || flag && this.g(0)); - } - - public boolean am() { - return this.vehicle != null; - } - - public boolean isSneaking() { - return this.g(1); - } - - public void setSneaking(boolean flag) { - this.a(1, flag); - } - - public boolean isSprinting() { - return this.g(3); - } - - public void setSprinting(boolean flag) { - this.a(3, flag); - } - - public boolean isInvisible() { - return this.g(5); - } - - public void setInvisible(boolean flag) { - this.a(5, flag); - } - - public void e(boolean flag) { - this.a(4, flag); - } - - protected boolean g(int i) { - return (this.datawatcher.getByte(0) & 1 << i) != 0; - } - - protected void a(int i, boolean flag) { - byte b0 = this.datawatcher.getByte(0); - - if (flag) { - this.datawatcher.watch(0, Byte.valueOf((byte) (b0 | 1 << i))); - } else { - this.datawatcher.watch(0, Byte.valueOf((byte) (b0 & ~(1 << i)))); - } - } - - public int getAirTicks() { - return this.datawatcher.getShort(1); - } - - public void setAirTicks(int i) { - this.datawatcher.watch(1, Short.valueOf((short) i)); - } - - public void a(EntityLightning entitylightning) { - // CraftBukkit start - final org.bukkit.entity.Entity thisBukkitEntity = this.getBukkitEntity(); - final org.bukkit.entity.Entity stormBukkitEntity = entitylightning.getBukkitEntity(); - final PluginManager pluginManager = Bukkit.getPluginManager(); - - if (thisBukkitEntity instanceof Hanging) { - HangingBreakByEntityEvent hangingEvent = new HangingBreakByEntityEvent((Hanging) thisBukkitEntity, stormBukkitEntity); - PaintingBreakByEntityEvent paintingEvent = null; - - if (thisBukkitEntity instanceof Painting) { - paintingEvent = new PaintingBreakByEntityEvent((Painting) thisBukkitEntity, stormBukkitEntity); - } - - pluginManager.callEvent(hangingEvent); - - if (paintingEvent != null) { - paintingEvent.setCancelled(hangingEvent.isCancelled()); - pluginManager.callEvent(paintingEvent); - } - - if (hangingEvent.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return; - } - } - - if (this.fireProof) { - return; - } - CraftEventFactory.entityDamage = entitylightning; - if (!this.damageEntity(DamageSource.FIRE, 5.0F)) { - CraftEventFactory.entityDamage = null; - return; - } - // CraftBukkit end - - ++this.fireTicks; - if (this.fireTicks == 0) { - // CraftBukkit start - Call a combust event when lightning strikes - EntityCombustByEntityEvent entityCombustEvent = new EntityCombustByEntityEvent(stormBukkitEntity, thisBukkitEntity, 8); - pluginManager.callEvent(entityCombustEvent); - if (!entityCombustEvent.isCancelled()) { - this.setOnFire(entityCombustEvent.getDuration()); - } - // CraftBukkit end - } - } - - public void a(EntityLiving entityliving) {} - - protected boolean j(double d0, double d1, double d2) { - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - double d3 = d0 - (double) i; - double d4 = d1 - (double) j; - double d5 = d2 - (double) k; - List list = this.world.a(this.boundingBox); - - if (list.isEmpty() && !this.world.q(i, j, k)) { - return false; - } else { - boolean flag = !this.world.q(i - 1, j, k); - boolean flag1 = !this.world.q(i + 1, j, k); - boolean flag2 = !this.world.q(i, j - 1, k); - boolean flag3 = !this.world.q(i, j + 1, k); - boolean flag4 = !this.world.q(i, j, k - 1); - boolean flag5 = !this.world.q(i, j, k + 1); - byte b0 = 3; - double d6 = 9999.0D; - - if (flag && d3 < d6) { - d6 = d3; - b0 = 0; - } - - if (flag1 && 1.0D - d3 < d6) { - d6 = 1.0D - d3; - b0 = 1; - } - - if (flag3 && 1.0D - d4 < d6) { - d6 = 1.0D - d4; - b0 = 3; - } - - if (flag4 && d5 < d6) { - d6 = d5; - b0 = 4; - } - - if (flag5 && 1.0D - d5 < d6) { - d6 = 1.0D - d5; - b0 = 5; - } - - float f = this.random.nextFloat() * 0.2F + 0.1F; - - if (b0 == 0) { - this.motX = (double) (-f); - } - - if (b0 == 1) { - this.motX = (double) f; - } - - if (b0 == 2) { - this.motY = (double) (-f); - } - - if (b0 == 3) { - this.motY = (double) f; - } - - if (b0 == 4) { - this.motZ = (double) (-f); - } - - if (b0 == 5) { - this.motZ = (double) f; - } - - return true; - } - } - - public void as() { - this.I = true; - this.fallDistance = 0.0F; - } - - public String getName() { - String s = EntityTypes.b(this); - - if (s == null) { - s = "generic"; - } - - return LocaleI18n.get("entity." + s + ".name"); - } - - public Entity[] at() { - return null; - } - - public boolean i(Entity entity) { - return this == entity; - } - - public float getHeadRotation() { - return 0.0F; - } - - public boolean av() { - return true; - } - - public boolean j(Entity entity) { - return false; - } - - public String toString() { - return String.format("%s[\'%s\'/%d, l=\'%s\', x=%.2f, y=%.2f, z=%.2f]", new Object[] { this.getClass().getSimpleName(), this.getName(), Integer.valueOf(this.id), this.world == null ? "~NULL~" : this.world.getWorldData().getName(), Double.valueOf(this.locX), Double.valueOf(this.locY), Double.valueOf(this.locZ)}); - } - - public boolean isInvulnerable() { - return this.invulnerable; - } - - public void k(Entity entity) { - this.setPositionRotation(entity.locX, entity.locY, entity.locZ, entity.yaw, entity.pitch); - } - - public void a(Entity entity, boolean flag) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - entity.e(nbttagcompound); - this.f(nbttagcompound); - this.portalCooldown = entity.portalCooldown; - this.aq = entity.aq; - } - - public void b(int i) { - if (!this.world.isStatic && !this.dead) { - this.world.methodProfiler.a("changeDimension"); - MinecraftServer minecraftserver = MinecraftServer.getServer(); - // CraftBukkit start - Move logic into new function "teleportToLocation" - // int j = this.dimension; - WorldServer exitWorld = null; - if (this.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // Plugins must specify exit from custom Bukkit worlds - // Only target existing worlds (compensate for allow-nether/allow-end as false) - for (WorldServer world : minecraftserver.worlds) { - if (world.dimension == i) { - exitWorld = world; - } - } - } - - Location enter = this.getBukkitEntity().getLocation(); - Location exit = exitWorld != null ? minecraftserver.getPlayerList().calculateTarget(enter, minecraftserver.getWorldServer(i)) : null; - boolean useTravelAgent = exitWorld != null && !(this.dimension == 1 && exitWorld.dimension == 1); // don't use agent for custom worlds or return from THE_END - - TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins - EntityPortalEvent event = new EntityPortalEvent(this.getBukkitEntity(), enter, exit, agent); - event.useTravelAgent(useTravelAgent); - event.getEntity().getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !this.isAlive()) { - return; - } - exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); - this.teleportTo(exit, true); - } - } - - public void teleportTo(Location exit, boolean portal) { - if (true) { - WorldServer worldserver = ((CraftWorld) this.getBukkitEntity().getLocation().getWorld()).getHandle(); - WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); - int i = worldserver1.dimension; - // CraftBukkit end - - this.dimension = i; - /* CraftBukkit start - TODO: Check if we need this - if (j == 1 && i == 1) { - worldserver1 = minecraftserver.getWorldServer(0); - this.dimension = 0; - } - // CraftBukkit end */ - - this.world.kill(this); - this.dead = false; - this.world.methodProfiler.a("reposition"); - // CraftBukkit start - Ensure chunks are loaded in case TravelAgent is not used which would initially cause chunks to load during find/create - // minecraftserver.getPlayerList().a(this, j, worldserver, worldserver1); - boolean before = worldserver1.chunkProviderServer.forceChunkLoad; - worldserver1.chunkProviderServer.forceChunkLoad = true; - worldserver1.getMinecraftServer().getPlayerList().repositionEntity(this, exit, portal); - worldserver1.chunkProviderServer.forceChunkLoad = before; - // CraftBukkit end - this.world.methodProfiler.c("reloading"); - Entity entity = EntityTypes.createEntityByName(EntityTypes.b(this), worldserver1); - - if (entity != null) { - entity.a(this, true); - /* CraftBukkit start - We need to do this... - if (j == 1 && i == 1) { - ChunkCoordinates chunkcoordinates = worldserver1.getSpawn(); - - chunkcoordinates.y = this.world.i(chunkcoordinates.x, chunkcoordinates.z); - entity.setPositionRotation((double) chunkcoordinates.x, (double) chunkcoordinates.y, (double) chunkcoordinates.z, entity.yaw, entity.pitch); - } - // CraftBukkit end */ - worldserver1.addEntity(entity); - // CraftBukkit start - Forward the CraftEntity to the new entity - this.getBukkitEntity().setHandle(entity); - entity.bukkitEntity = this.getBukkitEntity(); - // CraftBukkit end - } - - this.dead = true; - this.world.methodProfiler.b(); - worldserver.i(); - worldserver1.i(); - this.world.methodProfiler.b(); - } - } - - public float a(Explosion explosion, World world, int i, int j, int k, Block block) { - return block.a(this); - } - - public boolean a(Explosion explosion, World world, int i, int j, int k, Block block, float f) { - return true; - } - - public int ax() { - return 3; - } - - public int ay() { - return this.aq; - } - - public boolean az() { - return false; - } - - public void a(CrashReportSystemDetails crashreportsystemdetails) { - crashreportsystemdetails.a("Entity Type", (Callable) (new CrashReportEntityType(this))); - crashreportsystemdetails.a("Entity ID", Integer.valueOf(this.id)); - crashreportsystemdetails.a("Entity Name", (Callable) (new CrashReportEntityName(this))); - crashreportsystemdetails.a("Entity\'s Exact location", String.format("%.2f, %.2f, %.2f", new Object[] { Double.valueOf(this.locX), Double.valueOf(this.locY), Double.valueOf(this.locZ)})); - crashreportsystemdetails.a("Entity\'s Block location", CrashReportSystemDetails.a(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))); - crashreportsystemdetails.a("Entity\'s Momentum", String.format("%.2f, %.2f, %.2f", new Object[] { Double.valueOf(this.motX), Double.valueOf(this.motY), Double.valueOf(this.motZ)})); - } - - public UUID getUniqueID() { - return this.uniqueID; - } - - public boolean aC() { - return true; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - public void i(int i) {} -} diff --git a/src/main/java/net/minecraft/server/EntityAgeable.java b/src/main/java/net/minecraft/server/EntityAgeable.java deleted file mode 100644 index 36ed8316..00000000 --- a/src/main/java/net/minecraft/server/EntityAgeable.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.minecraft.server; - -public abstract class EntityAgeable extends EntityCreature { - - private float bp = -1.0F; - private float bq; - public boolean ageLocked = false; // CraftBukkit - - public EntityAgeable(World world) { - super(world); - } - - public abstract EntityAgeable createChild(EntityAgeable entityageable); - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.MONSTER_EGG) { - if (!this.world.isStatic) { - Class oclass = EntityTypes.a(itemstack.getData()); - - if (oclass != null && oclass.isAssignableFrom(this.getClass())) { - EntityAgeable entityageable = this.createChild(this); - - if (entityageable != null) { - entityageable.setAge(-24000); - entityageable.setPositionRotation(this.locX, this.locY, this.locZ, 0.0F, 0.0F); - this.world.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); // CraftBukkit - if (itemstack.hasName()) { - entityageable.setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - if (itemstack.count == 0) { // CraftBukkit - allow less than 0 stacks as "infinite" - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - } - } - } - } - - return true; - } else { - return false; - } - } - - protected void c() { - super.c(); - this.datawatcher.a(12, new Integer(0)); - } - - public int getAge() { - return this.datawatcher.getInt(12); - } - - public void a(int i) { - int j = this.getAge(); - - j += i * 20; - if (j > 0) { - j = 0; - } - - this.setAge(j); - } - - public void setAge(int i) { - this.datawatcher.watch(12, Integer.valueOf(i)); - this.a(this.isBaby()); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Age", this.getAge()); - nbttagcompound.setBoolean("AgeLocked", this.ageLocked); // CraftBukkit - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setAge(nbttagcompound.getInt("Age")); - this.ageLocked = nbttagcompound.getBoolean("AgeLocked"); // CraftBukkit - } - - public void e() { - super.e(); - if (this.world.isStatic || this.ageLocked) { // CraftBukkit - this.a(this.isBaby()); - } else { - int i = this.getAge(); - - if (i < 0) { - ++i; - this.setAge(i); - } else if (i > 0) { - --i; - this.setAge(i); - } - } - } - - public boolean isBaby() { - return this.getAge() < 0; - } - - public void a(boolean flag) { - this.a(flag ? 0.5F : 1.0F); - } - - protected final void a(float f, float f1) { - boolean flag = this.bp > 0.0F; - - this.bp = f; - this.bq = f1; - if (!flag) { - this.a(1.0F); - } - } - - protected final void a(float f) { - super.a(this.bp * f, this.bq * f); - } -} diff --git a/src/main/java/net/minecraft/server/EntityArrow.java b/src/main/java/net/minecraft/server/EntityArrow.java deleted file mode 100644 index 88b07510..00000000 --- a/src/main/java/net/minecraft/server/EntityArrow.java +++ /dev/null @@ -1,462 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; -// CraftBukkit end - -public class EntityArrow extends Entity implements IProjectile { - - private int d = -1; - private int e = -1; - private int f = -1; - private Block g; - private int h; - private boolean inGround; - public int fromPlayer; - public int shake; - public Entity shooter; - private int at; - private int au; - private double damage = 2.0D; - public int knockbackStrength; // CraftBukkit - private -> public - - public EntityArrow(World world) { - super(world); - this.j = 10.0D; - this.a(0.5F, 0.5F); - } - - public EntityArrow(World world, double d0, double d1, double d2) { - super(world); - this.j = 10.0D; - this.a(0.5F, 0.5F); - this.setPosition(d0, d1, d2); - this.height = 0.0F; - } - - public EntityArrow(World world, EntityLiving entityliving, EntityLiving entityliving1, float f, float f1) { - super(world); - this.j = 10.0D; - this.shooter = entityliving; - this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - if (entityliving instanceof EntityHuman) { - this.fromPlayer = 1; - } - - this.locY = entityliving.locY + (double) entityliving.getHeadHeight() - 0.10000000149011612D; - double d0 = entityliving1.locX - entityliving.locX; - double d1 = entityliving1.boundingBox.b + (double) (entityliving1.length / 3.0F) - this.locY; - double d2 = entityliving1.locZ - entityliving.locZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - - if (d3 >= 1.0E-7D) { - float f2 = (float) (Math.atan2(d2, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - float f3 = (float) (-(Math.atan2(d1, d3) * 180.0D / 3.1415927410125732D)); - double d4 = d0 / d3; - double d5 = d2 / d3; - - this.setPositionRotation(entityliving.locX + d4, this.locY, entityliving.locZ + d5, f2, f3); - this.height = 0.0F; - float f4 = (float) d3 * 0.2F; - - this.shoot(d0, d1 + (double) f4, d2, f, f1); - } - } - - public EntityArrow(World world, EntityLiving entityliving, float f) { - super(world); - this.j = 10.0D; - this.shooter = entityliving; - this.projectileSource = (LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - if (entityliving instanceof EntityHuman) { - this.fromPlayer = 1; - } - - this.a(0.5F, 0.5F); - this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.locY -= 0.10000000149011612D; - this.locZ -= (double) (MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - this.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F)); - this.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F)); - this.motY = (double) (-MathHelper.sin(this.pitch / 180.0F * 3.1415927F)); - this.shoot(this.motX, this.motY, this.motZ, f * 1.5F, 1.0F); - } - - protected void c() { - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - public void shoot(double d0, double d1, double d2, float f, float f1) { - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - d0 /= (double) f2; - d1 /= (double) f2; - d2 /= (double) f2; - d0 += this.random.nextGaussian() * (double) (this.random.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double) f1; - d1 += this.random.nextGaussian() * (double) (this.random.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double) f1; - d2 += this.random.nextGaussian() * (double) (this.random.nextBoolean() ? -1 : 1) * 0.007499999832361937D * (double) f1; - d0 *= (double) f; - d1 *= (double) f; - d2 *= (double) f; - this.motX = d0; - this.motY = d1; - this.motZ = d2; - float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); - - this.lastYaw = this.yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(d1, (double) f3) * 180.0D / 3.1415927410125732D); - this.at = 0; - } - - public void h() { - super.h(); - if (this.lastPitch == 0.0F && this.lastYaw == 0.0F) { - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.lastYaw = this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(this.motY, (double) f) * 180.0D / 3.1415927410125732D); - } - - Block block = this.world.getType(this.d, this.e, this.f); - - if (block.getMaterial() != Material.AIR) { - block.updateShape(this.world, this.d, this.e, this.f); - AxisAlignedBB axisalignedbb = block.a(this.world, this.d, this.e, this.f); - - if (axisalignedbb != null && axisalignedbb.a(Vec3D.a(this.locX, this.locY, this.locZ))) { - this.inGround = true; - } - } - - if (this.shake > 0) { - --this.shake; - } - - if (this.inGround) { - int i = this.world.getData(this.d, this.e, this.f); - - if (block == this.g && i == this.h) { - ++this.at; - if (this.at == 1200) { - this.die(); - } - } else { - this.inGround = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.at = 0; - this.au = 0; - } - } else { - ++this.au; - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.rayTrace(vec3d, vec3d1, false, true, false); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - int j; - float f1; - - for (j = 0; j < list.size(); ++j) { - Entity entity1 = (Entity) list.get(j); - - if (entity1.R() && (entity1 != this.shooter || this.au >= 5)) { - f1 = 0.3F; - AxisAlignedBB axisalignedbb1 = entity1.boundingBox.grow((double) f1, (double) f1, (double) f1); - MovingObjectPosition movingobjectposition1 = axisalignedbb1.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null && movingobjectposition.entity != null && movingobjectposition.entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) movingobjectposition.entity; - - if (entityhuman.abilities.isInvulnerable || this.shooter instanceof EntityHuman && !((EntityHuman) this.shooter).a(entityhuman)) { - movingobjectposition = null; - } - } - - float f2; - float f3; - - if (movingobjectposition != null) { - org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // CraftBukkit - Call event - - if (movingobjectposition.entity != null) { - f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); - int k = MathHelper.f((double) f2 * this.damage); - - if (this.isCritical()) { - k += this.random.nextInt(k / 2 + 2); - } - - DamageSource damagesource = null; - - if (this.shooter == null) { - damagesource = DamageSource.arrow(this, this); - } else { - damagesource = DamageSource.arrow(this, this.shooter); - } - - // CraftBukkit start - Moved damage call - if (movingobjectposition.entity.damageEntity(damagesource, k)) { - if (this.isBurning() && !(movingobjectposition.entity instanceof EntityEnderman) && (!(movingobjectposition.entity instanceof EntityPlayer) || !(this.shooter instanceof EntityPlayer) || this.world.pvpMode)) { // CraftBukkit - abide by pvp setting if destination is a player - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 5); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - movingobjectposition.entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - - // if (movingobjectposition.entity.damageEntity(damagesource, (float) k)) { // CraftBukkit - moved up - if (movingobjectposition.entity instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) movingobjectposition.entity; - - if (!this.world.isStatic) { - entityliving.p(entityliving.aZ() + 1); - } - - if (this.knockbackStrength > 0) { - f3 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (f3 > 0.0F) { - movingobjectposition.entity.g(this.motX * (double) this.knockbackStrength * 0.6000000238418579D / (double) f3, 0.1D, this.motZ * (double) this.knockbackStrength * 0.6000000238418579D / (double) f3); - } - } - - if (this.shooter != null && this.shooter instanceof EntityLiving) { - EnchantmentManager.a(entityliving, this.shooter); - EnchantmentManager.b((EntityLiving) this.shooter, entityliving); - } - - if (this.shooter != null && movingobjectposition.entity != this.shooter && movingobjectposition.entity instanceof EntityHuman && this.shooter instanceof EntityPlayer) { - ((EntityPlayer) this.shooter).playerConnection.sendPacket(new PacketPlayOutGameStateChange(6, 0.0F)); - } - } - - this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F)); - if (!(movingobjectposition.entity instanceof EntityEnderman)) { - this.die(); - } - } else { - this.motX *= -0.10000000149011612D; - this.motY *= -0.10000000149011612D; - this.motZ *= -0.10000000149011612D; - this.yaw += 180.0F; - this.lastYaw += 180.0F; - this.au = 0; - } - } else { - this.d = movingobjectposition.b; - this.e = movingobjectposition.c; - this.f = movingobjectposition.d; - this.g = this.world.getType(this.d, this.e, this.f); - this.h = this.world.getData(this.d, this.e, this.f); - this.motX = (double) ((float) (movingobjectposition.pos.a - this.locX)); - this.motY = (double) ((float) (movingobjectposition.pos.b - this.locY)); - this.motZ = (double) ((float) (movingobjectposition.pos.c - this.locZ)); - f2 = MathHelper.sqrt(this.motX * this.motX + this.motY * this.motY + this.motZ * this.motZ); - this.locX -= this.motX / (double) f2 * 0.05000000074505806D; - this.locY -= this.motY / (double) f2 * 0.05000000074505806D; - this.locZ -= this.motZ / (double) f2 * 0.05000000074505806D; - this.makeSound("random.bowhit", 1.0F, 1.2F / (this.random.nextFloat() * 0.2F + 0.9F)); - this.inGround = true; - this.shake = 7; - this.setCritical(false); - if (this.g.getMaterial() != Material.AIR) { - this.g.a(this.world, this.d, this.e, this.f, (Entity) this); - } - } - } - - if (this.isCritical()) { - for (j = 0; j < 4; ++j) { - this.world.addParticle("crit", this.locX + this.motX * (double) j / 4.0D, this.locY + this.motY * (double) j / 4.0D, this.locZ + this.motZ * (double) j / 4.0D, -this.motX, -this.motY + 0.2D, -this.motZ); - } - } - - this.locX += this.motX; - this.locY += this.motY; - this.locZ += this.motZ; - f2 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f2) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f4 = 0.99F; - - f1 = 0.05F; - if (this.M()) { - for (int l = 0; l < 4; ++l) { - f3 = 0.25F; - this.world.addParticle("bubble", this.locX - this.motX * (double) f3, this.locY - this.motY * (double) f3, this.locZ - this.motZ * (double) f3, this.motX, this.motY, this.motZ); - } - - f4 = 0.8F; - } - - if (this.L()) { - this.extinguish(); - } - - this.motX *= (double) f4; - this.motY *= (double) f4; - this.motZ *= (double) f4; - this.motY -= (double) f1; - this.setPosition(this.locX, this.locY, this.locZ); - this.I(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.d); - nbttagcompound.setShort("yTile", (short) this.e); - nbttagcompound.setShort("zTile", (short) this.f); - nbttagcompound.setShort("life", (short) this.at); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.g)); - nbttagcompound.setByte("inData", (byte) this.h); - nbttagcompound.setByte("shake", (byte) this.shake); - nbttagcompound.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - nbttagcompound.setByte("pickup", (byte) this.fromPlayer); - nbttagcompound.setDouble("damage", this.damage); - } - - public void a(NBTTagCompound nbttagcompound) { - this.d = nbttagcompound.getShort("xTile"); - this.e = nbttagcompound.getShort("yTile"); - this.f = nbttagcompound.getShort("zTile"); - this.at = nbttagcompound.getShort("life"); - this.g = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.h = nbttagcompound.getByte("inData") & 255; - this.shake = nbttagcompound.getByte("shake") & 255; - this.inGround = nbttagcompound.getByte("inGround") == 1; - if (nbttagcompound.hasKeyOfType("damage", 99)) { - this.damage = nbttagcompound.getDouble("damage"); - } - - if (nbttagcompound.hasKeyOfType("pickup", 99)) { - this.fromPlayer = nbttagcompound.getByte("pickup"); - } else if (nbttagcompound.hasKeyOfType("player", 99)) { - this.fromPlayer = nbttagcompound.getBoolean("player") ? 1 : 0; - } - } - - public void b_(EntityHuman entityhuman) { - if (!this.world.isStatic && this.inGround && this.shake <= 0) { - // CraftBukkit start - ItemStack itemstack = new ItemStack(Items.ARROW); - if (this.fromPlayer == 1 && entityhuman.inventory.canHold(itemstack) > 0) { - EntityItem item = new EntityItem(this.world, this.locX, this.locY, this.locZ, itemstack); - - PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), new org.bukkit.craftbukkit.entity.CraftItem(this.world.getServer(), this, item), 0); - // event.setCancelled(!entityhuman.canPickUpLoot); TODO - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - boolean flag = this.fromPlayer == 1 || this.fromPlayer == 2 && entityhuman.abilities.canInstantlyBuild; - - if (this.fromPlayer == 1 && !entityhuman.inventory.pickup(new ItemStack(Items.ARROW, 1))) { - flag = false; - } - - if (flag) { - this.makeSound("random.pop", 0.2F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); - entityhuman.receive(this, 1); - this.die(); - } - } - } - - protected boolean g_() { - return false; - } - - public void b(double d0) { - this.damage = d0; - } - - public double e() { - return this.damage; - } - - public void setKnockbackStrength(int i) { - this.knockbackStrength = i; - } - - public boolean av() { - return false; - } - - public void setCritical(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 1))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -2))); - } - } - - public boolean isCritical() { - byte b0 = this.datawatcher.getByte(16); - - return (b0 & 1) != 0; - } - - // CraftBukkit start - public boolean isInGround() { - return inGround; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityBoat.java b/src/main/java/net/minecraft/server/EntityBoat.java deleted file mode 100644 index 8a3ea635..00000000 --- a/src/main/java/net/minecraft/server/EntityBoat.java +++ /dev/null @@ -1,498 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.vehicle.VehicleDamageEvent; -import org.bukkit.event.vehicle.VehicleDestroyEvent; -import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; -import org.bukkit.event.vehicle.VehicleMoveEvent; -// CraftBukkit end - -public class EntityBoat extends Entity { - - private boolean a; - private double b; - private int c; - private double d; - private double e; - private double f; - private double g; - private double h; - - // CraftBukkit start - public double maxSpeed = 0.4D; - public double occupiedDeceleration = 0.2D; - public double unoccupiedDeceleration = -1; - public boolean landBoats = false; - - @Override - public void collide(Entity entity) { - org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); - - VehicleEntityCollisionEvent event = new VehicleEntityCollisionEvent((Vehicle) this.getBukkitEntity(), hitEntity); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - super.collide(entity); - } - // CraftBukkit end - - public EntityBoat(World world) { - super(world); - this.a = true; - this.b = 0.07D; - this.k = true; - this.a(1.5F, 0.6F); - this.height = this.length / 2.0F; - } - - protected boolean g_() { - return false; - } - - protected void c() { - this.datawatcher.a(17, new Integer(0)); - this.datawatcher.a(18, new Integer(1)); - this.datawatcher.a(19, new Float(0.0F)); - } - - public AxisAlignedBB h(Entity entity) { - return entity.boundingBox; - } - - public AxisAlignedBB J() { - return this.boundingBox; - } - - public boolean S() { - return true; - } - - public EntityBoat(World world, double d0, double d1, double d2) { - this(world); - this.setPosition(d0, d1 + (double) this.height, d2); - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit - } - - public double ae() { - return (double) this.length * 0.0D - 0.30000001192092896D; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (!this.world.isStatic && !this.dead) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity attacker = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); - - VehicleDamageEvent event = new VehicleDamageEvent(vehicle, attacker, (double) f); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - // f = event.getDamage(); // TODO Why don't we do this? - // CraftBukkit end - - this.c(-this.i()); - this.a(10); - this.setDamage(this.getDamage() + f * 10.0F); - this.Q(); - boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; - - if (flag || this.getDamage() > 40.0F) { - // CraftBukkit start - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, attacker); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - - if (destroyEvent.isCancelled()) { - this.setDamage(40F); // Maximize damage so this doesn't get triggered again right away - return true; - } - // CraftBukkit end - - if (this.passenger != null) { - this.passenger.mount(this); - } - - if (!flag) { - this.a(Items.BOAT, 1, 0.0F); - } - - this.die(); - } - - return true; - } else { - return true; - } - } - - public boolean R() { - return !this.dead; - } - - public void h() { - // CraftBukkit start - double prevX = this.locX; - double prevY = this.locY; - double prevZ = this.locZ; - float prevYaw = this.yaw; - float prevPitch = this.pitch; - // CraftBukkit end - - super.h(); - if (this.f() > 0) { - this.a(this.f() - 1); - } - - if (this.getDamage() > 0.0F) { - this.setDamage(this.getDamage() - 1.0F); - } - - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - byte b0 = 5; - double d0 = 0.0D; - - for (int i = 0; i < b0; ++i) { - double d1 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (i + 0) / (double) b0 - 0.125D; - double d2 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (i + 1) / (double) b0 - 0.125D; - AxisAlignedBB axisalignedbb = AxisAlignedBB.a(this.boundingBox.a, d1, this.boundingBox.c, this.boundingBox.d, d2, this.boundingBox.f); - - if (this.world.b(axisalignedbb, Material.WATER)) { - d0 += 1.0D / (double) b0; - } - } - - double d3 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - double d4; - double d5; - int j; - - if (d3 > 0.26249999999999996D) { - d4 = Math.cos((double) this.yaw * 3.141592653589793D / 180.0D); - d5 = Math.sin((double) this.yaw * 3.141592653589793D / 180.0D); - - for (j = 0; (double) j < 1.0D + d3 * 60.0D; ++j) { - double d6 = (double) (this.random.nextFloat() * 2.0F - 1.0F); - double d7 = (double) (this.random.nextInt(2) * 2 - 1) * 0.7D; - double d8; - double d9; - - if (this.random.nextBoolean()) { - d8 = this.locX - d4 * d6 * 0.8D + d5 * d7; - d9 = this.locZ - d5 * d6 * 0.8D - d4 * d7; - this.world.addParticle("splash", d8, this.locY - 0.125D, d9, this.motX, this.motY, this.motZ); - } else { - d8 = this.locX + d4 + d5 * d6 * 0.7D; - d9 = this.locZ + d5 - d4 * d6 * 0.7D; - this.world.addParticle("splash", d8, this.locY - 0.125D, d9, this.motX, this.motY, this.motZ); - } - } - } - - double d10; - double d11; - - if (this.world.isStatic && this.a) { - if (this.c > 0) { - d4 = this.locX + (this.d - this.locX) / (double) this.c; - d5 = this.locY + (this.e - this.locY) / (double) this.c; - d10 = this.locZ + (this.f - this.locZ) / (double) this.c; - d11 = MathHelper.g(this.g - (double) this.yaw); - this.yaw = (float) ((double) this.yaw + d11 / (double) this.c); - this.pitch = (float) ((double) this.pitch + (this.h - (double) this.pitch) / (double) this.c); - --this.c; - this.setPosition(d4, d5, d10); - this.b(this.yaw, this.pitch); - } else { - d4 = this.locX + this.motX; - d5 = this.locY + this.motY; - d10 = this.locZ + this.motZ; - this.setPosition(d4, d5, d10); - if (this.onGround) { - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; - } - - this.motX *= 0.9900000095367432D; - this.motY *= 0.949999988079071D; - this.motZ *= 0.9900000095367432D; - } - } else { - if (d0 < 1.0D) { - d4 = d0 * 2.0D - 1.0D; - this.motY += 0.03999999910593033D * d4; - } else { - if (this.motY < 0.0D) { - this.motY /= 2.0D; - } - - this.motY += 0.007000000216066837D; - } - - if (this.passenger != null && this.passenger instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) this.passenger; - float f = this.passenger.yaw + -entityliving.bd * 90.0F; - - this.motX += -Math.sin((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.be * 0.05000000074505806D; - this.motZ += Math.cos((double) (f * 3.1415927F / 180.0F)) * this.b * (double) entityliving.be * 0.05000000074505806D; - } - // CraftBukkit start - Support unoccupied deceleration - else if (unoccupiedDeceleration >= 0) { - this.motX *= unoccupiedDeceleration; - this.motZ *= unoccupiedDeceleration; - // Kill lingering speed - if (motX <= 0.00001) { - motX = 0; - } - if (motZ <= 0.00001) { - motZ = 0; - } - } - // CraftBukkit end - - d4 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d4 > 0.35D) { - d5 = 0.35D / d4; - this.motX *= d5; - this.motZ *= d5; - d4 = 0.35D; - } - - if (d4 > d3 && this.b < 0.35D) { - this.b += (0.35D - this.b) / 35.0D; - if (this.b > 0.35D) { - this.b = 0.35D; - } - } else { - this.b -= (this.b - 0.07D) / 35.0D; - if (this.b < 0.07D) { - this.b = 0.07D; - } - } - - int k; - - for (k = 0; k < 4; ++k) { - int l = MathHelper.floor(this.locX + ((double) (k % 2) - 0.5D) * 0.8D); - - j = MathHelper.floor(this.locZ + ((double) (k / 2) - 0.5D) * 0.8D); - - for (int i1 = 0; i1 < 2; ++i1) { - int j1 = MathHelper.floor(this.locY) + i1; - Block block = this.world.getType(l, j1, j); - - if (block == Blocks.SNOW) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - this.world.setAir(l, j1, j); - this.positionChanged = false; - } else if (block == Blocks.WATER_LILY) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, l, j1, j, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - this.world.setAir(l, j1, j, true); - this.positionChanged = false; - } - } - } - - if (this.onGround && !this.landBoats) { // CraftBukkit - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; - } - - this.move(this.motX, this.motY, this.motZ); - if (this.positionChanged && d3 > 0.2D) { - if (!this.world.isStatic && !this.dead) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - if (!destroyEvent.isCancelled()) { - this.die(); - - for (k = 0; k < 3; ++k) { - this.a(Item.getItemOf(Blocks.WOOD), 1, 0.0F); - } - - for (k = 0; k < 2; ++k) { - this.a(Items.STICK, 1, 0.0F); - } - } - // CraftBukkit end - } - } else { - this.motX *= 0.9900000095367432D; - this.motY *= 0.949999988079071D; - this.motZ *= 0.9900000095367432D; - } - - this.pitch = 0.0F; - d5 = (double) this.yaw; - d10 = this.lastX - this.locX; - d11 = this.lastZ - this.locZ; - if (d10 * d10 + d11 * d11 > 0.001D) { - d5 = (double) ((float) (Math.atan2(d11, d10) * 180.0D / 3.141592653589793D)); - } - - double d12 = MathHelper.g(d5 - (double) this.yaw); - - if (d12 > 20.0D) { - d12 = 20.0D; - } - - if (d12 < -20.0D) { - d12 = -20.0D; - } - - this.yaw = (float) ((double) this.yaw + d12); - this.b(this.yaw, this.pitch); - - // CraftBukkit start - org.bukkit.Server server = this.world.getServer(); - org.bukkit.World bworld = this.world.getWorld(); - - Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); - Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - - server.getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); - - if (!from.equals(to)) { - VehicleMoveEvent event = new VehicleMoveEvent(vehicle, from, to); - server.getPluginManager().callEvent(event); - } - // CraftBukkit end - - if (!this.world.isStatic) { - List list = this.world.getEntities(this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int k1 = 0; k1 < list.size(); ++k1) { - Entity entity = (Entity) list.get(k1); - - if (entity != this.passenger && entity.S() && entity instanceof EntityBoat) { - entity.collide(this); - } - } - } - - if (this.passenger != null && this.passenger.dead) { - this.passenger.vehicle = null; // CraftBukkit - this.passenger = null; - } - } - } - } - - public void ac() { - if (this.passenger != null) { - double d0 = Math.cos((double) this.yaw * 3.141592653589793D / 180.0D) * 0.4D; - double d1 = Math.sin((double) this.yaw * 3.141592653589793D / 180.0D) * 0.4D; - - this.passenger.setPosition(this.locX + d0, this.locY + this.ae() + this.passenger.ad(), this.locZ + d1); - } - } - - protected void b(NBTTagCompound nbttagcompound) {} - - protected void a(NBTTagCompound nbttagcompound) {} - - public boolean c(EntityHuman entityhuman) { - if (this.passenger != null && this.passenger instanceof EntityHuman && this.passenger != entityhuman) { - return true; - } else { - if (!this.world.isStatic) { - entityhuman.mount(this); - } - - return true; - } - } - - protected void a(double d0, boolean flag) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (flag) { - if (this.fallDistance > 3.0F) { - this.b(this.fallDistance); - if (!this.world.isStatic && !this.dead) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, null); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - if (!destroyEvent.isCancelled()) { - this.die(); - - int l; - - for (l = 0; l < 3; ++l) { - this.a(Item.getItemOf(Blocks.WOOD), 1, 0.0F); - } - - for (l = 0; l < 2; ++l) { - this.a(Items.STICK, 1, 0.0F); - } - } - // CraftBukkit end - } - - this.fallDistance = 0.0F; - } - } else if (this.world.getType(i, j - 1, k).getMaterial() != Material.WATER && d0 < 0.0D) { - this.fallDistance = (float) ((double) this.fallDistance - d0); - } - } - - public void setDamage(float f) { - this.datawatcher.watch(19, Float.valueOf(f)); - } - - public float getDamage() { - return this.datawatcher.getFloat(19); - } - - public void a(int i) { - this.datawatcher.watch(17, Integer.valueOf(i)); - } - - public int f() { - return this.datawatcher.getInt(17); - } - - public void c(int i) { - this.datawatcher.watch(18, Integer.valueOf(i)); - } - - public int i() { - return this.datawatcher.getInt(18); - } -} diff --git a/src/main/java/net/minecraft/server/EntityChicken.java b/src/main/java/net/minecraft/server/EntityChicken.java deleted file mode 100644 index a5a5ab5e..00000000 --- a/src/main/java/net/minecraft/server/EntityChicken.java +++ /dev/null @@ -1,158 +0,0 @@ -package net.minecraft.server; - -public class EntityChicken extends EntityAnimal { - - public float bp; - public float bq; - public float br; - public float bs; - public float bt = 1.0F; - public int bu; - public boolean bv; - - public EntityChicken(World world) { - super(world); - this.a(0.3F, 0.7F); - this.bu = this.random.nextInt(6000) + 6000; - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.4D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.0D, Items.SEEDS, false)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(4.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - public void e() { - // CraftBukkit start - if (this.isChickenJockey()) { - this.persistent = !this.isTypeNotPersistent(); - } - // CraftBukkit end - super.e(); - this.bs = this.bp; - this.br = this.bq; - this.bq = (float) ((double) this.bq + (double) (this.onGround ? -1 : 4) * 0.3D); - if (this.bq < 0.0F) { - this.bq = 0.0F; - } - - if (this.bq > 1.0F) { - this.bq = 1.0F; - } - - if (!this.onGround && this.bt < 1.0F) { - this.bt = 1.0F; - } - - this.bt = (float) ((double) this.bt * 0.9D); - if (!this.onGround && this.motY < 0.0D) { - this.motY *= 0.6D; - } - - this.bp += this.bt * 2.0F; - if (!this.world.isStatic && !this.isBaby() && !this.isChickenJockey() && --this.bu <= 0) { - this.makeSound("mob.chicken.plop", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - this.a(Items.EGG, 1); - this.bu = this.random.nextInt(6000) + 6000; - } - } - - protected void b(float f) {} - - protected String t() { - return "mob.chicken.say"; - } - - protected String aT() { - return "mob.chicken.hurt"; - } - - protected String aU() { - return "mob.chicken.hurt"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.chicken.step", 0.15F, 1.0F); - } - - protected Item getLoot() { - return Items.FEATHER; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3) + this.random.nextInt(1 + i); - - for (int k = 0; k < j; ++k) { - this.a(Items.FEATHER, 1); - } - - if (this.isBurning()) { - this.a(Items.COOKED_CHICKEN, 1); - } else { - this.a(Items.RAW_CHICKEN, 1); - } - } - - public EntityChicken b(EntityAgeable entityageable) { - return new EntityChicken(this.world); - } - - public boolean c(ItemStack itemstack) { - return itemstack != null && itemstack.getItem() instanceof ItemSeeds; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.bv = nbttagcompound.getBoolean("IsChickenJockey"); - } - - protected int getExpValue(EntityHuman entityhuman) { - return this.isChickenJockey() ? 10 : super.getExpValue(entityhuman); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("IsChickenJockey", this.bv); - } - - protected boolean isTypeNotPersistent() { - return this.isChickenJockey() && this.passenger == null; - } - - public void ac() { - super.ac(); - float f = MathHelper.sin(this.aM * 3.1415927F / 180.0F); - float f1 = MathHelper.cos(this.aM * 3.1415927F / 180.0F); - float f2 = 0.1F; - float f3 = 0.0F; - - this.passenger.setPosition(this.locX + (double) (f2 * f), this.locY + (double) (this.length * 0.5F) + this.passenger.ad() + (double) f3, this.locZ - (double) (f2 * f1)); - if (this.passenger instanceof EntityLiving) { - ((EntityLiving) this.passenger).aM = this.aM; - } - } - - public boolean isChickenJockey() { - return this.bv; - } - - public void i(boolean flag) { - this.bv = flag; - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityCow.java b/src/main/java/net/minecraft/server/EntityCow.java deleted file mode 100644 index df21fde2..00000000 --- a/src/main/java/net/minecraft/server/EntityCow.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -// CraftBukkit end - -public class EntityCow extends EntityAnimal { - - public EntityCow(World world) { - super(world); - this.a(0.9F, 1.3F); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 2.0D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.25D, Items.WHEAT, false)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.25D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); - } - - protected String t() { - return "mob.cow.say"; - } - - protected String aT() { - return "mob.cow.hurt"; - } - - protected String aU() { - return "mob.cow.hurt"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.cow.step", 0.15F, 1.0F); - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Items.LEATHER; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3) + this.random.nextInt(1 + i); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Items.LEATHER, 1); - } - - j = this.random.nextInt(3) + 1 + this.random.nextInt(1 + i); - - for (k = 0; k < j; ++k) { - if (this.isBurning()) { - this.a(Items.COOKED_BEEF, 1); - } else { - this.a(Items.RAW_BEEF, 1); - } - } - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.BUCKET && !entityhuman.abilities.canInstantlyBuild) { - // CraftBukkit start - Got milk? - org.bukkit.Location loc = this.getBukkitEntity().getLocation(); - org.bukkit.event.player.PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), -1, itemstack, Items.MILK_BUCKET); - - if (event.isCancelled()) { - return false; - } - - if (--itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, CraftItemStack.asNMSCopy(event.getItemStack())); - } else if (!entityhuman.inventory.pickup(new ItemStack(Items.MILK_BUCKET))) { - entityhuman.drop(CraftItemStack.asNMSCopy(event.getItemStack()), false); - } - // CraftBukkit end - - return true; - } else { - return super.a(entityhuman); - } - } - - public EntityCow b(EntityAgeable entityageable) { - return new EntityCow(this.world); - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityCreature.java b/src/main/java/net/minecraft/server/EntityCreature.java deleted file mode 100644 index 6960b058..00000000 --- a/src/main/java/net/minecraft/server/EntityCreature.java +++ /dev/null @@ -1,313 +0,0 @@ -package net.minecraft.server; - -import java.util.UUID; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.EntityUnleashEvent; -// CraftBukkit end - -public abstract class EntityCreature extends EntityInsentient { - - public static final UUID h = UUID.fromString("E199AD21-BA8A-4C53-8D13-6182D5C69D3A"); - public static final AttributeModifier i = (new AttributeModifier(h, "Fleeing speed bonus", 2.0D, 2)).a(false); - public PathEntity pathEntity; // CraftBukkit - private -> public - public Entity target; // CraftBukkit - protected -> public - protected boolean bn; - protected int bo; - private ChunkCoordinates bq = new ChunkCoordinates(0, 0, 0); - private float br = -1.0F; - private PathfinderGoal bs = new PathfinderGoalMoveTowardsRestriction(this, 1.0D); - private boolean bt; - - public EntityCreature(World world) { - super(world); - } - - protected boolean bP() { - return false; - } - - protected void bq() { - this.world.methodProfiler.a("ai"); - if (this.bo > 0 && --this.bo == 0) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(i); - } - - this.bn = this.bP(); - float f11 = 16.0F; - - if (this.target == null) { - // CraftBukkit start - Entity target = this.findTarget(); - if (target != null) { - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - } - // CraftBukkit end - - if (this.target != null) { - this.pathEntity = this.world.findPath(this, this.target, f11, true, false, false, true); - } - } else if (this.target.isAlive()) { - float f1 = this.target.e((Entity) this); - - if (this.hasLineOfSight(this.target)) { - this.a(this.target, f1); - } - } else { - // CraftBukkit start - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.TARGET_DIED); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - // CraftBukkit end - } - - if (this.target instanceof EntityPlayer && ((EntityPlayer) this.target).playerInteractManager.isCreative()) { - this.target = null; - } - - this.world.methodProfiler.b(); - if (!this.bn && this.target != null && (this.pathEntity == null || this.random.nextInt(20) == 0)) { - this.pathEntity = this.world.findPath(this, this.target, f11, true, false, false, true); - } else if (!this.bn && (this.pathEntity == null && this.random.nextInt(180) == 0 || this.random.nextInt(120) == 0 || this.bo > 0) && this.aU < 100) { - this.bQ(); - } - - int i = MathHelper.floor(this.boundingBox.b + 0.5D); - boolean flag = this.M(); - boolean flag1 = this.P(); - - this.pitch = 0.0F; - if (this.pathEntity != null && this.random.nextInt(100) != 0) { - this.world.methodProfiler.a("followpath"); - Vec3D vec3d = this.pathEntity.a((Entity) this); - double d0 = (double) (this.width * 2.0F); - - while (vec3d != null && vec3d.d(this.locX, vec3d.b, this.locZ) < d0 * d0) { - this.pathEntity.a(); - if (this.pathEntity.b()) { - vec3d = null; - this.pathEntity = null; - } else { - vec3d = this.pathEntity.a((Entity) this); - } - } - - this.bc = false; - if (vec3d != null) { - double d1 = vec3d.a - this.locX; - double d2 = vec3d.c - this.locZ; - double d3 = vec3d.b - (double) i; - // CraftBukkit - Math -> TrigMath - float f2 = (float) (org.bukkit.craftbukkit.TrigMath.atan2(d2, d1) * 180.0D / 3.1415927410125732D) - 90.0F; - float f3 = MathHelper.g(f2 - this.yaw); - - this.be = (float) this.getAttributeInstance(GenericAttributes.d).getValue(); - if (f3 > 30.0F) { - f3 = 30.0F; - } - - if (f3 < -30.0F) { - f3 = -30.0F; - } - - this.yaw += f3; - if (this.bn && this.target != null) { - double d4 = this.target.locX - this.locX; - double d5 = this.target.locZ - this.locZ; - float f4 = this.yaw; - - this.yaw = (float) (Math.atan2(d5, d4) * 180.0D / 3.1415927410125732D) - 90.0F; - f3 = (f4 - this.yaw + 90.0F) * 3.1415927F / 180.0F; - this.bd = -MathHelper.sin(f3) * this.be * 1.0F; - this.be = MathHelper.cos(f3) * this.be * 1.0F; - } - - if (d3 > 0.0D) { - this.bc = true; - } - } - - if (this.target != null) { - this.a(this.target, 30.0F, 30.0F); - } - - if (this.positionChanged && !this.bS()) { - this.bc = true; - } - - if (this.random.nextFloat() < 0.8F && (flag || flag1)) { - this.bc = true; - } - - this.world.methodProfiler.b(); - } else { - super.bq(); - this.pathEntity = null; - } - } - - protected void bQ() { - this.world.methodProfiler.a("stroll"); - boolean flag = false; - int i = -1; - int j = -1; - int k = -1; - float f = -99999.0F; - - for (int l = 0; l < 10; ++l) { - int i1 = MathHelper.floor(this.locX + (double) this.random.nextInt(13) - 6.0D); - int j1 = MathHelper.floor(this.locY + (double) this.random.nextInt(7) - 3.0D); - int k1 = MathHelper.floor(this.locZ + (double) this.random.nextInt(13) - 6.0D); - float f1 = this.a(i1, j1, k1); - - if (f1 > f) { - f = f1; - i = i1; - j = j1; - k = k1; - flag = true; - } - } - - if (flag) { - this.pathEntity = this.world.a(this, i, j, k, 10.0F, true, false, false, true); - } - - this.world.methodProfiler.b(); - } - - protected void a(Entity entity, float f) {} - - public float a(int i, int j, int k) { - return 0.0F; - } - - protected Entity findTarget() { - return null; - } - - public boolean canSpawn() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - - return super.canSpawn() && this.a(i, j, k) >= 0.0F; - } - - public boolean bS() { - return this.pathEntity != null; - } - - public void setPathEntity(PathEntity pathentity) { - this.pathEntity = pathentity; - } - - public Entity bT() { - return this.target; - } - - public void setTarget(Entity entity) { - this.target = entity; - } - - public boolean bU() { - return this.b(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); - } - - public boolean b(int i, int j, int k) { - return this.br == -1.0F ? true : this.bq.e(i, j, k) < this.br * this.br; - } - - public void a(int i, int j, int k, int l) { - this.bq.b(i, j, k); - this.br = (float) l; - } - - public ChunkCoordinates bV() { - return this.bq; - } - - public float bW() { - return this.br; - } - - public void bX() { - this.br = -1.0F; - } - - public boolean bY() { - return this.br != -1.0F; - } - - protected void bL() { - super.bL(); - if (this.bN() && this.getLeashHolder() != null && this.getLeashHolder().world == this.world) { - Entity entity = this.getLeashHolder(); - - this.a((int) entity.locX, (int) entity.locY, (int) entity.locZ, 5); - float f = this.e(entity); - - if (this instanceof EntityTameableAnimal && ((EntityTameableAnimal) this).isSitting()) { - if (f > 10.0F) { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit - this.unleash(true, true); - } - - return; - } - - if (!this.bt) { - this.goalSelector.a(2, this.bs); - this.getNavigation().a(false); - this.bt = true; - } - - this.o(f); - if (f > 4.0F) { - this.getNavigation().a(entity, 1.0D); - } - - if (f > 6.0F) { - double d0 = (entity.locX - this.locX) / (double) f; - double d1 = (entity.locY - this.locY) / (double) f; - double d2 = (entity.locZ - this.locZ) / (double) f; - - this.motX += d0 * Math.abs(d0) * 0.4D; - this.motY += d1 * Math.abs(d1) * 0.4D; - this.motZ += d2 * Math.abs(d2) * 0.4D; - } - - if (f > 10.0F) { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), EntityUnleashEvent.UnleashReason.DISTANCE)); // CraftBukkit - this.unleash(true, true); - } - } else if (!this.bN() && this.bt) { - this.bt = false; - this.goalSelector.a(this.bs); - this.getNavigation().a(true); - this.bX(); - } - } - - protected void o(float f) {} -} diff --git a/src/main/java/net/minecraft/server/EntityCreeper.java b/src/main/java/net/minecraft/server/EntityCreeper.java deleted file mode 100644 index a8162c75..00000000 --- a/src/main/java/net/minecraft/server/EntityCreeper.java +++ /dev/null @@ -1,228 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.ExplosionPrimeEvent; -// CraftBukkit end - -public class EntityCreeper extends EntityMonster { - - private int bp; - private int fuseTicks; - private int maxFuseTicks = 30; - private int explosionRadius = 3; - private int record = -1; // CraftBukkit - - public EntityCreeper(World world) { - super(world); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalSwell(this)); - this.goalSelector.a(3, new PathfinderGoalAvoidPlayer(this, EntityOcelot.class, 6.0F, 1.0D, 1.2D)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, 1.0D, false)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 0.8D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(6, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); - this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false)); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - public boolean bk() { - return true; - } - - public int ax() { - return this.getGoalTarget() == null ? 3 : 3 + (int) (this.getHealth() - 1.0F); - } - - protected void b(float f) { - super.b(f); - this.fuseTicks = (int) ((float) this.fuseTicks + f * 1.5F); - if (this.fuseTicks > this.maxFuseTicks - 5) { - this.fuseTicks = this.maxFuseTicks - 5; - } - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) -1)); - this.datawatcher.a(17, Byte.valueOf((byte) 0)); - this.datawatcher.a(18, Byte.valueOf((byte) 0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.datawatcher.getByte(17) == 1) { - nbttagcompound.setBoolean("powered", true); - } - - nbttagcompound.setShort("Fuse", (short) this.maxFuseTicks); - nbttagcompound.setByte("ExplosionRadius", (byte) this.explosionRadius); - nbttagcompound.setBoolean("ignited", this.cc()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.datawatcher.watch(17, Byte.valueOf((byte) (nbttagcompound.getBoolean("powered") ? 1 : 0))); - if (nbttagcompound.hasKeyOfType("Fuse", 99)) { - this.maxFuseTicks = nbttagcompound.getShort("Fuse"); - } - - if (nbttagcompound.hasKeyOfType("ExplosionRadius", 99)) { - this.explosionRadius = nbttagcompound.getByte("ExplosionRadius"); - } - - if (nbttagcompound.getBoolean("ignited")) { - this.cd(); - } - } - - public void h() { - if (this.isAlive()) { - this.bp = this.fuseTicks; - if (this.cc()) { - this.a(1); - } - - int i = this.cb(); - - if (i > 0 && this.fuseTicks == 0) { - this.makeSound("creeper.primed", 1.0F, 0.5F); - } - - this.fuseTicks += i; - if (this.fuseTicks < 0) { - this.fuseTicks = 0; - } - - if (this.fuseTicks >= this.maxFuseTicks) { - this.fuseTicks = this.maxFuseTicks; - this.ce(); - } - } - - super.h(); - } - - protected String aT() { - return "mob.creeper.say"; - } - - protected String aU() { - return "mob.creeper.death"; - } - - public void die(DamageSource damagesource) { - // super.die(damagesource); // CraftBukkit - Moved to end - if (damagesource.getEntity() instanceof EntitySkeleton) { - int i = Item.getId(Items.RECORD_1); - int j = Item.getId(Items.RECORD_12); - int k = i + this.random.nextInt(j - i + 1); - - // CraftBukkit start - Store record for now, drop in dropDeathLoot - // this.a(Item.getById(k), 1); - this.record = k; - // CraftBukkit end - } - - super.die(damagesource); // CraftBukkit - Moved from above - } - - // CraftBukkit start - Whole method - protected void dropDeathLoot(boolean flag, int i) { - super.dropDeathLoot(flag, i); - - // Drop a music disc? - if (this.record != -1) { - this.a(Item.getById(this.record), 1); - this.record = -1; - } - } - // CraftBukkit end - - public boolean n(Entity entity) { - return true; - } - - public boolean isPowered() { - return this.datawatcher.getByte(17) == 1; - } - - protected Item getLoot() { - return Items.SULPHUR; - } - - public int cb() { - return this.datawatcher.getByte(16); - } - - public void a(int i) { - this.datawatcher.watch(16, Byte.valueOf((byte) i)); - } - - public void a(EntityLightning entitylightning) { - super.a(entitylightning); - // CraftBukkit start - if (CraftEventFactory.callCreeperPowerEvent(this, entitylightning, org.bukkit.event.entity.CreeperPowerEvent.PowerCause.LIGHTNING).isCancelled()) { - return; - } - - this.setPowered(true); - } - - public void setPowered(boolean powered) { - if (!powered) { - this.datawatcher.watch(17, Byte.valueOf((byte) 0)); - } else { - this.datawatcher.watch(17, Byte.valueOf((byte) 1)); - } - // CraftBukkit end - } - - protected boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.FLINT_AND_STEEL) { - this.world.makeSound(this.locX + 0.5D, this.locY + 0.5D, this.locZ + 0.5D, "fire.ignite", 1.0F, this.random.nextFloat() * 0.4F + 0.8F); - entityhuman.ba(); - if (!this.world.isStatic) { - this.cd(); - itemstack.damage(1, entityhuman); - return true; - } - } - - return super.a(entityhuman); - } - - private void ce() { - if (!this.world.isStatic) { - boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); - - // CraftBukkit start - float radius = this.isPowered() ? 6.0F : 3.0F; - - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), radius, false); - this.world.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), flag); - this.die(); - } else { - this.fuseTicks = 0; - } - // CraftBukkit end - } - } - - public boolean cc() { - return this.datawatcher.getByte(18) != 0; - } - - public void cd() { - this.datawatcher.watch(18, Byte.valueOf((byte) 1)); - } -} diff --git a/src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java b/src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java deleted file mode 100644 index 8c4670ba..00000000 --- a/src/main/java/net/minecraft/server/EntityDamageSourceIndirect.java +++ /dev/null @@ -1,34 +0,0 @@ -package net.minecraft.server; - -public class EntityDamageSourceIndirect extends EntityDamageSource { - - private Entity owner; - - public EntityDamageSourceIndirect(String s, Entity entity, Entity entity1) { - super(s, entity); - this.owner = entity1; - } - - public Entity i() { - return this.p; - } - - public Entity getEntity() { - return this.owner; - } - - public IChatBaseComponent getLocalizedDeathMessage(EntityLiving entityliving) { - IChatBaseComponent ichatbasecomponent = this.owner == null ? this.p.getScoreboardDisplayName() : this.owner.getScoreboardDisplayName(); - ItemStack itemstack = this.owner instanceof EntityLiving ? ((EntityLiving) this.owner).be() : null; - String s = "death.attack." + this.translationIndex; - String s1 = s + ".item"; - - return itemstack != null && itemstack.hasName() && LocaleI18n.c(s1) ? new ChatMessage(s1, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent, itemstack.E()}) : new ChatMessage(s, new Object[] { entityliving.getScoreboardDisplayName(), ichatbasecomponent}); - } - - // CraftBukkit start - public Entity getProximateDamageSource() { - return super.getEntity(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityEgg.java b/src/main/java/net/minecraft/server/EntityEgg.java deleted file mode 100644 index f999ddd6..00000000 --- a/src/main/java/net/minecraft/server/EntityEgg.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.entity.Ageable; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerEggThrowEvent; -// CraftBukkit end - -public class EntityEgg extends EntityProjectile { - - public EntityEgg(World world) { - super(world); - } - - public EntityEgg(World world, EntityLiving entityliving) { - super(world, entityliving); - } - - public EntityEgg(World world, double d0, double d1, double d2) { - super(world, d0, d1, d2); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (movingobjectposition.entity != null) { - movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); - } - - // CraftBukkit start - Fire PlayerEggThrowEvent - boolean hatching = !this.world.isStatic && this.random.nextInt(8) == 0; - int numHatching = (this.random.nextInt(32) == 0) ? 4 : 1; - if (!hatching) { - numHatching = 0; - } - - EntityType hatchingType = EntityType.CHICKEN; - - Entity shooter = this.getShooter(); - if (shooter instanceof EntityPlayer) { - Player player = (shooter == null) ? null : (Player) shooter.getBukkitEntity(); - - PlayerEggThrowEvent event = new PlayerEggThrowEvent(player, (org.bukkit.entity.Egg) this.getBukkitEntity(), hatching, (byte) numHatching, hatchingType); - this.world.getServer().getPluginManager().callEvent(event); - - hatching = event.isHatching(); - numHatching = event.getNumHatches(); - hatchingType = event.getHatchingType(); - } - - if (hatching) { - for (int k = 0; k < numHatching; k++) { - org.bukkit.entity.Entity entity = world.getWorld().spawn(new org.bukkit.Location(world.getWorld(), this.locX, this.locY, this.locZ, this.yaw, 0.0F), hatchingType.getEntityClass(), org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.EGG); - if (entity instanceof Ageable) { - ((Ageable) entity).setBaby(); - } - } - } - // CraftBukkit end - - for (int j = 0; j < 8; ++j) { - this.world.addParticle("snowballpoof", this.locX, this.locY, this.locZ, 0.0D, 0.0D, 0.0D); - } - - if (!this.world.isStatic) { - this.die(); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityEnderCrystal.java b/src/main/java/net/minecraft/server/EntityEnderCrystal.java deleted file mode 100644 index cb023e2e..00000000 --- a/src/main/java/net/minecraft/server/EntityEnderCrystal.java +++ /dev/null @@ -1,88 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.ExplosionPrimeEvent; -// CraftBukkit end - -public class EntityEnderCrystal extends Entity { - - public int a; - public int b; - - public EntityEnderCrystal(World world) { - super(world); - this.k = true; - this.a(2.0F, 2.0F); - this.height = this.length / 2.0F; - this.b = 5; - this.a = this.random.nextInt(100000); - } - - protected boolean g_() { - return false; - } - - protected void c() { - this.datawatcher.a(8, Integer.valueOf(this.b)); - } - - public void h() { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - ++this.a; - this.datawatcher.watch(8, Integer.valueOf(this.b)); - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.world.worldProvider instanceof WorldProviderTheEnd && this.world.getType(i, j, k) != Blocks.FIRE) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - - protected void b(NBTTagCompound nbttagcompound) {} - - protected void a(NBTTagCompound nbttagcompound) {} - - public boolean R() { - return true; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - if (!this.dead && !this.world.isStatic) { - // CraftBukkit start - All non-living entities need this - if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { - return false; - } - // CraftBukkit end - - this.b = 0; - if (this.b <= 0) { - this.die(); - if (!this.world.isStatic) { - // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 6.0F, false); - this.world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.dead = false; - return false; - } - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); - // CraftBukkit end - } - } - } - - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityEnderDragon.java b/src/main/java/net/minecraft/server/EntityEnderDragon.java deleted file mode 100644 index 78023c4b..00000000 --- a/src/main/java/net/minecraft/server/EntityEnderDragon.java +++ /dev/null @@ -1,682 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.util.BlockStateListPopulator; -import org.bukkit.event.entity.EntityCreatePortalEvent; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.event.entity.EntityRegainHealthEvent; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.Bukkit; -// CraftBukkit end - -public class EntityEnderDragon extends EntityInsentient implements IComplex, IMonster { - - public double h; - public double i; - public double bm; - public double[][] bn = new double[64][3]; - public int bo = -1; - public EntityComplexPart[] children; - public EntityComplexPart bq; - public EntityComplexPart br; - public EntityComplexPart bs; - public EntityComplexPart bt; - public EntityComplexPart bu; - public EntityComplexPart bv; - public EntityComplexPart bw; - public float bx; - public float by; - public boolean bz; - public boolean bA; - private Entity bD; - public int bB; - public EntityEnderCrystal bC; - private Explosion explosionSource = new Explosion(null, this, Double.NaN, Double.NaN, Double.NaN, Float.NaN); // CraftBukkit - reusable source for CraftTNTPrimed.getSource() - - public EntityEnderDragon(World world) { - super(world); - this.children = new EntityComplexPart[] { this.bq = new EntityComplexPart(this, "head", 6.0F, 6.0F), this.br = new EntityComplexPart(this, "body", 8.0F, 8.0F), this.bs = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bt = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bu = new EntityComplexPart(this, "tail", 4.0F, 4.0F), this.bv = new EntityComplexPart(this, "wing", 4.0F, 4.0F), this.bw = new EntityComplexPart(this, "wing", 4.0F, 4.0F)}; - this.setHealth(this.getMaxHealth()); - this.a(16.0F, 8.0F); - this.X = true; - this.fireProof = true; - this.i = 100.0D; - this.ak = true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(200.0D); - } - - protected void c() { - super.c(); - } - - public double[] b(int i, float f) { - if (this.getHealth() <= 0.0F) { - f = 0.0F; - } - - f = 1.0F - f; - int j = this.bo - i * 1 & 63; - int k = this.bo - i * 1 - 1 & 63; - double[] adouble = new double[3]; - double d0 = this.bn[j][0]; - double d1 = MathHelper.g(this.bn[k][0] - d0); - - adouble[0] = d0 + d1 * (double) f; - d0 = this.bn[j][1]; - d1 = this.bn[k][1] - d0; - adouble[1] = d0 + d1 * (double) f; - adouble[2] = this.bn[j][2] + (this.bn[k][2] - this.bn[j][2]) * (double) f; - return adouble; - } - - public void e() { - float f; - float f1; - - if (this.world.isStatic) { - f = MathHelper.cos(this.by * 3.1415927F * 2.0F); - f1 = MathHelper.cos(this.bx * 3.1415927F * 2.0F); - if (f1 <= -0.3F && f >= -0.3F) { - this.world.a(this.locX, this.locY, this.locZ, "mob.enderdragon.wings", 5.0F, 0.8F + this.random.nextFloat() * 0.3F, false); - } - } - - this.bx = this.by; - float f2; - - if (this.getHealth() <= 0.0F) { - f = (this.random.nextFloat() - 0.5F) * 8.0F; - f1 = (this.random.nextFloat() - 0.5F) * 4.0F; - f2 = (this.random.nextFloat() - 0.5F) * 8.0F; - this.world.addParticle("largeexplode", this.locX + (double) f, this.locY + 2.0D + (double) f1, this.locZ + (double) f2, 0.0D, 0.0D, 0.0D); - } else { - this.bP(); - f = 0.2F / (MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ) * 10.0F + 1.0F); - f *= (float) Math.pow(2.0D, this.motY); - if (this.bA) { - this.by += f * 0.5F; - } else { - this.by += f; - } - - this.yaw = MathHelper.g(this.yaw); - if (this.bo < 0) { - for (int d05 = 0; d05 < this.bn.length; ++d05) { - this.bn[d05][0] = (double) this.yaw; - this.bn[d05][1] = this.locY; - } - } - - if (++this.bo == this.bn.length) { - this.bo = 0; - } - - this.bn[this.bo][0] = (double) this.yaw; - this.bn[this.bo][1] = this.locY; - double d0; - double d1; - double d2; - double d3; - float f3; - - if (this.world.isStatic) { - if (this.bg > 0) { - d0 = this.locX + (this.bh - this.locX) / (double) this.bg; - d1 = this.locY + (this.bi - this.locY) / (double) this.bg; - d2 = this.locZ + (this.bj - this.locZ) / (double) this.bg; - d3 = MathHelper.g(this.bk - (double) this.yaw); - this.yaw = (float) ((double) this.yaw + d3 / (double) this.bg); - this.pitch = (float) ((double) this.pitch + (this.bl - (double) this.pitch) / (double) this.bg); - --this.bg; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } - } else { - d0 = this.h - this.locX; - d1 = this.i - this.locY; - d2 = this.bm - this.locZ; - d3 = d0 * d0 + d1 * d1 + d2 * d2; - if (this.bD != null) { - this.h = this.bD.locX; - this.bm = this.bD.locZ; - double d4 = this.h - this.locX; - double d5 = this.bm - this.locZ; - double d6 = Math.sqrt(d4 * d4 + d5 * d5); - double d7 = 0.4000000059604645D + d6 / 80.0D - 1.0D; - - if (d7 > 10.0D) { - d7 = 10.0D; - } - - this.i = this.bD.boundingBox.b + d7; - } else { - this.h += this.random.nextGaussian() * 2.0D; - this.bm += this.random.nextGaussian() * 2.0D; - } - - if (this.bz || d3 < 100.0D || d3 > 22500.0D || this.positionChanged || this.F) { - this.bQ(); - } - - d1 /= (double) MathHelper.sqrt(d0 * d0 + d2 * d2); - f3 = 0.6F; - if (d1 < (double) (-f3)) { - d1 = (double) (-f3); - } - - if (d1 > (double) f3) { - d1 = (double) f3; - } - - this.motY += d1 * 0.10000000149011612D; - this.yaw = MathHelper.g(this.yaw); - double d8 = 180.0D - Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D; - double d9 = MathHelper.g(d8 - (double) this.yaw); - - if (d9 > 50.0D) { - d9 = 50.0D; - } - - if (d9 < -50.0D) { - d9 = -50.0D; - } - - Vec3D vec3d = Vec3D.a(this.h - this.locX, this.i - this.locY, this.bm - this.locZ).a(); - Vec3D vec3d1 = Vec3D.a((double) MathHelper.sin(this.yaw * 3.1415927F / 180.0F), this.motY, (double) (-MathHelper.cos(this.yaw * 3.1415927F / 180.0F))).a(); - float f4 = (float) (vec3d1.b(vec3d) + 0.5D) / 1.5F; - - if (f4 < 0.0F) { - f4 = 0.0F; - } - - this.bf *= 0.8F; - float f5 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ) * 1.0F + 1.0F; - double d10 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ) * 1.0D + 1.0D; - - if (d10 > 40.0D) { - d10 = 40.0D; - } - - this.bf = (float) ((double) this.bf + d9 * (0.699999988079071D / d10 / (double) f5)); - this.yaw += this.bf * 0.1F; - float f6 = (float) (2.0D / (d10 + 1.0D)); - float f7 = 0.06F; - - this.a(0.0F, -1.0F, f7 * (f4 * f6 + (1.0F - f6))); - if (this.bA) { - this.move(this.motX * 0.800000011920929D, this.motY * 0.800000011920929D, this.motZ * 0.800000011920929D); - } else { - this.move(this.motX, this.motY, this.motZ); - } - - Vec3D vec3d2 = Vec3D.a(this.motX, this.motY, this.motZ).a(); - float f8 = (float) (vec3d2.b(vec3d1) + 1.0D) / 2.0F; - - f8 = 0.8F + 0.15F * f8; - this.motX *= (double) f8; - this.motZ *= (double) f8; - this.motY *= 0.9100000262260437D; - } - - this.aM = this.yaw; - this.bq.width = this.bq.length = 3.0F; - this.bs.width = this.bs.length = 2.0F; - this.bt.width = this.bt.length = 2.0F; - this.bu.width = this.bu.length = 2.0F; - this.br.length = 3.0F; - this.br.width = 5.0F; - this.bv.length = 2.0F; - this.bv.width = 4.0F; - this.bw.length = 3.0F; - this.bw.width = 4.0F; - f1 = (float) (this.b(5, 1.0F)[1] - this.b(10, 1.0F)[1]) * 10.0F / 180.0F * 3.1415927F; - f2 = MathHelper.cos(f1); - float f9 = -MathHelper.sin(f1); - float f10 = this.yaw * 3.1415927F / 180.0F; - float f11 = MathHelper.sin(f10); - float f12 = MathHelper.cos(f10); - - this.br.h(); - this.br.setPositionRotation(this.locX + (double) (f11 * 0.5F), this.locY, this.locZ - (double) (f12 * 0.5F), 0.0F, 0.0F); - this.bv.h(); - this.bv.setPositionRotation(this.locX + (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ + (double) (f11 * 4.5F), 0.0F, 0.0F); - this.bw.h(); - this.bw.setPositionRotation(this.locX - (double) (f12 * 4.5F), this.locY + 2.0D, this.locZ - (double) (f11 * 4.5F), 0.0F, 0.0F); - if (!this.world.isStatic && this.hurtTicks == 0) { - this.a(this.world.getEntities(this, this.bv.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); - this.a(this.world.getEntities(this, this.bw.boundingBox.grow(4.0D, 2.0D, 4.0D).d(0.0D, -2.0D, 0.0D))); - this.b(this.world.getEntities(this, this.bq.boundingBox.grow(1.0D, 1.0D, 1.0D))); - } - - double[] adouble = this.b(5, 1.0F); - double[] adouble1 = this.b(0, 1.0F); - - f3 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F - this.bf * 0.01F); - float f13 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F - this.bf * 0.01F); - - this.bq.h(); - this.bq.setPositionRotation(this.locX + (double) (f3 * 5.5F * f2), this.locY + (adouble1[1] - adouble[1]) * 1.0D + (double) (f9 * 5.5F), this.locZ - (double) (f13 * 5.5F * f2), 0.0F, 0.0F); - - for (int j = 0; j < 3; ++j) { - EntityComplexPart entitycomplexpart = null; - - if (j == 0) { - entitycomplexpart = this.bs; - } - - if (j == 1) { - entitycomplexpart = this.bt; - } - - if (j == 2) { - entitycomplexpart = this.bu; - } - - double[] adouble2 = this.b(12 + j * 2, 1.0F); - float f14 = this.yaw * 3.1415927F / 180.0F + this.b(adouble2[0] - adouble[0]) * 3.1415927F / 180.0F * 1.0F; - float f15 = MathHelper.sin(f14); - float f16 = MathHelper.cos(f14); - float f17 = 1.5F; - float f18 = (float) (j + 1) * 2.0F; - - entitycomplexpart.h(); - entitycomplexpart.setPositionRotation(this.locX - (double) ((f11 * f17 + f15 * f18) * f2), this.locY + (adouble2[1] - adouble[1]) * 1.0D - (double) ((f18 + f17) * f9) + 1.5D, this.locZ + (double) ((f12 * f17 + f16 * f18) * f2), 0.0F, 0.0F); - } - - if (!this.world.isStatic) { - this.bA = this.a(this.bq.boundingBox) | this.a(this.br.boundingBox); - } - } - } - - private void bP() { - if (this.bC != null) { - if (this.bC.dead) { - if (!this.world.isStatic) { - CraftEventFactory.entityDamage = this.bC; // CraftBukkit - this.a(this.bq, DamageSource.explosion((Explosion) null), 10.0F); - CraftEventFactory.entityDamage = null; // CraftBukkit - } - - this.bC = null; - } else if (this.ticksLived % 10 == 0 && this.getHealth() < this.getMaxHealth()) { - // CraftBukkit start - EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), 1.0D, EntityRegainHealthEvent.RegainReason.ENDER_CRYSTAL); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setHealth((float) (this.getHealth() + event.getAmount())); - } - // CraftBukkit end - } - } - - if (this.random.nextInt(10) == 0) { - float f = 32.0F; - List list = this.world.a(EntityEnderCrystal.class, this.boundingBox.grow((double) f, (double) f, (double) f)); - EntityEnderCrystal entityendercrystal = null; - double d0 = Double.MAX_VALUE; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityEnderCrystal entityendercrystal1 = (EntityEnderCrystal) iterator.next(); - double d1 = entityendercrystal1.f(this); - - if (d1 < d0) { - d0 = d1; - entityendercrystal = entityendercrystal1; - } - } - - this.bC = entityendercrystal; - } - } - - private void a(List list) { - double d0 = (this.br.boundingBox.a + this.br.boundingBox.d) / 2.0D; - double d1 = (this.br.boundingBox.c + this.br.boundingBox.f) / 2.0D; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - if (entity instanceof EntityLiving) { - double d2 = entity.locX - d0; - double d3 = entity.locZ - d1; - double d4 = d2 * d2 + d3 * d3; - - entity.g(d2 / d4 * 4.0D, 0.20000000298023224D, d3 / d4 * 4.0D); - } - } - } - - private void b(List list) { - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - if (entity instanceof EntityLiving) { - entity.damageEntity(DamageSource.mobAttack(this), 10.0F); - } - } - } - - private void bQ() { - this.bz = false; - if (this.random.nextInt(2) == 0 && !this.world.players.isEmpty()) { - // CraftBukkit start - Entity target = (Entity) this.world.players.get(this.random.nextInt(this.world.players.size())); - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.RANDOM_TARGET); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.bD = null; - } else { - this.bD = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - } - } - // CraftBukkit end - } else { - boolean flag = false; - - do { - this.h = 0.0D; - this.i = (double) (70.0F + this.random.nextFloat() * 50.0F); - this.bm = 0.0D; - this.h += (double) (this.random.nextFloat() * 120.0F - 60.0F); - this.bm += (double) (this.random.nextFloat() * 120.0F - 60.0F); - double d0 = this.locX - this.h; - double d1 = this.locY - this.i; - double d2 = this.locZ - this.bm; - - flag = d0 * d0 + d1 * d1 + d2 * d2 > 100.0D; - } while (!flag); - - this.bD = null; - } - } - - private float b(double d0) { - return (float) MathHelper.g(d0); - } - - private boolean a(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.b); - int k = MathHelper.floor(axisalignedbb.c); - int l = MathHelper.floor(axisalignedbb.d); - int i1 = MathHelper.floor(axisalignedbb.e); - int j1 = MathHelper.floor(axisalignedbb.f); - boolean flag = false; - boolean flag1 = false; - - // CraftBukkit start - Create a list to hold all the destroyed blocks - List<org.bukkit.block.Block> destroyedBlocks = new java.util.ArrayList<org.bukkit.block.Block>(); - org.bukkit.craftbukkit.CraftWorld craftWorld = this.world.getWorld(); - // CraftBukkit end - - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = j; l1 <= i1; ++l1) { - for (int i2 = k; i2 <= j1; ++i2) { - Block block = this.world.getType(k1, l1, i2); - - if (block.getMaterial() != Material.AIR) { - if (block != Blocks.OBSIDIAN && block != Blocks.WHITESTONE && block != Blocks.BEDROCK && this.world.getGameRules().getBoolean("mobGriefing")) { - // CraftBukkit start - Add blocks to list rather than destroying them - // flag1 = this.world.setAir(k1, l1, i2) || flag1; - flag1 = true; - destroyedBlocks.add(craftWorld.getBlockAt(k1, l1, i2)); - // CraftBukkit end - } else { - flag = true; - } - } - } - } - } - - if (flag1) { - // CraftBukkit start - Set off an EntityExplodeEvent for the dragon exploding all these blocks - org.bukkit.entity.Entity bukkitEntity = this.getBukkitEntity(); - EntityExplodeEvent event = new EntityExplodeEvent(bukkitEntity, bukkitEntity.getLocation(), destroyedBlocks, 0F); - Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - // This flag literally means 'Dragon hit something hard' (Obsidian, White Stone or Bedrock) and will cause the dragon to slow down. - // We should consider adding an event extension for it, or perhaps returning true if the event is cancelled. - return flag; - } else if (event.getYield() == 0F) { - // Yield zero ==> no drops - for (org.bukkit.block.Block block : event.blockList()) { - this.world.setAir(block.getX(), block.getY(), block.getZ()); - } - } else { - for (org.bukkit.block.Block block : event.blockList()) { - org.bukkit.Material blockId = block.getType(); - if (blockId == org.bukkit.Material.AIR) { - continue; - } - - int blockX = block.getX(); - int blockY = block.getY(); - int blockZ = block.getZ(); - - Block nmsBlock = org.bukkit.craftbukkit.util.CraftMagicNumbers.getBlock(blockId); - if (nmsBlock.a(explosionSource)) { - nmsBlock.dropNaturally(this.world, blockX, blockY, blockZ, block.getData(), event.getYield(), 0); - } - nmsBlock.wasExploded(world, blockX, blockY, blockZ, explosionSource); - - this.world.setAir(blockX, blockY, blockZ); - } - } - // CraftBukkit end - - double d0 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) this.random.nextFloat(); - double d1 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) this.random.nextFloat(); - double d2 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) this.random.nextFloat(); - - this.world.addParticle("largeexplode", d0, d1, d2, 0.0D, 0.0D, 0.0D); - } - - return flag; - } - - public boolean a(EntityComplexPart entitycomplexpart, DamageSource damagesource, float f) { - if (entitycomplexpart != this.bq) { - f = f / 4.0F + 1.0F; - } - - float f1 = this.yaw * 3.1415927F / 180.0F; - float f2 = MathHelper.sin(f1); - float f3 = MathHelper.cos(f1); - - this.h = this.locX + (double) (f2 * 5.0F) + (double) ((this.random.nextFloat() - 0.5F) * 2.0F); - this.i = this.locY + (double) (this.random.nextFloat() * 3.0F) + 1.0D; - this.bm = this.locZ - (double) (f3 * 5.0F) + (double) ((this.random.nextFloat() - 0.5F) * 2.0F); - this.bD = null; - if (damagesource.getEntity() instanceof EntityHuman || damagesource.isExplosion()) { - this.dealDamage(damagesource, f); - } - - return true; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - return false; - } - - public boolean dealDamage(DamageSource damagesource, float f) { // CraftBukkit - protected -> public - return super.damageEntity(damagesource, f); - } - - protected void aF() { - if (this.dead) return; // CraftBukkit - can't kill what's already dead - ++this.bB; - if (this.bB >= 180 && this.bB <= 200) { - float f = (this.random.nextFloat() - 0.5F) * 8.0F; - float f1 = (this.random.nextFloat() - 0.5F) * 4.0F; - float f2 = (this.random.nextFloat() - 0.5F) * 8.0F; - - this.world.addParticle("hugeexplosion", this.locX + (double) f, this.locY + 2.0D + (double) f1, this.locZ + (double) f2, 0.0D, 0.0D, 0.0D); - } - - int i; - int j; - - if (!this.world.isStatic) { - if (this.bB > 150 && this.bB % 5 == 0) { - i = this.expToDrop / 12; // CraftBukkit - drop experience as dragon falls from sky. use experience drop from death event. This is now set in getExpReward() - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - } - - if (this.bB == 1) { - // CraftBukkit start - Use relative location for far away sounds - //this.world.b(1018, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; - for (EntityPlayer player : (List<EntityPlayer>) this.world.players) { - double deltaX = this.locX - player.locX; - double deltaZ = this.locZ - player.locZ; - double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; - if (distanceSquared > viewDistance * viewDistance) { - double deltaLength = Math.sqrt(distanceSquared); - double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; - double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, (int) relativeX, (int) this.locY, (int) relativeZ, 0, true)); - } else { - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1018, (int) this.locX, (int) this.locY, (int) this.locZ, 0, true)); - } - } - // CraftBukkit end - } - } - - this.move(0.0D, 0.10000000149011612D, 0.0D); - this.aM = this.yaw += 20.0F; - if (this.bB == 200 && !this.world.isStatic) { - i = this.expToDrop - (10 * this.expToDrop / 12); // CraftBukkit - drop the remaining experience - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - - this.b(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - this.die(); - } - } - - private void b(int i, int j) { - byte b0 = 64; - - BlockEnderPortal.a = true; - byte b1 = 4; - - // CraftBukkit start - Replace any "this.world" in the following with just "world"! - BlockStateListPopulator world = new BlockStateListPopulator(this.world.getWorld()); - - for (int k = b0 - 1; k <= b0 + 32; ++k) { - for (int l = i - b1; l <= i + b1; ++l) { - for (int i1 = j - b1; i1 <= j + b1; ++i1) { - double d0 = (double) (l - i); - double d1 = (double) (i1 - j); - double d2 = d0 * d0 + d1 * d1; - - if (d2 <= ((double) b1 - 0.5D) * ((double) b1 - 0.5D)) { - if (k < b0) { - if (d2 <= ((double) (b1 - 1) - 0.5D) * ((double) (b1 - 1) - 0.5D)) { - world.setTypeUpdate(l, k, i1, Blocks.BEDROCK); - } - } else if (k > b0) { - world.setTypeUpdate(l, k, i1, Blocks.AIR); - } else if (d2 > ((double) (b1 - 1) - 0.5D) * ((double) (b1 - 1) - 0.5D)) { - world.setTypeUpdate(l, k, i1, Blocks.BEDROCK); - } else { - world.setTypeUpdate(l, k, i1, Blocks.ENDER_PORTAL); - } - } - } - } - } - - world.setType(i, b0 + 0, j, Blocks.BEDROCK); - world.setType(i, b0 + 1, j, Blocks.BEDROCK); - world.setType(i, b0 + 2, j, Blocks.BEDROCK); - world.setTypeAndData(i - 1, b0 + 2, j, Blocks.TORCH, 2, 0); - world.setTypeAndData(i + 1, b0 + 2, j, Blocks.TORCH, 1, 0); - world.setTypeAndData(i, b0 + 2, j - 1, Blocks.TORCH, 4, 0); - world.setTypeAndData(i, b0 + 2, j + 1, Blocks.TORCH, 3, 0); - world.setType(i, b0 + 3, j, Blocks.BEDROCK); - world.setType(i, b0 + 4, j, Blocks.DRAGON_EGG); - - EntityCreatePortalEvent event = new EntityCreatePortalEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), java.util.Collections.unmodifiableList(world.getList()), org.bukkit.PortalType.ENDER); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - for (BlockState state : event.getBlocks()) { - state.update(true); - } - } else { - for (BlockState state : event.getBlocks()) { - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(state.getX(), state.getY(), state.getZ(), this.world); - for (Iterator it = this.world.players.iterator(); it.hasNext();) { - EntityHuman entity = (EntityHuman) it.next(); - if (entity instanceof EntityPlayer) { - ((EntityPlayer) entity).playerConnection.sendPacket(packet); - } - } - } - } - // CraftBukkit end - - BlockEnderPortal.a = false; - } - - protected void w() {} - - public Entity[] at() { - return this.children; - } - - public boolean R() { - return false; - } - - public World a() { - return this.world; - } - - protected String t() { - return "mob.enderdragon.growl"; - } - - protected String aT() { - return "mob.enderdragon.hit"; - } - - protected float bf() { - return 5.0F; - } - - // CraftBukkit start - public int getExpReward() { - // This value is equal to the amount of experience dropped while falling from the sky (10 * 1000) - // plus what is dropped when the dragon hits the ground (2000) - return 12000; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityEnderPearl.java b/src/main/java/net/minecraft/server/EntityEnderPearl.java deleted file mode 100644 index 336b6b07..00000000 --- a/src/main/java/net/minecraft/server/EntityEnderPearl.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.player.PlayerTeleportEvent; -// CraftBukkit end - -public class EntityEnderPearl extends EntityProjectile { - - public EntityEnderPearl(World world) { - super(world); - } - - public EntityEnderPearl(World world, EntityLiving entityliving) { - super(world, entityliving); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (movingobjectposition.entity != null) { - movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.getShooter()), 0.0F); - } - - for (int i = 0; i < 32; ++i) { - this.world.addParticle("portal", this.locX, this.locY + this.random.nextDouble() * 2.0D, this.locZ, this.random.nextGaussian(), 0.0D, this.random.nextGaussian()); - } - - if (!this.world.isStatic) { - if (this.getShooter() != null && this.getShooter() instanceof EntityPlayer) { - EntityPlayer entityplayer = (EntityPlayer) this.getShooter(); - - if (entityplayer.playerConnection.b().isConnected() && entityplayer.world == this.world) { - // CraftBukkit start - Fire PlayerTeleportEvent - org.bukkit.craftbukkit.entity.CraftPlayer player = entityplayer.getBukkitEntity(); - org.bukkit.Location location = getBukkitEntity().getLocation(); - location.setPitch(player.getLocation().getPitch()); - location.setYaw(player.getLocation().getYaw()); - - PlayerTeleportEvent teleEvent = new PlayerTeleportEvent(player, player.getLocation(), location, PlayerTeleportEvent.TeleportCause.ENDER_PEARL); - Bukkit.getPluginManager().callEvent(teleEvent); - - if (!teleEvent.isCancelled() && !entityplayer.playerConnection.isDisconnected()) { - if (this.getShooter().am()) { - this.getShooter().mount((Entity) null); - } - - entityplayer.playerConnection.teleport(teleEvent.getTo()); - this.getShooter().fallDistance = 0.0F; - CraftEventFactory.entityDamage = this; - this.getShooter().damageEntity(DamageSource.FALL, 5.0F); - CraftEventFactory.entityDamage = null; - } - // CraftBukkit end - } - } - - this.die(); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityEnderman.java b/src/main/java/net/minecraft/server/EntityEnderman.java deleted file mode 100644 index fa6670bc..00000000 --- a/src/main/java/net/minecraft/server/EntityEnderman.java +++ /dev/null @@ -1,382 +0,0 @@ -package net.minecraft.server; - -import java.util.UUID; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTeleportEvent; -// CraftBukkit end - -public class EntityEnderman extends EntityMonster { - - private static final UUID bp = UUID.fromString("020E0DFB-87AE-4653-9556-831010E291A0"); - private static final AttributeModifier bq = (new AttributeModifier(bp, "Attacking speed boost", 6.199999809265137D, 0)).a(false); - private static boolean[] br = new boolean[256]; - private int bs; - private int bt; - private Entity bu; - private boolean bv; - - public EntityEnderman(World world) { - super(world); - this.a(0.6F, 2.9F); - this.W = 1.0F; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(40.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); - this.getAttributeInstance(GenericAttributes.e).setValue(7.0D); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 0)); - this.datawatcher.a(17, new Byte((byte) 0)); - this.datawatcher.a(18, new Byte((byte) 0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("carried", (short) Block.getId(this.getCarried())); - nbttagcompound.setShort("carriedData", (short) this.getCarriedData()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setCarried(Block.getById(nbttagcompound.getShort("carried"))); - this.setCarriedData(nbttagcompound.getShort("carriedData")); - } - - protected Entity findTarget() { - EntityHuman entityhuman = this.world.findNearbyVulnerablePlayer(this, 64.0D); - - if (entityhuman != null) { - if (this.f(entityhuman)) { - this.bv = true; - if (this.bt == 0) { - this.world.makeSound(entityhuman.locX, entityhuman.locY, entityhuman.locZ, "mob.endermen.stare", 1.0F, 1.0F); - } - - if (this.bt++ == 5) { - this.bt = 0; - this.a(true); - return entityhuman; - } - } else { - this.bt = 0; - } - } - - return null; - } - - private boolean f(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.armor[3]; - - if (itemstack != null && itemstack.getItem() == Item.getItemOf(Blocks.PUMPKIN)) { - return false; - } else { - Vec3D vec3d = entityhuman.j(1.0F).a(); - Vec3D vec3d1 = Vec3D.a(this.locX - entityhuman.locX, this.boundingBox.b + (double) (this.length / 2.0F) - (entityhuman.locY + (double) entityhuman.getHeadHeight()), this.locZ - entityhuman.locZ); - double d0 = vec3d1.b(); - - vec3d1 = vec3d1.a(); - double d1 = vec3d.b(vec3d1); - - return d1 > 1.0D - 0.025D / d0 && entityhuman.hasLineOfSight(this); - } - } - - public void e() { - if (this.L()) { - this.damageEntity(DamageSource.DROWN, 1.0F); - } - - if (this.bu != this.target) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(bq); - if (this.target != null) { - attributeinstance.a(bq); - } - } - - this.bu = this.target; - int i; - - if (!this.world.isStatic && this.world.getGameRules().getBoolean("mobGriefing")) { - int j; - int k; - Block block; - - if (this.getCarried().getMaterial() == Material.AIR) { - if (this.random.nextInt(20) == 0) { - i = MathHelper.floor(this.locX - 2.0D + this.random.nextDouble() * 4.0D); - j = MathHelper.floor(this.locY + this.random.nextDouble() * 3.0D); - k = MathHelper.floor(this.locZ - 2.0D + this.random.nextDouble() * 4.0D); - block = this.world.getType(i, j, k); - if (br[Block.getId(block)]) { - // CraftBukkit start - Pickup event - if (!CraftEventFactory.callEntityChangeBlockEvent(this, this.world.getWorld().getBlockAt(i, j, k), org.bukkit.Material.AIR).isCancelled()) { - this.setCarried(block); - this.setCarriedData(this.world.getData(i, j, k)); - this.world.setTypeUpdate(i, j, k, Blocks.AIR); - } - // CraftBukkit end - } - } - } else if (this.random.nextInt(2000) == 0) { - i = MathHelper.floor(this.locX - 1.0D + this.random.nextDouble() * 2.0D); - j = MathHelper.floor(this.locY + this.random.nextDouble() * 2.0D); - k = MathHelper.floor(this.locZ - 1.0D + this.random.nextDouble() * 2.0D); - block = this.world.getType(i, j, k); - Block block1 = this.world.getType(i, j - 1, k); - - if (block.getMaterial() == Material.AIR && block1.getMaterial() != Material.AIR && block1.d()) { - // CraftBukkit start - Place event - if (!CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, this.getCarried(), this.getCarriedData()).isCancelled()) { - this.world.setTypeAndData(i, j, k, this.getCarried(), this.getCarriedData(), 3); - this.setCarried(Blocks.AIR); - } - // CraftBukkit end - } - } - } - - for (i = 0; i < 2; ++i) { - this.world.addParticle("portal", this.locX + (this.random.nextDouble() - 0.5D) * (double) this.width, this.locY + this.random.nextDouble() * (double) this.length - 0.25D, this.locZ + (this.random.nextDouble() - 0.5D) * (double) this.width, (this.random.nextDouble() - 0.5D) * 2.0D, -this.random.nextDouble(), (this.random.nextDouble() - 0.5D) * 2.0D); - } - - if (this.world.w() && !this.world.isStatic) { - float f = this.d(1.0F); - - if (f > 0.5F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F) { - this.target = null; - this.a(false); - this.bv = false; - this.bZ(); - } - } - - if (this.L() || this.isBurning()) { - this.target = null; - this.a(false); - this.bv = false; - this.bZ(); - } - - if (this.cd() && !this.bv && this.random.nextInt(100) == 0) { - this.a(false); - } - - this.bc = false; - if (this.target != null) { - this.a(this.target, 100.0F, 100.0F); - } - - if (!this.world.isStatic && this.isAlive()) { - if (this.target != null) { - if (this.target instanceof EntityHuman && this.f((EntityHuman) this.target)) { - if (this.target.f((Entity) this) < 16.0D) { - this.bZ(); - } - - this.bs = 0; - } else if (this.target.f((Entity) this) > 256.0D && this.bs++ >= 30 && this.c(this.target)) { - this.bs = 0; - } - } else { - this.a(false); - this.bs = 0; - } - } - - super.e(); - } - - protected boolean bZ() { - double d0 = this.locX + (this.random.nextDouble() - 0.5D) * 64.0D; - double d1 = this.locY + (double) (this.random.nextInt(64) - 32); - double d2 = this.locZ + (this.random.nextDouble() - 0.5D) * 64.0D; - - return this.k(d0, d1, d2); - } - - protected boolean c(Entity entity) { - Vec3D vec3d = Vec3D.a(this.locX - entity.locX, this.boundingBox.b + (double) (this.length / 2.0F) - entity.locY + (double) entity.getHeadHeight(), this.locZ - entity.locZ); - - vec3d = vec3d.a(); - double d0 = 16.0D; - double d1 = this.locX + (this.random.nextDouble() - 0.5D) * 8.0D - vec3d.a * d0; - double d2 = this.locY + (double) (this.random.nextInt(16) - 8) - vec3d.b * d0; - double d3 = this.locZ + (this.random.nextDouble() - 0.5D) * 8.0D - vec3d.c * d0; - - return this.k(d1, d2, d3); - } - - protected boolean k(double d0, double d1, double d2) { - double d3 = this.locX; - double d4 = this.locY; - double d5 = this.locZ; - - this.locX = d0; - this.locY = d1; - this.locZ = d2; - boolean flag = false; - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.world.isLoaded(i, j, k)) { - boolean flag1 = false; - - while (!flag1 && j > 0) { - Block block = this.world.getType(i, j - 1, k); - - if (block.getMaterial().isSolid()) { - flag1 = true; - } else { - --this.locY; - --j; - } - } - - if (flag1) { - // CraftBukkit start - Teleport event - EntityTeleportEvent teleport = new EntityTeleportEvent(this.getBukkitEntity(), new Location(this.world.getWorld(), d3, d4, d5), new Location(this.world.getWorld(), this.locX, this.locY, this.locZ)); - this.world.getServer().getPluginManager().callEvent(teleport); - if (teleport.isCancelled()) { - return false; - } - - Location to = teleport.getTo(); - this.setPosition(to.getX(), to.getY(), to.getZ()); - // CraftBukkit end - - if (this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox)) { - flag = true; - } - } - } - - if (!flag) { - this.setPosition(d3, d4, d5); - return false; - } else { - short short1 = 128; - - for (int l = 0; l < short1; ++l) { - double d6 = (double) l / ((double) short1 - 1.0D); - float f = (this.random.nextFloat() - 0.5F) * 0.2F; - float f1 = (this.random.nextFloat() - 0.5F) * 0.2F; - float f2 = (this.random.nextFloat() - 0.5F) * 0.2F; - double d7 = d3 + (this.locX - d3) * d6 + (this.random.nextDouble() - 0.5D) * (double) this.width * 2.0D; - double d8 = d4 + (this.locY - d4) * d6 + this.random.nextDouble() * (double) this.length; - double d9 = d5 + (this.locZ - d5) * d6 + (this.random.nextDouble() - 0.5D) * (double) this.width * 2.0D; - - this.world.addParticle("portal", d7, d8, d9, (double) f, (double) f1, (double) f2); - } - - this.world.makeSound(d3, d4, d5, "mob.endermen.portal", 1.0F, 1.0F); - this.makeSound("mob.endermen.portal", 1.0F, 1.0F); - return true; - } - } - - protected String t() { - return this.cd() ? "mob.endermen.scream" : "mob.endermen.idle"; - } - - protected String aT() { - return "mob.endermen.hit"; - } - - protected String aU() { - return "mob.endermen.death"; - } - - protected Item getLoot() { - return Items.ENDER_PEARL; - } - - protected void dropDeathLoot(boolean flag, int i) { - Item item = this.getLoot(); - - if (item != null) { - int j = this.random.nextInt(2 + i); - - for (int k = 0; k < j; ++k) { - this.a(item, 1); - } - } - } - - public void setCarried(Block block) { - this.datawatcher.watch(16, Byte.valueOf((byte) (Block.getId(block) & 255))); - } - - public Block getCarried() { - return Block.getById(this.datawatcher.getByte(16)); - } - - public void setCarriedData(int i) { - this.datawatcher.watch(17, Byte.valueOf((byte) (i & 255))); - } - - public int getCarriedData() { - return this.datawatcher.getByte(17); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.a(true); - if (damagesource instanceof EntityDamageSource && damagesource.getEntity() instanceof EntityHuman) { - this.bv = true; - } - - if (damagesource instanceof EntityDamageSourceIndirect) { - this.bv = false; - - for (int i = 0; i < 64; ++i) { - if (this.bZ()) { - return true; - } - } - - return false; - } else { - return super.damageEntity(damagesource, f); - } - } - } - - public boolean cd() { - return this.datawatcher.getByte(18) > 0; - } - - public void a(boolean flag) { - this.datawatcher.watch(18, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - static { - br[Block.getId(Blocks.GRASS)] = true; - br[Block.getId(Blocks.DIRT)] = true; - br[Block.getId(Blocks.SAND)] = true; - br[Block.getId(Blocks.GRAVEL)] = true; - br[Block.getId(Blocks.YELLOW_FLOWER)] = true; - br[Block.getId(Blocks.RED_ROSE)] = true; - br[Block.getId(Blocks.BROWN_MUSHROOM)] = true; - br[Block.getId(Blocks.RED_MUSHROOM)] = true; - br[Block.getId(Blocks.TNT)] = true; - br[Block.getId(Blocks.CACTUS)] = true; - br[Block.getId(Blocks.CLAY)] = true; - br[Block.getId(Blocks.PUMPKIN)] = true; - br[Block.getId(Blocks.MELON)] = true; - br[Block.getId(Blocks.MYCEL)] = true; - } -} diff --git a/src/main/java/net/minecraft/server/EntityExperienceOrb.java b/src/main/java/net/minecraft/server/EntityExperienceOrb.java deleted file mode 100644 index 57507603..00000000 --- a/src/main/java/net/minecraft/server/EntityExperienceOrb.java +++ /dev/null @@ -1,188 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTargetEvent; -// CraftBukkit end - -public class EntityExperienceOrb extends Entity { - - public int a; - public int b; - public int c; - private int d = 5; - public int value; // CraftBukkit - private -> public - private EntityHuman targetPlayer; - private int targetTime; - - public EntityExperienceOrb(World world, double d0, double d1, double d2, int i) { - super(world); - this.a(0.5F, 0.5F); - this.height = this.length / 2.0F; - this.setPosition(d0, d1, d2); - this.yaw = (float) (Math.random() * 360.0D); - this.motX = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D) * 2.0F); - this.motY = (double) ((float) (Math.random() * 0.2D) * 2.0F); - this.motZ = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D) * 2.0F); - this.value = i; - } - - protected boolean g_() { - return false; - } - - public EntityExperienceOrb(World world) { - super(world); - this.a(0.25F, 0.25F); - this.height = this.length / 2.0F; - } - - protected void c() {} - - public void h() { - super.h(); - if (this.c > 0) { - --this.c; - } - - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.029999999329447746D; - if (this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)).getMaterial() == Material.LAVA) { - this.motY = 0.20000000298023224D; - this.motX = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.motZ = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.makeSound("random.fizz", 0.4F, 2.0F + this.random.nextFloat() * 0.4F); - } - - this.j(this.locX, (this.boundingBox.b + this.boundingBox.e) / 2.0D, this.locZ); - double d0 = 8.0D; - - if (this.targetTime < this.a - 20 + this.getId() % 100) { - if (this.targetPlayer == null || this.targetPlayer.f(this) > d0 * d0) { - this.targetPlayer = this.world.findNearbyPlayer(this, d0); - } - - this.targetTime = this.a; - } - - if (this.targetPlayer != null) { - // CraftBukkit start - EntityTargetEvent event = CraftEventFactory.callEntityTargetEvent(this, targetPlayer, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - Entity target = event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - - if (!event.isCancelled() && target != null) { - double d1 = (target.locX - this.locX) / d0; - double d2 = (target.locY + (double) target.getHeadHeight() - this.locY) / d0; - double d3 = (target.locZ - this.locZ) / d0; - double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); - double d5 = 1.0D - d4; - if (d5 > 0.0D) { - d5 *= d5; - this.motX += d1 / d4 * d5 * 0.1D; - this.motY += d2 / d4 * d5 * 0.1D; - this.motZ += d3 / d4 * d5 * 0.1D; - } - // CraftBukkit end - } - } - - this.move(this.motX, this.motY, this.motZ); - float f = 0.98F; - - if (this.onGround) { - f = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.98F; - } - - this.motX *= (double) f; - this.motY *= 0.9800000190734863D; - this.motZ *= (double) f; - if (this.onGround) { - this.motY *= -0.8999999761581421D; - } - - ++this.a; - ++this.b; - if (this.b >= 6000) { - this.die(); - } - } - - public boolean N() { - return this.world.a(this.boundingBox, Material.WATER, (Entity) this); - } - - protected void burn(int i) { - this.damageEntity(DamageSource.FIRE, (float) i); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.Q(); - this.d = (int) ((float) this.d - f); - if (this.d <= 0) { - this.die(); - } - - return false; - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("Health", (short) ((byte) this.d)); - nbttagcompound.setShort("Age", (short) this.b); - nbttagcompound.setShort("Value", (short) this.value); - } - - public void a(NBTTagCompound nbttagcompound) { - this.d = nbttagcompound.getShort("Health") & 255; - this.b = nbttagcompound.getShort("Age"); - this.value = nbttagcompound.getShort("Value"); - } - - public void b_(EntityHuman entityhuman) { - if (!this.world.isStatic) { - if (this.c == 0 && entityhuman.bt == 0) { - entityhuman.bt = 2; - this.world.makeSound(entityhuman, "random.orb", 0.1F, 0.5F * ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.8F)); - entityhuman.receive(this, 1); - entityhuman.giveExp(CraftEventFactory.callPlayerExpChangeEvent(entityhuman, this.value).getAmount()); // CraftBukkit - this.value -> event.getAmount() - this.die(); - } - } - } - - public int e() { - return this.value; - } - - public static int getOrbValue(int i) { - // CraftBukkit start - if (i > 162670129) return i - 100000; - if (i > 81335063) return 81335063; - if (i > 40667527) return 40667527; - if (i > 20333759) return 20333759; - if (i > 10166857) return 10166857; - if (i > 5083423) return 5083423; - if (i > 2541701) return 2541701; - if (i > 1270849) return 1270849; - if (i > 635413) return 635413; - if (i > 317701) return 317701; - if (i > 158849) return 158849; - if (i > 79423) return 79423; - if (i > 39709) return 39709; - if (i > 19853) return 19853; - if (i > 9923) return 9923; - if (i > 4957) return 4957; - // CraftBukkit end - - return i >= 2477 ? 2477 : (i >= 1237 ? 1237 : (i >= 617 ? 617 : (i >= 307 ? 307 : (i >= 149 ? 149 : (i >= 73 ? 73 : (i >= 37 ? 37 : (i >= 17 ? 17 : (i >= 7 ? 7 : (i >= 3 ? 3 : 1))))))))); - } - - public boolean av() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java deleted file mode 100644 index 5576f151..00000000 --- a/src/main/java/net/minecraft/server/EntityFallingBlock.java +++ /dev/null @@ -1,233 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityFallingBlock extends Entity { - - public Block id; // CraftBukkit - private -> public - public int data; - public int ticksLived; - public boolean dropItem; - private boolean f; - private boolean hurtEntities; - private int fallHurtMax; - private float fallHurtAmount; - public NBTTagCompound tileEntityData; - - public EntityFallingBlock(World world) { - super(world); - this.dropItem = true; - this.fallHurtMax = 40; - this.fallHurtAmount = 2.0F; - } - - public EntityFallingBlock(World world, double d0, double d1, double d2, Block block) { - this(world, d0, d1, d2, block, 0); - } - - public EntityFallingBlock(World world, double d0, double d1, double d2, Block block, int i) { - super(world); - this.dropItem = true; - this.fallHurtMax = 40; - this.fallHurtAmount = 2.0F; - this.id = block; - this.data = i; - this.k = true; - this.a(0.98F, 0.98F); - this.height = this.length / 2.0F; - this.setPosition(d0, d1, d2); - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - } - - protected boolean g_() { - return false; - } - - protected void c() {} - - public boolean R() { - return !this.dead; - } - - public void h() { - if (this.id.getMaterial() == Material.AIR) { - this.die(); - } else { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - ++this.ticksLived; - this.motY -= 0.03999999910593033D; - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.9800000190734863D; - this.motY *= 0.9800000190734863D; - this.motZ *= 0.9800000190734863D; - if (!this.world.isStatic) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.ticksLived == 1) { - // CraftBukkit - compare data and call event - if (this.ticksLived != 1 || this.world.getType(i, j, k) != this.id || this.world.getData(i, j, k) != this.data || CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, Blocks.AIR, 0).isCancelled()) { - this.die(); - return; - } - - this.world.setAir(i, j, k); - } - - if (this.onGround) { - this.motX *= 0.699999988079071D; - this.motZ *= 0.699999988079071D; - this.motY *= -0.5D; - if (this.world.getType(i, j, k) != Blocks.PISTON_MOVING) { - this.die(); - // CraftBukkit start - fire EntityChangeBlockEvent - if (!this.f && this.world.mayPlace(this.id, i, j, k, true, 1, (Entity) null, (ItemStack) null) && !BlockFalling.canFall(this.world, i, j - 1, k) /* mimic the false conditions of setTypeIdAndData */ && i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 && j > 0 && j < 256 && !(this.world.getType(i, j, k) == this.id && this.world.getData(i, j, k) == this.data)) { - if (CraftEventFactory.callEntityChangeBlockEvent(this, i, j, k, this.id, this.data).isCancelled()) { - return; - } - this.world.setTypeAndData(i, j, k, this.id, this.data, 3); - // CraftBukkit end - - if (this.id instanceof BlockFalling) { - ((BlockFalling) this.id).a(this.world, i, j, k, this.data); - } - - if (this.tileEntityData != null && this.id instanceof IContainer) { - TileEntity tileentity = this.world.getTileEntity(i, j, k); - - if (tileentity != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - tileentity.b(nbttagcompound); - Iterator iterator = this.tileEntityData.c().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - NBTBase nbtbase = this.tileEntityData.get(s); - - if (!s.equals("x") && !s.equals("y") && !s.equals("z")) { - nbttagcompound.set(s, nbtbase.clone()); - } - } - - tileentity.a(nbttagcompound); - tileentity.update(); - } - } - } else if (this.dropItem && !this.f) { - this.a(new ItemStack(this.id, 1, this.id.getDropData(this.data)), 0.0F); - } - } - } else if (this.ticksLived > 100 && !this.world.isStatic && (j < 1 || j > 256) || this.ticksLived > 600) { - if (this.dropItem) { - this.a(new ItemStack(this.id, 1, this.id.getDropData(this.data)), 0.0F); - } - - this.die(); - } - } - } - } - - protected void b(float f) { - if (this.hurtEntities) { - int i = MathHelper.f(f - 1.0F); - - if (i > 0) { - ArrayList arraylist = new ArrayList(this.world.getEntities(this, this.boundingBox)); - boolean flag = this.id == Blocks.ANVIL; - DamageSource damagesource = flag ? DamageSource.ANVIL : DamageSource.FALLING_BLOCK; - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - CraftEventFactory.entityDamage = this; // CraftBukkit - entity.damageEntity(damagesource, (float) Math.min(MathHelper.d((float) i * this.fallHurtAmount), this.fallHurtMax)); - CraftEventFactory.entityDamage = null; // CraftBukkit - } - - if (flag && (double) this.random.nextFloat() < 0.05000000074505806D + (double) i * 0.05D) { - int j = this.data >> 2; - int k = this.data & 3; - - ++j; - if (j > 2) { - this.f = true; - } else { - this.data = k | j << 2; - } - } - } - } - } - - protected void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("Tile", (byte) Block.getId(this.id)); - nbttagcompound.setInt("TileID", Block.getId(this.id)); - nbttagcompound.setByte("Data", (byte) this.data); - nbttagcompound.setByte("Time", (byte) this.ticksLived); - nbttagcompound.setBoolean("DropItem", this.dropItem); - nbttagcompound.setBoolean("HurtEntities", this.hurtEntities); - nbttagcompound.setFloat("FallHurtAmount", this.fallHurtAmount); - nbttagcompound.setInt("FallHurtMax", this.fallHurtMax); - if (this.tileEntityData != null) { - nbttagcompound.set("TileEntityData", this.tileEntityData); - } - } - - protected void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("TileID", 99)) { - this.id = Block.getById(nbttagcompound.getInt("TileID")); - } else { - this.id = Block.getById(nbttagcompound.getByte("Tile") & 255); - } - - this.data = nbttagcompound.getByte("Data") & 255; - this.ticksLived = nbttagcompound.getByte("Time") & 255; - if (nbttagcompound.hasKeyOfType("HurtEntities", 99)) { - this.hurtEntities = nbttagcompound.getBoolean("HurtEntities"); - this.fallHurtAmount = nbttagcompound.getFloat("FallHurtAmount"); - this.fallHurtMax = nbttagcompound.getInt("FallHurtMax"); - } else if (this.id == Blocks.ANVIL) { - this.hurtEntities = true; - } - - if (nbttagcompound.hasKeyOfType("DropItem", 99)) { - this.dropItem = nbttagcompound.getBoolean("DropItem"); - } - - if (nbttagcompound.hasKeyOfType("TileEntityData", 10)) { - this.tileEntityData = nbttagcompound.getCompound("TileEntityData"); - } - - if (this.id.getMaterial() == Material.AIR) { - this.id = Blocks.SAND; - } - } - - public void a(boolean flag) { - this.hurtEntities = flag; - } - - public void a(CrashReportSystemDetails crashreportsystemdetails) { - super.a(crashreportsystemdetails); - crashreportsystemdetails.a("Immitating block ID", Integer.valueOf(Block.getId(this.id))); - crashreportsystemdetails.a("Immitating block data", Integer.valueOf(this.data)); - } - - public Block f() { - return this.id; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFireball.java b/src/main/java/net/minecraft/server/EntityFireball.java deleted file mode 100644 index 02d90aa2..00000000 --- a/src/main/java/net/minecraft/server/EntityFireball.java +++ /dev/null @@ -1,269 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public abstract class EntityFireball extends Entity { - - private int e = -1; - private int f = -1; - private int g = -1; - private Block h; - private boolean i; - public EntityLiving shooter; - private int at; - private int au; - public double dirX; - public double dirY; - public double dirZ; - public float bukkitYield = 1; // CraftBukkit - public boolean isIncendiary = true; // CraftBukkit - - public EntityFireball(World world) { - super(world); - this.a(1.0F, 1.0F); - } - - protected void c() {} - - public EntityFireball(World world, double d0, double d1, double d2, double d3, double d4, double d5) { - super(world); - this.a(1.0F, 1.0F); - this.setPositionRotation(d0, d1, d2, this.yaw, this.pitch); - this.setPosition(d0, d1, d2); - double d6 = (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - - this.dirX = d3 / d6 * 0.1D; - this.dirY = d4 / d6 * 0.1D; - this.dirZ = d5 / d6 * 0.1D; - } - - public EntityFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world); - this.shooter = entityliving; - this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - this.a(1.0F, 1.0F); - this.setPositionRotation(entityliving.locX, entityliving.locY, entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - this.motX = this.motY = this.motZ = 0.0D; - // CraftBukkit start - Added setDirection method - this.setDirection(d0, d1, d2); - } - - public void setDirection(double d0, double d1, double d2) { - // CraftBukkit end - d0 += this.random.nextGaussian() * 0.4D; - d1 += this.random.nextGaussian() * 0.4D; - d2 += this.random.nextGaussian() * 0.4D; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - this.dirX = d0 / d3 * 0.1D; - this.dirY = d1 / d3 * 0.1D; - this.dirZ = d2 / d3 * 0.1D; - } - - public void h() { - if (!this.world.isStatic && (this.shooter != null && this.shooter.dead || !this.world.isLoaded((int) this.locX, (int) this.locY, (int) this.locZ))) { - this.die(); - } else { - super.h(); - this.setOnFire(1); - if (this.i) { - if (this.world.getType(this.e, this.f, this.g) == this.h) { - ++this.at; - if (this.at == 600) { - this.die(); - } - - return; - } - - this.i = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.at = 0; - this.au = 0; - } else { - ++this.au; - } - - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.a(vec3d, vec3d1); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.R() && (!entity1.i(this.shooter) || this.au >= 25)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) { - this.a(movingobjectposition); - - // CraftBukkit start - Fire ProjectileHitEvent - if (this.dead) { - CraftEventFactory.callProjectileHitEvent(this); - } - // CraftBukkit end - } - - this.locX += this.motX; - this.locY += this.motY; - this.locZ += this.motZ; - float f1 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motZ, this.motX) * 180.0D / 3.1415927410125732D) + 90.0F; - - for (this.pitch = (float) (Math.atan2((double) f1, this.motY) * 180.0D / 3.1415927410125732D) - 90.0F; this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f2 = this.e(); - - if (this.M()) { - for (int j = 0; j < 4; ++j) { - float f3 = 0.25F; - - this.world.addParticle("bubble", this.locX - this.motX * (double) f3, this.locY - this.motY * (double) f3, this.locZ - this.motZ * (double) f3, this.motX, this.motY, this.motZ); - } - - f2 = 0.8F; - } - - this.motX += this.dirX; - this.motY += this.dirY; - this.motZ += this.dirZ; - this.motX *= (double) f2; - this.motY *= (double) f2; - this.motZ *= (double) f2; - this.world.addParticle("smoke", this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D); - this.setPosition(this.locX, this.locY, this.locZ); - } - } - - protected float e() { - return 0.95F; - } - - protected abstract void a(MovingObjectPosition movingobjectposition); - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.e); - nbttagcompound.setShort("yTile", (short) this.f); - nbttagcompound.setShort("zTile", (short) this.g); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.h)); - nbttagcompound.setByte("inGround", (byte) (this.i ? 1 : 0)); - // CraftBukkit - Fix direction being mismapped to invalid variables - nbttagcompound.set("power", this.a(new double[] { this.dirX, this.dirY, this.dirZ})); - } - - public void a(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getShort("xTile"); - this.f = nbttagcompound.getShort("yTile"); - this.g = nbttagcompound.getShort("zTile"); - this.h = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.i = nbttagcompound.getByte("inGround") == 1; - // CraftBukkit start - direction -> power - if (nbttagcompound.hasKeyOfType("power", 9)) { - NBTTagList nbttaglist = nbttagcompound.getList("power", 6); - - this.dirX = nbttaglist.d(0); - this.dirY = nbttaglist.d(1); - this.dirZ = nbttaglist.d(2); - // CraftBukkit end - } else { - this.die(); - } - } - - public boolean R() { - return true; - } - - public float af() { - return 1.0F; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.Q(); - if (damagesource.getEntity() != null) { - // CraftBukkit start - if (CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f)) { - return false; - } - // CraftBukkit end - - Vec3D vec3d = damagesource.getEntity().ag(); - - if (vec3d != null) { - this.motX = vec3d.a; - this.motY = vec3d.b; - this.motZ = vec3d.c; - this.dirX = this.motX * 0.1D; - this.dirY = this.motY * 0.1D; - this.dirZ = this.motZ * 0.1D; - } - - if (damagesource.getEntity() instanceof EntityLiving) { - this.shooter = (EntityLiving) damagesource.getEntity(); - this.projectileSource = (org.bukkit.projectiles.ProjectileSource) this.shooter.getBukkitEntity(); - } - - return true; - } else { - return false; - } - } - } - - public float d(float f) { - return 1.0F; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFireworks.java b/src/main/java/net/minecraft/server/EntityFireworks.java deleted file mode 100644 index 759d46c4..00000000 --- a/src/main/java/net/minecraft/server/EntityFireworks.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -public class EntityFireworks extends Entity { - - private int ticksFlown; - public int expectedLifespan; // CraftBukkit - private -> public - - public EntityFireworks(World world) { - super(world); - this.a(0.25F, 0.25F); - } - - protected void c() { - this.datawatcher.add(8, 5); - } - - public EntityFireworks(World world, double d0, double d1, double d2, ItemStack itemstack) { - super(world); - this.ticksFlown = 0; - this.a(0.25F, 0.25F); - this.setPosition(d0, d1, d2); - this.height = 0.0F; - int i = 1; - - if (itemstack != null && itemstack.hasTag()) { - this.datawatcher.watch(8, itemstack); - NBTTagCompound nbttagcompound = itemstack.getTag(); - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Fireworks"); - - if (nbttagcompound1 != null) { - i += nbttagcompound1.getByte("Flight"); - } - } - - this.motX = this.random.nextGaussian() * 0.001D; - this.motZ = this.random.nextGaussian() * 0.001D; - this.motY = 0.05D; - this.expectedLifespan = 10 * i + this.random.nextInt(6) + this.random.nextInt(7); - } - - public void h() { - this.S = this.locX; - this.T = this.locY; - this.U = this.locZ; - super.h(); - this.motX *= 1.15D; - this.motZ *= 1.15D; - this.motY += 0.04D; - this.move(this.motX, this.motY, this.motZ); - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - if (this.ticksFlown == 0) { - this.world.makeSound(this, "fireworks.launch", 3.0F, 1.0F); - } - - ++this.ticksFlown; - if (this.world.isStatic && this.ticksFlown % 2 < 2) { - this.world.addParticle("fireworksSpark", this.locX, this.locY - 0.3D, this.locZ, this.random.nextGaussian() * 0.05D, -this.motY * 0.5D, this.random.nextGaussian() * 0.05D); - } - - if (!this.world.isStatic && this.ticksFlown > this.expectedLifespan) { - this.world.broadcastEntityEffect(this, (byte) 17); - this.die(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("Life", this.ticksFlown); - nbttagcompound.setInt("LifeTime", this.expectedLifespan); - ItemStack itemstack = this.datawatcher.getItemStack(8); - - if (itemstack != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - itemstack.save(nbttagcompound1); - nbttagcompound.set("FireworksItem", nbttagcompound1); - } - } - - public void a(NBTTagCompound nbttagcompound) { - this.ticksFlown = nbttagcompound.getInt("Life"); - this.expectedLifespan = nbttagcompound.getInt("LifeTime"); - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("FireworksItem"); - - if (nbttagcompound1 != null) { - ItemStack itemstack = ItemStack.createStack(nbttagcompound1); - - if (itemstack != null) { - this.datawatcher.watch(8, itemstack); - } - } - } - - public float d(float f) { - return super.d(f); - } - - public boolean au() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityFishingHook.java b/src/main/java/net/minecraft/server/EntityFishingHook.java deleted file mode 100644 index 9d4ea60f..00000000 --- a/src/main/java/net/minecraft/server/EntityFishingHook.java +++ /dev/null @@ -1,475 +0,0 @@ -package net.minecraft.server; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.entity.Fish; -import org.bukkit.event.player.PlayerFishEvent; -// CraftBukkit end - -public class EntityFishingHook extends Entity { - - private static final List d = Arrays.asList(new PossibleFishingResult[] { (new PossibleFishingResult(new ItemStack(Items.LEATHER_BOOTS), 10)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.LEATHER), 10), new PossibleFishingResult(new ItemStack(Items.BONE), 10), new PossibleFishingResult(new ItemStack(Items.POTION), 10), new PossibleFishingResult(new ItemStack(Items.STRING), 5), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 2)).a(0.9F), new PossibleFishingResult(new ItemStack(Items.BOWL), 10), new PossibleFishingResult(new ItemStack(Items.STICK), 5), new PossibleFishingResult(new ItemStack(Items.INK_SACK, 10, 0), 1), new PossibleFishingResult(new ItemStack(Blocks.TRIPWIRE_SOURCE), 10), new PossibleFishingResult(new ItemStack(Items.ROTTEN_FLESH), 10)}); - private static final List e = Arrays.asList(new PossibleFishingResult[] { new PossibleFishingResult(new ItemStack(Blocks.WATER_LILY), 1), new PossibleFishingResult(new ItemStack(Items.NAME_TAG), 1), new PossibleFishingResult(new ItemStack(Items.SADDLE), 1), (new PossibleFishingResult(new ItemStack(Items.BOW), 1)).a(0.25F).a(), (new PossibleFishingResult(new ItemStack(Items.FISHING_ROD), 1)).a(0.25F).a(), (new PossibleFishingResult(new ItemStack(Items.BOOK), 1)).a()}); - private static final List f = Arrays.asList(new PossibleFishingResult[] { new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.COD.a()), 60), new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.SALMON.a()), 25), new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.CLOWNFISH.a()), 2), new PossibleFishingResult(new ItemStack(Items.RAW_FISH, 1, EnumFish.PUFFERFISH.a()), 13)}); - private int g = -1; - private int h = -1; - private int i = -1; - private Block at; - private boolean au; - public int a; - public EntityHuman owner; - private int av; - private int aw; - private int ax; - private int ay; - private int az; - private float aA; - public Entity hooked; - private int aB; - private double aC; - private double aD; - private double aE; - private double aF; - private double aG; - - public EntityFishingHook(World world) { - super(world); - this.a(0.25F, 0.25F); - this.ak = true; - } - - public EntityFishingHook(World world, EntityHuman entityhuman) { - super(world); - this.ak = true; - this.owner = entityhuman; - this.owner.hookedFish = this; - this.a(0.25F, 0.25F); - this.setPositionRotation(entityhuman.locX, entityhuman.locY + 1.62D - (double) entityhuman.height, entityhuman.locZ, entityhuman.yaw, entityhuman.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.locY -= 0.10000000149011612D; - this.locZ -= (double) (MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - float f = 0.4F; - - this.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motY = (double) (-MathHelper.sin(this.pitch / 180.0F * 3.1415927F) * f); - this.c(this.motX, this.motY, this.motZ, 1.5F, 1.0F); - } - - protected void c() {} - - public void c(double d0, double d1, double d2, float f, float f1) { - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - d0 /= (double) f2; - d1 /= (double) f2; - d2 /= (double) f2; - d0 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d1 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d2 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d0 *= (double) f; - d1 *= (double) f; - d2 *= (double) f; - this.motX = d0; - this.motY = d1; - this.motZ = d2; - float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); - - this.lastYaw = this.yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(d1, (double) f3) * 180.0D / 3.1415927410125732D); - this.av = 0; - } - - public void h() { - super.h(); - if (this.aB > 0) { - double d0 = this.locX + (this.aC - this.locX) / (double) this.aB; - double d1 = this.locY + (this.aD - this.locY) / (double) this.aB; - double d2 = this.locZ + (this.aE - this.locZ) / (double) this.aB; - double d3 = MathHelper.g(this.aF - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.aB); - this.pitch = (float) ((double) this.pitch + (this.aG - (double) this.pitch) / (double) this.aB); - --this.aB; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } else { - if (!this.world.isStatic) { - ItemStack itemstack = this.owner.bF(); - - if (this.owner.dead || !this.owner.isAlive() || itemstack == null || itemstack.getItem() != Items.FISHING_ROD || this.f(this.owner) > 1024.0D) { - this.die(); - this.owner.hookedFish = null; - return; - } - - if (this.hooked != null) { - if (!this.hooked.dead) { - this.locX = this.hooked.locX; - this.locY = this.hooked.boundingBox.b + (double) this.hooked.length * 0.8D; - this.locZ = this.hooked.locZ; - return; - } - - this.hooked = null; - } - } - - if (this.a > 0) { - --this.a; - } - - if (this.au) { - if (this.world.getType(this.g, this.h, this.i) == this.at) { - ++this.av; - if (this.av == 1200) { - this.die(); - } - - return; - } - - this.au = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.av = 0; - this.aw = 0; - } else { - ++this.aw; - } - - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.a(vec3d, vec3d1); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d4 = 0.0D; - - double d5; - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.R() && (entity1 != this.owner || this.aw >= 5)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - d5 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - if (d5 < d4 || d4 == 0.0D) { - entity = entity1; - d4 = d5; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - - if (movingobjectposition != null) { - org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); // Craftbukkit - Call event - if (movingobjectposition.entity != null) { - if (movingobjectposition.entity.damageEntity(DamageSource.projectile(this, this.owner), 0.0F)) { - this.hooked = movingobjectposition.entity; - } - } else { - this.au = true; - } - } - - if (!this.au) { - this.move(this.motX, this.motY, this.motZ); - float f1 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f1) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f2 = 0.92F; - - if (this.onGround || this.positionChanged) { - f2 = 0.5F; - } - - byte b0 = 5; - double d6 = 0.0D; - - for (int j = 0; j < b0; ++j) { - double d7 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (j + 0) / (double) b0 - 0.125D + 0.125D; - double d8 = this.boundingBox.b + (this.boundingBox.e - this.boundingBox.b) * (double) (j + 1) / (double) b0 - 0.125D + 0.125D; - AxisAlignedBB axisalignedbb1 = AxisAlignedBB.a(this.boundingBox.a, d7, this.boundingBox.c, this.boundingBox.d, d8, this.boundingBox.f); - - if (this.world.b(axisalignedbb1, Material.WATER)) { - d6 += 1.0D / (double) b0; - } - } - - if (!this.world.isStatic && d6 > 0.0D) { - WorldServer worldserver = (WorldServer) this.world; - int k = 1; - - if (this.random.nextFloat() < 0.25F && this.world.isRainingAt(MathHelper.floor(this.locX), MathHelper.floor(this.locY) + 1, MathHelper.floor(this.locZ))) { - k = 2; - } - - if (this.random.nextFloat() < 0.5F && !this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY) + 1, MathHelper.floor(this.locZ))) { - --k; - } - - if (this.ax > 0) { - --this.ax; - if (this.ax <= 0) { - this.ay = 0; - this.az = 0; - } - } else { - float f3; - double d9; - float f4; - float f5; - double d10; - double d11; - - if (this.az > 0) { - this.az -= k; - if (this.az <= 0) { - this.motY -= 0.20000000298023224D; - this.makeSound("random.splash", 0.25F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.4F); - f4 = (float) MathHelper.floor(this.boundingBox.b); - worldserver.a("bubble", this.locX, (double) (f4 + 1.0F), this.locZ, (int) (1.0F + this.width * 20.0F), (double) this.width, 0.0D, (double) this.width, 0.20000000298023224D); - worldserver.a("wake", this.locX, (double) (f4 + 1.0F), this.locZ, (int) (1.0F + this.width * 20.0F), (double) this.width, 0.0D, (double) this.width, 0.20000000298023224D); - this.ax = MathHelper.nextInt(this.random, 10, 30); - } else { - this.aA = (float) ((double) this.aA + this.random.nextGaussian() * 4.0D); - f4 = this.aA * 0.017453292F; - f5 = MathHelper.sin(f4); - f3 = MathHelper.cos(f4); - d9 = this.locX + (double) (f5 * (float) this.az * 0.1F); - d11 = (double) ((float) MathHelper.floor(this.boundingBox.b) + 1.0F); - d10 = this.locZ + (double) (f3 * (float) this.az * 0.1F); - if (this.random.nextFloat() < 0.15F) { - worldserver.a("bubble", d9, d11 - 0.10000000149011612D, d10, 1, (double) f5, 0.1D, (double) f3, 0.0D); - } - - float f6 = f5 * 0.04F; - float f7 = f3 * 0.04F; - - worldserver.a("wake", d9, d11, d10, 0, (double) f7, 0.01D, (double) (-f6), 1.0D); - worldserver.a("wake", d9, d11, d10, 0, (double) (-f7), 0.01D, (double) f6, 1.0D); - } - } else if (this.ay > 0) { - this.ay -= k; - f4 = 0.15F; - if (this.ay < 20) { - f4 = (float) ((double) f4 + (double) (20 - this.ay) * 0.05D); - } else if (this.ay < 40) { - f4 = (float) ((double) f4 + (double) (40 - this.ay) * 0.02D); - } else if (this.ay < 60) { - f4 = (float) ((double) f4 + (double) (60 - this.ay) * 0.01D); - } - - if (this.random.nextFloat() < f4) { - f5 = MathHelper.a(this.random, 0.0F, 360.0F) * 0.017453292F; - f3 = MathHelper.a(this.random, 25.0F, 60.0F); - d9 = this.locX + (double) (MathHelper.sin(f5) * f3 * 0.1F); - d11 = (double) ((float) MathHelper.floor(this.boundingBox.b) + 1.0F); - d10 = this.locZ + (double) (MathHelper.cos(f5) * f3 * 0.1F); - worldserver.a("splash", d9, d11, d10, 2 + this.random.nextInt(2), 0.10000000149011612D, 0.0D, 0.10000000149011612D, 0.0D); - } - - if (this.ay <= 0) { - this.aA = MathHelper.a(this.random, 0.0F, 360.0F); - this.az = MathHelper.nextInt(this.random, 20, 80); - } - } else { - this.ay = MathHelper.nextInt(this.random, 100, 900); - this.ay -= EnchantmentManager.getLureEnchantmentLevel(this.owner) * 20 * 5; - } - } - - if (this.ax > 0) { - this.motY -= (double) (this.random.nextFloat() * this.random.nextFloat() * this.random.nextFloat()) * 0.2D; - } - } - - d5 = d6 * 2.0D - 1.0D; - this.motY += 0.03999999910593033D * d5; - if (d6 > 0.0D) { - f2 = (float) ((double) f2 * 0.9D); - this.motY *= 0.8D; - } - - this.motX *= (double) f2; - this.motY *= (double) f2; - this.motZ *= (double) f2; - this.setPosition(this.locX, this.locY, this.locZ); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.g); - nbttagcompound.setShort("yTile", (short) this.h); - nbttagcompound.setShort("zTile", (short) this.i); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.at)); - nbttagcompound.setByte("shake", (byte) this.a); - nbttagcompound.setByte("inGround", (byte) (this.au ? 1 : 0)); - } - - public void a(NBTTagCompound nbttagcompound) { - this.g = nbttagcompound.getShort("xTile"); - this.h = nbttagcompound.getShort("yTile"); - this.i = nbttagcompound.getShort("zTile"); - this.at = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.a = nbttagcompound.getByte("shake") & 255; - this.au = nbttagcompound.getByte("inGround") == 1; - } - - public int e() { - if (this.world.isStatic) { - return 0; - } else { - byte b0 = 0; - - if (this.hooked != null) { - // CraftBukkit start - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), this.hooked.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_ENTITY); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return 0; - } - // CraftBukkit end - - double d0 = this.owner.locX - this.locX; - double d1 = this.owner.locY - this.locY; - double d2 = this.owner.locZ - this.locZ; - double d3 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - double d4 = 0.1D; - - this.hooked.motX += d0 * d4; - this.hooked.motY += d1 * d4 + (double) MathHelper.sqrt(d3) * 0.08D; - this.hooked.motZ += d2 * d4; - b0 = 3; - } else if (this.ax > 0) { - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY, this.locZ, this.f()); - // CraftBukkit start - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), entityitem.getBukkitEntity(), (Fish) this.getBukkitEntity(), PlayerFishEvent.State.CAUGHT_FISH); - playerFishEvent.setExpToDrop(this.random.nextInt(6) + 1); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return 0; - } - // CraftBukkit end - - double d5 = this.owner.locX - this.locX; - double d6 = this.owner.locY - this.locY; - double d7 = this.owner.locZ - this.locZ; - double d8 = (double) MathHelper.sqrt(d5 * d5 + d6 * d6 + d7 * d7); - double d9 = 0.1D; - - entityitem.motX = d5 * d9; - entityitem.motY = d6 * d9 + (double) MathHelper.sqrt(d8) * 0.08D; - entityitem.motZ = d7 * d9; - this.world.addEntity(entityitem); - // CraftBukkit - this.random.nextInt(6) + 1 -> playerFishEvent.getExpToDrop() - this.owner.world.addEntity(new EntityExperienceOrb(this.owner.world, this.owner.locX, this.owner.locY + 0.5D, this.owner.locZ + 0.5D, playerFishEvent.getExpToDrop())); - b0 = 1; - } - - if (this.au) { - // CraftBukkit start - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.IN_GROUND); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return 0; - } - // CraftBukkit end - - b0 = 2; - } - - // CraftBukkit start - if (b0 == 0) { - PlayerFishEvent playerFishEvent = new PlayerFishEvent((Player) this.owner.getBukkitEntity(), null, (Fish) this.getBukkitEntity(), PlayerFishEvent.State.FAILED_ATTEMPT); - this.world.getServer().getPluginManager().callEvent(playerFishEvent); - if (playerFishEvent.isCancelled()) { - return 0; - } - } - // CraftBukkit end - - this.die(); - this.owner.hookedFish = null; - return b0; - } - } - - private ItemStack f() { - float f = this.world.random.nextFloat(); - int i = EnchantmentManager.getLuckEnchantmentLevel(this.owner); - int j = EnchantmentManager.getLureEnchantmentLevel(this.owner); - float f1 = 0.1F - (float) i * 0.025F - (float) j * 0.01F; - float f2 = 0.05F + (float) i * 0.01F - (float) j * 0.01F; - - f1 = MathHelper.a(f1, 0.0F, 1.0F); - f2 = MathHelper.a(f2, 0.0F, 1.0F); - if (f < f1) { - this.owner.a(StatisticList.A, 1); - return ((PossibleFishingResult) WeightedRandom.a(this.random, (Collection) d)).a(this.random); - } else { - f -= f1; - if (f < f2) { - this.owner.a(StatisticList.B, 1); - return ((PossibleFishingResult) WeightedRandom.a(this.random, (Collection) e)).a(this.random); - } else { - float f3 = f - f2; - - this.owner.a(StatisticList.z, 1); - return ((PossibleFishingResult) WeightedRandom.a(this.random, (Collection) EntityFishingHook.f)).a(this.random); // CraftBukkit - fix static reference to fish list - } - } - } - - public void die() { - super.die(); - if (this.owner != null) { - this.owner.hookedFish = null; - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityGhast.java b/src/main/java/net/minecraft/server/EntityGhast.java deleted file mode 100644 index d543fcae..00000000 --- a/src/main/java/net/minecraft/server/EntityGhast.java +++ /dev/null @@ -1,238 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.event.entity.EntityTargetEvent; -// CraftBukkit end - -public class EntityGhast extends EntityFlying implements IMonster { - - public int h; - public double i; - public double bm; - public double bn; - private Entity target; - private int br; - public int bo; - public int bp; - private int explosionPower = 1; - - public EntityGhast(World world) { - super(world); - this.a(4.0F, 4.0F); - this.fireProof = true; - this.b = 5; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if ("fireball".equals(damagesource.p()) && damagesource.getEntity() instanceof EntityHuman) { - super.damageEntity(damagesource, 1000.0F); - ((EntityHuman) damagesource.getEntity()).a((Statistic) AchievementList.z); - return true; - } else { - return super.damageEntity(damagesource, f); - } - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - } - - protected void bq() { - if (!this.world.isStatic && this.world.difficulty == EnumDifficulty.PEACEFUL) { - this.die(); - } - - this.w(); - this.bo = this.bp; - double d0 = this.i - this.locX; - double d1 = this.bm - this.locY; - double d2 = this.bn - this.locZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 < 1.0D || d3 > 3600.0D) { - this.i = this.locX + (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.bm = this.locY + (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 16.0F); - this.bn = this.locZ + (double) ((this.random.nextFloat() * 2.0F - 1.0F) * 16.0F); - } - - if (this.h-- <= 0) { - this.h += this.random.nextInt(5) + 2; - d3 = (double) MathHelper.sqrt(d3); - if (this.a(this.i, this.bm, this.bn, d3)) { - this.motX += d0 / d3 * 0.1D; - this.motY += d1 / d3 * 0.1D; - this.motZ += d2 / d3 * 0.1D; - } else { - this.i = this.locX; - this.bm = this.locY; - this.bn = this.locZ; - } - } - - if (this.target != null && this.target.dead) { - // CraftBukkit start - fire EntityTargetEvent - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.TARGET_DIED); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - // CraftBukkit end - } - - if (this.target == null || this.br-- <= 0) { - // CraftBukkit start - fire EntityTargetEvent - Entity target = this.world.findNearbyVulnerablePlayer(this, 100.0D); - if (target != null) { - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), target.getBukkitEntity(), EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((CraftEntity) event.getTarget()).getHandle(); - } - } - } - // CraftBukkit end - - if (this.target != null) { - this.br = 20; - } - } - - double d4 = 64.0D; - - if (this.target != null && this.target.f((Entity) this) < d4 * d4) { - double d5 = this.target.locX - this.locX; - double d6 = this.target.boundingBox.b + (double) (this.target.length / 2.0F) - (this.locY + (double) (this.length / 2.0F)); - double d7 = this.target.locZ - this.locZ; - - this.aM = this.yaw = -((float) Math.atan2(d5, d7)) * 180.0F / 3.1415927F; - if (this.hasLineOfSight(this.target)) { - if (this.bp == 10) { - this.world.a((EntityHuman) null, 1007, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - - ++this.bp; - if (this.bp == 20) { - this.world.a((EntityHuman) null, 1008, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - EntityLargeFireball entitylargefireball = new EntityLargeFireball(this.world, this, d5, d6, d7); - - // CraftBukkit - set bukkitYield when setting explosionpower - entitylargefireball.bukkitYield = entitylargefireball.yield = this.explosionPower; - double d8 = 4.0D; - Vec3D vec3d = this.j(1.0F); - - entitylargefireball.locX = this.locX + vec3d.a * d8; - entitylargefireball.locY = this.locY + (double) (this.length / 2.0F) + 0.5D; - entitylargefireball.locZ = this.locZ + vec3d.c * d8; - this.world.addEntity(entitylargefireball); - this.bp = -40; - } - } else if (this.bp > 0) { - --this.bp; - } - } else { - this.aM = this.yaw = -((float) Math.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F; - if (this.bp > 0) { - --this.bp; - } - } - - if (!this.world.isStatic) { - byte b0 = this.datawatcher.getByte(16); - byte b1 = (byte) (this.bp > 10 ? 1 : 0); - - if (b0 != b1) { - this.datawatcher.watch(16, Byte.valueOf(b1)); - } - } - } - - private boolean a(double d0, double d1, double d2, double d3) { - double d4 = (this.i - this.locX) / d3; - double d5 = (this.bm - this.locY) / d3; - double d6 = (this.bn - this.locZ) / d3; - AxisAlignedBB axisalignedbb = this.boundingBox.clone(); - - for (int i = 1; (double) i < d3; ++i) { - axisalignedbb.d(d4, d5, d6); - if (!this.world.getCubes(this, axisalignedbb).isEmpty()) { - return false; - } - } - - return true; - } - - protected String t() { - return "mob.ghast.moan"; - } - - protected String aT() { - return "mob.ghast.scream"; - } - - protected String aU() { - return "mob.ghast.death"; - } - - protected Item getLoot() { - return Items.SULPHUR; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(2) + this.random.nextInt(1 + i); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Items.GHAST_TEAR, 1); - } - - j = this.random.nextInt(3) + this.random.nextInt(1 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.SULPHUR, 1); - } - } - - protected float bf() { - return 10.0F; - } - - public boolean canSpawn() { - return this.random.nextInt(20) == 0 && super.canSpawn() && this.world.difficulty != EnumDifficulty.PEACEFUL; - } - - public int bB() { - return 1; - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("ExplosionPower", this.explosionPower); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { - this.explosionPower = nbttagcompound.getInt("ExplosionPower"); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityHanging.java b/src/main/java/net/minecraft/server/EntityHanging.java deleted file mode 100644 index eec465b4..00000000 --- a/src/main/java/net/minecraft/server/EntityHanging.java +++ /dev/null @@ -1,340 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.entity.Hanging; -import org.bukkit.entity.Painting; -import org.bukkit.event.hanging.HangingBreakEvent; -import org.bukkit.event.painting.PaintingBreakEvent; -// CraftBukkit end - -public abstract class EntityHanging extends Entity { - - private int e; - public int direction; - public int x; - public int y; - public int z; - - public EntityHanging(World world) { - super(world); - this.height = 0.0F; - this.a(0.5F, 0.5F); - } - - public EntityHanging(World world, int i, int j, int k, int l) { - this(world); - this.x = i; - this.y = j; - this.z = k; - } - - protected void c() {} - - public void setDirection(int i) { - this.direction = i; - this.lastYaw = this.yaw = (float) (i * 90); - float f = (float) this.f(); - float f1 = (float) this.i(); - float f2 = (float) this.f(); - - if (i != 2 && i != 0) { - f = 0.5F; - } else { - f2 = 0.5F; - this.yaw = this.lastYaw = (float) (Direction.f[i] * 90); - } - - f /= 32.0F; - f1 /= 32.0F; - f2 /= 32.0F; - float f3 = (float) this.x + 0.5F; - float f4 = (float) this.y + 0.5F; - float f5 = (float) this.z + 0.5F; - float f6 = 0.5625F; - - if (i == 2) { - f5 -= f6; - } - - if (i == 1) { - f3 -= f6; - } - - if (i == 0) { - f5 += f6; - } - - if (i == 3) { - f3 += f6; - } - - if (i == 2) { - f3 -= this.c(this.f()); - } - - if (i == 1) { - f5 += this.c(this.f()); - } - - if (i == 0) { - f3 += this.c(this.f()); - } - - if (i == 3) { - f5 -= this.c(this.f()); - } - - f4 += this.c(this.i()); - this.setPosition((double) f3, (double) f4, (double) f5); - float f7 = -0.03125F; - - this.boundingBox.b((double) (f3 - f - f7), (double) (f4 - f1 - f7), (double) (f5 - f2 - f7), (double) (f3 + f + f7), (double) (f4 + f1 + f7), (double) (f5 + f2 + f7)); - } - - private float c(int i) { - return i == 32 ? 0.5F : (i == 64 ? 0.5F : 0.0F); - } - - public void h() { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - if (this.e++ == 100 && !this.world.isStatic) { - this.e = 0; - if (!this.dead && !this.survives()) { - // CraftBukkit start - fire break events - Material material = this.world.getType((int) this.locX, (int) this.locY, (int) this.locZ).getMaterial(); - HangingBreakEvent.RemoveCause cause; - - if (!material.equals(Material.AIR)) { - // TODO: This feels insufficient to catch 100% of suffocation cases - cause = HangingBreakEvent.RemoveCause.OBSTRUCTION; - } else { - cause = HangingBreakEvent.RemoveCause.PHYSICS; - } - - HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), cause); - this.world.getServer().getPluginManager().callEvent(event); - - PaintingBreakEvent paintingEvent = null; - if (this instanceof EntityPainting) { - // Fire old painting event until it can be removed - paintingEvent = new PaintingBreakEvent((Painting) this.getBukkitEntity(), PaintingBreakEvent.RemoveCause.valueOf(cause.name())); - paintingEvent.setCancelled(event.isCancelled()); - this.world.getServer().getPluginManager().callEvent(paintingEvent); - } - - if (dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return; - } - // CraftBukkit end - - this.die(); - this.b((Entity) null); - } - } - } - - public boolean survives() { - if (!this.world.getCubes(this, this.boundingBox).isEmpty()) { - return false; - } else { - int i = Math.max(1, this.f() / 16); - int j = Math.max(1, this.i() / 16); - int k = this.x; - int l = this.y; - int i1 = this.z; - - if (this.direction == 2) { - k = MathHelper.floor(this.locX - (double) ((float) this.f() / 32.0F)); - } - - if (this.direction == 1) { - i1 = MathHelper.floor(this.locZ - (double) ((float) this.f() / 32.0F)); - } - - if (this.direction == 0) { - k = MathHelper.floor(this.locX - (double) ((float) this.f() / 32.0F)); - } - - if (this.direction == 3) { - i1 = MathHelper.floor(this.locZ - (double) ((float) this.f() / 32.0F)); - } - - l = MathHelper.floor(this.locY - (double) ((float) this.i() / 32.0F)); - - for (int j1 = 0; j1 < i; ++j1) { - for (int k1 = 0; k1 < j; ++k1) { - Material material; - - if (this.direction != 2 && this.direction != 0) { - material = this.world.getType(this.x, l + k1, i1 + j1).getMaterial(); - } else { - material = this.world.getType(k + j1, l + k1, this.z).getMaterial(); - } - - if (!material.isBuildable()) { - return false; - } - } - } - - List list = this.world.getEntities(this, this.boundingBox); - Iterator iterator = list.iterator(); - - Entity entity; - - do { - if (!iterator.hasNext()) { - return true; - } - - entity = (Entity) iterator.next(); - } while (!(entity instanceof EntityHanging)); - - return false; - } - } - - public boolean R() { - return true; - } - - public boolean j(Entity entity) { - return entity instanceof EntityHuman ? this.damageEntity(DamageSource.playerAttack((EntityHuman) entity), 0.0F) : false; - } - - public void i(int i) { - this.world.X(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - if (!this.dead && !this.world.isStatic) { - // CraftBukkit start - fire break events - HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.DEFAULT); - PaintingBreakEvent paintingEvent = null; - if (damagesource.getEntity() != null) { - event = new org.bukkit.event.hanging.HangingBreakByEntityEvent((Hanging) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); - - if (this instanceof EntityPainting) { - // Fire old painting event until it can be removed - paintingEvent = new org.bukkit.event.painting.PaintingBreakByEntityEvent((Painting) this.getBukkitEntity(), damagesource.getEntity() == null ? null : damagesource.getEntity().getBukkitEntity()); - } - } else if (damagesource.isExplosion()) { - event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.EXPLOSION); - } - - this.world.getServer().getPluginManager().callEvent(event); - - if (paintingEvent != null) { - paintingEvent.setCancelled(event.isCancelled()); - this.world.getServer().getPluginManager().callEvent(paintingEvent); - } - - if (this.dead || event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return true; - } - // CraftBukkit end - - this.die(); - this.Q(); - this.b(damagesource.getEntity()); - } - - return true; - } - } - - public void move(double d0, double d1, double d2) { - if (!this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { - if (this.dead) return; // CraftBukkit - - // CraftBukkit start - fire break events - // TODO - Does this need its own cause? Seems to only be triggered by pistons - HangingBreakEvent event = new HangingBreakEvent((Hanging) this.getBukkitEntity(), HangingBreakEvent.RemoveCause.PHYSICS); - this.world.getServer().getPluginManager().callEvent(event); - - if (this.dead || event.isCancelled()) { - return; - } - // CraftBukkit end - - this.die(); - this.b((Entity) null); - } - } - - public void g(double d0, double d1, double d2) { - if (false && !this.world.isStatic && !this.dead && d0 * d0 + d1 * d1 + d2 * d2 > 0.0D) { // CraftBukkit - not needed - this.die(); - this.b((Entity) null); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("Direction", (byte) this.direction); - nbttagcompound.setInt("TileX", this.x); - nbttagcompound.setInt("TileY", this.y); - nbttagcompound.setInt("TileZ", this.z); - switch (this.direction) { - case 0: - nbttagcompound.setByte("Dir", (byte) 2); - break; - - case 1: - nbttagcompound.setByte("Dir", (byte) 1); - break; - - case 2: - nbttagcompound.setByte("Dir", (byte) 0); - break; - - case 3: - nbttagcompound.setByte("Dir", (byte) 3); - } - } - - public void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("Direction", 99)) { - this.direction = nbttagcompound.getByte("Direction"); - } else { - switch (nbttagcompound.getByte("Dir")) { - case 0: - this.direction = 2; - break; - - case 1: - this.direction = 1; - break; - - case 2: - this.direction = 0; - break; - - case 3: - this.direction = 3; - } - } - - this.x = nbttagcompound.getInt("TileX"); - this.y = nbttagcompound.getInt("TileY"); - this.z = nbttagcompound.getInt("TileZ"); - this.setDirection(this.direction); - } - - public abstract int f(); - - public abstract int i(); - - public abstract void b(Entity entity); - - protected boolean V() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityHorse.java b/src/main/java/net/minecraft/server/EntityHorse.java deleted file mode 100644 index d167c001..00000000 --- a/src/main/java/net/minecraft/server/EntityHorse.java +++ /dev/null @@ -1,1226 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; // CraftBukkit - -public class EntityHorse extends EntityAnimal implements IInventoryListener { - - private static final IEntitySelector bu = new EntitySelectorHorse(); - public static final IAttribute attributeJumpStrength = (new AttributeRanged("horse.jumpStrength", 0.7D, 0.0D, 2.0D)).a("Jump Strength").a(true); // CraftBukkit - private -> public - private static final String[] bw = new String[] { null, "textures/entity/horse/armor/horse_armor_iron.png", "textures/entity/horse/armor/horse_armor_gold.png", "textures/entity/horse/armor/horse_armor_diamond.png"}; - private static final String[] bx = new String[] { "", "meo", "goo", "dio"}; - private static final int[] by = new int[] { 0, 5, 7, 11}; - private static final String[] bz = new String[] { "textures/entity/horse/horse_white.png", "textures/entity/horse/horse_creamy.png", "textures/entity/horse/horse_chestnut.png", "textures/entity/horse/horse_brown.png", "textures/entity/horse/horse_black.png", "textures/entity/horse/horse_gray.png", "textures/entity/horse/horse_darkbrown.png"}; - private static final String[] bA = new String[] { "hwh", "hcr", "hch", "hbr", "hbl", "hgr", "hdb"}; - private static final String[] bB = new String[] { null, "textures/entity/horse/horse_markings_white.png", "textures/entity/horse/horse_markings_whitefield.png", "textures/entity/horse/horse_markings_whitedots.png", "textures/entity/horse/horse_markings_blackdots.png"}; - private static final String[] bC = new String[] { "", "wo_", "wmo", "wdo", "bdo"}; - private int bD; - private int bE; - private int bF; - public int bp; - public int bq; - protected boolean br; - public InventoryHorseChest inventoryChest; // CraftBukkit - private -> public - private boolean bH; - protected int bs; - protected float bt; - private boolean bI; - private float bJ; - private float bK; - private float bL; - private float bM; - private float bN; - private float bO; - private int bP; - private String bQ; - private String[] bR = new String[3]; - public int maxDomestication = 100; // CraftBukkit - store max domestication value - - public EntityHorse(World world) { - super(world); - this.a(1.4F, 1.6F); - this.fireProof = false; - this.setHasChest(false); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.2D)); - this.goalSelector.a(1, new PathfinderGoalTame(this, 1.2D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 0.7D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.loadChest(); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Integer.valueOf(0)); - this.datawatcher.a(19, Byte.valueOf((byte) 0)); - this.datawatcher.a(20, Integer.valueOf(0)); - this.datawatcher.a(21, String.valueOf("")); - this.datawatcher.a(22, Integer.valueOf(0)); - } - - public void setType(int i) { - this.datawatcher.watch(19, Byte.valueOf((byte) i)); - this.cP(); - } - - public int getType() { - return this.datawatcher.getByte(19); - } - - public void setVariant(int i) { - this.datawatcher.watch(20, Integer.valueOf(i)); - this.cP(); - } - - public int getVariant() { - return this.datawatcher.getInt(20); - } - - public String getName() { - if (this.hasCustomName()) { - return this.getCustomName(); - } else { - int i = this.getType(); - - switch (i) { - case 0: - default: - return LocaleI18n.get("entity.horse.name"); - - case 1: - return LocaleI18n.get("entity.donkey.name"); - - case 2: - return LocaleI18n.get("entity.mule.name"); - - case 3: - return LocaleI18n.get("entity.zombiehorse.name"); - - case 4: - return LocaleI18n.get("entity.skeletonhorse.name"); - } - } - } - - private boolean x(int i) { - return (this.datawatcher.getInt(16) & i) != 0; - } - - private void b(int i, boolean flag) { - int j = this.datawatcher.getInt(16); - - if (flag) { - this.datawatcher.watch(16, Integer.valueOf(j | i)); - } else { - this.datawatcher.watch(16, Integer.valueOf(j & ~i)); - } - } - - public boolean cb() { - return !this.isBaby(); - } - - public boolean isTame() { - return this.x(2); - } - - public boolean cg() { - return this.cb(); - } - - public String getOwnerUUID() { - return this.datawatcher.getString(21); - } - - public void setOwnerUUID(String s) { - this.datawatcher.watch(21, s); - } - - public float ci() { - int i = this.getAge(); - - return i >= 0 ? 1.0F : 0.5F + (float) (-24000 - i) / -24000.0F * 0.5F; - } - - public void a(boolean flag) { - if (flag) { - this.a(this.ci()); - } else { - this.a(1.0F); - } - } - - public boolean cj() { - return this.br; - } - - public void setTame(boolean flag) { - this.b(2, flag); - } - - public void j(boolean flag) { - this.br = flag; - } - - public boolean bM() { - return !this.cE() && super.bM(); - } - - protected void o(float f) { - if (f > 6.0F && this.cm()) { - this.o(false); - } - } - - public boolean hasChest() { - return this.x(8); - } - - public int cl() { - return this.datawatcher.getInt(22); - } - - private int e(ItemStack itemstack) { - if (itemstack == null) { - return 0; - } else { - Item item = itemstack.getItem(); - - return item == Items.HORSE_ARMOR_IRON ? 1 : (item == Items.HORSE_ARMOR_GOLD ? 2 : (item == Items.HORSE_ARMOR_DIAMOND ? 3 : 0)); - } - } - - public boolean cm() { - return this.x(32); - } - - public boolean cn() { - return this.x(64); - } - - public boolean co() { - return this.x(16); - } - - public boolean cp() { - return this.bH; - } - - public void d(ItemStack itemstack) { - this.datawatcher.watch(22, Integer.valueOf(this.e(itemstack))); - this.cP(); - } - - public void k(boolean flag) { - this.b(16, flag); - } - - public void setHasChest(boolean flag) { - this.b(8, flag); - } - - public void m(boolean flag) { - this.bH = flag; - } - - public void n(boolean flag) { - this.b(4, flag); - } - - public int getTemper() { - return this.bs; - } - - public void setTemper(int i) { - this.bs = i; - } - - public int v(int i) { - int j = MathHelper.a(this.getTemper() + i, 0, this.getMaxDomestication()); - - this.setTemper(j); - return j; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - Entity entity = damagesource.getEntity(); - - return this.passenger != null && this.passenger.equals(entity) ? false : super.damageEntity(damagesource, f); - } - - public int aV() { - return by[this.cl()]; - } - - public boolean S() { - return this.passenger == null; - } - - public boolean cr() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locZ); - - this.world.getBiome(i, j); - return true; - } - - public void cs() { - if (!this.world.isStatic && this.hasChest()) { - this.a(Item.getItemOf(Blocks.CHEST), 1); - this.setHasChest(false); - } - } - - private void cL() { - this.cS(); - this.world.makeSound(this, "eating", 1.0F, 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - } - - protected void b(float f) { - if (f > 1.0F) { - this.makeSound("mob.horse.land", 0.4F, 1.0F); - } - - int i = MathHelper.f(f * 0.5F - 3.0F); - - if (i > 0) { - this.damageEntity(DamageSource.FALL, (float) i); - if (this.passenger != null) { - this.passenger.damageEntity(DamageSource.FALL, (float) i); - } - - Block block = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY - 0.2D - (double) this.lastYaw), MathHelper.floor(this.locZ)); - - if (block.getMaterial() != Material.AIR) { - StepSound stepsound = block.stepSound; - - this.world.makeSound(this, stepsound.getStepSound(), stepsound.getVolume1() * 0.5F, stepsound.getVolume2() * 0.75F); - } - } - } - - private int cM() { - int i = this.getType(); - - return this.hasChest() /* && (i == 1 || i == 2) */ ? 17 : 2; // CraftBukkit - Remove type check - } - - public void loadChest() { // CraftBukkit - private -> public - InventoryHorseChest inventoryhorsechest = this.inventoryChest; - - this.inventoryChest = new InventoryHorseChest("HorseChest", this.cM(), this); // CraftBukkit - add this horse - this.inventoryChest.a(this.getName()); - if (inventoryhorsechest != null) { - inventoryhorsechest.b(this); - int i = Math.min(inventoryhorsechest.getSize(), this.inventoryChest.getSize()); - - for (int j = 0; j < i; ++j) { - ItemStack itemstack = inventoryhorsechest.getItem(j); - - if (itemstack != null) { - this.inventoryChest.setItem(j, itemstack.cloneItemStack()); - } - } - - inventoryhorsechest = null; - } - - this.inventoryChest.a(this); - this.cO(); - } - - private void cO() { - if (!this.world.isStatic) { - this.n(this.inventoryChest.getItem(0) != null); - if (this.cB()) { - this.d(this.inventoryChest.getItem(1)); - } - } - } - - public void a(InventorySubcontainer inventorysubcontainer) { - int i = this.cl(); - boolean flag = this.cu(); - - this.cO(); - if (this.ticksLived > 20) { - if (i == 0 && i != this.cl()) { - this.makeSound("mob.horse.armor", 0.5F, 1.0F); - } else if (i != this.cl()) { - this.makeSound("mob.horse.armor", 0.5F, 1.0F); - } - - if (!flag && this.cu()) { - this.makeSound("mob.horse.leather", 0.5F, 1.0F); - } - } - } - - public boolean canSpawn() { - this.cr(); - return super.canSpawn(); - } - - protected EntityHorse a(Entity entity, double d0) { - double d1 = Double.MAX_VALUE; - Entity entity1 = null; - List list = this.world.getEntities(entity, entity.boundingBox.a(d0, d0, d0), bu); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - Entity entity2 = (Entity) iterator.next(); - double d2 = entity2.e(entity.locX, entity.locY, entity.locZ); - - if (d2 < d1) { - entity1 = entity2; - d1 = d2; - } - } - - return (EntityHorse) entity1; - } - - public double getJumpStrength() { - return this.getAttributeInstance(attributeJumpStrength).getValue(); - } - - protected String aU() { - this.cS(); - int i = this.getType(); - - return i == 3 ? "mob.horse.zombie.death" : (i == 4 ? "mob.horse.skeleton.death" : (i != 1 && i != 2 ? "mob.horse.death" : "mob.horse.donkey.death")); - } - - protected Item getLoot() { - boolean flag = this.random.nextInt(4) == 0; - int i = this.getType(); - - return i == 4 ? Items.BONE : (i == 3 ? (flag ? Item.getById(0) : Items.ROTTEN_FLESH) : Items.LEATHER); - } - - protected String aT() { - this.cS(); - if (this.random.nextInt(3) == 0) { - this.cU(); - } - - int i = this.getType(); - - return i == 3 ? "mob.horse.zombie.hit" : (i == 4 ? "mob.horse.skeleton.hit" : (i != 1 && i != 2 ? "mob.horse.hit" : "mob.horse.donkey.hit")); - } - - public boolean cu() { - return this.x(4); - } - - protected String t() { - this.cS(); - if (this.random.nextInt(10) == 0 && !this.bh()) { - this.cU(); - } - - int i = this.getType(); - - return i == 3 ? "mob.horse.zombie.idle" : (i == 4 ? "mob.horse.skeleton.idle" : (i != 1 && i != 2 ? "mob.horse.idle" : "mob.horse.donkey.idle")); - } - - protected String cv() { - this.cS(); - this.cU(); - int i = this.getType(); - - return i != 3 && i != 4 ? (i != 1 && i != 2 ? "mob.horse.angry" : "mob.horse.donkey.angry") : null; - } - - protected void a(int i, int j, int k, Block block) { - StepSound stepsound = block.stepSound; - - if (this.world.getType(i, j + 1, k) == Blocks.SNOW) { - stepsound = Blocks.SNOW.stepSound; - } - - if (!block.getMaterial().isLiquid()) { - int l = this.getType(); - - if (this.passenger != null && l != 1 && l != 2) { - ++this.bP; - if (this.bP > 5 && this.bP % 3 == 0) { - this.makeSound("mob.horse.gallop", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - if (l == 0 && this.random.nextInt(10) == 0) { - this.makeSound("mob.horse.breathe", stepsound.getVolume1() * 0.6F, stepsound.getVolume2()); - } - } else if (this.bP <= 5) { - this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } - } else if (stepsound == Block.f) { - this.makeSound("mob.horse.wood", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } else { - this.makeSound("mob.horse.soft", stepsound.getVolume1() * 0.15F, stepsound.getVolume2()); - } - } - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(attributeJumpStrength); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(53.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.22499999403953552D); - } - - public int bB() { - return 6; - } - - public int getMaxDomestication() { - return this.maxDomestication; // CraftBukkit - return stored max domestication instead of 100 - } - - protected float bf() { - return 0.8F; - } - - public int q() { - return 400; - } - - private void cP() { - this.bQ = null; - } - - public void g(EntityHuman entityhuman) { - if (!this.world.isStatic && (this.passenger == null || this.passenger == entityhuman) && this.isTame()) { - this.inventoryChest.a(this.getName()); - entityhuman.openHorseInventory(this, this.inventoryChest); - } - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.MONSTER_EGG) { - return super.a(entityhuman); - } else if (!this.isTame() && this.cE()) { - return false; - } else if (this.isTame() && this.cb() && entityhuman.isSneaking()) { - this.g(entityhuman); - return true; - } else if (this.cg() && this.passenger != null) { - return super.a(entityhuman); - } else { - if (itemstack != null) { - boolean flag = false; - - if (this.cB()) { - byte b0 = -1; - - if (itemstack.getItem() == Items.HORSE_ARMOR_IRON) { - b0 = 1; - } else if (itemstack.getItem() == Items.HORSE_ARMOR_GOLD) { - b0 = 2; - } else if (itemstack.getItem() == Items.HORSE_ARMOR_DIAMOND) { - b0 = 3; - } - - if (b0 >= 0) { - if (!this.isTame()) { - this.cJ(); - return true; - } - - this.g(entityhuman); - return true; - } - } - - if (!flag && !this.cE()) { - float f = 0.0F; - short short1 = 0; - byte b1 = 0; - - if (itemstack.getItem() == Items.WHEAT) { - f = 2.0F; - short1 = 60; - b1 = 3; - } else if (itemstack.getItem() == Items.SUGAR) { - f = 1.0F; - short1 = 30; - b1 = 3; - } else if (itemstack.getItem() == Items.BREAD) { - f = 7.0F; - short1 = 180; - b1 = 3; - } else if (Block.a(itemstack.getItem()) == Blocks.HAY_BLOCK) { - f = 20.0F; - short1 = 180; - } else if (itemstack.getItem() == Items.APPLE) { - f = 3.0F; - short1 = 60; - b1 = 3; - } else if (itemstack.getItem() == Items.CARROT_GOLDEN) { - f = 4.0F; - short1 = 60; - b1 = 5; - if (this.isTame() && this.getAge() == 0) { - flag = true; - this.f(entityhuman); - } - } else if (itemstack.getItem() == Items.GOLDEN_APPLE) { - f = 10.0F; - short1 = 240; - b1 = 10; - if (this.isTame() && this.getAge() == 0) { - flag = true; - this.f(entityhuman); - } - } - - if (this.getHealth() < this.getMaxHealth() && f > 0.0F) { - this.heal(f, RegainReason.EATING); // CraftBukkit - flag = true; - } - - if (!this.cb() && short1 > 0) { - this.a(short1); - flag = true; - } - - if (b1 > 0 && (flag || !this.isTame()) && b1 < this.getMaxDomestication()) { - flag = true; - this.v(b1); - } - - if (flag) { - this.cL(); - } - } - - if (!this.isTame() && !flag) { - if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) { - return true; - } - - this.cJ(); - return true; - } - - if (!flag && this.cC() && !this.hasChest() && itemstack.getItem() == Item.getItemOf(Blocks.CHEST)) { - this.setHasChest(true); - this.makeSound("mob.chickenplop", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - flag = true; - this.loadChest(); - } - - if (!flag && this.cg() && !this.cu() && itemstack.getItem() == Items.SADDLE) { - this.g(entityhuman); - return true; - } - - if (flag) { - if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count == 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - return true; - } - } - - if (this.cg() && this.passenger == null) { - if (itemstack != null && itemstack.a(entityhuman, (EntityLiving) this)) { - return true; - } else { - this.i(entityhuman); - return true; - } - } else { - return super.a(entityhuman); - } - } - } - - private void i(EntityHuman entityhuman) { - entityhuman.yaw = this.yaw; - entityhuman.pitch = this.pitch; - this.o(false); - this.p(false); - if (!this.world.isStatic) { - entityhuman.mount(this); - } - } - - public boolean cB() { - return this.getType() == 0; - } - - public boolean cC() { - int i = this.getType(); - - return i == 2 || i == 1; - } - - protected boolean bh() { - return this.passenger != null && this.cu() ? true : this.cm() || this.cn(); - } - - public boolean cE() { - int i = this.getType(); - - return i == 3 || i == 4; - } - - public boolean cF() { - return this.cE() || this.getType() == 2; - } - - public boolean c(ItemStack itemstack) { - return false; - } - - private void cR() { - this.bp = 1; - } - - public void die(DamageSource damagesource) { - super.die(damagesource); - /* CraftBukkit start - Handle chest dropping in dropDeathLoot below - if (!this.world.isStatic) { - this.dropChest(); - } - // CraftBukkit end */ - } - - // CraftBukkit start - Add method - protected void dropDeathLoot(boolean flag, int i) { - super.dropDeathLoot(flag, i); - - // Moved from die method above - if (!this.world.isStatic) { - this.dropChest(); - } - } - // CraftBukkit end - - public void e() { - if (this.random.nextInt(200) == 0) { - this.cR(); - } - - super.e(); - if (!this.world.isStatic) { - if (this.random.nextInt(900) == 0 && this.deathTicks == 0) { - this.heal(1.0F, RegainReason.REGEN); // CraftBukkit - } - - if (!this.cm() && this.passenger == null && this.random.nextInt(300) == 0 && this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY) - 1, MathHelper.floor(this.locZ)) == Blocks.GRASS) { - this.o(true); - } - - if (this.cm() && ++this.bD > 50) { - this.bD = 0; - this.o(false); - } - - if (this.co() && !this.cb() && !this.cm()) { - EntityHorse entityhorse = this.a(this, 16.0D); - - if (entityhorse != null && this.f(entityhorse) > 4.0D) { - PathEntity pathentity = this.world.findPath(this, entityhorse, 16.0F, true, false, false, true); - - this.setPathEntity(pathentity); - } - } - } - } - - public void h() { - super.h(); - if (this.world.isStatic && this.datawatcher.a()) { - this.datawatcher.e(); - this.cP(); - } - - if (this.bE > 0 && ++this.bE > 30) { - this.bE = 0; - this.b(128, false); - } - - if (!this.world.isStatic && this.bF > 0 && ++this.bF > 20) { - this.bF = 0; - this.p(false); - } - - if (this.bp > 0 && ++this.bp > 8) { - this.bp = 0; - } - - if (this.bq > 0) { - ++this.bq; - if (this.bq > 300) { - this.bq = 0; - } - } - - this.bK = this.bJ; - if (this.cm()) { - this.bJ += (1.0F - this.bJ) * 0.4F + 0.05F; - if (this.bJ > 1.0F) { - this.bJ = 1.0F; - } - } else { - this.bJ += (0.0F - this.bJ) * 0.4F - 0.05F; - if (this.bJ < 0.0F) { - this.bJ = 0.0F; - } - } - - this.bM = this.bL; - if (this.cn()) { - this.bK = this.bJ = 0.0F; - this.bL += (1.0F - this.bL) * 0.4F + 0.05F; - if (this.bL > 1.0F) { - this.bL = 1.0F; - } - } else { - this.bI = false; - this.bL += (0.8F * this.bL * this.bL * this.bL - this.bL) * 0.6F - 0.05F; - if (this.bL < 0.0F) { - this.bL = 0.0F; - } - } - - this.bO = this.bN; - if (this.x(128)) { - this.bN += (1.0F - this.bN) * 0.7F + 0.05F; - if (this.bN > 1.0F) { - this.bN = 1.0F; - } - } else { - this.bN += (0.0F - this.bN) * 0.7F - 0.05F; - if (this.bN < 0.0F) { - this.bN = 0.0F; - } - } - } - - private void cS() { - if (!this.world.isStatic) { - this.bE = 1; - this.b(128, true); - } - } - - private boolean cT() { - return this.passenger == null && this.vehicle == null && this.isTame() && this.cb() && !this.cF() && this.getHealth() >= this.getMaxHealth(); - } - - public void e(boolean flag) { - this.b(32, flag); - } - - public void o(boolean flag) { - this.e(flag); - } - - public void p(boolean flag) { - if (flag) { - this.o(false); - } - - this.b(64, flag); - } - - private void cU() { - if (!this.world.isStatic) { - this.bF = 1; - this.p(true); - } - } - - public void cJ() { - this.cU(); - String s = this.cv(); - - if (s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - } - - public void dropChest() { - this.a(this, this.inventoryChest); - this.cs(); - } - - private void a(Entity entity, InventoryHorseChest inventoryhorsechest) { - if (inventoryhorsechest != null && !this.world.isStatic) { - for (int i = 0; i < inventoryhorsechest.getSize(); ++i) { - ItemStack itemstack = inventoryhorsechest.getItem(i); - - if (itemstack != null) { - this.a(itemstack, 0.0F); - } - } - } - } - - public boolean h(EntityHuman entityhuman) { - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.setTame(true); - return true; - } - - public void e(float f, float f1) { - if (this.passenger != null && this.passenger instanceof EntityLiving && this.cu()) { - this.lastYaw = this.yaw = this.passenger.yaw; - this.pitch = this.passenger.pitch * 0.5F; - this.b(this.yaw, this.pitch); - this.aO = this.aM = this.yaw; - f = ((EntityLiving) this.passenger).bd * 0.5F; - f1 = ((EntityLiving) this.passenger).be; - if (f1 <= 0.0F) { - f1 *= 0.25F; - this.bP = 0; - } - - if (this.onGround && this.bt == 0.0F && this.cn() && !this.bI) { - f = 0.0F; - f1 = 0.0F; - } - - if (this.bt > 0.0F && !this.cj() && this.onGround) { - this.motY = this.getJumpStrength() * (double) this.bt; - if (this.hasEffect(MobEffectList.JUMP)) { - this.motY += (double) ((float) (this.getEffect(MobEffectList.JUMP).getAmplifier() + 1) * 0.1F); - } - - this.j(true); - this.al = true; - if (f1 > 0.0F) { - float f2 = MathHelper.sin(this.yaw * 3.1415927F / 180.0F); - float f3 = MathHelper.cos(this.yaw * 3.1415927F / 180.0F); - - this.motX += (double) (-0.4F * f2 * this.bt); - this.motZ += (double) (0.4F * f3 * this.bt); - this.makeSound("mob.horse.jump", 0.4F, 1.0F); - } - - this.bt = 0.0F; - } - - this.W = 1.0F; - this.aQ = this.bl() * 0.1F; - if (!this.world.isStatic) { - this.i((float) this.getAttributeInstance(GenericAttributes.d).getValue()); - super.e(f, f1); - } - - if (this.onGround) { - this.bt = 0.0F; - this.j(false); - } - - this.aE = this.aF; - double d0 = this.locX - this.lastX; - double d1 = this.locZ - this.lastZ; - float f4 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; - - if (f4 > 1.0F) { - f4 = 1.0F; - } - - this.aF += (f4 - this.aF) * 0.4F; - this.aG += this.aF; - } else { - this.W = 0.5F; - this.aQ = 0.02F; - super.e(f, f1); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("EatingHaystack", this.cm()); - nbttagcompound.setBoolean("ChestedHorse", this.hasChest()); - nbttagcompound.setBoolean("HasReproduced", this.cp()); - nbttagcompound.setBoolean("Bred", this.co()); - nbttagcompound.setInt("Type", this.getType()); - nbttagcompound.setInt("Variant", this.getVariant()); - nbttagcompound.setInt("Temper", this.getTemper()); - nbttagcompound.setBoolean("Tame", this.isTame()); - nbttagcompound.setString("OwnerUUID", this.getOwnerUUID()); - nbttagcompound.setInt("Bukkit.MaxDomestication", this.maxDomestication); // CraftBukkit - if (this.hasChest()) { - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 2; i < this.inventoryChest.getSize(); ++i) { - ItemStack itemstack = this.inventoryChest.getItem(i); - - if (itemstack != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - itemstack.save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - } - - if (this.inventoryChest.getItem(1) != null) { - nbttagcompound.set("ArmorItem", this.inventoryChest.getItem(1).save(new NBTTagCompound())); - } - - if (this.inventoryChest.getItem(0) != null) { - nbttagcompound.set("SaddleItem", this.inventoryChest.getItem(0).save(new NBTTagCompound())); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.o(nbttagcompound.getBoolean("EatingHaystack")); - this.k(nbttagcompound.getBoolean("Bred")); - this.setHasChest(nbttagcompound.getBoolean("ChestedHorse")); - this.m(nbttagcompound.getBoolean("HasReproduced")); - this.setType(nbttagcompound.getInt("Type")); - this.setVariant(nbttagcompound.getInt("Variant")); - this.setTemper(nbttagcompound.getInt("Temper")); - this.setTame(nbttagcompound.getBoolean("Tame")); - if (nbttagcompound.hasKeyOfType("OwnerUUID", 8)) { - this.setOwnerUUID(nbttagcompound.getString("OwnerUUID")); - } - // CraftBukkit start - if (nbttagcompound.hasKey("Bukkit.MaxDomestication")) { - this.maxDomestication = nbttagcompound.getInt("Bukkit.MaxDomestication"); - } - // CraftBukkit end - AttributeInstance attributeinstance = this.getAttributeMap().a("Speed"); - - if (attributeinstance != null) { - this.getAttributeInstance(GenericAttributes.d).setValue(attributeinstance.b() * 0.25D); - } - - if (this.hasChest()) { - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.loadChest(); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 2 && j < this.inventoryChest.getSize()) { - this.inventoryChest.setItem(j, ItemStack.createStack(nbttagcompound1)); - } - } - } - - ItemStack itemstack; - - if (nbttagcompound.hasKeyOfType("ArmorItem", 10)) { - itemstack = ItemStack.createStack(nbttagcompound.getCompound("ArmorItem")); - if (itemstack != null && a(itemstack.getItem())) { - this.inventoryChest.setItem(1, itemstack); - } - } - - if (nbttagcompound.hasKeyOfType("SaddleItem", 10)) { - itemstack = ItemStack.createStack(nbttagcompound.getCompound("SaddleItem")); - if (itemstack != null && itemstack.getItem() == Items.SADDLE) { - this.inventoryChest.setItem(0, itemstack); - } - } else if (nbttagcompound.getBoolean("Saddle")) { - this.inventoryChest.setItem(0, new ItemStack(Items.SADDLE)); - } - - this.cO(); - } - - public boolean mate(EntityAnimal entityanimal) { - if (entityanimal == this) { - return false; - } else if (entityanimal.getClass() != this.getClass()) { - return false; - } else { - EntityHorse entityhorse = (EntityHorse) entityanimal; - - if (this.cT() && entityhorse.cT()) { - int i = this.getType(); - int j = entityhorse.getType(); - - return i == j || i == 0 && j == 1 || i == 1 && j == 0; - } else { - return false; - } - } - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - EntityHorse entityhorse = (EntityHorse) entityageable; - EntityHorse entityhorse1 = new EntityHorse(this.world); - int i = this.getType(); - int j = entityhorse.getType(); - int k = 0; - - if (i == j) { - k = i; - } else if (i == 0 && j == 1 || i == 1 && j == 0) { - k = 2; - } - - if (k == 0) { - int l = this.random.nextInt(9); - int i1; - - if (l < 4) { - i1 = this.getVariant() & 255; - } else if (l < 8) { - i1 = entityhorse.getVariant() & 255; - } else { - i1 = this.random.nextInt(7); - } - - int j1 = this.random.nextInt(5); - - if (j1 < 2) { - i1 |= this.getVariant() & '\uff00'; - } else if (j1 < 4) { - i1 |= entityhorse.getVariant() & '\uff00'; - } else { - i1 |= this.random.nextInt(5) << 8 & '\uff00'; - } - - entityhorse1.setVariant(i1); - } - - entityhorse1.setType(k); - double d0 = this.getAttributeInstance(GenericAttributes.maxHealth).b() + entityageable.getAttributeInstance(GenericAttributes.maxHealth).b() + (double) this.cV(); - - entityhorse1.getAttributeInstance(GenericAttributes.maxHealth).setValue(d0 / 3.0D); - double d1 = this.getAttributeInstance(attributeJumpStrength).b() + entityageable.getAttributeInstance(attributeJumpStrength).b() + this.cW(); - - entityhorse1.getAttributeInstance(attributeJumpStrength).setValue(d1 / 3.0D); - double d2 = this.getAttributeInstance(GenericAttributes.d).b() + entityageable.getAttributeInstance(GenericAttributes.d).b() + this.cX(); - - entityhorse1.getAttributeInstance(GenericAttributes.d).setValue(d2 / 3.0D); - return entityhorse1; - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - Object object = super.prepare(groupdataentity); - boolean flag = false; - int i = 0; - int j; - - if (object instanceof GroupDataHorse) { - j = ((GroupDataHorse) object).a; - i = ((GroupDataHorse) object).b & 255 | this.random.nextInt(5) << 8; - } else { - if (this.random.nextInt(10) == 0) { - j = 1; - } else { - int k = this.random.nextInt(7); - int l = this.random.nextInt(5); - - j = 0; - i = k | l << 8; - } - - object = new GroupDataHorse(j, i); - } - - this.setType(j); - this.setVariant(i); - if (this.random.nextInt(5) == 0) { - this.setAge(-24000); - } - - if (j != 4 && j != 3) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) this.cV()); - if (j == 0) { - this.getAttributeInstance(GenericAttributes.d).setValue(this.cX()); - } else { - this.getAttributeInstance(GenericAttributes.d).setValue(0.17499999701976776D); - } - } else { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(15.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); - } - - if (j != 2 && j != 1) { - this.getAttributeInstance(attributeJumpStrength).setValue(this.cW()); - } else { - this.getAttributeInstance(attributeJumpStrength).setValue(0.5D); - } - - this.setHealth(this.getMaxHealth()); - return (GroupDataEntity) object; - } - - protected boolean bk() { - return true; - } - - public void w(int i) { - if (this.cu()) { - // CraftBukkit start - fire HorseJumpEvent, use event power - if (i < 0) { - i = 0; - } - - float power; - if (i >= 90) { - power = 1.0F; - } else { - power = 0.4F + 0.4F * (float) i / 90.0F; - } - - org.bukkit.event.entity.HorseJumpEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callHorseJumpEvent(this, power); - if (!event.isCancelled()) { - this.bI = true; - this.cU(); - this.bt = event.getPower(); - } - // CraftBukkit end - } - } - - public void ac() { - super.ac(); - if (this.bM > 0.0F) { - float f = MathHelper.sin(this.aM * 3.1415927F / 180.0F); - float f1 = MathHelper.cos(this.aM * 3.1415927F / 180.0F); - float f2 = 0.7F * this.bM; - float f3 = 0.15F * this.bM; - - this.passenger.setPosition(this.locX + (double) (f2 * f), this.locY + this.ad() + this.passenger.ad() + (double) f3, this.locZ - (double) (f2 * f1)); - if (this.passenger instanceof EntityLiving) { - ((EntityLiving) this.passenger).aM = this.aM; - } - } - } - - private float cV() { - return 15.0F + (float) this.random.nextInt(8) + (float) this.random.nextInt(9); - } - - private double cW() { - return 0.4000000059604645D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D + this.random.nextDouble() * 0.2D; - } - - private double cX() { - return (0.44999998807907104D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D + this.random.nextDouble() * 0.3D) * 0.25D; - } - - public static boolean a(Item item) { - return item == Items.HORSE_ARMOR_IRON || item == Items.HORSE_ARMOR_GOLD || item == Items.HORSE_ARMOR_DIAMOND; - } - - public boolean h_() { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntityHuman.java b/src/main/java/net/minecraft/server/EntityHuman.java deleted file mode 100644 index 331dbac1..00000000 --- a/src/main/java/net/minecraft/server/EntityHuman.java +++ /dev/null @@ -1,1599 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.entity.CraftItem; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.player.PlayerBedEnterEvent; -import org.bukkit.event.player.PlayerBedLeaveEvent; -import org.bukkit.event.player.PlayerDropItemEvent; -import org.bukkit.event.player.PlayerItemConsumeEvent; -// CraftBukkit end - -public abstract class EntityHuman extends EntityLiving implements ICommandListener { - - public PlayerInventory inventory = new PlayerInventory(this); - private InventoryEnderChest enderChest = new InventoryEnderChest(); - public Container defaultContainer; - public Container activeContainer; - protected FoodMetaData foodData = new FoodMetaData(this); // CraftBukkit - add "this" to constructor - protected int bq; - public float br; - public float bs; - public int bt; - public double bu; - public double bv; - public double bw; - public double bx; - public double by; - public double bz; - // CraftBukkit start - public boolean sleeping; // protected -> public - public boolean fauxSleeping; - public String spawnWorld = ""; - - @Override - public CraftHumanEntity getBukkitEntity() { - return (CraftHumanEntity) super.getBukkitEntity(); - } - // CraftBukkit end - - public ChunkCoordinates bB; - public int sleepTicks; // CraftBukkit - private -> public - public float bC; - public float bD; - private ChunkCoordinates c; - private boolean d; - private ChunkCoordinates e; - public PlayerAbilities abilities = new PlayerAbilities(); - public int oldLevel = -1; // CraftBukkit - add field - public int expLevel; - public int expTotal; - public float exp; - private ItemStack f; - private int g; - protected float bI = 0.1F; - protected float bJ = 0.02F; - private int h; - private final GameProfile i; - public EntityFishingHook hookedFish; - - public EntityHuman(World world, GameProfile gameprofile) { - super(world); - this.uniqueID = a(gameprofile); - this.i = gameprofile; - this.defaultContainer = new ContainerPlayer(this.inventory, !world.isStatic, this); - this.activeContainer = this.defaultContainer; - this.height = 1.62F; - ChunkCoordinates chunkcoordinates = world.getSpawn(); - - this.setPositionRotation((double) chunkcoordinates.x + 0.5D, (double) (chunkcoordinates.y + 1), (double) chunkcoordinates.z + 0.5D, 0.0F, 0.0F); - this.aZ = 180.0F; - this.maxFireTicks = 20; - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(GenericAttributes.e).setValue(1.0D); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - this.datawatcher.a(17, Float.valueOf(0.0F)); - this.datawatcher.a(18, Integer.valueOf(0)); - } - - public boolean by() { - return this.f != null; - } - - public void bA() { - if (this.f != null) { - this.f.b(this.world, this, this.g); - } - - this.bB(); - } - - public void bB() { - this.f = null; - this.g = 0; - if (!this.world.isStatic) { - this.e(false); - } - } - - public boolean isBlocking() { - return this.by() && this.f.getItem().d(this.f) == EnumAnimation.BLOCK; - } - - public void h() { - if (this.f != null) { - ItemStack itemstack = this.inventory.getItemInHand(); - - if (itemstack == this.f) { - if (this.g <= 25 && this.g % 4 == 0) { - this.c(itemstack, 5); - } - - if (--this.g == 0 && !this.world.isStatic) { - this.p(); - } - } else { - this.bB(); - } - } - - if (this.bt > 0) { - --this.bt; - } - - if (this.isSleeping()) { - ++this.sleepTicks; - if (this.sleepTicks > 100) { - this.sleepTicks = 100; - } - - if (!this.world.isStatic) { - if (!this.j()) { - this.a(true, true, false); - } else if (this.world.w()) { - this.a(false, true, true); - } - } - } else if (this.sleepTicks > 0) { - ++this.sleepTicks; - if (this.sleepTicks >= 110) { - this.sleepTicks = 0; - } - } - - super.h(); - if (!this.world.isStatic && this.activeContainer != null && !this.activeContainer.a(this)) { - this.closeInventory(); - this.activeContainer = this.defaultContainer; - } - - if (this.isBurning() && this.abilities.isInvulnerable) { - this.extinguish(); - } - - this.bu = this.bx; - this.bv = this.by; - this.bw = this.bz; - double d0 = this.locX - this.bx; - double d1 = this.locY - this.by; - double d2 = this.locZ - this.bz; - double d3 = 10.0D; - - if (d0 > d3) { - this.bu = this.bx = this.locX; - } - - if (d2 > d3) { - this.bw = this.bz = this.locZ; - } - - if (d1 > d3) { - this.bv = this.by = this.locY; - } - - if (d0 < -d3) { - this.bu = this.bx = this.locX; - } - - if (d2 < -d3) { - this.bw = this.bz = this.locZ; - } - - if (d1 < -d3) { - this.bv = this.by = this.locY; - } - - this.bx += d0 * 0.25D; - this.bz += d2 * 0.25D; - this.by += d1 * 0.25D; - if (this.vehicle == null) { - this.e = null; - } - - if (!this.world.isStatic) { - this.foodData.a(this); - this.a(StatisticList.g, 1); - } - } - - public int D() { - return this.abilities.isInvulnerable ? 0 : 80; - } - - protected String H() { - return "game.player.swim"; - } - - protected String O() { - return "game.player.swim.splash"; - } - - public int ai() { - return 10; - } - - public void makeSound(String s, float f, float f1) { - this.world.a(this, s, f, f1); - } - - protected void c(ItemStack itemstack, int i) { - if (itemstack.o() == EnumAnimation.DRINK) { - this.makeSound("random.drink", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); - } - - if (itemstack.o() == EnumAnimation.EAT) { - for (int j = 0; j < i; ++j) { - Vec3D vec3d = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); - - vec3d.a(-this.pitch * 3.1415927F / 180.0F); - vec3d.b(-this.yaw * 3.1415927F / 180.0F); - Vec3D vec3d1 = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.3D, (double) (-this.random.nextFloat()) * 0.6D - 0.3D, 0.6D); - - vec3d1.a(-this.pitch * 3.1415927F / 180.0F); - vec3d1.b(-this.yaw * 3.1415927F / 180.0F); - vec3d1 = vec3d1.add(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ); - String s = "iconcrack_" + Item.getId(itemstack.getItem()); - - if (itemstack.usesData()) { - s = s + "_" + itemstack.getData(); - } - - this.world.addParticle(s, vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c); - } - - this.makeSound("random.eat", 0.5F + 0.5F * (float) this.random.nextInt(2), (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - } - } - - protected void p() { - if (this.f != null) { - this.c(this.f, 16); - int i = this.f.count; - - // CraftBukkit start - fire PlayerItemConsumeEvent - org.bukkit.inventory.ItemStack craftItem = CraftItemStack.asBukkitCopy(this.f); - PlayerItemConsumeEvent event = new PlayerItemConsumeEvent((Player) this.getBukkitEntity(), craftItem); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - // Update client - if (this instanceof EntityPlayer) { - ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.f)); - } - return; - } - - // Plugin modified the item, process it but don't remove it - if (!craftItem.equals(event.getItem())) { - CraftItemStack.asNMSCopy(event.getItem()).b(this.world, this); - - // Update client - if (this instanceof EntityPlayer) { - ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutSetSlot((byte) 0, activeContainer.getSlot((IInventory) this.inventory, this.inventory.itemInHandIndex).index, this.f)); - } - return; - } - // CraftBukkit end - - ItemStack itemstack = this.f.b(this.world, this); - - if (itemstack != this.f || itemstack != null && itemstack.count != i) { - this.inventory.items[this.inventory.itemInHandIndex] = itemstack; - if (itemstack.count == 0) { - this.inventory.items[this.inventory.itemInHandIndex] = null; - } - } - - this.bB(); - } - } - - protected boolean bh() { - return this.getHealth() <= 0.0F || this.isSleeping(); - } - - // CraftBukkit - protected -> public - public void closeInventory() { - this.activeContainer = this.defaultContainer; - } - - public void mount(Entity entity) { - // CraftBukkit start - mirror Entity mount changes - this.setPassengerOf(entity); - } - - public void setPassengerOf(Entity entity) { - // CraftBukkit end - if (this.vehicle != null && entity == null) { - // CraftBukkit start - use parent method instead to correctly fire VehicleExitEvent - Entity originalVehicle = this.vehicle; - // First statement moved down, second statement handled in parent method. - /* - if (!this.world.isStatic) { - this.m(this.vehicle); - } - - if (this.vehicle != null) { - this.vehicle.passenger = null; - } - - this.vehicle = null; - */ - super.setPassengerOf(entity); - if (!this.world.isStatic && this.vehicle == null) { - this.m(originalVehicle); - } - // CraftBukkit end - } else { - super.setPassengerOf(entity); // CraftBukkit - call new parent - } - } - - public void ab() { - if (!this.world.isStatic && this.isSneaking()) { - this.mount((Entity) null); - this.setSneaking(false); - } else { - double d0 = this.locX; - double d1 = this.locY; - double d2 = this.locZ; - float f = this.yaw; - float f1 = this.pitch; - - super.ab(); - this.br = this.bs; - this.bs = 0.0F; - this.l(this.locX - d0, this.locY - d1, this.locZ - d2); - if (this.vehicle instanceof EntityPig) { - this.pitch = f1; - this.yaw = f; - this.aM = ((EntityPig) this.vehicle).aM; - } - } - } - - protected void bq() { - super.bq(); - this.bb(); - } - - public void e() { - if (this.bq > 0) { - --this.bq; - } - - if (this.world.difficulty == EnumDifficulty.PEACEFUL && this.getHealth() < this.getMaxHealth() && this.world.getGameRules().getBoolean("naturalRegeneration") && this.ticksLived % 20 * 12 == 0) { - // CraftBukkit - added regain reason of "REGEN" for filtering purposes. - this.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.REGEN); - } - - this.inventory.k(); - this.br = this.bs; - super.e(); - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - if (!this.world.isStatic) { - attributeinstance.setValue((double) this.abilities.b()); - } - - this.aQ = this.bJ; - if (this.isSprinting()) { - this.aQ = (float) ((double) this.aQ + (double) this.bJ * 0.3D); - } - - this.i((float) attributeinstance.getValue()); - float f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - // CraftBukkit - Math -> TrigMath - float f1 = (float) org.bukkit.craftbukkit.TrigMath.atan(-this.motY * 0.20000000298023224D) * 15.0F; - - if (f > 0.1F) { - f = 0.1F; - } - - if (!this.onGround || this.getHealth() <= 0.0F) { - f = 0.0F; - } - - if (this.onGround || this.getHealth() <= 0.0F) { - f1 = 0.0F; - } - - this.bs += (f - this.bs) * 0.4F; - this.aJ += (f1 - this.aJ) * 0.8F; - if (this.getHealth() > 0.0F) { - AxisAlignedBB axisalignedbb = null; - - if (this.vehicle != null && !this.vehicle.dead) { - axisalignedbb = this.boundingBox.a(this.vehicle.boundingBox).grow(1.0D, 0.0D, 1.0D); - } else { - axisalignedbb = this.boundingBox.grow(1.0D, 0.5D, 1.0D); - } - - List list = this.world.getEntities(this, axisalignedbb); - - if (list != null) { - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - if (!entity.dead) { - this.d(entity); - } - } - } - } - } - - private void d(Entity entity) { - entity.b_(this); - } - - public int getScore() { - return this.datawatcher.getInt(18); - } - - public void setScore(int i) { - this.datawatcher.watch(18, Integer.valueOf(i)); - } - - public void addScore(int i) { - int j = this.getScore(); - - this.datawatcher.watch(18, Integer.valueOf(j + i)); - } - - public void die(DamageSource damagesource) { - super.die(damagesource); - this.a(0.2F, 0.2F); - this.setPosition(this.locX, this.locY, this.locZ); - this.motY = 0.10000000149011612D; - if (this.getName().equals("Notch")) { - this.a(new ItemStack(Items.APPLE, 1), true, false); - } - - if (!this.world.getGameRules().getBoolean("keepInventory")) { - this.inventory.m(); - } - - if (damagesource != null) { - this.motX = (double) (-MathHelper.cos((this.az + this.yaw) * 3.1415927F / 180.0F) * 0.1F); - this.motZ = (double) (-MathHelper.sin((this.az + this.yaw) * 3.1415927F / 180.0F) * 0.1F); - } else { - this.motX = this.motZ = 0.0D; - } - - this.height = 0.1F; - this.a(StatisticList.v, 1); - } - - protected String aT() { - return "game.player.hurt"; - } - - protected String aU() { - return "game.player.die"; - } - - public void b(Entity entity, int i) { - this.addScore(i); - // CraftBukkit - Get our scores instead - Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.e, this.getName(), new java.util.ArrayList<ScoreboardScore>()); - - if (entity instanceof EntityHuman) { - this.a(StatisticList.y, 1); - // CraftBukkit - Get our scores instead - this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.d, this.getName(), collection); - } else { - this.a(StatisticList.w, 1); - } - - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead - - scoreboardscore.incrementScore(); - } - } - - public EntityItem a(boolean flag) { - // Called only when dropped by Q or CTRL-Q - return this.a(this.inventory.splitStack(this.inventory.itemInHandIndex, flag && this.inventory.getItemInHand() != null ? this.inventory.getItemInHand().count : 1), false, true); - } - - public EntityItem drop(ItemStack itemstack, boolean flag) { - return this.a(itemstack, false, false); - } - - public EntityItem a(ItemStack itemstack, boolean flag, boolean flag1) { - if (itemstack == null) { - return null; - } else if (itemstack.count == 0) { - return null; - } else { - EntityItem entityitem = new EntityItem(this.world, this.locX, this.locY - 0.30000001192092896D + (double) this.getHeadHeight(), this.locZ, itemstack); - - entityitem.pickupDelay = 40; - if (flag1) { - entityitem.b(this.getName()); - } - - float f = 0.1F; - float f1; - - if (flag) { - f1 = this.random.nextFloat() * 0.5F; - float f2 = this.random.nextFloat() * 3.1415927F * 2.0F; - - entityitem.motX = (double) (-MathHelper.sin(f2) * f1); - entityitem.motZ = (double) (MathHelper.cos(f2) * f1); - entityitem.motY = 0.20000000298023224D; - } else { - f = 0.3F; - entityitem.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - entityitem.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - entityitem.motY = (double) (-MathHelper.sin(this.pitch / 180.0F * 3.1415927F) * f + 0.1F); - f = 0.02F; - f1 = this.random.nextFloat() * 3.1415927F * 2.0F; - f *= this.random.nextFloat(); - entityitem.motX += Math.cos((double) f1) * (double) f; - entityitem.motY += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); - entityitem.motZ += Math.sin((double) f1) * (double) f; - } - - // CraftBukkit start - fire PlayerDropItemEvent - Player player = (Player) this.getBukkitEntity(); - CraftItem drop = new CraftItem(this.world.getServer(), entityitem); - - PlayerDropItemEvent event = new PlayerDropItemEvent(player, drop); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - org.bukkit.inventory.ItemStack cur = player.getInventory().getItemInHand(); - if (flag1 && (cur == null || cur.getAmount() == 0)) { - // The complete stack was dropped - player.getInventory().setItemInHand(drop.getItemStack()); - } else if (flag1 && cur.isSimilar(drop.getItemStack()) && drop.getItemStack().getAmount() == 1) { - // Only one item is dropped - cur.setAmount(cur.getAmount() + 1); - player.getInventory().setItemInHand(cur); - } else { - // Fallback - player.getInventory().addItem(drop.getItemStack()); - } - return null; - } - // CraftBukkit end - - this.a(entityitem); - this.a(StatisticList.s, 1); - return entityitem; - } - } - - protected void a(EntityItem entityitem) { - this.world.addEntity(entityitem); - } - - public float a(Block block, boolean flag) { - float f = this.inventory.a(block); - - if (f > 1.0F) { - int i = EnchantmentManager.getDigSpeedEnchantmentLevel(this); - ItemStack itemstack = this.inventory.getItemInHand(); - - if (i > 0 && itemstack != null) { - float f1 = (float) (i * i + 1); - - if (!itemstack.b(block) && f <= 1.0F) { - f += f1 * 0.08F; - } else { - f += f1; - } - } - } - - if (this.hasEffect(MobEffectList.FASTER_DIG)) { - f *= 1.0F + (float) (this.getEffect(MobEffectList.FASTER_DIG).getAmplifier() + 1) * 0.2F; - } - - if (this.hasEffect(MobEffectList.SLOWER_DIG)) { - f *= 1.0F - (float) (this.getEffect(MobEffectList.SLOWER_DIG).getAmplifier() + 1) * 0.2F; - } - - if (this.a(Material.WATER) && !EnchantmentManager.hasWaterWorkerEnchantment(this)) { - f /= 5.0F; - } - - if (!this.onGround) { - f /= 5.0F; - } - - return f; - } - - public boolean a(Block block) { - return this.inventory.b(block); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.uniqueID = a(this.i); - NBTTagList nbttaglist = nbttagcompound.getList("Inventory", 10); - - this.inventory.b(nbttaglist); - this.inventory.itemInHandIndex = nbttagcompound.getInt("SelectedItemSlot"); - this.sleeping = nbttagcompound.getBoolean("Sleeping"); - this.sleepTicks = nbttagcompound.getShort("SleepTimer"); - this.exp = nbttagcompound.getFloat("XpP"); - this.expLevel = nbttagcompound.getInt("XpLevel"); - this.expTotal = nbttagcompound.getInt("XpTotal"); - this.setScore(nbttagcompound.getInt("Score")); - if (this.sleeping) { - this.bB = new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); - this.a(true, true, false); - } - - // CraftBukkit start - this.spawnWorld = nbttagcompound.getString("SpawnWorld"); - if ("".equals(spawnWorld)) { - this.spawnWorld = this.world.getServer().getWorlds().get(0).getName(); - } - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("SpawnX", 99) && nbttagcompound.hasKeyOfType("SpawnY", 99) && nbttagcompound.hasKeyOfType("SpawnZ", 99)) { - this.c = new ChunkCoordinates(nbttagcompound.getInt("SpawnX"), nbttagcompound.getInt("SpawnY"), nbttagcompound.getInt("SpawnZ")); - this.d = nbttagcompound.getBoolean("SpawnForced"); - } - - this.foodData.a(nbttagcompound); - this.abilities.b(nbttagcompound); - if (nbttagcompound.hasKeyOfType("EnderItems", 9)) { - NBTTagList nbttaglist1 = nbttagcompound.getList("EnderItems", 10); - - this.enderChest.a(nbttaglist1); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.set("Inventory", this.inventory.a(new NBTTagList())); - nbttagcompound.setInt("SelectedItemSlot", this.inventory.itemInHandIndex); - nbttagcompound.setBoolean("Sleeping", this.sleeping); - nbttagcompound.setShort("SleepTimer", (short) this.sleepTicks); - nbttagcompound.setFloat("XpP", this.exp); - nbttagcompound.setInt("XpLevel", this.expLevel); - nbttagcompound.setInt("XpTotal", this.expTotal); - nbttagcompound.setInt("Score", this.getScore()); - if (this.c != null) { - nbttagcompound.setInt("SpawnX", this.c.x); - nbttagcompound.setInt("SpawnY", this.c.y); - nbttagcompound.setInt("SpawnZ", this.c.z); - nbttagcompound.setBoolean("SpawnForced", this.d); - nbttagcompound.setString("SpawnWorld", spawnWorld); // CraftBukkit - fixes bed spawns for multiworld worlds - } - - this.foodData.b(nbttagcompound); - this.abilities.a(nbttagcompound); - nbttagcompound.set("EnderItems", this.enderChest.h()); - } - - public void openContainer(IInventory iinventory) {} - - public void openHopper(TileEntityHopper tileentityhopper) {} - - public void openMinecartHopper(EntityMinecartHopper entityminecarthopper) {} - - public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) {} - - public void startEnchanting(int i, int j, int k, String s) {} - - public void openAnvil(int i, int j, int k) {} - - public void startCrafting(int i, int j, int k) {} - - public float getHeadHeight() { - return 0.12F; - } - - protected void e_() { - this.height = 1.62F; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.abilities.isInvulnerable && !damagesource.ignoresInvulnerability()) { - return false; - } else { - this.aU = 0; - if (this.getHealth() <= 0.0F) { - return false; - } else { - if (this.isSleeping() && !this.world.isStatic) { - this.a(true, true, false); - } - - if (damagesource.r()) { - if (this.world.difficulty == EnumDifficulty.PEACEFUL) { - return false; // CraftBukkit - f = 0.0f -> return false - } - - if (this.world.difficulty == EnumDifficulty.EASY) { - f = f / 2.0F + 1.0F; - } - - if (this.world.difficulty == EnumDifficulty.HARD) { - f = f * 3.0F / 2.0F; - } - } - - if (false && f == 0.0F) { // CraftBukkit - Don't filter out 0 damage - return false; - } else { - Entity entity = damagesource.getEntity(); - - if (entity instanceof EntityArrow && ((EntityArrow) entity).shooter != null) { - entity = ((EntityArrow) entity).shooter; - } - - this.a(StatisticList.u, Math.round(f * 10.0F)); - return super.damageEntity(damagesource, f); - } - } - } - } - - public boolean a(EntityHuman entityhuman) { - // CraftBukkit start - Change to check OTHER player's scoreboard team according to API - // To summarize this method's logic, it's "Can parameter hurt this" - org.bukkit.scoreboard.Team team; - if (entityhuman instanceof EntityPlayer) { - EntityPlayer thatPlayer = (EntityPlayer) entityhuman; - team = thatPlayer.getBukkitEntity().getScoreboard().getPlayerTeam(thatPlayer.getBukkitEntity()); - if (team == null || team.allowFriendlyFire()) { - return true; - } - } else { - // This should never be called, but is implemented anyway - org.bukkit.OfflinePlayer thisPlayer = entityhuman.world.getServer().getOfflinePlayer(entityhuman.getName()); - team = entityhuman.world.getServer().getScoreboardManager().getMainScoreboard().getPlayerTeam(thisPlayer); - if (team == null || team.allowFriendlyFire()) { - return true; - } - } - - if (this instanceof EntityPlayer) { - return !team.hasPlayer(((EntityPlayer) this).getBukkitEntity()); - } - return !team.hasPlayer(this.world.getServer().getOfflinePlayer(this.getName())); - // CraftBukkit end - } - - protected void damageArmor(float f) { - this.inventory.a(f); - } - - public int aV() { - return this.inventory.l(); - } - - public float bE() { - int i = 0; - ItemStack[] aitemstack = this.inventory.armor; - int j = aitemstack.length; - - for (int k = 0; k < j; ++k) { - ItemStack itemstack = aitemstack[k]; - - if (itemstack != null) { - ++i; - } - } - - return (float) i / (float) this.inventory.armor.length; - } - - // CraftBukkit start - protected boolean d(DamageSource damagesource, float f) { // void -> boolean - if (true) { - return super.d(damagesource, f); - } - // CraftBukkit end - if (!this.isInvulnerable()) { - if (!damagesource.ignoresArmor() && this.isBlocking() && f > 0.0F) { - f = (1.0F + f) * 0.5F; - } - - f = this.applyArmorModifier(damagesource, f); - f = this.applyMagicModifier(damagesource, f); - float f1 = f; - - f = Math.max(f - this.getAbsorptionHearts(), 0.0F); - this.setAbsorptionHearts(this.getAbsorptionHearts() - (f1 - f)); - if (f != 0.0F) { - this.applyExhaustion(damagesource.getExhaustionCost()); - float f2 = this.getHealth(); - - this.setHealth(this.getHealth() - f); - this.aW().a(damagesource, f2, f); - } - } - return false; // CraftBukkit - } - - public void openFurnace(TileEntityFurnace tileentityfurnace) {} - - public void openDispenser(TileEntityDispenser tileentitydispenser) {} - - public void a(TileEntity tileentity) {} - - public void a(CommandBlockListenerAbstract commandblocklistenerabstract) {} - - public void openBrewingStand(TileEntityBrewingStand tileentitybrewingstand) {} - - public void openBeacon(TileEntityBeacon tileentitybeacon) {} - - public void openTrade(IMerchant imerchant, String s) {} - - public void b(ItemStack itemstack) {} - - public boolean q(Entity entity) { - ItemStack itemstack = this.bF(); - ItemStack itemstack1 = itemstack != null ? itemstack.cloneItemStack() : null; - - if (!entity.c(this)) { - if (itemstack != null && entity instanceof EntityLiving) { - if (this.abilities.canInstantlyBuild) { - itemstack = itemstack1; - } - - if (itemstack.a(this, (EntityLiving) entity)) { - // CraftBukkit - bypass infinite items; <= 0 -> == 0 - if (itemstack.count == 0 && !this.abilities.canInstantlyBuild) { - this.bG(); - } - - return true; - } - } - - return false; - } else { - if (itemstack != null && itemstack == this.bF()) { - if (itemstack.count <= 0 && !this.abilities.canInstantlyBuild) { - this.bG(); - } else if (itemstack.count < itemstack1.count && this.abilities.canInstantlyBuild) { - itemstack.count = itemstack1.count; - } - } - - return true; - } - } - - public ItemStack bF() { - return this.inventory.getItemInHand(); - } - - public void bG() { - this.inventory.setItem(this.inventory.itemInHandIndex, (ItemStack) null); - } - - public double ad() { - return (double) (this.height - 0.5F); - } - - public void attack(Entity entity) { - if (entity.av()) { - if (!entity.j(this)) { - float f = (float) this.getAttributeInstance(GenericAttributes.e).getValue(); - int i = 0; - float f1 = 0.0F; - - if (entity instanceof EntityLiving) { - f1 = EnchantmentManager.a((EntityLiving) this, (EntityLiving) entity); - i += EnchantmentManager.getKnockbackEnchantmentLevel(this, (EntityLiving) entity); - } - - if (this.isSprinting()) { - ++i; - } - - if (f > 0.0F || f1 > 0.0F) { - boolean flag = this.fallDistance > 0.0F && !this.onGround && !this.h_() && !this.M() && !this.hasEffect(MobEffectList.BLINDNESS) && this.vehicle == null && entity instanceof EntityLiving; - - if (flag && f > 0.0F) { - f *= 1.5F; - } - - f += f1; - boolean flag1 = false; - int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); - - if (entity instanceof EntityLiving && j > 0 && !entity.isBurning()) { - // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 1); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - flag1 = true; - entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - - boolean flag2 = entity.damageEntity(DamageSource.playerAttack(this), f); - - if (flag2) { - if (i > 0) { - entity.g((double) (-MathHelper.sin(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F), 0.1D, (double) (MathHelper.cos(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F)); - this.motX *= 0.6D; - this.motZ *= 0.6D; - this.setSprinting(false); - } - - if (flag) { - this.b(entity); - } - - if (f1 > 0.0F) { - this.c(entity); - } - - if (f >= 18.0F) { - this.a((Statistic) AchievementList.F); - } - - this.l(entity); - if (entity instanceof EntityLiving) { - EnchantmentManager.a((EntityLiving) entity, (Entity) this); - } - - EnchantmentManager.b(this, entity); - ItemStack itemstack = this.bF(); - Object object = entity; - - if (entity instanceof EntityComplexPart) { - IComplex icomplex = ((EntityComplexPart) entity).owner; - - if (icomplex != null && icomplex instanceof EntityLiving) { - object = (EntityLiving) icomplex; - } - } - - if (itemstack != null && object instanceof EntityLiving) { - itemstack.a((EntityLiving) object, this); - // CraftBukkit - bypass infinite items; <= 0 -> == 0 - if (itemstack.count == 0) { - this.bG(); - } - } - - if (entity instanceof EntityLiving) { - this.a(StatisticList.t, Math.round(f * 10.0F)); - if (j > 0) { - // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - } - - this.applyExhaustion(0.3F); - } else if (flag1) { - entity.extinguish(); - } - } - } - } - } - - public void b(Entity entity) {} - - public void c(Entity entity) {} - - public void die() { - super.die(); - this.defaultContainer.b(this); - if (this.activeContainer != null) { - this.activeContainer.b(this); - } - } - - public boolean inBlock() { - return !this.sleeping && super.inBlock(); - } - - public GameProfile getProfile() { - return this.i; - } - - public EnumBedResult a(int i, int j, int k) { - if (!this.world.isStatic) { - if (this.isSleeping() || !this.isAlive()) { - return EnumBedResult.OTHER_PROBLEM; - } - - if (!this.world.worldProvider.d()) { - return EnumBedResult.NOT_POSSIBLE_HERE; - } - - if (this.world.w()) { - return EnumBedResult.NOT_POSSIBLE_NOW; - } - - if (Math.abs(this.locX - (double) i) > 3.0D || Math.abs(this.locY - (double) j) > 2.0D || Math.abs(this.locZ - (double) k) > 3.0D) { - return EnumBedResult.TOO_FAR_AWAY; - } - - double d0 = 8.0D; - double d1 = 5.0D; - List list = this.world.a(EntityMonster.class, AxisAlignedBB.a((double) i - d0, (double) j - d1, (double) k - d0, (double) i + d0, (double) j + d1, (double) k + d0)); - - if (!list.isEmpty()) { - return EnumBedResult.NOT_SAFE; - } - } - - if (this.am()) { - this.mount((Entity) null); - } - - // CraftBukkit start - fire PlayerBedEnterEvent - if (this.getBukkitEntity() instanceof Player) { - Player player = (Player) this.getBukkitEntity(); - org.bukkit.block.Block bed = this.world.getWorld().getBlockAt(i, j, k); - - PlayerBedEnterEvent event = new PlayerBedEnterEvent(player, bed); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return EnumBedResult.OTHER_PROBLEM; - } - } - // CraftBukkit end - - this.a(0.2F, 0.2F); - this.height = 0.2F; - if (this.world.isLoaded(i, j, k)) { - int l = this.world.getData(i, j, k); - int i1 = BlockBed.l(l); - float f = 0.5F; - float f1 = 0.5F; - - switch (i1) { - case 0: - f1 = 0.9F; - break; - - case 1: - f = 0.1F; - break; - - case 2: - f1 = 0.1F; - break; - - case 3: - f = 0.9F; - } - - this.w(i1); - this.setPosition((double) ((float) i + f), (double) ((float) j + 0.9375F), (double) ((float) k + f1)); - } else { - this.setPosition((double) ((float) i + 0.5F), (double) ((float) j + 0.9375F), (double) ((float) k + 0.5F)); - } - - this.sleeping = true; - this.sleepTicks = 0; - this.bB = new ChunkCoordinates(i, j, k); - this.motX = this.motZ = this.motY = 0.0D; - if (!this.world.isStatic) { - this.world.everyoneSleeping(); - } - - return EnumBedResult.OK; - } - - private void w(int i) { - this.bC = 0.0F; - this.bD = 0.0F; - switch (i) { - case 0: - this.bD = -1.8F; - break; - - case 1: - this.bC = 1.8F; - break; - - case 2: - this.bD = 1.8F; - break; - - case 3: - this.bC = -1.8F; - } - } - - public void a(boolean flag, boolean flag1, boolean flag2) { - this.a(0.6F, 1.8F); - this.e_(); - ChunkCoordinates chunkcoordinates = this.bB; - ChunkCoordinates chunkcoordinates1 = this.bB; - - if (chunkcoordinates != null && this.world.getType(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) == Blocks.BED) { - BlockBed.a(this.world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, false); - chunkcoordinates1 = BlockBed.a(this.world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, 0); - if (chunkcoordinates1 == null) { - chunkcoordinates1 = new ChunkCoordinates(chunkcoordinates.x, chunkcoordinates.y + 1, chunkcoordinates.z); - } - - this.setPosition((double) ((float) chunkcoordinates1.x + 0.5F), (double) ((float) chunkcoordinates1.y + this.height + 0.1F), (double) ((float) chunkcoordinates1.z + 0.5F)); - } - - this.sleeping = false; - if (!this.world.isStatic && flag1) { - this.world.everyoneSleeping(); - } - - // CraftBukkit start - fire PlayerBedLeaveEvent - if (this.getBukkitEntity() instanceof Player) { - Player player = (Player) this.getBukkitEntity(); - - org.bukkit.block.Block bed; - if (chunkcoordinates != null) { - bed = this.world.getWorld().getBlockAt(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z); - } else { - bed = this.world.getWorld().getBlockAt(player.getLocation()); - } - - PlayerBedLeaveEvent event = new PlayerBedLeaveEvent(player, bed); - this.world.getServer().getPluginManager().callEvent(event); - } - // CraftBukkit end - - if (flag) { - this.sleepTicks = 0; - } else { - this.sleepTicks = 100; - } - - if (flag2) { - this.setRespawnPosition(this.bB, false); - } - } - - private boolean j() { - return this.world.getType(this.bB.x, this.bB.y, this.bB.z) == Blocks.BED; - } - - public static ChunkCoordinates getBed(World world, ChunkCoordinates chunkcoordinates, boolean flag) { - IChunkProvider ichunkprovider = world.L(); - - ichunkprovider.getChunkAt(chunkcoordinates.x - 3 >> 4, chunkcoordinates.z - 3 >> 4); - ichunkprovider.getChunkAt(chunkcoordinates.x + 3 >> 4, chunkcoordinates.z - 3 >> 4); - ichunkprovider.getChunkAt(chunkcoordinates.x - 3 >> 4, chunkcoordinates.z + 3 >> 4); - ichunkprovider.getChunkAt(chunkcoordinates.x + 3 >> 4, chunkcoordinates.z + 3 >> 4); - if (world.getType(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z) == Blocks.BED) { - ChunkCoordinates chunkcoordinates1 = BlockBed.a(world, chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, 0); - - return chunkcoordinates1; - } else { - Material material = world.getType(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z).getMaterial(); - Material material1 = world.getType(chunkcoordinates.x, chunkcoordinates.y + 1, chunkcoordinates.z).getMaterial(); - boolean flag1 = !material.isBuildable() && !material.isLiquid(); - boolean flag2 = !material1.isBuildable() && !material1.isLiquid(); - - return flag && flag1 && flag2 ? chunkcoordinates : null; - } - } - - public boolean isSleeping() { - return this.sleeping; - } - - public boolean isDeeplySleeping() { - return this.sleeping && this.sleepTicks >= 100; - } - - protected void b(int i, boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 1 << i))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & ~(1 << i)))); - } - } - - public void b(IChatBaseComponent ichatbasecomponent) {} - - public ChunkCoordinates getBed() { - return this.c; - } - - public boolean isRespawnForced() { - return this.d; - } - - public void setRespawnPosition(ChunkCoordinates chunkcoordinates, boolean flag) { - if (chunkcoordinates != null) { - this.c = new ChunkCoordinates(chunkcoordinates); - this.d = flag; - this.spawnWorld = this.world.worldData.getName(); // CraftBukkit - } else { - this.c = null; - this.d = false; - this.spawnWorld = ""; // CraftBukkit - } - } - - public void a(Statistic statistic) { - this.a(statistic, 1); - } - - public void a(Statistic statistic, int i) {} - - public void bj() { - super.bj(); - this.a(StatisticList.r, 1); - if (this.isSprinting()) { - this.applyExhaustion(0.8F); - } else { - this.applyExhaustion(0.2F); - } - } - - public void e(float f, float f1) { - double d0 = this.locX; - double d1 = this.locY; - double d2 = this.locZ; - - if (this.abilities.isFlying && this.vehicle == null) { - double d3 = this.motY; - float f2 = this.aQ; - - this.aQ = this.abilities.a(); - super.e(f, f1); - this.motY = d3 * 0.6D; - this.aQ = f2; - } else { - super.e(f, f1); - } - - this.checkMovement(this.locX - d0, this.locY - d1, this.locZ - d2); - } - - public float bl() { - return (float) this.getAttributeInstance(GenericAttributes.d).getValue(); - } - - public void checkMovement(double d0, double d1, double d2) { - if (this.vehicle == null) { - int i; - - if (this.a(Material.WATER)) { - i = Math.round(MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2) * 100.0F); - if (i > 0) { - this.a(StatisticList.m, i); - this.applyExhaustion(0.015F * (float) i * 0.01F); - } - } else if (this.M()) { - i = Math.round(MathHelper.sqrt(d0 * d0 + d2 * d2) * 100.0F); - if (i > 0) { - this.a(StatisticList.i, i); - this.applyExhaustion(0.015F * (float) i * 0.01F); - } - } else if (this.h_()) { - if (d1 > 0.0D) { - this.a(StatisticList.k, (int) Math.round(d1 * 100.0D)); - } - } else if (this.onGround) { - i = Math.round(MathHelper.sqrt(d0 * d0 + d2 * d2) * 100.0F); - if (i > 0) { - this.a(StatisticList.h, i); - if (this.isSprinting()) { - this.applyExhaustion(0.099999994F * (float) i * 0.01F); - } else { - this.applyExhaustion(0.01F * (float) i * 0.01F); - } - } - } else { - i = Math.round(MathHelper.sqrt(d0 * d0 + d2 * d2) * 100.0F); - if (i > 25) { - this.a(StatisticList.l, i); - } - } - } - } - - private void l(double d0, double d1, double d2) { - if (this.vehicle != null) { - int i = Math.round(MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2) * 100.0F); - - if (i > 0) { - if (this.vehicle instanceof EntityMinecartAbstract) { - this.a(StatisticList.n, i); - if (this.e == null) { - this.e = new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)); - } else if ((double) this.e.e(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) >= 1000000.0D) { - this.a((Statistic) AchievementList.q, 1); - } - } else if (this.vehicle instanceof EntityBoat) { - this.a(StatisticList.o, i); - } else if (this.vehicle instanceof EntityPig) { - this.a(StatisticList.p, i); - } else if (this.vehicle instanceof EntityHorse) { - this.a(StatisticList.q, i); - } - } - } - } - - protected void b(float f) { - if (!this.abilities.canFly) { - if (f >= 2.0F) { - this.a(StatisticList.j, (int) Math.round((double) f * 100.0D)); - } - - super.b(f); - } - } - - protected String o(int i) { - return i > 4 ? "game.player.hurt.fall.big" : "game.player.hurt.fall.small"; - } - - public void a(EntityLiving entityliving) { - if (entityliving instanceof IMonster) { - this.a((Statistic) AchievementList.s); - } - - int i = EntityTypes.a(entityliving); - MonsterEggInfo monsteregginfo = (MonsterEggInfo) EntityTypes.eggInfo.get(Integer.valueOf(i)); - - if (monsteregginfo != null) { - this.a(monsteregginfo.killEntityStatistic, 1); - } - } - - public void as() { - if (!this.abilities.isFlying) { - super.as(); - } - } - - public ItemStack r(int i) { - return this.inventory.d(i); - } - - public void giveExp(int i) { - this.addScore(i); - int j = Integer.MAX_VALUE - this.expTotal; - - if (i > j) { - i = j; - } - - this.exp += (float) i / (float) this.getExpToLevel(); - - for (this.expTotal += i; this.exp >= 1.0F; this.exp /= (float) this.getExpToLevel()) { - this.exp = (this.exp - 1.0F) * (float) this.getExpToLevel(); - this.levelDown(1); - } - } - - public void levelDown(int i) { - this.expLevel += i; - if (this.expLevel < 0) { - this.expLevel = 0; - this.exp = 0.0F; - this.expTotal = 0; - } - - if (i > 0 && this.expLevel % 5 == 0 && (float) this.h < (float) this.ticksLived - 100.0F) { - float f = this.expLevel > 30 ? 1.0F : (float) this.expLevel / 30.0F; - - this.world.makeSound(this, "random.levelup", f * 0.75F, 1.0F); - this.h = this.ticksLived; - } - } - - public int getExpToLevel() { - return this.expLevel >= 30 ? 62 + (this.expLevel - 30) * 7 : (this.expLevel >= 15 ? 17 + (this.expLevel - 15) * 3 : 17); - } - - public void applyExhaustion(float f) { - if (!this.abilities.isInvulnerable) { - if (!this.world.isStatic) { - this.foodData.a(f); - } - } - } - - public FoodMetaData getFoodData() { - return this.foodData; - } - - public boolean g(boolean flag) { - return (flag || this.foodData.c()) && !this.abilities.isInvulnerable; - } - - public boolean bR() { - return this.getHealth() > 0.0F && this.getHealth() < this.getMaxHealth(); - } - - public void a(ItemStack itemstack, int i) { - if (itemstack != this.f) { - this.f = itemstack; - this.g = i; - if (!this.world.isStatic) { - this.e(true); - } - } - } - - public boolean d(int i, int j, int k) { - if (this.abilities.mayBuild) { - return true; - } else { - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() != Material.AIR) { - if (block.getMaterial().q()) { - return true; - } - - if (this.bF() != null) { - ItemStack itemstack = this.bF(); - - if (itemstack.b(block) || itemstack.a(block) > 1.0F) { - return true; - } - } - } - - return false; - } - } - - public boolean a(int i, int j, int k, int l, ItemStack itemstack) { - return this.abilities.mayBuild ? true : (itemstack != null ? itemstack.z() : false); - } - - protected int getExpValue(EntityHuman entityhuman) { - if (this.world.getGameRules().getBoolean("keepInventory")) { - return 0; - } else { - int i = this.expLevel * 7; - - return i > 100 ? 100 : i; - } - } - - protected boolean alwaysGivesExp() { - return true; - } - - public void copyTo(EntityHuman entityhuman, boolean flag) { - if (flag) { - this.inventory.b(entityhuman.inventory); - this.setHealth(entityhuman.getHealth()); - this.foodData = entityhuman.foodData; - this.expLevel = entityhuman.expLevel; - this.expTotal = entityhuman.expTotal; - this.exp = entityhuman.exp; - this.setScore(entityhuman.getScore()); - this.aq = entityhuman.aq; - } else if (this.world.getGameRules().getBoolean("keepInventory")) { - this.inventory.b(entityhuman.inventory); - this.expLevel = entityhuman.expLevel; - this.expTotal = entityhuman.expTotal; - this.exp = entityhuman.exp; - this.setScore(entityhuman.getScore()); - } - - this.enderChest = entityhuman.enderChest; - } - - protected boolean g_() { - return !this.abilities.isFlying; - } - - public void updateAbilities() {} - - public void a(EnumGamemode enumgamemode) {} - - public String getName() { - return this.i.getName(); - } - - public World getWorld() { - return this.world; - } - - public InventoryEnderChest getEnderChest() { - return this.enderChest; - } - - public ItemStack getEquipment(int i) { - return i == 0 ? this.inventory.getItemInHand() : this.inventory.armor[i - 1]; - } - - public ItemStack be() { - return this.inventory.getItemInHand(); - } - - public void setEquipment(int i, ItemStack itemstack) { - this.inventory.armor[i] = itemstack; - } - - public ItemStack[] getEquipment() { - return this.inventory.armor; - } - - public boolean aC() { - return !this.abilities.isFlying; - } - - public Scoreboard getScoreboard() { - return this.world.getScoreboard(); - } - - public ScoreboardTeamBase getScoreboardTeam() { - return this.getScoreboard().getPlayerTeam(this.getName()); - } - - public IChatBaseComponent getScoreboardDisplayName() { - // CraftBukkit - todo: fun - ChatComponentText chatcomponenttext = new ChatComponentText(ScoreboardTeam.getPlayerDisplayName(this.getScoreboardTeam(), this.getName())); - - chatcomponenttext.getChatModifier().setChatClickable(new ChatClickable(EnumClickAction.SUGGEST_COMMAND, "/msg " + this.getName() + " ")); - return chatcomponenttext; - } - - public void setAbsorptionHearts(float f) { - if (f < 0.0F) { - f = 0.0F; - } - - this.getDataWatcher().watch(17, Float.valueOf(f)); - } - - public float getAbsorptionHearts() { - return this.getDataWatcher().getFloat(17); - } - - public static UUID a(GameProfile gameprofile) { - UUID uuid = gameprofile.getId(); - - if (uuid == null) { - uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + gameprofile.getName()).getBytes(Charsets.UTF_8)); - } - - return uuid; - } -} diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java deleted file mode 100644 index a812656f..00000000 --- a/src/main/java/net/minecraft/server/EntityInsentient.java +++ /dev/null @@ -1,892 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityUnleashEvent; -import org.bukkit.event.entity.EntityUnleashEvent.UnleashReason; -// CraftBukkit end - -public abstract class EntityInsentient extends EntityLiving { - - public int a_; - protected int b; - private ControllerLook lookController; - private ControllerMove moveController; - private ControllerJump bm; - private EntityAIBodyControl bn; - private Navigation navigation; - protected final PathfinderGoalSelector goalSelector; - protected final PathfinderGoalSelector targetSelector; - private EntityLiving goalTarget; - private EntitySenses bq; - private ItemStack[] equipment = new ItemStack[5]; - public float[] dropChances = new float[5]; // CraftBukkit - protected -> public - public boolean canPickUpLoot; // CraftBukkit - private -> public - public boolean persistent = !isTypeNotPersistent(); // CraftBukkit - private -> public - protected float f; - private Entity bu; - protected int g; - private boolean bv; - private Entity bw; - private NBTTagCompound bx; - - public EntityInsentient(World world) { - super(world); - this.goalSelector = new PathfinderGoalSelector(world != null && world.methodProfiler != null ? world.methodProfiler : null); - this.targetSelector = new PathfinderGoalSelector(world != null && world.methodProfiler != null ? world.methodProfiler : null); - this.lookController = new ControllerLook(this); - this.moveController = new ControllerMove(this); - this.bm = new ControllerJump(this); - this.bn = new EntityAIBodyControl(this); - this.navigation = new Navigation(this, world); - this.bq = new EntitySenses(this); - - for (int i = 0; i < this.dropChances.length; ++i) { - this.dropChances[i] = 0.085F; - } - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(GenericAttributes.b).setValue(16.0D); - } - - public ControllerLook getControllerLook() { - return this.lookController; - } - - public ControllerMove getControllerMove() { - return this.moveController; - } - - public ControllerJump getControllerJump() { - return this.bm; - } - - public Navigation getNavigation() { - return this.navigation; - } - - public EntitySenses getEntitySenses() { - return this.bq; - } - - public EntityLiving getGoalTarget() { - return this.goalTarget; - } - - public void setGoalTarget(EntityLiving entityliving) { - this.goalTarget = entityliving; - } - - public boolean a(Class oclass) { - return EntityCreeper.class != oclass && EntityGhast.class != oclass; - } - - public void p() {} - - protected void c() { - super.c(); - this.datawatcher.a(11, Byte.valueOf((byte) 0)); - this.datawatcher.a(10, ""); - } - - public int q() { - return 80; - } - - public void r() { - String s = this.t(); - - if (s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - } - - public void C() { - super.C(); - this.world.methodProfiler.a("mobBaseTick"); - if (this.isAlive() && this.random.nextInt(1000) < this.a_++) { - this.a_ = -this.q(); - this.r(); - } - - this.world.methodProfiler.b(); - } - - protected int getExpValue(EntityHuman entityhuman) { - if (this.b > 0) { - int i = this.b; - ItemStack[] aitemstack = this.getEquipment(); - - for (int j = 0; j < aitemstack.length; ++j) { - if (aitemstack[j] != null && this.dropChances[j] <= 1.0F) { - i += 1 + this.random.nextInt(3); - } - } - - return i; - } else { - return this.b; - } - } - - public void s() { - for (int i = 0; i < 20; ++i) { - double d0 = this.random.nextGaussian() * 0.02D; - double d1 = this.random.nextGaussian() * 0.02D; - double d2 = this.random.nextGaussian() * 0.02D; - double d3 = 10.0D; - - this.world.addParticle("explode", this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width - d0 * d3, this.locY + (double) (this.random.nextFloat() * this.length) - d1 * d3, this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width - d2 * d3, d0, d1, d2); - } - } - - public void h() { - super.h(); - if (!this.world.isStatic) { - this.bL(); - } - } - - protected float f(float f, float f1) { - if (this.bk()) { - this.bn.a(); - return f1; - } else { - return super.f(f, f1); - } - } - - protected String t() { - return null; - } - - protected Item getLoot() { - return Item.getById(0); - } - - protected void dropDeathLoot(boolean flag, int i) { - Item item = this.getLoot(); - - if (item != null) { - int j = this.random.nextInt(3); - - if (i > 0) { - j += this.random.nextInt(i + 1); - } - - for (int k = 0; k < j; ++k) { - this.a(item, 1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("CanPickUpLoot", this.bJ()); - nbttagcompound.setBoolean("PersistenceRequired", this.persistent); - NBTTagList nbttaglist = new NBTTagList(); - - NBTTagCompound nbttagcompound1; - - for (int i = 0; i < this.equipment.length; ++i) { - nbttagcompound1 = new NBTTagCompound(); - if (this.equipment[i] != null) { - this.equipment[i].save(nbttagcompound1); - } - - nbttaglist.add(nbttagcompound1); - } - - nbttagcompound.set("Equipment", nbttaglist); - NBTTagList nbttaglist1 = new NBTTagList(); - - for (int j = 0; j < this.dropChances.length; ++j) { - nbttaglist1.add(new NBTTagFloat(this.dropChances[j])); - } - - nbttagcompound.set("DropChances", nbttaglist1); - nbttagcompound.setString("CustomName", this.getCustomName()); - nbttagcompound.setBoolean("CustomNameVisible", this.getCustomNameVisible()); - nbttagcompound.setBoolean("Leashed", this.bv); - if (this.bw != null) { - nbttagcompound1 = new NBTTagCompound(); - if (this.bw instanceof EntityLiving) { - nbttagcompound1.setLong("UUIDMost", this.bw.getUniqueID().getMostSignificantBits()); - nbttagcompound1.setLong("UUIDLeast", this.bw.getUniqueID().getLeastSignificantBits()); - } else if (this.bw instanceof EntityHanging) { - EntityHanging entityhanging = (EntityHanging) this.bw; - - nbttagcompound1.setInt("X", entityhanging.x); - nbttagcompound1.setInt("Y", entityhanging.y); - nbttagcompound1.setInt("Z", entityhanging.z); - } - - nbttagcompound.set("Leash", nbttagcompound1); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - - // CraftBukkit start - If looting or persistence is false only use it if it was set after we started using it - boolean data = nbttagcompound.getBoolean("CanPickUpLoot"); - if (isLevelAtLeast(nbttagcompound, 1) || data) { - this.canPickUpLoot = data; - } - - data = nbttagcompound.getBoolean("PersistenceRequired"); - if (isLevelAtLeast(nbttagcompound, 1) || data) { - this.persistent = data; - } - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("CustomName", 8) && nbttagcompound.getString("CustomName").length() > 0) { - this.setCustomName(nbttagcompound.getString("CustomName")); - } - - this.setCustomNameVisible(nbttagcompound.getBoolean("CustomNameVisible")); - NBTTagList nbttaglist; - int i; - - if (nbttagcompound.hasKeyOfType("Equipment", 9)) { - nbttaglist = nbttagcompound.getList("Equipment", 10); - - for (i = 0; i < this.equipment.length; ++i) { - this.equipment[i] = ItemStack.createStack(nbttaglist.get(i)); - } - } - - if (nbttagcompound.hasKeyOfType("DropChances", 9)) { - nbttaglist = nbttagcompound.getList("DropChances", 5); - - for (i = 0; i < nbttaglist.size(); ++i) { - this.dropChances[i] = nbttaglist.e(i); - } - } - - this.bv = nbttagcompound.getBoolean("Leashed"); - if (this.bv && nbttagcompound.hasKeyOfType("Leash", 10)) { - this.bx = nbttagcompound.getCompound("Leash"); - } - } - - public void n(float f) { - this.be = f; - } - - public void i(float f) { - super.i(f); - this.n(f); - } - - public void e() { - super.e(); - this.world.methodProfiler.a("looting"); - if (!this.world.isStatic && this.bJ() && !this.aT && this.world.getGameRules().getBoolean("mobGriefing")) { - List list = this.world.a(EntityItem.class, this.boundingBox.grow(1.0D, 0.0D, 1.0D)); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityItem entityitem = (EntityItem) iterator.next(); - - if (!entityitem.dead && entityitem.getItemStack() != null) { - ItemStack itemstack = entityitem.getItemStack(); - int i = b(itemstack); - - if (i > -1) { - boolean flag = true; - ItemStack itemstack1 = this.getEquipment(i); - - if (itemstack1 != null) { - if (i == 0) { - if (itemstack.getItem() instanceof ItemSword && !(itemstack1.getItem() instanceof ItemSword)) { - flag = true; - } else if (itemstack.getItem() instanceof ItemSword && itemstack1.getItem() instanceof ItemSword) { - ItemSword itemsword = (ItemSword) itemstack.getItem(); - ItemSword itemsword1 = (ItemSword) itemstack1.getItem(); - - if (itemsword.i() == itemsword1.i()) { - flag = itemstack.getData() > itemstack1.getData() || itemstack.hasTag() && !itemstack1.hasTag(); - } else { - flag = itemsword.i() > itemsword1.i(); - } - } else { - flag = false; - } - } else if (itemstack.getItem() instanceof ItemArmor && !(itemstack1.getItem() instanceof ItemArmor)) { - flag = true; - } else if (itemstack.getItem() instanceof ItemArmor && itemstack1.getItem() instanceof ItemArmor) { - ItemArmor itemarmor = (ItemArmor) itemstack.getItem(); - ItemArmor itemarmor1 = (ItemArmor) itemstack1.getItem(); - - if (itemarmor.c == itemarmor1.c) { - flag = itemstack.getData() > itemstack1.getData() || itemstack.hasTag() && !itemstack1.hasTag(); - } else { - flag = itemarmor.c > itemarmor1.c; - } - } else { - flag = false; - } - } - - if (flag) { - if (itemstack1 != null && this.random.nextFloat() - 0.1F < this.dropChances[i]) { - this.a(itemstack1, 0.0F); - } - - if (itemstack.getItem() == Items.DIAMOND && entityitem.j() != null) { - EntityHuman entityhuman = this.world.a(entityitem.j()); - - if (entityhuman != null) { - entityhuman.a((Statistic) AchievementList.x); - } - } - - this.setEquipment(i, itemstack); - this.dropChances[i] = 2.0F; - this.persistent = true; - this.receive(entityitem, 1); - entityitem.die(); - } - } - } - } - } - - this.world.methodProfiler.b(); - } - - protected boolean bk() { - return false; - } - - protected boolean isTypeNotPersistent() { - return true; - } - - protected void w() { - if (this.persistent) { - this.aU = 0; - } else { - EntityHuman entityhuman = this.world.findNearbyPlayer(this, -1.0D); - - if (entityhuman != null) { - double d0 = entityhuman.locX - this.locX; - double d1 = entityhuman.locY - this.locY; - double d2 = entityhuman.locZ - this.locZ; - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 > 16384.0D) { // CraftBukkit - remove isTypeNotPersistent() check - this.die(); - } - - if (this.aU > 600 && this.random.nextInt(800) == 0 && d3 > 1024.0D) { // CraftBukkit - remove isTypeNotPersistent() check - this.die(); - } else if (d3 < 1024.0D) { - this.aU = 0; - } - } - } - } - - protected void bn() { - ++this.aU; - this.world.methodProfiler.a("checkDespawn"); - this.w(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("sensing"); - this.bq.a(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("targetSelector"); - this.targetSelector.a(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("goalSelector"); - this.goalSelector.a(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("navigation"); - this.navigation.f(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("mob tick"); - this.bp(); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("controls"); - this.world.methodProfiler.a("move"); - this.moveController.c(); - this.world.methodProfiler.c("look"); - this.lookController.a(); - this.world.methodProfiler.c("jump"); - this.bm.b(); - this.world.methodProfiler.b(); - this.world.methodProfiler.b(); - } - - protected void bq() { - super.bq(); - this.bd = 0.0F; - this.be = 0.0F; - this.w(); - float f = 8.0F; - - if (this.random.nextFloat() < 0.02F) { - EntityHuman entityhuman = this.world.findNearbyPlayer(this, (double) f); - - if (entityhuman != null) { - this.bu = entityhuman; - this.g = 10 + this.random.nextInt(20); - } else { - this.bf = (this.random.nextFloat() - 0.5F) * 20.0F; - } - } - - if (this.bu != null) { - this.a(this.bu, 10.0F, (float) this.x()); - if (this.g-- <= 0 || this.bu.dead || this.bu.f((Entity) this) > (double) (f * f)) { - this.bu = null; - } - } else { - if (this.random.nextFloat() < 0.05F) { - this.bf = (this.random.nextFloat() - 0.5F) * 20.0F; - } - - this.yaw += this.bf; - this.pitch = this.f; - } - - boolean flag = this.M(); - boolean flag1 = this.P(); - - if (flag || flag1) { - this.bc = this.random.nextFloat() < 0.8F; - } - } - - public int x() { - return 40; - } - - public void a(Entity entity, float f, float f1) { - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - double d2; - - if (entity instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) entity; - - d2 = entityliving.locY + (double) entityliving.getHeadHeight() - (this.locY + (double) this.getHeadHeight()); - } else { - d2 = (entity.boundingBox.b + entity.boundingBox.e) / 2.0D - (this.locY + (double) this.getHeadHeight()); - } - - double d3 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1); - float f2 = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - 90.0F; - float f3 = (float) (-(Math.atan2(d2, d3) * 180.0D / 3.1415927410125732D)); - - this.pitch = this.b(this.pitch, f3, f1); - this.yaw = this.b(this.yaw, f2, f); - } - - private float b(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } - - public boolean canSpawn() { - return this.world.b(this.boundingBox) && this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox); - } - - public int bB() { - return 4; - } - - public int ax() { - if (this.getGoalTarget() == null) { - return 3; - } else { - int i = (int) (this.getHealth() - this.getMaxHealth() * 0.33F); - - i -= (3 - this.world.difficulty.a()) * 4; - if (i < 0) { - i = 0; - } - - return i + 3; - } - } - - public ItemStack be() { - return this.equipment[0]; - } - - public ItemStack getEquipment(int i) { - return this.equipment[i]; - } - - public ItemStack r(int i) { - return this.equipment[i + 1]; - } - - public void setEquipment(int i, ItemStack itemstack) { - this.equipment[i] = itemstack; - } - - public ItemStack[] getEquipment() { - return this.equipment; - } - - protected void dropEquipment(boolean flag, int i) { - for (int j = 0; j < this.getEquipment().length; ++j) { - ItemStack itemstack = this.getEquipment(j); - boolean flag1 = this.dropChances[j] > 1.0F; - - if (itemstack != null && (flag || flag1) && this.random.nextFloat() - (float) i * 0.01F < this.dropChances[j]) { - if (!flag1 && itemstack.g()) { - int k = Math.max(itemstack.l() - 25, 1); - int l = itemstack.l() - this.random.nextInt(this.random.nextInt(k) + 1); - - if (l > k) { - l = k; - } - - if (l < 1) { - l = 1; - } - - itemstack.setData(l); - } - - this.a(itemstack, 0.0F); - } - } - } - - protected void bC() { - if (this.random.nextFloat() < 0.15F * this.world.b(this.locX, this.locY, this.locZ)) { - int i = this.random.nextInt(2); - float f = this.world.difficulty == EnumDifficulty.HARD ? 0.1F : 0.25F; - - if (this.random.nextFloat() < 0.095F) { - ++i; - } - - if (this.random.nextFloat() < 0.095F) { - ++i; - } - - if (this.random.nextFloat() < 0.095F) { - ++i; - } - - for (int j = 3; j >= 0; --j) { - ItemStack itemstack = this.r(j); - - if (j < 3 && this.random.nextFloat() < f) { - break; - } - - if (itemstack == null) { - Item item = a(j + 1, i); - - if (item != null) { - this.setEquipment(j + 1, new ItemStack(item)); - } - } - } - } - } - - public static int b(ItemStack itemstack) { - if (itemstack.getItem() != Item.getItemOf(Blocks.PUMPKIN) && itemstack.getItem() != Items.SKULL) { - if (itemstack.getItem() instanceof ItemArmor) { - switch (((ItemArmor) itemstack.getItem()).b) { - case 0: - return 4; - - case 1: - return 3; - - case 2: - return 2; - - case 3: - return 1; - } - } - - return 0; - } else { - return 4; - } - } - - public static Item a(int i, int j) { - switch (i) { - case 4: - if (j == 0) { - return Items.LEATHER_HELMET; - } else if (j == 1) { - return Items.GOLD_HELMET; - } else if (j == 2) { - return Items.CHAINMAIL_HELMET; - } else if (j == 3) { - return Items.IRON_HELMET; - } else if (j == 4) { - return Items.DIAMOND_HELMET; - } - - case 3: - if (j == 0) { - return Items.LEATHER_CHESTPLATE; - } else if (j == 1) { - return Items.GOLD_CHESTPLATE; - } else if (j == 2) { - return Items.CHAINMAIL_CHESTPLATE; - } else if (j == 3) { - return Items.IRON_CHESTPLATE; - } else if (j == 4) { - return Items.DIAMOND_CHESTPLATE; - } - - case 2: - if (j == 0) { - return Items.LEATHER_LEGGINGS; - } else if (j == 1) { - return Items.GOLD_LEGGINGS; - } else if (j == 2) { - return Items.CHAINMAIL_LEGGINGS; - } else if (j == 3) { - return Items.IRON_LEGGINGS; - } else if (j == 4) { - return Items.DIAMOND_LEGGINGS; - } - - case 1: - if (j == 0) { - return Items.LEATHER_BOOTS; - } else if (j == 1) { - return Items.GOLD_BOOTS; - } else if (j == 2) { - return Items.CHAINMAIL_BOOTS; - } else if (j == 3) { - return Items.IRON_BOOTS; - } else if (j == 4) { - return Items.DIAMOND_BOOTS; - } - - default: - return null; - } - } - - protected void bD() { - float f = this.world.b(this.locX, this.locY, this.locZ); - - if (this.be() != null && this.random.nextFloat() < 0.25F * f) { - EnchantmentManager.a(this.random, this.be(), (int) (5.0F + f * (float) this.random.nextInt(18))); - } - - for (int i = 0; i < 4; ++i) { - ItemStack itemstack = this.r(i); - - if (itemstack != null && this.random.nextFloat() < 0.5F * f) { - EnchantmentManager.a(this.random, itemstack, (int) (5.0F + f * (float) this.random.nextInt(18))); - } - } - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - this.getAttributeInstance(GenericAttributes.b).a(new AttributeModifier("Random spawn bonus", this.random.nextGaussian() * 0.05D, 1)); - return groupdataentity; - } - - public boolean bE() { - return false; - } - - public String getName() { - return this.hasCustomName() ? this.getCustomName() : super.getName(); - } - - public void bF() { - this.persistent = true; - } - - public void setCustomName(String s) { - this.datawatcher.watch(10, s); - } - - public String getCustomName() { - return this.datawatcher.getString(10); - } - - public boolean hasCustomName() { - return this.datawatcher.getString(10).length() > 0; - } - - public void setCustomNameVisible(boolean flag) { - this.datawatcher.watch(11, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - public boolean getCustomNameVisible() { - return this.datawatcher.getByte(11) == 1; - } - - public void a(int i, float f) { - this.dropChances[i] = f; - } - - public boolean bJ() { - return this.canPickUpLoot; - } - - public void h(boolean flag) { - this.canPickUpLoot = flag; - } - - public boolean isPersistent() { - return this.persistent; - } - - public final boolean c(EntityHuman entityhuman) { - if (this.bN() && this.getLeashHolder() == entityhuman) { - // CraftBukkit start - fire PlayerUnleashEntityEvent - if (CraftEventFactory.callPlayerUnleashEntityEvent(this, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); - return false; - } - // CraftBukkit end - this.unleash(true, !entityhuman.abilities.canInstantlyBuild); - return true; - } else { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.LEASH && this.bM()) { - if (!(this instanceof EntityTameableAnimal) || !((EntityTameableAnimal) this).isTamed()) { - // CraftBukkit start - fire PlayerLeashEntityEvent - if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); - return false; - } - // CraftBukkit end - this.setLeashHolder(entityhuman, true); - --itemstack.count; - return true; - } - - if (((EntityTameableAnimal) this).e(entityhuman)) { - // CraftBukkit start - fire PlayerLeashEntityEvent - if (CraftEventFactory.callPlayerLeashEntityEvent(this, entityhuman, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this, this.getLeashHolder())); - return false; - } - // CraftBukkit end - this.setLeashHolder(entityhuman, true); - --itemstack.count; - return true; - } - } - - return this.a(entityhuman) ? true : super.c(entityhuman); - } - } - - protected boolean a(EntityHuman entityhuman) { - return false; - } - - protected void bL() { - if (this.bx != null) { - this.bP(); - } - - if (this.bv) { - if (this.bw == null || this.bw.dead) { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.HOLDER_GONE)); // CraftBukkit - this.unleash(true, true); - } - } - } - - public void unleash(boolean flag, boolean flag1) { - if (this.bv) { - this.bv = false; - this.bw = null; - if (!this.world.isStatic && flag1) { - this.a(Items.LEASH, 1); - } - - if (!this.world.isStatic && flag && this.world instanceof WorldServer) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutAttachEntity(1, this, (Entity) null))); - } - } - } - - public boolean bM() { - return !this.bN() && !(this instanceof IMonster); - } - - public boolean bN() { - return this.bv; - } - - public Entity getLeashHolder() { - return this.bw; - } - - public void setLeashHolder(Entity entity, boolean flag) { - this.bv = true; - this.bw = entity; - if (!this.world.isStatic && flag && this.world instanceof WorldServer) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutAttachEntity(1, this, this.bw))); - } - } - - private void bP() { - if (this.bv && this.bx != null) { - if (this.bx.hasKeyOfType("UUIDMost", 4) && this.bx.hasKeyOfType("UUIDLeast", 4)) { - UUID uuid = new UUID(this.bx.getLong("UUIDMost"), this.bx.getLong("UUIDLeast")); - List list = this.world.a(EntityLiving.class, this.boundingBox.grow(10.0D, 10.0D, 10.0D)); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityLiving entityliving = (EntityLiving) iterator.next(); - - if (entityliving.getUniqueID().equals(uuid)) { - this.bw = entityliving; - break; - } - } - } else if (this.bx.hasKeyOfType("X", 99) && this.bx.hasKeyOfType("Y", 99) && this.bx.hasKeyOfType("Z", 99)) { - int i = this.bx.getInt("X"); - int j = this.bx.getInt("Y"); - int k = this.bx.getInt("Z"); - EntityLeash entityleash = EntityLeash.b(this.world, i, j, k); - - if (entityleash == null) { - entityleash = EntityLeash.a(this.world, i, j, k); - } - - this.bw = entityleash; - } else { - this.world.getServer().getPluginManager().callEvent(new EntityUnleashEvent(this.getBukkitEntity(), UnleashReason.UNKNOWN)); // CraftBukkit - this.unleash(false, true); - } - } - - this.bx = null; - } -} diff --git a/src/main/java/net/minecraft/server/EntityIronGolem.java b/src/main/java/net/minecraft/server/EntityIronGolem.java deleted file mode 100644 index a274d03c..00000000 --- a/src/main/java/net/minecraft/server/EntityIronGolem.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.minecraft.server; - -public class EntityIronGolem extends EntityGolem { - - private int bq; - Village bp; - private int br; - private int bs; - - public EntityIronGolem(World world) { - super(world); - this.a(1.4F, 2.9F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalMeleeAttack(this, 1.0D, true)); - this.goalSelector.a(2, new PathfinderGoalMoveTowardsTarget(this, 0.9D, 32.0F)); - this.goalSelector.a(3, new PathfinderGoalMoveThroughVillage(this, 0.6D, true)); - this.goalSelector.a(4, new PathfinderGoalMoveTowardsRestriction(this, 1.0D)); - this.goalSelector.a(5, new PathfinderGoalOfferFlower(this)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 0.6D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalDefendVillage(this)); - this.targetSelector.a(2, new PathfinderGoalHurtByTarget(this, false)); - this.targetSelector.a(3, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 0, false, true, IMonster.a)); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - public boolean bk() { - return true; - } - - protected void bp() { - if (--this.bq <= 0) { - this.bq = 70 + this.random.nextInt(50); - this.bp = this.world.villages.getClosestVillage(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ), 32); - if (this.bp == null) { - this.bX(); - } else { - ChunkCoordinates chunkcoordinates = this.bp.getCenter(); - - this.a(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, (int) ((float) this.bp.getSize() * 0.6F)); - } - } - - super.bp(); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(100.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - protected int j(int i) { - return i; - } - - protected void o(Entity entity) { - if (entity instanceof IMonster && this.aI().nextInt(20) == 0) { - // CraftBukkit start - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this, (EntityLiving) entity, org.bukkit.event.entity.EntityTargetEvent.TargetReason.COLLISION); - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.setGoalTarget(null); - } else { - this.setGoalTarget(((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle()); - } - } - // CraftBukkit end - } - - super.o(entity); - } - - public void e() { - super.e(); - if (this.br > 0) { - --this.br; - } - - if (this.bs > 0) { - --this.bs; - } - - if (this.motX * this.motX + this.motZ * this.motZ > 2.500000277905201E-7D && this.random.nextInt(5) == 0) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() != Material.AIR) { - this.world.addParticle("blockcrack_" + Block.getId(block) + "_" + this.world.getData(i, j, k), this.locX + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, this.boundingBox.b + 0.1D, this.locZ + ((double) this.random.nextFloat() - 0.5D) * (double) this.width, 4.0D * ((double) this.random.nextFloat() - 0.5D), 0.5D, ((double) this.random.nextFloat() - 0.5D) * 4.0D); - } - } - } - - public boolean a(Class oclass) { - return this.isPlayerCreated() && EntityHuman.class.isAssignableFrom(oclass) ? false : super.a(oclass); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("PlayerCreated", this.isPlayerCreated()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setPlayerCreated(nbttagcompound.getBoolean("PlayerCreated")); - } - - public boolean n(Entity entity) { - this.br = 10; - this.world.broadcastEntityEffect(this, (byte) 4); - boolean flag = entity.damageEntity(DamageSource.mobAttack(this), (float) (7 + this.random.nextInt(15))); - - if (flag) { - entity.motY += 0.4000000059604645D; - } - - this.makeSound("mob.irongolem.throw", 1.0F, 1.0F); - return flag; - } - - public Village bZ() { - return this.bp; - } - - public void a(boolean flag) { - this.bs = flag ? 400 : 0; - this.world.broadcastEntityEffect(this, (byte) 11); - } - - protected String aT() { - return "mob.irongolem.hit"; - } - - protected String aU() { - return "mob.irongolem.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.irongolem.walk", 1.0F, 1.0F); - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Item.getItemOf(Blocks.RED_ROSE), 1, 0.0F); - } - - k = 3 + this.random.nextInt(3); - - for (int l = 0; l < k; ++l) { - this.a(Items.IRON_INGOT, 1); - } - } - - public int cb() { - return this.bs; - } - - public boolean isPlayerCreated() { - return (this.datawatcher.getByte(16) & 1) != 0; - } - - public void setPlayerCreated(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 1))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -2))); - } - } - - public void die(DamageSource damagesource) { - if (!this.isPlayerCreated() && this.killer != null && this.bp != null) { - this.bp.a(this.killer.getName(), -5); - } - - super.die(damagesource); - } -} diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java deleted file mode 100644 index 394bfbf6..00000000 --- a/src/main/java/net/minecraft/server/EntityItem.java +++ /dev/null @@ -1,341 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.event.player.PlayerPickupItemEvent; // CraftBukkit - -public class EntityItem extends Entity { - - private static final Logger d = LogManager.getLogger(); - public int age; - public int pickupDelay; - private int e; - private String f; - private String g; - public float c; - private int lastTick = MinecraftServer.currentTick; // CraftBukkit - - public EntityItem(World world, double d0, double d1, double d2) { - super(world); - this.e = 5; - this.c = (float) (Math.random() * 3.141592653589793D * 2.0D); - this.a(0.25F, 0.25F); - this.height = this.length / 2.0F; - this.setPosition(d0, d1, d2); - this.yaw = (float) (Math.random() * 360.0D); - this.motX = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D)); - this.motY = 0.20000000298023224D; - this.motZ = (double) ((float) (Math.random() * 0.20000000298023224D - 0.10000000149011612D)); - } - - public EntityItem(World world, double d0, double d1, double d2, ItemStack itemstack) { - this(world, d0, d1, d2); - // CraftBukkit start - Can't set null items in the datawatcher - if (itemstack == null || itemstack.getItem() == null) { - return; - } - // CraftBukkit end - this.setItemStack(itemstack); - } - - protected boolean g_() { - return false; - } - - public EntityItem(World world) { - super(world); - this.e = 5; - this.c = (float) (Math.random() * 3.141592653589793D * 2.0D); - this.a(0.25F, 0.25F); - this.height = this.length / 2.0F; - } - - protected void c() { - this.getDataWatcher().add(10, 5); - } - - public void h() { - if (this.getItemStack() == null) { - this.die(); - } else { - super.h(); - // CraftBukkit start - Use wall time for pickup and despawn timers - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.pickupDelay -= elapsedTicks; - this.age += elapsedTicks; - this.lastTick = MinecraftServer.currentTick; - // CraftBukkit end - - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.03999999910593033D; - this.X = this.j(this.locX, (this.boundingBox.b + this.boundingBox.e) / 2.0D, this.locZ); - this.move(this.motX, this.motY, this.motZ); - boolean flag = (int) this.lastX != (int) this.locX || (int) this.lastY != (int) this.locY || (int) this.lastZ != (int) this.locZ; - - if (flag || this.ticksLived % 25 == 0) { - if (this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)).getMaterial() == Material.LAVA) { - this.motY = 0.20000000298023224D; - this.motX = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.motZ = (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F); - this.makeSound("random.fizz", 0.4F, 2.0F + this.random.nextFloat() * 0.4F); - } - - if (!this.world.isStatic) { - this.k(); - } - } - - float f = 0.98F; - - if (this.onGround) { - f = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.98F; - } - - this.motX *= (double) f; - this.motY *= 0.9800000190734863D; - this.motZ *= (double) f; - if (this.onGround) { - this.motY *= -0.5D; - } - - // ++this.age; // CraftBukkit - Moved up - if (!this.world.isStatic && this.age >= 6000) { - // CraftBukkit start - fire ItemDespawnEvent - if (org.bukkit.craftbukkit.event.CraftEventFactory.callItemDespawnEvent(this).isCancelled()) { - this.age = 0; - return; - } - // CraftBukkit end - this.die(); - } - } - } - - private void k() { - Iterator iterator = this.world.a(EntityItem.class, this.boundingBox.grow(0.5D, 0.0D, 0.5D)).iterator(); - - while (iterator.hasNext()) { - EntityItem entityitem = (EntityItem) iterator.next(); - - this.a(entityitem); - } - } - - public boolean a(EntityItem entityitem) { - if (entityitem == this) { - return false; - } else if (entityitem.isAlive() && this.isAlive()) { - ItemStack itemstack = this.getItemStack(); - ItemStack itemstack1 = entityitem.getItemStack(); - - if (itemstack1.getItem() != itemstack.getItem()) { - return false; - } else if (itemstack1.hasTag() ^ itemstack.hasTag()) { - return false; - } else if (itemstack1.hasTag() && !itemstack1.getTag().equals(itemstack.getTag())) { - return false; - } else if (itemstack1.getItem() == null) { - return false; - } else if (itemstack1.getItem().n() && itemstack1.getData() != itemstack.getData()) { - return false; - } else if (itemstack1.count < itemstack.count) { - return entityitem.a(this); - } else if (itemstack1.count + itemstack.count > itemstack1.getMaxStackSize()) { - return false; - } else { - itemstack1.count += itemstack.count; - entityitem.pickupDelay = Math.max(entityitem.pickupDelay, this.pickupDelay); - entityitem.age = Math.min(entityitem.age, this.age); - entityitem.setItemStack(itemstack1); - this.die(); - return true; - } - } else { - return false; - } - } - - public void e() { - this.age = 4800; - } - - public boolean N() { - return this.world.a(this.boundingBox, Material.WATER, (Entity) this); - } - - protected void burn(int i) { - this.damageEntity(DamageSource.FIRE, (float) i); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.getItemStack() != null && this.getItemStack().getItem() == Items.NETHER_STAR && damagesource.isExplosion()) { - return false; - } else { - this.Q(); - this.e = (int) ((float) this.e - f); - if (this.e <= 0) { - this.die(); - } - - return false; - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("Health", (short) ((byte) this.e)); - nbttagcompound.setShort("Age", (short) this.age); - if (this.j() != null) { - nbttagcompound.setString("Thrower", this.f); - } - - if (this.i() != null) { - nbttagcompound.setString("Owner", this.g); - } - - if (this.getItemStack() != null) { - nbttagcompound.set("Item", this.getItemStack().save(new NBTTagCompound())); - } - } - - public void a(NBTTagCompound nbttagcompound) { - this.e = nbttagcompound.getShort("Health") & 255; - this.age = nbttagcompound.getShort("Age"); - if (nbttagcompound.hasKey("Owner")) { - this.g = nbttagcompound.getString("Owner"); - } - - if (nbttagcompound.hasKey("Thrower")) { - this.f = nbttagcompound.getString("Thrower"); - } - - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); - - // CraftBukkit start - Handle missing "Item" compounds - if (nbttagcompound1 != null) { - ItemStack itemstack = ItemStack.createStack(nbttagcompound1); - if (itemstack != null) { - this.setItemStack(itemstack); - } else { - this.die(); - } - } else { - this.die(); - } - // CraftBukkit end - if (this.getItemStack() == null) { - this.die(); - } - } - - public void b_(EntityHuman entityhuman) { - if (!this.world.isStatic) { - ItemStack itemstack = this.getItemStack(); - int i = itemstack.count; - - // CraftBukkit start - fire PlayerPickupItemEvent - int canHold = entityhuman.inventory.canHold(itemstack); - int remaining = itemstack.count - canHold; - - if (this.pickupDelay <= 0 && canHold > 0) { - itemstack.count = canHold; - PlayerPickupItemEvent event = new PlayerPickupItemEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), (org.bukkit.entity.Item) this.getBukkitEntity(), remaining); - // event.setCancelled(!entityhuman.canPickUpLoot); TODO - this.world.getServer().getPluginManager().callEvent(event); - itemstack.count = canHold + remaining; - - if (event.isCancelled()) { - return; - } - - // Possibly < 0; fix here so we do not have to modify code below - this.pickupDelay = 0; - } - // CraftBukkit end - - if (this.pickupDelay == 0 && (this.g == null || 6000 - this.age <= 200 || this.g.equals(entityhuman.getName())) && entityhuman.inventory.pickup(itemstack)) { - if (itemstack.getItem() == Item.getItemOf(Blocks.LOG)) { - entityhuman.a((Statistic) AchievementList.g); - } - - if (itemstack.getItem() == Item.getItemOf(Blocks.LOG2)) { - entityhuman.a((Statistic) AchievementList.g); - } - - if (itemstack.getItem() == Items.LEATHER) { - entityhuman.a((Statistic) AchievementList.t); - } - - if (itemstack.getItem() == Items.DIAMOND) { - entityhuman.a((Statistic) AchievementList.w); - } - - if (itemstack.getItem() == Items.BLAZE_ROD) { - entityhuman.a((Statistic) AchievementList.A); - } - - if (itemstack.getItem() == Items.DIAMOND && this.j() != null) { - EntityHuman entityhuman1 = this.world.a(this.j()); - - if (entityhuman1 != null && entityhuman1 != entityhuman) { - entityhuman1.a((Statistic) AchievementList.x); - } - } - - this.world.makeSound(entityhuman, "random.pop", 0.2F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.7F + 1.0F) * 2.0F); - entityhuman.receive(this, i); - if (itemstack.count <= 0) { - this.die(); - } - } - } - } - - public String getName() { - return LocaleI18n.get("item." + this.getItemStack().a()); - } - - public boolean av() { - return false; - } - - public void b(int i) { - super.b(i); - if (!this.world.isStatic) { - this.k(); - } - } - - public ItemStack getItemStack() { - ItemStack itemstack = this.getDataWatcher().getItemStack(10); - - return itemstack == null ? new ItemStack(Blocks.STONE) : itemstack; - } - - public void setItemStack(ItemStack itemstack) { - this.getDataWatcher().watch(10, itemstack); - this.getDataWatcher().update(10); - } - - public String i() { - return this.g; - } - - public void a(String s) { - this.g = s; - } - - public String j() { - return this.f; - } - - public void b(String s) { - this.f = s; - } -} diff --git a/src/main/java/net/minecraft/server/EntityItemFrame.java b/src/main/java/net/minecraft/server/EntityItemFrame.java deleted file mode 100644 index d1d73f91..00000000 --- a/src/main/java/net/minecraft/server/EntityItemFrame.java +++ /dev/null @@ -1,152 +0,0 @@ -package net.minecraft.server; - -public class EntityItemFrame extends EntityHanging { - - private float e = 1.0F; - - public EntityItemFrame(World world) { - super(world); - } - - public EntityItemFrame(World world, int i, int j, int k, int l) { - super(world, i, j, k, l); - this.setDirection(l); - } - - protected void c() { - this.getDataWatcher().add(2, 5); - this.getDataWatcher().a(3, Byte.valueOf((byte) 0)); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.getItem() != null) { - if (!this.world.isStatic) { - // CraftBukkit start - fire EntityDamageEvent - if (org.bukkit.craftbukkit.event.CraftEventFactory.handleNonLivingEntityDamageEvent(this, damagesource, f, false) || this.dead) { - return true; - } - // CraftBukkit end - - this.b(damagesource.getEntity(), false); - this.setItem((ItemStack) null); - } - - return true; - } else { - return super.damageEntity(damagesource, f); - } - } - - public int f() { - return 9; - } - - public int i() { - return 9; - } - - public void b(Entity entity) { - this.b(entity, true); - } - - public void b(Entity entity, boolean flag) { - ItemStack itemstack = this.getItem(); - - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - if (entityhuman.abilities.canInstantlyBuild) { - this.b(itemstack); - return; - } - } - - if (flag) { - this.a(new ItemStack(Items.ITEM_FRAME), 0.0F); - } - - if (itemstack != null && this.random.nextFloat() < this.e) { - itemstack = itemstack.cloneItemStack(); - this.b(itemstack); - this.a(itemstack, 0.0F); - } - } - - private void b(ItemStack itemstack) { - if (itemstack != null) { - if (itemstack.getItem() == Items.MAP) { - WorldMap worldmap = ((ItemWorldMap) itemstack.getItem()).getSavedMap(itemstack, this.world); - - worldmap.decorations.remove("frame-" + this.getId()); - } - - itemstack.a((EntityItemFrame) null); - } - } - - public ItemStack getItem() { - return this.getDataWatcher().getItemStack(2); - } - - public void setItem(ItemStack itemstack) { - if (itemstack != null) { - itemstack = itemstack.cloneItemStack(); - itemstack.count = 1; - itemstack.a(this); - } - - this.getDataWatcher().watch(2, itemstack); - this.getDataWatcher().update(2); - } - - public int getRotation() { - return this.getDataWatcher().getByte(3); - } - - public void setRotation(int i) { - this.getDataWatcher().watch(3, Byte.valueOf((byte) (i % 4))); - } - - public void b(NBTTagCompound nbttagcompound) { - if (this.getItem() != null) { - nbttagcompound.set("Item", this.getItem().save(new NBTTagCompound())); - nbttagcompound.setByte("ItemRotation", (byte) this.getRotation()); - nbttagcompound.setFloat("ItemDropChance", this.e); - } - - super.b(nbttagcompound); - } - - public void a(NBTTagCompound nbttagcompound) { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); - - if (nbttagcompound1 != null && !nbttagcompound1.isEmpty()) { - this.setItem(ItemStack.createStack(nbttagcompound1)); - this.setRotation(nbttagcompound.getByte("ItemRotation")); - if (nbttagcompound.hasKeyOfType("ItemDropChance", 99)) { - this.e = nbttagcompound.getFloat("ItemDropChance"); - } - } - - super.a(nbttagcompound); - } - - public boolean c(EntityHuman entityhuman) { - if (this.getItem() == null) { - ItemStack itemstack = entityhuman.be(); - - if (itemstack != null && !this.world.isStatic) { - this.setItem(itemstack); - if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - } - } else if (!this.world.isStatic) { - this.setRotation(this.getRotation() + 1); - } - - return true; - } -} diff --git a/src/main/java/net/minecraft/server/EntityLargeFireball.java b/src/main/java/net/minecraft/server/EntityLargeFireball.java deleted file mode 100644 index 326f7ea6..00000000 --- a/src/main/java/net/minecraft/server/EntityLargeFireball.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit - -public class EntityLargeFireball extends EntityFireball { - - public int yield = 1; - - public EntityLargeFireball(World world) { - super(world); - } - - public EntityLargeFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world, entityliving, d0, d1, d2); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - if (movingobjectposition.entity != null) { - movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 6.0F); - } - - // CraftBukkit start - fire ExplosionPrimeEvent - ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(this.world.getServer(), this)); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - // give 'this' instead of (Entity) null so we know what causes the damage - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); - } - // CraftBukkit end - - this.die(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("ExplosionPower", this.yield); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("ExplosionPower", 99)) { - // CraftBukkit - set bukkitYield when setting explosionpower - this.bukkitYield = this.yield = nbttagcompound.getInt("ExplosionPower"); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityLeash.java b/src/main/java/net/minecraft/server/EntityLeash.java deleted file mode 100644 index 9b2ac823..00000000 --- a/src/main/java/net/minecraft/server/EntityLeash.java +++ /dev/null @@ -1,137 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityLeash extends EntityHanging { - - public EntityLeash(World world) { - super(world); - } - - public EntityLeash(World world, int i, int j, int k) { - super(world, i, j, k, 0); - this.setPosition((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D); - } - - protected void c() { - super.c(); - } - - public void setDirection(int i) {} - - public int f() { - return 9; - } - - public int i() { - return 9; - } - - public void b(Entity entity) {} - - public boolean d(NBTTagCompound nbttagcompound) { - return false; - } - - public void b(NBTTagCompound nbttagcompound) {} - - public void a(NBTTagCompound nbttagcompound) {} - - public boolean c(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.be(); - boolean flag = false; - double d0; - List list; - Iterator iterator; - EntityInsentient entityinsentient; - - if (itemstack != null && itemstack.getItem() == Items.LEASH && !this.world.isStatic) { - d0 = 7.0D; - list = this.world.a(EntityInsentient.class, AxisAlignedBB.a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); - if (list != null) { - iterator = list.iterator(); - - while (iterator.hasNext()) { - entityinsentient = (EntityInsentient) iterator.next(); - if (entityinsentient.bN() && entityinsentient.getLeashHolder() == entityhuman) { - // CraftBukkit start - if (CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, this, entityhuman).isCancelled()) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, entityinsentient, entityinsentient.getLeashHolder())); - continue; - } - // CraftBukkit end - entityinsentient.setLeashHolder(this, true); - flag = true; - } - } - } - } - - if (!this.world.isStatic && !flag) { - // CraftBukkit start - Move below - // this.die(); - boolean die = true; - // CraftBukkit end - if (true || entityhuman.abilities.canInstantlyBuild) { // CraftBukkit - Process for non-creative as well - d0 = 7.0D; - list = this.world.a(EntityInsentient.class, AxisAlignedBB.a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + d0, this.locZ + d0)); - if (list != null) { - iterator = list.iterator(); - - while (iterator.hasNext()) { - entityinsentient = (EntityInsentient) iterator.next(); - if (entityinsentient.bN() && entityinsentient.getLeashHolder() == this) { - // CraftBukkit start - if (CraftEventFactory.callPlayerUnleashEntityEvent(entityinsentient, entityhuman).isCancelled()) { - die = false; - continue; - } - entityinsentient.unleash(true, !entityhuman.abilities.canInstantlyBuild); // false -> survival mode boolean - // CraftBukkit end - } - } - } - } - // CraftBukkit start - if (die) { - this.die(); - } - // CraftBukkit end - } - - return true; - } - - public boolean survives() { - return this.world.getType(this.x, this.y, this.z).b() == 11; - } - - public static EntityLeash a(World world, int i, int j, int k) { - EntityLeash entityleash = new EntityLeash(world, i, j, k); - - entityleash.attachedToPlayer = true; - world.addEntity(entityleash); - return entityleash; - } - - public static EntityLeash b(World world, int i, int j, int k) { - List list = world.a(EntityLeash.class, AxisAlignedBB.a((double) i - 1.0D, (double) j - 1.0D, (double) k - 1.0D, (double) i + 1.0D, (double) j + 1.0D, (double) k + 1.0D)); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityLeash entityleash = (EntityLeash) iterator.next(); - - if (entityleash.x == i && entityleash.y == j && entityleash.z == k) { - return entityleash; - } - } - } - - return null; - } -} diff --git a/src/main/java/net/minecraft/server/EntityLightning.java b/src/main/java/net/minecraft/server/EntityLightning.java deleted file mode 100644 index 66402a05..00000000 --- a/src/main/java/net/minecraft/server/EntityLightning.java +++ /dev/null @@ -1,133 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityLightning extends EntityWeather { - - private int lifeTicks; - public long a; - private int c; - - // CraftBukkit start - public boolean isEffect = false; - - public EntityLightning(World world, double d0, double d1, double d2) { - this(world, d0, d1, d2, false); - } - - public EntityLightning(World world, double d0, double d1, double d2, boolean isEffect) { - // CraftBukkit end - - super(world); - - // CraftBukkit - Set isEffect - this.isEffect = isEffect; - - this.setPositionRotation(d0, d1, d2, 0.0F, 0.0F); - this.lifeTicks = 2; - this.a = this.random.nextLong(); - this.c = this.random.nextInt(3) + 1; - - // CraftBukkit - add "!isEffect" - if (!isEffect && !world.isStatic && world.getGameRules().getBoolean("doFireTick") && (world.difficulty == EnumDifficulty.NORMAL || world.difficulty == EnumDifficulty.HARD) && world.areChunksLoaded(MathHelper.floor(d0), MathHelper.floor(d1), MathHelper.floor(d2), 10)) { - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - - if (world.getType(i, j, k).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, i, j, k)) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(world, i, j, k, this).isCancelled()) { - world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - - for (i = 0; i < 4; ++i) { - j = MathHelper.floor(d0) + this.random.nextInt(3) - 1; - k = MathHelper.floor(d1) + this.random.nextInt(3) - 1; - int l = MathHelper.floor(d2) + this.random.nextInt(3) - 1; - - if (world.getType(j, k, l).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(world, j, k, l)) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(world, j, k, l, this).isCancelled()) { - world.setTypeUpdate(j, k, l, Blocks.FIRE); - } - // CraftBukkit end - } - } - } - } - - public void h() { - super.h(); - if (this.lifeTicks == 2) { - // CraftBukkit start - Use relative location for far away sounds - //this.world.makeSound(this.locX, this.locY, this.locZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.random.nextFloat() * 0.2F); - float pitch = 0.8F + this.random.nextFloat() * 0.2F; - int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; - for (EntityPlayer player : (List<EntityPlayer>) this.world.players) { - double deltaX = this.locX - player.locX; - double deltaZ = this.locZ - player.locZ; - double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; - if (distanceSquared > viewDistance * viewDistance) { - double deltaLength = Math.sqrt(distanceSquared); - double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; - double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; - player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", relativeX, this.locY, relativeZ, 10000.0F, pitch)); - } else { - player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect("ambient.weather.thunder", this.locX, this.locY, this.locZ, 10000.0F, pitch)); - } - } - // CraftBukkit end - this.world.makeSound(this.locX, this.locY, this.locZ, "random.explode", 2.0F, 0.5F + this.random.nextFloat() * 0.2F); - } - - --this.lifeTicks; - if (this.lifeTicks < 0) { - if (this.c == 0) { - this.die(); - } else if (this.lifeTicks < -this.random.nextInt(10)) { - --this.c; - this.lifeTicks = 1; - this.a = this.random.nextLong(); - // CraftBukkit - add "!isEffect" - if (!isEffect && !this.world.isStatic && this.world.getGameRules().getBoolean("doFireTick") && this.world.areChunksLoaded(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ), 10)) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.world.getType(i, j, k).getMaterial() == Material.AIR && Blocks.FIRE.canPlace(this.world, i, j, k)) { - // CraftBukkit start - if (!CraftEventFactory.callBlockIgniteEvent(world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - } - } - - if (this.lifeTicks >= 0 && !this.isEffect) { // CraftBukkit - add !this.isEffect - if (this.world.isStatic) { - this.world.q = 2; - } else { - double d0 = 3.0D; - List list = this.world.getEntities(this, AxisAlignedBB.a(this.locX - d0, this.locY - d0, this.locZ - d0, this.locX + d0, this.locY + 6.0D + d0, this.locZ + d0)); - - for (int l = 0; l < list.size(); ++l) { - Entity entity = (Entity) list.get(l); - - entity.a(this); - } - } - } - } - - protected void c() {} - - protected void a(NBTTagCompound nbttagcompound) {} - - protected void b(NBTTagCompound nbttagcompound) {} -} diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java deleted file mode 100644 index 0c63b2c6..00000000 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ /dev/null @@ -1,1720 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.UUID; - -// CraftBukkit start -import java.util.ArrayList; -import com.google.common.base.Function; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; -import org.bukkit.event.entity.EntityRegainHealthEvent; -// CraftBukkit end - -public abstract class EntityLiving extends Entity { - - private static final UUID b = UUID.fromString("662A6B8D-DA3E-4C1C-8813-96EA6097278D"); - private static final AttributeModifier c = (new AttributeModifier(b, "Sprinting speed boost", 0.30000001192092896D, 2)).a(false); - private AttributeMapBase d; - public CombatTracker combatTracker = new CombatTracker(this); // CraftBukkit - private -> public, remove final - public final HashMap effects = new HashMap(); // CraftBukkit - protected -> public - private final ItemStack[] g = new ItemStack[5]; - public boolean at; - public int au; - public int av; - public float aw; - public int hurtTicks; - public int ay; - public float az; - public int deathTicks; - public int attackTicks; - public float aC; - public float aD; - public float aE; - public float aF; - public float aG; - public int maxNoDamageTicks = 20; - public float aI; - public float aJ; - public float aK; - public float aL; - public float aM; - public float aN; - public float aO; - public float aP; - public float aQ = 0.02F; - public EntityHuman killer; // CraftBukkit - protected -> public - protected int lastDamageByPlayerTime; - protected boolean aT; - protected int aU; - protected float aV; - protected float aW; - protected float aX; - protected float aY; - protected float aZ; - protected int ba; - public float lastDamage; // CraftBukkit - protected -> public - protected boolean bc; - public float bd; - public float be; - protected float bf; - protected int bg; - protected double bh; - protected double bi; - protected double bj; - protected double bk; - protected double bl; - public boolean updateEffects = true; // CraftBukkit - private -> public - public EntityLiving lastDamager; // CraftBukkit - private -> public - private int bm; - private EntityLiving bn; - private int bo; - private float bp; - private int bq; - private float br; - // CraftBukkit start - public int expToDrop; - public int maxAirTicks = 300; - ArrayList<org.bukkit.inventory.ItemStack> drops = null; - // CraftBukkit end - - public EntityLiving(World world) { - super(world); - this.aD(); - // CraftBukkit - setHealth(getMaxHealth()) inlined and simplified to skip the instanceof check for EntityPlayer, as getBukkitEntity() is not initialized in constructor - this.datawatcher.watch(6, (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue()); - this.k = true; - this.aL = (float) (Math.random() + 1.0D) * 0.01F; - this.setPosition(this.locX, this.locY, this.locZ); - this.aK = (float) Math.random() * 12398.0F; - this.yaw = (float) (Math.random() * 3.1415927410125732D * 2.0D); - this.aO = this.yaw; - this.W = 0.5F; - } - - protected void c() { - this.datawatcher.a(7, Integer.valueOf(0)); - this.datawatcher.a(8, Byte.valueOf((byte) 0)); - this.datawatcher.a(9, Byte.valueOf((byte) 0)); - this.datawatcher.a(6, Float.valueOf(1.0F)); - } - - protected void aD() { - this.getAttributeMap().b(GenericAttributes.maxHealth); - this.getAttributeMap().b(GenericAttributes.c); - this.getAttributeMap().b(GenericAttributes.d); - if (!this.bk()) { - this.getAttributeInstance(GenericAttributes.d).setValue(0.10000000149011612D); - } - } - - protected void a(double d0, boolean flag) { - if (!this.M()) { - this.N(); - } - - if (flag && this.fallDistance > 0.0F) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() == Material.AIR) { - int l = this.world.getType(i, j - 1, k).b(); - - if (l == 11 || l == 32 || l == 21) { - block = this.world.getType(i, j - 1, k); - } - } else if (!this.world.isStatic && this.fallDistance > 3.0F) { - // CraftBukkit start - supply player as argument in particles for visibility API to work - if (this instanceof EntityPlayer) { - this.world.a((EntityHuman) this, 2006, i, j, k, MathHelper.f(this.fallDistance - 3.0F)); - ((EntityPlayer) this).playerConnection.sendPacket(new PacketPlayOutWorldEvent(2006, i, j, k, MathHelper.f(this.fallDistance - 3.0F), false)); - } else { - this.world.triggerEffect(2006, i, j, k, MathHelper.f(this.fallDistance - 3.0F)); - } - // CraftBukkit end - } - - block.a(this.world, i, j, k, this, this.fallDistance); - } - - super.a(d0, flag); - } - - public boolean aE() { - return false; - } - - public void C() { - this.aC = this.aD; - super.C(); - this.world.methodProfiler.a("livingEntityBaseTick"); - if (this.isAlive() && this.inBlock()) { - this.damageEntity(DamageSource.STUCK, 1.0F); - } - - if (this.isFireproof() || this.world.isStatic) { - this.extinguish(); - } - - boolean flag = this instanceof EntityHuman && ((EntityHuman) this).abilities.isInvulnerable; - - if (this.isAlive() && this.a(Material.WATER)) { - if (!this.aE() && !this.hasEffect(MobEffectList.WATER_BREATHING.id) && !flag) { - this.setAirTicks(this.j(this.getAirTicks())); - if (this.getAirTicks() == -20) { - this.setAirTicks(0); - - for (int i = 0; i < 8; ++i) { - float f = this.random.nextFloat() - this.random.nextFloat(); - float f1 = this.random.nextFloat() - this.random.nextFloat(); - float f2 = this.random.nextFloat() - this.random.nextFloat(); - - this.world.addParticle("bubble", this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, this.motX, this.motY, this.motZ); - } - - this.damageEntity(DamageSource.DROWN, 2.0F); - } - } - - if (!this.world.isStatic && this.am() && this.vehicle instanceof EntityLiving) { - this.mount((Entity) null); - } - } else { - // CraftBukkit start - Only set if needed to work around a DataWatcher inefficiency - if (this.getAirTicks() != 300) { - this.setAirTicks(maxAirTicks); - } - // CraftBukkit end - } - - if (this.isAlive() && this.L()) { - this.extinguish(); - } - - this.aI = this.aJ; - if (this.attackTicks > 0) { - --this.attackTicks; - } - - if (this.hurtTicks > 0) { - --this.hurtTicks; - } - - if (this.noDamageTicks > 0 && !(this instanceof EntityPlayer)) { - --this.noDamageTicks; - } - - if (this.getHealth() <= 0.0F) { - this.aF(); - } - - if (this.lastDamageByPlayerTime > 0) { - --this.lastDamageByPlayerTime; - } else { - this.killer = null; - } - - if (this.bn != null && !this.bn.isAlive()) { - this.bn = null; - } - - if (this.lastDamager != null) { - if (!this.lastDamager.isAlive()) { - this.b((EntityLiving) null); - } else if (this.ticksLived - this.bm > 100) { - this.b((EntityLiving) null); - } - } - - this.aO(); - this.aY = this.aX; - this.aN = this.aM; - this.aP = this.aO; - this.lastYaw = this.yaw; - this.lastPitch = this.pitch; - this.world.methodProfiler.b(); - } - - // CraftBukkit start - public int getExpReward() { - int exp = this.getExpValue(this.killer); - - if (!this.world.isStatic && (this.lastDamageByPlayerTime > 0 || this.alwaysGivesExp()) && this.aG() && this.world.getGameRules().getBoolean("doMobLoot")) { - return exp; - } else { - return 0; - } - } - // CraftBukkit end - - public boolean isBaby() { - return false; - } - - protected void aF() { - ++this.deathTicks; - if (this.deathTicks >= 20 && !this.dead) { // CraftBukkit - (this.deathTicks == 20) -> (this.deathTicks >= 20 && !this.dead) - int i; - - // CraftBukkit start - Update getExpReward() above if the removed if() changes! - i = this.expToDrop; - while (i > 0) { - int j = EntityExperienceOrb.getOrbValue(i); - - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - this.expToDrop = 0; - // CraftBukkit end - - this.die(); - - for (i = 0; i < 20; ++i) { - double d0 = this.random.nextGaussian() * 0.02D; - double d1 = this.random.nextGaussian() * 0.02D; - double d2 = this.random.nextGaussian() * 0.02D; - - this.world.addParticle("explode", this.locX + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, this.locY + (double) (this.random.nextFloat() * this.length), this.locZ + (double) (this.random.nextFloat() * this.width * 2.0F) - (double) this.width, d0, d1, d2); - } - } - } - - protected boolean aG() { - return !this.isBaby(); - } - - protected int j(int i) { - int j = EnchantmentManager.getOxygenEnchantmentLevel(this); - - return j > 0 && this.random.nextInt(j + 1) > 0 ? i : i - 1; - } - - protected int getExpValue(EntityHuman entityhuman) { - return 0; - } - - protected boolean alwaysGivesExp() { - return false; - } - - public Random aI() { - return this.random; - } - - public EntityLiving getLastDamager() { - return this.lastDamager; - } - - public int aK() { - return this.bm; - } - - public void b(EntityLiving entityliving) { - this.lastDamager = entityliving; - this.bm = this.ticksLived; - } - - public EntityLiving aL() { - return this.bn; - } - - public int aM() { - return this.bo; - } - - public void l(Entity entity) { - if (entity instanceof EntityLiving) { - this.bn = (EntityLiving) entity; - } else { - this.bn = null; - } - - this.bo = this.ticksLived; - } - - public int aN() { - return this.aU; - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setFloat("HealF", this.getHealth()); - nbttagcompound.setShort("Health", (short) ((int) Math.ceil((double) this.getHealth()))); - nbttagcompound.setShort("HurtTime", (short) this.hurtTicks); - nbttagcompound.setShort("DeathTime", (short) this.deathTicks); - nbttagcompound.setShort("AttackTime", (short) this.attackTicks); - nbttagcompound.setFloat("AbsorptionAmount", this.getAbsorptionHearts()); - ItemStack[] aitemstack = this.getEquipment(); - int i = aitemstack.length; - - int j; - ItemStack itemstack; - - for (j = 0; j < i; ++j) { - itemstack = aitemstack[j]; - if (itemstack != null) { - this.d.a(itemstack.D()); - } - } - - nbttagcompound.set("Attributes", GenericAttributes.a(this.getAttributeMap())); - aitemstack = this.getEquipment(); - i = aitemstack.length; - - for (j = 0; j < i; ++j) { - itemstack = aitemstack[j]; - if (itemstack != null) { - this.d.b(itemstack.D()); - } - } - - if (!this.effects.isEmpty()) { - NBTTagList nbttaglist = new NBTTagList(); - Iterator iterator = this.effects.values().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - nbttaglist.add(mobeffect.a(new NBTTagCompound())); - } - - nbttagcompound.set("ActiveEffects", nbttaglist); - } - } - - public void a(NBTTagCompound nbttagcompound) { - this.setAbsorptionHearts(nbttagcompound.getFloat("AbsorptionAmount")); - if (nbttagcompound.hasKeyOfType("Attributes", 9) && this.world != null && !this.world.isStatic) { - GenericAttributes.a(this.getAttributeMap(), nbttagcompound.getList("Attributes", 10)); - } - - if (nbttagcompound.hasKeyOfType("ActiveEffects", 9)) { - NBTTagList nbttaglist = nbttagcompound.getList("ActiveEffects", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - MobEffect mobeffect = MobEffect.b(nbttagcompound1); - - if (mobeffect != null) { - this.effects.put(Integer.valueOf(mobeffect.getEffectId()), mobeffect); - } - } - } - - // CraftBukkit start - if (nbttagcompound.hasKey("Bukkit.MaxHealth")) { - NBTBase nbtbase = nbttagcompound.get("Bukkit.MaxHealth"); - if (nbtbase.getTypeId() == 5) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagFloat) nbtbase).c()); - } else if (nbtbase.getTypeId() == 3) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) ((NBTTagInt) nbtbase).d()); - } - } - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("HealF", 99)) { - this.setHealth(nbttagcompound.getFloat("HealF")); - } else { - NBTBase nbtbase = nbttagcompound.get("Health"); - - if (nbtbase == null) { - this.setHealth(this.getMaxHealth()); - } else if (nbtbase.getTypeId() == 5) { - this.setHealth(((NBTTagFloat) nbtbase).h()); - } else if (nbtbase.getTypeId() == 2) { - this.setHealth((float) ((NBTTagShort) nbtbase).e()); - } - } - - this.hurtTicks = nbttagcompound.getShort("HurtTime"); - this.deathTicks = nbttagcompound.getShort("DeathTime"); - this.attackTicks = nbttagcompound.getShort("AttackTime"); - } - - protected void aO() { - Iterator iterator = this.effects.keySet().iterator(); - - while (iterator.hasNext()) { - Integer integer = (Integer) iterator.next(); - MobEffect mobeffect = (MobEffect) this.effects.get(integer); - - if (!mobeffect.tick(this)) { - if (!this.world.isStatic) { - iterator.remove(); - this.b(mobeffect); - } - } else if (mobeffect.getDuration() % 600 == 0) { - this.a(mobeffect, false); - } - } - - int i; - - if (this.updateEffects) { - if (!this.world.isStatic) { - if (this.effects.isEmpty()) { - this.datawatcher.watch(8, Byte.valueOf((byte) 0)); - this.datawatcher.watch(7, Integer.valueOf(0)); - this.setInvisible(false); - } else { - i = PotionBrewer.a(this.effects.values()); - this.datawatcher.watch(8, Byte.valueOf((byte) (PotionBrewer.b(this.effects.values()) ? 1 : 0))); - this.datawatcher.watch(7, Integer.valueOf(i)); - this.setInvisible(this.hasEffect(MobEffectList.INVISIBILITY.id)); - } - } - - this.updateEffects = false; - } - - i = this.datawatcher.getInt(7); - boolean flag = this.datawatcher.getByte(8) > 0; - - if (i > 0) { - boolean flag1 = false; - - if (!this.isInvisible()) { - flag1 = this.random.nextBoolean(); - } else { - flag1 = this.random.nextInt(15) == 0; - } - - if (flag) { - flag1 &= this.random.nextInt(5) == 0; - } - - if (flag1 && i > 0) { - double d0 = (double) (i >> 16 & 255) / 255.0D; - double d1 = (double) (i >> 8 & 255) / 255.0D; - double d2 = (double) (i >> 0 & 255) / 255.0D; - - this.world.addParticle(flag ? "mobSpellAmbient" : "mobSpell", this.locX + (this.random.nextDouble() - 0.5D) * (double) this.width, this.locY + this.random.nextDouble() * (double) this.length - (double) this.height, this.locZ + (this.random.nextDouble() - 0.5D) * (double) this.width, d0, d1, d2); - } - } - } - - public void removeAllEffects() { - Iterator iterator = this.effects.keySet().iterator(); - - while (iterator.hasNext()) { - Integer integer = (Integer) iterator.next(); - MobEffect mobeffect = (MobEffect) this.effects.get(integer); - - if (!this.world.isStatic) { - iterator.remove(); - this.b(mobeffect); - } - } - } - - public Collection getEffects() { - return this.effects.values(); - } - - public boolean hasEffect(int i) { - // CraftBukkit - Add size check for efficiency - return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(i)); - } - - public boolean hasEffect(MobEffectList mobeffectlist) { - // CraftBukkit - Add size check for efficiency - return this.effects.size() != 0 && this.effects.containsKey(Integer.valueOf(mobeffectlist.id)); - } - - public MobEffect getEffect(MobEffectList mobeffectlist) { - return (MobEffect) this.effects.get(Integer.valueOf(mobeffectlist.id)); - } - - public void addEffect(MobEffect mobeffect) { - if (this.d(mobeffect)) { - if (this.effects.containsKey(Integer.valueOf(mobeffect.getEffectId()))) { - ((MobEffect) this.effects.get(Integer.valueOf(mobeffect.getEffectId()))).a(mobeffect); - this.a((MobEffect) this.effects.get(Integer.valueOf(mobeffect.getEffectId())), true); - } else { - this.effects.put(Integer.valueOf(mobeffect.getEffectId()), mobeffect); - this.a(mobeffect); - } - } - } - - public boolean d(MobEffect mobeffect) { - if (this.getMonsterType() == EnumMonsterType.UNDEAD) { - int i = mobeffect.getEffectId(); - - if (i == MobEffectList.REGENERATION.id || i == MobEffectList.POISON.id) { - return false; - } - } - - return true; - } - - public boolean aR() { - return this.getMonsterType() == EnumMonsterType.UNDEAD; - } - - public void removeEffect(int i) { - MobEffect mobeffect = (MobEffect) this.effects.remove(Integer.valueOf(i)); - - if (mobeffect != null) { - this.b(mobeffect); - } - } - - protected void a(MobEffect mobeffect) { - this.updateEffects = true; - if (!this.world.isStatic) { - MobEffectList.byId[mobeffect.getEffectId()].b(this, this.getAttributeMap(), mobeffect.getAmplifier()); - } - } - - protected void a(MobEffect mobeffect, boolean flag) { - this.updateEffects = true; - if (flag && !this.world.isStatic) { - MobEffectList.byId[mobeffect.getEffectId()].a(this, this.getAttributeMap(), mobeffect.getAmplifier()); - MobEffectList.byId[mobeffect.getEffectId()].b(this, this.getAttributeMap(), mobeffect.getAmplifier()); - } - } - - protected void b(MobEffect mobeffect) { - this.updateEffects = true; - if (!this.world.isStatic) { - MobEffectList.byId[mobeffect.getEffectId()].a(this, this.getAttributeMap(), mobeffect.getAmplifier()); - } - } - - // CraftBukkit start - Delegate so we can handle providing a reason for health being regained - public void heal(float f) { - heal(f, EntityRegainHealthEvent.RegainReason.CUSTOM); - } - - public void heal(float f, EntityRegainHealthEvent.RegainReason regainReason) { - float f1 = this.getHealth(); - - if (f1 > 0.0F) { - EntityRegainHealthEvent event = new EntityRegainHealthEvent(this.getBukkitEntity(), f, regainReason); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setHealth((float) (this.getHealth() + event.getAmount())); - } - } - } - - public final float getHealth() { - // CraftBukkit start - Use unscaled health - if (this instanceof EntityPlayer) { - return (float) ((EntityPlayer) this).getBukkitEntity().getHealth(); - } - // CraftBukkit end - return this.datawatcher.getFloat(6); - } - - public void setHealth(float f) { - // CraftBukkit start - Handle scaled health - if (this instanceof EntityPlayer) { - org.bukkit.craftbukkit.entity.CraftPlayer player = ((EntityPlayer) this).getBukkitEntity(); - // Squeeze - if (f < 0.0F) { - player.setRealHealth(0.0D); - } else if (f > player.getMaxHealth()) { - player.setRealHealth(player.getMaxHealth()); - } else { - player.setRealHealth(f); - } - - this.datawatcher.watch(6, Float.valueOf(player.getScaledHealth())); - return; - } - // CraftBukkit end - this.datawatcher.watch(6, Float.valueOf(MathHelper.a(f, 0.0F, this.getMaxHealth()))); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (this.world.isStatic) { - return false; - } else { - this.aU = 0; - if (this.getHealth() <= 0.0F) { - return false; - } else if (damagesource.o() && this.hasEffect(MobEffectList.FIRE_RESISTANCE)) { - return false; - } else { - // CraftBukkit - Moved into d(DamageSource, float) - if (false && (damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { - this.getEquipment(4).damage((int) (f * 4.0F + this.random.nextFloat() * f * 2.0F), this); - f *= 0.75F; - } - - this.aF = 1.5F; - boolean flag = true; - - if ((float) this.noDamageTicks > (float) this.maxNoDamageTicks / 2.0F) { - if (f <= this.lastDamage) { - return false; - } - - // CraftBukkit start - if (!this.d(damagesource, f - this.lastDamage)) { - return false; - } - // CraftBukkit end - this.lastDamage = f; - flag = false; - } else { - // CraftBukkit start - float previousHealth = this.getHealth(); - if (!this.d(damagesource, f)) { - return false; - } - this.lastDamage = f; - this.aw = previousHealth; - this.noDamageTicks = this.maxNoDamageTicks; - // CraftBukkit end - this.hurtTicks = this.ay = 10; - } - - this.az = 0.0F; - Entity entity = damagesource.getEntity(); - - if (entity != null) { - if (entity instanceof EntityLiving) { - this.b((EntityLiving) entity); - } - - if (entity instanceof EntityHuman) { - this.lastDamageByPlayerTime = 100; - this.killer = (EntityHuman) entity; - } else if (entity instanceof EntityWolf) { - EntityWolf entitywolf = (EntityWolf) entity; - - if (entitywolf.isTamed()) { - this.lastDamageByPlayerTime = 100; - this.killer = null; - } - } - } - - if (flag) { - this.world.broadcastEntityEffect(this, (byte) 2); - if (damagesource != DamageSource.DROWN) { - this.Q(); - } - - if (entity != null) { - double d0 = entity.locX - this.locX; - - double d1; - - for (d1 = entity.locZ - this.locZ; d0 * d0 + d1 * d1 < 1.0E-4D; d1 = (Math.random() - Math.random()) * 0.01D) { - d0 = (Math.random() - Math.random()) * 0.01D; - } - - this.az = (float) (Math.atan2(d1, d0) * 180.0D / 3.1415927410125732D) - this.yaw; - this.a(entity, f, d0, d1); - } else { - this.az = (float) ((int) (Math.random() * 2.0D) * 180); - } - } - - String s; - - if (this.getHealth() <= 0.0F) { - s = this.aU(); - if (flag && s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - - this.die(damagesource); - } else { - s = this.aT(); - if (flag && s != null) { - this.makeSound(s, this.bf(), this.bg()); - } - } - - return true; - } - } - } - - public void a(ItemStack itemstack) { - this.makeSound("random.break", 0.8F, 0.8F + this.world.random.nextFloat() * 0.4F); - - for (int i = 0; i < 5; ++i) { - Vec3D vec3d = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.1D, Math.random() * 0.1D + 0.1D, 0.0D); - - vec3d.a(-this.pitch * 3.1415927F / 180.0F); - vec3d.b(-this.yaw * 3.1415927F / 180.0F); - Vec3D vec3d1 = Vec3D.a(((double) this.random.nextFloat() - 0.5D) * 0.3D, (double) (-this.random.nextFloat()) * 0.6D - 0.3D, 0.6D); - - vec3d1.a(-this.pitch * 3.1415927F / 180.0F); - vec3d1.b(-this.yaw * 3.1415927F / 180.0F); - vec3d1 = vec3d1.add(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ); - this.world.addParticle("iconcrack_" + Item.getId(itemstack.getItem()), vec3d1.a, vec3d1.b, vec3d1.c, vec3d.a, vec3d.b + 0.05D, vec3d.c); - } - } - - public void die(DamageSource damagesource) { - Entity entity = damagesource.getEntity(); - EntityLiving entityliving = this.aX(); - - if (this.ba >= 0 && entityliving != null) { - entityliving.b(this, this.ba); - } - - if (entity != null) { - entity.a(this); - } - - this.aT = true; - this.aW().g(); - if (!this.world.isStatic) { - int i = 0; - - if (entity instanceof EntityHuman) { - i = EnchantmentManager.getBonusMonsterLootEnchantmentLevel((EntityLiving) entity); - } - - if (this.aG() && this.world.getGameRules().getBoolean("doMobLoot")) { - this.drops = new ArrayList<org.bukkit.inventory.ItemStack>(); // CraftBukkit - Setup drop capture - - this.dropDeathLoot(this.lastDamageByPlayerTime > 0, i); - this.dropEquipment(this.lastDamageByPlayerTime > 0, i); - if (this.lastDamageByPlayerTime > 0) { - int j = this.random.nextInt(200) - i; - - if (j < 5) { - this.getRareDrop(j <= 0 ? 1 : 0); - } - } - - // CraftBukkit start - Call death event - CraftEventFactory.callEntityDeathEvent(this, this.drops); - this.drops = null; - } else { - CraftEventFactory.callEntityDeathEvent(this); - // CraftBukkit end - } - } - - this.world.broadcastEntityEffect(this, (byte) 3); - } - - protected void dropEquipment(boolean flag, int i) {} - - public void a(Entity entity, float f, double d0, double d1) { - if (this.random.nextDouble() >= this.getAttributeInstance(GenericAttributes.c).getValue()) { - this.al = true; - float f1 = MathHelper.sqrt(d0 * d0 + d1 * d1); - float f2 = 0.4F; - - this.motX /= 2.0D; - this.motY /= 2.0D; - this.motZ /= 2.0D; - this.motX -= d0 / (double) f1 * (double) f2; - this.motY += (double) f2; - this.motZ -= d1 / (double) f1 * (double) f2; - if (this.motY > 0.4000000059604645D) { - this.motY = 0.4000000059604645D; - } - } - } - - protected String aT() { - return "game.neutral.hurt"; - } - - protected String aU() { - return "game.neutral.die"; - } - - protected void getRareDrop(int i) {} - - protected void dropDeathLoot(boolean flag, int i) {} - - public boolean h_() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - Block block = this.world.getType(i, j, k); - - return block == Blocks.LADDER || block == Blocks.VINE; - } - - public boolean isAlive() { - return !this.dead && this.getHealth() > 0.0F; - } - - protected void b(float f) { - super.b(f); - MobEffect mobeffect = this.getEffect(MobEffectList.JUMP); - float f1 = mobeffect != null ? (float) (mobeffect.getAmplifier() + 1) : 0.0F; - int i = MathHelper.f(f - 3.0F - f1); - - if (i > 0) { - // CraftBukkit start - if (!this.damageEntity(DamageSource.FALL, (float) i)) { - return; - } - // CraftBukkit end - this.makeSound(this.o(i), 1.0F, 1.0F); - // this.damageEntity(DamageSource.FALL, (float) i); // CraftBukkit - moved up - int j = MathHelper.floor(this.locX); - int k = MathHelper.floor(this.locY - 0.20000000298023224D - (double) this.height); - int l = MathHelper.floor(this.locZ); - Block block = this.world.getType(j, k, l); - - if (block.getMaterial() != Material.AIR) { - StepSound stepsound = block.stepSound; - - this.makeSound(stepsound.getStepSound(), stepsound.getVolume1() * 0.5F, stepsound.getVolume2() * 0.75F); - } - } - } - - protected String o(int i) { - return i > 4 ? "game.neutral.hurt.fall.big" : "game.neutral.hurt.fall.small"; - } - - public int aV() { - int i = 0; - ItemStack[] aitemstack = this.getEquipment(); - int j = aitemstack.length; - - for (int k = 0; k < j; ++k) { - ItemStack itemstack = aitemstack[k]; - - if (itemstack != null && itemstack.getItem() instanceof ItemArmor) { - int l = ((ItemArmor) itemstack.getItem()).c; - - i += l; - } - } - - return i; - } - - protected void damageArmor(float f) {} - - protected float applyArmorModifier(DamageSource damagesource, float f) { - if (!damagesource.ignoresArmor()) { - int i = 25 - this.aV(); - float f1 = f * (float) i; - - // this.damageArmor(f); // CraftBukkit - Moved into d(DamageSource, float) - f = f1 / 25.0F; - } - - return f; - } - - protected float applyMagicModifier(DamageSource damagesource, float f) { - if (damagesource.isStarvation()) { - return f; - } else { - if (this instanceof EntityZombie) { - f = f; - } - - int i; - int j; - float f1; - - // CraftBukkit - Moved to d(DamageSource, float) - if (false && this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { - i = (this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; - j = 25 - i; - f1 = f * (float) j; - f = f1 / 25.0F; - } - - if (f <= 0.0F) { - return 0.0F; - } else { - i = EnchantmentManager.a(this.getEquipment(), damagesource); - if (i > 20) { - i = 20; - } - - if (i > 0 && i <= 20) { - j = 25 - i; - f1 = f * (float) j; - f = f1 / 25.0F; - } - - return f; - } - } - } - - // CraftBukkit start - protected boolean d(final DamageSource damagesource, float f) { // void -> boolean, add final - if (!this.isInvulnerable()) { - final boolean human = this instanceof EntityHuman; - float originalDamage = f; - Function<Double, Double> hardHat = new Function<Double, Double>() { - @Override - public Double apply(Double f) { - if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && EntityLiving.this.getEquipment(4) != null) { - return -(f - (f * 0.75F)); - } - return -0.0; - } - }; - float hardHatModifier = hardHat.apply((double) f).floatValue(); - f += hardHatModifier; - - Function<Double, Double> blocking = new Function<Double, Double>() { - @Override - public Double apply(Double f) { - if (human) { - if (!damagesource.ignoresArmor() && ((EntityHuman) EntityLiving.this).isBlocking() && f > 0.0F) { - return -(f - ((1.0F + f) * 0.5F)); - } - } - return -0.0; - } - }; - float blockingModifier = blocking.apply((double) f).floatValue(); - f += blockingModifier; - - Function<Double, Double> armor = new Function<Double, Double>() { - @Override - public Double apply(Double f) { - return -(f - EntityLiving.this.applyArmorModifier(damagesource, f.floatValue())); - } - }; - float armorModifier = armor.apply((double) f).floatValue(); - f += armorModifier; - - Function<Double, Double> resistance = new Function<Double, Double>() { - @Override - public Double apply(Double f) { - if (!damagesource.isStarvation() && EntityLiving.this.hasEffect(MobEffectList.RESISTANCE) && damagesource != DamageSource.OUT_OF_WORLD) { - int i = (EntityLiving.this.getEffect(MobEffectList.RESISTANCE).getAmplifier() + 1) * 5; - int j = 25 - i; - float f1 = f.floatValue() * (float) j; - return -(f - (f1 / 25.0F)); - } - return -0.0; - } - }; - float resistanceModifier = resistance.apply((double) f).floatValue(); - f += resistanceModifier; - - Function<Double, Double> magic = new Function<Double, Double>() { - @Override - public Double apply(Double f) { - return -(f - EntityLiving.this.applyMagicModifier(damagesource, f.floatValue())); - } - }; - float magicModifier = magic.apply((double) f).floatValue(); - f += magicModifier; - - Function<Double, Double> absorption = new Function<Double, Double>() { - @Override - public Double apply(Double f) { - return -(Math.max(f - Math.max(f - EntityLiving.this.getAbsorptionHearts(), 0.0F), 0.0F)); - } - }; - float absorptionModifier = absorption.apply((double) f).floatValue(); - - EntityDamageEvent event = CraftEventFactory.handleLivingEntityDamageEvent(this, damagesource, originalDamage, hardHatModifier, blockingModifier, armorModifier, resistanceModifier, magicModifier, absorptionModifier, hardHat, blocking, armor, resistance, magic, absorption); - if (event.isCancelled()) { - return false; - } - - f = (float) event.getFinalDamage(); - - // Apply damage to helmet - if ((damagesource == DamageSource.ANVIL || damagesource == DamageSource.FALLING_BLOCK) && this.getEquipment(4) != null) { - this.getEquipment(4).damage((int) (event.getDamage() * 4.0F + this.random.nextFloat() * event.getDamage() * 2.0F), this); - } - - // Apply damage to armor - if (!damagesource.ignoresArmor()) { - float armorDamage = (float) (event.getDamage() + event.getDamage(DamageModifier.BLOCKING) + event.getDamage(DamageModifier.HARD_HAT)); - this.damageArmor(armorDamage); - } - - absorptionModifier = (float) -event.getDamage(DamageModifier.ABSORPTION); - this.setAbsorptionHearts(Math.max(this.getAbsorptionHearts() - absorptionModifier, 0.0F)); - if (f != 0.0F) { - if (human) { - ((EntityHuman) this).applyExhaustion(damagesource.getExhaustionCost()); - } - // CraftBukkit end - float f2 = this.getHealth(); - - this.setHealth(f2 - f); - this.aW().a(damagesource, f2, f); - // CraftBukkit start - if (human) { - return true; - } - // CraftBukkit end - this.setAbsorptionHearts(this.getAbsorptionHearts() - f); - } - return true; // CraftBukkit - } - return false; // CraftBukkit - } - - public CombatTracker aW() { - return this.combatTracker; - } - - public EntityLiving aX() { - return (EntityLiving) (this.combatTracker.c() != null ? this.combatTracker.c() : (this.killer != null ? this.killer : (this.lastDamager != null ? this.lastDamager : null))); - } - - public final float getMaxHealth() { - return (float) this.getAttributeInstance(GenericAttributes.maxHealth).getValue(); - } - - public final int aZ() { - return this.datawatcher.getByte(9); - } - - public final void p(int i) { - this.datawatcher.watch(9, Byte.valueOf((byte) i)); - } - - private int j() { - return this.hasEffect(MobEffectList.FASTER_DIG) ? 6 - (1 + this.getEffect(MobEffectList.FASTER_DIG).getAmplifier()) * 1 : (this.hasEffect(MobEffectList.SLOWER_DIG) ? 6 + (1 + this.getEffect(MobEffectList.SLOWER_DIG).getAmplifier()) * 2 : 6); - } - - public void ba() { - if (!this.at || this.au >= this.j() / 2 || this.au < 0) { - this.au = -1; - this.at = true; - if (this.world instanceof WorldServer) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutAnimation(this, 0))); - } - } - } - - protected void G() { - this.damageEntity(DamageSource.OUT_OF_WORLD, 4.0F); - } - - protected void bb() { - int i = this.j(); - - if (this.at) { - ++this.au; - if (this.au >= i) { - this.au = 0; - this.at = false; - } - } else { - this.au = 0; - } - - this.aD = (float) this.au / (float) i; - } - - public AttributeInstance getAttributeInstance(IAttribute iattribute) { - return this.getAttributeMap().a(iattribute); - } - - public AttributeMapBase getAttributeMap() { - if (this.d == null) { - this.d = new AttributeMapServer(); - } - - return this.d; - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEFINED; - } - - public abstract ItemStack be(); - - public abstract ItemStack getEquipment(int i); - - public abstract void setEquipment(int i, ItemStack itemstack); - - public void setSprinting(boolean flag) { - super.setSprinting(flag); - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - if (attributeinstance.a(b) != null) { - attributeinstance.b(c); - } - - if (flag) { - attributeinstance.a(c); - } - } - - public abstract ItemStack[] getEquipment(); - - protected float bf() { - return 1.0F; - } - - protected float bg() { - return this.isBaby() ? (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.5F : (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F; - } - - protected boolean bh() { - return this.getHealth() <= 0.0F; - } - - public void enderTeleportTo(double d0, double d1, double d2) { - this.setPositionRotation(d0, d1, d2, this.yaw, this.pitch); - } - - public void m(Entity entity) { - double d0 = entity.locX; - double d1 = entity.boundingBox.b + (double) entity.length; - double d2 = entity.locZ; - byte b0 = 1; - - for (int i = -b0; i <= b0; ++i) { - for (int j = -b0; j < b0; ++j) { - if (i != 0 || j != 0) { - int k = (int) (this.locX + (double) i); - int l = (int) (this.locZ + (double) j); - AxisAlignedBB axisalignedbb = this.boundingBox.c((double) i, 1.0D, (double) j); - - if (this.world.a(axisalignedbb).isEmpty()) { - if (World.a((IBlockAccess) this.world, k, (int) this.locY, l)) { - this.enderTeleportTo(this.locX + (double) i, this.locY + 1.0D, this.locZ + (double) j); - return; - } - - if (World.a((IBlockAccess) this.world, k, (int) this.locY - 1, l) || this.world.getType(k, (int) this.locY - 1, l).getMaterial() == Material.WATER) { - d0 = this.locX + (double) i; - d1 = this.locY + 1.0D; - d2 = this.locZ + (double) j; - } - } - } - } - } - - this.enderTeleportTo(d0, d1, d2); - } - - protected void bj() { - this.motY = 0.41999998688697815D; - if (this.hasEffect(MobEffectList.JUMP)) { - this.motY += (double) ((float) (this.getEffect(MobEffectList.JUMP).getAmplifier() + 1) * 0.1F); - } - - if (this.isSprinting()) { - float f = this.yaw * 0.017453292F; - - this.motX -= (double) (MathHelper.sin(f) * 0.2F); - this.motZ += (double) (MathHelper.cos(f) * 0.2F); - } - - this.al = true; - } - - public void e(float f, float f1) { - double d0; - - if (this.M() && (!(this instanceof EntityHuman) || !((EntityHuman) this).abilities.isFlying)) { - d0 = this.locY; - this.a(f, f1, this.bk() ? 0.04F : 0.02F); - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.800000011920929D; - this.motY *= 0.800000011920929D; - this.motZ *= 0.800000011920929D; - this.motY -= 0.02D; - if (this.positionChanged && this.c(this.motX, this.motY + 0.6000000238418579D - this.locY + d0, this.motZ)) { - this.motY = 0.30000001192092896D; - } - } else if (this.P() && (!(this instanceof EntityHuman) || !((EntityHuman) this).abilities.isFlying)) { - d0 = this.locY; - this.a(f, f1, 0.02F); - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.5D; - this.motY *= 0.5D; - this.motZ *= 0.5D; - this.motY -= 0.02D; - if (this.positionChanged && this.c(this.motX, this.motY + 0.6000000238418579D - this.locY + d0, this.motZ)) { - this.motY = 0.30000001192092896D; - } - } else { - float f2 = 0.91F; - - if (this.onGround) { - f2 = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.91F; - } - - float f3 = 0.16277136F / (f2 * f2 * f2); - float f4; - - if (this.onGround) { - f4 = this.bl() * f3; - } else { - f4 = this.aQ; - } - - this.a(f, f1, f4); - f2 = 0.91F; - if (this.onGround) { - f2 = this.world.getType(MathHelper.floor(this.locX), MathHelper.floor(this.boundingBox.b) - 1, MathHelper.floor(this.locZ)).frictionFactor * 0.91F; - } - - if (this.h_()) { - float f5 = 0.15F; - - if (this.motX < (double) (-f5)) { - this.motX = (double) (-f5); - } - - if (this.motX > (double) f5) { - this.motX = (double) f5; - } - - if (this.motZ < (double) (-f5)) { - this.motZ = (double) (-f5); - } - - if (this.motZ > (double) f5) { - this.motZ = (double) f5; - } - - this.fallDistance = 0.0F; - if (this.motY < -0.15D) { - this.motY = -0.15D; - } - - boolean flag = this.isSneaking() && this instanceof EntityHuman; - - if (flag && this.motY < 0.0D) { - this.motY = 0.0D; - } - } - - this.move(this.motX, this.motY, this.motZ); - if (this.positionChanged && this.h_()) { - this.motY = 0.2D; - } - - if (this.world.isStatic && (!this.world.isLoaded((int) this.locX, 0, (int) this.locZ) || !this.world.getChunkAtWorldCoords((int) this.locX, (int) this.locZ).d)) { - if (this.locY > 0.0D) { - this.motY = -0.1D; - } else { - this.motY = 0.0D; - } - } else { - this.motY -= 0.08D; - } - - this.motY *= 0.9800000190734863D; - this.motX *= (double) f2; - this.motZ *= (double) f2; - } - - this.aE = this.aF; - d0 = this.locX - this.lastX; - double d1 = this.locZ - this.lastZ; - float f6 = MathHelper.sqrt(d0 * d0 + d1 * d1) * 4.0F; - - if (f6 > 1.0F) { - f6 = 1.0F; - } - - this.aF += (f6 - this.aF) * 0.4F; - this.aG += this.aF; - } - - protected boolean bk() { - return false; - } - - public float bl() { - return this.bk() ? this.bp : 0.1F; - } - - public void i(float f) { - this.bp = f; - } - - public boolean n(Entity entity) { - this.l(entity); - return false; - } - - public boolean isSleeping() { - return false; - } - - public void h() { - super.h(); - if (!this.world.isStatic) { - int i = this.aZ(); - - if (i > 0) { - if (this.av <= 0) { - this.av = 20 * (30 - i); - } - - --this.av; - if (this.av <= 0) { - this.p(i - 1); - } - } - - for (int j = 0; j < 5; ++j) { - ItemStack itemstack = this.g[j]; - ItemStack itemstack1 = this.getEquipment(j); - - if (!ItemStack.matches(itemstack1, itemstack)) { - ((WorldServer) this.world).getTracker().a((Entity) this, (Packet) (new PacketPlayOutEntityEquipment(this.getId(), j, itemstack1))); - if (itemstack != null) { - this.d.a(itemstack.D()); - } - - if (itemstack1 != null) { - this.d.b(itemstack1.D()); - } - - this.g[j] = itemstack1 == null ? null : itemstack1.cloneItemStack(); - } - } - - if (this.ticksLived % 20 == 0) { - this.aW().g(); - } - } - - this.e(); - double d0 = this.locX - this.lastX; - double d1 = this.locZ - this.lastZ; - float f = (float) (d0 * d0 + d1 * d1); - float f1 = this.aM; - float f2 = 0.0F; - - this.aV = this.aW; - float f3 = 0.0F; - - if (f > 0.0025000002F) { - f3 = 1.0F; - f2 = (float) Math.sqrt((double) f) * 3.0F; - // CraftBukkit - Math -> TrigMath - f1 = (float) org.bukkit.craftbukkit.TrigMath.atan2(d1, d0) * 180.0F / 3.1415927F - 90.0F; - } - - if (this.aD > 0.0F) { - f1 = this.yaw; - } - - if (!this.onGround) { - f3 = 0.0F; - } - - this.aW += (f3 - this.aW) * 0.3F; - this.world.methodProfiler.a("headTurn"); - f2 = this.f(f1, f2); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("rangeChecks"); - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - while (this.aM - this.aN < -180.0F) { - this.aN -= 360.0F; - } - - while (this.aM - this.aN >= 180.0F) { - this.aN += 360.0F; - } - - while (this.pitch - this.lastPitch < -180.0F) { - this.lastPitch -= 360.0F; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.aO - this.aP < -180.0F) { - this.aP -= 360.0F; - } - - while (this.aO - this.aP >= 180.0F) { - this.aP += 360.0F; - } - - this.world.methodProfiler.b(); - this.aX += f2; - } - - protected float f(float f, float f1) { - float f2 = MathHelper.g(f - this.aM); - - this.aM += f2 * 0.3F; - float f3 = MathHelper.g(this.yaw - this.aM); - boolean flag = f3 < -90.0F || f3 >= 90.0F; - - if (f3 < -75.0F) { - f3 = -75.0F; - } - - if (f3 >= 75.0F) { - f3 = 75.0F; - } - - this.aM = this.yaw - f3; - if (f3 * f3 > 2500.0F) { - this.aM += f3 * 0.2F; - } - - if (flag) { - f1 *= -1.0F; - } - - return f1; - } - - public void e() { - if (this.bq > 0) { - --this.bq; - } - - if (this.bg > 0) { - double d0 = this.locX + (this.bh - this.locX) / (double) this.bg; - double d1 = this.locY + (this.bi - this.locY) / (double) this.bg; - double d2 = this.locZ + (this.bj - this.locZ) / (double) this.bg; - double d3 = MathHelper.g(this.bk - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.bg); - this.pitch = (float) ((double) this.pitch + (this.bl - (double) this.pitch) / (double) this.bg); - --this.bg; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } else if (!this.br()) { - this.motX *= 0.98D; - this.motY *= 0.98D; - this.motZ *= 0.98D; - } - - if (Math.abs(this.motX) < 0.005D) { - this.motX = 0.0D; - } - - if (Math.abs(this.motY) < 0.005D) { - this.motY = 0.0D; - } - - if (Math.abs(this.motZ) < 0.005D) { - this.motZ = 0.0D; - } - - this.world.methodProfiler.a("ai"); - if (this.bh()) { - this.bc = false; - this.bd = 0.0F; - this.be = 0.0F; - this.bf = 0.0F; - } else if (this.br()) { - if (this.bk()) { - this.world.methodProfiler.a("newAi"); - this.bn(); - this.world.methodProfiler.b(); - } else { - this.world.methodProfiler.a("oldAi"); - this.bq(); - this.world.methodProfiler.b(); - this.aO = this.yaw; - } - } - - this.world.methodProfiler.b(); - this.world.methodProfiler.a("jump"); - if (this.bc) { - if (!this.M() && !this.P()) { - if (this.onGround && this.bq == 0) { - this.bj(); - this.bq = 10; - } - } else { - this.motY += 0.03999999910593033D; - } - } else { - this.bq = 0; - } - - this.world.methodProfiler.b(); - this.world.methodProfiler.a("travel"); - this.bd *= 0.98F; - this.be *= 0.98F; - this.bf *= 0.9F; - this.e(this.bd, this.be); - this.world.methodProfiler.b(); - this.world.methodProfiler.a("push"); - if (!this.world.isStatic) { - this.bo(); - } - - this.world.methodProfiler.b(); - } - - protected void bn() {} - - protected void bo() { - List list = this.world.getEntities(this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - // TODO better check now? - // CraftBukkit start - Only handle mob (non-player) collisions every other tick - if (entity instanceof EntityLiving && !(this instanceof EntityPlayer) && this.ticksLived % 2 == 0) { - continue; - } - // CraftBukkit end - - if (entity.S()) { - this.o(entity); - } - } - } - } - - protected void o(Entity entity) { - entity.collide(this); - } - - public void ab() { - super.ab(); - this.aV = this.aW; - this.aW = 0.0F; - this.fallDistance = 0.0F; - } - - protected void bp() {} - - protected void bq() { - ++this.aU; - } - - public void f(boolean flag) { - this.bc = flag; - } - - public void receive(Entity entity, int i) { - if (!entity.dead && !this.world.isStatic) { - EntityTracker entitytracker = ((WorldServer) this.world).getTracker(); - - if (entity instanceof EntityItem) { - entitytracker.a(entity, (Packet) (new PacketPlayOutCollect(entity.getId(), this.getId()))); - } - - if (entity instanceof EntityArrow) { - entitytracker.a(entity, (Packet) (new PacketPlayOutCollect(entity.getId(), this.getId()))); - } - - if (entity instanceof EntityExperienceOrb) { - entitytracker.a(entity, (Packet) (new PacketPlayOutCollect(entity.getId(), this.getId()))); - } - } - } - - public boolean hasLineOfSight(Entity entity) { - return this.world.a(Vec3D.a(this.locX, this.locY + (double) this.getHeadHeight(), this.locZ), Vec3D.a(entity.locX, entity.locY + (double) entity.getHeadHeight(), entity.locZ)) == null; - } - - public Vec3D ag() { - return this.j(1.0F); - } - - public Vec3D j(float f) { - float f1; - float f2; - float f3; - float f4; - - if (f == 1.0F) { - f1 = MathHelper.cos(-this.yaw * 0.017453292F - 3.1415927F); - f2 = MathHelper.sin(-this.yaw * 0.017453292F - 3.1415927F); - f3 = -MathHelper.cos(-this.pitch * 0.017453292F); - f4 = MathHelper.sin(-this.pitch * 0.017453292F); - return Vec3D.a((double) (f2 * f3), (double) f4, (double) (f1 * f3)); - } else { - f1 = this.lastPitch + (this.pitch - this.lastPitch) * f; - f2 = this.lastYaw + (this.yaw - this.lastYaw) * f; - f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - - return Vec3D.a((double) (f4 * f5), (double) f6, (double) (f3 * f5)); - } - } - - public boolean br() { - return !this.world.isStatic; - } - - public boolean R() { - return !this.dead; - } - - public boolean S() { - return !this.dead; - } - - public float getHeadHeight() { - return this.length * 0.85F; - } - - protected void Q() { - this.velocityChanged = this.random.nextDouble() >= this.getAttributeInstance(GenericAttributes.c).getValue(); - } - - public float getHeadRotation() { - return this.aO; - } - - public float getAbsorptionHearts() { - return this.br; - } - - public void setAbsorptionHearts(float f) { - if (f < 0.0F) { - f = 0.0F; - } - - this.br = f; - } - - public ScoreboardTeamBase getScoreboardTeam() { - return null; - } - - public boolean c(EntityLiving entityliving) { - return this.a(entityliving.getScoreboardTeam()); - } - - public boolean a(ScoreboardTeamBase scoreboardteambase) { - return this.getScoreboardTeam() != null ? this.getScoreboardTeam().isAlly(scoreboardteambase) : false; - } - - public void bu() {} - - public void bv() {} -} diff --git a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java b/src/main/java/net/minecraft/server/EntityMinecartAbstract.java deleted file mode 100644 index f1ccd3a9..00000000 --- a/src/main/java/net/minecraft/server/EntityMinecartAbstract.java +++ /dev/null @@ -1,882 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.entity.Vehicle; -import org.bukkit.event.vehicle.VehicleDamageEvent; -import org.bukkit.event.vehicle.VehicleDestroyEvent; -import org.bukkit.event.vehicle.VehicleEntityCollisionEvent; -import org.bukkit.util.Vector; -// CraftBukkit end - -public abstract class EntityMinecartAbstract extends Entity { - - private boolean a; - private String b; - private static final int[][][] matrix = new int[][][] { { { 0, 0, -1}, { 0, 0, 1}}, { { -1, 0, 0}, { 1, 0, 0}}, { { -1, -1, 0}, { 1, 0, 0}}, { { -1, 0, 0}, { 1, -1, 0}}, { { 0, 0, -1}, { 0, -1, 1}}, { { 0, -1, -1}, { 0, 0, 1}}, { { 0, 0, 1}, { 1, 0, 0}}, { { 0, 0, 1}, { -1, 0, 0}}, { { 0, 0, -1}, { -1, 0, 0}}, { { 0, 0, -1}, { 1, 0, 0}}}; - private int d; - private double e; - private double f; - private double g; - private double h; - private double i; - - // CraftBukkit start - public boolean slowWhenEmpty = true; - private double derailedX = 0.5; - private double derailedY = 0.5; - private double derailedZ = 0.5; - private double flyingX = 0.95; - private double flyingY = 0.95; - private double flyingZ = 0.95; - public double maxSpeed = 0.4D; - // CraftBukkit end - - public EntityMinecartAbstract(World world) { - super(world); - this.k = true; - this.a(0.98F, 0.7F); - this.height = this.length / 2.0F; - } - - public static EntityMinecartAbstract a(World world, double d0, double d1, double d2, int i) { - switch (i) { - case 1: - return new EntityMinecartChest(world, d0, d1, d2); - - case 2: - return new EntityMinecartFurnace(world, d0, d1, d2); - - case 3: - return new EntityMinecartTNT(world, d0, d1, d2); - - case 4: - return new EntityMinecartMobSpawner(world, d0, d1, d2); - - case 5: - return new EntityMinecartHopper(world, d0, d1, d2); - - case 6: - return new EntityMinecartCommandBlock(world, d0, d1, d2); - - default: - return new EntityMinecartRideable(world, d0, d1, d2); - } - } - - protected boolean g_() { - return false; - } - - protected void c() { - this.datawatcher.a(17, new Integer(0)); - this.datawatcher.a(18, new Integer(1)); - this.datawatcher.a(19, new Float(0.0F)); - this.datawatcher.a(20, new Integer(0)); - this.datawatcher.a(21, new Integer(6)); - this.datawatcher.a(22, Byte.valueOf((byte) 0)); - } - - public AxisAlignedBB h(Entity entity) { - return entity.S() ? entity.boundingBox : null; - } - - public AxisAlignedBB J() { - return null; - } - - public boolean S() { - return true; - } - - public EntityMinecartAbstract(World world, double d0, double d1, double d2) { - this(world); - this.setPosition(d0, d1, d2); - this.motX = 0.0D; - this.motY = 0.0D; - this.motZ = 0.0D; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleCreateEvent((Vehicle) this.getBukkitEntity())); // CraftBukkit - } - - public double ae() { - return (double) this.length * 0.0D - 0.30000001192092896D; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (!this.world.isStatic && !this.dead) { - if (this.isInvulnerable()) { - return false; - } else { - // CraftBukkit start - fire VehicleDamageEvent - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity passenger = (damagesource.getEntity() == null) ? null : damagesource.getEntity().getBukkitEntity(); - - VehicleDamageEvent event = new VehicleDamageEvent(vehicle, passenger, f); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - - f = (float) event.getDamage(); - // CraftBukkit end - - this.j(-this.l()); - this.c(10); - this.Q(); - this.setDamage(this.getDamage() + f * 10.0F); - boolean flag = damagesource.getEntity() instanceof EntityHuman && ((EntityHuman) damagesource.getEntity()).abilities.canInstantlyBuild; - - if (flag || this.getDamage() > 40.0F) { - if (this.passenger != null) { - this.passenger.mount(this); - } - - // CraftBukkit start - VehicleDestroyEvent destroyEvent = new VehicleDestroyEvent(vehicle, passenger); - this.world.getServer().getPluginManager().callEvent(destroyEvent); - - if (destroyEvent.isCancelled()) { - this.setDamage(40); // Maximize damage so this doesn't get triggered again right away - return true; - } - // CraftBukkit end - - if (flag && !this.k_()) { - this.die(); - } else { - this.a(damagesource); - } - } - - return true; - } - } else { - return true; - } - } - - public void a(DamageSource damagesource) { - this.die(); - ItemStack itemstack = new ItemStack(Items.MINECART, 1); - - if (this.b != null) { - itemstack.c(this.b); - } - - this.a(itemstack, 0.0F); - } - - public boolean R() { - return !this.dead; - } - - public void die() { - super.die(); - } - - public void h() { - // CraftBukkit start - double prevX = this.locX; - double prevY = this.locY; - double prevZ = this.locZ; - float prevYaw = this.yaw; - float prevPitch = this.pitch; - // CraftBukkit end - - if (this.getType() > 0) { - this.c(this.getType() - 1); - } - - if (this.getDamage() > 0.0F) { - this.setDamage(this.getDamage() - 1.0F); - } - - if (this.locY < -64.0D) { - this.G(); - } - - int i; - - if (!this.world.isStatic && this.world instanceof WorldServer) { - this.world.methodProfiler.a("portal"); - MinecraftServer minecraftserver = ((WorldServer) this.world).getMinecraftServer(); - - i = this.D(); - if (this.an) { - if (true || minecraftserver.getAllowNether()) { // CraftBukkit - multi-world should still allow teleport even if default vanilla nether disabled - if (this.vehicle == null && this.ao++ >= i) { - this.ao = i; - this.portalCooldown = this.ai(); - byte b0; - - if (this.world.worldProvider.dimension == -1) { - b0 = 0; - } else { - b0 = -1; - } - - this.b(b0); - } - - this.an = false; - } - } else { - if (this.ao > 0) { - this.ao -= 4; - } - - if (this.ao < 0) { - this.ao = 0; - } - } - - if (this.portalCooldown > 0) { - --this.portalCooldown; - } - - this.world.methodProfiler.b(); - } - - if (this.world.isStatic) { - if (this.d > 0) { - double d0 = this.locX + (this.e - this.locX) / (double) this.d; - double d1 = this.locY + (this.f - this.locY) / (double) this.d; - double d2 = this.locZ + (this.g - this.locZ) / (double) this.d; - double d3 = MathHelper.g(this.h - (double) this.yaw); - - this.yaw = (float) ((double) this.yaw + d3 / (double) this.d); - this.pitch = (float) ((double) this.pitch + (this.i - (double) this.pitch) / (double) this.d); - --this.d; - this.setPosition(d0, d1, d2); - this.b(this.yaw, this.pitch); - } else { - this.setPosition(this.locX, this.locY, this.locZ); - this.b(this.yaw, this.pitch); - } - } else { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.03999999910593033D; - int j = MathHelper.floor(this.locX); - - i = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (BlockMinecartTrackAbstract.b_(this.world, j, i - 1, k)) { - --i; - } - - double d4 = this.maxSpeed; // CraftBukkit - double d5 = 0.0078125D; - Block block = this.world.getType(j, i, k); - - if (BlockMinecartTrackAbstract.a(block)) { - int l = this.world.getData(j, i, k); - - this.a(j, i, k, d4, d5, block, l); - if (block == Blocks.ACTIVATOR_RAIL) { - this.a(j, i, k, (l & 8) != 0); - } - } else { - this.b(d4); - } - - this.I(); - this.pitch = 0.0F; - double d6 = this.lastX - this.locX; - double d7 = this.lastZ - this.locZ; - - if (d6 * d6 + d7 * d7 > 0.001D) { - this.yaw = (float) (Math.atan2(d7, d6) * 180.0D / 3.141592653589793D); - if (this.a) { - this.yaw += 180.0F; - } - } - - double d8 = (double) MathHelper.g(this.yaw - this.lastYaw); - - if (d8 < -170.0D || d8 >= 170.0D) { - this.yaw += 180.0F; - this.a = !this.a; - } - - this.b(this.yaw, this.pitch); - - // CraftBukkit start - org.bukkit.World bworld = this.world.getWorld(); - Location from = new Location(bworld, prevX, prevY, prevZ, prevYaw, prevPitch); - Location to = new Location(bworld, this.locX, this.locY, this.locZ, this.yaw, this.pitch); - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleUpdateEvent(vehicle)); - - if (!from.equals(to)) { - this.world.getServer().getPluginManager().callEvent(new org.bukkit.event.vehicle.VehicleMoveEvent(vehicle, from, to)); - } - // CraftBukkit end - - List list = this.world.getEntities(this, this.boundingBox.grow(0.20000000298023224D, 0.0D, 0.20000000298023224D)); - - if (list != null && !list.isEmpty()) { - for (int i1 = 0; i1 < list.size(); ++i1) { - Entity entity = (Entity) list.get(i1); - - if (entity != this.passenger && entity.S() && entity instanceof EntityMinecartAbstract) { - entity.collide(this); - } - } - } - - if (this.passenger != null && this.passenger.dead) { - if (this.passenger.vehicle == this) { - this.passenger.vehicle = null; - } - - this.passenger = null; - } - } - } - - public void a(int i, int j, int k, boolean flag) {} - - protected void b(double d0) { - if (this.motX < -d0) { - this.motX = -d0; - } - - if (this.motX > d0) { - this.motX = d0; - } - - if (this.motZ < -d0) { - this.motZ = -d0; - } - - if (this.motZ > d0) { - this.motZ = d0; - } - - if (this.onGround) { - // CraftBukkit start - replace magic numbers with our variables - this.motX *= this.derailedX; - this.motY *= this.derailedY; - this.motZ *= this.derailedZ; - // CraftBukkit end - } - - this.move(this.motX, this.motY, this.motZ); - if (!this.onGround) { - // CraftBukkit start - replace magic numbers with our variables - this.motX *= this.flyingX; - this.motY *= this.flyingY; - this.motZ *= this.flyingZ; - // CraftBukkit end - } - } - - protected void a(int i, int j, int k, double d0, double d1, Block block, int l) { - this.fallDistance = 0.0F; - Vec3D vec3d = this.a(this.locX, this.locY, this.locZ); - - this.locY = (double) j; - boolean flag = false; - boolean flag1 = false; - - if (block == Blocks.GOLDEN_RAIL) { - flag = (l & 8) != 0; - flag1 = !flag; - } - - if (((BlockMinecartTrackAbstract) block).e()) { - l &= 7; - } - - if (l >= 2 && l <= 5) { - this.locY = (double) (j + 1); - } - - if (l == 2) { - this.motX -= d1; - } - - if (l == 3) { - this.motX += d1; - } - - if (l == 4) { - this.motZ += d1; - } - - if (l == 5) { - this.motZ -= d1; - } - - int[][] aint = matrix[l]; - double d2 = (double) (aint[1][0] - aint[0][0]); - double d3 = (double) (aint[1][2] - aint[0][2]); - double d4 = Math.sqrt(d2 * d2 + d3 * d3); - double d5 = this.motX * d2 + this.motZ * d3; - - if (d5 < 0.0D) { - d2 = -d2; - d3 = -d3; - } - - double d6 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - if (d6 > 2.0D) { - d6 = 2.0D; - } - - this.motX = d6 * d2 / d4; - this.motZ = d6 * d3 / d4; - double d7; - double d8; - double d9; - double d10; - - if (this.passenger != null && this.passenger instanceof EntityLiving) { - d7 = (double) ((EntityLiving) this.passenger).be; - if (d7 > 0.0D) { - d8 = -Math.sin((double) (this.passenger.yaw * 3.1415927F / 180.0F)); - d9 = Math.cos((double) (this.passenger.yaw * 3.1415927F / 180.0F)); - d10 = this.motX * this.motX + this.motZ * this.motZ; - if (d10 < 0.01D) { - this.motX += d8 * 0.1D; - this.motZ += d9 * 0.1D; - flag1 = false; - } - } - } - - if (flag1) { - d7 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d7 < 0.03D) { - this.motX *= 0.0D; - this.motY *= 0.0D; - this.motZ *= 0.0D; - } else { - this.motX *= 0.5D; - this.motY *= 0.0D; - this.motZ *= 0.5D; - } - } - - d7 = 0.0D; - d8 = (double) i + 0.5D + (double) aint[0][0] * 0.5D; - d9 = (double) k + 0.5D + (double) aint[0][2] * 0.5D; - d10 = (double) i + 0.5D + (double) aint[1][0] * 0.5D; - double d11 = (double) k + 0.5D + (double) aint[1][2] * 0.5D; - - d2 = d10 - d8; - d3 = d11 - d9; - double d12; - double d13; - - if (d2 == 0.0D) { - this.locX = (double) i + 0.5D; - d7 = this.locZ - (double) k; - } else if (d3 == 0.0D) { - this.locZ = (double) k + 0.5D; - d7 = this.locX - (double) i; - } else { - d12 = this.locX - d8; - d13 = this.locZ - d9; - d7 = (d12 * d2 + d13 * d3) * 2.0D; - } - - this.locX = d8 + d2 * d7; - this.locZ = d9 + d3 * d7; - this.setPosition(this.locX, this.locY + (double) this.height, this.locZ); - d12 = this.motX; - d13 = this.motZ; - if (this.passenger != null) { - d12 *= 0.75D; - d13 *= 0.75D; - } - - if (d12 < -d0) { - d12 = -d0; - } - - if (d12 > d0) { - d12 = d0; - } - - if (d13 < -d0) { - d13 = -d0; - } - - if (d13 > d0) { - d13 = d0; - } - - this.move(d12, 0.0D, d13); - if (aint[0][1] != 0 && MathHelper.floor(this.locX) - i == aint[0][0] && MathHelper.floor(this.locZ) - k == aint[0][2]) { - this.setPosition(this.locX, this.locY + (double) aint[0][1], this.locZ); - } else if (aint[1][1] != 0 && MathHelper.floor(this.locX) - i == aint[1][0] && MathHelper.floor(this.locZ) - k == aint[1][2]) { - this.setPosition(this.locX, this.locY + (double) aint[1][1], this.locZ); - } - - this.i(); - Vec3D vec3d1 = this.a(this.locX, this.locY, this.locZ); - - if (vec3d1 != null && vec3d != null) { - double d14 = (vec3d.b - vec3d1.b) * 0.05D; - - d6 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - if (d6 > 0.0D) { - this.motX = this.motX / d6 * (d6 + d14); - this.motZ = this.motZ / d6 * (d6 + d14); - } - - this.setPosition(this.locX, vec3d1.b, this.locZ); - } - - int i1 = MathHelper.floor(this.locX); - int j1 = MathHelper.floor(this.locZ); - - if (i1 != i || j1 != k) { - d6 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - this.motX = d6 * (double) (i1 - i); - this.motZ = d6 * (double) (j1 - k); - } - - if (flag) { - double d15 = Math.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - if (d15 > 0.01D) { - double d16 = 0.06D; - - this.motX += this.motX / d15 * d16; - this.motZ += this.motZ / d15 * d16; - } else if (l == 1) { - if (this.world.getType(i - 1, j, k).r()) { - this.motX = 0.02D; - } else if (this.world.getType(i + 1, j, k).r()) { - this.motX = -0.02D; - } - } else if (l == 0) { - if (this.world.getType(i, j, k - 1).r()) { - this.motZ = 0.02D; - } else if (this.world.getType(i, j, k + 1).r()) { - this.motZ = -0.02D; - } - } - } - } - - protected void i() { - if (this.passenger != null || !this.slowWhenEmpty) { // CraftBukkit - add !this.slowWhenEmpty - this.motX *= 0.996999979019165D; - this.motY *= 0.0D; - this.motZ *= 0.996999979019165D; - } else { - this.motX *= 0.9599999785423279D; - this.motY *= 0.0D; - this.motZ *= 0.9599999785423279D; - } - } - - public Vec3D a(double d0, double d1, double d2) { - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - - if (BlockMinecartTrackAbstract.b_(this.world, i, j - 1, k)) { - --j; - } - - Block block = this.world.getType(i, j, k); - - if (BlockMinecartTrackAbstract.a(block)) { - int l = this.world.getData(i, j, k); - - d1 = (double) j; - if (((BlockMinecartTrackAbstract) block).e()) { - l &= 7; - } - - if (l >= 2 && l <= 5) { - d1 = (double) (j + 1); - } - - int[][] aint = matrix[l]; - double d3 = 0.0D; - double d4 = (double) i + 0.5D + (double) aint[0][0] * 0.5D; - double d5 = (double) j + 0.5D + (double) aint[0][1] * 0.5D; - double d6 = (double) k + 0.5D + (double) aint[0][2] * 0.5D; - double d7 = (double) i + 0.5D + (double) aint[1][0] * 0.5D; - double d8 = (double) j + 0.5D + (double) aint[1][1] * 0.5D; - double d9 = (double) k + 0.5D + (double) aint[1][2] * 0.5D; - double d10 = d7 - d4; - double d11 = (d8 - d5) * 2.0D; - double d12 = d9 - d6; - - if (d10 == 0.0D) { - d0 = (double) i + 0.5D; - d3 = d2 - (double) k; - } else if (d12 == 0.0D) { - d2 = (double) k + 0.5D; - d3 = d0 - (double) i; - } else { - double d13 = d0 - d4; - double d14 = d2 - d6; - - d3 = (d13 * d10 + d14 * d12) * 2.0D; - } - - d0 = d4 + d10 * d3; - d1 = d5 + d11 * d3; - d2 = d6 + d12 * d3; - if (d11 < 0.0D) { - ++d1; - } - - if (d11 > 0.0D) { - d1 += 0.5D; - } - - return Vec3D.a(d0, d1, d2); - } else { - return null; - } - } - - protected void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.getBoolean("CustomDisplayTile")) { - this.k(nbttagcompound.getInt("DisplayTile")); - this.l(nbttagcompound.getInt("DisplayData")); - this.m(nbttagcompound.getInt("DisplayOffset")); - } - - if (nbttagcompound.hasKeyOfType("CustomName", 8) && nbttagcompound.getString("CustomName").length() > 0) { - this.b = nbttagcompound.getString("CustomName"); - } - } - - protected void b(NBTTagCompound nbttagcompound) { - if (this.t()) { - nbttagcompound.setBoolean("CustomDisplayTile", true); - nbttagcompound.setInt("DisplayTile", this.n().getMaterial() == Material.AIR ? 0 : Block.getId(this.n())); - nbttagcompound.setInt("DisplayData", this.p()); - nbttagcompound.setInt("DisplayOffset", this.r()); - } - - if (this.b != null && this.b.length() > 0) { - nbttagcompound.setString("CustomName", this.b); - } - } - - public void collide(Entity entity) { - if (!this.world.isStatic) { - if (entity != this.passenger) { - // CraftBukkit start - Vehicle vehicle = (Vehicle) this.getBukkitEntity(); - org.bukkit.entity.Entity hitEntity = (entity == null) ? null : entity.getBukkitEntity(); - - VehicleEntityCollisionEvent collisionEvent = new VehicleEntityCollisionEvent(vehicle, hitEntity); - this.world.getServer().getPluginManager().callEvent(collisionEvent); - - if (collisionEvent.isCancelled()) { - return; - } - // CraftBukkit end - - if (entity instanceof EntityLiving && !(entity instanceof EntityHuman) && !(entity instanceof EntityIronGolem) && this.m() == 0 && this.motX * this.motX + this.motZ * this.motZ > 0.01D && this.passenger == null && entity.vehicle == null) { - entity.mount(this); - } - - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - double d2 = d0 * d0 + d1 * d1; - - // CraftBukkit - collision - if (d2 >= 9.999999747378752E-5D && !collisionEvent.isCollisionCancelled()) { - d2 = (double) MathHelper.sqrt(d2); - d0 /= d2; - d1 /= d2; - double d3 = 1.0D / d2; - - if (d3 > 1.0D) { - d3 = 1.0D; - } - - d0 *= d3; - d1 *= d3; - d0 *= 0.10000000149011612D; - d1 *= 0.10000000149011612D; - d0 *= (double) (1.0F - this.Y); - d1 *= (double) (1.0F - this.Y); - d0 *= 0.5D; - d1 *= 0.5D; - if (entity instanceof EntityMinecartAbstract) { - double d4 = entity.locX - this.locX; - double d5 = entity.locZ - this.locZ; - Vec3D vec3d = Vec3D.a(d4, 0.0D, d5).a(); - Vec3D vec3d1 = Vec3D.a((double) MathHelper.cos(this.yaw * 3.1415927F / 180.0F), 0.0D, (double) MathHelper.sin(this.yaw * 3.1415927F / 180.0F)).a(); - double d6 = Math.abs(vec3d.b(vec3d1)); - - if (d6 < 0.800000011920929D) { - return; - } - - double d7 = entity.motX + this.motX; - double d8 = entity.motZ + this.motZ; - - if (((EntityMinecartAbstract) entity).m() == 2 && this.m() != 2) { - this.motX *= 0.20000000298023224D; - this.motZ *= 0.20000000298023224D; - this.g(entity.motX - d0, 0.0D, entity.motZ - d1); - entity.motX *= 0.949999988079071D; - entity.motZ *= 0.949999988079071D; - } else if (((EntityMinecartAbstract) entity).m() != 2 && this.m() == 2) { - entity.motX *= 0.20000000298023224D; - entity.motZ *= 0.20000000298023224D; - entity.g(this.motX + d0, 0.0D, this.motZ + d1); - this.motX *= 0.949999988079071D; - this.motZ *= 0.949999988079071D; - } else { - d7 /= 2.0D; - d8 /= 2.0D; - this.motX *= 0.20000000298023224D; - this.motZ *= 0.20000000298023224D; - this.g(d7 - d0, 0.0D, d8 - d1); - entity.motX *= 0.20000000298023224D; - entity.motZ *= 0.20000000298023224D; - entity.g(d7 + d0, 0.0D, d8 + d1); - } - } else { - this.g(-d0, 0.0D, -d1); - entity.g(d0 / 4.0D, 0.0D, d1 / 4.0D); - } - } - } - } - } - - public void setDamage(float f) { - this.datawatcher.watch(19, Float.valueOf(f)); - } - - public float getDamage() { - return this.datawatcher.getFloat(19); - } - - public void c(int i) { - this.datawatcher.watch(17, Integer.valueOf(i)); - } - - public int getType() { - return this.datawatcher.getInt(17); - } - - public void j(int i) { - this.datawatcher.watch(18, Integer.valueOf(i)); - } - - public int l() { - return this.datawatcher.getInt(18); - } - - public abstract int m(); - - public Block n() { - if (!this.t()) { - return this.o(); - } else { - int i = this.getDataWatcher().getInt(20) & '\uffff'; - - return Block.getById(i); - } - } - - public Block o() { - return Blocks.AIR; - } - - public int p() { - return !this.t() ? this.q() : this.getDataWatcher().getInt(20) >> 16; - } - - public int q() { - return 0; - } - - public int r() { - return !this.t() ? this.s() : this.getDataWatcher().getInt(21); - } - - public int s() { - return 6; - } - - public void k(int i) { - this.getDataWatcher().watch(20, Integer.valueOf(i & '\uffff' | this.p() << 16)); - this.a(true); - } - - public void l(int i) { - this.getDataWatcher().watch(20, Integer.valueOf(Block.getId(this.n()) & '\uffff' | i << 16)); - this.a(true); - } - - public void m(int i) { - this.getDataWatcher().watch(21, Integer.valueOf(i)); - this.a(true); - } - - public boolean t() { - return this.getDataWatcher().getByte(22) == 1; - } - - public void a(boolean flag) { - this.getDataWatcher().watch(22, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - public void a(String s) { - this.b = s; - } - - public String getName() { - return this.b != null ? this.b : super.getName(); - } - - public boolean k_() { - return this.b != null; - } - - public String u() { - return this.b; - } - - // CraftBukkit start - Methods for getting and setting flying and derailed velocity modifiers - public Vector getFlyingVelocityMod() { - return new Vector(flyingX, flyingY, flyingZ); - } - - public void setFlyingVelocityMod(Vector flying) { - flyingX = flying.getX(); - flyingY = flying.getY(); - flyingZ = flying.getZ(); - } - - public Vector getDerailedVelocityMod() { - return new Vector(derailedX, derailedY, derailedZ); - } - - public void setDerailedVelocityMod(Vector derailed) { - derailedX = derailed.getX(); - derailedY = derailed.getY(); - derailedZ = derailed.getZ(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java b/src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java deleted file mode 100644 index 5b452856..00000000 --- a/src/main/java/net/minecraft/server/EntityMinecartCommandBlockListener.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - package-private -> public -public class EntityMinecartCommandBlockListener extends CommandBlockListenerAbstract { - - final EntityMinecartCommandBlock a; - - EntityMinecartCommandBlockListener(EntityMinecartCommandBlock entityminecartcommandblock) { - this.a = entityminecartcommandblock; - this.sender = (org.bukkit.craftbukkit.entity.CraftMinecartCommand) entityminecartcommandblock.getBukkitEntity(); // CraftBukkit - Set the sender - } - - public void e() { - this.a.getDataWatcher().watch(23, this.getCommand()); - this.a.getDataWatcher().watch(24, ChatSerializer.a(this.h())); - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(MathHelper.floor(this.a.locX), MathHelper.floor(this.a.locY + 0.5D), MathHelper.floor(this.a.locZ)); - } - - public World getWorld() { - return this.a.world; - } -} diff --git a/src/main/java/net/minecraft/server/EntityMinecartContainer.java b/src/main/java/net/minecraft/server/EntityMinecartContainer.java deleted file mode 100644 index 13b75ff8..00000000 --- a/src/main/java/net/minecraft/server/EntityMinecartContainer.java +++ /dev/null @@ -1,243 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.inventory.InventoryHolder; -// CraftBukkit end - -public abstract class EntityMinecartContainer extends EntityMinecartAbstract implements IInventory { - - private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 - private boolean b = true; - - // CraftBukkit start - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public InventoryHolder getOwner() { - org.bukkit.entity.Entity cart = getBukkitEntity(); - if(cart instanceof InventoryHolder) return (InventoryHolder) cart; - return null; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public EntityMinecartContainer(World world) { - super(world); - } - - public EntityMinecartContainer(World world, double d0, double d1, double d2) { - super(world, d0, d1, d2); - } - - public void a(DamageSource damagesource) { - super.a(damagesource); - - for (int i = 0; i < this.getSize(); ++i) { - ItemStack itemstack = this.getItem(i); - - if (itemstack != null) { - float f = this.random.nextFloat() * 0.8F + 0.1F; - float f1 = this.random.nextFloat() * 0.8F + 0.1F; - float f2 = this.random.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j = this.random.nextInt(21) + 10; - - if (j > itemstack.count) { - j = itemstack.count; - } - - itemstack.count -= j; - EntityItem entityitem = new EntityItem(this.world, this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, new ItemStack(itemstack.getItem(), j, itemstack.getData())); - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.random.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.random.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.random.nextGaussian() * f3); - this.world.addEntity(entityitem); - } - } - } - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - } - - public void update() {} - - public boolean a(EntityHuman entityhuman) { - return this.dead ? false : entityhuman.f(this) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public String getInventoryName() { - return this.k_() ? this.u() : "container.minecart"; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void b(int i) { - this.b = false; - super.b(i); - } - - public void die() { - if (this.b) { - for (int i = 0; i < this.getSize(); ++i) { - ItemStack itemstack = this.getItem(i); - - if (itemstack != null) { - float f = this.random.nextFloat() * 0.8F + 0.1F; - float f1 = this.random.nextFloat() * 0.8F + 0.1F; - float f2 = this.random.nextFloat() * 0.8F + 0.1F; - - while (itemstack.count > 0) { - int j = this.random.nextInt(21) + 10; - - if (j > itemstack.count) { - j = itemstack.count; - } - - itemstack.count -= j; - EntityItem entityitem = new EntityItem(this.world, this.locX + (double) f, this.locY + (double) f1, this.locZ + (double) f2, new ItemStack(itemstack.getItem(), j, itemstack.getData())); - - if (itemstack.hasTag()) { - entityitem.getItemStack().setTag((NBTTagCompound) itemstack.getTag().clone()); - } - - float f3 = 0.05F; - - entityitem.motX = (double) ((float) this.random.nextGaussian() * f3); - entityitem.motY = (double) ((float) this.random.nextGaussian() * f3 + 0.2F); - entityitem.motZ = (double) ((float) this.random.nextGaussian() * f3); - this.world.addEntity(entityitem); - } - } - } - } - - super.die(); - } - - protected void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - } - - protected void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.items.length) { - this.items[j] = ItemStack.createStack(nbttagcompound1); - } - } - } - - public boolean c(EntityHuman entityhuman) { - if (!this.world.isStatic) { - entityhuman.openContainer(this); - } - - return true; - } - - protected void i() { - int i = 15 - Container.b((IInventory) this); - float f = 0.98F + (float) i * 0.001F; - - this.motX *= (double) f; - this.motY *= 0.0D; - this.motZ *= (double) f; - } -} diff --git a/src/main/java/net/minecraft/server/EntityMonster.java b/src/main/java/net/minecraft/server/EntityMonster.java deleted file mode 100644 index 49aef649..00000000 --- a/src/main/java/net/minecraft/server/EntityMonster.java +++ /dev/null @@ -1,177 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public abstract class EntityMonster extends EntityCreature implements IMonster { - - public EntityMonster(World world) { - super(world); - this.b = 5; - } - - public void e() { - this.bb(); - float f = this.d(1.0F); - - if (f > 0.5F) { - this.aU += 2; - } - - super.e(); - } - - public void h() { - super.h(); - if (!this.world.isStatic && this.world.difficulty == EnumDifficulty.PEACEFUL) { - this.die(); - } - } - - protected String H() { - return "game.hostile.swim"; - } - - protected String O() { - return "game.hostile.swim.splash"; - } - - protected Entity findTarget() { - EntityHuman entityhuman = this.world.findNearbyVulnerablePlayer(this, 16.0D); - - return entityhuman != null && this.hasLineOfSight(entityhuman) ? entityhuman : null; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (super.damageEntity(damagesource, f)) { - Entity entity = damagesource.getEntity(); - - if (this.passenger != entity && this.vehicle != entity) { - if (entity != this) { - // CraftBukkit start - We still need to call events for entities without goals - if (entity != this.target && (this instanceof EntityBlaze || this instanceof EntityEnderman || this instanceof EntitySpider || this instanceof EntityGiantZombie || this instanceof EntitySilverfish)) { - EntityTargetEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(this, entity, EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - } - } - } else { - this.target = entity; - } - // CraftBukkit end - } - - return true; - } else { - return true; - } - } else { - return false; - } - } - - protected String aT() { - return "game.hostile.hurt"; - } - - protected String aU() { - return "game.hostile.die"; - } - - protected String o(int i) { - return i > 4 ? "game.hostile.hurt.fall.big" : "game.hostile.hurt.fall.small"; - } - - public boolean n(Entity entity) { - float f = (float) this.getAttributeInstance(GenericAttributes.e).getValue(); - int i = 0; - - if (entity instanceof EntityLiving) { - f += EnchantmentManager.a((EntityLiving) this, (EntityLiving) entity); - i += EnchantmentManager.getKnockbackEnchantmentLevel(this, (EntityLiving) entity); - } - - boolean flag = entity.damageEntity(DamageSource.mobAttack(this), f); - - if (flag) { - if (i > 0) { - entity.g((double) (-MathHelper.sin(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F), 0.1D, (double) (MathHelper.cos(this.yaw * 3.1415927F / 180.0F) * (float) i * 0.5F)); - this.motX *= 0.6D; - this.motZ *= 0.6D; - } - - int j = EnchantmentManager.getFireAspectEnchantmentLevel(this); - - if (j > 0) { - // CraftBukkit start - Call a combust event when somebody hits with a fire enchanted item - EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), j * 4); - org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent); - - if (!combustEvent.isCancelled()) { - entity.setOnFire(combustEvent.getDuration()); - } - // CraftBukkit end - } - - if (entity instanceof EntityLiving) { - EnchantmentManager.a((EntityLiving) entity, (Entity) this); - } - - EnchantmentManager.b(this, entity); - } - - return flag; - } - - protected void a(Entity entity, float f) { - if (this.attackTicks <= 0 && f < 2.0F && entity.boundingBox.e > this.boundingBox.b && entity.boundingBox.b < this.boundingBox.e) { - this.attackTicks = 20; - this.n(entity); - } - } - - public float a(int i, int j, int k) { - return 0.5F - this.world.n(i, j, k); - } - - protected boolean j_() { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - - if (this.world.b(EnumSkyBlock.SKY, i, j, k) > this.random.nextInt(32)) { - return false; - } else { - int l = this.world.getLightLevel(i, j, k); - - if (this.world.P()) { - int i1 = this.world.j; - - this.world.j = 10; - l = this.world.getLightLevel(i, j, k); - this.world.j = i1; - } - - return l <= this.random.nextInt(8); - } - } - - public boolean canSpawn() { - return this.world.difficulty != EnumDifficulty.PEACEFUL && this.j_() && super.canSpawn(); - } - - protected void aD() { - super.aD(); - this.getAttributeMap().b(GenericAttributes.e); - } - - protected boolean aG() { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/EntityMushroomCow.java b/src/main/java/net/minecraft/server/EntityMushroomCow.java deleted file mode 100644 index b4e43061..00000000 --- a/src/main/java/net/minecraft/server/EntityMushroomCow.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.player.PlayerShearEntityEvent; // CraftBukkit - -public class EntityMushroomCow extends EntityCow { - - public EntityMushroomCow(World world) { - super(world); - this.a(0.9F, 1.3F); - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.BOWL && this.getAge() >= 0) { - if (itemstack.count == 1) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, new ItemStack(Items.MUSHROOM_SOUP)); - return true; - } - - if (entityhuman.inventory.pickup(new ItemStack(Items.MUSHROOM_SOUP)) && !entityhuman.abilities.canInstantlyBuild) { - entityhuman.inventory.splitStack(entityhuman.inventory.itemInHandIndex, 1); - return true; - } - } - - if (itemstack != null && itemstack.getItem() == Items.SHEARS && this.getAge() >= 0) { - // CraftBukkit start - PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - this.die(); - this.world.addParticle("largeexplode", this.locX, this.locY + (double) (this.length / 2.0F), this.locZ, 0.0D, 0.0D, 0.0D); - if (!this.world.isStatic) { - EntityCow entitycow = new EntityCow(this.world); - - entitycow.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - entitycow.setHealth(this.getHealth()); - entitycow.aM = this.aM; - this.world.addEntity(entitycow); - - for (int i = 0; i < 5; ++i) { - this.world.addEntity(new EntityItem(this.world, this.locX, this.locY + (double) this.length, this.locZ, new ItemStack(Blocks.RED_MUSHROOM))); - } - - itemstack.damage(1, entityhuman); - this.makeSound("mob.sheep.shear", 1.0F, 1.0F); - } - - return true; - } else { - return super.a(entityhuman); - } - } - - public EntityMushroomCow c(EntityAgeable entityageable) { - return new EntityMushroomCow(this.world); - } - - public EntityCow b(EntityAgeable entityageable) { - return this.c(entityageable); - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.c(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityOcelot.java b/src/main/java/net/minecraft/server/EntityOcelot.java deleted file mode 100644 index aba37489..00000000 --- a/src/main/java/net/minecraft/server/EntityOcelot.java +++ /dev/null @@ -1,232 +0,0 @@ -package net.minecraft.server; - -public class EntityOcelot extends EntityTameableAnimal { - - private PathfinderGoalTempt bq; - - public EntityOcelot(World world) { - super(world); - this.a(0.6F, 0.8F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, this.bp); - this.goalSelector.a(3, this.bq = new PathfinderGoalTempt(this, 0.6D, Items.RAW_FISH, true)); - this.goalSelector.a(4, new PathfinderGoalAvoidPlayer(this, EntityHuman.class, 16.0F, 0.8D, 1.33D)); - this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, 1.0D, 10.0F, 5.0F)); - this.goalSelector.a(6, new PathfinderGoalJumpOnBlock(this, 1.33D)); - this.goalSelector.a(7, new PathfinderGoalLeapAtTarget(this, 0.3F)); - this.goalSelector.a(8, new PathfinderGoalOcelotAttack(this)); - this.goalSelector.a(9, new PathfinderGoalBreed(this, 0.8D)); - this.goalSelector.a(10, new PathfinderGoalRandomStroll(this, 0.8D)); - this.goalSelector.a(11, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 10.0F)); - this.targetSelector.a(1, new PathfinderGoalRandomTargetNonTamed(this, EntityChicken.class, 750, false)); - } - - protected void c() { - super.c(); - this.datawatcher.a(18, Byte.valueOf((byte) 0)); - } - - public void bp() { - if (this.getControllerMove().a()) { - double d0 = this.getControllerMove().b(); - - if (d0 == 0.6D) { - this.setSneaking(true); - this.setSprinting(false); - } else if (d0 == 1.33D) { - this.setSneaking(false); - this.setSprinting(true); - } else { - this.setSneaking(false); - this.setSprinting(false); - } - } else { - this.setSneaking(false); - this.setSprinting(false); - } - } - - protected boolean isTypeNotPersistent() { - return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); - } - - protected void b(float f) {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("CatType", this.getCatType()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setCatType(nbttagcompound.getInt("CatType")); - } - - protected String t() { - return this.isTamed() ? (this.ce() ? "mob.cat.purr" : (this.random.nextInt(4) == 0 ? "mob.cat.purreow" : "mob.cat.meow")) : ""; - } - - protected String aT() { - return "mob.cat.hitt"; - } - - protected String aU() { - return "mob.cat.hitt"; - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Items.LEATHER; - } - - public boolean n(Entity entity) { - return entity.damageEntity(DamageSource.mobAttack(this), 3.0F); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - this.bp.setSitting(false); - return super.damageEntity(damagesource, f); - } - } - - protected void dropDeathLoot(boolean flag, int i) {} - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (this.isTamed()) { - if (this.e(entityhuman) && !this.world.isStatic && !this.c(itemstack)) { - this.bp.setSitting(!this.isSitting()); - } - } else if (this.bq.f() && itemstack != null && itemstack.getItem() == Items.RAW_FISH && entityhuman.f(this) < 9.0D) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - if (!this.world.isStatic) { - // CraftBukkit - added event call and isCancelled check - if (this.random.nextInt(3) == 0 && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { - this.setTamed(true); - this.setCatType(1 + this.world.random.nextInt(3)); - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.i(true); - this.bp.setSitting(true); - this.world.broadcastEntityEffect(this, (byte) 7); - } else { - this.i(false); - this.world.broadcastEntityEffect(this, (byte) 6); - } - } - - return true; - } - - return super.a(entityhuman); - } - - public EntityOcelot b(EntityAgeable entityageable) { - EntityOcelot entityocelot = new EntityOcelot(this.world); - - if (this.isTamed()) { - entityocelot.setOwnerUUID(this.getOwnerUUID()); - entityocelot.setTamed(true); - entityocelot.setCatType(this.getCatType()); - } - - return entityocelot; - } - - public boolean c(ItemStack itemstack) { - return itemstack != null && itemstack.getItem() == Items.RAW_FISH; - } - - public boolean mate(EntityAnimal entityanimal) { - if (entityanimal == this) { - return false; - } else if (!this.isTamed()) { - return false; - } else if (!(entityanimal instanceof EntityOcelot)) { - return false; - } else { - EntityOcelot entityocelot = (EntityOcelot) entityanimal; - - return !entityocelot.isTamed() ? false : this.ce() && entityocelot.ce(); - } - } - - public int getCatType() { - return this.datawatcher.getByte(18); - } - - public void setCatType(int i) { - this.datawatcher.watch(18, Byte.valueOf((byte) i)); - } - - public boolean canSpawn() { - if (this.world.random.nextInt(3) == 0) { - return false; - } else { - if (this.world.b(this.boundingBox) && this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox)) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.boundingBox.b); - int k = MathHelper.floor(this.locZ); - - if (j < 63) { - return false; - } - - Block block = this.world.getType(i, j - 1, k); - - if (block == Blocks.GRASS || block.getMaterial() == Material.LEAVES) { - return true; - } - } - - return false; - } - } - - public String getName() { - return this.hasCustomName() ? this.getCustomName() : (this.isTamed() ? LocaleI18n.get("entity.Cat.name") : super.getName()); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - groupdataentity = super.prepare(groupdataentity); - if (this.world.random.nextInt(7) == 0) { - for (int i = 0; i < 2; ++i) { - EntityOcelot entityocelot = new EntityOcelot(this.world); - - entityocelot.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entityocelot.setAge(-24000); - this.world.addEntity(entityocelot, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.OCELOT_BABY); // CraftBukkit - add SpawnReason - } - } - - return groupdataentity; - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityPainting.java b/src/main/java/net/minecraft/server/EntityPainting.java deleted file mode 100644 index 2c3a233d..00000000 --- a/src/main/java/net/minecraft/server/EntityPainting.java +++ /dev/null @@ -1,81 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -public class EntityPainting extends EntityHanging { - - public EnumArt art; - - public EntityPainting(World world) { - super(world); - this.art = EnumArt.values()[this.random.nextInt(EnumArt.values().length)]; // CraftBukkit - generate a non-null painting - } - - public EntityPainting(World world, int i, int j, int k, int l) { - super(world, i, j, k, l); - ArrayList arraylist = new ArrayList(); - EnumArt[] aenumart = EnumArt.values(); - int i1 = aenumart.length; - - for (int j1 = 0; j1 < i1; ++j1) { - EnumArt enumart = aenumart[j1]; - - this.art = enumart; - this.setDirection(l); - if (this.survives()) { - arraylist.add(enumart); - } - } - - if (!arraylist.isEmpty()) { - this.art = (EnumArt) arraylist.get(this.random.nextInt(arraylist.size())); - } - - this.setDirection(l); - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("Motive", this.art.B); - super.b(nbttagcompound); - } - - public void a(NBTTagCompound nbttagcompound) { - String s = nbttagcompound.getString("Motive"); - EnumArt[] aenumart = EnumArt.values(); - int i = aenumart.length; - - for (int j = 0; j < i; ++j) { - EnumArt enumart = aenumart[j]; - - if (enumart.B.equals(s)) { - this.art = enumart; - } - } - - if (this.art == null) { - this.art = EnumArt.KEBAB; - } - - super.a(nbttagcompound); - } - - public int f() { - return this.art.C; - } - - public int i() { - return this.art.D; - } - - public void b(Entity entity) { - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - if (entityhuman.abilities.canInstantlyBuild) { - return; - } - } - - this.a(new ItemStack(Items.PAINTING), 0.0F); - } -} diff --git a/src/main/java/net/minecraft/server/EntityPig.java b/src/main/java/net/minecraft/server/EntityPig.java deleted file mode 100644 index 98bfd08f..00000000 --- a/src/main/java/net/minecraft/server/EntityPig.java +++ /dev/null @@ -1,159 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntityPig extends EntityAnimal { - - private final PathfinderGoalPassengerCarrotStick bp; - - public EntityPig(World world) { - super(world); - this.a(0.9F, 0.9F); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); - this.goalSelector.a(2, this.bp = new PathfinderGoalPassengerCarrotStick(this, 0.3F)); - this.goalSelector.a(3, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, Items.CARROT_STICK, false)); - this.goalSelector.a(4, new PathfinderGoalTempt(this, 1.2D, Items.CARROT, false)); - this.goalSelector.a(5, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - protected void bn() { - super.bn(); - } - - public boolean bE() { - ItemStack itemstack = ((EntityHuman) this.passenger).be(); - - return itemstack != null && itemstack.getItem() == Items.CARROT_STICK; - } - - protected void c() { - super.c(); - this.datawatcher.a(16, Byte.valueOf((byte) 0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("Saddle", this.hasSaddle()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setSaddle(nbttagcompound.getBoolean("Saddle")); - } - - protected String t() { - return "mob.pig.say"; - } - - protected String aT() { - return "mob.pig.say"; - } - - protected String aU() { - return "mob.pig.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.pig.step", 0.15F, 1.0F); - } - - public boolean a(EntityHuman entityhuman) { - if (super.a(entityhuman)) { - return true; - } else if (this.hasSaddle() && !this.world.isStatic && (this.passenger == null || this.passenger == entityhuman)) { - entityhuman.mount(this); - return true; - } else { - return false; - } - } - - protected Item getLoot() { - return this.isBurning() ? Items.GRILLED_PORK : Items.PORK; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3) + 1 + this.random.nextInt(1 + i); - - for (int k = 0; k < j; ++k) { - if (this.isBurning()) { - this.a(Items.GRILLED_PORK, 1); - } else { - this.a(Items.PORK, 1); - } - } - - if (this.hasSaddle()) { - this.a(Items.SADDLE, 1); - } - } - - public boolean hasSaddle() { - return (this.datawatcher.getByte(16) & 1) != 0; - } - - public void setSaddle(boolean flag) { - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) 1)); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) 0)); - } - } - - public void a(EntityLightning entitylightning) { - if (!this.world.isStatic) { - EntityPigZombie entitypigzombie = new EntityPigZombie(this.world); - - // CraftBukkit start - if (CraftEventFactory.callPigZapEvent(this, entitylightning, entitypigzombie).isCancelled()) { - return; - } - // CraftBukkit end - - entitypigzombie.setEquipment(0, new ItemStack(Items.GOLD_SWORD)); - entitypigzombie.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - // CraftBukkit - added a reason for spawning this creature - this.world.addEntity(entitypigzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); - this.die(); - } - } - - protected void b(float f) { - super.b(f); - if (f > 5.0F && this.passenger instanceof EntityHuman) { - ((EntityHuman) this.passenger).a((Statistic) AchievementList.u); - } - } - - public EntityPig b(EntityAgeable entityageable) { - return new EntityPig(this.world); - } - - public boolean c(ItemStack itemstack) { - return itemstack != null && itemstack.getItem() == Items.CARROT; - } - - public PathfinderGoalPassengerCarrotStick ca() { - return this.bp; - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityPigZombie.java b/src/main/java/net/minecraft/server/EntityPigZombie.java deleted file mode 100644 index f2e895e8..00000000 --- a/src/main/java/net/minecraft/server/EntityPigZombie.java +++ /dev/null @@ -1,160 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.UUID; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class EntityPigZombie extends EntityZombie { - - private static final UUID bq = UUID.fromString("49455A49-7EC5-45BA-B886-3B90B23A1718"); - private static final AttributeModifier br = (new AttributeModifier(bq, "Attacking speed boost", 0.45D, 0)).a(false); - public int angerLevel; // CraftBukkit - private -> public - private int soundDelay; - private Entity bu; - - public EntityPigZombie(World world) { - super(world); - this.fireProof = true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(bp).setValue(0.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.5D); - this.getAttributeInstance(GenericAttributes.e).setValue(5.0D); - } - - protected boolean bk() { - return false; - } - - public void h() { - if (this.bu != this.target && !this.world.isStatic) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(br); - if (this.target != null) { - attributeinstance.a(br); - } - } - - this.bu = this.target; - if (this.soundDelay > 0 && --this.soundDelay == 0) { - this.makeSound("mob.zombiepig.zpigangry", this.bf() * 2.0F, ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 1.8F); - } - - super.h(); - } - - public boolean canSpawn() { - return this.world.difficulty != EnumDifficulty.PEACEFUL && this.world.b(this.boundingBox) && this.world.getCubes(this, this.boundingBox).isEmpty() && !this.world.containsLiquid(this.boundingBox); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("Anger", (short) this.angerLevel); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.angerLevel = nbttagcompound.getShort("Anger"); - } - - protected Entity findTarget() { - return this.angerLevel == 0 ? null : super.findTarget(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - Entity entity = damagesource.getEntity(); - - if (entity instanceof EntityHuman) { - List list = this.world.getEntities(this, this.boundingBox.grow(32.0D, 32.0D, 32.0D)); - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1 instanceof EntityPigZombie) { - EntityPigZombie entitypigzombie = (EntityPigZombie) entity1; - - entitypigzombie.c(entity, EntityTargetEvent.TargetReason.PIG_ZOMBIE_TARGET); - } - } - - this.c(entity, EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY); - } - - return super.damageEntity(damagesource, f); - } - } - - // CraftBukkit start - private void c(Entity entity, EntityTargetEvent.TargetReason reason) { // add TargetReason - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), entity.getBukkitEntity(), reason); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - if (event.getTarget() == null) { - this.target = null; - return; - } - entity = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - // CraftBukkit end - - this.target = entity; - this.angerLevel = 400 + this.random.nextInt(400); - this.soundDelay = this.random.nextInt(40); - } - - protected String t() { - return "mob.zombiepig.zpig"; - } - - protected String aT() { - return "mob.zombiepig.zpighurt"; - } - - protected String aU() { - return "mob.zombiepig.zpigdeath"; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(2 + i); - - int k; - - for (k = 0; k < j; ++k) { - this.a(Items.ROTTEN_FLESH, 1); - } - - j = this.random.nextInt(2 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.GOLD_NUGGET, 1); - } - } - - public boolean a(EntityHuman entityhuman) { - return false; - } - - protected void getRareDrop(int i) { - this.a(Items.GOLD_INGOT, 1); - } - - protected void bC() { - this.setEquipment(0, new ItemStack(Items.GOLD_SWORD)); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - super.prepare(groupdataentity); - this.setVillager(false); - return groupdataentity; - } -} diff --git a/src/main/java/net/minecraft/server/EntityPlayer.java b/src/main/java/net/minecraft/server/EntityPlayer.java deleted file mode 100644 index 84673b46..00000000 --- a/src/main/java/net/minecraft/server/EntityPlayer.java +++ /dev/null @@ -1,1112 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import net.minecraft.util.com.google.common.collect.Sets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.org.apache.commons.io.Charsets; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.WeatherType; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -// CraftBukkit end - -public class EntityPlayer extends EntityHuman implements ICrafting { - - private static final Logger bL = LogManager.getLogger(); - private String locale = "en_US"; - public PlayerConnection playerConnection; - public final MinecraftServer server; - public final PlayerInteractManager playerInteractManager; - public double d; - public double e; - public final List chunkCoordIntPairQueue = new LinkedList(); - public final List removeQueue = new LinkedList(); // CraftBukkit - private -> public - private final ServerStatisticManager bO; - private float bP = Float.MIN_VALUE; - private float bQ = -1.0E8F; - private int bR = -99999999; - private boolean bS = true; - public int lastSentExp = -99999999; // CraftBukkit - private -> public - public int invulnerableTicks = 60; // CraftBukkit - private -> public - private EnumChatVisibility bV; - private boolean bW = true; - private long bX = System.currentTimeMillis(); - private int containerCounter; - public boolean g; - public int ping; - public boolean viewingCredits; - // CraftBukkit start - public String displayName; - public String listName; - public org.bukkit.Location compassTarget; - public int newExp = 0; - public int newLevel = 0; - public int newTotalExp = 0; - public boolean keepLevel = false; - public double maxHealthCache; - public boolean joining = true; - // CraftBukkit end - - public EntityPlayer(MinecraftServer minecraftserver, WorldServer worldserver, GameProfile gameprofile, PlayerInteractManager playerinteractmanager) { - super(worldserver, gameprofile); - playerinteractmanager.player = this; - this.playerInteractManager = playerinteractmanager; - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - int i = chunkcoordinates.x; - int j = chunkcoordinates.z; - int k = chunkcoordinates.y; - - if (!worldserver.worldProvider.g && worldserver.getWorldData().getGameType() != EnumGamemode.ADVENTURE) { - int l = Math.max(5, minecraftserver.getSpawnProtection() - 6); - - i += this.random.nextInt(l * 2) - l; - j += this.random.nextInt(l * 2) - l; - k = worldserver.i(i, j); - } - - this.server = minecraftserver; - this.bO = minecraftserver.getPlayerList().a((EntityHuman) this); - this.W = 0.0F; - this.height = 0.0F; - this.setPositionRotation((double) i + 0.5D, (double) k, (double) j + 0.5D, 0.0F, 0.0F); - - while (!worldserver.getCubes(this, this.boundingBox).isEmpty()) { - this.setPosition(this.locX, this.locY + 1.0D, this.locZ); - } - - // CraftBukkit start - this.displayName = this.getName(); - this.listName = this.getName(); - // this.canPickUpLoot = true; TODO - this.maxHealthCache = this.getMaxHealth(); - // CraftBukkit end - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("playerGameType", 99)) { - if (MinecraftServer.getServer().getForceGamemode()) { - this.playerInteractManager.setGameMode(MinecraftServer.getServer().getGamemode()); - } else { - this.playerInteractManager.setGameMode(EnumGamemode.getById(nbttagcompound.getInt("playerGameType"))); - } - } - this.getBukkitEntity().readExtraData(nbttagcompound); // CraftBukkit - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("playerGameType", this.playerInteractManager.getGameMode().getId()); - this.getBukkitEntity().setExtraData(nbttagcompound); // CraftBukkit - } - - // CraftBukkit start - World fallback code, either respawn location or global spawn - public void spawnIn(World world) { - super.spawnIn(world); - if (world == null) { - this.dead = false; - ChunkCoordinates position = null; - if (this.spawnWorld != null && !this.spawnWorld.equals("")) { - CraftWorld cworld = (CraftWorld) Bukkit.getServer().getWorld(this.spawnWorld); - if (cworld != null && this.getBed() != null) { - world = cworld.getHandle(); - position = EntityHuman.getBed(cworld.getHandle(), this.getBed(), false); - } - } - if (world == null || position == null) { - world = ((CraftWorld) Bukkit.getServer().getWorlds().get(0)).getHandle(); - position = world.getSpawn(); - } - this.world = world; - this.setPosition(position.x + 0.5, position.y, position.z + 0.5); - } - this.dimension = ((WorldServer) this.world).dimension; - this.playerInteractManager.a((WorldServer) world); - } - // CraftBukkit end - - public void levelDown(int i) { - super.levelDown(i); - this.lastSentExp = -1; - } - - public void syncInventory() { - this.activeContainer.addSlotListener(this); - } - - protected void e_() { - this.height = 0.0F; - } - - public float getHeadHeight() { - return 1.62F; - } - - public void h() { - // CraftBukkit start - if (this.joining) { - this.joining = false; - } - // CraftBukkit end - - this.playerInteractManager.a(); - --this.invulnerableTicks; - if (this.noDamageTicks > 0) { - --this.noDamageTicks; - } - - this.activeContainer.b(); - if (!this.world.isStatic && !this.activeContainer.a((EntityHuman) this)) { - this.closeInventory(); - this.activeContainer = this.defaultContainer; - } - - while (!this.removeQueue.isEmpty()) { - int i = Math.min(this.removeQueue.size(), 127); - int[] aint = new int[i]; - Iterator iterator = this.removeQueue.iterator(); - int j = 0; - - while (iterator.hasNext() && j < i) { - aint[j++] = ((Integer) iterator.next()).intValue(); - iterator.remove(); - } - - this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(aint)); - } - - if (!this.chunkCoordIntPairQueue.isEmpty()) { - ArrayList arraylist = new ArrayList(); - Iterator iterator1 = this.chunkCoordIntPairQueue.iterator(); - ArrayList arraylist1 = new ArrayList(); - - Chunk chunk; - - while (iterator1.hasNext() && arraylist.size() < PacketPlayOutMapChunkBulk.c()) { - ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator1.next(); - - if (chunkcoordintpair != null) { - if (this.world.isLoaded(chunkcoordintpair.x << 4, 0, chunkcoordintpair.z << 4)) { - chunk = this.world.getChunkAt(chunkcoordintpair.x, chunkcoordintpair.z); - if (chunk.isReady()) { - arraylist.add(chunk); - arraylist1.addAll(chunk.tileEntities.values()); // CraftBukkit - Get tile entities directly from the chunk instead of the world - iterator1.remove(); - } - } - } else { - iterator1.remove(); - } - } - - if (!arraylist.isEmpty()) { - this.playerConnection.sendPacket(new PacketPlayOutMapChunkBulk(arraylist)); - Iterator iterator2 = arraylist1.iterator(); - - while (iterator2.hasNext()) { - TileEntity tileentity = (TileEntity) iterator2.next(); - - this.b(tileentity); - } - - iterator2 = arraylist.iterator(); - - while (iterator2.hasNext()) { - chunk = (Chunk) iterator2.next(); - this.r().getTracker().a(this, chunk); - } - } - } - } - - public void i() { - try { - super.h(); - - for (int i = 0; i < this.inventory.getSize(); ++i) { - ItemStack itemstack = this.inventory.getItem(i); - - if (itemstack != null && itemstack.getItem().h()) { - Packet packet = ((ItemWorldMapBase) itemstack.getItem()).c(itemstack, this.world, this); - - if (packet != null) { - this.playerConnection.sendPacket(packet); - } - } - } - - // CraftBukkit - Optionally scale health - if (this.getHealth() != this.bQ || this.bR != this.foodData.getFoodLevel() || this.foodData.getSaturationLevel() == 0.0F != this.bS) { - this.playerConnection.sendPacket(new PacketPlayOutUpdateHealth(this.getBukkitEntity().getScaledHealth(), this.foodData.getFoodLevel(), this.foodData.getSaturationLevel())); - this.bQ = this.getHealth(); - this.bR = this.foodData.getFoodLevel(); - this.bS = this.foodData.getSaturationLevel() == 0.0F; - } - - if (this.getHealth() + this.getAbsorptionHearts() != this.bP) { - this.bP = this.getHealth() + this.getAbsorptionHearts(); - // CraftBukkit - Update ALL the scores! - this.world.getServer().getScoreboardManager().updateAllScoresForList(IScoreboardCriteria.f, this.getName(), com.google.common.collect.ImmutableList.of(this)); - } - - // CraftBukkit start - Force max health updates - if (this.maxHealthCache != this.getMaxHealth()) { - this.getBukkitEntity().updateScaledHealth(); - } - // CraftBukkit end - - if (this.expTotal != this.lastSentExp) { - this.lastSentExp = this.expTotal; - this.playerConnection.sendPacket(new PacketPlayOutExperience(this.exp, this.expTotal, this.expLevel)); - } - - if (this.ticksLived % 20 * 5 == 0 && !this.getStatisticManager().hasAchievement(AchievementList.L)) { - this.j(); - } - - // CraftBukkit start - initialize oldLevel and fire PlayerLevelChangeEvent - if (this.oldLevel == -1) { - this.oldLevel = this.expLevel; - } - - if (this.oldLevel != this.expLevel) { - CraftEventFactory.callPlayerLevelChangeEvent(this.world.getServer().getPlayer((EntityPlayer) this), this.oldLevel, this.expLevel); - this.oldLevel = this.expLevel; - } - // CraftBukkit end - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Ticking player"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Player being ticked"); - - this.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - protected void j() { - BiomeBase biomebase = this.world.getBiome(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - - if (biomebase != null) { - String s = biomebase.af; - AchievementSet achievementset = (AchievementSet) this.getStatisticManager().b((Statistic) AchievementList.L); // CraftBukkit - fix decompile error - - if (achievementset == null) { - achievementset = (AchievementSet) this.getStatisticManager().a(AchievementList.L, new AchievementSet()); - } - - achievementset.add(s); - if (this.getStatisticManager().b(AchievementList.L) && achievementset.size() == BiomeBase.n.size()) { - HashSet hashset = Sets.newHashSet(BiomeBase.n); - Iterator iterator = achievementset.iterator(); - - while (iterator.hasNext()) { - String s1 = (String) iterator.next(); - Iterator iterator1 = hashset.iterator(); - - while (iterator1.hasNext()) { - BiomeBase biomebase1 = (BiomeBase) iterator1.next(); - - if (biomebase1.af.equals(s1)) { - iterator1.remove(); - } - } - - if (hashset.isEmpty()) { - break; - } - } - - if (hashset.isEmpty()) { - this.a((Statistic) AchievementList.L); - } - } - } - } - - public void die(DamageSource damagesource) { - // CraftBukkit start - fire PlayerDeathEvent - if (this.dead) { - return; - } - - java.util.List<org.bukkit.inventory.ItemStack> loot = new java.util.ArrayList<org.bukkit.inventory.ItemStack>(); - boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); - - if (!keepInventory) { - for (int i = 0; i < this.inventory.items.length; ++i) { - if (this.inventory.items[i] != null) { - loot.add(CraftItemStack.asCraftMirror(this.inventory.items[i])); - } - } - - for (int i = 0; i < this.inventory.armor.length; ++i) { - if (this.inventory.armor[i] != null) { - loot.add(CraftItemStack.asCraftMirror(this.inventory.armor[i])); - } - } - } - - IChatBaseComponent chatmessage = this.aW().b(); - - String deathmessage = chatmessage.c(); - org.bukkit.event.entity.PlayerDeathEvent event = CraftEventFactory.callPlayerDeathEvent(this, loot, deathmessage, keepInventory); - - String deathMessage = event.getDeathMessage(); - - if (deathMessage != null && deathMessage.length() > 0) { - if (deathMessage.equals(deathmessage)) { - this.server.getPlayerList().sendMessage(chatmessage); - } else { - this.server.getPlayerList().sendMessage(org.bukkit.craftbukkit.util.CraftChatMessage.fromString(deathMessage)); - } - } - - // we clean the player's inventory after the EntityDeathEvent is called so plugins can get the exact state of the inventory. - if (!event.getKeepInventory()) { - for (int i = 0; i < this.inventory.items.length; ++i) { - this.inventory.items[i] = null; - } - - for (int i = 0; i < this.inventory.armor.length; ++i) { - this.inventory.armor[i] = null; - } - } - - this.closeInventory(); - // CraftBukkit end - - // CraftBukkit - Get our scores instead - Collection<ScoreboardScore> collection = this.world.getServer().getScoreboardManager().getScoreboardScores(IScoreboardCriteria.c, this.getName(), new java.util.ArrayList<ScoreboardScore>()); - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); // CraftBukkit - Use our scores instead - - scoreboardscore.incrementScore(); - } - - EntityLiving entityliving = this.aX(); - - if (entityliving != null) { - int i = EntityTypes.a(entityliving); - MonsterEggInfo monsteregginfo = (MonsterEggInfo) EntityTypes.eggInfo.get(Integer.valueOf(i)); - - if (monsteregginfo != null) { - this.a(monsteregginfo.e, 1); - } - - entityliving.b(this, this.ba); - } - - this.a(StatisticList.v, 1); - this.aW().g(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - // CraftBukkit - this.server.getPvP() -> this.world.pvpMode - boolean flag = this.server.X() && this.world.pvpMode && "fall".equals(damagesource.translationIndex); - - if (!flag && this.invulnerableTicks > 0 && damagesource != DamageSource.OUT_OF_WORLD) { - return false; - } else { - if (damagesource instanceof EntityDamageSource) { - Entity entity = damagesource.getEntity(); - - if (entity instanceof EntityHuman && !this.a((EntityHuman) entity)) { - return false; - } - - if (entity instanceof EntityArrow) { - EntityArrow entityarrow = (EntityArrow) entity; - - if (entityarrow.shooter instanceof EntityHuman && !this.a((EntityHuman) entityarrow.shooter)) { - return false; - } - } - } - - return super.damageEntity(damagesource, f); - } - } - } - - public boolean a(EntityHuman entityhuman) { - // CraftBukkit - this.server.getPvP() -> this.world.pvpMode - return !this.world.pvpMode ? false : super.a(entityhuman); - } - - public void b(int i) { - if (this.dimension == 1 && i == 1) { - this.a((Statistic) AchievementList.D); - this.world.kill(this); - this.viewingCredits = true; - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(4, 0.0F)); - } else { - if (this.dimension == 0 && i == 1) { - this.a((Statistic) AchievementList.C); - // CraftBukkit start - Rely on custom portal management - /* - ChunkCoordinates chunkcoordinates = this.server.getWorldServer(i).getDimensionSpawn(); - - if (chunkcoordinates != null) { - this.playerConnection.a((double) chunkcoordinates.x, (double) chunkcoordinates.y, (double) chunkcoordinates.z, 0.0F, 0.0F); - } - - i = 1; - */ - // CraftBukkit end - } else { - this.a((Statistic) AchievementList.y); - } - - // CraftBukkit start - TeleportCause cause = (this.dimension == 1 || i == 1) ? TeleportCause.END_PORTAL : TeleportCause.NETHER_PORTAL; - this.server.getPlayerList().changeDimension(this, i, cause); - // CraftBukkit end - this.lastSentExp = -1; - this.bQ = -1.0F; - this.bR = -1; - } - } - - private void b(TileEntity tileentity) { - if (tileentity != null) { - Packet packet = tileentity.getUpdatePacket(); - - if (packet != null) { - this.playerConnection.sendPacket(packet); - } - } - } - - public void receive(Entity entity, int i) { - super.receive(entity, i); - this.activeContainer.b(); - } - - public EnumBedResult a(int i, int j, int k) { - EnumBedResult enumbedresult = super.a(i, j, k); - - if (enumbedresult == EnumBedResult.OK) { - PacketPlayOutBed packetplayoutbed = new PacketPlayOutBed(this, i, j, k); - - this.r().getTracker().a((Entity) this, (Packet) packetplayoutbed); - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - this.playerConnection.sendPacket(packetplayoutbed); - } - - return enumbedresult; - } - - public void a(boolean flag, boolean flag1, boolean flag2) { - if (!this.sleeping) return; // CraftBukkit - Can't leave bed if not in one! - - if (this.isSleeping()) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 2)); - } - - super.a(flag, flag1, flag2); - if (this.playerConnection != null) { - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - } - } - - public void mount(Entity entity) { - // CraftBukkit start - this.setPassengerOf(entity); - } - - public void setPassengerOf(Entity entity) { - // mount(null) doesn't really fly for overloaded methods, - // so this method is needed - Entity currentVehicle = this.vehicle; - - super.setPassengerOf(entity); - - // Check if the vehicle actually changed. - if (currentVehicle != this.vehicle) { - this.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this, this.vehicle)); - this.playerConnection.a(this.locX, this.locY, this.locZ, this.yaw, this.pitch); - } - // CraftBukkit end - } - - protected void a(double d0, boolean flag) {} - - public void b(double d0, boolean flag) { - super.a(d0, flag); - } - - public void a(TileEntity tileentity) { - if (tileentity instanceof TileEntitySign) { - ((TileEntitySign) tileentity).a((EntityHuman) this); - this.playerConnection.sendPacket(new PacketPlayOutOpenSignEditor(tileentity.x, tileentity.y, tileentity.z)); - } - } - - public int nextContainerCounter() { // CraftBukkit - private void -> public int - this.containerCounter = this.containerCounter % 100 + 1; - return this.containerCounter; // CraftBukkit - } - - public void startCrafting(int i, int j, int k) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerWorkbench(this.inventory, this.world, i, j, k)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 1, "Crafting", 9, true)); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void startEnchanting(int i, int j, int k, String s) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerEnchantTable(this.inventory, this.world, i, j, k)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 4, s == null ? "" : s, 9, s != null)); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openAnvil(int i, int j, int k) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerAnvil(this.inventory, this.world, i, j, k, this)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 8, "Repairing", 9, true)); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openContainer(IInventory iinventory) { - if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); - } - - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerChest(this.inventory, iinventory)); - if (container == null) { - iinventory.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 0, iinventory.getInventoryName(), iinventory.getSize(), iinventory.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openHopper(TileEntityHopper tileentityhopper) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHopper(this.inventory, tileentityhopper)); - if (container == null) { - tileentityhopper.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 9, tileentityhopper.getInventoryName(), tileentityhopper.getSize(), tileentityhopper.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openMinecartHopper(EntityMinecartHopper entityminecarthopper) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHopper(this.inventory, entityminecarthopper)); - if (container == null) { - entityminecarthopper.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 9, entityminecarthopper.getInventoryName(), entityminecarthopper.getSize(), entityminecarthopper.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openFurnace(TileEntityFurnace tileentityfurnace) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerFurnace(this.inventory, tileentityfurnace)); - if (container == null) { - tileentityfurnace.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 2, tileentityfurnace.getInventoryName(), tileentityfurnace.getSize(), tileentityfurnace.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openDispenser(TileEntityDispenser tileentitydispenser) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerDispenser(this.inventory, tileentitydispenser)); - if (container == null) { - tileentitydispenser.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, tileentitydispenser instanceof TileEntityDropper ? 10 : 3, tileentitydispenser.getInventoryName(), tileentitydispenser.getSize(), tileentitydispenser.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openBrewingStand(TileEntityBrewingStand tileentitybrewingstand) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerBrewingStand(this.inventory, tileentitybrewingstand)); - if (container == null) { - tileentitybrewingstand.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 5, tileentitybrewingstand.getInventoryName(), tileentitybrewingstand.getSize(), tileentitybrewingstand.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openBeacon(TileEntityBeacon tileentitybeacon) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerBeacon(this.inventory, tileentitybeacon)); - if (container == null) { - tileentitybeacon.closeContainer(); - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 7, tileentitybeacon.getInventoryName(), tileentitybeacon.getSize(), tileentitybeacon.k_())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void openTrade(IMerchant imerchant, String s) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerMerchant(this.inventory, imerchant, this.world)); - if (container == null) { - return; - } - // CraftBukkit end - - this.nextContainerCounter(); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - InventoryMerchant inventorymerchant = ((ContainerMerchant) this.activeContainer).getMerchantInventory(); - - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 6, s == null ? "" : s, inventorymerchant.getSize(), s != null)); - MerchantRecipeList merchantrecipelist = imerchant.getOffers(this); - - if (merchantrecipelist != null) { - PacketDataSerializer packetdataserializer = new PacketDataSerializer(Unpooled.buffer()); - - try { - packetdataserializer.writeInt(this.containerCounter); - merchantrecipelist.a(packetdataserializer); - this.playerConnection.sendPacket(new PacketPlayOutCustomPayload("MC|TrList", packetdataserializer)); - } catch (Exception ioexception) { // CraftBukkit - IOException -> Exception - bL.error("Couldn\'t send trade list", ioexception); - } finally { - packetdataserializer.release(); - } - } - } - - public void openHorseInventory(EntityHorse entityhorse, IInventory iinventory) { - // CraftBukkit start - Inventory open hook - Container container = CraftEventFactory.callInventoryOpenEvent(this, new ContainerHorse(this.inventory, iinventory, entityhorse)); - if (container == null) { - iinventory.closeContainer(); - return; - } - // CraftBukkit end - - if (this.activeContainer != this.defaultContainer) { - this.closeInventory(); - } - - this.nextContainerCounter(); - this.playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.containerCounter, 11, iinventory.getInventoryName(), iinventory.getSize(), iinventory.k_(), entityhorse.getId())); - this.activeContainer = container; // CraftBukkit - Use container we passed to event - this.activeContainer.windowId = this.containerCounter; - this.activeContainer.addSlotListener(this); - } - - public void a(Container container, int i, ItemStack itemstack) { - if (!(container.getSlot(i) instanceof SlotResult)) { - if (!this.g) { - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, i, itemstack)); - } - } - } - - public void updateInventory(Container container) { - this.a(container, container.a()); - } - - public void a(Container container, List list) { - this.playerConnection.sendPacket(new PacketPlayOutWindowItems(container.windowId, list)); - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried())); - // CraftBukkit start - Send a Set Slot to update the crafting result slot - if (java.util.EnumSet.of(InventoryType.CRAFTING,InventoryType.WORKBENCH).contains(container.getBukkitView().getType())) { - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(container.windowId, 0, container.getSlot(0).getItem())); - } - // CraftBukkit end - } - - public void setContainerData(Container container, int i, int j) { - this.playerConnection.sendPacket(new PacketPlayOutWindowData(container.windowId, i, j)); - } - - public void closeInventory() { - CraftEventFactory.handleInventoryCloseEvent(this); // CraftBukkit - this.playerConnection.sendPacket(new PacketPlayOutCloseWindow(this.activeContainer.windowId)); - this.m(); - } - - public void broadcastCarriedItem() { - if (!this.g) { - this.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.inventory.getCarried())); - } - } - - public void m() { - this.activeContainer.b((EntityHuman) this); - this.activeContainer = this.defaultContainer; - } - - public void a(float f, float f1, boolean flag, boolean flag1) { - if (this.vehicle != null) { - if (f >= -1.0F && f <= 1.0F) { - this.bd = f; - } - - if (f1 >= -1.0F && f1 <= 1.0F) { - this.be = f1; - } - - this.bc = flag; - this.setSneaking(flag1); - } - } - - public void a(Statistic statistic, int i) { - if (statistic != null) { - this.bO.b(this, statistic, i); - Iterator iterator = this.getScoreboard().getObjectivesForCriteria(statistic.k()).iterator(); - - while (iterator.hasNext()) { - ScoreboardObjective scoreboardobjective = (ScoreboardObjective) iterator.next(); - - this.getScoreboard().getPlayerScoreForObjective(this.getName(), scoreboardobjective).incrementScore(); - } - - if (this.bO.e()) { - this.bO.a(this); - } - } - } - - public void n() { - if (this.passenger != null) { - this.passenger.mount(this); - } - - if (this.sleeping) { - this.a(true, false, false); - } - } - - public void triggerHealthUpdate() { - this.bQ = -1.0E8F; - this.lastSentExp = -1; // CraftBukkit - Added to reset - } - - public void b(IChatBaseComponent ichatbasecomponent) { - this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); - } - - protected void p() { - this.playerConnection.sendPacket(new PacketPlayOutEntityStatus(this, (byte) 9)); - super.p(); - } - - public void a(ItemStack itemstack, int i) { - super.a(itemstack, i); - if (itemstack != null && itemstack.getItem() != null && itemstack.getItem().d(itemstack) == EnumAnimation.EAT) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(this, 3)); - } - } - - public void copyTo(EntityHuman entityhuman, boolean flag) { - super.copyTo(entityhuman, flag); - this.lastSentExp = -1; - this.bQ = -1.0F; - this.bR = -1; - this.removeQueue.addAll(((EntityPlayer) entityhuman).removeQueue); - } - - protected void a(MobEffect mobeffect) { - super.a(mobeffect); - this.playerConnection.sendPacket(new PacketPlayOutEntityEffect(this.getId(), mobeffect)); - } - - protected void a(MobEffect mobeffect, boolean flag) { - super.a(mobeffect, flag); - this.playerConnection.sendPacket(new PacketPlayOutEntityEffect(this.getId(), mobeffect)); - } - - protected void b(MobEffect mobeffect) { - super.b(mobeffect); - this.playerConnection.sendPacket(new PacketPlayOutRemoveEntityEffect(this.getId(), mobeffect)); - } - - public void enderTeleportTo(double d0, double d1, double d2) { - this.playerConnection.a(d0, d1, d2, this.yaw, this.pitch); - } - - public void b(Entity entity) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(entity, 4)); - } - - public void c(Entity entity) { - this.r().getTracker().sendPacketToEntity(this, new PacketPlayOutAnimation(entity, 5)); - } - - public void updateAbilities() { - if (this.playerConnection != null) { - this.playerConnection.sendPacket(new PacketPlayOutAbilities(this.abilities)); - } - } - - public WorldServer r() { - return (WorldServer) this.world; - } - - public void a(EnumGamemode enumgamemode) { - this.playerInteractManager.setGameMode(enumgamemode); - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, (float) enumgamemode.getId())); - } - - // CraftBukkit start - Support multi-line messages - public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { - for (IChatBaseComponent component : ichatbasecomponent) { - this.sendMessage(component); - } - } - // CraftBukkit end - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.playerConnection.sendPacket(new PacketPlayOutChat(ichatbasecomponent)); - } - - public boolean a(int i, String s) { - if ("seed".equals(s) && !this.server.X()) { - return true; - } else if (!"tell".equals(s) && !"help".equals(s) && !"me".equals(s)) { - if (this.server.getPlayerList().isOp(this.getProfile())) { - OpListEntry oplistentry = (OpListEntry) this.server.getPlayerList().getOPs().get(this.getProfile()); - - return oplistentry != null ? oplistentry.a() >= i : this.server.l() >= i; - } else { - return false; - } - } else { - return true; - } - } - - public String s() { - String s = this.playerConnection.networkManager.getSocketAddress().toString(); - - s = s.substring(s.indexOf("/") + 1); - s = s.substring(0, s.indexOf(":")); - return s; - } - - public void a(PacketPlayInSettings packetplayinsettings) { - this.locale = packetplayinsettings.c(); - int i = 256 >> packetplayinsettings.d(); - - if (i > 3 && i < 20) { - ; - } - - this.bV = packetplayinsettings.e(); - this.bW = packetplayinsettings.f(); - if (this.server.N() && this.server.M().equals(this.getName())) { - this.server.a(packetplayinsettings.g()); - } - - this.b(1, !packetplayinsettings.h()); - } - - public EnumChatVisibility getChatFlags() { - return this.bV; - } - - public void setResourcePack(String s) { - this.playerConnection.sendPacket(new PacketPlayOutCustomPayload("MC|RPack", s.getBytes(Charsets.UTF_8))); - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(MathHelper.floor(this.locX), MathHelper.floor(this.locY + 0.5D), MathHelper.floor(this.locZ)); - } - - public void v() { - this.bX = MinecraftServer.ar(); - } - - public ServerStatisticManager getStatisticManager() { - return this.bO; - } - - public void d(Entity entity) { - if (entity instanceof EntityHuman) { - this.playerConnection.sendPacket(new PacketPlayOutEntityDestroy(new int[] { entity.getId()})); - } else { - this.removeQueue.add(Integer.valueOf(entity.getId())); - } - } - - public long x() { - return this.bX; - } - - // CraftBukkit start - Add per-player time and weather. - public long timeOffset = 0; - public boolean relativeTime = true; - - public long getPlayerTime() { - if (this.relativeTime) { - // Adds timeOffset to the current server time. - return this.world.getDayTime() + this.timeOffset; - } else { - // Adds timeOffset to the beginning of this day. - return this.world.getDayTime() - (this.world.getDayTime() % 24000) + this.timeOffset; - } - } - - public WeatherType weather = null; - - public WeatherType getPlayerWeather() { - return this.weather; - } - - public void setPlayerWeather(WeatherType type, boolean plugin) { - if (!plugin && this.weather != null) { - return; - } - - if (plugin) { - this.weather = type; - } - - if (type == WeatherType.DOWNFALL) { - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(2, 0)); - // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, this.world.j(1.0F))); - // this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, this.world.h(1.0F))); - } else { - this.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0)); - } - } - - public void resetPlayerWeather() { - this.weather = null; - this.setPlayerWeather(this.world.getWorldData().hasStorm() ? WeatherType.DOWNFALL : WeatherType.CLEAR, false); - } - - @Override - public String toString() { - return super.toString() + "(" + this.getName() + " at " + this.locX + "," + this.locY + "," + this.locZ + ")"; - } - - public void reset() { - float exp = 0; - boolean keepInventory = this.world.getGameRules().getBoolean("keepInventory"); - - if (this.keepLevel || keepInventory) { - exp = this.exp; - this.newTotalExp = this.expTotal; - this.newLevel = this.expLevel; - } - - this.setHealth(this.getMaxHealth()); - this.fireTicks = 0; - this.fallDistance = 0; - this.foodData = new FoodMetaData(this); - this.expLevel = this.newLevel; - this.expTotal = this.newTotalExp; - this.exp = 0; - this.deathTicks = 0; - this.removeAllEffects(); - this.updateEffects = true; - this.activeContainer = this.defaultContainer; - this.killer = null; - this.lastDamager = null; - this.combatTracker = new CombatTracker(this); - this.lastSentExp = -1; - if (this.keepLevel || keepInventory) { - this.exp = exp; - } else { - this.giveExp(this.newExp); - } - this.keepLevel = false; - } - - @Override - public CraftPlayer getBukkitEntity() { - return (CraftPlayer) super.getBukkitEntity(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/EntityPotion.java b/src/main/java/net/minecraft/server/EntityPotion.java deleted file mode 100644 index 69db29f6..00000000 --- a/src/main/java/net/minecraft/server/EntityPotion.java +++ /dev/null @@ -1,157 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import java.util.HashMap; - -import org.bukkit.craftbukkit.entity.CraftLivingEntity; -import org.bukkit.entity.LivingEntity; -// CraftBukkit end - -public class EntityPotion extends EntityProjectile { - - public ItemStack item; // CraftBukkit private -> public - - public EntityPotion(World world) { - super(world); - } - - public EntityPotion(World world, EntityLiving entityliving, int i) { - this(world, entityliving, new ItemStack(Items.POTION, 1, i)); - } - - public EntityPotion(World world, EntityLiving entityliving, ItemStack itemstack) { - super(world, entityliving); - this.item = itemstack; - } - - public EntityPotion(World world, double d0, double d1, double d2, ItemStack itemstack) { - super(world, d0, d1, d2); - this.item = itemstack; - } - - protected float i() { - return 0.05F; - } - - protected float e() { - return 0.5F; - } - - protected float f() { - return -20.0F; - } - - public void setPotionValue(int i) { - if (this.item == null) { - this.item = new ItemStack(Items.POTION, 1, 0); - } - - this.item.setData(i); - } - - public int getPotionValue() { - if (this.item == null) { - this.item = new ItemStack(Items.POTION, 1, 0); - } - - return this.item.getData(); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - List list = Items.POTION.g(this.item); - - if (true || list != null && !list.isEmpty()) { // CraftBukkit - Call event even if no effects to apply - AxisAlignedBB axisalignedbb = this.boundingBox.grow(4.0D, 2.0D, 4.0D); - List list1 = this.world.a(EntityLiving.class, axisalignedbb); - - if (list1 != null) { // CraftBukkit - Run code even if there are no entities around - Iterator iterator = list1.iterator(); - - // CraftBukkit - HashMap<LivingEntity, Double> affected = new HashMap<LivingEntity, Double>(); - - while (iterator.hasNext()) { - EntityLiving entityliving = (EntityLiving) iterator.next(); - double d0 = this.f(entityliving); - - if (d0 < 16.0D) { - double d1 = 1.0D - Math.sqrt(d0) / 4.0D; - - if (entityliving == movingobjectposition.entity) { - d1 = 1.0D; - } - - // CraftBukkit start - affected.put((LivingEntity) entityliving.getBukkitEntity(), d1); - } - } - - org.bukkit.event.entity.PotionSplashEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPotionSplashEvent(this, affected); - if (!event.isCancelled() && list != null && !list.isEmpty()) { // do not process effects if there are no effects to process - for (LivingEntity victim : event.getAffectedEntities()) { - if (!(victim instanceof CraftLivingEntity)) { - continue; - } - - EntityLiving entityliving = ((CraftLivingEntity) victim).getHandle(); - double d1 = event.getIntensity(victim); - // CraftBukkit end - - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator1.next(); - int i = mobeffect.getEffectId(); - - // CraftBukkit start - Abide by PVP settings - for players only! - if (!this.world.pvpMode && this.getShooter() instanceof EntityPlayer && entityliving instanceof EntityPlayer && entityliving != this.getShooter()) { - // Block SLOWER_MOVEMENT, SLOWER_DIG, HARM, BLINDNESS, HUNGER, WEAKNESS and POISON potions - if (i == 2 || i == 4 || i == 7 || i == 15 || i == 17 || i == 18 || i == 19) continue; - } - // CraftBukkit end - - if (MobEffectList.byId[i].isInstant()) { - // CraftBukkit - Added 'this' - MobEffectList.byId[i].applyInstantEffect(this.getShooter(), entityliving, mobeffect.getAmplifier(), d1, this); - } else { - int j = (int) (d1 * (double) mobeffect.getDuration() + 0.5D); - - if (j > 20) { - entityliving.addEffect(new MobEffect(i, j, mobeffect.getAmplifier())); - } - } - } - } - } - } - } - - this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), this.getPotionValue()); - this.die(); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("Potion", 10)) { - this.item = ItemStack.createStack(nbttagcompound.getCompound("Potion")); - } else { - this.setPotionValue(nbttagcompound.getInt("potionValue")); - } - - if (this.item == null) { - this.die(); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.item != null) { - nbttagcompound.set("Potion", this.item.save(new NBTTagCompound())); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityProjectile.java b/src/main/java/net/minecraft/server/EntityProjectile.java deleted file mode 100644 index 7f8a33bc..00000000 --- a/src/main/java/net/minecraft/server/EntityProjectile.java +++ /dev/null @@ -1,249 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -public abstract class EntityProjectile extends Entity implements IProjectile { - - private int blockX = -1; - private int blockY = -1; - private int blockZ = -1; - private Block inBlockId; - protected boolean inGround; - public int shake; - public EntityLiving shooter; // CraftBukkit - private -> public - public String shooterName; // CraftBukkit - private -> public - private int i; - private int at; - - public EntityProjectile(World world) { - super(world); - this.a(0.25F, 0.25F); - } - - protected void c() {} - - public EntityProjectile(World world, EntityLiving entityliving) { - super(world); - this.shooter = entityliving; - this.projectileSource = (org.bukkit.entity.LivingEntity) entityliving.getBukkitEntity(); // CraftBukkit - this.a(0.25F, 0.25F); - this.setPositionRotation(entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight(), entityliving.locZ, entityliving.yaw, entityliving.pitch); - this.locX -= (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.locY -= 0.10000000149011612D; - this.locZ -= (double) (MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * 0.16F); - this.setPosition(this.locX, this.locY, this.locZ); - this.height = 0.0F; - float f = 0.4F; - - this.motX = (double) (-MathHelper.sin(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motZ = (double) (MathHelper.cos(this.yaw / 180.0F * 3.1415927F) * MathHelper.cos(this.pitch / 180.0F * 3.1415927F) * f); - this.motY = (double) (-MathHelper.sin((this.pitch + this.f()) / 180.0F * 3.1415927F) * f); - this.shoot(this.motX, this.motY, this.motZ, this.e(), 1.0F); - } - - public EntityProjectile(World world, double d0, double d1, double d2) { - super(world); - this.i = 0; - this.a(0.25F, 0.25F); - this.setPosition(d0, d1, d2); - this.height = 0.0F; - } - - protected float e() { - return 1.5F; - } - - protected float f() { - return 0.0F; - } - - public void shoot(double d0, double d1, double d2, float f, float f1) { - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - d0 /= (double) f2; - d1 /= (double) f2; - d2 /= (double) f2; - d0 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d1 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d2 += this.random.nextGaussian() * 0.007499999832361937D * (double) f1; - d0 *= (double) f; - d1 *= (double) f; - d2 *= (double) f; - this.motX = d0; - this.motY = d1; - this.motZ = d2; - float f3 = MathHelper.sqrt(d0 * d0 + d2 * d2); - - this.lastYaw = this.yaw = (float) (Math.atan2(d0, d2) * 180.0D / 3.1415927410125732D); - this.lastPitch = this.pitch = (float) (Math.atan2(d1, (double) f3) * 180.0D / 3.1415927410125732D); - this.i = 0; - } - - public void h() { - this.S = this.locX; - this.T = this.locY; - this.U = this.locZ; - super.h(); - if (this.shake > 0) { - --this.shake; - } - - if (this.inGround) { - if (this.world.getType(this.blockX, this.blockY, this.blockZ) == this.inBlockId) { - ++this.i; - if (this.i == 1200) { - this.die(); - } - - return; - } - - this.inGround = false; - this.motX *= (double) (this.random.nextFloat() * 0.2F); - this.motY *= (double) (this.random.nextFloat() * 0.2F); - this.motZ *= (double) (this.random.nextFloat() * 0.2F); - this.i = 0; - this.at = 0; - } else { - ++this.at; - } - - Vec3D vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - Vec3D vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - MovingObjectPosition movingobjectposition = this.world.a(vec3d, vec3d1); - - vec3d = Vec3D.a(this.locX, this.locY, this.locZ); - vec3d1 = Vec3D.a(this.locX + this.motX, this.locY + this.motY, this.locZ + this.motZ); - if (movingobjectposition != null) { - vec3d1 = Vec3D.a(movingobjectposition.pos.a, movingobjectposition.pos.b, movingobjectposition.pos.c); - } - - if (!this.world.isStatic) { - Entity entity = null; - List list = this.world.getEntities(this, this.boundingBox.a(this.motX, this.motY, this.motZ).grow(1.0D, 1.0D, 1.0D)); - double d0 = 0.0D; - EntityLiving entityliving = this.getShooter(); - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (entity1.R() && (entity1 != entityliving || this.at >= 5)) { - float f = 0.3F; - AxisAlignedBB axisalignedbb = entity1.boundingBox.grow((double) f, (double) f, (double) f); - MovingObjectPosition movingobjectposition1 = axisalignedbb.a(vec3d, vec3d1); - - if (movingobjectposition1 != null) { - double d1 = vec3d.distanceSquared(movingobjectposition1.pos); // CraftBukkit - distance efficiency - - if (d1 < d0 || d0 == 0.0D) { - entity = entity1; - d0 = d1; - } - } - } - } - - if (entity != null) { - movingobjectposition = new MovingObjectPosition(entity); - } - } - - if (movingobjectposition != null) { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK && this.world.getType(movingobjectposition.b, movingobjectposition.c, movingobjectposition.d) == Blocks.PORTAL) { - this.ah(); - } else { - this.a(movingobjectposition); - // CraftBukkit start - if (this.dead) { - org.bukkit.craftbukkit.event.CraftEventFactory.callProjectileHitEvent(this); - } - // CraftBukkit end - } - } - - this.locX += this.motX; - this.locY += this.motY; - this.locZ += this.motZ; - float f1 = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - - this.yaw = (float) (Math.atan2(this.motX, this.motZ) * 180.0D / 3.1415927410125732D); - - for (this.pitch = (float) (Math.atan2(this.motY, (double) f1) * 180.0D / 3.1415927410125732D); this.pitch - this.lastPitch < -180.0F; this.lastPitch -= 360.0F) { - ; - } - - while (this.pitch - this.lastPitch >= 180.0F) { - this.lastPitch += 360.0F; - } - - while (this.yaw - this.lastYaw < -180.0F) { - this.lastYaw -= 360.0F; - } - - while (this.yaw - this.lastYaw >= 180.0F) { - this.lastYaw += 360.0F; - } - - this.pitch = this.lastPitch + (this.pitch - this.lastPitch) * 0.2F; - this.yaw = this.lastYaw + (this.yaw - this.lastYaw) * 0.2F; - float f2 = 0.99F; - float f3 = this.i(); - - if (this.M()) { - for (int j = 0; j < 4; ++j) { - float f4 = 0.25F; - - this.world.addParticle("bubble", this.locX - this.motX * (double) f4, this.locY - this.motY * (double) f4, this.locZ - this.motZ * (double) f4, this.motX, this.motY, this.motZ); - } - - f2 = 0.8F; - } - - this.motX *= (double) f2; - this.motY *= (double) f2; - this.motZ *= (double) f2; - this.motY -= (double) f3; - this.setPosition(this.locX, this.locY, this.locZ); - } - - protected float i() { - return 0.03F; - } - - protected abstract void a(MovingObjectPosition movingobjectposition); - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("xTile", (short) this.blockX); - nbttagcompound.setShort("yTile", (short) this.blockY); - nbttagcompound.setShort("zTile", (short) this.blockZ); - nbttagcompound.setByte("inTile", (byte) Block.getId(this.inBlockId)); - nbttagcompound.setByte("shake", (byte) this.shake); - nbttagcompound.setByte("inGround", (byte) (this.inGround ? 1 : 0)); - if ((this.shooterName == null || this.shooterName.length() == 0) && this.shooter != null && this.shooter instanceof EntityHuman) { - this.shooterName = this.shooter.getName(); - } - - nbttagcompound.setString("ownerName", this.shooterName == null ? "" : this.shooterName); - } - - public void a(NBTTagCompound nbttagcompound) { - this.blockX = nbttagcompound.getShort("xTile"); - this.blockY = nbttagcompound.getShort("yTile"); - this.blockZ = nbttagcompound.getShort("zTile"); - this.inBlockId = Block.getById(nbttagcompound.getByte("inTile") & 255); - this.shake = nbttagcompound.getByte("shake") & 255; - this.inGround = nbttagcompound.getByte("inGround") == 1; - this.shooterName = nbttagcompound.getString("ownerName"); - if (this.shooterName != null && this.shooterName.length() == 0) { - this.shooterName = null; - } - } - - public EntityLiving getShooter() { - if (this.shooter == null && this.shooterName != null && this.shooterName.length() > 0) { - this.shooter = this.world.a(this.shooterName); - } - - return this.shooter; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySheep.java b/src/main/java/net/minecraft/server/EntitySheep.java deleted file mode 100644 index 381ae787..00000000 --- a/src/main/java/net/minecraft/server/EntitySheep.java +++ /dev/null @@ -1,219 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import org.bukkit.event.entity.SheepRegrowWoolEvent; -import org.bukkit.event.player.PlayerShearEntityEvent; -// CraftBukkit end - -public class EntitySheep extends EntityAnimal { - - private final InventoryCrafting bq = new InventoryCrafting(new ContainerSheepBreed(this), 2, 1); - public static final float[][] bp = new float[][] { { 1.0F, 1.0F, 1.0F}, { 0.85F, 0.5F, 0.2F}, { 0.7F, 0.3F, 0.85F}, { 0.4F, 0.6F, 0.85F}, { 0.9F, 0.9F, 0.2F}, { 0.5F, 0.8F, 0.1F}, { 0.95F, 0.5F, 0.65F}, { 0.3F, 0.3F, 0.3F}, { 0.6F, 0.6F, 0.6F}, { 0.3F, 0.5F, 0.6F}, { 0.5F, 0.25F, 0.7F}, { 0.2F, 0.3F, 0.7F}, { 0.4F, 0.3F, 0.2F}, { 0.4F, 0.5F, 0.2F}, { 0.6F, 0.2F, 0.2F}, { 0.1F, 0.1F, 0.1F}}; - private int br; - private PathfinderGoalEatTile bs = new PathfinderGoalEatTile(this); - - public EntitySheep(World world) { - super(world); - this.a(0.9F, 1.3F); - this.getNavigation().a(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(1, new PathfinderGoalPanic(this, 1.25D)); - this.goalSelector.a(2, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalTempt(this, 1.1D, Items.WHEAT, false)); - this.goalSelector.a(4, new PathfinderGoalFollowParent(this, 1.1D)); - this.goalSelector.a(5, this.bs); - this.goalSelector.a(6, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(7, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.bq.setItem(0, new ItemStack(Items.INK_SACK, 1, 0)); - this.bq.setItem(1, new ItemStack(Items.INK_SACK, 1, 0)); - this.bq.resultInventory = new InventoryCraftResult(); // CraftBukkit - add result slot for event - } - - protected boolean bk() { - return true; - } - - protected void bn() { - this.br = this.bs.f(); - super.bn(); - } - - public void e() { - if (this.world.isStatic) { - this.br = Math.max(0, this.br - 1); - } - - super.e(); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.23000000417232513D); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 0)); - } - - protected void dropDeathLoot(boolean flag, int i) { - if (!this.isSheared()) { - this.a(new ItemStack(Item.getItemOf(Blocks.WOOL), 1, this.getColor()), 0.0F); - } - } - - protected Item getLoot() { - return Item.getItemOf(Blocks.WOOL); - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (itemstack != null && itemstack.getItem() == Items.SHEARS && !this.isSheared() && !this.isBaby()) { - if (!this.world.isStatic) { - // CraftBukkit start - PlayerShearEntityEvent event = new PlayerShearEntityEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), this.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - this.setSheared(true); - int i = 1 + this.random.nextInt(3); - - for (int j = 0; j < i; ++j) { - EntityItem entityitem = this.a(new ItemStack(Item.getItemOf(Blocks.WOOL), 1, this.getColor()), 1.0F); - - entityitem.motY += (double) (this.random.nextFloat() * 0.05F); - entityitem.motX += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); - entityitem.motZ += (double) ((this.random.nextFloat() - this.random.nextFloat()) * 0.1F); - } - } - - itemstack.damage(1, entityhuman); - this.makeSound("mob.sheep.shear", 1.0F, 1.0F); - } - - return super.a(entityhuman); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("Sheared", this.isSheared()); - nbttagcompound.setByte("Color", (byte) this.getColor()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setSheared(nbttagcompound.getBoolean("Sheared")); - this.setColor(nbttagcompound.getByte("Color")); - } - - protected String t() { - return "mob.sheep.say"; - } - - protected String aT() { - return "mob.sheep.say"; - } - - protected String aU() { - return "mob.sheep.say"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.sheep.step", 0.15F, 1.0F); - } - - public int getColor() { - return this.datawatcher.getByte(16) & 15; - } - - public void setColor(int i) { - byte b0 = this.datawatcher.getByte(16); - - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & 240 | i & 15))); - } - - public boolean isSheared() { - return (this.datawatcher.getByte(16) & 16) != 0; - } - - public void setSheared(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 16))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -17))); - } - } - - public static int a(Random random) { - int i = random.nextInt(100); - - return i < 5 ? 15 : (i < 10 ? 7 : (i < 15 ? 8 : (i < 18 ? 12 : (random.nextInt(500) == 0 ? 6 : 0)))); - } - - public EntitySheep b(EntityAgeable entityageable) { - EntitySheep entitysheep = (EntitySheep) entityageable; - EntitySheep entitysheep1 = new EntitySheep(this.world); - int i = this.a(this, entitysheep); - - entitysheep1.setColor(15 - i); - return entitysheep1; - } - - public void p() { - // CraftBukkit start - SheepRegrowWoolEvent event = new SheepRegrowWoolEvent((org.bukkit.entity.Sheep) this.getBukkitEntity()); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setSheared(false); - } - // CraftBukkit end - - if (this.isBaby()) { - this.a(60); - } - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - groupdataentity = super.prepare(groupdataentity); - this.setColor(a(this.world.random)); - return groupdataentity; - } - - private int a(EntityAnimal entityanimal, EntityAnimal entityanimal1) { - int i = this.b(entityanimal); - int j = this.b(entityanimal1); - - this.bq.getItem(0).setData(i); - this.bq.getItem(1).setData(j); - ItemStack itemstack = CraftingManager.getInstance().craft(this.bq, ((EntitySheep) entityanimal).world); - int k; - - if (itemstack != null && itemstack.getItem() == Items.INK_SACK) { - k = itemstack.getData(); - } else { - k = this.world.random.nextBoolean() ? i : j; - } - - return k; - } - - private int b(EntityAnimal entityanimal) { - return 15 - ((EntitySheep) entityanimal).getColor(); - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntitySilverfish.java b/src/main/java/net/minecraft/server/EntitySilverfish.java deleted file mode 100644 index ac5714f0..00000000 --- a/src/main/java/net/minecraft/server/EntitySilverfish.java +++ /dev/null @@ -1,171 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.org.apache.commons.lang3.tuple.ImmutablePair; - -import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit - -public class EntitySilverfish extends EntityMonster { - - private int bp; - - public EntitySilverfish(World world) { - super(world); - this.a(0.3F, 0.7F); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.6000000238418579D); - this.getAttributeInstance(GenericAttributes.e).setValue(1.0D); - } - - protected boolean g_() { - return false; - } - - protected Entity findTarget() { - double d0 = 8.0D; - - return this.world.findNearbyVulnerablePlayer(this, d0); - } - - protected String t() { - return "mob.silverfish.say"; - } - - protected String aT() { - return "mob.silverfish.hit"; - } - - protected String aU() { - return "mob.silverfish.kill"; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - if (this.bp <= 0 && (damagesource instanceof EntityDamageSource || damagesource == DamageSource.MAGIC)) { - this.bp = 20; - } - - return super.damageEntity(damagesource, f); - } - } - - protected void a(Entity entity, float f) { - if (this.attackTicks <= 0 && f < 1.2F && entity.boundingBox.e > this.boundingBox.b && entity.boundingBox.b < this.boundingBox.e) { - this.attackTicks = 20; - this.n(entity); - } - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.silverfish.step", 0.15F, 1.0F); - } - - protected Item getLoot() { - return Item.getById(0); - } - - public void h() { - this.aM = this.yaw; - super.h(); - } - - protected void bq() { - super.bq(); - if (!this.world.isStatic) { - int i; - int j; - int k; - int l; - - if (this.bp > 0) { - --this.bp; - if (this.bp == 0) { - i = MathHelper.floor(this.locX); - j = MathHelper.floor(this.locY); - k = MathHelper.floor(this.locZ); - boolean flag = false; - - for (int i1 = 0; !flag && i1 <= 5 && i1 >= -5; i1 = i1 <= 0 ? 1 - i1 : 0 - i1) { - for (l = 0; !flag && l <= 10 && l >= -10; l = l <= 0 ? 1 - l : 0 - l) { - for (int j1 = 0; !flag && j1 <= 10 && j1 >= -10; j1 = j1 <= 0 ? 1 - j1 : 0 - j1) { - if (this.world.getType(i + l, j + i1, k + j1) == Blocks.MONSTER_EGGS) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, i + l, j + i1, k + j1, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - if (!this.world.getGameRules().getBoolean("mobGriefing")) { - int k1 = this.world.getData(i + l, j + i1, k + j1); - ImmutablePair immutablepair = BlockMonsterEggs.b(k1); - - this.world.setTypeAndData(i + l, j + i1, k + j1, (Block) immutablepair.getLeft(), ((Integer) immutablepair.getRight()).intValue(), 3); - } else { - this.world.setAir(i + l, j + i1, k + j1, false); - } - - Blocks.MONSTER_EGGS.postBreak(this.world, i + l, j + i1, k + j1, 0); - if (this.random.nextBoolean()) { - flag = true; - break; - } - } - } - } - } - } - } - - if (this.target == null && !this.bS()) { - i = MathHelper.floor(this.locX); - j = MathHelper.floor(this.locY + 0.5D); - k = MathHelper.floor(this.locZ); - int l1 = this.random.nextInt(6); - Block block = this.world.getType(i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1]); - - l = this.world.getData(i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1]); - if (BlockMonsterEggs.a(block)) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1], Blocks.MONSTER_EGGS, Block.getId(BlockMonsterEggs.getById(l))).isCancelled()) { - return; - } - // CraftBukkit end - - this.world.setTypeAndData(i + Facing.b[l1], j + Facing.c[l1], k + Facing.d[l1], Blocks.MONSTER_EGGS, BlockMonsterEggs.a(block, l), 3); - this.s(); - this.die(); - } else { - this.bQ(); - } - } else if (this.target != null && !this.bS()) { - this.target = null; - } - } - } - - public float a(int i, int j, int k) { - return this.world.getType(i, j - 1, k) == Blocks.STONE ? 10.0F : super.a(i, j, k); - } - - protected boolean j_() { - return true; - } - - public boolean canSpawn() { - if (super.canSpawn()) { - EntityHuman entityhuman = this.world.findNearbyPlayer(this, 5.0D); - - return entityhuman == null; - } else { - return false; - } - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.ARTHROPOD; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySkeleton.java b/src/main/java/net/minecraft/server/EntitySkeleton.java deleted file mode 100644 index 479936f3..00000000 --- a/src/main/java/net/minecraft/server/EntitySkeleton.java +++ /dev/null @@ -1,294 +0,0 @@ -package net.minecraft.server; - -import java.util.Calendar; - -import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit - -public class EntitySkeleton extends EntityMonster implements IRangedEntity { - - private PathfinderGoalArrowAttack bp = new PathfinderGoalArrowAttack(this, 1.0D, 20, 60, 15.0F); - private PathfinderGoalMeleeAttack bq = new PathfinderGoalMeleeAttack(this, EntityHuman.class, 1.2D, false); - - public EntitySkeleton(World world) { - super(world); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalRestrictSun(this)); - this.goalSelector.a(3, new PathfinderGoalFleeSun(this, 1.0D)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(6, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); - if (world != null && !world.isStatic) { - this.bZ(); - } - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.d).setValue(0.25D); - } - - protected void c() { - super.c(); - this.datawatcher.a(13, new Byte((byte) 0)); - } - - public boolean bk() { - return true; - } - - protected String t() { - return "mob.skeleton.say"; - } - - protected String aT() { - return "mob.skeleton.hurt"; - } - - protected String aU() { - return "mob.skeleton.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.skeleton.step", 0.15F, 1.0F); - } - - public boolean n(Entity entity) { - if (super.n(entity)) { - if (this.getSkeletonType() == 1 && entity instanceof EntityLiving) { - ((EntityLiving) entity).addEffect(new MobEffect(MobEffectList.WITHER.id, 200)); - } - - return true; - } else { - return false; - } - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEAD; - } - - public void e() { - if (this.world.w() && !this.world.isStatic) { - float f = this.d(1.0F); - - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { - boolean flag = true; - ItemStack itemstack = this.getEquipment(4); - - if (itemstack != null) { - if (itemstack.g()) { - itemstack.setData(itemstack.j() + this.random.nextInt(2)); - if (itemstack.j() >= itemstack.l()) { - this.a(itemstack); - this.setEquipment(4, (ItemStack) null); - } - } - - flag = false; - } - - if (flag) { - // CraftBukkit start - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } - } - - if (this.world.isStatic && this.getSkeletonType() == 1) { - this.a(0.72F, 2.34F); - } - - super.e(); - } - - public void ab() { - super.ab(); - if (this.vehicle instanceof EntityCreature) { - EntityCreature entitycreature = (EntityCreature) this.vehicle; - - this.aM = entitycreature.aM; - } - } - - public void die(DamageSource damagesource) { - super.die(damagesource); - if (damagesource.i() instanceof EntityArrow && damagesource.getEntity() instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) damagesource.getEntity(); - double d0 = entityhuman.locX - this.locX; - double d1 = entityhuman.locZ - this.locZ; - - if (d0 * d0 + d1 * d1 >= 2500.0D) { - entityhuman.a((Statistic) AchievementList.v); - } - } - } - - protected Item getLoot() { - return Items.ARROW; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j; - int k; - - if (this.getSkeletonType() == 1) { - j = this.random.nextInt(3 + i) - 1; - - for (k = 0; k < j; ++k) { - this.a(Items.COAL, 1); - } - } else { - j = this.random.nextInt(3 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.ARROW, 1); - } - } - - j = this.random.nextInt(3 + i); - - for (k = 0; k < j; ++k) { - this.a(Items.BONE, 1); - } - } - - protected void getRareDrop(int i) { - if (this.getSkeletonType() == 1) { - this.a(new ItemStack(Items.SKULL, 1, 1), 0.0F); - } - } - - protected void bC() { - super.bC(); - this.setEquipment(0, new ItemStack(Items.BOW)); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - groupdataentity = super.prepare(groupdataentity); - if (this.world.worldProvider instanceof WorldProviderHell && this.aI().nextInt(5) > 0) { - this.goalSelector.a(4, this.bq); - this.setSkeletonType(1); - this.setEquipment(0, new ItemStack(Items.STONE_SWORD)); - this.getAttributeInstance(GenericAttributes.e).setValue(4.0D); - } else { - this.goalSelector.a(4, this.bp); - this.bC(); - this.bD(); - } - - this.h(this.random.nextFloat() < 0.55F * this.world.b(this.locX, this.locY, this.locZ)); - if (this.getEquipment(4) == null) { - Calendar calendar = this.world.V(); - - if (calendar.get(2) + 1 == 10 && calendar.get(5) == 31 && this.random.nextFloat() < 0.25F) { - this.setEquipment(4, new ItemStack(this.random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.PUMPKIN)); - this.dropChances[4] = 0.0F; - } - } - - return groupdataentity; - } - - public void bZ() { - this.goalSelector.a((PathfinderGoal) this.bq); - this.goalSelector.a((PathfinderGoal) this.bp); - ItemStack itemstack = this.be(); - - if (itemstack != null && itemstack.getItem() == Items.BOW) { - this.goalSelector.a(4, this.bp); - } else { - this.goalSelector.a(4, this.bq); - } - } - - public void a(EntityLiving entityliving, float f) { - EntityArrow entityarrow = new EntityArrow(this.world, this, entityliving, 1.6F, (float) (14 - this.world.difficulty.a() * 4)); - int i = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_DAMAGE.id, this.be()); - int j = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_KNOCKBACK.id, this.be()); - - entityarrow.b((double) (f * 2.0F) + this.random.nextGaussian() * 0.25D + (double) ((float) this.world.difficulty.a() * 0.11F)); - if (i > 0) { - entityarrow.b(entityarrow.e() + (double) i * 0.5D + 0.5D); - } - - if (j > 0) { - entityarrow.setKnockbackStrength(j); - } - - if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, this.be()) > 0 || this.getSkeletonType() == 1) { - // CraftBukkit start - call EntityCombustEvent - EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - entityarrow.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - - // CraftBukkit start - org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(this, this.be(), entityarrow, 0.8F); - if (event.isCancelled()) { - event.getProjectile().remove(); - return; - } - - if (event.getProjectile() == entityarrow.getBukkitEntity()) { - world.addEntity(entityarrow); - } - // CraftBukkit end - - this.makeSound("random.bow", 1.0F, 1.0F / (this.aI().nextFloat() * 0.4F + 0.8F)); - // this.world.addEntity(entityarrow); // CraftBukkit - moved up - } - - public int getSkeletonType() { - return this.datawatcher.getByte(13); - } - - public void setSkeletonType(int i) { - this.datawatcher.watch(13, Byte.valueOf((byte) i)); - this.fireProof = i == 1; - if (i == 1) { - this.a(0.72F, 2.34F); - } else { - this.a(0.6F, 1.8F); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("SkeletonType", 99)) { - byte b0 = nbttagcompound.getByte("SkeletonType"); - - this.setSkeletonType(b0); - } - - this.bZ(); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setByte("SkeletonType", (byte) this.getSkeletonType()); - } - - public void setEquipment(int i, ItemStack itemstack) { - super.setEquipment(i, itemstack); - if (!this.world.isStatic && i == 0) { - this.bZ(); - } - } - - public double ad() { - return super.ad() - 0.5D; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySlime.java b/src/main/java/net/minecraft/server/EntitySlime.java deleted file mode 100644 index 65cd24dd..00000000 --- a/src/main/java/net/minecraft/server/EntitySlime.java +++ /dev/null @@ -1,265 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTargetEvent; -import org.bukkit.event.entity.SlimeSplitEvent; -// CraftBukkit end - -public class EntitySlime extends EntityInsentient implements IMonster { - - public float h; - public float i; - public float bm; - private int jumpDelay; - private Entity lastTarget; // CraftBukkit - - public EntitySlime(World world) { - super(world); - int i = 1 << this.random.nextInt(3); - - this.height = 0.0F; - this.jumpDelay = this.random.nextInt(20) + 10; - this.setSize(i); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 1)); - } - - // CraftBukkit - protected -> public - public void setSize(int i) { - this.datawatcher.watch(16, new Byte((byte) i)); - this.a(0.6F * (float) i, 0.6F * (float) i); - this.setPosition(this.locX, this.locY, this.locZ); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue((double) (i * i)); - this.setHealth(this.getMaxHealth()); - this.b = i; - } - - public int getSize() { - return this.datawatcher.getByte(16); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Size", this.getSize() - 1); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - int i = nbttagcompound.getInt("Size"); - - if (i < 0) { - i = 0; - } - - this.setSize(i + 1); - } - - protected String bP() { - return "slime"; - } - - protected String bV() { - return "mob.slime." + (this.getSize() > 1 ? "big" : "small"); - } - - public void h() { - if (!this.world.isStatic && this.world.difficulty == EnumDifficulty.PEACEFUL && this.getSize() > 0) { - this.dead = true; - } - - this.i += (this.h - this.i) * 0.5F; - this.bm = this.i; - boolean flag = this.onGround; - - super.h(); - int i; - - if (this.onGround && !flag) { - i = this.getSize(); - - for (int j = 0; j < i * 8; ++j) { - float f = this.random.nextFloat() * 3.1415927F * 2.0F; - float f1 = this.random.nextFloat() * 0.5F + 0.5F; - float f2 = MathHelper.sin(f) * (float) i * 0.5F * f1; - float f3 = MathHelper.cos(f) * (float) i * 0.5F * f1; - - this.world.addParticle(this.bP(), this.locX + (double) f2, this.boundingBox.b, this.locZ + (double) f3, 0.0D, 0.0D, 0.0D); - } - - if (this.bW()) { - this.makeSound(this.bV(), this.bf(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) / 0.8F); - } - - this.h = -0.5F; - } else if (!this.onGround && flag) { - this.h = 1.0F; - } - - this.bS(); - if (this.world.isStatic) { - i = this.getSize(); - this.a(0.6F * (float) i, 0.6F * (float) i); - } - } - - protected void bq() { - this.w(); - // CraftBukkit start - Entity entityhuman = this.world.findNearbyVulnerablePlayer(this, 16.0D); // EntityHuman -> Entity - EntityTargetEvent event = null; - - if (entityhuman != null && !entityhuman.equals(lastTarget)) { - event = CraftEventFactory.callEntityTargetEvent(this, entityhuman, EntityTargetEvent.TargetReason.CLOSEST_PLAYER); - } else if (lastTarget != null && entityhuman == null) { - event = CraftEventFactory.callEntityTargetEvent(this, entityhuman, EntityTargetEvent.TargetReason.FORGOT_TARGET); - } - - if (event != null && !event.isCancelled()) { - entityhuman = event.getTarget() == null ? null : ((CraftEntity) event.getTarget()).getHandle(); - } - - this.lastTarget = entityhuman; - // CraftBukkit end - - if (entityhuman != null) { - this.a(entityhuman, 10.0F, 20.0F); - } - - if (this.onGround && this.jumpDelay-- <= 0) { - this.jumpDelay = this.bR(); - if (entityhuman != null) { - this.jumpDelay /= 3; - } - - this.bc = true; - if (this.bY()) { - this.makeSound(this.bV(), this.bf(), ((this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F) * 0.8F); - } - - this.bd = 1.0F - this.random.nextFloat() * 2.0F; - this.be = (float) (1 * this.getSize()); - } else { - this.bc = false; - if (this.onGround) { - this.bd = this.be = 0.0F; - } - } - } - - protected void bS() { - this.h *= 0.6F; - } - - protected int bR() { - return this.random.nextInt(20) + 10; - } - - protected EntitySlime bQ() { - return new EntitySlime(this.world); - } - - public void die() { - int i = this.getSize(); - - if (!this.world.isStatic && i > 1 && this.getHealth() <= 0.0F) { - int j = 2 + this.random.nextInt(3); - - // CraftBukkit start - SlimeSplitEvent event = new SlimeSplitEvent((org.bukkit.entity.Slime) this.getBukkitEntity(), j); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled() && event.getCount() > 0) { - j = event.getCount(); - } else { - super.die(); - return; - } - // CraftBukkit end - - for (int k = 0; k < j; ++k) { - float f = ((float) (k % 2) - 0.5F) * (float) i / 4.0F; - float f1 = ((float) (k / 2) - 0.5F) * (float) i / 4.0F; - EntitySlime entityslime = this.bQ(); - - entityslime.setSize(i / 2); - entityslime.setPositionRotation(this.locX + (double) f, this.locY + 0.5D, this.locZ + (double) f1, this.random.nextFloat() * 360.0F, 0.0F); - this.world.addEntity(entityslime, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SLIME_SPLIT); // CraftBukkit - SpawnReason - } - } - - super.die(); - } - - public void b_(EntityHuman entityhuman) { - if (this.bT()) { - int i = this.getSize(); - - if (this.hasLineOfSight(entityhuman) && this.f(entityhuman) < 0.6D * (double) i * 0.6D * (double) i && entityhuman.damageEntity(DamageSource.mobAttack(this), (float) this.bU())) { - this.makeSound("mob.attack", 1.0F, (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - } - } - } - - protected boolean bT() { - return this.getSize() > 1; - } - - protected int bU() { - return this.getSize(); - } - - protected String aT() { - return "mob.slime." + (this.getSize() > 1 ? "big" : "small"); - } - - protected String aU() { - return "mob.slime." + (this.getSize() > 1 ? "big" : "small"); - } - - protected Item getLoot() { - return this.getSize() == 1 ? Items.SLIME_BALL : Item.getById(0); - } - - public boolean canSpawn() { - Chunk chunk = this.world.getChunkAtWorldCoords(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - - if (this.world.getWorldData().getType() == WorldType.FLAT && this.random.nextInt(4) != 1) { - return false; - } else { - if (this.getSize() == 1 || this.world.difficulty != EnumDifficulty.PEACEFUL) { - BiomeBase biomebase = this.world.getBiome(MathHelper.floor(this.locX), MathHelper.floor(this.locZ)); - - if (biomebase == BiomeBase.SWAMPLAND && this.locY > 50.0D && this.locY < 70.0D && this.random.nextFloat() < 0.5F && this.random.nextFloat() < this.world.y() && this.world.getLightLevel(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ)) <= this.random.nextInt(8)) { - return super.canSpawn(); - } - - if (this.random.nextInt(10) == 0 && chunk.a(987234911L).nextInt(10) == 0 && this.locY < 40.0D) { - return super.canSpawn(); - } - } - - return false; - } - } - - protected float bf() { - return 0.4F * (float) this.getSize(); - } - - public int x() { - return 0; - } - - protected boolean bY() { - return this.getSize() > 0; - } - - protected boolean bW() { - return this.getSize() > 2; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySmallFireball.java b/src/main/java/net/minecraft/server/EntitySmallFireball.java deleted file mode 100644 index 4d61eec2..00000000 --- a/src/main/java/net/minecraft/server/EntitySmallFireball.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityCombustByEntityEvent; // CraftBukkit - -public class EntitySmallFireball extends EntityFireball { - - public EntitySmallFireball(World world) { - super(world); - this.a(0.3125F, 0.3125F); - } - - public EntitySmallFireball(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world, entityliving, d0, d1, d2); - this.a(0.3125F, 0.3125F); - } - - public EntitySmallFireball(World world, double d0, double d1, double d2, double d3, double d4, double d5) { - super(world, d0, d1, d2, d3, d4, d5); - this.a(0.3125F, 0.3125F); - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - if (movingobjectposition.entity != null) { - if (!movingobjectposition.entity.isFireproof() && movingobjectposition.entity.damageEntity(DamageSource.fireball(this, this.shooter), 5.0F)) { - // CraftBukkit start - Entity damage by entity event + combust event - EntityCombustByEntityEvent event = new EntityCombustByEntityEvent((org.bukkit.entity.Projectile) this.getBukkitEntity(), movingobjectposition.entity.getBukkitEntity(), 5); - movingobjectposition.entity.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - movingobjectposition.entity.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } else { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - switch (movingobjectposition.face) { - case 0: - --j; - break; - - case 1: - ++j; - break; - - case 2: - --k; - break; - - case 3: - ++k; - break; - - case 4: - --i; - break; - - case 5: - ++i; - } - - if (this.world.isEmpty(i, j, k)) { - // CraftBukkit start - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - - this.die(); - } - } - - public boolean R() { - return false; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - return false; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySnowman.java b/src/main/java/net/minecraft/server/EntitySnowman.java deleted file mode 100644 index 2811fb46..00000000 --- a/src/main/java/net/minecraft/server/EntitySnowman.java +++ /dev/null @@ -1,89 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.event.block.EntityBlockFormEvent; -// CraftBukkit end - -public class EntitySnowman extends EntityGolem implements IRangedEntity { - - public EntitySnowman(World world) { - super(world); - this.a(0.4F, 1.8F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalArrowAttack(this, 1.25D, 20, 10.0F)); - this.goalSelector.a(2, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(3, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 6.0F)); - this.goalSelector.a(4, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 0, true, false, IMonster.a)); - } - - public boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(4.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.20000000298023224D); - } - - public void e() { - super.e(); - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - - if (this.L()) { - this.damageEntity(DamageSource.DROWN, 1.0F); - } - - if (this.world.getBiome(i, k).a(i, j, k) > 1.0F) { - this.damageEntity(CraftEventFactory.MELTING, 1.0F); // CraftBukkit - DamageSource.BURN -> CraftEventFactory.MELTING - } - - for (int l = 0; l < 4; ++l) { - i = MathHelper.floor(this.locX + (double) ((float) (l % 2 * 2 - 1) * 0.25F)); - j = MathHelper.floor(this.locY); - k = MathHelper.floor(this.locZ + (double) ((float) (l / 2 % 2 * 2 - 1) * 0.25F)); - if (this.world.getType(i, j, k).getMaterial() == Material.AIR && this.world.getBiome(i, k).a(i, j, k) < 0.8F && Blocks.SNOW.canPlace(this.world, i, j, k)) { - // CraftBukkit start - org.bukkit.block.BlockState blockState = this.world.getWorld().getBlockAt(i, j, k).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(Blocks.SNOW)); - - EntityBlockFormEvent event = new EntityBlockFormEvent(this.getBukkitEntity(), blockState.getBlock(), blockState); - this.world.getServer().getPluginManager().callEvent(event); - - if(!event.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - } - } - - protected Item getLoot() { - return Items.SNOW_BALL; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(16); - - for (int k = 0; k < j; ++k) { - this.a(Items.SNOW_BALL, 1); - } - } - - public void a(EntityLiving entityliving, float f) { - EntitySnowball entitysnowball = new EntitySnowball(this.world, this); - double d0 = entityliving.locX - this.locX; - double d1 = entityliving.locY + (double) entityliving.getHeadHeight() - 1.100000023841858D - entitysnowball.locY; - double d2 = entityliving.locZ - this.locZ; - float f1 = MathHelper.sqrt(d0 * d0 + d2 * d2) * 0.2F; - - entitysnowball.shoot(d0, d1 + (double) f1, d2, 1.6F, 12.0F); - this.makeSound("random.bow", 1.0F, 1.0F / (this.aI().nextFloat() * 0.4F + 0.8F)); - this.world.addEntity(entitysnowball); - } -} diff --git a/src/main/java/net/minecraft/server/EntitySpider.java b/src/main/java/net/minecraft/server/EntitySpider.java deleted file mode 100644 index 99704478..00000000 --- a/src/main/java/net/minecraft/server/EntitySpider.java +++ /dev/null @@ -1,162 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class EntitySpider extends EntityMonster { - - public EntitySpider(World world) { - super(world); - this.a(1.4F, 0.9F); - } - - protected void c() { - super.c(); - this.datawatcher.a(16, new Byte((byte) 0)); - } - - public void h() { - super.h(); - if (!this.world.isStatic) { - this.a(this.positionChanged); - } - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(16.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.800000011920929D); - } - - protected Entity findTarget() { - float f = this.d(1.0F); - - if (f < 0.5F) { - double d0 = 16.0D; - - return this.world.findNearbyVulnerablePlayer(this, d0); - } else { - return null; - } - } - - protected String t() { - return "mob.spider.say"; - } - - protected String aT() { - return "mob.spider.say"; - } - - protected String aU() { - return "mob.spider.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.spider.step", 0.15F, 1.0F); - } - - protected void a(Entity entity, float f) { - float f1 = this.d(1.0F); - - if (f1 > 0.5F && this.random.nextInt(100) == 0) { - // CraftBukkit start - EntityTargetEvent event = new EntityTargetEvent(this.getBukkitEntity(), null, EntityTargetEvent.TargetReason.FORGOT_TARGET); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - if (event.getTarget() == null) { - this.target = null; - } else { - this.target = ((org.bukkit.craftbukkit.entity.CraftEntity) event.getTarget()).getHandle(); - } - return; - } - // CraftBukkit end - } else { - if (f > 2.0F && f < 6.0F && this.random.nextInt(10) == 0) { - if (this.onGround) { - double d0 = entity.locX - this.locX; - double d1 = entity.locZ - this.locZ; - float f2 = MathHelper.sqrt(d0 * d0 + d1 * d1); - - this.motX = d0 / (double) f2 * 0.5D * 0.800000011920929D + this.motX * 0.20000000298023224D; - this.motZ = d1 / (double) f2 * 0.5D * 0.800000011920929D + this.motZ * 0.20000000298023224D; - this.motY = 0.4000000059604645D; - } - } else { - super.a(entity, f); - } - } - } - - protected Item getLoot() { - return Items.STRING; - } - - protected void dropDeathLoot(boolean flag, int i) { - super.dropDeathLoot(flag, i); - if (flag && (this.random.nextInt(3) == 0 || this.random.nextInt(1 + i) > 0)) { - this.a(Items.SPIDER_EYE, 1); - } - } - - public boolean h_() { - return this.bZ(); - } - - public void as() {} - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.ARTHROPOD; - } - - public boolean d(MobEffect mobeffect) { - return mobeffect.getEffectId() == MobEffectList.POISON.id ? false : super.d(mobeffect); - } - - public boolean bZ() { - return (this.datawatcher.getByte(16) & 1) != 0; - } - - public void a(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - b0 = (byte) (b0 | 1); - } else { - b0 &= -2; - } - - this.datawatcher.watch(16, Byte.valueOf(b0)); - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - Object object = super.prepare(groupdataentity); - - if (this.world.random.nextInt(100) == 0) { - EntitySkeleton entityskeleton = new EntitySkeleton(this.world); - - entityskeleton.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entityskeleton.prepare((GroupDataEntity) null); - this.world.addEntity(entityskeleton, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.JOCKEY); // CraftBukkit - add SpawnReason - entityskeleton.mount(this); - } - - if (object == null) { - object = new GroupDataSpider(); - if (this.world.difficulty == EnumDifficulty.HARD && this.world.random.nextFloat() < 0.1F * this.world.b(this.locX, this.locY, this.locZ)) { - ((GroupDataSpider) object).a(this.world.random); - } - } - - if (object instanceof GroupDataSpider) { - int i = ((GroupDataSpider) object).a; - - if (i > 0 && MobEffectList.byId[i] != null) { - this.addEffect(new MobEffect(i, Integer.MAX_VALUE)); - } - } - - return (GroupDataEntity) object; - } -} diff --git a/src/main/java/net/minecraft/server/EntitySquid.java b/src/main/java/net/minecraft/server/EntitySquid.java deleted file mode 100644 index 6e6d612b..00000000 --- a/src/main/java/net/minecraft/server/EntitySquid.java +++ /dev/null @@ -1,151 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.TrigMath; // CraftBukkit - -public class EntitySquid extends EntityWaterAnimal { - - public float bp; - public float bq; - public float br; - public float bs; - public float bt; - public float bu; - public float bv; - public float bw; - private float bx; - private float by; - private float bz; - private float bA; - private float bB; - private float bC; - - public EntitySquid(World world) { - super(world); - this.a(0.95F, 0.95F); - this.by = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(10.0D); - } - - protected String t() { - return null; - } - - protected String aT() { - return null; - } - - protected String aU() { - return null; - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Item.getById(0); - } - - protected boolean g_() { - return false; - } - - protected void dropDeathLoot(boolean flag, int i) { - int j = this.random.nextInt(3 + i) + 1; - - for (int k = 0; k < j; ++k) { - this.a(new ItemStack(Items.INK_SACK, 1, 0), 0.0F); - } - } - - /* CraftBukkit start - Delegate to Entity to use existing inWater value - public boolean M() { - return this.world.a(this.boundingBox.grow(0.0D, -0.6000000238418579D, 0.0D), Material.WATER, (Entity) this); - } - // CraftBukkit end */ - - public void e() { - super.e(); - this.bq = this.bp; - this.bs = this.br; - this.bu = this.bt; - this.bw = this.bv; - this.bt += this.by; - if (this.bt > 6.2831855F) { - this.bt -= 6.2831855F; - if (this.random.nextInt(10) == 0) { - this.by = 1.0F / (this.random.nextFloat() + 1.0F) * 0.2F; - } - } - - if (this.M()) { - float f; - - if (this.bt < 3.1415927F) { - f = this.bt / 3.1415927F; - this.bv = MathHelper.sin(f * f * 3.1415927F) * 3.1415927F * 0.25F; - if ((double) f > 0.75D) { - this.bx = 1.0F; - this.bz = 1.0F; - } else { - this.bz *= 0.8F; - } - } else { - this.bv = 0.0F; - this.bx *= 0.9F; - this.bz *= 0.99F; - } - - if (!this.world.isStatic) { - this.motX = (double) (this.bA * this.bx); - this.motY = (double) (this.bB * this.bx); - this.motZ = (double) (this.bC * this.bx); - } - - f = MathHelper.sqrt(this.motX * this.motX + this.motZ * this.motZ); - // CraftBukkit - Math -> TrigMath - this.aM += (-((float) TrigMath.atan2(this.motX, this.motZ)) * 180.0F / 3.1415927F - this.aM) * 0.1F; - this.yaw = this.aM; - this.br += 3.1415927F * this.bz * 1.5F; - // CraftBukkit - Math -> TrigMath - this.bp += (-((float) TrigMath.atan2((double) f, this.motY)) * 180.0F / 3.1415927F - this.bp) * 0.1F; - } else { - this.bv = MathHelper.abs(MathHelper.sin(this.bt)) * 3.1415927F * 0.25F; - if (!this.world.isStatic) { - this.motX = 0.0D; - this.motY -= 0.08D; - this.motY *= 0.9800000190734863D; - this.motZ = 0.0D; - } - - this.bp = (float) ((double) this.bp + (double) (-90.0F - this.bp) * 0.02D); - } - } - - public void e(float f, float f1) { - this.move(this.motX, this.motY, this.motZ); - } - - protected void bq() { - ++this.aU; - if (this.aU > 100) { - this.bA = this.bB = this.bC = 0.0F; - } else if (this.random.nextInt(50) == 0 || !this.inWater || this.bA == 0.0F && this.bB == 0.0F && this.bC == 0.0F) { - float f = this.random.nextFloat() * 3.1415927F * 2.0F; - - this.bA = MathHelper.cos(f) * 0.2F; - this.bB = -0.1F + this.random.nextFloat() * 0.2F; - this.bC = MathHelper.sin(f) * 0.2F; - } - - this.w(); - } - - public boolean canSpawn() { - return this.locY > 45.0D && this.locY < 63.0D && super.canSpawn(); - } -} diff --git a/src/main/java/net/minecraft/server/EntityTNTPrimed.java b/src/main/java/net/minecraft/server/EntityTNTPrimed.java deleted file mode 100644 index 13cbc79b..00000000 --- a/src/main/java/net/minecraft/server/EntityTNTPrimed.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit - -public class EntityTNTPrimed extends Entity { - - public int fuseTicks; - private EntityLiving source; - public float yield = 4; // CraftBukkit - add field - public boolean isIncendiary = false; // CraftBukkit - add field - - public EntityTNTPrimed(World world) { - super(world); - this.k = true; - this.a(0.98F, 0.98F); - this.height = this.length / 2.0F; - } - - public EntityTNTPrimed(World world, double d0, double d1, double d2, EntityLiving entityliving) { - this(world); - this.setPosition(d0, d1, d2); - float f = (float) (Math.random() * 3.1415927410125732D * 2.0D); - - this.motX = (double) (-((float) Math.sin((double) f)) * 0.02F); - this.motY = 0.20000000298023224D; - this.motZ = (double) (-((float) Math.cos((double) f)) * 0.02F); - this.fuseTicks = 80; - this.lastX = d0; - this.lastY = d1; - this.lastZ = d2; - this.source = entityliving; - } - - protected void c() {} - - protected boolean g_() { - return false; - } - - public boolean R() { - return !this.dead; - } - - public void h() { - this.lastX = this.locX; - this.lastY = this.locY; - this.lastZ = this.locZ; - this.motY -= 0.03999999910593033D; - this.move(this.motX, this.motY, this.motZ); - this.motX *= 0.9800000190734863D; - this.motY *= 0.9800000190734863D; - this.motZ *= 0.9800000190734863D; - if (this.onGround) { - this.motX *= 0.699999988079071D; - this.motZ *= 0.699999988079071D; - this.motY *= -0.5D; - } - - if (this.fuseTicks-- <= 0) { - // CraftBukkit start - Need to reverse the order of the explosion and the entity death so we have a location for the event - if (!this.world.isStatic) { - this.explode(); - } - this.die(); - // CraftBukkit end - } else { - this.world.addParticle("smoke", this.locX, this.locY + 0.5D, this.locZ, 0.0D, 0.0D, 0.0D); - } - } - - private void explode() { - // CraftBukkit start - // float f = 4.0F; - - org.bukkit.craftbukkit.CraftServer server = this.world.getServer(); - - ExplosionPrimeEvent event = new ExplosionPrimeEvent((org.bukkit.entity.Explosive) org.bukkit.craftbukkit.entity.CraftEntity.getEntity(server, this)); - server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - // give 'this' instead of (Entity) null so we know what causes the damage - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), true); - } - // CraftBukkit end - } - - protected void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setByte("Fuse", (byte) this.fuseTicks); - } - - protected void a(NBTTagCompound nbttagcompound) { - this.fuseTicks = nbttagcompound.getByte("Fuse"); - } - - public EntityLiving getSource() { - return this.source; - } -} diff --git a/src/main/java/net/minecraft/server/EntityThrownExpBottle.java b/src/main/java/net/minecraft/server/EntityThrownExpBottle.java deleted file mode 100644 index 68625a48..00000000 --- a/src/main/java/net/minecraft/server/EntityThrownExpBottle.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.minecraft.server; - -public class EntityThrownExpBottle extends EntityProjectile { - - public EntityThrownExpBottle(World world) { - super(world); - } - - public EntityThrownExpBottle(World world, EntityLiving entityliving) { - super(world, entityliving); - } - - public EntityThrownExpBottle(World world, double d0, double d1, double d2) { - super(world, d0, d1, d2); - } - - protected float i() { - return 0.07F; - } - - protected float e() { - return 0.7F; - } - - protected float f() { - return -20.0F; - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - // CraftBukkit - moved to after event - // this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), 0); - int i = 3 + this.world.random.nextInt(5) + this.world.random.nextInt(5); - - // CraftBukkit start - org.bukkit.event.entity.ExpBottleEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callExpBottleEvent(this, i); - i = event.getExperience(); - if (event.getShowEffect()) { - this.world.triggerEffect(2002, (int) Math.round(this.locX), (int) Math.round(this.locY), (int) Math.round(this.locZ), 0); - } - // CraftBukkit end - - while (i > 0) { - int j = EntityExperienceOrb.getOrbValue(i); - - i -= j; - this.world.addEntity(new EntityExperienceOrb(this.world, this.locX, this.locY, this.locZ, j)); - } - - this.die(); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityTracker.java b/src/main/java/net/minecraft/server/EntityTracker.java deleted file mode 100644 index 1af0e67e..00000000 --- a/src/main/java/net/minecraft/server/EntityTracker.java +++ /dev/null @@ -1,211 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Set; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class EntityTracker { - - private static final Logger a = LogManager.getLogger(); - private final WorldServer world; - private Set c = new HashSet(); - public IntHashMap trackedEntities = new IntHashMap(); // CraftBukkit - private -> public - private int e; - - public EntityTracker(WorldServer worldserver) { - this.world = worldserver; - this.e = worldserver.getMinecraftServer().getPlayerList().d(); - } - - public void track(Entity entity) { - if (entity instanceof EntityPlayer) { - this.addEntity(entity, 512, 2); - EntityPlayer entityplayer = (EntityPlayer) entity; - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - if (entitytrackerentry.tracker != entityplayer) { - entitytrackerentry.updatePlayer(entityplayer); - } - } - } else if (entity instanceof EntityFishingHook) { - this.addEntity(entity, 64, 5, true); - } else if (entity instanceof EntityArrow) { - this.addEntity(entity, 64, 20, false); - } else if (entity instanceof EntitySmallFireball) { - this.addEntity(entity, 64, 10, false); - } else if (entity instanceof EntityFireball) { - this.addEntity(entity, 64, 10, false); - } else if (entity instanceof EntitySnowball) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityEnderPearl) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityEnderSignal) { - this.addEntity(entity, 64, 4, true); - } else if (entity instanceof EntityEgg) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityPotion) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityThrownExpBottle) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityFireworks) { - this.addEntity(entity, 64, 10, true); - } else if (entity instanceof EntityItem) { - this.addEntity(entity, 64, 20, true); - } else if (entity instanceof EntityMinecartAbstract) { - this.addEntity(entity, 80, 3, true); - } else if (entity instanceof EntityBoat) { - this.addEntity(entity, 80, 3, true); - } else if (entity instanceof EntitySquid) { - this.addEntity(entity, 64, 3, true); - } else if (entity instanceof EntityWither) { - this.addEntity(entity, 80, 3, false); - } else if (entity instanceof EntityBat) { - this.addEntity(entity, 80, 3, false); - } else if (entity instanceof IAnimal) { - this.addEntity(entity, 80, 3, true); - } else if (entity instanceof EntityEnderDragon) { - this.addEntity(entity, 160, 3, true); - } else if (entity instanceof EntityTNTPrimed) { - this.addEntity(entity, 160, 10, true); - } else if (entity instanceof EntityFallingBlock) { - this.addEntity(entity, 160, 20, true); - } else if (entity instanceof EntityHanging) { - this.addEntity(entity, 160, Integer.MAX_VALUE, false); - } else if (entity instanceof EntityExperienceOrb) { - this.addEntity(entity, 160, 20, true); - } else if (entity instanceof EntityEnderCrystal) { - this.addEntity(entity, 256, Integer.MAX_VALUE, false); - } - } - - public void addEntity(Entity entity, int i, int j) { - this.addEntity(entity, i, j, false); - } - - public void addEntity(Entity entity, int i, int j, boolean flag) { - if (i > this.e) { - i = this.e; - } - - try { - if (this.trackedEntities.b(entity.getId())) { - throw new IllegalStateException("Entity is already tracked!"); - } - - EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(entity, i, j, flag); - - this.c.add(entitytrackerentry); - this.trackedEntities.a(entity.getId(), entitytrackerentry); - entitytrackerentry.scanPlayers(this.world.players); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Adding entity to track"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Entity To Track"); - - crashreportsystemdetails.a("Tracking range", (i + " blocks")); - crashreportsystemdetails.a("Update interval", (Callable) (new CrashReportEntityTrackerUpdateInterval(this, j))); - entity.a(crashreportsystemdetails); - CrashReportSystemDetails crashreportsystemdetails1 = crashreport.a("Entity That Is Already Tracked"); - - ((EntityTrackerEntry) this.trackedEntities.get(entity.getId())).tracker.a(crashreportsystemdetails1); - - try { - throw new ReportedException(crashreport); - } catch (ReportedException reportedexception) { - a.error("\"Silently\" catching entity tracking error.", reportedexception); - } - } - } - - public void untrackEntity(Entity entity) { - if (entity instanceof EntityPlayer) { - EntityPlayer entityplayer = (EntityPlayer) entity; - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - entitytrackerentry.a(entityplayer); - } - } - - EntityTrackerEntry entitytrackerentry1 = (EntityTrackerEntry) this.trackedEntities.d(entity.getId()); - - if (entitytrackerentry1 != null) { - this.c.remove(entitytrackerentry1); - entitytrackerentry1.a(); - } - } - - public void updatePlayers() { - ArrayList arraylist = new ArrayList(); - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - entitytrackerentry.track(this.world.players); - if (entitytrackerentry.n && entitytrackerentry.tracker instanceof EntityPlayer) { - arraylist.add((EntityPlayer) entitytrackerentry.tracker); - } - } - - for (int i = 0; i < arraylist.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) arraylist.get(i); - Iterator iterator1 = this.c.iterator(); - - while (iterator1.hasNext()) { - EntityTrackerEntry entitytrackerentry1 = (EntityTrackerEntry) iterator1.next(); - - if (entitytrackerentry1.tracker != entityplayer) { - entitytrackerentry1.updatePlayer(entityplayer); - } - } - } - } - - public void a(Entity entity, Packet packet) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) this.trackedEntities.get(entity.getId()); - - if (entitytrackerentry != null) { - entitytrackerentry.broadcast(packet); - } - } - - public void sendPacketToEntity(Entity entity, Packet packet) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) this.trackedEntities.get(entity.getId()); - - if (entitytrackerentry != null) { - entitytrackerentry.broadcastIncludingSelf(packet); - } - } - - public void untrackPlayer(EntityPlayer entityplayer) { - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - entitytrackerentry.clear(entityplayer); - } - } - - public void a(EntityPlayer entityplayer, Chunk chunk) { - Iterator iterator = this.c.iterator(); - - while (iterator.hasNext()) { - EntityTrackerEntry entitytrackerentry = (EntityTrackerEntry) iterator.next(); - - if (entitytrackerentry.tracker != entityplayer && entitytrackerentry.tracker.ah == chunk.locX && entitytrackerentry.tracker.aj == chunk.locZ) { - entitytrackerentry.updatePlayer(entityplayer); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/EntityTrackerEntry.java deleted file mode 100644 index 0cf9ad5b..00000000 --- a/src/main/java/net/minecraft/server/EntityTrackerEntry.java +++ /dev/null @@ -1,523 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerVelocityEvent; -// CraftBukkit end - -public class EntityTrackerEntry { - - private static final Logger p = LogManager.getLogger(); - public Entity tracker; - public int b; - public int c; - public int xLoc; - public int yLoc; - public int zLoc; - public int yRot; - public int xRot; - public int i; - public double j; - public double k; - public double l; - public int m; - private double q; - private double r; - private double s; - private boolean isMoving; - private boolean u; - private int v; - private Entity w; - private boolean x; - public boolean n; - public Set trackedPlayers = new HashSet(); - - public EntityTrackerEntry(Entity entity, int i, int j, boolean flag) { - this.tracker = entity; - this.b = i; - this.c = j; - this.u = flag; - this.xLoc = MathHelper.floor(entity.locX * 32.0D); - this.yLoc = MathHelper.floor(entity.locY * 32.0D); - this.zLoc = MathHelper.floor(entity.locZ * 32.0D); - this.yRot = MathHelper.d(entity.yaw * 256.0F / 360.0F); - this.xRot = MathHelper.d(entity.pitch * 256.0F / 360.0F); - this.i = MathHelper.d(entity.getHeadRotation() * 256.0F / 360.0F); - } - - public boolean equals(Object object) { - return object instanceof EntityTrackerEntry ? ((EntityTrackerEntry) object).tracker.getId() == this.tracker.getId() : false; - } - - public int hashCode() { - return this.tracker.getId(); - } - - public void track(List list) { - this.n = false; - if (!this.isMoving || this.tracker.e(this.q, this.r, this.s) > 16.0D) { - this.q = this.tracker.locX; - this.r = this.tracker.locY; - this.s = this.tracker.locZ; - this.isMoving = true; - this.n = true; - this.scanPlayers(list); - } - - if (this.w != this.tracker.vehicle || this.tracker.vehicle != null && this.m % 60 == 0) { - this.w = this.tracker.vehicle; - this.broadcast(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); - } - - if (this.tracker instanceof EntityItemFrame /*&& this.m % 10 == 0*/) { // CraftBukkit - Moved below, should always enter this block - EntityItemFrame i3 = (EntityItemFrame) this.tracker; - ItemStack i4 = i3.getItem(); - - if (this.m % 10 == 0 && i4 != null && i4.getItem() instanceof ItemWorldMap) { // CraftBukkit - Moved this.m % 10 logic here so item frames do not enter the other blocks - WorldMap i6 = Items.MAP.getSavedMap(i4, this.tracker.world); - Iterator i7 = this.trackedPlayers.iterator(); // CraftBukkit - - while (i7.hasNext()) { - EntityHuman i8 = (EntityHuman) i7.next(); - EntityPlayer i9 = (EntityPlayer) i8; - - i6.a(i9, i4); - Packet j0 = Items.MAP.c(i4, this.tracker.world, i9); - - if (j0 != null) { - i9.playerConnection.sendPacket(j0); - } - } - } - - this.b(); - } else if (this.m % this.c == 0 || this.tracker.al || this.tracker.getDataWatcher().a()) { - int i; - int j; - - if (this.tracker.vehicle == null) { - ++this.v; - i = this.tracker.as.a(this.tracker.locX); - j = MathHelper.floor(this.tracker.locY * 32.0D); - int k = this.tracker.as.a(this.tracker.locZ); - int l = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); - int i1 = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); - int j1 = i - this.xLoc; - int k1 = j - this.yLoc; - int l1 = k - this.zLoc; - Object object = null; - boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.m % 60 == 0; - boolean flag1 = Math.abs(l - this.yRot) >= 4 || Math.abs(i1 - this.xRot) >= 4; - - // CraftBukkit start - Code moved from below - if (flag) { - this.xLoc = i; - this.yLoc = j; - this.zLoc = k; - } - - if (flag1) { - this.yRot = l; - this.xRot = i1; - } - // CraftBukkit end - - if (this.m > 0 || this.tracker instanceof EntityArrow) { - if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.v <= 400 && !this.x) { - if (flag && flag1) { - object = new PacketPlayOutRelEntityMoveLook(this.tracker.getId(), (byte) j1, (byte) k1, (byte) l1, (byte) l, (byte) i1); - } else if (flag) { - object = new PacketPlayOutRelEntityMove(this.tracker.getId(), (byte) j1, (byte) k1, (byte) l1); - } else if (flag1) { - object = new PacketPlayOutEntityLook(this.tracker.getId(), (byte) l, (byte) i1); - } - } else { - this.v = 0; - // CraftBukkit start - Refresh list of who can see a player before sending teleport packet - if (this.tracker instanceof EntityPlayer) { - this.scanPlayers(new java.util.ArrayList(this.trackedPlayers)); - } - // CraftBukkit end - object = new PacketPlayOutEntityTeleport(this.tracker.getId(), i, j, k, (byte) l, (byte) i1); - } - } - - if (this.u) { - double d0 = this.tracker.motX - this.j; - double d1 = this.tracker.motY - this.k; - double d2 = this.tracker.motZ - this.l; - double d3 = 0.02D; - double d4 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d4 > d3 * d3 || d4 > 0.0D && this.tracker.motX == 0.0D && this.tracker.motY == 0.0D && this.tracker.motZ == 0.0D) { - this.j = this.tracker.motX; - this.k = this.tracker.motY; - this.l = this.tracker.motZ; - this.broadcast(new PacketPlayOutEntityVelocity(this.tracker.getId(), this.j, this.k, this.l)); - } - } - - if (object != null) { - this.broadcast((Packet) object); - } - - this.b(); - /* CraftBukkit start - Code moved up - if (flag) { - this.xLoc = i; - this.yLoc = j; - this.zLoc = k; - } - - if (flag1) { - this.yRot = l; - this.xRot = i1; - } - // CraftBukkit end */ - - this.x = false; - } else { - i = MathHelper.d(this.tracker.yaw * 256.0F / 360.0F); - j = MathHelper.d(this.tracker.pitch * 256.0F / 360.0F); - boolean flag2 = Math.abs(i - this.yRot) >= 4 || Math.abs(j - this.xRot) >= 4; - - if (flag2) { - this.broadcast(new PacketPlayOutEntityLook(this.tracker.getId(), (byte) i, (byte) j)); - this.yRot = i; - this.xRot = j; - } - - this.xLoc = this.tracker.as.a(this.tracker.locX); - this.yLoc = MathHelper.floor(this.tracker.locY * 32.0D); - this.zLoc = this.tracker.as.a(this.tracker.locZ); - this.b(); - this.x = true; - } - - i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); - if (Math.abs(i - this.i) >= 4) { - this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); - this.i = i; - } - - this.tracker.al = false; - } - - ++this.m; - if (this.tracker.velocityChanged) { - // CraftBukkit start - Create PlayerVelocity event - boolean cancelled = false; - - if (this.tracker instanceof EntityPlayer) { - Player player = (Player) this.tracker.getBukkitEntity(); - org.bukkit.util.Vector velocity = player.getVelocity(); - - PlayerVelocityEvent event = new PlayerVelocityEvent(player, velocity); - this.tracker.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - cancelled = true; - } else if (!velocity.equals(event.getVelocity())) { - player.setVelocity(velocity); - } - } - - if (!cancelled) { - this.broadcastIncludingSelf((Packet) (new PacketPlayOutEntityVelocity(this.tracker))); - } - // CraftBukkit end - - this.tracker.velocityChanged = false; - } - } - - private void b() { - DataWatcher datawatcher = this.tracker.getDataWatcher(); - - if (datawatcher.a()) { - this.broadcastIncludingSelf(new PacketPlayOutEntityMetadata(this.tracker.getId(), datawatcher, false)); - } - - if (this.tracker instanceof EntityLiving) { - AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); - Set set = attributemapserver.getAttributes(); - - if (!set.isEmpty()) { - // CraftBukkit start - Send scaled max health - if (this.tracker instanceof EntityPlayer) { - ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(set, false); - } - // CraftBukkit end - this.broadcastIncludingSelf(new PacketPlayOutUpdateAttributes(this.tracker.getId(), set)); - } - - set.clear(); - } - } - - public void broadcast(Packet packet) { - Iterator iterator = this.trackedPlayers.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - } - - public void broadcastIncludingSelf(Packet packet) { - this.broadcast(packet); - if (this.tracker instanceof EntityPlayer) { - ((EntityPlayer) this.tracker).playerConnection.sendPacket(packet); - } - } - - public void a() { - Iterator iterator = this.trackedPlayers.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - entityplayer.d(this.tracker); - } - } - - public void a(EntityPlayer entityplayer) { - if (this.trackedPlayers.contains(entityplayer)) { - entityplayer.d(this.tracker); - this.trackedPlayers.remove(entityplayer); - } - } - - public void updatePlayer(EntityPlayer entityplayer) { - if (entityplayer != this.tracker) { - double d0 = entityplayer.locX - (double) (this.xLoc / 32); - double d1 = entityplayer.locZ - (double) (this.zLoc / 32); - - if (d0 >= (double) (-this.b) && d0 <= (double) this.b && d1 >= (double) (-this.b) && d1 <= (double) this.b) { - if (!this.trackedPlayers.contains(entityplayer) && (this.d(entityplayer) || this.tracker.attachedToPlayer)) { - // CraftBukkit start - respect vanish API - if (this.tracker instanceof EntityPlayer) { - Player player = ((EntityPlayer) this.tracker).getBukkitEntity(); - if (!entityplayer.getBukkitEntity().canSee(player)) { - return; - } - } - - entityplayer.removeQueue.remove(Integer.valueOf(this.tracker.getId())); - // CraftBukkit end - - this.trackedPlayers.add(entityplayer); - Packet packet = this.c(); - - entityplayer.playerConnection.sendPacket(packet); - if (!this.tracker.getDataWatcher().d()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityMetadata(this.tracker.getId(), this.tracker.getDataWatcher(), true)); - } - - if (this.tracker instanceof EntityLiving) { - AttributeMapServer attributemapserver = (AttributeMapServer) ((EntityLiving) this.tracker).getAttributeMap(); - Collection collection = attributemapserver.c(); - - // CraftBukkit start - If sending own attributes send scaled health instead of current maximum health - if (this.tracker.getId() == entityplayer.getId()) { - ((EntityPlayer) this.tracker).getBukkitEntity().injectScaledMaxHealth(collection, false); - } - // CraftBukkit end - if (!collection.isEmpty()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateAttributes(this.tracker.getId(), collection)); - } - } - - this.j = this.tracker.motX; - this.k = this.tracker.motY; - this.l = this.tracker.motZ; - if (this.u && !(packet instanceof PacketPlayOutSpawnEntityLiving)) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityVelocity(this.tracker.getId(), this.tracker.motX, this.tracker.motY, this.tracker.motZ)); - } - - if (this.tracker.vehicle != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this.tracker, this.tracker.vehicle)); - } - - // CraftBukkit start - if (this.tracker.passenger != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutAttachEntity(0, this.tracker.passenger, this.tracker)); - } - // CraftBukkit end - - if (this.tracker instanceof EntityInsentient && ((EntityInsentient) this.tracker).getLeashHolder() != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutAttachEntity(1, this.tracker, ((EntityInsentient) this.tracker).getLeashHolder())); - } - - if (this.tracker instanceof EntityLiving) { - for (int i = 0; i < 5; ++i) { - ItemStack itemstack = ((EntityLiving) this.tracker).getEquipment(i); - - if (itemstack != null) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEquipment(this.tracker.getId(), i, itemstack)); - } - } - } - - if (this.tracker instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) this.tracker; - - if (entityhuman.isSleeping()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutBed(entityhuman, MathHelper.floor(this.tracker.locX), MathHelper.floor(this.tracker.locY), MathHelper.floor(this.tracker.locZ))); - } - } - - // CraftBukkit start - Fix for nonsensical head yaw - this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); - this.broadcast(new PacketPlayOutEntityHeadRotation(this.tracker, (byte) i)); - // CraftBukkit end - - if (this.tracker instanceof EntityLiving) { - EntityLiving entityliving = (EntityLiving) this.tracker; - Iterator iterator = entityliving.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - entityplayer.playerConnection.sendPacket(new PacketPlayOutEntityEffect(this.tracker.getId(), mobeffect)); - } - } - } - } else if (this.trackedPlayers.contains(entityplayer)) { - this.trackedPlayers.remove(entityplayer); - entityplayer.d(this.tracker); - } - } - } - - private boolean d(EntityPlayer entityplayer) { - return entityplayer.r().getPlayerChunkMap().a(entityplayer, this.tracker.ah, this.tracker.aj); - } - - public void scanPlayers(List list) { - for (int i = 0; i < list.size(); ++i) { - this.updatePlayer((EntityPlayer) list.get(i)); - } - } - - private Packet c() { - if (this.tracker.dead) { - // CraftBukkit start - Remove useless error spam, just return - // p.warn("Fetching addPacket for removed entity"); - return null; - // CraftBukkit end - } - - if (this.tracker instanceof EntityItem) { - return new PacketPlayOutSpawnEntity(this.tracker, 2, 1); - } else if (this.tracker instanceof EntityPlayer) { - return new PacketPlayOutNamedEntitySpawn((EntityHuman) this.tracker); - } else if (this.tracker instanceof EntityMinecartAbstract) { - EntityMinecartAbstract entityminecartabstract = (EntityMinecartAbstract) this.tracker; - - return new PacketPlayOutSpawnEntity(this.tracker, 10, entityminecartabstract.m()); - } else if (this.tracker instanceof EntityBoat) { - return new PacketPlayOutSpawnEntity(this.tracker, 1); - } else if (!(this.tracker instanceof IAnimal) && !(this.tracker instanceof EntityEnderDragon)) { - if (this.tracker instanceof EntityFishingHook) { - EntityHuman entityhuman = ((EntityFishingHook) this.tracker).owner; - - return new PacketPlayOutSpawnEntity(this.tracker, 90, entityhuman != null ? entityhuman.getId() : this.tracker.getId()); - } else if (this.tracker instanceof EntityArrow) { - Entity entity = ((EntityArrow) this.tracker).shooter; - - return new PacketPlayOutSpawnEntity(this.tracker, 60, entity != null ? entity.getId() : this.tracker.getId()); - } else if (this.tracker instanceof EntitySnowball) { - return new PacketPlayOutSpawnEntity(this.tracker, 61); - } else if (this.tracker instanceof EntityPotion) { - return new PacketPlayOutSpawnEntity(this.tracker, 73, ((EntityPotion) this.tracker).getPotionValue()); - } else if (this.tracker instanceof EntityThrownExpBottle) { - return new PacketPlayOutSpawnEntity(this.tracker, 75); - } else if (this.tracker instanceof EntityEnderPearl) { - return new PacketPlayOutSpawnEntity(this.tracker, 65); - } else if (this.tracker instanceof EntityEnderSignal) { - return new PacketPlayOutSpawnEntity(this.tracker, 72); - } else if (this.tracker instanceof EntityFireworks) { - return new PacketPlayOutSpawnEntity(this.tracker, 76); - } else { - PacketPlayOutSpawnEntity packetplayoutspawnentity; - - if (this.tracker instanceof EntityFireball) { - EntityFireball entityfireball = (EntityFireball) this.tracker; - - packetplayoutspawnentity = null; - byte b0 = 63; - - if (this.tracker instanceof EntitySmallFireball) { - b0 = 64; - } else if (this.tracker instanceof EntityWitherSkull) { - b0 = 66; - } - - if (entityfireball.shooter != null) { - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, b0, ((EntityFireball) this.tracker).shooter.getId()); - } else { - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, b0, 0); - } - - packetplayoutspawnentity.d((int) (entityfireball.dirX * 8000.0D)); - packetplayoutspawnentity.e((int) (entityfireball.dirY * 8000.0D)); - packetplayoutspawnentity.f((int) (entityfireball.dirZ * 8000.0D)); - return packetplayoutspawnentity; - } else if (this.tracker instanceof EntityEgg) { - return new PacketPlayOutSpawnEntity(this.tracker, 62); - } else if (this.tracker instanceof EntityTNTPrimed) { - return new PacketPlayOutSpawnEntity(this.tracker, 50); - } else if (this.tracker instanceof EntityEnderCrystal) { - return new PacketPlayOutSpawnEntity(this.tracker, 51); - } else if (this.tracker instanceof EntityFallingBlock) { - EntityFallingBlock entityfallingblock = (EntityFallingBlock) this.tracker; - - return new PacketPlayOutSpawnEntity(this.tracker, 70, Block.getId(entityfallingblock.f()) | entityfallingblock.data << 16); - } else if (this.tracker instanceof EntityPainting) { - return new PacketPlayOutSpawnEntityPainting((EntityPainting) this.tracker); - } else if (this.tracker instanceof EntityItemFrame) { - EntityItemFrame entityitemframe = (EntityItemFrame) this.tracker; - - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, 71, entityitemframe.direction); - packetplayoutspawnentity.a(MathHelper.d((float) (entityitemframe.x * 32))); - packetplayoutspawnentity.b(MathHelper.d((float) (entityitemframe.y * 32))); - packetplayoutspawnentity.c(MathHelper.d((float) (entityitemframe.z * 32))); - return packetplayoutspawnentity; - } else if (this.tracker instanceof EntityLeash) { - EntityLeash entityleash = (EntityLeash) this.tracker; - - packetplayoutspawnentity = new PacketPlayOutSpawnEntity(this.tracker, 77); - packetplayoutspawnentity.a(MathHelper.d((float) (entityleash.x * 32))); - packetplayoutspawnentity.b(MathHelper.d((float) (entityleash.y * 32))); - packetplayoutspawnentity.c(MathHelper.d((float) (entityleash.z * 32))); - return packetplayoutspawnentity; - } else if (this.tracker instanceof EntityExperienceOrb) { - return new PacketPlayOutSpawnEntityExperienceOrb((EntityExperienceOrb) this.tracker); - } else { - throw new IllegalArgumentException("Don\'t know how to add " + this.tracker.getClass() + "!"); - } - } - } else { - this.i = MathHelper.d(this.tracker.getHeadRotation() * 256.0F / 360.0F); - return new PacketPlayOutSpawnEntityLiving((EntityLiving) this.tracker); - } - } - - public void clear(EntityPlayer entityplayer) { - if (this.trackedPlayers.contains(entityplayer)) { - this.trackedPlayers.remove(entityplayer); - entityplayer.d(this.tracker); - } - } -} diff --git a/src/main/java/net/minecraft/server/EntityWither.java b/src/main/java/net/minecraft/server/EntityWither.java deleted file mode 100644 index 75b3ca3a..00000000 --- a/src/main/java/net/minecraft/server/EntityWither.java +++ /dev/null @@ -1,477 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityRegainHealthEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -// CraftBukkit end - -public class EntityWither extends EntityMonster implements IRangedEntity { - - private float[] bp = new float[2]; - private float[] bq = new float[2]; - private float[] br = new float[2]; - private float[] bs = new float[2]; - private int[] bt = new int[2]; - private int[] bu = new int[2]; - private int bv; - private static final IEntitySelector bw = new EntitySelectorNotUndead(); - - public EntityWither(World world) { - super(world); - this.setHealth(this.getMaxHealth()); - this.a(0.9F, 4.0F); - this.fireProof = true; - this.getNavigation().e(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalArrowAttack(this, 1.0D, 40, 20.0F)); - this.goalSelector.a(5, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(7, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, false)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityInsentient.class, 0, false, false, bw)); - this.b = 50; - } - - protected void c() { - super.c(); - this.datawatcher.a(17, new Integer(0)); - this.datawatcher.a(18, new Integer(0)); - this.datawatcher.a(19, new Integer(0)); - this.datawatcher.a(20, new Integer(0)); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Invul", this.ca()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.s(nbttagcompound.getInt("Invul")); - } - - protected String t() { - return "mob.wither.idle"; - } - - protected String aT() { - return "mob.wither.hurt"; - } - - protected String aU() { - return "mob.wither.death"; - } - - public void e() { - this.motY *= 0.6000000238418579D; - double d0; - double d1; - double d2; - - if (!this.world.isStatic && this.t(0) > 0) { - Entity entity = this.world.getEntity(this.t(0)); - - if (entity != null) { - if (this.locY < entity.locY || !this.cb() && this.locY < entity.locY + 5.0D) { - if (this.motY < 0.0D) { - this.motY = 0.0D; - } - - this.motY += (0.5D - this.motY) * 0.6000000238418579D; - } - - double d3 = entity.locX - this.locX; - - d0 = entity.locZ - this.locZ; - d1 = d3 * d3 + d0 * d0; - if (d1 > 9.0D) { - d2 = (double) MathHelper.sqrt(d1); - this.motX += (d3 / d2 * 0.5D - this.motX) * 0.6000000238418579D; - this.motZ += (d0 / d2 * 0.5D - this.motZ) * 0.6000000238418579D; - } - } - } - - if (this.motX * this.motX + this.motZ * this.motZ > 0.05000000074505806D) { - this.yaw = (float) Math.atan2(this.motZ, this.motX) * 57.295776F - 90.0F; - } - - super.e(); - - int i; - - for (i = 0; i < 2; ++i) { - this.bs[i] = this.bq[i]; - this.br[i] = this.bp[i]; - } - - int j; - - for (i = 0; i < 2; ++i) { - j = this.t(i + 1); - Entity entity1 = null; - - if (j > 0) { - entity1 = this.world.getEntity(j); - } - - if (entity1 != null) { - d0 = this.u(i + 1); - d1 = this.v(i + 1); - d2 = this.w(i + 1); - double d4 = entity1.locX - d0; - double d5 = entity1.locY + (double) entity1.getHeadHeight() - d1; - double d6 = entity1.locZ - d2; - double d7 = (double) MathHelper.sqrt(d4 * d4 + d6 * d6); - float f = (float) (Math.atan2(d6, d4) * 180.0D / 3.1415927410125732D) - 90.0F; - float f1 = (float) (-(Math.atan2(d5, d7) * 180.0D / 3.1415927410125732D)); - - this.bp[i] = this.b(this.bp[i], f1, 40.0F); - this.bq[i] = this.b(this.bq[i], f, 10.0F); - } else { - this.bq[i] = this.b(this.bq[i], this.aM, 10.0F); - } - } - - boolean flag = this.cb(); - - for (j = 0; j < 3; ++j) { - double d8 = this.u(j); - double d9 = this.v(j); - double d10 = this.w(j); - - this.world.addParticle("smoke", d8 + this.random.nextGaussian() * 0.30000001192092896D, d9 + this.random.nextGaussian() * 0.30000001192092896D, d10 + this.random.nextGaussian() * 0.30000001192092896D, 0.0D, 0.0D, 0.0D); - if (flag && this.world.random.nextInt(4) == 0) { - this.world.addParticle("mobSpell", d8 + this.random.nextGaussian() * 0.30000001192092896D, d9 + this.random.nextGaussian() * 0.30000001192092896D, d10 + this.random.nextGaussian() * 0.30000001192092896D, 0.699999988079071D, 0.699999988079071D, 0.5D); - } - } - - if (this.ca() > 0) { - for (j = 0; j < 3; ++j) { - this.world.addParticle("mobSpell", this.locX + this.random.nextGaussian() * 1.0D, this.locY + (double) (this.random.nextFloat() * 3.3F), this.locZ + this.random.nextGaussian() * 1.0D, 0.699999988079071D, 0.699999988079071D, 0.8999999761581421D); - } - } - } - - protected void bn() { - int i; - - if (this.ca() > 0) { - i = this.ca() - 1; - if (i <= 0) { - // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 7.0F, false); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); - } - // CraftBukkit end - - this.world.createExplosion(this, this.locX, this.locY + (double) this.getHeadHeight(), this.locZ, 7.0F, false, this.world.getGameRules().getBoolean("mobGriefing")); - // CraftBukkit start - Use relative location for far away sounds - //this.world.b(1013, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - int viewDistance = ((WorldServer) this.world).getServer().getViewDistance() * 16; - for (EntityPlayer player : (List<EntityPlayer>) this.world.players) { - double deltaX = this.locX - player.locX; - double deltaZ = this.locZ - player.locZ; - double distanceSquared = deltaX * deltaX + deltaZ * deltaZ; - if (distanceSquared > viewDistance * viewDistance) { - double deltaLength = Math.sqrt(distanceSquared); - double relativeX = player.locX + (deltaX / deltaLength) * viewDistance; - double relativeZ = player.locZ + (deltaZ / deltaLength) * viewDistance; - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, (int) relativeX, (int) this.locY, (int) relativeZ, 0, true)); - } else { - player.playerConnection.sendPacket(new PacketPlayOutWorldEvent(1013, (int) this.locX, (int) this.locY, (int) this.locZ, 0, true)); - } - } - // CraftBukkit end - } - - this.s(i); - if (this.ticksLived % 10 == 0) { - this.heal(10.0F, EntityRegainHealthEvent.RegainReason.WITHER_SPAWN); // CraftBukkit - } - } else { - super.bn(); - - int j; - - for (i = 1; i < 3; ++i) { - if (this.ticksLived >= this.bt[i - 1]) { - this.bt[i - 1] = this.ticksLived + 10 + this.random.nextInt(10); - if (this.world.difficulty == EnumDifficulty.NORMAL || this.world.difficulty == EnumDifficulty.HARD) { - int i1001 = i - 1; - int i1003 = this.bu[i - 1]; - - this.bu[i1001] = this.bu[i - 1] + 1; - if (i1003 > 15) { - float f = 10.0F; - float f1 = 5.0F; - double d0 = MathHelper.a(this.random, this.locX - (double) f, this.locX + (double) f); - double d1 = MathHelper.a(this.random, this.locY - (double) f1, this.locY + (double) f1); - double d2 = MathHelper.a(this.random, this.locZ - (double) f, this.locZ + (double) f); - - this.a(i + 1, d0, d1, d2, true); - this.bu[i - 1] = 0; - } - } - - j = this.t(i); - if (j > 0) { - Entity entity = this.world.getEntity(j); - - if (entity != null && entity.isAlive() && this.f(entity) <= 900.0D && this.hasLineOfSight(entity)) { - this.a(i + 1, (EntityLiving) entity); - this.bt[i - 1] = this.ticksLived + 40 + this.random.nextInt(20); - this.bu[i - 1] = 0; - } else { - this.b(i, 0); - } - } else { - List list = this.world.a(EntityLiving.class, this.boundingBox.grow(20.0D, 8.0D, 20.0D), bw); - - for (int i1 = 0; i1 < 10 && !list.isEmpty(); ++i1) { - EntityLiving entityliving = (EntityLiving) list.get(this.random.nextInt(list.size())); - - if (entityliving != this && entityliving.isAlive() && this.hasLineOfSight(entityliving)) { - if (entityliving instanceof EntityHuman) { - if (!((EntityHuman) entityliving).abilities.isInvulnerable) { - this.b(i, entityliving.getId()); - } - } else { - this.b(i, entityliving.getId()); - } - break; - } - - list.remove(entityliving); - } - } - } - } - - if (this.getGoalTarget() != null) { - this.b(0, this.getGoalTarget().getId()); - } else { - this.b(0, 0); - } - - if (this.bv > 0) { - --this.bv; - if (this.bv == 0 && this.world.getGameRules().getBoolean("mobGriefing")) { - i = MathHelper.floor(this.locY); - j = MathHelper.floor(this.locX); - int j1 = MathHelper.floor(this.locZ); - boolean flag = false; - - for (int k1 = -1; k1 <= 1; ++k1) { - for (int l1 = -1; l1 <= 1; ++l1) { - for (int i2 = 0; i2 <= 3; ++i2) { - int j2 = j + k1; - int k2 = i + i2; - int l2 = j1 + l1; - Block block = this.world.getType(j2, k2, l2); - - if (block.getMaterial() != Material.AIR && block != Blocks.BEDROCK && block != Blocks.ENDER_PORTAL && block != Blocks.ENDER_PORTAL_FRAME && block != Blocks.COMMAND) { - // CraftBukkit start - if (CraftEventFactory.callEntityChangeBlockEvent(this, j2, k2, l2, Blocks.AIR, 0).isCancelled()) { - continue; - } - // CraftBukkit end - - flag = this.world.setAir(j2, k2, l2, true) || flag; - } - } - } - } - - if (flag) { - this.world.a((EntityHuman) null, 1012, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - } - } - - if (this.ticksLived % 20 == 0) { - this.heal(1.0F, EntityRegainHealthEvent.RegainReason.REGEN); // CraftBukkit - } - } - } - - public void bZ() { - this.s(220); - this.setHealth(this.getMaxHealth() / 3.0F); - } - - public void as() {} - - public int aV() { - return 4; - } - - private double u(int i) { - if (i <= 0) { - return this.locX; - } else { - float f = (this.aM + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; - float f1 = MathHelper.cos(f); - - return this.locX + (double) f1 * 1.3D; - } - } - - private double v(int i) { - return i <= 0 ? this.locY + 3.0D : this.locY + 2.2D; - } - - private double w(int i) { - if (i <= 0) { - return this.locZ; - } else { - float f = (this.aM + (float) (180 * (i - 1))) / 180.0F * 3.1415927F; - float f1 = MathHelper.sin(f); - - return this.locZ + (double) f1 * 1.3D; - } - } - - private float b(float f, float f1, float f2) { - float f3 = MathHelper.g(f1 - f); - - if (f3 > f2) { - f3 = f2; - } - - if (f3 < -f2) { - f3 = -f2; - } - - return f + f3; - } - - private void a(int i, EntityLiving entityliving) { - this.a(i, entityliving.locX, entityliving.locY + (double) entityliving.getHeadHeight() * 0.5D, entityliving.locZ, i == 0 && this.random.nextFloat() < 0.001F); - } - - private void a(int i, double d0, double d1, double d2, boolean flag) { - this.world.a((EntityHuman) null, 1014, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - double d3 = this.u(i); - double d4 = this.v(i); - double d5 = this.w(i); - double d6 = d0 - d3; - double d7 = d1 - d4; - double d8 = d2 - d5; - EntityWitherSkull entitywitherskull = new EntityWitherSkull(this.world, this, d6, d7, d8); - - if (flag) { - entitywitherskull.setCharged(true); - } - - entitywitherskull.locY = d4; - entitywitherskull.locX = d3; - entitywitherskull.locZ = d5; - this.world.addEntity(entitywitherskull); - } - - public void a(EntityLiving entityliving, float f) { - this.a(0, entityliving); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else if (damagesource == DamageSource.DROWN) { - return false; - } else if (this.ca() > 0) { - return false; - } else { - Entity entity; - - if (this.cb()) { - entity = damagesource.i(); - if (entity instanceof EntityArrow) { - return false; - } - } - - entity = damagesource.getEntity(); - if (entity != null && !(entity instanceof EntityHuman) && entity instanceof EntityLiving && ((EntityLiving) entity).getMonsterType() == this.getMonsterType()) { - return false; - } else { - if (this.bv <= 0) { - this.bv = 20; - } - - for (int i = 0; i < this.bu.length; ++i) { - this.bu[i] += 3; - } - - return super.damageEntity(damagesource, f); - } - } - } - - protected void dropDeathLoot(boolean flag, int i) { - this.a(Items.NETHER_STAR, 1); - if (!this.world.isStatic) { - Iterator iterator = this.world.a(EntityHuman.class, this.boundingBox.grow(50.0D, 100.0D, 50.0D)).iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - entityhuman.a((Statistic) AchievementList.J); - } - } - } - - protected void w() { - this.aU = 0; - } - - protected void b(float f) {} - - public void addEffect(MobEffect mobeffect) {} - - protected boolean bk() { - return true; - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(300.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.6000000238418579D); - this.getAttributeInstance(GenericAttributes.b).setValue(40.0D); - } - - public int ca() { - return this.datawatcher.getInt(20); - } - - public void s(int i) { - this.datawatcher.watch(20, Integer.valueOf(i)); - } - - public int t(int i) { - return this.datawatcher.getInt(17 + i); - } - - public void b(int i, int j) { - this.datawatcher.watch(17 + i, Integer.valueOf(j)); - } - - public boolean cb() { - return this.getHealth() <= this.getMaxHealth() / 2.0F; - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEAD; - } - - public void mount(Entity entity) { - this.vehicle = null; - } -} diff --git a/src/main/java/net/minecraft/server/EntityWitherSkull.java b/src/main/java/net/minecraft/server/EntityWitherSkull.java deleted file mode 100644 index b797f8a4..00000000 --- a/src/main/java/net/minecraft/server/EntityWitherSkull.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.ExplosionPrimeEvent; // CraftBukkit - -public class EntityWitherSkull extends EntityFireball { - - public EntityWitherSkull(World world) { - super(world); - this.a(0.3125F, 0.3125F); - } - - public EntityWitherSkull(World world, EntityLiving entityliving, double d0, double d1, double d2) { - super(world, entityliving, d0, d1, d2); - this.a(0.3125F, 0.3125F); - } - - protected float e() { - return this.isCharged() ? 0.73F : super.e(); - } - - public boolean isBurning() { - return false; - } - - public float a(Explosion explosion, World world, int i, int j, int k, Block block) { - float f = super.a(explosion, world, i, j, k, block); - - if (this.isCharged() && block != Blocks.BEDROCK && block != Blocks.ENDER_PORTAL && block != Blocks.ENDER_PORTAL_FRAME && block != Blocks.COMMAND) { - f = Math.min(0.8F, f); - } - - return f; - } - - protected void a(MovingObjectPosition movingobjectposition) { - if (!this.world.isStatic) { - if (movingobjectposition.entity != null) { - if (this.shooter != null) { - if (movingobjectposition.entity.damageEntity(DamageSource.mobAttack(this.shooter), 8.0F) && !movingobjectposition.entity.isAlive()) { - this.shooter.heal(5.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.WITHER); // CraftBukkit - } - } else { - movingobjectposition.entity.damageEntity(DamageSource.MAGIC, 5.0F); - } - - if (movingobjectposition.entity instanceof EntityLiving) { - byte b0 = 0; - - if (this.world.difficulty == EnumDifficulty.NORMAL) { - b0 = 10; - } else if (this.world.difficulty == EnumDifficulty.HARD) { - b0 = 40; - } - - if (b0 > 0) { - ((EntityLiving) movingobjectposition.entity).addEffect(new MobEffect(MobEffectList.WITHER.id, 20 * b0, 1)); - } - } - } - - // CraftBukkit start - ExplosionPrimeEvent event = new ExplosionPrimeEvent(this.getBukkitEntity(), 1.0F, false); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.world.createExplosion(this, this.locX, this.locY, this.locZ, event.getRadius(), event.getFire(), this.world.getGameRules().getBoolean("mobGriefing")); - } - // CraftBukkit end - - this.die(); - } - } - - public boolean R() { - return false; - } - - public boolean damageEntity(DamageSource damagesource, float f) { - return false; - } - - protected void c() { - this.datawatcher.a(10, Byte.valueOf((byte) 0)); - } - - public boolean isCharged() { - return this.datawatcher.getByte(10) == 1; - } - - public void setCharged(boolean flag) { - this.datawatcher.watch(10, Byte.valueOf((byte) (flag ? 1 : 0))); - } -} diff --git a/src/main/java/net/minecraft/server/EntityWolf.java b/src/main/java/net/minecraft/server/EntityWolf.java deleted file mode 100644 index 8f1ebf2e..00000000 --- a/src/main/java/net/minecraft/server/EntityWolf.java +++ /dev/null @@ -1,379 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityTargetEvent.TargetReason; -// CraftBukkit end - -public class EntityWolf extends EntityTameableAnimal { - - private float bq; - private float br; - private boolean bs; - private boolean bt; - private float bu; - private float bv; - - public EntityWolf(World world) { - super(world); - this.a(0.6F, 0.8F); - this.getNavigation().a(true); - this.goalSelector.a(1, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, this.bp); - this.goalSelector.a(3, new PathfinderGoalLeapAtTarget(this, 0.4F)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, 1.0D, true)); - this.goalSelector.a(5, new PathfinderGoalFollowOwner(this, 1.0D, 10.0F, 2.0F)); - this.goalSelector.a(6, new PathfinderGoalBreed(this, 1.0D)); - this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(8, new PathfinderGoalBeg(this, 8.0F)); - this.goalSelector.a(9, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(9, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalOwnerHurtByTarget(this)); - this.targetSelector.a(2, new PathfinderGoalOwnerHurtTarget(this)); - this.targetSelector.a(3, new PathfinderGoalHurtByTarget(this, true)); - this.targetSelector.a(4, new PathfinderGoalRandomTargetNonTamed(this, EntitySheep.class, 200, false)); - this.setTamed(false); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.d).setValue(0.30000001192092896D); - if (this.isTamed()) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(20.0D); - } else { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - } - } - - public boolean bk() { - return true; - } - - public void setGoalTarget(EntityLiving entityliving) { - super.setGoalTarget(entityliving); - if (entityliving == null) { - this.setAngry(false); - } else if (!this.isTamed()) { - this.setAngry(true); - } - } - - protected void bp() { - this.datawatcher.watch(18, Float.valueOf(this.getHealth())); - } - - protected void c() { - super.c(); - this.datawatcher.a(18, new Float(this.getHealth())); - this.datawatcher.a(19, new Byte((byte) 0)); - this.datawatcher.a(20, new Byte((byte) BlockCloth.b(1))); - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.wolf.step", 0.15F, 1.0F); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setBoolean("Angry", this.isAngry()); - nbttagcompound.setByte("CollarColor", (byte) this.getCollarColor()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.setAngry(nbttagcompound.getBoolean("Angry")); - if (nbttagcompound.hasKeyOfType("CollarColor", 99)) { - this.setCollarColor(nbttagcompound.getByte("CollarColor")); - } - } - - protected String t() { - // CraftBukkit - (getFloat(18) < 10) -> (getFloat(18) < this.getMaxHealth() / 2) - return this.isAngry() ? "mob.wolf.growl" : (this.random.nextInt(3) == 0 ? (this.isTamed() && this.datawatcher.getFloat(18) < (this.getMaxHealth() / 2) ? "mob.wolf.whine" : "mob.wolf.panting") : "mob.wolf.bark"); - } - - protected String aT() { - return "mob.wolf.hurt"; - } - - protected String aU() { - return "mob.wolf.death"; - } - - protected float bf() { - return 0.4F; - } - - protected Item getLoot() { - return Item.getById(-1); - } - - public void e() { - super.e(); - if (!this.world.isStatic && this.bs && !this.bt && !this.bS() && this.onGround) { - this.bt = true; - this.bu = 0.0F; - this.bv = 0.0F; - this.world.broadcastEntityEffect(this, (byte) 8); - } - } - - public void h() { - super.h(); - this.br = this.bq; - if (this.ck()) { - this.bq += (1.0F - this.bq) * 0.4F; - } else { - this.bq += (0.0F - this.bq) * 0.4F; - } - - if (this.ck()) { - this.g = 10; - } - - if (this.L()) { - this.bs = true; - this.bt = false; - this.bu = 0.0F; - this.bv = 0.0F; - } else if ((this.bs || this.bt) && this.bt) { - if (this.bu == 0.0F) { - this.makeSound("mob.wolf.shake", this.bf(), (this.random.nextFloat() - this.random.nextFloat()) * 0.2F + 1.0F); - } - - this.bv = this.bu; - this.bu += 0.05F; - if (this.bv >= 2.0F) { - this.bs = false; - this.bt = false; - this.bv = 0.0F; - this.bu = 0.0F; - } - - if (this.bu > 0.4F) { - float f = (float) this.boundingBox.b; - int i = (int) (MathHelper.sin((this.bu - 0.4F) * 3.1415927F) * 7.0F); - - for (int j = 0; j < i; ++j) { - float f1 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - float f2 = (this.random.nextFloat() * 2.0F - 1.0F) * this.width * 0.5F; - - this.world.addParticle("splash", this.locX + (double) f1, (double) (f + 0.8F), this.locZ + (double) f2, this.motX, this.motY, this.motZ); - } - } - } - } - - public float getHeadHeight() { - return this.length * 0.8F; - } - - public int x() { - return this.isSitting() ? 20 : super.x(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable()) { - return false; - } else { - Entity entity = damagesource.getEntity(); - - this.bp.setSitting(false); - if (entity != null && !(entity instanceof EntityHuman) && !(entity instanceof EntityArrow)) { - f = (f + 1.0F) / 2.0F; - } - - return super.damageEntity(damagesource, f); - } - } - - public boolean n(Entity entity) { - int i = this.isTamed() ? 4 : 2; - - return entity.damageEntity(DamageSource.mobAttack(this), (float) i); - } - - public void setTamed(boolean flag) { - super.setTamed(flag); - if (flag) { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(20.0D); - } else { - this.getAttributeInstance(GenericAttributes.maxHealth).setValue(8.0D); - } - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - if (this.isTamed()) { - if (itemstack != null) { - if (itemstack.getItem() instanceof ItemFood) { - ItemFood itemfood = (ItemFood) itemstack.getItem(); - - if (itemfood.i() && this.datawatcher.getFloat(18) < 20.0F) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - this.heal((float) itemfood.getNutrition(itemstack), org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.EATING); // CraftBukkit - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - return true; - } - } else if (itemstack.getItem() == Items.INK_SACK) { - int i = BlockCloth.b(itemstack.getData()); - - if (i != this.getCollarColor()) { - this.setCollarColor(i); - if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - return true; - } - } - } - - if (this.e(entityhuman) && !this.world.isStatic && !this.c(itemstack)) { - this.bp.setSitting(!this.isSitting()); - this.bc = false; - this.setPathEntity((PathEntity) null); - this.setTarget((Entity) null); - // CraftBukkit start - if (this.getGoalTarget() != null) { - CraftEventFactory.callEntityTargetEvent(this, null, TargetReason.FORGOT_TARGET); - } - // CraftBukkit end - this.setGoalTarget((EntityLiving) null); - } - } else if (itemstack != null && itemstack.getItem() == Items.BONE && !this.isAngry()) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - if (!this.world.isStatic) { - // CraftBukkit - added event call and isCancelled check. - if (this.random.nextInt(3) == 0 && !CraftEventFactory.callEntityTameEvent(this, entityhuman).isCancelled()) { - this.setTamed(true); - this.setPathEntity((PathEntity) null); - // CraftBukkit start - if (this.getGoalTarget() != null) { - CraftEventFactory.callEntityTargetEvent(this, null, TargetReason.FORGOT_TARGET); - } - // CraftBukkit end - this.setGoalTarget((EntityLiving) null); - this.bp.setSitting(true); - this.setHealth(this.getMaxHealth()); // CraftBukkit - 20.0 -> getMaxHealth() - this.setOwnerUUID(entityhuman.getUniqueID().toString()); - this.i(true); - this.world.broadcastEntityEffect(this, (byte) 7); - } else { - this.i(false); - this.world.broadcastEntityEffect(this, (byte) 6); - } - } - - return true; - } - - return super.a(entityhuman); - } - - public boolean c(ItemStack itemstack) { - return itemstack == null ? false : (!(itemstack.getItem() instanceof ItemFood) ? false : ((ItemFood) itemstack.getItem()).i()); - } - - public int bB() { - return 8; - } - - public boolean isAngry() { - return (this.datawatcher.getByte(16) & 2) != 0; - } - - public void setAngry(boolean flag) { - byte b0 = this.datawatcher.getByte(16); - - if (flag) { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 | 2))); - } else { - this.datawatcher.watch(16, Byte.valueOf((byte) (b0 & -3))); - } - } - - public int getCollarColor() { - return this.datawatcher.getByte(20) & 15; - } - - public void setCollarColor(int i) { - this.datawatcher.watch(20, Byte.valueOf((byte) (i & 15))); - } - - public EntityWolf b(EntityAgeable entityageable) { - EntityWolf entitywolf = new EntityWolf(this.world); - String s = this.getOwnerUUID(); - - if (s != null && s.trim().length() > 0) { - entitywolf.setOwnerUUID(s); - entitywolf.setTamed(true); - } - - return entitywolf; - } - - public void m(boolean flag) { - if (flag) { - this.datawatcher.watch(19, Byte.valueOf((byte) 1)); - } else { - this.datawatcher.watch(19, Byte.valueOf((byte) 0)); - } - } - - public boolean mate(EntityAnimal entityanimal) { - if (entityanimal == this) { - return false; - } else if (!this.isTamed()) { - return false; - } else if (!(entityanimal instanceof EntityWolf)) { - return false; - } else { - EntityWolf entitywolf = (EntityWolf) entityanimal; - - return !entitywolf.isTamed() ? false : (entitywolf.isSitting() ? false : this.ce() && entitywolf.ce()); - } - } - - public boolean ck() { - return this.datawatcher.getByte(19) == 1; - } - - protected boolean isTypeNotPersistent() { - return !this.isTamed() /*&& this.ticksLived > 2400*/; // CraftBukkit - } - - public boolean a(EntityLiving entityliving, EntityLiving entityliving1) { - if (!(entityliving instanceof EntityCreeper) && !(entityliving instanceof EntityGhast)) { - if (entityliving instanceof EntityWolf) { - EntityWolf entitywolf = (EntityWolf) entityliving; - - if (entitywolf.isTamed() && entitywolf.getOwner() == entityliving1) { - return false; - } - } - - return entityliving instanceof EntityHuman && entityliving1 instanceof EntityHuman && !((EntityHuman) entityliving1).a((EntityHuman) entityliving) ? false : !(entityliving instanceof EntityHorse) || !((EntityHorse) entityliving).isTame(); - } else { - return false; - } - } - - public EntityAgeable createChild(EntityAgeable entityageable) { - return this.b(entityageable); - } -} diff --git a/src/main/java/net/minecraft/server/EntityZombie.java b/src/main/java/net/minecraft/server/EntityZombie.java deleted file mode 100644 index 7d8cb937..00000000 --- a/src/main/java/net/minecraft/server/EntityZombie.java +++ /dev/null @@ -1,524 +0,0 @@ -package net.minecraft.server; - -import java.util.Calendar; -import java.util.List; -import java.util.UUID; - - -//CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftLivingEntity; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntityCombustByEntityEvent; -import org.bukkit.event.entity.EntityCombustEvent; -import org.bukkit.event.entity.EntityTargetEvent; -//CraftBukkit end - -public class EntityZombie extends EntityMonster { - - protected static final IAttribute bp = (new AttributeRanged("zombie.spawnReinforcements", 0.0D, 0.0D, 1.0D)).a("Spawn Reinforcements Chance"); - private static final UUID bq = UUID.fromString("B9766B59-9566-4402-BC1F-2EE2A276D836"); - private static final AttributeModifier br = new AttributeModifier(bq, "Baby speed boost", 0.5D, 1); - private final PathfinderGoalBreakDoor bs = new PathfinderGoalBreakDoor(this); - private int bt; - private boolean bu = false; - private float bv = -1.0F; - private float bw; - private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field - - public EntityZombie(World world) { - super(world); - this.getNavigation().b(true); - this.goalSelector.a(0, new PathfinderGoalFloat(this)); - this.goalSelector.a(2, new PathfinderGoalMeleeAttack(this, EntityHuman.class, 1.0D, false)); - this.goalSelector.a(4, new PathfinderGoalMeleeAttack(this, EntityVillager.class, 1.0D, true)); - this.goalSelector.a(5, new PathfinderGoalMoveTowardsRestriction(this, 1.0D)); - this.goalSelector.a(6, new PathfinderGoalMoveThroughVillage(this, 1.0D, false)); - this.goalSelector.a(7, new PathfinderGoalRandomStroll(this, 1.0D)); - this.goalSelector.a(8, new PathfinderGoalLookAtPlayer(this, EntityHuman.class, 8.0F)); - this.goalSelector.a(8, new PathfinderGoalRandomLookaround(this)); - this.targetSelector.a(1, new PathfinderGoalHurtByTarget(this, true)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityHuman.class, 0, true)); - this.targetSelector.a(2, new PathfinderGoalNearestAttackableTarget(this, EntityVillager.class, 0, false)); - this.a(0.6F, 1.8F); - } - - protected void aD() { - super.aD(); - this.getAttributeInstance(GenericAttributes.b).setValue(40.0D); - this.getAttributeInstance(GenericAttributes.d).setValue(0.23000000417232513D); - this.getAttributeInstance(GenericAttributes.e).setValue(3.0D); - this.getAttributeMap().b(bp).setValue(this.random.nextDouble() * 0.10000000149011612D); - } - - protected void c() { - super.c(); - this.getDataWatcher().a(12, Byte.valueOf((byte) 0)); - this.getDataWatcher().a(13, Byte.valueOf((byte) 0)); - this.getDataWatcher().a(14, Byte.valueOf((byte) 0)); - } - - public int aV() { - int i = super.aV() + 2; - - if (i > 20) { - i = 20; - } - - return i; - } - - protected boolean bk() { - return true; - } - - public boolean bZ() { - return this.bu; - } - - public void a(boolean flag) { - if (this.bu != flag) { - this.bu = flag; - if (flag) { - this.goalSelector.a(1, this.bs); - } else { - this.goalSelector.a((PathfinderGoal) this.bs); - } - } - } - - public boolean isBaby() { - return this.getDataWatcher().getByte(12) == 1; - } - - protected int getExpValue(EntityHuman entityhuman) { - if (this.isBaby()) { - this.b = (int) ((float) this.b * 2.5F); - } - - return super.getExpValue(entityhuman); - } - - public void setBaby(boolean flag) { - this.getDataWatcher().watch(12, Byte.valueOf((byte) (flag ? 1 : 0))); - if (this.world != null && !this.world.isStatic) { - AttributeInstance attributeinstance = this.getAttributeInstance(GenericAttributes.d); - - attributeinstance.b(br); - if (flag) { - attributeinstance.a(br); - } - } - - this.k(flag); - } - - public boolean isVillager() { - return this.getDataWatcher().getByte(13) == 1; - } - - public void setVillager(boolean flag) { - this.getDataWatcher().watch(13, Byte.valueOf((byte) (flag ? 1 : 0))); - } - - public void e() { - if (this.world.w() && !this.world.isStatic && !this.isBaby()) { - float f = this.d(1.0F); - - if (f > 0.5F && this.random.nextFloat() * 30.0F < (f - 0.4F) * 2.0F && this.world.i(MathHelper.floor(this.locX), MathHelper.floor(this.locY), MathHelper.floor(this.locZ))) { - boolean flag = true; - ItemStack itemstack = this.getEquipment(4); - - if (itemstack != null) { - if (itemstack.g()) { - itemstack.setData(itemstack.j() + this.random.nextInt(2)); - if (itemstack.j() >= itemstack.l()) { - this.a(itemstack); - this.setEquipment(4, (ItemStack) null); - } - } - - flag = false; - } - - if (flag) { - // CraftBukkit start - EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), 8); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - this.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } - } - - if (this.am() && this.getGoalTarget() != null && this.vehicle instanceof EntityChicken) { - ((EntityInsentient) this.vehicle).getNavigation().a(this.getNavigation().e(), 1.5D); - } - - super.e(); - } - - public boolean damageEntity(DamageSource damagesource, float f) { - if (!super.damageEntity(damagesource, f)) { - return false; - } else { - EntityLiving entityliving = this.getGoalTarget(); - - if (entityliving == null && this.bT() instanceof EntityLiving) { - entityliving = (EntityLiving) this.bT(); - } - - if (entityliving == null && damagesource.getEntity() instanceof EntityLiving) { - entityliving = (EntityLiving) damagesource.getEntity(); - } - - if (entityliving != null && this.world.difficulty == EnumDifficulty.HARD && (double) this.random.nextFloat() < this.getAttributeInstance(bp).getValue()) { - int i = MathHelper.floor(this.locX); - int j = MathHelper.floor(this.locY); - int k = MathHelper.floor(this.locZ); - EntityZombie entityzombie = new EntityZombie(this.world); - - for (int l = 0; l < 50; ++l) { - int i1 = i + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - int j1 = j + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - int k1 = k + MathHelper.nextInt(this.random, 7, 40) * MathHelper.nextInt(this.random, -1, 1); - - if (World.a((IBlockAccess) this.world, i1, j1 - 1, k1) && this.world.getLightLevel(i1, j1, k1) < 10) { - entityzombie.setPosition((double) i1, (double) j1, (double) k1); - if (this.world.b(entityzombie.boundingBox) && this.world.getCubes(entityzombie, entityzombie.boundingBox).isEmpty() && !this.world.containsLiquid(entityzombie.boundingBox)) { - this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.REINFORCEMENTS); // CraftBukkit - // CraftBukkit start - call EntityTargetEvent - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(entityzombie, entityliving, EntityTargetEvent.TargetReason.REINFORCEMENT_TARGET); - if (!event.isCancelled()) { - if (event.getTarget() == null) { - entityzombie.setGoalTarget(null); - } else { - entityzombie.setGoalTarget(((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle()); - } - } - // CraftBukkit end - entityzombie.prepare((GroupDataEntity) null); - this.getAttributeInstance(bp).a(new AttributeModifier("Zombie reinforcement caller charge", -0.05000000074505806D, 0)); - entityzombie.getAttributeInstance(bp).a(new AttributeModifier("Zombie reinforcement callee charge", -0.05000000074505806D, 0)); - break; - } - } - } - } - - return true; - } - } - - public void h() { - if (!this.world.isStatic && this.cc()) { - int i = this.ce(); - - // CraftBukkit start - Use wall time instead of ticks for villager conversion - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.lastTick = MinecraftServer.currentTick; - i *= elapsedTicks; - // CraftBukkit end - - this.bt -= i; - if (this.bt <= 0) { - this.cd(); - } - } - - super.h(); - } - - public boolean n(Entity entity) { - boolean flag = super.n(entity); - - if (flag) { - int i = this.world.difficulty.a(); - - if (this.be() == null && this.isBurning() && this.random.nextFloat() < (float) i * 0.3F) { - // CraftBukkit start - EntityCombustByEntityEvent event = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.getBukkitEntity(), 2 * i); - this.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - entity.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - } - - return flag; - } - - protected String t() { - return "mob.zombie.say"; - } - - protected String aT() { - return "mob.zombie.hurt"; - } - - protected String aU() { - return "mob.zombie.death"; - } - - protected void a(int i, int j, int k, Block block) { - this.makeSound("mob.zombie.step", 0.15F, 1.0F); - } - - protected Item getLoot() { - return Items.ROTTEN_FLESH; - } - - public EnumMonsterType getMonsterType() { - return EnumMonsterType.UNDEAD; - } - - protected void getRareDrop(int i) { - switch (this.random.nextInt(3)) { - case 0: - this.a(Items.IRON_INGOT, 1); - break; - - case 1: - this.a(Items.CARROT, 1); - break; - - case 2: - this.a(Items.POTATO, 1); - } - } - - protected void bC() { - super.bC(); - if (this.random.nextFloat() < (this.world.difficulty == EnumDifficulty.HARD ? 0.05F : 0.01F)) { - int i = this.random.nextInt(3); - - if (i == 0) { - this.setEquipment(0, new ItemStack(Items.IRON_SWORD)); - } else { - this.setEquipment(0, new ItemStack(Items.IRON_SPADE)); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.isBaby()) { - nbttagcompound.setBoolean("IsBaby", true); - } - - if (this.isVillager()) { - nbttagcompound.setBoolean("IsVillager", true); - } - - nbttagcompound.setInt("ConversionTime", this.cc() ? this.bt : -1); - nbttagcompound.setBoolean("CanBreakDoors", this.bZ()); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.getBoolean("IsBaby")) { - this.setBaby(true); - } - - if (nbttagcompound.getBoolean("IsVillager")) { - this.setVillager(true); - } - - if (nbttagcompound.hasKeyOfType("ConversionTime", 99) && nbttagcompound.getInt("ConversionTime") > -1) { - this.a(nbttagcompound.getInt("ConversionTime")); - } - - this.a(nbttagcompound.getBoolean("CanBreakDoors")); - } - - public void a(EntityLiving entityliving) { - super.a(entityliving); - if ((this.world.difficulty == EnumDifficulty.NORMAL || this.world.difficulty == EnumDifficulty.HARD) && entityliving instanceof EntityVillager) { - if (this.world.difficulty != EnumDifficulty.HARD && this.random.nextBoolean()) { - return; - } - - EntityZombie entityzombie = new EntityZombie(this.world); - - entityzombie.k(entityliving); - this.world.kill(entityliving); - entityzombie.prepare((GroupDataEntity) null); - entityzombie.setVillager(true); - if (entityliving.isBaby()) { - entityzombie.setBaby(true); - } - - this.world.addEntity(entityzombie, CreatureSpawnEvent.SpawnReason.INFECTION); // CraftBukkit - add SpawnReason - this.world.a((EntityHuman) null, 1016, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - } - - public GroupDataEntity prepare(GroupDataEntity groupdataentity) { - Object object = super.prepare(groupdataentity); - float f = this.world.b(this.locX, this.locY, this.locZ); - - this.h(this.random.nextFloat() < 0.55F * f); - if (object == null) { - object = new GroupDataZombie(this, this.world.random.nextFloat() < 0.05F, this.world.random.nextFloat() < 0.05F, (EmptyClassZombie) null); - } - - if (object instanceof GroupDataZombie) { - GroupDataZombie groupdatazombie = (GroupDataZombie) object; - - if (groupdatazombie.b) { - this.setVillager(true); - } - - if (groupdatazombie.a) { - this.setBaby(true); - if ((double) this.world.random.nextFloat() < 0.05D) { - List list = this.world.a(EntityChicken.class, this.boundingBox.grow(5.0D, 3.0D, 5.0D), IEntitySelector.b); - - if (!list.isEmpty()) { - EntityChicken entitychicken = (EntityChicken) list.get(0); - - entitychicken.i(true); - this.mount(entitychicken); - } - } else if ((double) this.world.random.nextFloat() < 0.05D) { - EntityChicken entitychicken1 = new EntityChicken(this.world); - - entitychicken1.setPositionRotation(this.locX, this.locY, this.locZ, this.yaw, 0.0F); - entitychicken1.prepare((GroupDataEntity) null); - entitychicken1.i(true); - this.world.addEntity(entitychicken1, CreatureSpawnEvent.SpawnReason.MOUNT); - this.mount(entitychicken1); - } - } - } - - this.a(this.random.nextFloat() < f * 0.1F); - this.bC(); - this.bD(); - if (this.getEquipment(4) == null) { - Calendar calendar = this.world.V(); - - if (calendar.get(2) + 1 == 10 && calendar.get(5) == 31 && this.random.nextFloat() < 0.25F) { - this.setEquipment(4, new ItemStack(this.random.nextFloat() < 0.1F ? Blocks.JACK_O_LANTERN : Blocks.PUMPKIN)); - this.dropChances[4] = 0.0F; - } - } - - this.getAttributeInstance(GenericAttributes.c).a(new AttributeModifier("Random spawn bonus", this.random.nextDouble() * 0.05000000074505806D, 0)); - double d0 = this.random.nextDouble() * 1.5D * (double) this.world.b(this.locX, this.locY, this.locZ); - - if (d0 > 1.0D) { - this.getAttributeInstance(GenericAttributes.b).a(new AttributeModifier("Random zombie-spawn bonus", d0, 2)); - } - - if (this.random.nextFloat() < f * 0.05F) { - this.getAttributeInstance(bp).a(new AttributeModifier("Leader zombie bonus", this.random.nextDouble() * 0.25D + 0.5D, 0)); - this.getAttributeInstance(GenericAttributes.maxHealth).a(new AttributeModifier("Leader zombie bonus", this.random.nextDouble() * 3.0D + 1.0D, 2)); - this.a(true); - } - - return (GroupDataEntity) object; - } - - public boolean a(EntityHuman entityhuman) { - ItemStack itemstack = entityhuman.bF(); - - if (itemstack != null && itemstack.getItem() == Items.GOLDEN_APPLE && itemstack.getData() == 0 && this.isVillager() && this.hasEffect(MobEffectList.WEAKNESS)) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - if (itemstack.count <= 0) { - entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); - } - - if (!this.world.isStatic) { - this.a(this.random.nextInt(2401) + 3600); - } - - return true; - } else { - return false; - } - } - - protected void a(int i) { - this.bt = i; - this.getDataWatcher().watch(14, Byte.valueOf((byte) 1)); - this.removeEffect(MobEffectList.WEAKNESS.id); - this.addEffect(new MobEffect(MobEffectList.INCREASE_DAMAGE.id, i, Math.min(this.world.difficulty.a() - 1, 0))); - this.world.broadcastEntityEffect(this, (byte) 16); - } - - protected boolean isTypeNotPersistent() { - return !this.cc(); - } - - public boolean cc() { - return this.getDataWatcher().getByte(14) == 1; - } - - protected void cd() { - EntityVillager entityvillager = new EntityVillager(this.world); - - entityvillager.k(this); - entityvillager.prepare((GroupDataEntity) null); - entityvillager.cd(); - if (this.isBaby()) { - entityvillager.setAge(-24000); - } - - this.world.kill(this); - this.world.addEntity(entityvillager, CreatureSpawnEvent.SpawnReason.CURED); // CraftBukkit - add SpawnReason - entityvillager.addEffect(new MobEffect(MobEffectList.CONFUSION.id, 200, 0)); - this.world.a((EntityHuman) null, 1017, (int) this.locX, (int) this.locY, (int) this.locZ, 0); - } - - protected int ce() { - int i = 1; - - if (this.random.nextFloat() < 0.01F) { - int j = 0; - - for (int k = (int) this.locX - 4; k < (int) this.locX + 4 && j < 14; ++k) { - for (int l = (int) this.locY - 4; l < (int) this.locY + 4 && j < 14; ++l) { - for (int i1 = (int) this.locZ - 4; i1 < (int) this.locZ + 4 && j < 14; ++i1) { - Block block = this.world.getType(k, l, i1); - - if (block == Blocks.IRON_FENCE || block == Blocks.BED) { - if (this.random.nextFloat() < 0.3F) { - ++i; - } - - ++j; - } - } - } - } - } - - return i; - } - - public void k(boolean flag) { - this.a(flag ? 0.5F : 1.0F); - } - - protected final void a(float f, float f1) { - boolean flag = this.bv > 0.0F && this.bw > 0.0F; - - this.bv = f; - this.bw = f1; - if (!flag) { - this.a(1.0F); - } - } - - protected final void a(float f) { - super.a(this.bv * f, this.bw * f); - } -} diff --git a/src/main/java/net/minecraft/server/ExpirableListEntry.java b/src/main/java/net/minecraft/server/ExpirableListEntry.java deleted file mode 100644 index 2cf6e232..00000000 --- a/src/main/java/net/minecraft/server/ExpirableListEntry.java +++ /dev/null @@ -1,95 +0,0 @@ -package net.minecraft.server; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; - -import net.minecraft.util.com.google.gson.JsonObject; - -public abstract class ExpirableListEntry extends JsonListEntry { - - public static final SimpleDateFormat a = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z"); - protected final Date b; - protected final String c; - protected final Date d; - protected final String e; - - public ExpirableListEntry(Object object, Date date, String s, Date date1, String s1) { - super(object); - this.b = date == null ? new Date() : date; - this.c = s == null ? "(Unknown)" : s; - this.d = date1; - this.e = s1 == null ? "Banned by an operator." : s1; - } - - protected ExpirableListEntry(Object object, JsonObject jsonobject) { - super(checkExpiry(object, jsonobject), jsonobject); // CraftBukkit - check expiry - - Date date; - - try { - date = jsonobject.has("created") ? a.parse(jsonobject.get("created").getAsString()) : new Date(); - } catch (ParseException parseexception) { - date = new Date(); - } - - this.b = date; - this.c = jsonobject.has("source") ? jsonobject.get("source").getAsString() : "(Unknown)"; - - Date date1; - - try { - date1 = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; - } catch (ParseException parseexception1) { - date1 = null; - } - - this.d = date1; - this.e = jsonobject.has("reason") ? jsonobject.get("reason").getAsString() : "Banned by an operator."; - } - - public Date getExpires() { - return this.d; - } - - public String getReason() { - return this.e; - } - - boolean hasExpired() { - return this.d == null ? false : this.d.before(new Date()); - } - - protected void a(JsonObject jsonobject) { - jsonobject.addProperty("created", a.format(this.b)); - jsonobject.addProperty("source", this.c); - jsonobject.addProperty("expires", this.d == null ? "forever" : a.format(this.d)); - jsonobject.addProperty("reason", this.e); - } - - // CraftBukkit start - public String getSource() { - return this.c; - } - - public Date getCreated() { - return this.b; - } - - private static Object checkExpiry(Object object, JsonObject jsonobject) { - Date expires = null; - - try { - expires = jsonobject.has("expires") ? a.parse(jsonobject.get("expires").getAsString()) : null; - } catch (ParseException ex) { - // Guess we don't have a date - } - - if (expires == null || expires.after(new Date())) { - return object; - } else { - return null; - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java deleted file mode 100644 index 56fa9998..00000000 --- a/src/main/java/net/minecraft/server/Explosion.java +++ /dev/null @@ -1,269 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityExplodeEvent; -import org.bukkit.Location; -// CraftBukkit end - -public class Explosion { - - public boolean a; - public boolean b = true; - private int i = 16; - private Random j = new Random(); - private World world; - public double posX; - public double posY; - public double posZ; - public Entity source; - public float size; - public List blocks = new ArrayList(); - private Map l = new HashMap(); - public boolean wasCanceled = false; // CraftBukkit - add field - - public Explosion(World world, Entity entity, double d0, double d1, double d2, float f) { - this.world = world; - this.source = entity; - this.size = (float) Math.max(f, 0.0); // CraftBukkit - clamp bad values - this.posX = d0; - this.posY = d1; - this.posZ = d2; - } - - public void a() { - // CraftBukkit start - if (this.size < 0.1F) { - return; - } - // CraftBukkit end - - float f = this.size; - HashSet hashset = new HashSet(); - - int i; - int j; - int k; - double d0; - double d1; - double d2; - - for (i = 0; i < this.i; ++i) { - for (j = 0; j < this.i; ++j) { - for (k = 0; k < this.i; ++k) { - if (i == 0 || i == this.i - 1 || j == 0 || j == this.i - 1 || k == 0 || k == this.i - 1) { - double d3 = (double) ((float) i / ((float) this.i - 1.0F) * 2.0F - 1.0F); - double d4 = (double) ((float) j / ((float) this.i - 1.0F) * 2.0F - 1.0F); - double d5 = (double) ((float) k / ((float) this.i - 1.0F) * 2.0F - 1.0F); - double d6 = Math.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - - d3 /= d6; - d4 /= d6; - d5 /= d6; - float f1 = this.size * (0.7F + this.world.random.nextFloat() * 0.6F); - - d0 = this.posX; - d1 = this.posY; - d2 = this.posZ; - - for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) { - int l = MathHelper.floor(d0); - int i1 = MathHelper.floor(d1); - int j1 = MathHelper.floor(d2); - Block block = this.world.getType(l, i1, j1); - - if (block.getMaterial() != Material.AIR) { - float f3 = this.source != null ? this.source.a(this, this.world, l, i1, j1, block) : block.a(this.source); - - f1 -= (f3 + 0.3F) * f2; - } - - if (f1 > 0.0F && (this.source == null || this.source.a(this, this.world, l, i1, j1, block, f1)) && i1 < 256 && i1 >= 0) { // CraftBukkit - don't wrap explosions - hashset.add(new ChunkPosition(l, i1, j1)); - } - - d0 += d3 * (double) f2; - d1 += d4 * (double) f2; - d2 += d5 * (double) f2; - } - } - } - } - } - - this.blocks.addAll(hashset); - this.size *= 2.0F; - i = MathHelper.floor(this.posX - (double) this.size - 1.0D); - j = MathHelper.floor(this.posX + (double) this.size + 1.0D); - k = MathHelper.floor(this.posY - (double) this.size - 1.0D); - int k1 = MathHelper.floor(this.posY + (double) this.size + 1.0D); - int l1 = MathHelper.floor(this.posZ - (double) this.size - 1.0D); - int i2 = MathHelper.floor(this.posZ + (double) this.size + 1.0D); - List list = this.world.getEntities(this.source, AxisAlignedBB.a((double) i, (double) k, (double) l1, (double) j, (double) k1, (double) i2)); - Vec3D vec3d = Vec3D.a(this.posX, this.posY, this.posZ); - - for (int j2 = 0; j2 < list.size(); ++j2) { - Entity entity = (Entity) list.get(j2); - double d7 = entity.f(this.posX, this.posY, this.posZ) / (double) this.size; - - if (d7 <= 1.0D) { - d0 = entity.locX - this.posX; - d1 = entity.locY + (double) entity.getHeadHeight() - this.posY; - d2 = entity.locZ - this.posZ; - double d8 = (double) MathHelper.sqrt(d0 * d0 + d1 * d1 + d2 * d2); - - if (d8 != 0.0D) { - d0 /= d8; - d1 /= d8; - d2 /= d8; - double d9 = (double) this.world.a(vec3d, entity.boundingBox); - double d10 = (1.0D - d7) * d9; - - // CraftBukkit start - CraftEventFactory.entityDamage = source; - if (!entity.damageEntity(DamageSource.explosion(this), (float) ((int) ((d10 * d10 + d10) / 2.0D * 8.0D * (double) this.size + 1.0D)))) { - CraftEventFactory.entityDamage = null; - continue; - } - // CraftBukkit end - double d11 = EnchantmentProtection.a(entity, d10); - - entity.motX += d0 * d11; - entity.motY += d1 * d11; - entity.motZ += d2 * d11; - if (entity instanceof EntityHuman) { - this.l.put((EntityHuman) entity, Vec3D.a(d0 * d10, d1 * d10, d2 * d10)); - } - } - } - } - - this.size = f; - } - - public void a(boolean flag) { - this.world.makeSound(this.posX, this.posY, this.posZ, "random.explode", 4.0F, (1.0F + (this.world.random.nextFloat() - this.world.random.nextFloat()) * 0.2F) * 0.7F); - if (this.size >= 2.0F && this.b) { - this.world.addParticle("hugeexplosion", this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); - } else { - this.world.addParticle("largeexplode", this.posX, this.posY, this.posZ, 1.0D, 0.0D, 0.0D); - } - - Iterator iterator; - ChunkPosition chunkposition; - int i; - int j; - int k; - Block block; - - if (this.b) { - // CraftBukkit start - org.bukkit.World bworld = this.world.getWorld(); - org.bukkit.entity.Entity explode = this.source == null ? null : this.source.getBukkitEntity(); - Location location = new Location(bworld, this.posX, this.posY, this.posZ); - - List<org.bukkit.block.Block> blockList = new ArrayList<org.bukkit.block.Block>(); - for (int i1 = this.blocks.size() - 1; i1 >= 0; i1--) { - ChunkPosition cpos = (ChunkPosition) this.blocks.get(i1); - org.bukkit.block.Block bblock = bworld.getBlockAt(cpos.x, cpos.y, cpos.z); - if (bblock.getType() != org.bukkit.Material.AIR) { - blockList.add(bblock); - } - } - - EntityExplodeEvent event = new EntityExplodeEvent(explode, location, blockList, 0.3F); - this.world.getServer().getPluginManager().callEvent(event); - - this.blocks.clear(); - - for (org.bukkit.block.Block bblock : event.blockList()) { - ChunkPosition coords = new ChunkPosition(bblock.getX(), bblock.getY(), bblock.getZ()); - blocks.add(coords); - } - - if (event.isCancelled()) { - this.wasCanceled = true; - return; - } - // CraftBukkit end - - iterator = this.blocks.iterator(); - - while (iterator.hasNext()) { - chunkposition = (ChunkPosition) iterator.next(); - i = chunkposition.x; - j = chunkposition.y; - k = chunkposition.z; - block = this.world.getType(i, j, k); - if (flag) { - double d0 = (double) ((float) i + this.world.random.nextFloat()); - double d1 = (double) ((float) j + this.world.random.nextFloat()); - double d2 = (double) ((float) k + this.world.random.nextFloat()); - double d3 = d0 - this.posX; - double d4 = d1 - this.posY; - double d5 = d2 - this.posZ; - double d6 = (double) MathHelper.sqrt(d3 * d3 + d4 * d4 + d5 * d5); - - d3 /= d6; - d4 /= d6; - d5 /= d6; - double d7 = 0.5D / (d6 / (double) this.size + 0.1D); - - d7 *= (double) (this.world.random.nextFloat() * this.world.random.nextFloat() + 0.3F); - d3 *= d7; - d4 *= d7; - d5 *= d7; - this.world.addParticle("explode", (d0 + this.posX * 1.0D) / 2.0D, (d1 + this.posY * 1.0D) / 2.0D, (d2 + this.posZ * 1.0D) / 2.0D, d3, d4, d5); - this.world.addParticle("smoke", d0, d1, d2, d3, d4, d5); - } - - if (block.getMaterial() != Material.AIR) { - if (block.a(this)) { - // CraftBukkit - add yield - block.dropNaturally(this.world, i, j, k, this.world.getData(i, j, k), event.getYield(), 0); - } - - this.world.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); - block.wasExploded(this.world, i, j, k, this); - } - } - } - - if (this.a) { - iterator = this.blocks.iterator(); - - while (iterator.hasNext()) { - chunkposition = (ChunkPosition) iterator.next(); - i = chunkposition.x; - j = chunkposition.y; - k = chunkposition.z; - block = this.world.getType(i, j, k); - Block block1 = this.world.getType(i, j - 1, k); - - if (block.getMaterial() == Material.AIR && block1.j() && this.j.nextInt(3) == 0) { - // CraftBukkit start - Ignition by explosion - if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(this.world, i, j, k, this).isCancelled()) { - this.world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - // CraftBukkit end - } - } - } - } - - public Map b() { - return this.l; - } - - public EntityLiving c() { - return this.source == null ? null : (this.source instanceof EntityTNTPrimed ? ((EntityTNTPrimed) this.source).getSource() : (this.source instanceof EntityLiving ? (EntityLiving) this.source : null)); - } -} diff --git a/src/main/java/net/minecraft/server/FileConversionException.java b/src/main/java/net/minecraft/server/FileConversionException.java deleted file mode 100644 index 4b189bfb..00000000 --- a/src/main/java/net/minecraft/server/FileConversionException.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - Imported because it's package private - -class FileConversionException extends RuntimeException { - - private FileConversionException(String s, Throwable throwable) { - super(s, throwable); - } - - private FileConversionException(String s) { - super(s); - } - - FileConversionException(String s, PredicateEmptyList predicateemptylist) { - this(s); - } - - FileConversionException(String s, Throwable throwable, PredicateEmptyList predicateemptylist) { - this(s, throwable); - } -} diff --git a/src/main/java/net/minecraft/server/FoodMetaData.java b/src/main/java/net/minecraft/server/FoodMetaData.java deleted file mode 100644 index 41692318..00000000 --- a/src/main/java/net/minecraft/server/FoodMetaData.java +++ /dev/null @@ -1,116 +0,0 @@ -package net.minecraft.server; - -public class FoodMetaData { - - // CraftBukkit start - All made public - public int foodLevel = 20; - public float saturationLevel = 5.0F; - public float exhaustionLevel; - public int foodTickTimer; - private EntityHuman entityhuman; - // CraftBukkit end - private int e = 20; - - public FoodMetaData() { throw new AssertionError("Whoopsie, we missed the bukkit."); } // CraftBukkit start - throw an error - - // CraftBukkit start - added EntityHuman constructor - public FoodMetaData(EntityHuman entityhuman) { - org.apache.commons.lang.Validate.notNull(entityhuman); - this.entityhuman = entityhuman; - } - // CraftBukkit end - - public void eat(int i, float f) { - this.foodLevel = Math.min(i + this.foodLevel, 20); - this.saturationLevel = Math.min(this.saturationLevel + (float) i * f * 2.0F, (float) this.foodLevel); - } - - public void a(ItemFood itemfood, ItemStack itemstack) { - // CraftBukkit start - int oldFoodLevel = foodLevel; - - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, itemfood.getNutrition(itemstack) + oldFoodLevel); - - if (!event.isCancelled()) { - this.eat(event.getFoodLevel() - oldFoodLevel, itemfood.getSaturationModifier(itemstack)); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); - // CraftBukkit end - } - - public void a(EntityHuman entityhuman) { - EnumDifficulty enumdifficulty = entityhuman.world.difficulty; - - this.e = this.foodLevel; - if (this.exhaustionLevel > 4.0F) { - this.exhaustionLevel -= 4.0F; - if (this.saturationLevel > 0.0F) { - this.saturationLevel = Math.max(this.saturationLevel - 1.0F, 0.0F); - } else if (enumdifficulty != EnumDifficulty.PEACEFUL) { - // CraftBukkit start - org.bukkit.event.entity.FoodLevelChangeEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callFoodLevelChangeEvent(entityhuman, Math.max(this.foodLevel - 1, 0)); - - if (!event.isCancelled()) { - this.foodLevel = event.getFoodLevel(); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), this.foodLevel, this.saturationLevel)); - // CraftBukkit end - } - } - - if (entityhuman.world.getGameRules().getBoolean("naturalRegeneration") && this.foodLevel >= 18 && entityhuman.bR()) { - ++this.foodTickTimer; - if (this.foodTickTimer >= 80) { - // CraftBukkit - added RegainReason - entityhuman.heal(1.0F, org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason.SATIATED); - this.a(3.0F); - this.foodTickTimer = 0; - } - } else if (this.foodLevel <= 0) { - ++this.foodTickTimer; - if (this.foodTickTimer >= 80) { - if (entityhuman.getHealth() > 10.0F || enumdifficulty == EnumDifficulty.HARD || entityhuman.getHealth() > 1.0F && enumdifficulty == EnumDifficulty.NORMAL) { - entityhuman.damageEntity(DamageSource.STARVE, 1.0F); - } - - this.foodTickTimer = 0; - } - } else { - this.foodTickTimer = 0; - } - } - - public void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("foodLevel", 99)) { - this.foodLevel = nbttagcompound.getInt("foodLevel"); - this.foodTickTimer = nbttagcompound.getInt("foodTickTimer"); - this.saturationLevel = nbttagcompound.getFloat("foodSaturationLevel"); - this.exhaustionLevel = nbttagcompound.getFloat("foodExhaustionLevel"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("foodLevel", this.foodLevel); - nbttagcompound.setInt("foodTickTimer", this.foodTickTimer); - nbttagcompound.setFloat("foodSaturationLevel", this.saturationLevel); - nbttagcompound.setFloat("foodExhaustionLevel", this.exhaustionLevel); - } - - public int getFoodLevel() { - return this.foodLevel; - } - - public boolean c() { - return this.foodLevel < 20; - } - - public void a(float f) { - this.exhaustionLevel = Math.min(this.exhaustionLevel + f, 40.0F); - } - - public float getSaturationLevel() { - return this.saturationLevel; - } -} diff --git a/src/main/java/net/minecraft/server/GroupDataZombie.java b/src/main/java/net/minecraft/server/GroupDataZombie.java deleted file mode 100644 index 340af90f..00000000 --- a/src/main/java/net/minecraft/server/GroupDataZombie.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - package-private import -class GroupDataZombie implements GroupDataEntity { - - public boolean a; - public boolean b; - final EntityZombie c; - - private GroupDataZombie(EntityZombie entityzombie, boolean flag, boolean flag1) { - this.c = entityzombie; - this.a = false; - this.b = false; - this.a = flag; - this.b = flag1; - } - - GroupDataZombie(EntityZombie entityzombie, boolean flag, boolean flag1, EmptyClassZombie emptyclasszombie) { - this(entityzombie, flag, flag1); - } -} diff --git a/src/main/java/net/minecraft/server/HandshakeListener.java b/src/main/java/net/minecraft/server/HandshakeListener.java deleted file mode 100644 index 52bc69b6..00000000 --- a/src/main/java/net/minecraft/server/HandshakeListener.java +++ /dev/null @@ -1,99 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; - -// CraftBukkit start -import java.net.InetAddress; -import java.util.HashMap; -// CraftBukkit end - -public class HandshakeListener implements PacketHandshakingInListener { - - // CraftBukkit start - add fields - private static final HashMap<InetAddress, Long> throttleTracker = new HashMap<InetAddress, Long>(); - private static int throttleCounter = 0; - // CraftBukkit end - - private final MinecraftServer a; - private final NetworkManager b; - - public HandshakeListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.a = minecraftserver; - this.b = networkmanager; - } - - public void a(PacketHandshakingInSetProtocol packethandshakinginsetprotocol) { - switch (ProtocolOrdinalWrapper.a[packethandshakinginsetprotocol.c().ordinal()]) { - case 1: - this.b.a(EnumProtocol.LOGIN); - ChatComponentText chatcomponenttext; - - // CraftBukkit start - Connection throttle - try { - long currentTime = System.currentTimeMillis(); - long connectionThrottle = MinecraftServer.getServer().server.getConnectionThrottle(); - InetAddress address = ((java.net.InetSocketAddress) this.b.getSocketAddress()).getAddress(); - - synchronized (throttleTracker) { - if (throttleTracker.containsKey(address) && !"127.0.0.1".equals(address.getHostAddress()) && currentTime - throttleTracker.get(address) < connectionThrottle) { - throttleTracker.put(address, currentTime); - chatcomponenttext = new ChatComponentText("Connection throttled! Please wait before reconnecting."); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.b.close(chatcomponenttext); - return; - } - - throttleTracker.put(address, currentTime); - throttleCounter++; - if (throttleCounter > 200) { - throttleCounter = 0; - - // Cleanup stale entries - java.util.Iterator iter = throttleTracker.entrySet().iterator(); - while (iter.hasNext()) { - java.util.Map.Entry<InetAddress, Long> entry = (java.util.Map.Entry) iter.next(); - if (entry.getValue() > connectionThrottle) { - iter.remove(); - } - } - } - } - } catch (Throwable t) { - org.apache.logging.log4j.LogManager.getLogger().debug("Failed to check connection throttle", t); - } - // CraftBukkit end - - if (packethandshakinginsetprotocol.d() > 5) { - chatcomponenttext = new ChatComponentText("Outdated server! I\'m still on 1.7.10"); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.b.close(chatcomponenttext); - } else if (packethandshakinginsetprotocol.d() < 5) { - chatcomponenttext = new ChatComponentText("Outdated client! Please use 1.7.10"); - this.b.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.b.close(chatcomponenttext); - } else { - this.b.a((PacketListener) (new LoginListener(this.a, this.b))); - ((LoginListener) this.b.getPacketListener()).hostname = packethandshakinginsetprotocol.b + ":" + packethandshakinginsetprotocol.c; // CraftBukkit - set hostname - } - break; - - case 2: - this.b.a(EnumProtocol.STATUS); - this.b.a((PacketListener) (new PacketStatusListener(this.a, this.b))); - break; - - default: - throw new UnsupportedOperationException("Invalid intention " + packethandshakinginsetprotocol.c()); - } - } - - public void a(IChatBaseComponent ichatbasecomponent) {} - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - if (enumprotocol1 != EnumProtocol.LOGIN && enumprotocol1 != EnumProtocol.STATUS) { - throw new UnsupportedOperationException("Invalid state " + enumprotocol1); - } - } - - public void a() {} -} diff --git a/src/main/java/net/minecraft/server/IDataManager.java b/src/main/java/net/minecraft/server/IDataManager.java deleted file mode 100644 index e5d578df..00000000 --- a/src/main/java/net/minecraft/server/IDataManager.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.minecraft.server; - -import java.io.File; - -public interface IDataManager { - - WorldData getWorldData(); - - void checkSession() throws ExceptionWorldConflict; // CraftBukkit - throws ExceptionWorldConflict - - IChunkLoader createChunkLoader(WorldProvider worldprovider); - - void saveWorldData(WorldData worlddata, NBTTagCompound nbttagcompound); - - void saveWorldData(WorldData worlddata); - - IPlayerFileData getPlayerFileData(); - - void a(); - - File getDirectory(); - - File getDataFile(String s); - - String g(); - - java.util.UUID getUUID(); // CraftBukkit -} diff --git a/src/main/java/net/minecraft/server/IInventory.java b/src/main/java/net/minecraft/server/IInventory.java deleted file mode 100644 index bfc5c869..00000000 --- a/src/main/java/net/minecraft/server/IInventory.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; // CraftBukkit - -public interface IInventory { - - int getSize(); - - ItemStack getItem(int i); - - ItemStack splitStack(int i, int j); - - ItemStack splitWithoutUpdate(int i); - - void setItem(int i, ItemStack itemstack); - - String getInventoryName(); - - boolean k_(); - - int getMaxStackSize(); - - void update(); - - boolean a(EntityHuman entityhuman); - - void startOpen(); - - void closeContainer(); - - boolean b(int i, ItemStack itemstack); - - // CraftBukkit start - ItemStack[] getContents(); - - void onOpen(CraftHumanEntity who); - - void onClose(CraftHumanEntity who); - - java.util.List<org.bukkit.entity.HumanEntity> getViewers(); - - org.bukkit.inventory.InventoryHolder getOwner(); - - void setMaxStackSize(int size); - - int MAX_STACK = 64; - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/IRecipe.java b/src/main/java/net/minecraft/server/IRecipe.java deleted file mode 100644 index bb28c12f..00000000 --- a/src/main/java/net/minecraft/server/IRecipe.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.minecraft.server; - -public interface IRecipe { - - boolean a(InventoryCrafting inventorycrafting, World world); - - ItemStack a(InventoryCrafting inventorycrafting); - - int a(); - - ItemStack b(); - - org.bukkit.inventory.Recipe toBukkitRecipe(); // CraftBukkit -} diff --git a/src/main/java/net/minecraft/server/IntHashMap.java b/src/main/java/net/minecraft/server/IntHashMap.java deleted file mode 100644 index fff9d7ac..00000000 --- a/src/main/java/net/minecraft/server/IntHashMap.java +++ /dev/null @@ -1,167 +0,0 @@ -package net.minecraft.server; - -import java.util.HashSet; -import java.util.Set; - -public class IntHashMap { - - private transient IntHashMapEntry[] a = new IntHashMapEntry[16]; - private transient int b; - private int c = 12; - private final float d = 0.75F; - private transient volatile int e; - // private Set f = new HashSet(); // CraftBukkit - expensive and unused - - public IntHashMap() {} - - private static int g(int i) { - i ^= i >>> 20 ^ i >>> 12; - return i ^ i >>> 7 ^ i >>> 4; - } - - private static int a(int i, int j) { - return i & j - 1; - } - - public Object get(int i) { - int j = g(i); - - for (IntHashMapEntry inthashmapentry = this.a[a(j, this.a.length)]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) { - if (inthashmapentry.a == i) { - return inthashmapentry.b; - } - } - - return null; - } - - public boolean b(int i) { - return this.c(i) != null; - } - - final IntHashMapEntry c(int i) { - int j = g(i); - - for (IntHashMapEntry inthashmapentry = this.a[a(j, this.a.length)]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) { - if (inthashmapentry.a == i) { - return inthashmapentry; - } - } - - return null; - } - - public void a(int i, Object object) { - // this.f.add(Integer.valueOf(i)); // CraftBukkit - int j = g(i); - int k = a(j, this.a.length); - - for (IntHashMapEntry inthashmapentry = this.a[k]; inthashmapentry != null; inthashmapentry = inthashmapentry.c) { - if (inthashmapentry.a == i) { - inthashmapentry.b = object; - return; - } - } - - ++this.e; - this.a(j, i, object, k); - } - - private void h(int i) { - IntHashMapEntry[] ainthashmapentry = this.a; - int j = ainthashmapentry.length; - - if (j == 1073741824) { - this.c = Integer.MAX_VALUE; - } else { - IntHashMapEntry[] ainthashmapentry1 = new IntHashMapEntry[i]; - - this.a(ainthashmapentry1); - this.a = ainthashmapentry1; - this.c = (int) ((float) i * this.d); - } - } - - private void a(IntHashMapEntry[] ainthashmapentry) { - IntHashMapEntry[] ainthashmapentry1 = this.a; - int i = ainthashmapentry.length; - - for (int j = 0; j < ainthashmapentry1.length; ++j) { - IntHashMapEntry inthashmapentry = ainthashmapentry1[j]; - - if (inthashmapentry != null) { - ainthashmapentry1[j] = null; - - IntHashMapEntry inthashmapentry1; - - do { - inthashmapentry1 = inthashmapentry.c; - int k = a(inthashmapentry.d, i); - - inthashmapentry.c = ainthashmapentry[k]; - ainthashmapentry[k] = inthashmapentry; - inthashmapentry = inthashmapentry1; - } while (inthashmapentry1 != null); - } - } - } - - public Object d(int i) { - // this.f.remove(Integer.valueOf(i)); // CraftBukkit - IntHashMapEntry inthashmapentry = this.e(i); - - return inthashmapentry == null ? null : inthashmapentry.b; - } - - final IntHashMapEntry e(int i) { - int j = g(i); - int k = a(j, this.a.length); - IntHashMapEntry inthashmapentry = this.a[k]; - - IntHashMapEntry inthashmapentry1; - IntHashMapEntry inthashmapentry2; - - for (inthashmapentry1 = inthashmapentry; inthashmapentry1 != null; inthashmapentry1 = inthashmapentry2) { - inthashmapentry2 = inthashmapentry1.c; - if (inthashmapentry1.a == i) { - ++this.e; - --this.b; - if (inthashmapentry == inthashmapentry1) { - this.a[k] = inthashmapentry2; - } else { - inthashmapentry.c = inthashmapentry2; - } - - return inthashmapentry1; - } - - inthashmapentry = inthashmapentry1; - } - - return inthashmapentry1; - } - - public void c() { - ++this.e; - IntHashMapEntry[] ainthashmapentry = this.a; - - for (int i = 0; i < ainthashmapentry.length; ++i) { - ainthashmapentry[i] = null; - } - - this.b = 0; - } - - private void a(int i, int j, Object object, int k) { - IntHashMapEntry inthashmapentry = this.a[k]; - - this.a[k] = new IntHashMapEntry(i, j, object, inthashmapentry); - if (this.b++ >= this.c) { - this.h(2 * this.a.length); - } - } - - static int f(int i) { - return g(i); - } -} diff --git a/src/main/java/net/minecraft/server/InventoryCraftResult.java b/src/main/java/net/minecraft/server/InventoryCraftResult.java deleted file mode 100644 index 7db82900..00000000 --- a/src/main/java/net/minecraft/server/InventoryCraftResult.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryCraftResult implements IInventory { - - private ItemStack[] items = new ItemStack[1]; - - // CraftBukkit start - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return null; // Result slots don't get an owner - } - - // Don't need a transaction; the InventoryCrafting keeps track of it for us - public void onOpen(CraftHumanEntity who) {} - public void onClose(CraftHumanEntity who) {} - public java.util.List<HumanEntity> getViewers() { - return new java.util.ArrayList<HumanEntity>(); - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public InventoryCraftResult() {} - - public int getSize() { - return 1; - } - - public ItemStack getItem(int i) { - return this.items[0]; - } - - public String getInventoryName() { - return "Result"; - } - - public boolean k_() { - return false; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[0] != null) { - ItemStack itemstack = this.items[0]; - - this.items[0] = null; - return itemstack; - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[0] != null) { - ItemStack itemstack = this.items[0]; - - this.items[0] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[0] = itemstack; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void update() {} - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryCrafting.java b/src/main/java/net/minecraft/server/InventoryCrafting.java deleted file mode 100644 index 5b46597d..00000000 --- a/src/main/java/net/minecraft/server/InventoryCrafting.java +++ /dev/null @@ -1,149 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryType; -// CraftBukkit end - -public class InventoryCrafting implements IInventory { - - private ItemStack[] items; - private int b; - private Container c; - - // CraftBukkit start - add fields - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - public IRecipe currentRecipe; - public IInventory resultInventory; - private EntityHuman owner; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public InventoryType getInvType() { - return items.length == 4 ? InventoryType.CRAFTING : InventoryType.WORKBENCH; - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return owner.getBukkitEntity(); - } - - public void setMaxStackSize(int size) { - maxStack = size; - resultInventory.setMaxStackSize(size); - } - - public InventoryCrafting(Container container, int i, int j, EntityHuman player) { - this(container, i, j); - this.owner = player; - } - // CraftBukkit end - - public InventoryCrafting(Container container, int i, int j) { - int k = i * j; - - this.items = new ItemStack[k]; - this.c = container; - this.b = i; - } - - public int getSize() { - return this.items.length; - } - - public ItemStack getItem(int i) { - return i >= this.getSize() ? null : this.items[i]; - } - - public ItemStack b(int i, int j) { - if (i >= 0 && i < this.b) { - int k = i + j * this.b; - - return this.getItem(k); - } else { - return null; - } - } - - public String getInventoryName() { - return "container.crafting"; - } - - public boolean k_() { - return false; - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.c.a((IInventory) this); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.c.a((IInventory) this); - return itemstack; - } - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - this.c.a((IInventory) this); - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public void update() {} - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryEnderChest.java b/src/main/java/net/minecraft/server/InventoryEnderChest.java deleted file mode 100644 index ed23f787..00000000 --- a/src/main/java/net/minecraft/server/InventoryEnderChest.java +++ /dev/null @@ -1,110 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryEnderChest extends InventorySubcontainer { - - private TileEntityEnderChest a; - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - public org.bukkit.entity.Player player; - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - - public int getMaxStackSize() { - return maxStack; - } - // CraftBukkit end - - public InventoryEnderChest() { - super("container.enderchest", false, 27); - } - - public void a(TileEntityEnderChest tileentityenderchest) { - this.a = tileentityenderchest; - } - - public void a(NBTTagList nbttaglist) { - int i; - - for (i = 0; i < this.getSize(); ++i) { - this.setItem(i, (ItemStack) null); - } - - for (i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound = nbttaglist.get(i); - int j = nbttagcompound.getByte("Slot") & 255; - - if (j >= 0 && j < this.getSize()) { - this.setItem(j, ItemStack.createStack(nbttagcompound)); - } - } - } - - public NBTTagList h() { - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.getSize(); ++i) { - ItemStack itemstack = this.getItem(i); - - if (itemstack != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - nbttagcompound.setByte("Slot", (byte) i); - itemstack.save(nbttagcompound); - nbttaglist.add(nbttagcompound); - } - } - - return nbttaglist; - } - - public boolean a(EntityHuman entityhuman) { - return this.a != null && !this.a.a(entityhuman) ? false : super.a(entityhuman); - } - - public void startOpen() { - if (this.a != null) { - this.a.a(); - } - - super.startOpen(); - } - - public void closeContainer() { - if (this.a != null) { - this.a.b(); - } - - super.closeContainer(); - this.a = null; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryHorseChest.java b/src/main/java/net/minecraft/server/InventoryHorseChest.java deleted file mode 100644 index 01289950..00000000 --- a/src/main/java/net/minecraft/server/InventoryHorseChest.java +++ /dev/null @@ -1,60 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryHorseChest extends InventorySubcontainer { - - public InventoryHorseChest(String s, int i) { - super(s, false, i); - } - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private EntityHorse horse; - private int maxStack = MAX_STACK; - - public InventoryHorseChest(String s, int i, EntityHorse horse) { - this(s, i); - this.horse = horse; - } - - @Override - public ItemStack[] getContents() { - return this.items; - } - - @Override - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - @Override - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - @Override - public List<HumanEntity> getViewers() { - return transaction; - } - - @Override - public org.bukkit.inventory.InventoryHolder getOwner() { - return (org.bukkit.entity.Horse) this.horse.getBukkitEntity(); - } - - @Override - public void setMaxStackSize(int size) { - maxStack = size; - } - - @Override - public int getMaxStackSize() { - return maxStack; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/InventoryLargeChest.java b/src/main/java/net/minecraft/server/InventoryLargeChest.java deleted file mode 100644 index 263de7c5..00000000 --- a/src/main/java/net/minecraft/server/InventoryLargeChest.java +++ /dev/null @@ -1,129 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryLargeChest implements IInventory { - - private String a; - public IInventory left; // CraftBukkit - private -> public - public IInventory right; // CraftBukkit - private -> public - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - - public ItemStack[] getContents() { - ItemStack[] result = new ItemStack[this.getSize()]; - for (int i = 0; i < result.length; i++) { - result[i] = this.getItem(i); - } - return result; - } - - public void onOpen(CraftHumanEntity who) { - this.left.onOpen(who); - this.right.onOpen(who); - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - this.left.onClose(who); - this.right.onClose(who); - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return null; // This method won't be called since CraftInventoryDoubleChest doesn't defer to here - } - - public void setMaxStackSize(int size) { - this.left.setMaxStackSize(size); - this.right.setMaxStackSize(size); - } - // CraftBukkit end - - public InventoryLargeChest(String s, IInventory iinventory, IInventory iinventory1) { - this.a = s; - if (iinventory == null) { - iinventory = iinventory1; - } - - if (iinventory1 == null) { - iinventory1 = iinventory; - } - - this.left = iinventory; - this.right = iinventory1; - } - - public int getSize() { - return this.left.getSize() + this.right.getSize(); - } - - public boolean a(IInventory iinventory) { - return this.left == iinventory || this.right == iinventory; - } - - public String getInventoryName() { - return this.left.k_() ? this.left.getInventoryName() : (this.right.k_() ? this.right.getInventoryName() : this.a); - } - - public boolean k_() { - return this.left.k_() || this.right.k_(); - } - - public ItemStack getItem(int i) { - return i >= this.left.getSize() ? this.right.getItem(i - this.left.getSize()) : this.left.getItem(i); - } - - public ItemStack splitStack(int i, int j) { - return i >= this.left.getSize() ? this.right.splitStack(i - this.left.getSize(), j) : this.left.splitStack(i, j); - } - - public ItemStack splitWithoutUpdate(int i) { - return i >= this.left.getSize() ? this.right.splitWithoutUpdate(i - this.left.getSize()) : this.left.splitWithoutUpdate(i); - } - - public void setItem(int i, ItemStack itemstack) { - if (i >= this.left.getSize()) { - this.right.setItem(i - this.left.getSize(), itemstack); - } else { - this.left.setItem(i, itemstack); - } - } - - public int getMaxStackSize() { - return Math.min(this.left.getMaxStackSize(), this.right.getMaxStackSize()); // CraftBukkit - check both sides - } - - public void update() { - this.left.update(); - this.right.update(); - } - - public boolean a(EntityHuman entityhuman) { - return this.left.a(entityhuman) && this.right.a(entityhuman); - } - - public void startOpen() { - this.left.startOpen(); - this.right.startOpen(); - } - - public void closeContainer() { - this.left.closeContainer(); - this.right.closeContainer(); - } - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/InventoryMerchant.java b/src/main/java/net/minecraft/server/InventoryMerchant.java deleted file mode 100644 index b5617b32..00000000 --- a/src/main/java/net/minecraft/server/InventoryMerchant.java +++ /dev/null @@ -1,192 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class InventoryMerchant implements IInventory { - - private final IMerchant merchant; - private ItemStack[] itemsInSlots = new ItemStack[3]; - private final EntityHuman player; - private MerchantRecipe recipe; - private int e; - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.itemsInSlots; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public void setMaxStackSize(int i) { - maxStack = i; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return player.getBukkitEntity(); - } - // CraftBukkit end - - public InventoryMerchant(EntityHuman entityhuman, IMerchant imerchant) { - this.player = entityhuman; - this.merchant = imerchant; - } - - public int getSize() { - return this.itemsInSlots.length; - } - - public ItemStack getItem(int i) { - return this.itemsInSlots[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.itemsInSlots[i] != null) { - ItemStack itemstack; - - if (i == 2) { - itemstack = this.itemsInSlots[i]; - this.itemsInSlots[i] = null; - return itemstack; - } else if (this.itemsInSlots[i].count <= j) { - itemstack = this.itemsInSlots[i]; - this.itemsInSlots[i] = null; - if (this.d(i)) { - this.h(); - } - - return itemstack; - } else { - itemstack = this.itemsInSlots[i].a(j); - if (this.itemsInSlots[i].count == 0) { - this.itemsInSlots[i] = null; - } - - if (this.d(i)) { - this.h(); - } - - return itemstack; - } - } else { - return null; - } - } - - private boolean d(int i) { - return i == 0 || i == 1; - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.itemsInSlots[i] != null) { - ItemStack itemstack = this.itemsInSlots[i]; - - this.itemsInSlots[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.itemsInSlots[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - if (this.d(i)) { - this.h(); - } - } - - public String getInventoryName() { - return "mob.villager"; - } - - public boolean k_() { - return false; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.merchant.b() == entityhuman; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void update() { - this.h(); - } - - public void h() { - this.recipe = null; - ItemStack itemstack = this.itemsInSlots[0]; - ItemStack itemstack1 = this.itemsInSlots[1]; - - if (itemstack == null) { - itemstack = itemstack1; - itemstack1 = null; - } - - if (itemstack == null) { - this.setItem(2, (ItemStack) null); - } else { - MerchantRecipeList merchantrecipelist = this.merchant.getOffers(this.player); - - if (merchantrecipelist != null) { - MerchantRecipe merchantrecipe = merchantrecipelist.a(itemstack, itemstack1, this.e); - - if (merchantrecipe != null && !merchantrecipe.g()) { - this.recipe = merchantrecipe; - this.setItem(2, merchantrecipe.getBuyItem3().cloneItemStack()); - } else if (itemstack1 != null) { - merchantrecipe = merchantrecipelist.a(itemstack1, itemstack, this.e); - if (merchantrecipe != null && !merchantrecipe.g()) { - this.recipe = merchantrecipe; - this.setItem(2, merchantrecipe.getBuyItem3().cloneItemStack()); - } else { - this.setItem(2, (ItemStack) null); - } - } else { - this.setItem(2, (ItemStack) null); - } - } - } - - this.merchant.a_(this.getItem(2)); - } - - public MerchantRecipe getRecipe() { - return this.recipe; - } - - public void c(int i) { - this.e = i; - this.h(); - } -} diff --git a/src/main/java/net/minecraft/server/InventorySubcontainer.java b/src/main/java/net/minecraft/server/InventorySubcontainer.java deleted file mode 100644 index 9a775e4c..00000000 --- a/src/main/java/net/minecraft/server/InventorySubcontainer.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.List; - -public abstract class InventorySubcontainer implements IInventory { // CraftBukkit - abstract - - private String a; - private int b; - protected ItemStack[] items; // CraftBukkit - protected - private List d; - private boolean e; - - public InventorySubcontainer(String s, boolean flag, int i) { - this.a = s; - this.e = flag; - this.b = i; - this.items = new ItemStack[i]; - } - - public void a(IInventoryListener iinventorylistener) { - if (this.d == null) { - this.d = new ArrayList(); - } - - this.d.add(iinventorylistener); - } - - public void b(IInventoryListener iinventorylistener) { - this.d.remove(iinventorylistener); - } - - public ItemStack getItem(int i) { - return i >= 0 && i < this.items.length ? this.items[i] : null; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.update(); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.update(); - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - this.update(); - } - - public int getSize() { - return this.b; - } - - public String getInventoryName() { - return this.a; - } - - public boolean k_() { - return this.e; - } - - public void a(String s) { - this.e = true; - this.a = s; - } - - public int getMaxStackSize() { - return 64; - } - - public void update() { - if (this.d != null) { - for (int i = 0; i < this.d.size(); ++i) { - ((IInventoryListener) this.d.get(i)).a(this); - } - } - } - - public boolean a(EntityHuman entityhuman) { - return true; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/Item.java b/src/main/java/net/minecraft/server/Item.java deleted file mode 100644 index 4382f1ab..00000000 --- a/src/main/java/net/minecraft/server/Item.java +++ /dev/null @@ -1,503 +0,0 @@ -package net.minecraft.server; - -import java.util.HashSet; -import java.util.Iterator; -import java.util.Random; -import java.util.UUID; - -import net.minecraft.util.com.google.common.collect.HashMultimap; -import net.minecraft.util.com.google.common.collect.Multimap; -import net.minecraft.util.com.google.common.collect.Sets; - -public class Item { - - public static final RegistryMaterials REGISTRY = new RegistryMaterials(); - protected static final UUID f = UUID.fromString("CB3F55D3-645C-4F38-A497-9C13A33DB5CF"); - private CreativeModeTab a; - protected static Random g = new Random(); - protected int maxStackSize = 64; - private int durability; - protected boolean i; - protected boolean j; - private Item craftingResult; - private String d; - private String name; - protected String l; - - public Item() {} - - public static int getId(Item item) { - return item == null ? 0 : REGISTRY.b(item); - } - - public static Item getById(int i) { - return (Item) REGISTRY.a(i); - } - - public static Item getItemOf(Block block) { - return getById(Block.getId(block)); - } - - public static void l() { - REGISTRY.a(256, "iron_shovel", (new ItemSpade(EnumToolMaterial.IRON)).c("shovelIron").f("iron_shovel")); - REGISTRY.a(257, "iron_pickaxe", (new ItemPickaxe(EnumToolMaterial.IRON)).c("pickaxeIron").f("iron_pickaxe")); - REGISTRY.a(258, "iron_axe", (new ItemAxe(EnumToolMaterial.IRON)).c("hatchetIron").f("iron_axe")); - REGISTRY.a(259, "flint_and_steel", (new ItemFlintAndSteel()).c("flintAndSteel").f("flint_and_steel")); - REGISTRY.a(260, "apple", (new ItemFood(4, 0.3F, false)).c("apple").f("apple")); - REGISTRY.a(261, "bow", (new ItemBow()).c("bow").f("bow")); - REGISTRY.a(262, "arrow", (new Item()).c("arrow").a(CreativeModeTab.j).f("arrow")); - REGISTRY.a(263, "coal", (new ItemCoal()).c("coal").f("coal")); - REGISTRY.a(264, "diamond", (new Item()).c("diamond").a(CreativeModeTab.l).f("diamond")); - REGISTRY.a(265, "iron_ingot", (new Item()).c("ingotIron").a(CreativeModeTab.l).f("iron_ingot")); - REGISTRY.a(266, "gold_ingot", (new Item()).c("ingotGold").a(CreativeModeTab.l).f("gold_ingot")); - REGISTRY.a(267, "iron_sword", (new ItemSword(EnumToolMaterial.IRON)).c("swordIron").f("iron_sword")); - REGISTRY.a(268, "wooden_sword", (new ItemSword(EnumToolMaterial.WOOD)).c("swordWood").f("wood_sword")); - REGISTRY.a(269, "wooden_shovel", (new ItemSpade(EnumToolMaterial.WOOD)).c("shovelWood").f("wood_shovel")); - REGISTRY.a(270, "wooden_pickaxe", (new ItemPickaxe(EnumToolMaterial.WOOD)).c("pickaxeWood").f("wood_pickaxe")); - REGISTRY.a(271, "wooden_axe", (new ItemAxe(EnumToolMaterial.WOOD)).c("hatchetWood").f("wood_axe")); - REGISTRY.a(272, "stone_sword", (new ItemSword(EnumToolMaterial.STONE)).c("swordStone").f("stone_sword")); - REGISTRY.a(273, "stone_shovel", (new ItemSpade(EnumToolMaterial.STONE)).c("shovelStone").f("stone_shovel")); - REGISTRY.a(274, "stone_pickaxe", (new ItemPickaxe(EnumToolMaterial.STONE)).c("pickaxeStone").f("stone_pickaxe")); - REGISTRY.a(275, "stone_axe", (new ItemAxe(EnumToolMaterial.STONE)).c("hatchetStone").f("stone_axe")); - REGISTRY.a(276, "diamond_sword", (new ItemSword(EnumToolMaterial.DIAMOND)).c("swordDiamond").f("diamond_sword")); - REGISTRY.a(277, "diamond_shovel", (new ItemSpade(EnumToolMaterial.DIAMOND)).c("shovelDiamond").f("diamond_shovel")); - REGISTRY.a(278, "diamond_pickaxe", (new ItemPickaxe(EnumToolMaterial.DIAMOND)).c("pickaxeDiamond").f("diamond_pickaxe")); - REGISTRY.a(279, "diamond_axe", (new ItemAxe(EnumToolMaterial.DIAMOND)).c("hatchetDiamond").f("diamond_axe")); - REGISTRY.a(280, "stick", (new Item()).q().c("stick").a(CreativeModeTab.l).f("stick")); - REGISTRY.a(281, "bowl", (new Item()).c("bowl").a(CreativeModeTab.l).f("bowl")); - REGISTRY.a(282, "mushroom_stew", (new ItemSoup(6)).c("mushroomStew").f("mushroom_stew")); - REGISTRY.a(283, "golden_sword", (new ItemSword(EnumToolMaterial.GOLD)).c("swordGold").f("gold_sword")); - REGISTRY.a(284, "golden_shovel", (new ItemSpade(EnumToolMaterial.GOLD)).c("shovelGold").f("gold_shovel")); - REGISTRY.a(285, "golden_pickaxe", (new ItemPickaxe(EnumToolMaterial.GOLD)).c("pickaxeGold").f("gold_pickaxe")); - REGISTRY.a(286, "golden_axe", (new ItemAxe(EnumToolMaterial.GOLD)).c("hatchetGold").f("gold_axe")); - REGISTRY.a(287, "string", (new ItemReed(Blocks.TRIPWIRE)).c("string").a(CreativeModeTab.l).f("string")); - REGISTRY.a(288, "feather", (new Item()).c("feather").a(CreativeModeTab.l).f("feather")); - REGISTRY.a(289, "gunpowder", (new Item()).c("sulphur").e(PotionBrewer.k).a(CreativeModeTab.l).f("gunpowder")); - REGISTRY.a(290, "wooden_hoe", (new ItemHoe(EnumToolMaterial.WOOD)).c("hoeWood").f("wood_hoe")); - REGISTRY.a(291, "stone_hoe", (new ItemHoe(EnumToolMaterial.STONE)).c("hoeStone").f("stone_hoe")); - REGISTRY.a(292, "iron_hoe", (new ItemHoe(EnumToolMaterial.IRON)).c("hoeIron").f("iron_hoe")); - REGISTRY.a(293, "diamond_hoe", (new ItemHoe(EnumToolMaterial.DIAMOND)).c("hoeDiamond").f("diamond_hoe")); - REGISTRY.a(294, "golden_hoe", (new ItemHoe(EnumToolMaterial.GOLD)).c("hoeGold").f("gold_hoe")); - REGISTRY.a(295, "wheat_seeds", (new ItemSeeds(Blocks.CROPS, Blocks.SOIL)).c("seeds").f("seeds_wheat")); - REGISTRY.a(296, "wheat", (new Item()).c("wheat").a(CreativeModeTab.l).f("wheat")); - REGISTRY.a(297, "bread", (new ItemFood(5, 0.6F, false)).c("bread").f("bread")); - REGISTRY.a(298, "leather_helmet", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 0)).c("helmetCloth").f("leather_helmet")); - REGISTRY.a(299, "leather_chestplate", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 1)).c("chestplateCloth").f("leather_chestplate")); - REGISTRY.a(300, "leather_leggings", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 2)).c("leggingsCloth").f("leather_leggings")); - REGISTRY.a(301, "leather_boots", (new ItemArmor(EnumArmorMaterial.CLOTH, 0, 3)).c("bootsCloth").f("leather_boots")); - REGISTRY.a(302, "chainmail_helmet", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 0)).c("helmetChain").f("chainmail_helmet")); - REGISTRY.a(303, "chainmail_chestplate", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 1)).c("chestplateChain").f("chainmail_chestplate")); - REGISTRY.a(304, "chainmail_leggings", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 2)).c("leggingsChain").f("chainmail_leggings")); - REGISTRY.a(305, "chainmail_boots", (new ItemArmor(EnumArmorMaterial.CHAIN, 1, 3)).c("bootsChain").f("chainmail_boots")); - REGISTRY.a(306, "iron_helmet", (new ItemArmor(EnumArmorMaterial.IRON, 2, 0)).c("helmetIron").f("iron_helmet")); - REGISTRY.a(307, "iron_chestplate", (new ItemArmor(EnumArmorMaterial.IRON, 2, 1)).c("chestplateIron").f("iron_chestplate")); - REGISTRY.a(308, "iron_leggings", (new ItemArmor(EnumArmorMaterial.IRON, 2, 2)).c("leggingsIron").f("iron_leggings")); - REGISTRY.a(309, "iron_boots", (new ItemArmor(EnumArmorMaterial.IRON, 2, 3)).c("bootsIron").f("iron_boots")); - REGISTRY.a(310, "diamond_helmet", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 0)).c("helmetDiamond").f("diamond_helmet")); - REGISTRY.a(311, "diamond_chestplate", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 1)).c("chestplateDiamond").f("diamond_chestplate")); - REGISTRY.a(312, "diamond_leggings", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 2)).c("leggingsDiamond").f("diamond_leggings")); - REGISTRY.a(313, "diamond_boots", (new ItemArmor(EnumArmorMaterial.DIAMOND, 3, 3)).c("bootsDiamond").f("diamond_boots")); - REGISTRY.a(314, "golden_helmet", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 0)).c("helmetGold").f("gold_helmet")); - REGISTRY.a(315, "golden_chestplate", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 1)).c("chestplateGold").f("gold_chestplate")); - REGISTRY.a(316, "golden_leggings", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 2)).c("leggingsGold").f("gold_leggings")); - REGISTRY.a(317, "golden_boots", (new ItemArmor(EnumArmorMaterial.GOLD, 4, 3)).c("bootsGold").f("gold_boots")); - REGISTRY.a(318, "flint", (new Item()).c("flint").a(CreativeModeTab.l).f("flint")); - REGISTRY.a(319, "porkchop", (new ItemFood(3, 0.3F, true)).c("porkchopRaw").f("porkchop_raw")); - REGISTRY.a(320, "cooked_porkchop", (new ItemFood(8, 0.8F, true)).c("porkchopCooked").f("porkchop_cooked")); - REGISTRY.a(321, "painting", (new ItemHanging(EntityPainting.class)).c("painting").f("painting")); - REGISTRY.a(322, "golden_apple", (new ItemGoldenApple(4, 1.2F, false)).j().a(MobEffectList.REGENERATION.id, 5, 1, 1.0F).c("appleGold").f("apple_golden")); - REGISTRY.a(323, "sign", (new ItemSign()).c("sign").f("sign")); - REGISTRY.a(324, "wooden_door", (new ItemDoor(Material.WOOD)).c("doorWood").f("door_wood")); - Item item = (new ItemBucket(Blocks.AIR)).c("bucket").e(16).f("bucket_empty"); - - REGISTRY.a(325, "bucket", item); - REGISTRY.a(326, "water_bucket", (new ItemBucket(Blocks.WATER)).c("bucketWater").c(item).f("bucket_water")); - REGISTRY.a(327, "lava_bucket", (new ItemBucket(Blocks.LAVA)).c("bucketLava").c(item).f("bucket_lava")); - REGISTRY.a(328, "minecart", (new ItemMinecart(0)).c("minecart").f("minecart_normal")); - REGISTRY.a(329, "saddle", (new ItemSaddle()).c("saddle").f("saddle")); - REGISTRY.a(330, "iron_door", (new ItemDoor(Material.ORE)).c("doorIron").f("door_iron")); - REGISTRY.a(331, "redstone", (new ItemRedstone()).c("redstone").e(PotionBrewer.i).f("redstone_dust")); - REGISTRY.a(332, "snowball", (new ItemSnowball()).c("snowball").f("snowball")); - REGISTRY.a(333, "boat", (new ItemBoat()).c("boat").f("boat")); - REGISTRY.a(334, "leather", (new Item()).c("leather").a(CreativeModeTab.l).f("leather")); - REGISTRY.a(335, "milk_bucket", (new ItemMilkBucket()).c("milk").c(item).f("bucket_milk")); - REGISTRY.a(336, "brick", (new Item()).c("brick").a(CreativeModeTab.l).f("brick")); - REGISTRY.a(337, "clay_ball", (new Item()).c("clay").a(CreativeModeTab.l).f("clay_ball")); - REGISTRY.a(338, "reeds", (new ItemReed(Blocks.SUGAR_CANE_BLOCK)).c("reeds").a(CreativeModeTab.l).f("reeds")); - REGISTRY.a(339, "paper", (new Item()).c("paper").a(CreativeModeTab.f).f("paper")); - REGISTRY.a(340, "book", (new ItemBook()).c("book").a(CreativeModeTab.f).f("book_normal")); - REGISTRY.a(341, "slime_ball", (new Item()).c("slimeball").a(CreativeModeTab.f).f("slimeball")); - REGISTRY.a(342, "chest_minecart", (new ItemMinecart(1)).c("minecartChest").f("minecart_chest")); - REGISTRY.a(343, "furnace_minecart", (new ItemMinecart(2)).c("minecartFurnace").f("minecart_furnace")); - REGISTRY.a(344, "egg", (new ItemEgg()).c("egg").f("egg")); - REGISTRY.a(345, "compass", (new Item()).c("compass").a(CreativeModeTab.i).f("compass")); - REGISTRY.a(346, "fishing_rod", (new ItemFishingRod()).c("fishingRod").f("fishing_rod")); - REGISTRY.a(347, "clock", (new Item()).c("clock").a(CreativeModeTab.i).f("clock")); - REGISTRY.a(348, "glowstone_dust", (new Item()).c("yellowDust").e(PotionBrewer.j).a(CreativeModeTab.l).f("glowstone_dust")); - REGISTRY.a(349, "fish", (new ItemFish(false)).c("fish").f("fish_raw").a(true)); - REGISTRY.a(350, "cooked_fished", (new ItemFish(true)).c("fish").f("fish_cooked").a(true)); - REGISTRY.a(351, "dye", (new ItemDye()).c("dyePowder").f("dye_powder")); - REGISTRY.a(352, "bone", (new Item()).c("bone").q().a(CreativeModeTab.f).f("bone")); - REGISTRY.a(353, "sugar", (new Item()).c("sugar").e(PotionBrewer.b).a(CreativeModeTab.l).f("sugar")); - REGISTRY.a(354, "cake", (new ItemReed(Blocks.CAKE_BLOCK)).e(1).c("cake").a(CreativeModeTab.h).f("cake")); - REGISTRY.a(355, "bed", (new ItemBed()).e(1).c("bed").f("bed")); - REGISTRY.a(356, "repeater", (new ItemReed(Blocks.DIODE_OFF)).c("diode").a(CreativeModeTab.d).f("repeater")); - REGISTRY.a(357, "cookie", (new ItemFood(2, 0.1F, false)).c("cookie").f("cookie")); - REGISTRY.a(358, "filled_map", (new ItemWorldMap()).c("map").f("map_filled")); - REGISTRY.a(359, "shears", (new ItemShears()).c("shears").f("shears")); - REGISTRY.a(360, "melon", (new ItemFood(2, 0.3F, false)).c("melon").f("melon")); - REGISTRY.a(361, "pumpkin_seeds", (new ItemSeeds(Blocks.PUMPKIN_STEM, Blocks.SOIL)).c("seeds_pumpkin").f("seeds_pumpkin")); - REGISTRY.a(362, "melon_seeds", (new ItemSeeds(Blocks.MELON_STEM, Blocks.SOIL)).c("seeds_melon").f("seeds_melon")); - REGISTRY.a(363, "beef", (new ItemFood(3, 0.3F, true)).c("beefRaw").f("beef_raw")); - REGISTRY.a(364, "cooked_beef", (new ItemFood(8, 0.8F, true)).c("beefCooked").f("beef_cooked")); - REGISTRY.a(365, "chicken", (new ItemFood(2, 0.3F, true)).a(MobEffectList.HUNGER.id, 30, 0, 0.3F).c("chickenRaw").f("chicken_raw")); - REGISTRY.a(366, "cooked_chicken", (new ItemFood(6, 0.6F, true)).c("chickenCooked").f("chicken_cooked")); - REGISTRY.a(367, "rotten_flesh", (new ItemFood(4, 0.1F, true)).a(MobEffectList.HUNGER.id, 30, 0, 0.8F).c("rottenFlesh").f("rotten_flesh")); - REGISTRY.a(368, "ender_pearl", (new ItemEnderPearl()).c("enderPearl").f("ender_pearl")); - REGISTRY.a(369, "blaze_rod", (new Item()).c("blazeRod").a(CreativeModeTab.l).f("blaze_rod")); - REGISTRY.a(370, "ghast_tear", (new Item()).c("ghastTear").e(PotionBrewer.c).a(CreativeModeTab.k).f("ghast_tear")); - REGISTRY.a(371, "gold_nugget", (new Item()).c("goldNugget").a(CreativeModeTab.l).f("gold_nugget")); - REGISTRY.a(372, "nether_wart", (new ItemSeeds(Blocks.NETHER_WART, Blocks.SOUL_SAND)).c("netherStalkSeeds").e("+4").f("nether_wart")); - REGISTRY.a(373, "potion", (new ItemPotion()).c("potion").f("potion")); - REGISTRY.a(374, "glass_bottle", (new ItemGlassBottle()).c("glassBottle").f("potion_bottle_empty")); - REGISTRY.a(375, "spider_eye", (new ItemFood(2, 0.8F, false)).a(MobEffectList.POISON.id, 5, 0, 1.0F).c("spiderEye").e(PotionBrewer.d).f("spider_eye")); - REGISTRY.a(376, "fermented_spider_eye", (new Item()).c("fermentedSpiderEye").e(PotionBrewer.e).a(CreativeModeTab.k).f("spider_eye_fermented")); - REGISTRY.a(377, "blaze_powder", (new Item()).c("blazePowder").e(PotionBrewer.g).a(CreativeModeTab.k).f("blaze_powder")); - REGISTRY.a(378, "magma_cream", (new Item()).c("magmaCream").e(PotionBrewer.h).a(CreativeModeTab.k).f("magma_cream")); - REGISTRY.a(379, "brewing_stand", (new ItemReed(Blocks.BREWING_STAND)).c("brewingStand").a(CreativeModeTab.k).f("brewing_stand")); - REGISTRY.a(380, "cauldron", (new ItemReed(Blocks.CAULDRON)).c("cauldron").a(CreativeModeTab.k).f("cauldron")); - REGISTRY.a(381, "ender_eye", (new ItemEnderEye()).c("eyeOfEnder").f("ender_eye")); - REGISTRY.a(382, "speckled_melon", (new Item()).c("speckledMelon").e(PotionBrewer.f).a(CreativeModeTab.k).f("melon_speckled")); - REGISTRY.a(383, "spawn_egg", (new ItemMonsterEgg()).c("monsterPlacer").f("spawn_egg")); - REGISTRY.a(384, "experience_bottle", (new ItemExpBottle()).c("expBottle").f("experience_bottle")); - REGISTRY.a(385, "fire_charge", (new ItemFireball()).c("fireball").f("fireball")); - REGISTRY.a(386, "writable_book", (new ItemBookAndQuill()).c("writingBook").a(CreativeModeTab.f).f("book_writable")); - REGISTRY.a(387, "written_book", (new ItemWrittenBook()).c("writtenBook").f("book_written").e(16)); - REGISTRY.a(388, "emerald", (new Item()).c("emerald").a(CreativeModeTab.l).f("emerald")); - REGISTRY.a(389, "item_frame", (new ItemHanging(EntityItemFrame.class)).c("frame").f("item_frame")); - REGISTRY.a(390, "flower_pot", (new ItemReed(Blocks.FLOWER_POT)).c("flowerPot").a(CreativeModeTab.c).f("flower_pot")); - REGISTRY.a(391, "carrot", (new ItemSeedFood(4, 0.6F, Blocks.CARROTS, Blocks.SOIL)).c("carrots").f("carrot")); - REGISTRY.a(392, "potato", (new ItemSeedFood(1, 0.3F, Blocks.POTATOES, Blocks.SOIL)).c("potato").f("potato")); - REGISTRY.a(393, "baked_potato", (new ItemFood(6, 0.6F, false)).c("potatoBaked").f("potato_baked")); - REGISTRY.a(394, "poisonous_potato", (new ItemFood(2, 0.3F, false)).a(MobEffectList.POISON.id, 5, 0, 0.6F).c("potatoPoisonous").f("potato_poisonous")); - REGISTRY.a(395, "map", (new ItemMapEmpty()).c("emptyMap").f("map_empty")); - REGISTRY.a(396, "golden_carrot", (new ItemFood(6, 1.2F, false)).c("carrotGolden").e(PotionBrewer.l).f("carrot_golden")); - REGISTRY.a(397, "skull", (new ItemSkull()).c("skull").f("skull")); - REGISTRY.a(398, "carrot_on_a_stick", (new ItemCarrotStick()).c("carrotOnAStick").f("carrot_on_a_stick")); - REGISTRY.a(399, "nether_star", (new ItemNetherStar()).c("netherStar").a(CreativeModeTab.l).f("nether_star")); - REGISTRY.a(400, "pumpkin_pie", (new ItemFood(8, 0.3F, false)).c("pumpkinPie").a(CreativeModeTab.h).f("pumpkin_pie")); - REGISTRY.a(401, "fireworks", (new ItemFireworks()).c("fireworks").f("fireworks")); - REGISTRY.a(402, "firework_charge", (new ItemFireworksCharge()).c("fireworksCharge").a(CreativeModeTab.f).f("fireworks_charge")); - REGISTRY.a(403, "enchanted_book", (new ItemEnchantedBook()).e(1).c("enchantedBook").f("book_enchanted")); - REGISTRY.a(404, "comparator", (new ItemReed(Blocks.REDSTONE_COMPARATOR_OFF)).c("comparator").a(CreativeModeTab.d).f("comparator")); - REGISTRY.a(405, "netherbrick", (new Item()).c("netherbrick").a(CreativeModeTab.l).f("netherbrick")); - REGISTRY.a(406, "quartz", (new Item()).c("netherquartz").a(CreativeModeTab.l).f("quartz")); - REGISTRY.a(407, "tnt_minecart", (new ItemMinecart(3)).c("minecartTnt").f("minecart_tnt")); - REGISTRY.a(408, "hopper_minecart", (new ItemMinecart(5)).c("minecartHopper").f("minecart_hopper")); - REGISTRY.a(417, "iron_horse_armor", (new Item()).c("horsearmormetal").e(1).a(CreativeModeTab.f).f("iron_horse_armor")); - REGISTRY.a(418, "golden_horse_armor", (new Item()).c("horsearmorgold").e(1).a(CreativeModeTab.f).f("gold_horse_armor")); - REGISTRY.a(419, "diamond_horse_armor", (new Item()).c("horsearmordiamond").e(1).a(CreativeModeTab.f).f("diamond_horse_armor")); - REGISTRY.a(420, "lead", (new ItemLeash()).c("leash").f("lead")); - REGISTRY.a(421, "name_tag", (new ItemNameTag()).c("nameTag").f("name_tag")); - REGISTRY.a(422, "command_block_minecart", (new ItemMinecart(6)).c("minecartCommandBlock").f("minecart_command_block").a((CreativeModeTab) null)); - REGISTRY.a(2256, "record_13", (new ItemRecord("13")).c("record").f("record_13")); - REGISTRY.a(2257, "record_cat", (new ItemRecord("cat")).c("record").f("record_cat")); - REGISTRY.a(2258, "record_blocks", (new ItemRecord("blocks")).c("record").f("record_blocks")); - REGISTRY.a(2259, "record_chirp", (new ItemRecord("chirp")).c("record").f("record_chirp")); - REGISTRY.a(2260, "record_far", (new ItemRecord("far")).c("record").f("record_far")); - REGISTRY.a(2261, "record_mall", (new ItemRecord("mall")).c("record").f("record_mall")); - REGISTRY.a(2262, "record_mellohi", (new ItemRecord("mellohi")).c("record").f("record_mellohi")); - REGISTRY.a(2263, "record_stal", (new ItemRecord("stal")).c("record").f("record_stal")); - REGISTRY.a(2264, "record_strad", (new ItemRecord("strad")).c("record").f("record_strad")); - REGISTRY.a(2265, "record_ward", (new ItemRecord("ward")).c("record").f("record_ward")); - REGISTRY.a(2266, "record_11", (new ItemRecord("11")).c("record").f("record_11")); - REGISTRY.a(2267, "record_wait", (new ItemRecord("wait")).c("record").f("record_wait")); - HashSet hashset = Sets.newHashSet(new Block[] { Blocks.AIR, Blocks.BREWING_STAND, Blocks.BED, Blocks.NETHER_WART, Blocks.CAULDRON, Blocks.FLOWER_POT, Blocks.CROPS, Blocks.SUGAR_CANE_BLOCK, Blocks.CAKE_BLOCK, Blocks.SKULL, Blocks.PISTON_EXTENSION, Blocks.PISTON_MOVING, Blocks.GLOWING_REDSTONE_ORE, Blocks.DIODE_ON, Blocks.PUMPKIN_STEM, Blocks.SIGN_POST, Blocks.REDSTONE_COMPARATOR_ON, Blocks.TRIPWIRE, Blocks.REDSTONE_LAMP_ON, Blocks.MELON_STEM, Blocks.REDSTONE_TORCH_OFF, Blocks.REDSTONE_COMPARATOR_OFF, Blocks.REDSTONE_WIRE, Blocks.WALL_SIGN, Blocks.DIODE_OFF, Blocks.IRON_DOOR_BLOCK, Blocks.WOODEN_DOOR}); - Iterator iterator = Block.REGISTRY.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - Block block = (Block) Block.REGISTRY.get(s); - Object object; - - if (block == Blocks.WOOL) { - object = (new ItemCloth(Blocks.WOOL)).b("cloth"); - } else if (block == Blocks.STAINED_HARDENED_CLAY) { - object = (new ItemCloth(Blocks.STAINED_HARDENED_CLAY)).b("clayHardenedStained"); - } else if (block == Blocks.STAINED_GLASS) { - object = (new ItemCloth(Blocks.STAINED_GLASS)).b("stainedGlass"); - } else if (block == Blocks.STAINED_GLASS_PANE) { - object = (new ItemCloth(Blocks.STAINED_GLASS_PANE)).b("stainedGlassPane"); - } else if (block == Blocks.WOOL_CARPET) { - object = (new ItemCloth(Blocks.WOOL_CARPET)).b("woolCarpet"); - } else if (block == Blocks.DIRT) { - object = (new ItemMultiTexture(Blocks.DIRT, Blocks.DIRT, BlockDirt.a)).b("dirt"); - } else if (block == Blocks.SAND) { - object = (new ItemMultiTexture(Blocks.SAND, Blocks.SAND, BlockSand.a)).b("sand"); - } else if (block == Blocks.LOG) { - object = (new ItemMultiTexture(Blocks.LOG, Blocks.LOG, BlockLog1.M)).b("log"); - } else if (block == Blocks.LOG2) { - object = (new ItemMultiTexture(Blocks.LOG2, Blocks.LOG2, BlockLog2.M)).b("log"); - } else if (block == Blocks.WOOD) { - object = (new ItemMultiTexture(Blocks.WOOD, Blocks.WOOD, BlockWood.a)).b("wood"); - } else if (block == Blocks.MONSTER_EGGS) { - object = (new ItemMultiTexture(Blocks.MONSTER_EGGS, Blocks.MONSTER_EGGS, BlockMonsterEggs.a)).b("monsterStoneEgg"); - } else if (block == Blocks.SMOOTH_BRICK) { - object = (new ItemMultiTexture(Blocks.SMOOTH_BRICK, Blocks.SMOOTH_BRICK, BlockSmoothBrick.a)).b("stonebricksmooth"); - } else if (block == Blocks.SANDSTONE) { - object = (new ItemMultiTexture(Blocks.SANDSTONE, Blocks.SANDSTONE, BlockSandStone.a)).b("sandStone"); - } else if (block == Blocks.QUARTZ_BLOCK) { - object = (new ItemMultiTexture(Blocks.QUARTZ_BLOCK, Blocks.QUARTZ_BLOCK, BlockQuartz.a)).b("quartzBlock"); - } else if (block == Blocks.STEP) { - object = (new ItemStep(Blocks.STEP, Blocks.STEP, Blocks.DOUBLE_STEP, false)).b("stoneSlab"); - } else if (block == Blocks.DOUBLE_STEP) { - object = (new ItemStep(Blocks.DOUBLE_STEP, Blocks.STEP, Blocks.DOUBLE_STEP, true)).b("stoneSlab"); - } else if (block == Blocks.WOOD_STEP) { - object = (new ItemStep(Blocks.WOOD_STEP, Blocks.WOOD_STEP, Blocks.WOOD_DOUBLE_STEP, false)).b("woodSlab"); - } else if (block == Blocks.WOOD_DOUBLE_STEP) { - object = (new ItemStep(Blocks.WOOD_DOUBLE_STEP, Blocks.WOOD_STEP, Blocks.WOOD_DOUBLE_STEP, true)).b("woodSlab"); - } else if (block == Blocks.SAPLING) { - object = (new ItemMultiTexture(Blocks.SAPLING, Blocks.SAPLING, BlockSapling.a)).b("sapling"); - } else if (block == Blocks.LEAVES) { - object = (new ItemLeaves(Blocks.LEAVES)).b("leaves"); - } else if (block == Blocks.LEAVES2) { - object = (new ItemLeaves(Blocks.LEAVES2)).b("leaves"); - } else if (block == Blocks.VINE) { - object = new ItemWithAuxData(Blocks.VINE, false); - } else if (block == Blocks.LONG_GRASS) { - object = (new ItemWithAuxData(Blocks.LONG_GRASS, true)).a(new String[] { "shrub", "grass", "fern"}); - } else if (block == Blocks.YELLOW_FLOWER) { - object = (new ItemMultiTexture(Blocks.YELLOW_FLOWER, Blocks.YELLOW_FLOWER, BlockFlowers.b)).b("flower"); - } else if (block == Blocks.RED_ROSE) { - object = (new ItemMultiTexture(Blocks.RED_ROSE, Blocks.RED_ROSE, BlockFlowers.a)).b("rose"); - } else if (block == Blocks.SNOW) { - object = new ItemSnow(Blocks.SNOW, Blocks.SNOW); - } else if (block == Blocks.WATER_LILY) { - object = new ItemWaterLily(Blocks.WATER_LILY); - } else if (block == Blocks.PISTON) { - object = new ItemPiston(Blocks.PISTON); - } else if (block == Blocks.PISTON_STICKY) { - object = new ItemPiston(Blocks.PISTON_STICKY); - } else if (block == Blocks.COBBLE_WALL) { - object = (new ItemMultiTexture(Blocks.COBBLE_WALL, Blocks.COBBLE_WALL, BlockCobbleWall.a)).b("cobbleWall"); - } else if (block == Blocks.ANVIL) { - object = (new ItemAnvil(Blocks.ANVIL)).b("anvil"); - } else if (block == Blocks.DOUBLE_PLANT) { - object = (new ItemTallPlant(Blocks.DOUBLE_PLANT, Blocks.DOUBLE_PLANT, BlockTallPlant.a)).b("doublePlant"); - // CraftBukkit start - allow certain blocks to retain data - } else if (block == Blocks.MOB_SPAWNER || block == Blocks.BIG_MUSHROOM_1 || block == Blocks.BIG_MUSHROOM_2) { - object = new ItemWithAuxData(block, true); - // CraftBukkit end - } else { - if (hashset.contains(block)) { - continue; - } - - object = new ItemBlock(block); - } - - REGISTRY.a(Block.getId(block), s, object); - } - } - - public Item e(int i) { - this.maxStackSize = i; - return this; - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - return false; - } - - public float getDestroySpeed(ItemStack itemstack, Block block) { - return 1.0F; - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - return itemstack; - } - - public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) { - return itemstack; - } - - public int getMaxStackSize() { - return this.maxStackSize; - } - - public int filterData(int i) { - return 0; - } - - public boolean n() { - return this.j; - } - - protected Item a(boolean flag) { - this.j = flag; - return this; - } - - public int getMaxDurability() { - return this.durability; - } - - protected Item setMaxDurability(int i) { - this.durability = i; - return this; - } - - public boolean usesDurability() { - return this.durability > 0 && !this.j; - } - - public boolean a(ItemStack itemstack, EntityLiving entityliving, EntityLiving entityliving1) { - return false; - } - - public boolean a(ItemStack itemstack, World world, Block block, int i, int j, int k, EntityLiving entityliving) { - return false; - } - - public boolean canDestroySpecialBlock(Block block) { - return false; - } - - public boolean a(ItemStack itemstack, EntityHuman entityhuman, EntityLiving entityliving) { - return false; - } - - public Item q() { - this.i = true; - return this; - } - - public Item c(String s) { - this.name = s; - return this; - } - - public String k(ItemStack itemstack) { - String s = this.a(itemstack); - - return s == null ? "" : LocaleI18n.get(s); - } - - public String getName() { - return "item." + this.name; - } - - public String a(ItemStack itemstack) { - return "item." + this.name; - } - - public Item c(Item item) { - this.craftingResult = item; - return this; - } - - public boolean l(ItemStack itemstack) { - return true; - } - - public boolean s() { - return true; - } - - public Item t() { - return this.craftingResult; - } - - public boolean u() { - return this.craftingResult != null; - } - - public void a(ItemStack itemstack, World world, Entity entity, int i, boolean flag) {} - - public void d(ItemStack itemstack, World world, EntityHuman entityhuman) {} - - public boolean h() { - return false; - } - - public EnumAnimation d(ItemStack itemstack) { - return EnumAnimation.NONE; - } - - public int d_(ItemStack itemstack) { - return 0; - } - - public void a(ItemStack itemstack, World world, EntityHuman entityhuman, int i) {} - - protected Item e(String s) { - this.d = s; - return this; - } - - public String i(ItemStack itemstack) { - return this.d; - } - - public boolean m(ItemStack itemstack) { - return this.i(itemstack) != null; - } - - public String n(ItemStack itemstack) { - return ("" + LocaleI18n.get(this.k(itemstack) + ".name")).trim(); - } - - public EnumItemRarity f(ItemStack itemstack) { - return itemstack.hasEnchantments() ? EnumItemRarity.RARE : EnumItemRarity.COMMON; - } - - public boolean e_(ItemStack itemstack) { - return this.getMaxStackSize() == 1 && this.usesDurability(); - } - - protected MovingObjectPosition a(World world, EntityHuman entityhuman, boolean flag) { - float f = 1.0F; - float f1 = entityhuman.lastPitch + (entityhuman.pitch - entityhuman.lastPitch) * f; - float f2 = entityhuman.lastYaw + (entityhuman.yaw - entityhuman.lastYaw) * f; - double d0 = entityhuman.lastX + (entityhuman.locX - entityhuman.lastX) * (double) f; - double d1 = entityhuman.lastY + (entityhuman.locY - entityhuman.lastY) * (double) f + 1.62D - (double) entityhuman.height; - double d2 = entityhuman.lastZ + (entityhuman.locZ - entityhuman.lastZ) * (double) f; - Vec3D vec3d = Vec3D.a(d0, d1, d2); - float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - float f7 = f4 * f5; - float f8 = f3 * f5; - double d3 = 5.0D; - Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); - - return world.rayTrace(vec3d, vec3d1, flag, !flag, false); - } - - public int c() { - return 0; - } - - public Item a(CreativeModeTab creativemodetab) { - this.a = creativemodetab; - return this; - } - - public boolean v() { - return true; - } - - public boolean a(ItemStack itemstack, ItemStack itemstack1) { - return false; - } - - public Multimap k() { - return HashMultimap.create(); - } - - protected Item f(String s) { - this.l = s; - return this; - } -} diff --git a/src/main/java/net/minecraft/server/ItemBoat.java b/src/main/java/net/minecraft/server/ItemBoat.java deleted file mode 100644 index e044b03d..00000000 --- a/src/main/java/net/minecraft/server/ItemBoat.java +++ /dev/null @@ -1,93 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -public class ItemBoat extends Item { - - public ItemBoat() { - this.maxStackSize = 1; - this.a(CreativeModeTab.e); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - float f = 1.0F; - float f1 = entityhuman.lastPitch + (entityhuman.pitch - entityhuman.lastPitch) * f; - float f2 = entityhuman.lastYaw + (entityhuman.yaw - entityhuman.lastYaw) * f; - double d0 = entityhuman.lastX + (entityhuman.locX - entityhuman.lastX) * (double) f; - double d1 = entityhuman.lastY + (entityhuman.locY - entityhuman.lastY) * (double) f + 1.62D - (double) entityhuman.height; - double d2 = entityhuman.lastZ + (entityhuman.locZ - entityhuman.lastZ) * (double) f; - Vec3D vec3d = Vec3D.a(d0, d1, d2); - float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - float f7 = f4 * f5; - float f8 = f3 * f5; - double d3 = 5.0D; - Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); - MovingObjectPosition movingobjectposition = world.rayTrace(vec3d, vec3d1, true); - - if (movingobjectposition == null) { - return itemstack; - } else { - Vec3D vec3d2 = entityhuman.j(f); - boolean flag = false; - float f9 = 1.0F; - List list = world.getEntities(entityhuman, entityhuman.boundingBox.a(vec3d2.a * d3, vec3d2.b * d3, vec3d2.c * d3).grow((double) f9, (double) f9, (double) f9)); - - int i; - - for (i = 0; i < list.size(); ++i) { - Entity entity = (Entity) list.get(i); - - if (entity.R()) { - float f10 = entity.af(); - AxisAlignedBB axisalignedbb = entity.boundingBox.grow((double) f10, (double) f10, (double) f10); - - if (axisalignedbb.a(vec3d)) { - flag = true; - } - } - } - - if (flag) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - // CraftBukkit start - Boat placement - org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, i, j, k, movingobjectposition.face, itemstack); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - - if (world.getType(i, j, k) == Blocks.SNOW) { - --j; - } - - EntityBoat entityboat = new EntityBoat(world, (double) ((float) i + 0.5F), (double) ((float) j + 1.0F), (double) ((float) k + 0.5F)); - - entityboat.yaw = (float) (((MathHelper.floor((double) (entityhuman.yaw * 4.0F / 360.0F) + 0.5D) & 3) - 1) * 90); - if (!world.getCubes(entityboat, entityboat.boundingBox.grow(-0.1D, -0.1D, -0.1D)).isEmpty()) { - return itemstack; - } - - if (!world.isStatic) { - world.addEntity(entityboat); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - - return itemstack; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemBow.java b/src/main/java/net/minecraft/server/ItemBow.java deleted file mode 100644 index a1bf31af..00000000 --- a/src/main/java/net/minecraft/server/ItemBow.java +++ /dev/null @@ -1,109 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityCombustEvent; // CraftBukkit - -public class ItemBow extends Item { - - public static final String[] a = new String[] { "pulling_0", "pulling_1", "pulling_2"}; - - public ItemBow() { - this.maxStackSize = 1; - this.setMaxDurability(384); - this.a(CreativeModeTab.j); - } - - public void a(ItemStack itemstack, World world, EntityHuman entityhuman, int i) { - boolean flag = entityhuman.abilities.canInstantlyBuild || EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_INFINITE.id, itemstack) > 0; - - if (flag || entityhuman.inventory.b(Items.ARROW)) { - int j = this.d_(itemstack) - i; - float f = (float) j / 20.0F; - - f = (f * f + f * 2.0F) / 3.0F; - if ((double) f < 0.1D) { - return; - } - - if (f > 1.0F) { - f = 1.0F; - } - - EntityArrow entityarrow = new EntityArrow(world, entityhuman, f * 2.0F); - - if (f == 1.0F) { - entityarrow.setCritical(true); - } - - int k = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_DAMAGE.id, itemstack); - - if (k > 0) { - entityarrow.b(entityarrow.e() + (double) k * 0.5D + 0.5D); - } - - int l = EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_KNOCKBACK.id, itemstack); - - if (l > 0) { - entityarrow.setKnockbackStrength(l); - } - - if (EnchantmentManager.getEnchantmentLevel(Enchantment.ARROW_FIRE.id, itemstack) > 0) { - // CraftBukkit start - call EntityCombustEvent - EntityCombustEvent event = new EntityCombustEvent(entityarrow.getBukkitEntity(), 100); - entityarrow.world.getServer().getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - entityarrow.setOnFire(event.getDuration()); - } - // CraftBukkit end - } - - // CraftBukkit start - org.bukkit.event.entity.EntityShootBowEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityShootBowEvent(entityhuman, itemstack, entityarrow, f); - if (event.isCancelled()) { - event.getProjectile().remove(); - return; - } - - if (event.getProjectile() == entityarrow.getBukkitEntity()) { - world.addEntity(entityarrow); - } - // CraftBukkit end - - itemstack.damage(1, entityhuman); - world.makeSound(entityhuman, "random.bow", 1.0F, 1.0F / (g.nextFloat() * 0.4F + 1.2F) + f * 0.5F); - if (flag) { - entityarrow.fromPlayer = 2; - } else { - entityhuman.inventory.a(Items.ARROW); - } - - if (!world.isStatic) { - // world.addEntity(entityarrow); // CraftBukkit - moved up - } - } - } - - public ItemStack b(ItemStack itemstack, World world, EntityHuman entityhuman) { - return itemstack; - } - - public int d_(ItemStack itemstack) { - return 72000; - } - - public EnumAnimation d(ItemStack itemstack) { - return EnumAnimation.BOW; - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (entityhuman.abilities.canInstantlyBuild || entityhuman.inventory.b(Items.ARROW)) { - entityhuman.a(itemstack, this.d_(itemstack)); - } - - return itemstack; - } - - public int c() { - return 1; - } -} diff --git a/src/main/java/net/minecraft/server/ItemBucket.java b/src/main/java/net/minecraft/server/ItemBucket.java deleted file mode 100644 index a58d4e73..00000000 --- a/src/main/java/net/minecraft/server/ItemBucket.java +++ /dev/null @@ -1,171 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.event.player.PlayerBucketEmptyEvent; -import org.bukkit.event.player.PlayerBucketFillEvent; -// CraftBukkit end - -public class ItemBucket extends Item { - - private Block a; - - public ItemBucket(Block block) { - this.maxStackSize = 1; - this.a = block; - this.a(CreativeModeTab.f); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - boolean flag = this.a == Blocks.AIR; - MovingObjectPosition movingobjectposition = this.a(world, entityhuman, flag); - - if (movingobjectposition == null) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - if (!world.a(entityhuman, i, j, k)) { - return itemstack; - } - - if (flag) { - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - Material material = world.getType(i, j, k).getMaterial(); - int l = world.getData(i, j, k); - - if (material == Material.WATER && l == 0) { - // CraftBukkit start - PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, Items.WATER_BUCKET); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - world.setAir(i, j, k); - return this.a(itemstack, entityhuman, Items.WATER_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack - } - - if (material == Material.LAVA && l == 0) { - // CraftBukkit start - PlayerBucketFillEvent event = CraftEventFactory.callPlayerBucketFillEvent(entityhuman, i, j, k, -1, itemstack, Items.LAVA_BUCKET); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - world.setAir(i, j, k); - return this.a(itemstack, entityhuman, Items.LAVA_BUCKET, event.getItemStack()); // CraftBukkit - added Event stack - } - } else { - if (this.a == Blocks.AIR) { - // CraftBukkit start - PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, i, j, k, movingobjectposition.face, itemstack); - - if (event.isCancelled()) { - return itemstack; - } - - return CraftItemStack.asNMSCopy(event.getItemStack()); - } - - int clickedX = i, clickedY = j, clickedZ = k; - // CraftBukkit end - - if (movingobjectposition.face == 0) { - --j; - } - - if (movingobjectposition.face == 1) { - ++j; - } - - if (movingobjectposition.face == 2) { - --k; - } - - if (movingobjectposition.face == 3) { - ++k; - } - - if (movingobjectposition.face == 4) { - --i; - } - - if (movingobjectposition.face == 5) { - ++i; - } - - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - // CraftBukkit start - PlayerBucketEmptyEvent event = CraftEventFactory.callPlayerBucketEmptyEvent(entityhuman, clickedX, clickedY, clickedZ, movingobjectposition.face, itemstack); - - if (event.isCancelled()) { - return itemstack; - } - // CraftBukkit end - - if (this.a(world, i, j, k) && !entityhuman.abilities.canInstantlyBuild) { - return CraftItemStack.asNMSCopy(event.getItemStack()); // CraftBukkit - } - } - } - - return itemstack; - } - } - - // CraftBukkit - added ob.ItemStack result - TODO: Is this... the right way to handle this? - private ItemStack a(ItemStack itemstack, EntityHuman entityhuman, Item item, org.bukkit.inventory.ItemStack result) { - if (entityhuman.abilities.canInstantlyBuild) { - return itemstack; - } else if (--itemstack.count <= 0) { - return CraftItemStack.asNMSCopy(result); // CraftBukkit - } else { - if (!entityhuman.inventory.pickup(CraftItemStack.asNMSCopy(result))) { // CraftBukkit - entityhuman.drop(CraftItemStack.asNMSCopy(result), false); // CraftBukkit - } - - return itemstack; - } - } - - public boolean a(World world, int i, int j, int k) { - if (this.a == Blocks.AIR) { - return false; - } else { - Material material = world.getType(i, j, k).getMaterial(); - boolean flag = !material.isBuildable(); - - if (!world.isEmpty(i, j, k) && !flag) { - return false; - } else { - if (world.worldProvider.f && this.a == Blocks.WATER) { - world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), "random.fizz", 0.5F, 2.6F + (world.random.nextFloat() - world.random.nextFloat()) * 0.8F); - - for (int l = 0; l < 8; ++l) { - world.addParticle("largesmoke", (double) i + Math.random(), (double) j + Math.random(), (double) k + Math.random(), 0.0D, 0.0D, 0.0D); - } - } else { - if (!world.isStatic && flag && !material.isLiquid()) { - world.setAir(i, j, k, true); - } - - world.setTypeAndData(i, j, k, this.a, 0, 3); - } - - return true; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemDye.java b/src/main/java/net/minecraft/server/ItemDye.java deleted file mode 100644 index 156af8e3..00000000 --- a/src/main/java/net/minecraft/server/ItemDye.java +++ /dev/null @@ -1,129 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.SheepDyeWoolEvent; // CraftBukkit - -public class ItemDye extends Item { - - public static final String[] a = new String[] { "black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "lightBlue", "magenta", "orange", "white"}; - public static final String[] b = new String[] { "black", "red", "green", "brown", "blue", "purple", "cyan", "silver", "gray", "pink", "lime", "yellow", "light_blue", "magenta", "orange", "white"}; - public static final int[] c = new int[] { 1973019, 11743532, 3887386, 5320730, 2437522, 8073150, 2651799, 11250603, 4408131, 14188952, 4312372, 14602026, 6719955, 12801229, 15435844, 15790320}; - - public ItemDye() { - this.a(true); - this.setMaxDurability(0); - this.a(CreativeModeTab.l); - } - - public String a(ItemStack itemstack) { - int i = MathHelper.a(itemstack.getData(), 0, 15); - - return super.getName() + "." + a[i]; - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (itemstack.getData() == 15) { - if (a(itemstack, world, i, j, k)) { - if (!world.isStatic) { - world.triggerEffect(2005, i, j, k, 0); - } - - return true; - } - } else if (itemstack.getData() == 3) { - Block block = world.getType(i, j, k); - int i1 = world.getData(i, j, k); - - if (block == Blocks.LOG && BlockLogAbstract.c(i1) == 3) { - if (l == 0) { - return false; - } - - if (l == 1) { - return false; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (world.isEmpty(i, j, k)) { - int j1 = Blocks.COCOA.getPlacedData(world, i, j, k, l, f, f1, f2, 0); - - world.setTypeAndData(i, j, k, Blocks.COCOA, j1, 2); - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - - return true; - } - } - - return false; - } - } - - public static boolean a(ItemStack itemstack, World world, int i, int j, int k) { - Block block = world.getType(i, j, k); - - if (block instanceof IBlockFragilePlantElement) { - IBlockFragilePlantElement iblockfragileplantelement = (IBlockFragilePlantElement) block; - - if (iblockfragileplantelement.a(world, i, j, k, world.isStatic)) { - if (!world.isStatic) { - if (iblockfragileplantelement.a(world, world.random, i, j, k)) { - iblockfragileplantelement.b(world, world.random, i, j, k); - } - - --itemstack.count; - } - - return true; - } - } - - return false; - } - - public boolean a(ItemStack itemstack, EntityHuman entityhuman, EntityLiving entityliving) { - if (entityliving instanceof EntitySheep) { - EntitySheep entitysheep = (EntitySheep) entityliving; - int i = BlockCloth.b(itemstack.getData()); - - if (!entitysheep.isSheared() && entitysheep.getColor() != i) { - // CraftBukkit start - byte bColor = (byte) i; - SheepDyeWoolEvent event = new SheepDyeWoolEvent((org.bukkit.entity.Sheep) entitysheep.getBukkitEntity(), org.bukkit.DyeColor.getByData(bColor)); - entitysheep.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - - i = (byte) event.getColor().getWoolData(); - // CraftBukkit end - entitysheep.setColor(i); - --itemstack.count; - } - - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemFireball.java b/src/main/java/net/minecraft/server/ItemFireball.java deleted file mode 100644 index 0a3bf131..00000000 --- a/src/main/java/net/minecraft/server/ItemFireball.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -// CraftBukkit end - -public class ItemFireball extends Item { - - public ItemFireball() { - this.a(CreativeModeTab.f); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (world.isStatic) { - return true; - } else { - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (world.getType(i, j, k).getMaterial() == Material.AIR) { - // CraftBukkit start - fire BlockIgniteEvent - if (org.bukkit.craftbukkit.event.CraftEventFactory.callBlockIgniteEvent(world, i, j, k, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FIREBALL, entityhuman).isCancelled()) { - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - return false; - } - // CraftBukkit end - - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F); - world.setTypeUpdate(i, j, k, Blocks.FIRE); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - - return true; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemFishingRod.java b/src/main/java/net/minecraft/server/ItemFishingRod.java deleted file mode 100644 index 2f34151b..00000000 --- a/src/main/java/net/minecraft/server/ItemFishingRod.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.player.PlayerFishEvent; // CraftBukkit - -public class ItemFishingRod extends Item { - - public ItemFishingRod() { - this.setMaxDurability(64); - this.e(1); - this.a(CreativeModeTab.i); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (entityhuman.hookedFish != null) { - int i = entityhuman.hookedFish.e(); - - itemstack.damage(i, entityhuman); - entityhuman.ba(); - } else { - // CraftBukkit start - EntityFishingHook hook = new EntityFishingHook(world, entityhuman); - PlayerFishEvent playerFishEvent = new PlayerFishEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), null, (org.bukkit.entity.Fish) hook.getBukkitEntity(), PlayerFishEvent.State.FISHING); - world.getServer().getPluginManager().callEvent(playerFishEvent); - - if (playerFishEvent.isCancelled()) { - return itemstack; - } - // CraftBukkit end - world.makeSound(entityhuman, "random.bow", 0.5F, 0.4F / (g.nextFloat() * 0.4F + 0.8F)); - if (!world.isStatic) { - world.addEntity(hook); // CraftBukkit - moved creation up - } - - entityhuman.ba(); - } - - return itemstack; - } - - public boolean e_(ItemStack itemstack) { - return super.e_(itemstack); - } - - public int c() { - return 1; - } -} diff --git a/src/main/java/net/minecraft/server/ItemFlintAndSteel.java b/src/main/java/net/minecraft/server/ItemFlintAndSteel.java deleted file mode 100644 index ec2edea5..00000000 --- a/src/main/java/net/minecraft/server/ItemFlintAndSteel.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.event.CraftEventFactory; -// CraftBukkit end - -public class ItemFlintAndSteel extends Item { - - public ItemFlintAndSteel() { - this.maxStackSize = 1; - this.setMaxDurability(64); - this.a(CreativeModeTab.i); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (world.getType(i, j, k).getMaterial() == Material.AIR) { - // CraftBukkit start - Store the clicked block - if (CraftEventFactory.callBlockIgniteEvent(world, i, j, k, org.bukkit.event.block.BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL, entityhuman).isCancelled()) { - itemstack.damage(1, entityhuman); - return false; - } - - CraftBlockState blockState = CraftBlockState.getBlockState(world, i, j, k); - // CraftBukkit end - - world.makeSound((double) i + 0.5D, (double) j + 0.5D, (double) k + 0.5D, "fire.ignite", 1.0F, g.nextFloat() * 0.4F + 0.8F); - world.setTypeUpdate(i, j, k, Blocks.FIRE); - - // CraftBukkit start - org.bukkit.event.block.BlockPlaceEvent placeEvent = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ); - - if (placeEvent.isCancelled() || !placeEvent.canBuild()) { - placeEvent.getBlockPlaced().setTypeIdAndData(0, (byte) 0, false); - return false; - } - // CraftBukkit end - } - - itemstack.damage(1, entityhuman); - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemHanging.java b/src/main/java/net/minecraft/server/ItemHanging.java deleted file mode 100644 index d88d36ac..00000000 --- a/src/main/java/net/minecraft/server/ItemHanging.java +++ /dev/null @@ -1,67 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.event.hanging.HangingPlaceEvent; -import org.bukkit.event.painting.PaintingPlaceEvent; -// CraftBukkit end - -public class ItemHanging extends Item { - - private final Class a; - - public ItemHanging(Class oclass) { - this.a = oclass; - this.a(CreativeModeTab.c); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (l == 0) { - return false; - } else if (l == 1) { - return false; - } else { - int i1 = Direction.e[l]; - EntityHanging entityhanging = this.a(world, i, j, k, i1); - - if (!entityhuman.a(i, j, k, l, itemstack)) { - return false; - } else { - if (entityhanging != null && entityhanging.survives()) { - if (!world.isStatic) { - // CraftBukkit start - fire HangingPlaceEvent - Player who = (entityhuman == null) ? null : (Player) entityhuman.getBukkitEntity(); - org.bukkit.block.Block blockClicked = world.getWorld().getBlockAt(i, j, k); - org.bukkit.block.BlockFace blockFace = org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(l); - - HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); - world.getServer().getPluginManager().callEvent(event); - - PaintingPlaceEvent paintingEvent = null; - if (entityhanging instanceof EntityPainting) { - // Fire old painting event until it can be removed - paintingEvent = new PaintingPlaceEvent((org.bukkit.entity.Painting) entityhanging.getBukkitEntity(), who, blockClicked, blockFace); - paintingEvent.setCancelled(event.isCancelled()); - world.getServer().getPluginManager().callEvent(paintingEvent); - } - - if (event.isCancelled() || (paintingEvent != null && paintingEvent.isCancelled())) { - return false; - } - // CraftBukkit end - - world.addEntity(entityhanging); - } - - --itemstack.count; - } - - return true; - } - } - } - - private EntityHanging a(World world, int i, int j, int k, int l) { - return (EntityHanging) (this.a == EntityPainting.class ? new EntityPainting(world, i, j, k, l) : (this.a == EntityItemFrame.class ? new EntityItemFrame(world, i, j, k, l) : null)); - } -} diff --git a/src/main/java/net/minecraft/server/ItemLeash.java b/src/main/java/net/minecraft/server/ItemLeash.java deleted file mode 100644 index 8655b9f1..00000000 --- a/src/main/java/net/minecraft/server/ItemLeash.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.hanging.HangingPlaceEvent; // CraftBukkit - -public class ItemLeash extends Item { - - public ItemLeash() { - this.a(CreativeModeTab.i); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - Block block = world.getType(i, j, k); - - if (block.b() == 11) { - if (world.isStatic) { - return true; - } else { - a(entityhuman, world, i, j, k); - return true; - } - } else { - return false; - } - } - - public static boolean a(EntityHuman entityhuman, World world, int i, int j, int k) { - EntityLeash entityleash = EntityLeash.b(world, i, j, k); - boolean flag = false; - double d0 = 7.0D; - List list = world.a(EntityInsentient.class, AxisAlignedBB.a((double) i - d0, (double) j - d0, (double) k - d0, (double) i + d0, (double) j + d0, (double) k + d0)); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityInsentient entityinsentient = (EntityInsentient) iterator.next(); - - if (entityinsentient.bN() && entityinsentient.getLeashHolder() == entityhuman) { - if (entityleash == null) { - entityleash = EntityLeash.a(world, i, j, k); - - // CraftBukkit start - fire HangingPlaceEvent - HangingPlaceEvent event = new HangingPlaceEvent((org.bukkit.entity.Hanging) entityleash.getBukkitEntity(), entityhuman != null ? (org.bukkit.entity.Player) entityhuman.getBukkitEntity() : null, world.getWorld().getBlockAt(i, j, k), org.bukkit.block.BlockFace.SELF); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - entityleash.die(); - return false; - } - // CraftBukkit end - } - - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerLeashEntityEvent(entityinsentient, entityleash, entityhuman).isCancelled()) { - continue; - } - // CraftBukkit end - - entityinsentient.setLeashHolder(entityleash, true); - flag = true; - } - } - } - - return flag; - } -} diff --git a/src/main/java/net/minecraft/server/ItemMapEmpty.java b/src/main/java/net/minecraft/server/ItemMapEmpty.java deleted file mode 100644 index 8998a3fe..00000000 --- a/src/main/java/net/minecraft/server/ItemMapEmpty.java +++ /dev/null @@ -1,37 +0,0 @@ -package net.minecraft.server; - -public class ItemMapEmpty extends ItemWorldMapBase { - - protected ItemMapEmpty() { - this.a(CreativeModeTab.f); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world - ItemStack itemstack1 = new ItemStack(Items.MAP, 1, worldMain.b("map")); // CraftBukkit - use primary world for maps - String s = "map_" + itemstack1.getData(); - WorldMap worldmap = new WorldMap(s); - - worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps - worldmap.scale = 0; - int i = 128 * (1 << worldmap.scale); - - worldmap.centerX = (int) (Math.round(entityhuman.locX / (double) i) * (long) i); - worldmap.centerZ = (int) (Math.round(entityhuman.locZ / (double) i) * (long) i); - worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - use bukkit dimension - worldmap.c(); - - org.bukkit.craftbukkit.event.CraftEventFactory.callEvent(new org.bukkit.event.server.MapInitializeEvent(worldmap.mapView)); // CraftBukkit - - --itemstack.count; - if (itemstack.count <= 0) { - return itemstack1; - } else { - if (!entityhuman.inventory.pickup(itemstack1.cloneItemStack())) { - entityhuman.drop(itemstack1, false); - } - - return itemstack; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemMinecart.java b/src/main/java/net/minecraft/server/ItemMinecart.java deleted file mode 100644 index 02a1fd8e..00000000 --- a/src/main/java/net/minecraft/server/ItemMinecart.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.minecraft.server; - -public class ItemMinecart extends Item { - - private static final IDispenseBehavior b = new DispenseBehaviorMinecart(); - public int a; - - public ItemMinecart(int i) { - this.maxStackSize = 1; - this.a = i; - this.a(CreativeModeTab.e); - BlockDispenser.a.a(this, b); - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - if (BlockMinecartTrackAbstract.a(world.getType(i, j, k))) { - if (!world.isStatic) { - // CraftBukkit start - Minecarts - org.bukkit.event.player.PlayerInteractEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(entityhuman, org.bukkit.event.block.Action.RIGHT_CLICK_BLOCK, i, j, k, l, itemstack); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - EntityMinecartAbstract entityminecartabstract = EntityMinecartAbstract.a(world, (double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), this.a); - - if (itemstack.hasName()) { - entityminecartabstract.a(itemstack.getName()); - } - - world.addEntity(entityminecartabstract); - } - - --itemstack.count; - return true; - } else { - return false; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemMonsterEgg.java b/src/main/java/net/minecraft/server/ItemMonsterEgg.java deleted file mode 100644 index 639ddf56..00000000 --- a/src/main/java/net/minecraft/server/ItemMonsterEgg.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.minecraft.server; - -public class ItemMonsterEgg extends Item { - - public ItemMonsterEgg() { - this.a(true); - this.a(CreativeModeTab.f); - } - - public String n(ItemStack itemstack) { - String s = ("" + LocaleI18n.get(this.getName() + ".name")).trim(); - String s1 = EntityTypes.b(itemstack.getData()); - - if (s1 != null) { - s = s + " " + LocaleI18n.get("entity." + s1 + ".name"); - } - - return s; - } - - public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - // CraftBukkit - check ItemStack data - if (world.isStatic || itemstack.getData() == 48 || itemstack.getData() == 49 || itemstack.getData() == 63 || itemstack.getData() == 64) { - return true; - } else { - Block block = world.getType(i, j, k); - - i += Facing.b[l]; - j += Facing.c[l]; - k += Facing.d[l]; - double d0 = 0.0D; - - if (l == 1 && block.b() == 11) { - d0 = 0.5D; - } - - Entity entity = a(world, itemstack.getData(), (double) i + 0.5D, (double) j + d0, (double) k + 0.5D); - - if (entity != null) { - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - - return true; - } - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (world.isStatic) { - return itemstack; - } else { - MovingObjectPosition movingobjectposition = this.a(world, entityhuman, true); - - if (movingobjectposition == null) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - if (!world.a(entityhuman, i, j, k)) { - return itemstack; - } - - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - if (world.getType(i, j, k) instanceof BlockFluids) { - Entity entity = a(world, itemstack.getData(), (double) i, (double) j, (double) k); - - if (entity != null) { - if (entity instanceof EntityLiving && itemstack.hasName()) { - ((EntityInsentient) entity).setCustomName(itemstack.getName()); - } - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - } - } - - return itemstack; - } - } - } - - public static Entity a(World world, int i, double d0, double d1, double d2) { - // CraftBukkit start - delegate to spawnCreature - return spawnCreature(world, i, d0, d1, d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); - } - - public static Entity spawnCreature(World world, int i, double d0, double d1, double d2, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason) { - // CraftBukkit end - if (!EntityTypes.eggInfo.containsKey(Integer.valueOf(i))) { - return null; - } else { - Entity entity = null; - - for (int j = 0; j < 1; ++j) { - entity = EntityTypes.a(i, world); - if (entity != null && entity instanceof EntityLiving) { - EntityInsentient entityinsentient = (EntityInsentient) entity; - - entity.setPositionRotation(d0, d1, d2, MathHelper.g(world.random.nextFloat() * 360.0F), 0.0F); - entityinsentient.aO = entityinsentient.yaw; - entityinsentient.aM = entityinsentient.yaw; - entityinsentient.prepare((GroupDataEntity) null); - world.addEntity(entity, spawnReason); // CraftBukkit - entityinsentient.r(); - } - } - - return entity; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java deleted file mode 100644 index c9d74d37..00000000 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ /dev/null @@ -1,593 +0,0 @@ -package net.minecraft.server; - -import java.text.DecimalFormat; -import java.util.Random; - -import net.minecraft.util.com.google.common.collect.HashMultimap; -import net.minecraft.util.com.google.common.collect.Multimap; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.Location; -import org.bukkit.TreeType; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.block.CraftBlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.entity.Player; -import org.bukkit.event.world.StructureGrowEvent; -// CraftBukkit end - -public final class ItemStack { - - public static final DecimalFormat a = new DecimalFormat("#.###"); - public int count; - public int c; - private Item item; - public NBTTagCompound tag; - private int damage; - private EntityItemFrame g; - - public ItemStack(Block block) { - this(block, 1); - } - - public ItemStack(Block block, int i) { - this(block, i, 0); - } - - public ItemStack(Block block, int i, int j) { - this(Item.getItemOf(block), i, j); - } - - public ItemStack(Item item) { - this(item, 1); - } - - public ItemStack(Item item, int i) { - this(item, i, 0); - } - - public ItemStack(Item item, int i, int j) { - this.item = item; - this.count = i; - // CraftBukkit start - Pass to setData to do filtering - this.setData(j); - //this.damage = j; - //if (this.damage < 0) { - // this.damage = 0; - //} - // CraftBukkit end - } - - public static ItemStack createStack(NBTTagCompound nbttagcompound) { - ItemStack itemstack = new ItemStack(); - - itemstack.c(nbttagcompound); - return itemstack.getItem() != null ? itemstack : null; - } - - private ItemStack() {} - - public ItemStack a(int i) { - ItemStack itemstack = new ItemStack(this.item, i, this.damage); - - if (this.tag != null) { - itemstack.tag = (NBTTagCompound) this.tag.clone(); - } - - this.count -= i; - return itemstack; - } - - public Item getItem() { - return this.item; - } - - public boolean placeItem(EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) { - // CraftBukkit start - handle all block place event logic here - int data = this.getData(); - int count = this.count; - - if (!(this.getItem() instanceof ItemBucket)) { // if not bucket - world.captureBlockStates = true; - // special case bonemeal - if (this.getItem() instanceof ItemDye && this.getData() == 15) { - Block block = world.getType(i, j, k); - if (block == Blocks.SAPLING || block instanceof BlockMushroom) { - world.captureTreeGeneration = true; - } - } - } - boolean flag = this.getItem().interactWith(this, entityhuman, world, i, j, k, l, f, f1, f2); - int newData = this.getData(); - int newCount = this.count; - this.count = count; - this.setData(data); - world.captureBlockStates = false; - if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { - world.captureTreeGeneration = false; - Location location = new Location(world.getWorld(), i, j, k); - TreeType treeType = BlockSapling.treeType; - BlockSapling.treeType = null; - List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone(); - world.capturedBlockStates.clear(); - StructureGrowEvent event = null; - if (treeType != null) { - event = new StructureGrowEvent(location, treeType, false, (Player) entityhuman.getBukkitEntity(), blocks); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - } - if (event == null || !event.isCancelled()) { - // Change the stack to its new contents if it hasn't been tampered with. - if (this.count == count && this.getData() == data) { - this.setData(newData); - this.count = newCount; - } - for (BlockState blockstate : blocks) { - blockstate.update(true); - } - } - - return flag; - } - world.captureTreeGeneration = false; - - if (flag) { - org.bukkit.event.block.BlockPlaceEvent placeEvent = null; - List<BlockState> blocks = (List<BlockState>) world.capturedBlockStates.clone(); - world.capturedBlockStates.clear(); - if (blocks.size() > 1) { - placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockMultiPlaceEvent(world, entityhuman, blocks, i, j, k); - } else if (blocks.size() == 1) { - placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blocks.get(0), i, j, k); - } - - if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { - flag = false; // cancel placement - // revert back all captured blocks - for (BlockState blockstate : blocks) { - blockstate.update(true, false); - } - } else { - // Change the stack to its new contents if it hasn't been tampered with. - if (this.count == count && this.getData() == data) { - this.setData(newData); - this.count = newCount; - } - for (BlockState blockstate : blocks) { - int x = blockstate.getX(); - int y = blockstate.getY(); - int z = blockstate.getZ(); - int updateFlag = ((CraftBlockState) blockstate).getFlag(); - org.bukkit.Material mat = blockstate.getType(); - Block oldBlock = CraftMagicNumbers.getBlock(mat); - Block block = world.getType(x, y, z); - - if (block != null && !(block instanceof BlockContainer)) { // Containers get placed automatically - block.onPlace(world, x, y, z); - } - - world.notifyAndUpdatePhysics(x, y, z, null, oldBlock, block, updateFlag); // send null chunk as chunk.k() returns false by this point - } - entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)], 1); - } - } - world.capturedBlockStates.clear(); - // CraftBukkit end - - return flag; - } - - public float a(Block block) { - return this.getItem().getDestroySpeed(this, block); - } - - public ItemStack a(World world, EntityHuman entityhuman) { - return this.getItem().a(this, world, entityhuman); - } - - public ItemStack b(World world, EntityHuman entityhuman) { - return this.getItem().b(this, world, entityhuman); - } - - public NBTTagCompound save(NBTTagCompound nbttagcompound) { - nbttagcompound.setShort("id", (short) Item.getId(this.item)); - nbttagcompound.setByte("Count", (byte) this.count); - nbttagcompound.setShort("Damage", (short) this.damage); - if (this.tag != null) { - nbttagcompound.set("tag", this.tag.clone()); // CraftBukkit - make defensive copy, data is going to another thread - } - - return nbttagcompound; - } - - public void c(NBTTagCompound nbttagcompound) { - this.item = Item.getById(nbttagcompound.getShort("id")); - this.count = nbttagcompound.getByte("Count"); - /* CraftBukkit start - Route through setData for filtering - this.damage = nbttagcompound.getShort("Damage"); - if (this.damage < 0) { - this.damage = 0; - } - */ - this.setData(nbttagcompound.getShort("Damage")); - // CraftBukkit end - - if (nbttagcompound.hasKeyOfType("tag", 10)) { - // CraftBukkit - make defensive copy as this data may be coming from the save thread - this.tag = (NBTTagCompound) nbttagcompound.getCompound("tag").clone(); - } - } - - public int getMaxStackSize() { - return this.getItem().getMaxStackSize(); - } - - public boolean isStackable() { - return this.getMaxStackSize() > 1 && (!this.g() || !this.i()); - } - - public boolean g() { - return this.item.getMaxDurability() <= 0 ? false : !this.hasTag() || !this.getTag().getBoolean("Unbreakable"); - } - - public boolean usesData() { - return this.item.n(); - } - - public boolean i() { - return this.g() && this.damage > 0; - } - - public int j() { - return this.damage; - } - - public int getData() { - return this.damage; - } - - public void setData(int i) { - // CraftBukkit start - Filter out data for items that shouldn't have it - // The crafting system uses this value for a special purpose so we have to allow it - if (i == 32767) { - this.damage = i; - return; - } - - // Is this a block? - if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) != Blocks.AIR) { - // If vanilla doesn't use data on it don't allow any - if (!(this.usesData() || this.getItem().usesDurability())) { - i = 0; - } - } - - // Filter invalid plant data - if (CraftMagicNumbers.getBlock(CraftMagicNumbers.getId(this.getItem())) == Blocks.DOUBLE_PLANT && (i > 5 || i < 0)) { - i = 0; - } - // CraftBukkit end - - this.damage = i; - if (this.damage < -1) { // CraftBukkit - don't filter -1, we use it - this.damage = 0; - } - } - - public int l() { - return this.item.getMaxDurability(); - } - - public boolean isDamaged(int i, Random random) { - if (!this.g()) { - return false; - } else { - if (i > 0) { - int j = EnchantmentManager.getEnchantmentLevel(Enchantment.DURABILITY.id, this); - int k = 0; - - for (int l = 0; j > 0 && l < i; ++l) { - if (EnchantmentDurability.a(this, j, random)) { - ++k; - } - } - - i -= k; - if (i <= 0) { - return false; - } - } - - this.damage += i; - return this.damage > this.l(); - } - } - - public void damage(int i, EntityLiving entityliving) { - if (!(entityliving instanceof EntityHuman) || !((EntityHuman) entityliving).abilities.canInstantlyBuild) { - if (this.g()) { - if (this.isDamaged(i, entityliving.aI())) { - entityliving.a(this); - --this.count; - if (entityliving instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entityliving; - - entityhuman.a(StatisticList.BREAK_ITEM_COUNT[Item.getId(this.item)], 1); - if (this.count == 0 && this.getItem() instanceof ItemBow) { - entityhuman.bG(); - } - } - - if (this.count < 0) { - this.count = 0; - } - - // CraftBukkit start - Check for item breaking - if (this.count == 0 && entityliving instanceof EntityHuman) { - org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) entityliving, this); - } - // CraftBukkit end - - this.damage = 0; - } - } - } - } - - public void a(EntityLiving entityliving, EntityHuman entityhuman) { - boolean flag = this.item.a(this, entityliving, (EntityLiving) entityhuman); - - if (flag) { - entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)], 1); - } - } - - public void a(World world, Block block, int i, int j, int k, EntityHuman entityhuman) { - boolean flag = this.item.a(this, world, block, i, j, k, entityhuman); - - if (flag) { - entityhuman.a(StatisticList.USE_ITEM_COUNT[Item.getId(this.item)], 1); - } - } - - public boolean b(Block block) { - return this.item.canDestroySpecialBlock(block); - } - - public boolean a(EntityHuman entityhuman, EntityLiving entityliving) { - return this.item.a(this, entityhuman, entityliving); - } - - public ItemStack cloneItemStack() { - ItemStack itemstack = new ItemStack(this.item, this.count, this.damage); - - if (this.tag != null) { - itemstack.tag = (NBTTagCompound) this.tag.clone(); - } - - return itemstack; - } - - public static boolean equals(ItemStack itemstack, ItemStack itemstack1) { - return itemstack == null && itemstack1 == null ? true : (itemstack != null && itemstack1 != null ? (itemstack.tag == null && itemstack1.tag != null ? false : itemstack.tag == null || itemstack.tag.equals(itemstack1.tag)) : false); - } - - public static boolean matches(ItemStack itemstack, ItemStack itemstack1) { - return itemstack == null && itemstack1 == null ? true : (itemstack != null && itemstack1 != null ? itemstack.d(itemstack1) : false); - } - - private boolean d(ItemStack itemstack) { - return this.count != itemstack.count ? false : (this.item != itemstack.item ? false : (this.damage != itemstack.damage ? false : (this.tag == null && itemstack.tag != null ? false : this.tag == null || this.tag.equals(itemstack.tag)))); - } - - public boolean doMaterialsMatch(ItemStack itemstack) { - return this.item == itemstack.item && this.damage == itemstack.damage; - } - - public String a() { - return this.item.a(this); - } - - public static ItemStack b(ItemStack itemstack) { - return itemstack == null ? null : itemstack.cloneItemStack(); - } - - public String toString() { - return this.count + "x" + this.item.getName() + "@" + this.damage; - } - - public void a(World world, Entity entity, int i, boolean flag) { - if (this.c > 0) { - --this.c; - } - - this.item.a(this, world, entity, i, flag); - } - - public void a(World world, EntityHuman entityhuman, int i) { - entityhuman.a(StatisticList.CRAFT_BLOCK_COUNT[Item.getId(this.item)], i); - this.item.d(this, world, entityhuman); - } - - public int n() { - return this.getItem().d_(this); - } - - public EnumAnimation o() { - return this.getItem().d(this); - } - - public void b(World world, EntityHuman entityhuman, int i) { - this.getItem().a(this, world, entityhuman, i); - } - - public boolean hasTag() { - return this.tag != null; - } - - public NBTTagCompound getTag() { - return this.tag; - } - - public NBTTagList getEnchantments() { - return this.tag == null ? null : this.tag.getList("ench", 10); - } - - public void setTag(NBTTagCompound nbttagcompound) { - this.tag = nbttagcompound; - } - - public String getName() { - String s = this.getItem().n(this); - - if (this.tag != null && this.tag.hasKeyOfType("display", 10)) { - NBTTagCompound nbttagcompound = this.tag.getCompound("display"); - - if (nbttagcompound.hasKeyOfType("Name", 8)) { - s = nbttagcompound.getString("Name"); - } - } - - return s; - } - - public ItemStack c(String s) { - if (this.tag == null) { - this.tag = new NBTTagCompound(); - } - - if (!this.tag.hasKeyOfType("display", 10)) { - this.tag.set("display", new NBTTagCompound()); - } - - this.tag.getCompound("display").setString("Name", s); - return this; - } - - public void t() { - if (this.tag != null) { - if (this.tag.hasKeyOfType("display", 10)) { - NBTTagCompound nbttagcompound = this.tag.getCompound("display"); - - nbttagcompound.remove("Name"); - if (nbttagcompound.isEmpty()) { - this.tag.remove("display"); - if (this.tag.isEmpty()) { - this.setTag((NBTTagCompound) null); - } - } - } - } - } - - public boolean hasName() { - return this.tag == null ? false : (!this.tag.hasKeyOfType("display", 10) ? false : this.tag.getCompound("display").hasKeyOfType("Name", 8)); - } - - public EnumItemRarity w() { - return this.getItem().f(this); - } - - public boolean x() { - return !this.getItem().e_(this) ? false : !this.hasEnchantments(); - } - - public void addEnchantment(Enchantment enchantment, int i) { - if (this.tag == null) { - this.setTag(new NBTTagCompound()); - } - - if (!this.tag.hasKeyOfType("ench", 9)) { - this.tag.set("ench", new NBTTagList()); - } - - NBTTagList nbttaglist = this.tag.getList("ench", 10); - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - nbttagcompound.setShort("id", (short) enchantment.id); - nbttagcompound.setShort("lvl", (short) ((byte) i)); - nbttaglist.add(nbttagcompound); - } - - public boolean hasEnchantments() { - return this.tag != null && this.tag.hasKeyOfType("ench", 9); - } - - public void a(String s, NBTBase nbtbase) { - if (this.tag == null) { - this.setTag(new NBTTagCompound()); - } - - this.tag.set(s, nbtbase); - } - - public boolean z() { - return this.getItem().v(); - } - - public boolean A() { - return this.g != null; - } - - public void a(EntityItemFrame entityitemframe) { - this.g = entityitemframe; - } - - public EntityItemFrame B() { - return this.g; - } - - public int getRepairCost() { - return this.hasTag() && this.tag.hasKeyOfType("RepairCost", 3) ? this.tag.getInt("RepairCost") : 0; - } - - public void setRepairCost(int i) { - if (!this.hasTag()) { - this.tag = new NBTTagCompound(); - } - - this.tag.setInt("RepairCost", i); - } - - public Multimap D() { - Object object; - - if (this.hasTag() && this.tag.hasKeyOfType("AttributeModifiers", 9)) { - object = HashMultimap.create(); - NBTTagList nbttaglist = this.tag.getList("AttributeModifiers", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound = nbttaglist.get(i); - AttributeModifier attributemodifier = GenericAttributes.a(nbttagcompound); - - if (attributemodifier.a().getLeastSignificantBits() != 0L && attributemodifier.a().getMostSignificantBits() != 0L) { - ((Multimap) object).put(nbttagcompound.getString("AttributeName"), attributemodifier); - } - } - } else { - object = this.getItem().k(); - } - - return (Multimap) object; - } - - public void setItem(Item item) { - this.item = item; - this.setData(this.getData()); // CraftBukkit - Set data again to ensure it is filtered properly - } - - public IChatBaseComponent E() { - IChatBaseComponent ichatbasecomponent = (new ChatComponentText("[")).a(this.getName()).a("]"); - - if (this.item != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - this.save(nbttagcompound); - ichatbasecomponent.getChatModifier().a(new ChatHoverable(EnumHoverAction.SHOW_ITEM, new ChatComponentText(nbttagcompound.toString()))); - ichatbasecomponent.getChatModifier().setColor(this.w().e); - } - - return ichatbasecomponent; - } -} diff --git a/src/main/java/net/minecraft/server/ItemWaterLily.java b/src/main/java/net/minecraft/server/ItemWaterLily.java deleted file mode 100644 index 246090d6..00000000 --- a/src/main/java/net/minecraft/server/ItemWaterLily.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -public class ItemWaterLily extends ItemWithAuxData { - - public ItemWaterLily(Block block) { - super(block, false); - } - - public ItemStack a(ItemStack itemstack, World world, EntityHuman entityhuman) { - MovingObjectPosition movingobjectposition = this.a(world, entityhuman, true); - - if (movingobjectposition == null) { - return itemstack; - } else { - if (movingobjectposition.type == EnumMovingObjectType.BLOCK) { - int i = movingobjectposition.b; - int j = movingobjectposition.c; - int k = movingobjectposition.d; - - if (!world.a(entityhuman, i, j, k)) { - return itemstack; - } - - if (!entityhuman.a(i, j, k, movingobjectposition.face, itemstack)) { - return itemstack; - } - - if (world.getType(i, j, k).getMaterial() == Material.WATER && world.getData(i, j, k) == 0 && world.isEmpty(i, j + 1, k)) { - // CraftBukkit start - special case for handling block placement with water lilies - org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, i, j + 1, k); - world.setTypeUpdate(i, j + 1, k, Blocks.WATER_LILY); - org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, i, j, k); - if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) { - blockstate.update(true, false); - return itemstack; - } - // CraftBukkit end - - if (!entityhuman.abilities.canInstantlyBuild) { - --itemstack.count; - } - } - } - - return itemstack; - } - } -} diff --git a/src/main/java/net/minecraft/server/ItemWorldMap.java b/src/main/java/net/minecraft/server/ItemWorldMap.java deleted file mode 100644 index c08cccaf..00000000 --- a/src/main/java/net/minecraft/server/ItemWorldMap.java +++ /dev/null @@ -1,231 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.com.google.common.collect.HashMultiset; -import net.minecraft.util.com.google.common.collect.Iterables; -import net.minecraft.util.com.google.common.collect.Multisets; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.event.server.MapInitializeEvent; -// CraftBukkit end - -public class ItemWorldMap extends ItemWorldMapBase { - - protected ItemWorldMap() { - this.a(true); - } - - public WorldMap getSavedMap(ItemStack itemstack, World world) { - World worldMain = world.getServer().getServer().worlds.get(0); // CraftBukkit - store reference to primary world - String s = "map_" + itemstack.getData(); - WorldMap worldmap = (WorldMap) worldMain.a(WorldMap.class, s); // CraftBukkit - use primary world for maps - - if (worldmap == null && !world.isStatic) { - itemstack.setData(worldMain.b("map")); // CraftBukkit - use primary world for maps - s = "map_" + itemstack.getData(); - worldmap = new WorldMap(s); - worldmap.scale = 3; - int i = 128 * (1 << worldmap.scale); - - worldmap.centerX = Math.round((float) world.getWorldData().c() / (float) i) * i; - worldmap.centerZ = Math.round((float) (world.getWorldData().e() / i)) * i; - worldmap.map = (byte) ((WorldServer) world).dimension; // CraftBukkit - fixes Bukkit multiworld maps - worldmap.c(); - worldMain.a(s, (PersistentBase) worldmap); // CraftBukkit - use primary world for maps - - // CraftBukkit start - MapInitializeEvent event = new MapInitializeEvent(worldmap.mapView); - Bukkit.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - } - - return worldmap; - } - - public void a(World world, Entity entity, WorldMap worldmap) { - // CraftBukkit - world.worldProvider -> ((WorldServer) world) - if (((WorldServer) world).dimension == worldmap.map && entity instanceof EntityHuman) { - int i = 1 << worldmap.scale; - int j = worldmap.centerX; - int k = worldmap.centerZ; - int l = MathHelper.floor(entity.locX - (double) j) / i + 64; - int i1 = MathHelper.floor(entity.locZ - (double) k) / i + 64; - int j1 = 128 / i; - - if (world.worldProvider.g) { - j1 /= 2; - } - - WorldMapHumanTracker worldmaphumantracker = worldmap.a((EntityHuman) entity); - - ++worldmaphumantracker.d; - - for (int k1 = l - j1 + 1; k1 < l + j1; ++k1) { - if ((k1 & 15) == (worldmaphumantracker.d & 15)) { - int l1 = 255; - int i2 = 0; - double d0 = 0.0D; - - for (int j2 = i1 - j1 - 1; j2 < i1 + j1; ++j2) { - if (k1 >= 0 && j2 >= -1 && k1 < 128 && j2 < 128) { - int k2 = k1 - l; - int l2 = j2 - i1; - boolean flag = k2 * k2 + l2 * l2 > (j1 - 2) * (j1 - 2); - int i3 = (j / i + k1 - 64) * i; - int j3 = (k / i + j2 - 64) * i; - HashMultiset hashmultiset = HashMultiset.create(); - Chunk chunk = world.getChunkAtWorldCoords(i3, j3); - - if (!chunk.isEmpty()) { - int k3 = i3 & 15; - int l3 = j3 & 15; - int i4 = 0; - double d1 = 0.0D; - int j4; - - if (world.worldProvider.g) { - j4 = i3 + j3 * 231871; - j4 = j4 * j4 * 31287121 + j4 * 11; - if ((j4 >> 20 & 1) == 0) { - hashmultiset.add(Blocks.DIRT.f(0), 10); - } else { - hashmultiset.add(Blocks.STONE.f(0), 100); - } - - d1 = 100.0D; - } else { - for (j4 = 0; j4 < i; ++j4) { - for (int k4 = 0; k4 < i; ++k4) { - int l4 = chunk.b(j4 + k3, k4 + l3) + 1; - Block block = Blocks.AIR; - int i5 = 0; - - if (l4 > 1) { - do { - --l4; - block = chunk.getType(j4 + k3, l4, k4 + l3); - i5 = chunk.getData(j4 + k3, l4, k4 + l3); - } while (block.f(i5) == MaterialMapColor.b && l4 > 0); - - if (l4 > 0 && block.getMaterial().isLiquid()) { - int j5 = l4 - 1; - - Block block1; - - do { - block1 = chunk.getType(j4 + k3, j5--, k4 + l3); - ++i4; - } while (j5 > 0 && block1.getMaterial().isLiquid()); - } - } - - d1 += (double) l4 / (double) (i * i); - hashmultiset.add(block.f(i5)); - } - } - } - - i4 /= i * i; - double d2 = (d1 - d0) * 4.0D / (double) (i + 4) + ((double) (k1 + j2 & 1) - 0.5D) * 0.4D; - byte b0 = 1; - - if (d2 > 0.6D) { - b0 = 2; - } - - if (d2 < -0.6D) { - b0 = 0; - } - - MaterialMapColor materialmapcolor = (MaterialMapColor) Iterables.getFirst(Multisets.copyHighestCountFirst(hashmultiset), MaterialMapColor.b); - - if (materialmapcolor == MaterialMapColor.n) { - d2 = (double) i4 * 0.1D + (double) (k1 + j2 & 1) * 0.2D; - b0 = 1; - if (d2 < 0.5D) { - b0 = 2; - } - - if (d2 > 0.9D) { - b0 = 0; - } - } - - d0 = d1; - if (j2 >= 0 && k2 * k2 + l2 * l2 < j1 * j1 && (!flag || (k1 + j2 & 1) != 0)) { - byte b1 = worldmap.colors[k1 + j2 * 128]; - byte b2 = (byte) (materialmapcolor.M * 4 + b0); - - if (b1 != b2) { - if (l1 > j2) { - l1 = j2; - } - - if (i2 < j2) { - i2 = j2; - } - - worldmap.colors[k1 + j2 * 128] = b2; - } - } - } - } - } - - if (l1 <= i2) { - worldmap.flagDirty(k1, l1, i2); - } - } - } - } - } - - public void a(ItemStack itemstack, World world, Entity entity, int i, boolean flag) { - if (!world.isStatic) { - WorldMap worldmap = this.getSavedMap(itemstack, world); - - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - worldmap.a(entityhuman, itemstack); - } - - if (flag) { - this.a(world, entity, worldmap); - } - } - } - - public Packet c(ItemStack itemstack, World world, EntityHuman entityhuman) { - byte[] abyte = this.getSavedMap(itemstack, world).getUpdatePacket(itemstack, world, entityhuman); - - return abyte == null ? null : new PacketPlayOutMap(itemstack.getData(), abyte); - } - - public void d(ItemStack itemstack, World world, EntityHuman entityhuman) { - if (itemstack.hasTag() && itemstack.getTag().getBoolean("map_is_scaling")) { - WorldMap worldmap = Items.MAP.getSavedMap(itemstack, world); - - world = world.getServer().getServer().worlds.get(0); // CraftBukkit - use primary world for maps - - itemstack.setData(world.b("map")); - WorldMap worldmap1 = new WorldMap("map_" + itemstack.getData()); - - worldmap1.scale = (byte) (worldmap.scale + 1); - if (worldmap1.scale > 4) { - worldmap1.scale = 4; - } - - worldmap1.centerX = worldmap.centerX; - worldmap1.centerZ = worldmap.centerZ; - worldmap1.map = worldmap.map; - worldmap1.c(); - world.a("map_" + itemstack.getData(), (PersistentBase) worldmap1); - - // CraftBukkit start - MapInitializeEvent event = new MapInitializeEvent(worldmap1.mapView); - Bukkit.getServer().getPluginManager().callEvent(event); - // CraftBukkit end - } - } -} diff --git a/src/main/java/net/minecraft/server/JsonList.java b/src/main/java/net/minecraft/server/JsonList.java deleted file mode 100644 index 9d1cb336..00000000 --- a/src/main/java/net/minecraft/server/JsonList.java +++ /dev/null @@ -1,166 +0,0 @@ -package net.minecraft.server; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.ParameterizedType; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.Map; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.com.google.common.collect.Maps; -import net.minecraft.util.com.google.common.io.Files; -import net.minecraft.util.com.google.gson.Gson; -import net.minecraft.util.com.google.gson.GsonBuilder; -import net.minecraft.util.com.google.gson.JsonObject; -import net.minecraft.util.org.apache.commons.io.IOUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class JsonList { - - protected static final Logger a = LogManager.getLogger(); - protected final Gson b; - private final File c; - private final Map d = Maps.newHashMap(); - private boolean e = true; - private static final ParameterizedType f = new JsonListType(); - - public JsonList(File file1) { - this.c = file1; - GsonBuilder gsonbuilder = (new GsonBuilder()).setPrettyPrinting(); - - gsonbuilder.registerTypeHierarchyAdapter(JsonListEntry.class, new JsonListEntrySerializer(this, (JsonListType) null)); - this.b = gsonbuilder.create(); - } - - public boolean isEnabled() { - return this.e; - } - - public void a(boolean flag) { - this.e = flag; - } - - public File c() { - return this.c; - } - - public void add(JsonListEntry jsonlistentry) { - this.d.put(this.a(jsonlistentry.getKey()), jsonlistentry); - - try { - this.save(); - } catch (IOException ioexception) { - a.warn("Could not save the list after adding a user.", ioexception); - } - } - - public JsonListEntry get(Object object) { - this.h(); - return (JsonListEntry) this.d.get(this.a(object)); - } - - public void remove(Object object) { - this.d.remove(this.a(object)); - - try { - this.save(); - } catch (IOException ioexception) { - a.warn("Could not save the list after removing a user.", ioexception); - } - } - - public String[] getEntries() { - return (String[]) this.d.keySet().toArray(new String[this.d.size()]); - } - - // CraftBukkit start - public Collection<JsonListEntry> getValues() { - return this.d.values(); - } - // CraftBukkit end - - public boolean isEmpty() { - return this.d.size() < 1; - } - - protected String a(Object object) { - return object.toString(); - } - - protected boolean d(Object object) { - return this.d.containsKey(this.a(object)); - } - - private void h() { - ArrayList arraylist = Lists.newArrayList(); - Iterator iterator = this.d.values().iterator(); - - while (iterator.hasNext()) { - JsonListEntry jsonlistentry = (JsonListEntry) iterator.next(); - - if (jsonlistentry.hasExpired()) { - arraylist.add(jsonlistentry.getKey()); - } - } - - iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - Object object = iterator.next(); - - this.d.remove(object); - } - } - - protected JsonListEntry a(JsonObject jsonobject) { - return new JsonListEntry(null, jsonobject); - } - - protected Map e() { - return this.d; - } - - public void save() throws IOException { // CraftBukkit - Added throws - Collection collection = this.d.values(); - String s = this.b.toJson(collection); - BufferedWriter bufferedwriter = null; - - try { - bufferedwriter = Files.newWriter(this.c, Charsets.UTF_8); - bufferedwriter.write(s); - } finally { - IOUtils.closeQuietly(bufferedwriter); - } - } - - public void load() throws IOException { // CraftBukkit - Added throws - Collection collection = null; - BufferedReader bufferedreader = null; - - try { - bufferedreader = Files.newReader(this.c, Charsets.UTF_8); - collection = (Collection) this.b.fromJson(bufferedreader, f); - } finally { - IOUtils.closeQuietly(bufferedreader); - } - - if (collection != null) { - this.d.clear(); - Iterator iterator = collection.iterator(); - - while (iterator.hasNext()) { - JsonListEntry jsonlistentry = (JsonListEntry) iterator.next(); - - if (jsonlistentry.getKey() != null) { - this.d.put(this.a(jsonlistentry.getKey()), jsonlistentry); - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/JsonListEntry.java b/src/main/java/net/minecraft/server/JsonListEntry.java deleted file mode 100644 index 1cd5104b..00000000 --- a/src/main/java/net/minecraft/server/JsonListEntry.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.com.google.gson.JsonObject; - -public class JsonListEntry { - - private final Object a; - - public JsonListEntry(Object object) { - this.a = object; - } - - protected JsonListEntry(Object object, JsonObject jsonobject) { - this.a = object; - } - - public Object getKey() { // CraftBukkit -> package private -> public - return this.a; - } - - boolean hasExpired() { - return false; - } - - protected void a(JsonObject jsonobject) {} -} diff --git a/src/main/java/net/minecraft/server/JsonListEntrySerializer.java b/src/main/java/net/minecraft/server/JsonListEntrySerializer.java deleted file mode 100644 index f4eee668..00000000 --- a/src/main/java/net/minecraft/server/JsonListEntrySerializer.java +++ /dev/null @@ -1,51 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - Imported for package private use in JsonList - -import java.lang.reflect.Type; - -import net.minecraft.util.com.google.gson.JsonDeserializationContext; -import net.minecraft.util.com.google.gson.JsonDeserializer; -import net.minecraft.util.com.google.gson.JsonElement; -import net.minecraft.util.com.google.gson.JsonObject; -import net.minecraft.util.com.google.gson.JsonSerializationContext; -import net.minecraft.util.com.google.gson.JsonSerializer; - -class JsonListEntrySerializer implements JsonDeserializer, JsonSerializer { - - final JsonList a; - - private JsonListEntrySerializer(JsonList jsonlist) { - this.a = jsonlist; - } - - public JsonElement a(JsonListEntry jsonlistentry, Type type, JsonSerializationContext jsonserializationcontext) { - JsonObject jsonobject = new JsonObject(); - - jsonlistentry.a(jsonobject); - return jsonobject; - } - - public JsonListEntry a(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) { - if (jsonelement.isJsonObject()) { - JsonObject jsonobject = jsonelement.getAsJsonObject(); - JsonListEntry jsonlistentry = this.a.a(jsonobject); - - return jsonlistentry; - } else { - return null; - } - } - - public JsonElement serialize(Object object, Type type, JsonSerializationContext jsonserializationcontext) { - return this.a((JsonListEntry) object, type, jsonserializationcontext); - } - - public Object deserialize(JsonElement jsonelement, Type type, JsonDeserializationContext jsondeserializationcontext) { - return this.a(jsonelement, type, jsondeserializationcontext); - } - - JsonListEntrySerializer(JsonList jsonlist, JsonListType jsonlisttype) { - this(jsonlist); - } -} diff --git a/src/main/java/net/minecraft/server/LoginListener.java b/src/main/java/net/minecraft/server/LoginListener.java deleted file mode 100644 index 8f982f17..00000000 --- a/src/main/java/net/minecraft/server/LoginListener.java +++ /dev/null @@ -1,151 +0,0 @@ -package net.minecraft.server; - -import java.security.PrivateKey; -import java.util.Arrays; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.atomic.AtomicInteger; -import javax.crypto.SecretKey; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.util.org.apache.commons.lang3.Validate; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class LoginListener implements PacketLoginInListener { - - private static final AtomicInteger b = new AtomicInteger(0); - private static final Logger c = LogManager.getLogger(); - private static final Random random = new Random(); - private final byte[] e = new byte[4]; - private final MinecraftServer server; - public final NetworkManager networkManager; - private EnumProtocolState g; - private int h; - private GameProfile i; - private String j; - private SecretKey loginKey; - public String hostname = ""; // CraftBukkit - add field - - public LoginListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.g = EnumProtocolState.HELLO; - this.j = ""; - this.server = minecraftserver; - this.networkManager = networkmanager; - random.nextBytes(this.e); - } - - public void a() { - if (this.g == EnumProtocolState.READY_TO_ACCEPT) { - this.c(); - } - - if (this.h++ == 600) { - this.disconnect("Took too long to log in"); - } - } - - public void disconnect(String s) { - try { - c.info("Disconnecting " + this.getName() + ": " + s); - ChatComponentText chatcomponenttext = new ChatComponentText(s); - - this.networkManager.handle(new PacketLoginOutDisconnect(chatcomponenttext), new GenericFutureListener[0]); - this.networkManager.close(chatcomponenttext); - } catch (Exception exception) { - c.error("Error whilst disconnecting player", exception); - } - } - - public void c() { - if (!this.i.isComplete()) { - this.i = this.a(this.i); - } - - // CraftBukkit start - fire PlayerLoginEvent - EntityPlayer s = this.server.getPlayerList().attemptLogin(this, this.i, this.hostname); - - if (s == null) { - // this.disconnect(s); - // CraftBukkit end - } else { - this.g = EnumProtocolState.e; - this.networkManager.handle(new PacketLoginOutSuccess(this.i), new GenericFutureListener[0]); - this.server.getPlayerList().a(this.networkManager, this.server.getPlayerList().processLogin(this.i, s)); // CraftBukkit - add player reference - } - } - - public void a(IChatBaseComponent ichatbasecomponent) { - c.info(this.getName() + " lost connection: " + ichatbasecomponent.c()); - } - - public String getName() { - return this.i != null ? this.i.toString() + " (" + this.networkManager.getSocketAddress().toString() + ")" : String.valueOf(this.networkManager.getSocketAddress()); - } - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - Validate.validState(this.g == EnumProtocolState.e || this.g == EnumProtocolState.HELLO, "Unexpected change in protocol", new Object[0]); - Validate.validState(enumprotocol1 == EnumProtocol.PLAY || enumprotocol1 == EnumProtocol.LOGIN, "Unexpected protocol " + enumprotocol1, new Object[0]); - } - - public void a(PacketLoginInStart packetlogininstart) { - Validate.validState(this.g == EnumProtocolState.HELLO, "Unexpected hello packet", new Object[0]); - this.i = packetlogininstart.c(); - if (this.server.getOnlineMode() && !this.networkManager.c()) { - this.g = EnumProtocolState.KEY; - this.networkManager.handle(new PacketLoginOutEncryptionBegin(this.j, this.server.K().getPublic(), this.e), new GenericFutureListener[0]); - } else { - this.g = EnumProtocolState.READY_TO_ACCEPT; - } - } - - public void a(PacketLoginInEncryptionBegin packetlogininencryptionbegin) { - Validate.validState(this.g == EnumProtocolState.KEY, "Unexpected key packet", new Object[0]); - PrivateKey privatekey = this.server.K().getPrivate(); - - if (!Arrays.equals(this.e, packetlogininencryptionbegin.b(privatekey))) { - throw new IllegalStateException("Invalid nonce!"); - } else { - this.loginKey = packetlogininencryptionbegin.a(privatekey); - this.g = EnumProtocolState.AUTHENTICATING; - this.networkManager.a(this.loginKey); - (new ThreadPlayerLookupUUID(this, "User Authenticator #" + b.incrementAndGet())).start(); - } - } - - protected GameProfile a(GameProfile gameprofile) { - UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + gameprofile.getName()).getBytes(Charsets.UTF_8)); - - return new GameProfile(uuid, gameprofile.getName()); - } - - static GameProfile a(LoginListener loginlistener) { - return loginlistener.i; - } - - static String b(LoginListener loginlistener) { - return loginlistener.j; - } - - static MinecraftServer c(LoginListener loginlistener) { - return loginlistener.server; - } - - static SecretKey d(LoginListener loginlistener) { - return loginlistener.loginKey; - } - - static GameProfile a(LoginListener loginlistener, GameProfile gameprofile) { - return loginlistener.i = gameprofile; - } - - static Logger e() { - return c; - } - - static EnumProtocolState a(LoginListener loginlistener, EnumProtocolState enumprotocolstate) { - return loginlistener.g = enumprotocolstate; - } -} diff --git a/src/main/java/net/minecraft/server/MethodProfiler.java b/src/main/java/net/minecraft/server/MethodProfiler.java deleted file mode 100644 index 7285e09e..00000000 --- a/src/main/java/net/minecraft/server/MethodProfiler.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start - Strip down to empty methods, performance cost -public class MethodProfiler { - public boolean a = false; - - public final void a() { } - public final void a(String s) { } - public final void b() { } - public final List b(String s) { return null; } - public final void c(String s) { } - public final String c() { return null; } -} -// CraftBukkit end diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java deleted file mode 100644 index e65cbfae..00000000 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ /dev/null @@ -1,1321 +0,0 @@ -package net.minecraft.server; - -import java.awt.GraphicsEnvironment; -import java.awt.image.BufferedImage; -import java.io.File; -import java.net.Proxy; -import java.security.KeyPair; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.UUID; -import java.util.concurrent.Callable; -import javax.imageio.ImageIO; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.GameProfileRepository; -import net.minecraft.util.com.mojang.authlib.minecraft.MinecraftSessionService; -import net.minecraft.util.com.mojang.authlib.yggdrasil.YggdrasilAuthenticationService; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import net.minecraft.util.io.netty.buffer.ByteBufOutputStream; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.io.netty.handler.codec.base64.Base64; -import net.minecraft.util.org.apache.commons.lang3.Validate; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.io.IOException; - -import jline.console.ConsoleReader; -import joptsimple.OptionSet; - -import org.bukkit.World.Environment; -import org.bukkit.craftbukkit.util.Waitable; -import org.bukkit.event.server.RemoteServerCommandEvent; -import org.bukkit.event.world.WorldSaveEvent; -// CraftBukkit end - -public abstract class MinecraftServer implements ICommandListener, Runnable, IMojangStatistics { - - private static final Logger i = LogManager.getLogger(); - private static final File a = new File("usercache.json"); - private static MinecraftServer j; - public Convertable convertable; // CraftBukkit - private final -> public - private final MojangStatisticsGenerator l = new MojangStatisticsGenerator("server", this, ar()); - public File universe; // CraftBukkit - private final -> public - private final List n = new ArrayList(); - private final ICommandHandler o; - public final MethodProfiler methodProfiler = new MethodProfiler(); - private final ServerConnection p; - private final ServerPing q = new ServerPing(); - private final Random r = new Random(); - private String serverIp; - private int t = -1; - public WorldServer[] worldServer; - private PlayerList u; - private boolean isRunning = true; - private boolean isStopped; - private int ticks; - protected final Proxy d; - public String e; - public int f; - private boolean onlineMode; - private boolean spawnAnimals; - private boolean spawnNPCs; - private boolean pvpMode; - private boolean allowFlight; - private String motd; - private int E; - private int F = 0; - public final long[] g = new long[100]; - public long[][] h; - private KeyPair G; - private String H; - private String I; - private boolean demoMode; - private boolean L; - private boolean M; - private String N = ""; - private boolean O; - private long P; - private String Q; - private boolean R; - private boolean S; - private final YggdrasilAuthenticationService T; - private final MinecraftSessionService U; - private long V = 0L; - private final GameProfileRepository W; - private final UserCache X; - - // CraftBukkit start - add fields - public List<WorldServer> worlds = new ArrayList<WorldServer>(); - public org.bukkit.craftbukkit.CraftServer server; - public OptionSet options; - public org.bukkit.command.ConsoleCommandSender console; - public org.bukkit.command.RemoteConsoleCommandSender remoteConsole; - public ConsoleReader reader; - public static int currentTick = (int) (System.currentTimeMillis() / 50); - public final Thread primaryThread; - public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>(); - public int autosavePeriod; - // CraftBukkit end - - public MinecraftServer(OptionSet options, Proxy proxy) { // CraftBukkit - signature file -> OptionSet - this.X = new UserCache(this, a); - j = this; - this.d = proxy; - // this.universe = file1; // CraftBukkit - this.p = new ServerConnection(this); - this.o = new CommandDispatcher(); - // this.convertable = new WorldLoaderServer(file1); // CraftBukkit - moved to DedicatedServer.init - this.T = new YggdrasilAuthenticationService(proxy, UUID.randomUUID().toString()); - this.U = this.T.createMinecraftSessionService(); - this.W = this.T.createProfileRepository(); - // CraftBukkit start - this.options = options; - // Try to see if we're actually running in a terminal, disable jline if not - if (System.console() == null) { - System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); - org.bukkit.craftbukkit.Main.useJline = false; - } - - try { - this.reader = new ConsoleReader(System.in, System.out); - this.reader.setExpandEvents(false); // Avoid parsing exceptions for uncommonly used event designators - } catch (Throwable e) { - try { - // Try again with jline disabled for Windows users without C++ 2008 Redistributable - System.setProperty("jline.terminal", "jline.UnsupportedTerminal"); - System.setProperty("user.language", "en"); - org.bukkit.craftbukkit.Main.useJline = false; - this.reader = new ConsoleReader(System.in, System.out); - this.reader.setExpandEvents(false); - } catch (IOException ex) { - i.warn((String) null, ex); - } - } - Runtime.getRuntime().addShutdownHook(new org.bukkit.craftbukkit.util.ServerShutdownThread(this)); - - primaryThread = new ThreadServerApplication(this, "Server thread"); // Moved from main - } - - public abstract PropertyManager getPropertyManager(); - // CraftBukkit end - - protected abstract boolean init() throws java.net.UnknownHostException; // CraftBukkit - throws UnknownHostException - - protected void a(String s) { - if (this.getConvertable().isConvertable(s)) { - i.info("Converting map!"); - this.b("menu.convertingLevel"); - this.getConvertable().convert(s, new ConvertProgressUpdater(this)); - } - } - - protected synchronized void b(String s) { - this.Q = s; - } - - protected void a(String s, String s1, long i, WorldType worldtype, String s2) { - this.a(s); - this.b("menu.loadingLevel"); - this.worldServer = new WorldServer[3]; - // this.h = new long[this.worldServer.length][100]; // CraftBukkit - Removed ticktime arrays - // IDataManager idatamanager = this.convertable.a(s, true); - // WorldData worlddata = idatamanager.getWorldData(); - /* CraftBukkit start - Removed worldsettings - WorldSettings worldsettings; - - if (worlddata == null) { - worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); - worldsettings.a(s2); - } else { - worldsettings = new WorldSettings(worlddata); - } - - if (this.L) { - worldsettings.a(); - } - // */ - int worldCount = 3; - - for (int j = 0; j < worldCount; ++j) { - WorldServer world; - int dimension = 0; - - if (j == 1) { - if (this.getAllowNether()) { - dimension = -1; - } else { - continue; - } - } - - if (j == 2) { - if (this.server.getAllowEnd()) { - dimension = 1; - } else { - continue; - } - } - - String worldType = Environment.getEnvironment(dimension).toString().toLowerCase(); - String name = (dimension == 0) ? s : s + "_" + worldType; - - org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); - WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); - worldsettings.a(s2); - - if (j == 0) { - IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), s1, true); - if (this.R()) { - world = new DemoWorldServer(this, idatamanager, s1, dimension, this.methodProfiler); - } else { - // world =, b0 to dimension, added Environment and gen - world = new WorldServer(this, idatamanager, s1, dimension, worldsettings, this.methodProfiler, Environment.getEnvironment(dimension), gen); - } - this.server.scoreboardManager = new org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager(this, world.getScoreboard()); - } else { - String dim = "DIM" + dimension; - - File newWorld = new File(new File(name), dim); - File oldWorld = new File(new File(s), dim); - - if ((!newWorld.isDirectory()) && (oldWorld.isDirectory())) { - MinecraftServer.i.info("---- Migration of old " + worldType + " folder required ----"); - MinecraftServer.i.info("Unfortunately due to the way that Minecraft implemented multiworld support in 1.6, Bukkit requires that you move your " + worldType + " folder to a new location in order to operate correctly."); - MinecraftServer.i.info("We will move this folder for you, but it will mean that you need to move it back should you wish to stop using Bukkit in the future."); - MinecraftServer.i.info("Attempting to move " + oldWorld + " to " + newWorld + "..."); - - if (newWorld.exists()) { - MinecraftServer.i.warn("A file or folder already exists at " + newWorld + "!"); - MinecraftServer.i.info("---- Migration of old " + worldType + " folder failed ----"); - } else if (newWorld.getParentFile().mkdirs()) { - if (oldWorld.renameTo(newWorld)) { - MinecraftServer.i.info("Success! To restore " + worldType + " in the future, simply move " + newWorld + " to " + oldWorld); - // Migrate world data too. - try { - com.google.common.io.Files.copy(new File(new File(s), "level.dat"), new File(new File(name), "level.dat")); - } catch (IOException exception) { - MinecraftServer.i.warn("Unable to migrate world data."); - } - MinecraftServer.i.info("---- Migration of old " + worldType + " folder complete ----"); - } else { - MinecraftServer.i.warn("Could not move folder " + oldWorld + " to " + newWorld + "!"); - MinecraftServer.i.info("---- Migration of old " + worldType + " folder failed ----"); - } - } else { - MinecraftServer.i.warn("Could not create path for " + newWorld + "!"); - MinecraftServer.i.info("---- Migration of old " + worldType + " folder failed ----"); - } - } - - IDataManager idatamanager = new ServerNBTManager(server.getWorldContainer(), name, true); - // world =, b0 to dimension, s1 to name, added Environment and gen - world = new SecondaryWorldServer(this, idatamanager, name, dimension, worldsettings, this.worlds.get(0), this.methodProfiler, Environment.getEnvironment(dimension), gen); - } - - if (gen != null) { - world.getWorld().getPopulators().addAll(gen.getDefaultPopulators(world.getWorld())); - } - - this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldInitEvent(world.getWorld())); - - world.addIWorldAccess(new WorldManager(this, world)); - if (!this.N()) { - world.getWorldData().setGameType(this.getGamemode()); - } - - this.worlds.add(world); - this.u.setPlayerFileData(this.worlds.toArray(new WorldServer[this.worlds.size()])); - // CraftBukkit end - } - - this.a(this.getDifficulty()); - this.g(); - } - - protected void g() { - boolean flag = true; - boolean flag1 = true; - boolean flag2 = true; - boolean flag3 = true; - int i = 0; - - this.b("menu.generatingTerrain"); - byte b0 = 0; - - // CraftBukkit start - fire WorldLoadEvent and handle whether or not to keep the spawn in memory - for (int m = 0; m < this.worlds.size(); ++m) { - WorldServer worldserver = this.worlds.get(m); - MinecraftServer.i.info("Preparing start region for level " + m + " (Seed: " + worldserver.getSeed() + ")"); - if (!worldserver.getWorld().getKeepSpawnInMemory()) { - continue; - } - - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - long j = ar(); - i = 0; - - for (int k = -192; k <= 192 && this.isRunning(); k += 16) { - for (int l = -192; l <= 192 && this.isRunning(); l += 16) { - long i1 = ar(); - - if (i1 - j > 1000L) { - this.a_("Preparing spawn area", i * 100 / 625); - j = i1; - } - - ++i; - worldserver.chunkProviderServer.getChunkAt(chunkcoordinates.x + k >> 4, chunkcoordinates.z + l >> 4); - } - } - } - - for (WorldServer world : this.worlds) { - this.server.getPluginManager().callEvent(new org.bukkit.event.world.WorldLoadEvent(world.getWorld())); - } - // CraftBukkit end - this.n(); - } - - public abstract boolean getGenerateStructures(); - - public abstract EnumGamemode getGamemode(); - - public abstract EnumDifficulty getDifficulty(); - - public abstract boolean isHardcore(); - - public abstract int l(); - - public abstract boolean m(); - - protected void a_(String s, int i) { - this.e = s; - this.f = i; - // CraftBukkit - Use FQN to work around decompiler issue - MinecraftServer.i.info(s + ": " + i + "%"); - } - - protected void n() { - this.e = null; - this.f = 0; - - this.server.enablePlugins(org.bukkit.plugin.PluginLoadOrder.POSTWORLD); // CraftBukkit - } - - protected void saveChunks(boolean flag) throws ExceptionWorldConflict { // CraftBukkit - added throws - if (!this.M) { - // CraftBukkit start - fire WorldSaveEvent - // WorldServer[] aworldserver = this.worldServer; - int i = this.worlds.size(); - - for (int j = 0; j < i; ++j) { - WorldServer worldserver = this.worlds.get(j); - - if (worldserver != null) { - if (!flag) { - MinecraftServer.i.info("Saving chunks for level \'" + worldserver.getWorldData().getName() + "\'/" + worldserver.worldProvider.getName()); - } - - worldserver.save(true, (IProgressUpdate) null); - worldserver.saveLevel(); - - WorldSaveEvent event = new WorldSaveEvent(worldserver.getWorld()); - this.server.getPluginManager().callEvent(event); - // CraftBukkit end - } - } - } - } - - public void stop() throws ExceptionWorldConflict { // CraftBukkit - added throws - if (!this.M) { - i.info("Stopping server"); - // CraftBukkit start - if (this.server != null) { - this.server.disablePlugins(); - } - // CraftBukkit end - - if (this.ai() != null) { - this.ai().b(); - } - - if (this.u != null) { - i.info("Saving players"); - this.u.savePlayers(); - this.u.u(); - } - - if (this.worldServer != null) { - i.info("Saving worlds"); - this.saveChunks(false); - - /* CraftBukkit start - Handled in saveChunks - for (int i = 0; i < this.worldServer.length; ++i) { - WorldServer worldserver = this.worldServer[i]; - - worldserver.saveLevel(); - } - // CraftBukkit end */ - } - - if (this.l.d()) { - this.l.e(); - } - } - } - - public String getServerIp() { - return this.serverIp; - } - - public void c(String s) { - this.serverIp = s; - } - - public boolean isRunning() { - return this.isRunning; - } - - public void safeShutdown() { - this.isRunning = false; - } - - public void run() { - try { - if (this.init()) { - long i = ar(); - long j = 0L; - - this.q.setMOTD(new ChatComponentText(this.motd)); - this.q.setServerInfo(new ServerPingServerData("1.7.10", 5)); - this.a(this.q); - - while (this.isRunning) { - long k = ar(); - long l = k - i; - - if (l > 2000L && i - this.P >= 15000L) { - if (this.server.getWarnOnOverload()) // CraftBukkit - Added option to suppress warning messages - MinecraftServer.i.warn("Can\'t keep up! Did the system time change, or is the server overloaded? Running {}ms behind, skipping {} tick(s)", new Object[] { Long.valueOf(l), Long.valueOf(l / 50L)}); - l = 2000L; - this.P = i; - } - - if (l < 0L) { - MinecraftServer.i.warn("Time ran backwards! Did the system time change?"); - l = 0L; - } - - j += l; - i = k; - if (this.worlds.get(0).everyoneDeeplySleeping()) { // CraftBukkit - this.u(); - j = 0L; - } else { - while (j > 50L) { - MinecraftServer.currentTick = (int) (System.currentTimeMillis() / 50); // CraftBukkit - j -= 50L; - this.u(); - } - } - - Thread.sleep(Math.max(1L, 50L - j)); - this.O = true; - } - } else { - this.a((CrashReport) null); - } - } catch (Throwable throwable) { - i.error("Encountered an unexpected exception", throwable); - CrashReport crashreport = null; - - if (throwable instanceof ReportedException) { - crashreport = this.b(((ReportedException) throwable).a()); - } else { - crashreport = this.b(new CrashReport("Exception in server tick loop", throwable)); - } - - File file1 = new File(new File(this.s(), "crash-reports"), "crash-" + (new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss")).format(new Date()) + "-server.txt"); - - if (crashreport.a(file1)) { - i.error("This crash report has been saved to: " + file1.getAbsolutePath()); - } else { - i.error("We were unable to save this crash report to disk."); - } - - this.a(crashreport); - } finally { - try { - this.stop(); - this.isStopped = true; - } catch (Throwable throwable1) { - i.error("Exception stopping the server", throwable1); - } finally { - // CraftBukkit start - Restore terminal to original settings - try { - this.reader.getTerminal().restore(); - } catch (Exception e) { - } - // CraftBukkit end - this.t(); - } - } - } - - private void a(ServerPing serverping) { - File file1 = this.d("server-icon.png"); - - if (file1.isFile()) { - ByteBuf bytebuf = Unpooled.buffer(); - - try { - BufferedImage bufferedimage = ImageIO.read(file1); - - Validate.validState(bufferedimage.getWidth() == 64, "Must be 64 pixels wide", new Object[0]); - Validate.validState(bufferedimage.getHeight() == 64, "Must be 64 pixels high", new Object[0]); - ImageIO.write(bufferedimage, "PNG", new ByteBufOutputStream(bytebuf)); - ByteBuf bytebuf1 = Base64.encode(bytebuf); - - serverping.setFavicon("data:image/png;base64," + bytebuf1.toString(Charsets.UTF_8)); - } catch (Exception exception) { - i.error("Couldn\'t load server icon", exception); - } finally { - bytebuf.release(); - } - } - } - - protected File s() { - return new File("."); - } - - protected void a(CrashReport crashreport) {} - - protected void t() {} - - protected void u() throws ExceptionWorldConflict { // CraftBukkit - added throws - long i = System.nanoTime(); - - ++this.ticks; - if (this.R) { - this.R = false; - this.methodProfiler.a = true; - this.methodProfiler.a(); - } - - this.methodProfiler.a("root"); - this.v(); - if (i - this.V >= 5000000000L) { - this.V = i; - this.q.setPlayerSample(new ServerPingPlayerSample(this.D(), this.C())); - GameProfile[] agameprofile = new GameProfile[Math.min(this.C(), 12)]; - int j = MathHelper.nextInt(this.r, 0, this.C() - agameprofile.length); - - for (int k = 0; k < agameprofile.length; ++k) { - agameprofile[k] = ((EntityPlayer) this.u.players.get(j + k)).getProfile(); - } - - Collections.shuffle(Arrays.asList(agameprofile)); - this.q.b().a(agameprofile); - } - - if ((this.autosavePeriod > 0) && ((this.ticks % this.autosavePeriod) == 0)) { // CraftBukkit - this.methodProfiler.a("save"); - this.u.savePlayers(); - this.saveChunks(true); - this.methodProfiler.b(); - } - - this.methodProfiler.a("tallying"); - this.g[this.ticks % 100] = System.nanoTime() - i; - this.methodProfiler.b(); - this.methodProfiler.a("snooper"); - if (!this.l.d() && this.ticks > 100) { - this.l.a(); - } - - if (this.ticks % 6000 == 0) { - this.l.b(); - } - - this.methodProfiler.b(); - this.methodProfiler.b(); - } - - public void v() { - this.methodProfiler.a("levels"); - - // CraftBukkit start - this.server.getScheduler().mainThreadHeartbeat(this.ticks); - - // Run tasks that are waiting on processing - while (!processQueue.isEmpty()) { - processQueue.remove().run(); - } - - org.bukkit.craftbukkit.chunkio.ChunkIOExecutor.tick(); - - // Send time updates to everyone, it will get the right time from the world the player is in. - if (this.ticks % 20 == 0) { - for (int i = 0; i < this.getPlayerList().players.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) this.getPlayerList().players.get(i); - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(entityplayer.world.getTime(), entityplayer.getPlayerTime(), entityplayer.world.getGameRules().getBoolean("doDaylightCycle"))); // Add support for per player time - } - } - - int i; - - for (i = 0; i < this.worlds.size(); ++i) { - long j = System.nanoTime(); - - // if (i == 0 || this.getAllowNether()) { - WorldServer worldserver = this.worlds.get(i); - - this.methodProfiler.a(worldserver.getWorldData().getName()); - this.methodProfiler.a("pools"); - this.methodProfiler.b(); - /* Drop global time updates - if (this.ticks % 20 == 0) { - this.methodProfiler.a("timeSync"); - this.t.a(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle")), worldserver.worldProvider.dimension); - this.methodProfiler.b(); - } - // CraftBukkit end */ - - this.methodProfiler.a("tick"); - - CrashReport crashreport; - - try { - worldserver.doTick(); - } catch (Throwable throwable) { - crashreport = CrashReport.a(throwable, "Exception ticking world"); - worldserver.a(crashreport); - throw new ReportedException(crashreport); - } - - try { - worldserver.tickEntities(); - } catch (Throwable throwable1) { - crashreport = CrashReport.a(throwable1, "Exception ticking world entities"); - worldserver.a(crashreport); - throw new ReportedException(crashreport); - } - - this.methodProfiler.b(); - this.methodProfiler.a("tracker"); - worldserver.getTracker().updatePlayers(); - this.methodProfiler.b(); - this.methodProfiler.b(); - // } // CraftBukkit - - // this.h[i][this.ticks % 100] = System.nanoTime() - j; // CraftBukkit - } - - this.methodProfiler.c("connection"); - this.ai().c(); - this.methodProfiler.c("players"); - this.u.tick(); - this.methodProfiler.c("tickables"); - - for (i = 0; i < this.n.size(); ++i) { - ((IUpdatePlayerListBox) this.n.get(i)).a(); - } - - this.methodProfiler.b(); - } - - public boolean getAllowNether() { - return true; - } - - public void a(IUpdatePlayerListBox iupdateplayerlistbox) { - this.n.add(iupdateplayerlistbox); - } - - public static void main(final OptionSet options) { // CraftBukkit - replaces main(String[] astring) - DispenserRegistry.b(); - - try { - /* CraftBukkit start - Replace everything - boolean flag = true; - String s = null; - String s1 = "."; - String s2 = null; - boolean flag1 = false; - boolean flag2 = false; - int i = -1; - - for (int j = 0; j < astring.length; ++j) { - String s3 = astring[j]; - String s4 = j == astring.length - 1 ? null : astring[j + 1]; - boolean flag3 = false; - - if (!s3.equals("nogui") && !s3.equals("--nogui")) { - if (s3.equals("--port") && s4 != null) { - flag3 = true; - - try { - i = Integer.parseInt(s4); - } catch (NumberFormatException numberformatexception) { - ; - } - } else if (s3.equals("--singleplayer") && s4 != null) { - flag3 = true; - s = s4; - } else if (s3.equals("--universe") && s4 != null) { - flag3 = true; - s1 = s4; - } else if (s3.equals("--world") && s4 != null) { - flag3 = true; - s2 = s4; - } else if (s3.equals("--demo")) { - flag1 = true; - } else if (s3.equals("--bonusChest")) { - flag2 = true; - } - } else { - flag = false; - } - - if (flag3) { - ++j; - } - } - - DedicatedServer dedicatedserver = new DedicatedServer(new File(s1)); - - if (s != null) { - dedicatedserver.j(s); - } - - if (s2 != null) { - dedicatedserver.k(s2); - } - - if (i >= 0) { - dedicatedserver.setPort(i); - } - - if (flag1) { - dedicatedserver.b(true); - } - - if (flag2) { - dedicatedserver.c(true); - } - - if (flag) { - dedicatedserver.aD(); - } - // */ - - DedicatedServer dedicatedserver = new DedicatedServer(options); - - if (options.has("port")) { - int port = (Integer) options.valueOf("port"); - if (port > 0) { - dedicatedserver.setPort(port); - } - } - - if (options.has("universe")) { - dedicatedserver.universe = (File) options.valueOf("universe"); - } - - if (options.has("world")) { - dedicatedserver.k((String) options.valueOf("world")); - } - - dedicatedserver.primaryThread.start(); - // Runtime.getRuntime().addShutdownHook(new ThreadShutdown("Server Shutdown Thread", dedicatedserver)); - // CraftBukkit end - } catch (Exception exception) { - i.fatal("Failed to start the minecraft server", exception); - } - } - - public void x() { - // (new ThreadServerApplication(this, "Server thread")).start(); // CraftBukkit - prevent abuse - } - - public File d(String s) { - return new File(this.s(), s); - } - - public void info(String s) { - i.info(s); - } - - public void warning(String s) { - i.warn(s); - } - - public WorldServer getWorldServer(int i) { - // CraftBukkit start - for (WorldServer world : this.worlds) { - if (world.dimension == i) { - return world; - } - } - - return this.worlds.get(0); - // CraftBukkit end - } - - public String y() { - return this.serverIp; - } - - public int z() { - return this.t; - } - - public String A() { - return this.motd; - } - - public String getVersion() { - return "1.7.10"; - } - - public int C() { - return this.u.getPlayerCount(); - } - - public int D() { - return this.u.getMaxPlayers(); - } - - public String[] getPlayers() { - return this.u.f(); - } - - public GameProfile[] F() { - return this.u.g(); - } - - public String getPlugins() { - // CraftBukkit start - Whole method - StringBuilder result = new StringBuilder(); - org.bukkit.plugin.Plugin[] plugins = server.getPluginManager().getPlugins(); - - result.append(server.getName()); - result.append(" on Bukkit "); - result.append(server.getBukkitVersion()); - - if (plugins.length > 0 && this.server.getQueryPlugins()) { - result.append(": "); - - for (int i = 0; i < plugins.length; i++) { - if (i > 0) { - result.append("; "); - } - - result.append(plugins[i].getDescription().getName()); - result.append(" "); - result.append(plugins[i].getDescription().getVersion().replaceAll(";", ",")); - } - } - - return result.toString(); - // CraftBukkit end - } - - // CraftBukkit start - fire RemoteServerCommandEvent - public String g(final String s) { // final parameter - Waitable<String> waitable = new Waitable<String>() { - @Override - protected String evaluate() { - RemoteControlCommandListener.instance.e(); - // Event changes start - RemoteServerCommandEvent event = new RemoteServerCommandEvent(MinecraftServer.this.remoteConsole, s); - MinecraftServer.this.server.getPluginManager().callEvent(event); - // Event changes end - ServerCommand servercommand = new ServerCommand(event.getCommand(), RemoteControlCommandListener.instance); - MinecraftServer.this.server.dispatchServerCommand(MinecraftServer.this.remoteConsole, servercommand); // CraftBukkit - // this.o.a(RemoteControlCommandListener.instance, s); - return RemoteControlCommandListener.instance.f(); - }}; - processQueue.add(waitable); - try { - return waitable.get(); - } catch (java.util.concurrent.ExecutionException e) { - throw new RuntimeException("Exception processing rcon command " + s, e.getCause()); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); // Maintain interrupted state - throw new RuntimeException("Interrupted processing rcon command " + s, e); - } - // CraftBukkit end - } - - public boolean isDebugging() { - return this.getPropertyManager().getBoolean("debug", false); // CraftBukkit - don't hardcode - } - - public void h(String s) { - i.error(s); - } - - public void i(String s) { - if (this.isDebugging()) { - i.info(s); - } - } - - public String getServerModName() { - return server.getName(); // CraftBukkit - cb > vanilla! - } - - public CrashReport b(CrashReport crashreport) { - crashreport.g().a("Profiler Position", (Callable) (new CrashReportProfilerPosition(this))); - if (this.worlds != null && this.worlds.size() > 0 && this.worlds.get(0) != null) { // CraftBukkit - crashreport.g().a("Vec3 Pool Size", (Callable) (new CrashReportVec3DPoolSize(this))); - } - - if (this.u != null) { - crashreport.g().a("Player Count", (Callable) (new CrashReportPlayerCount(this))); - } - - return crashreport; - } - - public List a(ICommandListener icommandlistener, String s) { - // CraftBukkit start - Allow tab-completion of Bukkit commands - /* - ArrayList arraylist = new ArrayList(); - - if (s.startsWith("/")) { - s = s.substring(1); - boolean flag = !s.contains(" "); - List list = this.o.b(icommandlistener, s); - - if (list != null) { - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - String s1 = (String) iterator.next(); - - if (flag) { - arraylist.add("/" + s1); - } else { - arraylist.add(s1); - } - } - } - - return arraylist; - } else { - String[] astring = s.split(" ", -1); - String s2 = astring[astring.length - 1]; - String[] astring1 = this.u.f(); - int i = astring1.length; - - for (int j = 0; j < i; ++j) { - String s3 = astring1[j]; - - if (CommandAbstract.a(s2, s3)) { - arraylist.add(s3); - } - } - - return arraylist; - } - */ - return this.server.tabComplete(icommandlistener, s); - // CraftBukkit end - } - - public static MinecraftServer getServer() { - return j; - } - - public String getName() { - return "Server"; - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - i.info(ichatbasecomponent.c()); - } - - public boolean a(int i, String s) { - return true; - } - - public ICommandHandler getCommandHandler() { - return this.o; - } - - public KeyPair K() { - return this.G; - } - - public int L() { - return this.t; - } - - public void setPort(int i) { - this.t = i; - } - - public String M() { - return this.H; - } - - public void j(String s) { - this.H = s; - } - - public boolean N() { - return this.H != null; - } - - public String O() { - return this.I; - } - - public void k(String s) { - this.I = s; - } - - public void a(KeyPair keypair) { - this.G = keypair; - } - - public void a(EnumDifficulty enumdifficulty) { - // CraftBukkit start - Use worlds list for iteration - for (int j = 0; j < this.worlds.size(); ++j) { - WorldServer worldserver = this.worlds.get(j); - // CraftBukkit end - - if (worldserver != null) { - if (worldserver.getWorldData().isHardcore()) { - worldserver.difficulty = EnumDifficulty.HARD; - worldserver.setSpawnFlags(true, true); - } else if (this.N()) { - worldserver.difficulty = enumdifficulty; - worldserver.setSpawnFlags(worldserver.difficulty != EnumDifficulty.PEACEFUL, true); - } else { - worldserver.difficulty = enumdifficulty; - worldserver.setSpawnFlags(this.getSpawnMonsters(), this.spawnAnimals); - } - } - } - } - - protected boolean getSpawnMonsters() { - return true; - } - - public boolean R() { - return this.demoMode; - } - - public void b(boolean flag) { - this.demoMode = flag; - } - - public void c(boolean flag) { - this.L = flag; - } - - public Convertable getConvertable() { - return this.convertable; - } - - public void U() { - this.M = true; - this.getConvertable().d(); - - // CraftBukkit start - for (int i = 0; i < this.worlds.size(); ++i) { - WorldServer worldserver = this.worlds.get(i); - // CraftBukkit end - - if (worldserver != null) { - worldserver.saveLevel(); - } - } - - this.getConvertable().e(this.worlds.get(0).getDataManager().g()); // CraftBukkit - this.safeShutdown(); - } - - public String getResourcePack() { - return this.N; - } - - public void setTexturePack(String s) { - this.N = s; - } - - public void a(MojangStatisticsGenerator mojangstatisticsgenerator) { - mojangstatisticsgenerator.a("whitelist_enabled", Boolean.valueOf(false)); - mojangstatisticsgenerator.a("whitelist_count", Integer.valueOf(0)); - mojangstatisticsgenerator.a("players_current", Integer.valueOf(this.C())); - mojangstatisticsgenerator.a("players_max", Integer.valueOf(this.D())); - mojangstatisticsgenerator.a("players_seen", Integer.valueOf(this.u.getSeenPlayers().length)); - mojangstatisticsgenerator.a("uses_auth", Boolean.valueOf(this.onlineMode)); - mojangstatisticsgenerator.a("gui_state", this.ak() ? "enabled" : "disabled"); - mojangstatisticsgenerator.a("run_time", Long.valueOf((ar() - mojangstatisticsgenerator.g()) / 60L * 1000L)); - mojangstatisticsgenerator.a("avg_tick_ms", Integer.valueOf((int) (MathHelper.a(this.g) * 1.0E-6D))); - int i = 0; - - // CraftBukkit start - use worlds list for iteration - for (int j = 0; j < this.worlds.size(); ++j) { - WorldServer worldserver = this.worlds.get(j); - if (worldServer != null) { - // CraftBukkit end - WorldData worlddata = worldserver.getWorldData(); - - mojangstatisticsgenerator.a("world[" + i + "][dimension]", Integer.valueOf(worldserver.worldProvider.dimension)); - mojangstatisticsgenerator.a("world[" + i + "][mode]", worlddata.getGameType()); - mojangstatisticsgenerator.a("world[" + i + "][difficulty]", worldserver.difficulty); - mojangstatisticsgenerator.a("world[" + i + "][hardcore]", Boolean.valueOf(worlddata.isHardcore())); - mojangstatisticsgenerator.a("world[" + i + "][generator_name]", worlddata.getType().name()); - mojangstatisticsgenerator.a("world[" + i + "][generator_version]", Integer.valueOf(worlddata.getType().getVersion())); - mojangstatisticsgenerator.a("world[" + i + "][height]", Integer.valueOf(this.E)); - mojangstatisticsgenerator.a("world[" + i + "][chunks_loaded]", Integer.valueOf(worldserver.L().getLoadedChunks())); - ++i; - } - } - - mojangstatisticsgenerator.a("worlds", Integer.valueOf(i)); - } - - public void b(MojangStatisticsGenerator mojangstatisticsgenerator) { - mojangstatisticsgenerator.b("singleplayer", Boolean.valueOf(this.N())); - mojangstatisticsgenerator.b("server_brand", this.getServerModName()); - mojangstatisticsgenerator.b("gui_supported", GraphicsEnvironment.isHeadless() ? "headless" : "supported"); - mojangstatisticsgenerator.b("dedicated", Boolean.valueOf(this.X())); - } - - public boolean getSnooperEnabled() { - return true; - } - - public abstract boolean X(); - - public boolean getOnlineMode() { - return this.server.getOnlineMode(); // CraftBukkit - } - - public void setOnlineMode(boolean flag) { - this.onlineMode = flag; - } - - public boolean getSpawnAnimals() { - return this.spawnAnimals; - } - - public void setSpawnAnimals(boolean flag) { - this.spawnAnimals = flag; - } - - public boolean getSpawnNPCs() { - return this.spawnNPCs; - } - - public void setSpawnNPCs(boolean flag) { - this.spawnNPCs = flag; - } - - public boolean getPvP() { - return this.pvpMode; - } - - public void setPvP(boolean flag) { - this.pvpMode = flag; - } - - public boolean getAllowFlight() { - return this.allowFlight; - } - - public void setAllowFlight(boolean flag) { - this.allowFlight = flag; - } - - public abstract boolean getEnableCommandBlock(); - - public String getMotd() { - return this.motd; - } - - public void setMotd(String s) { - this.motd = s; - } - - public int getMaxBuildHeight() { - return this.E; - } - - public void c(int i) { - this.E = i; - } - - public boolean isStopped() { - return this.isStopped; - } - - public PlayerList getPlayerList() { - return this.u; - } - - public void a(PlayerList playerlist) { - this.u = playerlist; - } - - public void a(EnumGamemode enumgamemode) { - // CraftBukkit start - use worlds list for iteration - for (int i = 0; i < this.worlds.size(); ++i) { - getServer().worlds.get(i).getWorldData().setGameType(enumgamemode); - // CraftBukkit end - } - } - - public ServerConnection ai() { - return this.p; - } - - public boolean ak() { - return false; - } - - public abstract String a(EnumGamemode enumgamemode, boolean flag); - - public int al() { - return this.ticks; - } - - public void am() { - this.R = true; - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(0, 0, 0); - } - - public World getWorld() { - return this.worlds.get(0); // CraftBukkit - } - - public int getSpawnProtection() { - return 16; - } - - public boolean a(World world, int i, int j, int k, EntityHuman entityhuman) { - return false; - } - - public void setForceGamemode(boolean flag) { - this.S = flag; - } - - public boolean getForceGamemode() { - return this.S; - } - - public Proxy aq() { - return this.d; - } - - public static long ar() { - return System.currentTimeMillis(); - } - - public int getIdleTimeout() { - return this.F; - } - - public void setIdleTimeout(int i) { - this.F = i; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - public boolean at() { - return true; - } - - public MinecraftSessionService av() { - return this.U; - } - - public GameProfileRepository getGameProfileRepository() { - return this.W; - } - - public UserCache getUserCache() { - return this.X; - } - - public ServerPing ay() { - return this.q; - } - - public void az() { - this.V = 0L; - } - - public static Logger getLogger() { - return i; - } - - public static PlayerList a(MinecraftServer minecraftserver) { - return minecraftserver.u; - } -} diff --git a/src/main/java/net/minecraft/server/MobEffectList.java b/src/main/java/net/minecraft/server/MobEffectList.java deleted file mode 100644 index 6ec03bbe..00000000 --- a/src/main/java/net/minecraft/server/MobEffectList.java +++ /dev/null @@ -1,231 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.Map; -import java.util.UUID; -import java.util.Map.Entry; - -import net.minecraft.util.com.google.common.collect.Maps; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; -// CraftBukkit end - -public class MobEffectList { - - public static final MobEffectList[] byId = new MobEffectList[32]; - public static final MobEffectList b = null; - public static final MobEffectList FASTER_MOVEMENT = (new MobEffectList(1, false, 8171462)).b("potion.moveSpeed").b(0, 0).a(GenericAttributes.d, "91AEAA56-376B-4498-935B-2F7F68070635", 0.20000000298023224D, 2); - public static final MobEffectList SLOWER_MOVEMENT = (new MobEffectList(2, true, 5926017)).b("potion.moveSlowdown").b(1, 0).a(GenericAttributes.d, "7107DE5E-7CE8-4030-940E-514C1F160890", -0.15000000596046448D, 2); - public static final MobEffectList FASTER_DIG = (new MobEffectList(3, false, 14270531)).b("potion.digSpeed").b(2, 0).a(1.5D); - public static final MobEffectList SLOWER_DIG = (new MobEffectList(4, true, 4866583)).b("potion.digSlowDown").b(3, 0); - public static final MobEffectList INCREASE_DAMAGE = (new MobEffectAttackDamage(5, false, 9643043)).b("potion.damageBoost").b(4, 0).a(GenericAttributes.e, "648D7064-6A60-4F59-8ABE-C2C23A6DD7A9", 3.0D, 2); - public static final MobEffectList HEAL = (new InstantMobEffect(6, false, 16262179)).b("potion.heal"); - public static final MobEffectList HARM = (new InstantMobEffect(7, true, 4393481)).b("potion.harm"); - public static final MobEffectList JUMP = (new MobEffectList(8, false, 7889559)).b("potion.jump").b(2, 1); - public static final MobEffectList CONFUSION = (new MobEffectList(9, true, 5578058)).b("potion.confusion").b(3, 1).a(0.25D); - public static final MobEffectList REGENERATION = (new MobEffectList(10, false, 13458603)).b("potion.regeneration").b(7, 0).a(0.25D); - public static final MobEffectList RESISTANCE = (new MobEffectList(11, false, 10044730)).b("potion.resistance").b(6, 1); - public static final MobEffectList FIRE_RESISTANCE = (new MobEffectList(12, false, 14981690)).b("potion.fireResistance").b(7, 1); - public static final MobEffectList WATER_BREATHING = (new MobEffectList(13, false, 3035801)).b("potion.waterBreathing").b(0, 2); - public static final MobEffectList INVISIBILITY = (new MobEffectList(14, false, 8356754)).b("potion.invisibility").b(0, 1); - public static final MobEffectList BLINDNESS = (new MobEffectList(15, true, 2039587)).b("potion.blindness").b(5, 1).a(0.25D); - public static final MobEffectList NIGHT_VISION = (new MobEffectList(16, false, 2039713)).b("potion.nightVision").b(4, 1); - public static final MobEffectList HUNGER = (new MobEffectList(17, true, 5797459)).b("potion.hunger").b(1, 1); - public static final MobEffectList WEAKNESS = (new MobEffectAttackDamage(18, true, 4738376)).b("potion.weakness").b(5, 0).a(GenericAttributes.e, "22653B89-116E-49DC-9B6B-9971489B5BE5", 2.0D, 0); - public static final MobEffectList POISON = (new MobEffectList(19, true, 5149489)).b("potion.poison").b(6, 0).a(0.25D); - public static final MobEffectList WITHER = (new MobEffectList(20, true, 3484199)).b("potion.wither").b(1, 2).a(0.25D); - public static final MobEffectList HEALTH_BOOST = (new MobEffectHealthBoost(21, false, 16284963)).b("potion.healthBoost").b(2, 2).a(GenericAttributes.maxHealth, "5D6F0BA2-1186-46AC-B896-C61C5CEE99CC", 4.0D, 0); - public static final MobEffectList ABSORPTION = (new MobEffectAbsorption(22, false, 2445989)).b("potion.absorption").b(2, 2); - public static final MobEffectList SATURATION = (new InstantMobEffect(23, false, 16262179)).b("potion.saturation"); - public static final MobEffectList z = null; - public static final MobEffectList A = null; - public static final MobEffectList B = null; - public static final MobEffectList C = null; - public static final MobEffectList D = null; - public static final MobEffectList E = null; - public static final MobEffectList F = null; - public static final MobEffectList G = null; - public final int id; - private final Map I = Maps.newHashMap(); - private final boolean J; - private final int K; - private String L = ""; - private int M = -1; - private double N; - private boolean O; - - protected MobEffectList(int i, boolean flag, int j) { - this.id = i; - byId[i] = this; - this.J = flag; - if (flag) { - this.N = 0.5D; - } else { - this.N = 1.0D; - } - - this.K = j; - - org.bukkit.potion.PotionEffectType.registerPotionEffectType(new org.bukkit.craftbukkit.potion.CraftPotionEffectType(this)); // CraftBukkit - } - - protected MobEffectList b(int i, int j) { - this.M = i + j * 8; - return this; - } - - public int getId() { - return this.id; - } - - public void tick(EntityLiving entityliving, int i) { - if (this.id == REGENERATION.id) { - if (entityliving.getHealth() < entityliving.getMaxHealth()) { - entityliving.heal(1.0F, RegainReason.MAGIC_REGEN); // CraftBukkit - } - } else if (this.id == POISON.id) { - if (entityliving.getHealth() > 1.0F) { - entityliving.damageEntity(CraftEventFactory.POISON, 1.0F); // CraftBukkit - DamageSource.MAGIC -> CraftEventFactory.POISON - } - } else if (this.id == WITHER.id) { - entityliving.damageEntity(DamageSource.WITHER, 1.0F); - } else if (this.id == HUNGER.id && entityliving instanceof EntityHuman) { - ((EntityHuman) entityliving).applyExhaustion(0.025F * (float) (i + 1)); - } else if (this.id == SATURATION.id && entityliving instanceof EntityHuman) { - if (!entityliving.world.isStatic) { - // CraftBukkit start - EntityHuman entityhuman = (EntityHuman) entityliving; - int oldFoodLevel = entityhuman.getFoodData().foodLevel; - - org.bukkit.event.entity.FoodLevelChangeEvent event = CraftEventFactory.callFoodLevelChangeEvent(entityhuman, i + 1 + oldFoodLevel); - - if (!event.isCancelled()) { - entityhuman.getFoodData().eat(event.getFoodLevel() - oldFoodLevel, 1.0F); - } - - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutUpdateHealth(((EntityPlayer) entityhuman).getBukkitEntity().getScaledHealth(), entityhuman.getFoodData().foodLevel, entityhuman.getFoodData().saturationLevel)); - // CraftBukkit end - } - } else if ((this.id != HEAL.id || entityliving.aR()) && (this.id != HARM.id || !entityliving.aR())) { - if (this.id == HARM.id && !entityliving.aR() || this.id == HEAL.id && entityliving.aR()) { - entityliving.damageEntity(DamageSource.MAGIC, (float) (6 << i)); - } - } else { - entityliving.heal((float) Math.max(4 << i, 0), RegainReason.MAGIC); // CraftBukkit - } - } - - public void applyInstantEffect(EntityLiving entityliving, EntityLiving entityliving1, int i, double d0) { - // CraftBukkit start - Delegate; we need EntityPotion - applyInstantEffect(entityliving, entityliving1, i, d0, null); - } - - public void applyInstantEffect(EntityLiving entityliving, EntityLiving entityliving1, int i, double d0, EntityPotion potion) { - // CraftBukkit end - int j; - - if ((this.id != HEAL.id || entityliving1.aR()) && (this.id != HARM.id || !entityliving1.aR())) { - if (this.id == HARM.id && !entityliving1.aR() || this.id == HEAL.id && entityliving1.aR()) { - j = (int) (d0 * (double) (6 << i) + 0.5D); - if (entityliving == null) { - entityliving1.damageEntity(DamageSource.MAGIC, (float) j); - } else { - // CraftBukkit - The "damager" needs to be the potion - entityliving1.damageEntity(DamageSource.b(potion != null ? potion : entityliving1, entityliving), (float) j); - } - } - } else { - j = (int) (d0 * (double) (4 << i) + 0.5D); - entityliving1.heal((float) j, RegainReason.MAGIC); // CraftBukkit - } - } - - public boolean isInstant() { - return false; - } - - public boolean a(int i, int j) { - int k; - - if (this.id == REGENERATION.id) { - k = 50 >> j; - return k > 0 ? i % k == 0 : true; - } else if (this.id == POISON.id) { - k = 25 >> j; - return k > 0 ? i % k == 0 : true; - } else if (this.id == WITHER.id) { - k = 40 >> j; - return k > 0 ? i % k == 0 : true; - } else { - return this.id == HUNGER.id; - } - } - - public MobEffectList b(String s) { - this.L = s; - return this; - } - - public String a() { - return this.L; - } - - protected MobEffectList a(double d0) { - this.N = d0; - return this; - } - - public double getDurationModifier() { - return this.N; - } - - public boolean i() { - return this.O; - } - - public int j() { - return this.K; - } - - public MobEffectList a(IAttribute iattribute, String s, double d0, int i) { - AttributeModifier attributemodifier = new AttributeModifier(UUID.fromString(s), this.a(), d0, i); - - this.I.put(iattribute, attributemodifier); - return this; - } - - public void a(EntityLiving entityliving, AttributeMapBase attributemapbase, int i) { - Iterator iterator = this.I.entrySet().iterator(); - - while (iterator.hasNext()) { - Entry entry = (Entry) iterator.next(); - AttributeInstance attributeinstance = attributemapbase.a((IAttribute) entry.getKey()); - - if (attributeinstance != null) { - attributeinstance.b((AttributeModifier) entry.getValue()); - } - } - } - - public void b(EntityLiving entityliving, AttributeMapBase attributemapbase, int i) { - Iterator iterator = this.I.entrySet().iterator(); - - while (iterator.hasNext()) { - Entry entry = (Entry) iterator.next(); - AttributeInstance attributeinstance = attributemapbase.a((IAttribute) entry.getKey()); - - if (attributeinstance != null) { - AttributeModifier attributemodifier = (AttributeModifier) entry.getValue(); - - attributeinstance.b(attributemodifier); - attributeinstance.a(new AttributeModifier(attributemodifier.a(), this.a() + " " + i, this.a(i, attributemodifier), attributemodifier.c())); - } - } - } - - public double a(int i, AttributeModifier attributemodifier) { - return attributemodifier.d() * (double) (i + 1); - } -} diff --git a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java b/src/main/java/net/minecraft/server/MobSpawnerAbstract.java deleted file mode 100644 index 93bb1adc..00000000 --- a/src/main/java/net/minecraft/server/MobSpawnerAbstract.java +++ /dev/null @@ -1,286 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -import org.bukkit.event.entity.CreatureSpawnEvent; // CraftBukkit - -public abstract class MobSpawnerAbstract { - - public int spawnDelay = 20; - private String mobName = "Pig"; - private List mobs; - private TileEntityMobSpawnerData spawnData; - public double c; - public double d; - private int minSpawnDelay = 200; - private int maxSpawnDelay = 800; - private int spawnCount = 4; - private Entity j; - private int maxNearbyEntities = 6; - private int requiredPlayerRange = 16; - private int spawnRange = 4; - - public MobSpawnerAbstract() {} - - public String getMobName() { - if (this.i() == null) { - if (this.mobName.equals("Minecart")) { - this.mobName = "MinecartRideable"; - } - - return this.mobName; - } else { - return this.i().c; - } - } - - public void setMobName(String s) { - this.mobName = s; - } - - public boolean f() { - return this.a().findNearbyPlayer((double) this.b() + 0.5D, (double) this.c() + 0.5D, (double) this.d() + 0.5D, (double) this.requiredPlayerRange) != null; - } - - public void g() { - if (this.f()) { - double d0; - - if (this.a().isStatic) { - double d1 = (double) ((float) this.b() + this.a().random.nextFloat()); - double d2 = (double) ((float) this.c() + this.a().random.nextFloat()); - - d0 = (double) ((float) this.d() + this.a().random.nextFloat()); - this.a().addParticle("smoke", d1, d2, d0, 0.0D, 0.0D, 0.0D); - this.a().addParticle("flame", d1, d2, d0, 0.0D, 0.0D, 0.0D); - if (this.spawnDelay > 0) { - --this.spawnDelay; - } - - this.d = this.c; - this.c = (this.c + (double) (1000.0F / ((float) this.spawnDelay + 200.0F))) % 360.0D; - } else { - if (this.spawnDelay == -1) { - this.j(); - } - - if (this.spawnDelay > 0) { - --this.spawnDelay; - return; - } - - boolean flag = false; - - for (int i = 0; i < this.spawnCount; ++i) { - Entity entity = EntityTypes.createEntityByName(this.getMobName(), this.a()); - - if (entity == null) { - return; - } - - int j = this.a().a(entity.getClass(), AxisAlignedBB.a((double) this.b(), (double) this.c(), (double) this.d(), (double) (this.b() + 1), (double) (this.c() + 1), (double) (this.d() + 1)).grow((double) (this.spawnRange * 2), 4.0D, (double) (this.spawnRange * 2))).size(); - - if (j >= this.maxNearbyEntities) { - this.j(); - return; - } - - d0 = (double) this.b() + (this.a().random.nextDouble() - this.a().random.nextDouble()) * (double) this.spawnRange; - double d3 = (double) (this.c() + this.a().random.nextInt(3) - 1); - double d4 = (double) this.d() + (this.a().random.nextDouble() - this.a().random.nextDouble()) * (double) this.spawnRange; - EntityInsentient entityinsentient = entity instanceof EntityInsentient ? (EntityInsentient) entity : null; - - entity.setPositionRotation(d0, d3, d4, this.a().random.nextFloat() * 360.0F, 0.0F); - if (entityinsentient == null || entityinsentient.canSpawn()) { - this.a(entity); - this.a().triggerEffect(2004, this.b(), this.c(), this.d(), 0); - if (entityinsentient != null) { - entityinsentient.s(); - } - - flag = true; - } - } - - if (flag) { - this.j(); - } - } - } - } - - public Entity a(Entity entity) { - if (this.i() != null) { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - entity.d(nbttagcompound); - Iterator iterator = this.i().b.c().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - NBTBase nbtbase = this.i().b.get(s); - - nbttagcompound.set(s, nbtbase.clone()); - } - - entity.f(nbttagcompound); - if (entity.world != null) { - entity.world.addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - NBTTagCompound nbttagcompound1; - - for (Entity entity1 = entity; nbttagcompound.hasKeyOfType("Riding", 10); nbttagcompound = nbttagcompound1) { - nbttagcompound1 = nbttagcompound.getCompound("Riding"); - Entity entity2 = EntityTypes.createEntityByName(nbttagcompound1.getString("id"), entity.world); - - if (entity2 != null) { - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - entity2.d(nbttagcompound2); - Iterator iterator1 = nbttagcompound1.c().iterator(); - - while (iterator1.hasNext()) { - String s1 = (String) iterator1.next(); - NBTBase nbtbase1 = nbttagcompound1.get(s1); - - nbttagcompound2.set(s1, nbtbase1.clone()); - } - - entity2.f(nbttagcompound2); - entity2.setPositionRotation(entity1.locX, entity1.locY, entity1.locZ, entity1.yaw, entity1.pitch); - if (entity.world != null) { - entity.world.addEntity(entity2, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - entity1.mount(entity2); - } - - entity1 = entity2; - } - } else if (entity instanceof EntityLiving && entity.world != null) { - ((EntityInsentient) entity).prepare((GroupDataEntity) null); - this.a().addEntity(entity, CreatureSpawnEvent.SpawnReason.SPAWNER); // CraftBukkit - } - - return entity; - } - - private void j() { - if (this.maxSpawnDelay <= this.minSpawnDelay) { - this.spawnDelay = this.minSpawnDelay; - } else { - int i = this.maxSpawnDelay - this.minSpawnDelay; - - this.spawnDelay = this.minSpawnDelay + this.a().random.nextInt(i); - } - - if (this.mobs != null && this.mobs.size() > 0) { - this.a((TileEntityMobSpawnerData) WeightedRandom.a(this.a().random, (Collection) this.mobs)); - } - - this.a(1); - } - - public void a(NBTTagCompound nbttagcompound) { - this.mobName = nbttagcompound.getString("EntityId"); - this.spawnDelay = nbttagcompound.getShort("Delay"); - if (nbttagcompound.hasKeyOfType("SpawnPotentials", 9)) { - this.mobs = new ArrayList(); - NBTTagList nbttaglist = nbttagcompound.getList("SpawnPotentials", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - this.mobs.add(new TileEntityMobSpawnerData(this, nbttaglist.get(i))); - } - } else { - this.mobs = null; - } - - if (nbttagcompound.hasKeyOfType("SpawnData", 10)) { - this.a(new TileEntityMobSpawnerData(this, nbttagcompound.getCompound("SpawnData"), this.mobName)); - } else { - this.a((TileEntityMobSpawnerData) null); - } - - if (nbttagcompound.hasKeyOfType("MinSpawnDelay", 99)) { - this.minSpawnDelay = nbttagcompound.getShort("MinSpawnDelay"); - this.maxSpawnDelay = nbttagcompound.getShort("MaxSpawnDelay"); - this.spawnCount = nbttagcompound.getShort("SpawnCount"); - } - - if (nbttagcompound.hasKeyOfType("MaxNearbyEntities", 99)) { - this.maxNearbyEntities = nbttagcompound.getShort("MaxNearbyEntities"); - this.requiredPlayerRange = nbttagcompound.getShort("RequiredPlayerRange"); - } - - if (nbttagcompound.hasKeyOfType("SpawnRange", 99)) { - this.spawnRange = nbttagcompound.getShort("SpawnRange"); - } - - if (this.a() != null && this.a().isStatic) { - this.j = null; - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setString("EntityId", this.getMobName()); - nbttagcompound.setShort("Delay", (short) this.spawnDelay); - nbttagcompound.setShort("MinSpawnDelay", (short) this.minSpawnDelay); - nbttagcompound.setShort("MaxSpawnDelay", (short) this.maxSpawnDelay); - nbttagcompound.setShort("SpawnCount", (short) this.spawnCount); - nbttagcompound.setShort("MaxNearbyEntities", (short) this.maxNearbyEntities); - nbttagcompound.setShort("RequiredPlayerRange", (short) this.requiredPlayerRange); - nbttagcompound.setShort("SpawnRange", (short) this.spawnRange); - if (this.i() != null) { - nbttagcompound.set("SpawnData", this.i().b.clone()); - } - - if (this.i() != null || this.mobs != null && this.mobs.size() > 0) { - NBTTagList nbttaglist = new NBTTagList(); - - if (this.mobs != null && this.mobs.size() > 0) { - Iterator iterator = this.mobs.iterator(); - - while (iterator.hasNext()) { - TileEntityMobSpawnerData tileentitymobspawnerdata = (TileEntityMobSpawnerData) iterator.next(); - - nbttaglist.add(tileentitymobspawnerdata.a()); - } - } else { - nbttaglist.add(this.i().a()); - } - - nbttagcompound.set("SpawnPotentials", nbttaglist); - } - } - - public boolean b(int i) { - if (i == 1 && this.a().isStatic) { - this.spawnDelay = this.minSpawnDelay; - return true; - } else { - return false; - } - } - - public TileEntityMobSpawnerData i() { - return this.spawnData; - } - - public void a(TileEntityMobSpawnerData tileentitymobspawnerdata) { - this.spawnData = tileentitymobspawnerdata; - } - - public abstract void a(int i); - - public abstract World a(); - - public abstract int b(); - - public abstract int c(); - - public abstract int d(); -} diff --git a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java b/src/main/java/net/minecraft/server/NameReferencingFileConverter.java deleted file mode 100644 index ce66cca1..00000000 --- a/src/main/java/net/minecraft/server/NameReferencingFileConverter.java +++ /dev/null @@ -1,402 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.UUID; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Iterators; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.com.google.common.collect.Maps; -import net.minecraft.util.com.google.common.io.Files; -import net.minecraft.util.com.mojang.authlib.Agent; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.ProfileLookupCallback; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit - Imported for package private static methods - -public class NameReferencingFileConverter { - - private static final Logger e = LogManager.getLogger(); - public static final File a = new File("banned-ips.txt"); - public static final File b = new File("banned-players.txt"); - public static final File c = new File("ops.txt"); - public static final File d = new File("white-list.txt"); - - static List a(File file1, Map map) throws IOException { // CraftBukkit - Added throws - List list = Files.readLines(file1, Charsets.UTF_8); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - s = s.trim(); - if (!s.startsWith("#") && s.length() >= 1) { - String[] astring = s.split("\\|"); - - map.put(astring[0].toLowerCase(Locale.ROOT), astring); - } - } - - return list; - } - - private static void a(MinecraftServer minecraftserver, Collection collection, ProfileLookupCallback profilelookupcallback) { - String[] astring = (String[]) Iterators.toArray(Iterators.filter(collection.iterator(), new PredicateEmptyList()), String.class); - - if (minecraftserver.getOnlineMode()) { - minecraftserver.getGameProfileRepository().findProfilesByNames(astring, Agent.MINECRAFT, profilelookupcallback); - } else { - String[] astring1 = astring; - int i = astring.length; - - for (int j = 0; j < i; ++j) { - String s = astring1[j]; - UUID uuid = EntityHuman.a(new GameProfile((UUID) null, s)); - GameProfile gameprofile = new GameProfile(uuid, s); - - profilelookupcallback.onProfileLookupSucceeded(gameprofile); - } - } - } - - public static boolean a(MinecraftServer minecraftserver) { - GameProfileBanList gameprofilebanlist = new GameProfileBanList(PlayerList.a); - - if (b.exists() && b.isFile()) { - if (gameprofilebanlist.c().exists()) { - try { - gameprofilebanlist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + gameprofilebanlist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - HashMap hashmap = Maps.newHashMap(); - - a(b, (Map) hashmap); - GameProfileBanListEntryConverter gameprofilebanlistentryconverter = new GameProfileBanListEntryConverter(minecraftserver, hashmap, gameprofilebanlist); - - a(minecraftserver, hashmap.keySet(), gameprofilebanlistentryconverter); - gameprofilebanlist.save(); - c(b); - return true; - } catch (IOException ioexception) { - e.warn("Could not read old user banlist to convert it!", ioexception); - return false; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - public static boolean b(MinecraftServer minecraftserver) { - IpBanList ipbanlist = new IpBanList(PlayerList.b); - - if (a.exists() && a.isFile()) { - if (ipbanlist.c().exists()) { - try { - ipbanlist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + ipbanlist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - HashMap hashmap = Maps.newHashMap(); - - a(a, (Map) hashmap); - Iterator iterator = hashmap.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - String[] astring = (String[]) hashmap.get(s); - Date date = astring.length > 1 ? b(astring[1], (Date) null) : null; - String s1 = astring.length > 2 ? astring[2] : null; - Date date1 = astring.length > 3 ? b(astring[3], (Date) null) : null; - String s2 = astring.length > 4 ? astring[4] : null; - - ipbanlist.add(new IpBanEntry(s, date, s1, date1, s2)); - } - - ipbanlist.save(); - c(a); - return true; - } catch (IOException ioexception) { - e.warn("Could not parse old ip banlist to convert it!", ioexception); - return false; - } - } else { - return true; - } - } - - public static boolean c(MinecraftServer minecraftserver) { - OpList oplist = new OpList(PlayerList.c); - - if (c.exists() && c.isFile()) { - if (oplist.c().exists()) { - try { - oplist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + oplist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - List list = Files.readLines(c, Charsets.UTF_8); - OpListProfileCallback oplistprofilecallback = new OpListProfileCallback(minecraftserver, oplist); - - a(minecraftserver, list, oplistprofilecallback); - oplist.save(); - c(c); - return true; - } catch (IOException ioexception) { - e.warn("Could not read old oplist to convert it!", ioexception); - return false; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - public static boolean d(MinecraftServer minecraftserver) { - WhiteList whitelist = new WhiteList(PlayerList.d); - - if (d.exists() && d.isFile()) { - if (whitelist.c().exists()) { - try { - whitelist.load(); - // CraftBukkit start - FileNotFoundException -> IOException, don't print stacetrace - } catch (IOException filenotfoundexception) { - e.warn("Could not load existing file " + whitelist.c().getName() + ", " + filenotfoundexception.getMessage()); - } - // CraftBukkit end - } - - try { - List list = Files.readLines(d, Charsets.UTF_8); - WhiteListProfileCallback whitelistprofilecallback = new WhiteListProfileCallback(minecraftserver, whitelist); - - a(minecraftserver, list, whitelistprofilecallback); - whitelist.save(); - c(d); - return true; - } catch (IOException ioexception) { - e.warn("Could not read old whitelist to convert it!", ioexception); - return false; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - public static String a(String s) { - if (!UtilColor.b(s) && s.length() <= 16) { - MinecraftServer minecraftserver = MinecraftServer.getServer(); - GameProfile gameprofile = minecraftserver.getUserCache().getProfile(s); - - if (gameprofile != null && gameprofile.getId() != null) { - return gameprofile.getId().toString(); - } else if (!minecraftserver.N() && minecraftserver.getOnlineMode()) { - ArrayList arraylist = Lists.newArrayList(); - GameProfileLookupCallback gameprofilelookupcallback = new GameProfileLookupCallback(minecraftserver, arraylist); - - a(minecraftserver, Lists.newArrayList(new String[] { s}), gameprofilelookupcallback); - return arraylist.size() > 0 && ((GameProfile) arraylist.get(0)).getId() != null ? ((GameProfile) arraylist.get(0)).getId().toString() : ""; - } else { - return EntityHuman.a(new GameProfile((UUID) null, s)).toString(); - } - } else { - return s; - } - } - - public static boolean a(DedicatedServer dedicatedserver, PropertyManager propertymanager) { - File file1 = d(propertymanager); - File file2 = new File(file1.getParentFile(), "playerdata"); - File file3 = new File(file1.getParentFile(), "unknownplayers"); - - if (file1.exists() && file1.isDirectory()) { - File[] afile = file1.listFiles(); - ArrayList arraylist = Lists.newArrayList(); - File[] afile1 = afile; - int i = afile.length; - - for (int j = 0; j < i; ++j) { - File file4 = afile1[j]; - String s = file4.getName(); - - if (s.toLowerCase(Locale.ROOT).endsWith(".dat")) { - String s1 = s.substring(0, s.length() - ".dat".length()); - - if (s1.length() > 0) { - arraylist.add(s1); - } - } - } - - try { - String[] astring = (String[]) arraylist.toArray(new String[arraylist.size()]); - PlayerDatFileConverter playerdatfileconverter = new PlayerDatFileConverter(dedicatedserver, file2, file3, file1, astring); - - a(dedicatedserver, Lists.newArrayList(astring), playerdatfileconverter); - return true; - } catch (FileConversionException fileconversionexception) { - e.error("Conversion failed, please try again later", fileconversionexception); - return false; - } - } else { - return true; - } - } - - private static void b(File file1) { - if (file1.exists()) { - if (!file1.isDirectory()) { - throw new FileConversionException("Can\'t create directory " + file1.getName() + " in world save directory.", (PredicateEmptyList) null); - } - } else if (!file1.mkdirs()) { - throw new FileConversionException("Can\'t create directory " + file1.getName() + " in world save directory.", (PredicateEmptyList) null); - } - } - - public static boolean a(PropertyManager propertymanager) { - boolean flag = b(propertymanager); - - flag = flag && c(propertymanager); - return flag; - } - - private static boolean b(PropertyManager propertymanager) { - boolean flag = false; - - if (b.exists() && b.isFile()) { - flag = true; - } - - boolean flag1 = false; - - if (a.exists() && a.isFile()) { - flag1 = true; - } - - boolean flag2 = false; - - if (c.exists() && c.isFile()) { - flag2 = true; - } - - boolean flag3 = false; - - if (d.exists() && d.isFile()) { - flag3 = true; - } - - if (!flag && !flag1 && !flag2 && !flag3) { - return true; - } else { - e.warn("**** FAILED TO START THE SERVER AFTER ACCOUNT CONVERSION!"); - e.warn("** please remove the following files and restart the server:"); - if (flag) { - e.warn("* " + b.getName()); - } - - if (flag1) { - e.warn("* " + a.getName()); - } - - if (flag2) { - e.warn("* " + c.getName()); - } - - if (flag3) { - e.warn("* " + d.getName()); - } - - return false; - } - } - - private static boolean c(PropertyManager propertymanager) { - File file1 = d(propertymanager); - - if (file1.exists() && file1.isDirectory()) { - String[] astring = file1.list(new DatFilenameFilter()); - - if (astring.length > 0) { - e.warn("**** DETECTED OLD PLAYER FILES IN THE WORLD SAVE"); - e.warn("**** THIS USUALLY HAPPENS WHEN THE AUTOMATIC CONVERSION FAILED IN SOME WAY"); - e.warn("** please restart the server and if the problem persists, remove the directory \'{}\'", new Object[] { file1.getPath()}); - return false; - } - } - - return true; - } - - private static File d(PropertyManager propertymanager) { - String s = propertymanager.getString("level-name", "world"); - File file1 = new File(MinecraftServer.getServer().server.getWorldContainer(), s); // CraftBukkit - Respect container setting - - return new File(file1, "players"); - } - - private static void c(File file1) { - File file2 = new File(file1.getName() + ".converted"); - - file1.renameTo(file2); - } - - private static Date b(String s, Date date) { - Date date1; - - try { - date1 = ExpirableListEntry.a.parse(s); - } catch (ParseException parseexception) { - date1 = date; - } - - return date1; - } - - static Logger a() { - return e; - } - - static Date a(String s, Date date) { - return b(s, date); - } - - static void a(File file1) { - b(file1); - } -} diff --git a/src/main/java/net/minecraft/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java deleted file mode 100644 index 1b080c77..00000000 --- a/src/main/java/net/minecraft/server/NetworkManager.java +++ /dev/null @@ -1,210 +0,0 @@ -package net.minecraft.server; - -import java.net.SocketAddress; -import java.util.Queue; -import javax.crypto.SecretKey; - -import net.minecraft.util.com.google.common.collect.Queues; -import net.minecraft.util.com.google.common.util.concurrent.ThreadFactoryBuilder; -import net.minecraft.util.io.netty.channel.Channel; -import net.minecraft.util.io.netty.channel.ChannelFutureListener; -import net.minecraft.util.io.netty.channel.ChannelHandlerContext; -import net.minecraft.util.io.netty.channel.SimpleChannelInboundHandler; -import net.minecraft.util.io.netty.channel.local.LocalChannel; -import net.minecraft.util.io.netty.channel.local.LocalServerChannel; -import net.minecraft.util.io.netty.channel.nio.NioEventLoopGroup; -import net.minecraft.util.io.netty.handler.timeout.TimeoutException; -import net.minecraft.util.io.netty.util.AttributeKey; -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.util.org.apache.commons.lang3.Validate; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.apache.logging.log4j.Marker; -import org.apache.logging.log4j.MarkerManager; - -public class NetworkManager extends SimpleChannelInboundHandler { - - private static final Logger i = LogManager.getLogger(); - public static final Marker a = MarkerManager.getMarker("NETWORK"); - public static final Marker b = MarkerManager.getMarker("NETWORK_PACKETS", a); - public static final Marker c = MarkerManager.getMarker("NETWORK_STAT", a); - public static final AttributeKey d = new AttributeKey("protocol"); - public static final AttributeKey e = new AttributeKey("receivable_packets"); - public static final AttributeKey f = new AttributeKey("sendable_packets"); - public static final NioEventLoopGroup g = new NioEventLoopGroup(0, (new ThreadFactoryBuilder()).setNameFormat("Netty Client IO #%d").setDaemon(true).build()); - public static final NetworkStatistics h = new NetworkStatistics(); - private final boolean j; - private final Queue k = Queues.newConcurrentLinkedQueue(); - private final Queue l = Queues.newConcurrentLinkedQueue(); - private Channel m; - private SocketAddress n; - private PacketListener o; - private EnumProtocol p; - private IChatBaseComponent q; - private boolean r; - - public NetworkManager(boolean flag) { - this.j = flag; - } - - public void channelActive(ChannelHandlerContext channelhandlercontext) throws Exception { // CraftBukkit - throws Exception - super.channelActive(channelhandlercontext); - this.m = channelhandlercontext.channel(); - this.n = this.m.remoteAddress(); - this.a(EnumProtocol.HANDSHAKING); - } - - public void a(EnumProtocol enumprotocol) { - this.p = (EnumProtocol) this.m.attr(d).getAndSet(enumprotocol); - this.m.attr(e).set(enumprotocol.a(this.j)); - this.m.attr(f).set(enumprotocol.b(this.j)); - this.m.config().setAutoRead(true); - i.debug("Enabled auto read"); - } - - public void channelInactive(ChannelHandlerContext channelhandlercontext) { - this.close(new ChatMessage("disconnect.endOfStream", new Object[0])); - } - - public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) { - ChatMessage chatmessage; - - if (throwable instanceof TimeoutException) { - chatmessage = new ChatMessage("disconnect.timeout", new Object[0]); - } else { - chatmessage = new ChatMessage("disconnect.genericReason", new Object[] { "Internal Exception: " + throwable}); - } - - this.close(chatmessage); - } - - protected void a(ChannelHandlerContext channelhandlercontext, Packet packet) { - if (this.m.isOpen()) { - if (packet.a()) { - packet.handle(this.o); - } else { - this.k.add(packet); - } - } - } - - public void a(PacketListener packetlistener) { - Validate.notNull(packetlistener, "packetListener", new Object[0]); - i.debug("Set listener of {} to {}", new Object[] { this, packetlistener}); - this.o = packetlistener; - } - - public void handle(Packet packet, GenericFutureListener... agenericfuturelistener) { - if (this.m != null && this.m.isOpen()) { - this.i(); - this.b(packet, agenericfuturelistener); - } else { - this.l.add(new QueuedPacket(packet, agenericfuturelistener)); - } - } - - private void b(Packet packet, GenericFutureListener[] agenericfuturelistener) { - EnumProtocol enumprotocol = EnumProtocol.a(packet); - EnumProtocol enumprotocol1 = (EnumProtocol) this.m.attr(d).get(); - - if (enumprotocol1 != enumprotocol) { - i.debug("Disabled auto read"); - this.m.config().setAutoRead(false); - } - - if (this.m.eventLoop().inEventLoop()) { - if (enumprotocol != enumprotocol1) { - this.a(enumprotocol); - } - - this.m.writeAndFlush(packet).addListeners(agenericfuturelistener).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE); - } else { - this.m.eventLoop().execute(new QueuedProtocolSwitch(this, enumprotocol, enumprotocol1, packet, agenericfuturelistener)); - } - } - - private void i() { - if (this.m != null && this.m.isOpen()) { - while (!this.l.isEmpty()) { - QueuedPacket queuedpacket = (QueuedPacket) this.l.poll(); - - this.b(QueuedPacket.a(queuedpacket), QueuedPacket.b(queuedpacket)); - } - } - } - - public void a() { - this.i(); - EnumProtocol enumprotocol = (EnumProtocol) this.m.attr(d).get(); - - if (this.p != enumprotocol) { - if (this.p != null) { - this.o.a(this.p, enumprotocol); - } - - this.p = enumprotocol; - } - - if (this.o != null) { - for (int i = 1000; !this.k.isEmpty() && i >= 0; --i) { - Packet packet = (Packet) this.k.poll(); - - // CraftBukkit start - if (!this.isConnected() || !this.m.config().isAutoRead()) { - continue; - } - // CraftBukkit end - packet.handle(this.o); - } - - this.o.a(); - } - - this.m.flush(); - } - - public SocketAddress getSocketAddress() { - return this.n; - } - - public void close(IChatBaseComponent ichatbasecomponent) { - if (this.m.isOpen()) { - this.m.close(); - this.q = ichatbasecomponent; - } - } - - public boolean c() { - return this.m instanceof LocalChannel || this.m instanceof LocalServerChannel; - } - - public void a(SecretKey secretkey) { - this.m.pipeline().addBefore("splitter", "decrypt", new PacketDecrypter(MinecraftEncryption.a(2, secretkey))); - this.m.pipeline().addBefore("prepender", "encrypt", new PacketEncrypter(MinecraftEncryption.a(1, secretkey))); - this.r = true; - } - - public boolean isConnected() { - return this.m != null && this.m.isOpen(); - } - - public PacketListener getPacketListener() { - return this.o; - } - - public IChatBaseComponent f() { - return this.q; - } - - public void g() { - this.m.config().setAutoRead(false); - } - - protected void channelRead0(ChannelHandlerContext channelhandlercontext, Object object) { - this.a(channelhandlercontext, (Packet) object); - } - - static Channel a(NetworkManager networkmanager) { - return networkmanager.m; - } -} diff --git a/src/main/java/net/minecraft/server/Packet.java b/src/main/java/net/minecraft/server/Packet.java deleted file mode 100644 index 592ffc58..00000000 --- a/src/main/java/net/minecraft/server/Packet.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; - -import net.minecraft.util.com.google.common.collect.BiMap; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public abstract class Packet { - - private static final Logger a = LogManager.getLogger(); - public final long timestamp = System.currentTimeMillis(); // CraftBukkit - - public Packet() {} - - public static Packet a(BiMap bimap, int i) { - try { - Class oclass = (Class) bimap.get(Integer.valueOf(i)); - - return oclass == null ? null : (Packet) oclass.newInstance(); - } catch (Exception exception) { - a.error("Couldn\'t create packet " + i, exception); - return null; - } - } - - public static void a(ByteBuf bytebuf, byte[] abyte) { - bytebuf.writeShort(abyte.length); - bytebuf.writeBytes(abyte); - } - - public static byte[] a(ByteBuf bytebuf) throws IOException { // CraftBukkit - added throws - short short1 = bytebuf.readShort(); - - if (short1 < 0) { - throw new IOException("Key was smaller than nothing! Weird key!"); - } else { - byte[] abyte = new byte[short1]; - - bytebuf.readBytes(abyte); - return abyte; - } - } - - public abstract void a(PacketDataSerializer packetdataserializer) throws IOException; // CraftBukkit - added throws - - public abstract void b(PacketDataSerializer packetdataserializer) throws IOException; // CraftBukkit - added throws - - public abstract void handle(PacketListener packetlistener); - - public boolean a() { - return false; - } - - public String toString() { - return this.getClass().getSimpleName(); - } - - public String b() { - return ""; - } -} diff --git a/src/main/java/net/minecraft/server/PacketDataSerializer.java b/src/main/java/net/minecraft/server/PacketDataSerializer.java deleted file mode 100644 index 8d3cf1f9..00000000 --- a/src/main/java/net/minecraft/server/PacketDataSerializer.java +++ /dev/null @@ -1,726 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.channels.GatheringByteChannel; -import java.nio.channels.ScatteringByteChannel; -import java.nio.charset.Charset; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import net.minecraft.util.io.netty.buffer.ByteBufAllocator; -import net.minecraft.util.io.netty.buffer.ByteBufProcessor; - -import org.bukkit.craftbukkit.inventory.CraftItemStack; // CraftBukkit - -public class PacketDataSerializer extends ByteBuf { - - private final ByteBuf a; - - public PacketDataSerializer(ByteBuf bytebuf) { - this.a = bytebuf; - } - - public static int a(int i) { - return (i & -128) == 0 ? 1 : ((i & -16384) == 0 ? 2 : ((i & -2097152) == 0 ? 3 : ((i & -268435456) == 0 ? 4 : 5))); - } - - public int a() { - int i = 0; - int j = 0; - - byte b0; - - do { - b0 = this.readByte(); - i |= (b0 & 127) << j++ * 7; - if (j > 5) { - throw new RuntimeException("VarInt too big"); - } - } while ((b0 & 128) == 128); - - return i; - } - - public void b(int i) { - while ((i & -128) != 0) { - this.writeByte(i & 127 | 128); - i >>>= 7; - } - - this.writeByte(i); - } - - public void a(NBTTagCompound nbttagcompound) { - if (nbttagcompound == null) { - this.writeShort(-1); - } else { - byte[] abyte = NBTCompressedStreamTools.a(nbttagcompound); - - this.writeShort((short) abyte.length); - this.writeBytes(abyte); - } - } - - public NBTTagCompound b() { - short short1 = this.readShort(); - - if (short1 < 0) { - return null; - } else { - byte[] abyte = new byte[short1]; - - this.readBytes(abyte); - return NBTCompressedStreamTools.a(abyte, new NBTReadLimiter(2097152L)); - } - } - - public void a(ItemStack itemstack) { - if (itemstack == null || itemstack.getItem() == null) { // CraftBukkit - NPE fix itemstack.getItem() - this.writeShort(-1); - } else { - this.writeShort(Item.getId(itemstack.getItem())); - this.writeByte(itemstack.count); - this.writeShort(itemstack.getData()); - NBTTagCompound nbttagcompound = null; - - if (itemstack.getItem().usesDurability() || itemstack.getItem().s()) { - nbttagcompound = itemstack.tag; - } - - this.a(nbttagcompound); - } - } - - public ItemStack c() { - ItemStack itemstack = null; - short short1 = this.readShort(); - - if (short1 >= 0) { - byte b0 = this.readByte(); - short short2 = this.readShort(); - - itemstack = new ItemStack(Item.getById(short1), b0, short2); - itemstack.tag = this.b(); - // CraftBukkit start - if (itemstack.tag != null) { - CraftItemStack.setItemMeta(itemstack, CraftItemStack.getItemMeta(itemstack)); - } - // CraftBukkit end - } - - return itemstack; - } - - public String c(int i) throws IOException { // CraftBukkit - throws IOException - int j = this.a(); - - if (j > i * 4) { - throw new IOException("The received encoded string buffer length is longer than maximum allowed (" + j + " > " + i * 4 + ")"); - } else if (j < 0) { - throw new IOException("The received encoded string buffer length is less than zero! Weird string!"); - } else { - String s = new String(this.readBytes(j).array(), Charsets.UTF_8); - - if (s.length() > i) { - throw new IOException("The received string length is longer than maximum allowed (" + j + " > " + i + ")"); - } else { - return s; - } - } - } - - public void a(String s) throws IOException { // CraftBukkit - throws IOException - byte[] abyte = s.getBytes(Charsets.UTF_8); - - if (abyte.length > 32767) { - throw new IOException("String too big (was " + s.length() + " bytes encoded, max " + 32767 + ")"); - } else { - this.b(abyte.length); - this.writeBytes(abyte); - } - } - - public int capacity() { - return this.a.capacity(); - } - - public ByteBuf capacity(int i) { - return this.a.capacity(i); - } - - public int maxCapacity() { - return this.a.maxCapacity(); - } - - public ByteBufAllocator alloc() { - return this.a.alloc(); - } - - public ByteOrder order() { - return this.a.order(); - } - - public ByteBuf order(ByteOrder byteorder) { - return this.a.order(byteorder); - } - - public ByteBuf unwrap() { - return this.a.unwrap(); - } - - public boolean isDirect() { - return this.a.isDirect(); - } - - public int readerIndex() { - return this.a.readerIndex(); - } - - public ByteBuf readerIndex(int i) { - return this.a.readerIndex(i); - } - - public int writerIndex() { - return this.a.writerIndex(); - } - - public ByteBuf writerIndex(int i) { - return this.a.writerIndex(i); - } - - public ByteBuf setIndex(int i, int j) { - return this.a.setIndex(i, j); - } - - public int readableBytes() { - return this.a.readableBytes(); - } - - public int writableBytes() { - return this.a.writableBytes(); - } - - public int maxWritableBytes() { - return this.a.maxWritableBytes(); - } - - public boolean isReadable() { - return this.a.isReadable(); - } - - public boolean isReadable(int i) { - return this.a.isReadable(i); - } - - public boolean isWritable() { - return this.a.isWritable(); - } - - public boolean isWritable(int i) { - return this.a.isWritable(i); - } - - public ByteBuf clear() { - return this.a.clear(); - } - - public ByteBuf markReaderIndex() { - return this.a.markReaderIndex(); - } - - public ByteBuf resetReaderIndex() { - return this.a.resetReaderIndex(); - } - - public ByteBuf markWriterIndex() { - return this.a.markWriterIndex(); - } - - public ByteBuf resetWriterIndex() { - return this.a.resetWriterIndex(); - } - - public ByteBuf discardReadBytes() { - return this.a.discardReadBytes(); - } - - public ByteBuf discardSomeReadBytes() { - return this.a.discardSomeReadBytes(); - } - - public ByteBuf ensureWritable(int i) { - return this.a.ensureWritable(i); - } - - public int ensureWritable(int i, boolean flag) { - return this.a.ensureWritable(i, flag); - } - - public boolean getBoolean(int i) { - return this.a.getBoolean(i); - } - - public byte getByte(int i) { - return this.a.getByte(i); - } - - public short getUnsignedByte(int i) { - return this.a.getUnsignedByte(i); - } - - public short getShort(int i) { - return this.a.getShort(i); - } - - public int getUnsignedShort(int i) { - return this.a.getUnsignedShort(i); - } - - public int getMedium(int i) { - return this.a.getMedium(i); - } - - public int getUnsignedMedium(int i) { - return this.a.getUnsignedMedium(i); - } - - public int getInt(int i) { - return this.a.getInt(i); - } - - public long getUnsignedInt(int i) { - return this.a.getUnsignedInt(i); - } - - public long getLong(int i) { - return this.a.getLong(i); - } - - public char getChar(int i) { - return this.a.getChar(i); - } - - public float getFloat(int i) { - return this.a.getFloat(i); - } - - public double getDouble(int i) { - return this.a.getDouble(i); - } - - public ByteBuf getBytes(int i, ByteBuf bytebuf) { - return this.a.getBytes(i, bytebuf); - } - - public ByteBuf getBytes(int i, ByteBuf bytebuf, int j) { - return this.a.getBytes(i, bytebuf, j); - } - - public ByteBuf getBytes(int i, ByteBuf bytebuf, int j, int k) { - return this.a.getBytes(i, bytebuf, j, k); - } - - public ByteBuf getBytes(int i, byte[] abyte) { - return this.a.getBytes(i, abyte); - } - - public ByteBuf getBytes(int i, byte[] abyte, int j, int k) { - return this.a.getBytes(i, abyte, j, k); - } - - public ByteBuf getBytes(int i, ByteBuffer bytebuffer) { - return this.a.getBytes(i, bytebuffer); - } - - public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.getBytes(i, outputstream, j); - } - - public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.getBytes(i, gatheringbytechannel, j); - } - - public ByteBuf setBoolean(int i, boolean flag) { - return this.a.setBoolean(i, flag); - } - - public ByteBuf setByte(int i, int j) { - return this.a.setByte(i, j); - } - - public ByteBuf setShort(int i, int j) { - return this.a.setShort(i, j); - } - - public ByteBuf setMedium(int i, int j) { - return this.a.setMedium(i, j); - } - - public ByteBuf setInt(int i, int j) { - return this.a.setInt(i, j); - } - - public ByteBuf setLong(int i, long j) { - return this.a.setLong(i, j); - } - - public ByteBuf setChar(int i, int j) { - return this.a.setChar(i, j); - } - - public ByteBuf setFloat(int i, float f) { - return this.a.setFloat(i, f); - } - - public ByteBuf setDouble(int i, double d0) { - return this.a.setDouble(i, d0); - } - - public ByteBuf setBytes(int i, ByteBuf bytebuf) { - return this.a.setBytes(i, bytebuf); - } - - public ByteBuf setBytes(int i, ByteBuf bytebuf, int j) { - return this.a.setBytes(i, bytebuf, j); - } - - public ByteBuf setBytes(int i, ByteBuf bytebuf, int j, int k) { - return this.a.setBytes(i, bytebuf, j, k); - } - - public ByteBuf setBytes(int i, byte[] abyte) { - return this.a.setBytes(i, abyte); - } - - public ByteBuf setBytes(int i, byte[] abyte, int j, int k) { - return this.a.setBytes(i, abyte, j, k); - } - - public ByteBuf setBytes(int i, ByteBuffer bytebuffer) { - return this.a.setBytes(i, bytebuffer); - } - - public int setBytes(int i, InputStream inputstream, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.setBytes(i, inputstream, j); - } - - public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException { // CraftBukkit - throws IOException - return this.a.setBytes(i, scatteringbytechannel, j); - } - - public ByteBuf setZero(int i, int j) { - return this.a.setZero(i, j); - } - - public boolean readBoolean() { - return this.a.readBoolean(); - } - - public byte readByte() { - return this.a.readByte(); - } - - public short readUnsignedByte() { - return this.a.readUnsignedByte(); - } - - public short readShort() { - return this.a.readShort(); - } - - public int readUnsignedShort() { - return this.a.readUnsignedShort(); - } - - public int readMedium() { - return this.a.readMedium(); - } - - public int readUnsignedMedium() { - return this.a.readUnsignedMedium(); - } - - public int readInt() { - return this.a.readInt(); - } - - public long readUnsignedInt() { - return this.a.readUnsignedInt(); - } - - public long readLong() { - return this.a.readLong(); - } - - public char readChar() { - return this.a.readChar(); - } - - public float readFloat() { - return this.a.readFloat(); - } - - public double readDouble() { - return this.a.readDouble(); - } - - public ByteBuf readBytes(int i) { - return this.a.readBytes(i); - } - - public ByteBuf readSlice(int i) { - return this.a.readSlice(i); - } - - public ByteBuf readBytes(ByteBuf bytebuf) { - return this.a.readBytes(bytebuf); - } - - public ByteBuf readBytes(ByteBuf bytebuf, int i) { - return this.a.readBytes(bytebuf, i); - } - - public ByteBuf readBytes(ByteBuf bytebuf, int i, int j) { - return this.a.readBytes(bytebuf, i, j); - } - - public ByteBuf readBytes(byte[] abyte) { - return this.a.readBytes(abyte); - } - - public ByteBuf readBytes(byte[] abyte, int i, int j) { - return this.a.readBytes(abyte, i, j); - } - - public ByteBuf readBytes(ByteBuffer bytebuffer) { - return this.a.readBytes(bytebuffer); - } - - public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.readBytes(outputstream, i); - } - - public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.readBytes(gatheringbytechannel, i); - } - - public ByteBuf skipBytes(int i) { - return this.a.skipBytes(i); - } - - public ByteBuf writeBoolean(boolean flag) { - return this.a.writeBoolean(flag); - } - - public ByteBuf writeByte(int i) { - return this.a.writeByte(i); - } - - public ByteBuf writeShort(int i) { - return this.a.writeShort(i); - } - - public ByteBuf writeMedium(int i) { - return this.a.writeMedium(i); - } - - public ByteBuf writeInt(int i) { - return this.a.writeInt(i); - } - - public ByteBuf writeLong(long i) { - return this.a.writeLong(i); - } - - public ByteBuf writeChar(int i) { - return this.a.writeChar(i); - } - - public ByteBuf writeFloat(float f) { - return this.a.writeFloat(f); - } - - public ByteBuf writeDouble(double d0) { - return this.a.writeDouble(d0); - } - - public ByteBuf writeBytes(ByteBuf bytebuf) { - return this.a.writeBytes(bytebuf); - } - - public ByteBuf writeBytes(ByteBuf bytebuf, int i) { - return this.a.writeBytes(bytebuf, i); - } - - public ByteBuf writeBytes(ByteBuf bytebuf, int i, int j) { - return this.a.writeBytes(bytebuf, i, j); - } - - public ByteBuf writeBytes(byte[] abyte) { - return this.a.writeBytes(abyte); - } - - public ByteBuf writeBytes(byte[] abyte, int i, int j) { - return this.a.writeBytes(abyte, i, j); - } - - public ByteBuf writeBytes(ByteBuffer bytebuffer) { - return this.a.writeBytes(bytebuffer); - } - - public int writeBytes(InputStream inputstream, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.writeBytes(inputstream, i); - } - - public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException { // CraftBukkit - throws IOException - return this.a.writeBytes(scatteringbytechannel, i); - } - - public ByteBuf writeZero(int i) { - return this.a.writeZero(i); - } - - public int indexOf(int i, int j, byte b0) { - return this.a.indexOf(i, j, b0); - } - - public int bytesBefore(byte b0) { - return this.a.bytesBefore(b0); - } - - public int bytesBefore(int i, byte b0) { - return this.a.bytesBefore(i, b0); - } - - public int bytesBefore(int i, int j, byte b0) { - return this.a.bytesBefore(i, j, b0); - } - - public int forEachByte(ByteBufProcessor bytebufprocessor) { - return this.a.forEachByte(bytebufprocessor); - } - - public int forEachByte(int i, int j, ByteBufProcessor bytebufprocessor) { - return this.a.forEachByte(i, j, bytebufprocessor); - } - - public int forEachByteDesc(ByteBufProcessor bytebufprocessor) { - return this.a.forEachByteDesc(bytebufprocessor); - } - - public int forEachByteDesc(int i, int j, ByteBufProcessor bytebufprocessor) { - return this.a.forEachByteDesc(i, j, bytebufprocessor); - } - - public ByteBuf copy() { - return this.a.copy(); - } - - public ByteBuf copy(int i, int j) { - return this.a.copy(i, j); - } - - public ByteBuf slice() { - return this.a.slice(); - } - - public ByteBuf slice(int i, int j) { - return this.a.slice(i, j); - } - - public ByteBuf duplicate() { - return this.a.duplicate(); - } - - public int nioBufferCount() { - return this.a.nioBufferCount(); - } - - public ByteBuffer nioBuffer() { - return this.a.nioBuffer(); - } - - public ByteBuffer nioBuffer(int i, int j) { - return this.a.nioBuffer(i, j); - } - - public ByteBuffer internalNioBuffer(int i, int j) { - return this.a.internalNioBuffer(i, j); - } - - public ByteBuffer[] nioBuffers() { - return this.a.nioBuffers(); - } - - public ByteBuffer[] nioBuffers(int i, int j) { - return this.a.nioBuffers(i, j); - } - - public boolean hasArray() { - return this.a.hasArray(); - } - - public byte[] array() { - return this.a.array(); - } - - public int arrayOffset() { - return this.a.arrayOffset(); - } - - public boolean hasMemoryAddress() { - return this.a.hasMemoryAddress(); - } - - public long memoryAddress() { - return this.a.memoryAddress(); - } - - public String toString(Charset charset) { - return this.a.toString(charset); - } - - public String toString(int i, int j, Charset charset) { - return this.a.toString(i, j, charset); - } - - public int hashCode() { - return this.a.hashCode(); - } - - public boolean equals(Object object) { - return this.a.equals(object); - } - - public int compareTo(ByteBuf bytebuf) { - return this.a.compareTo(bytebuf); - } - - public String toString() { - return this.a.toString(); - } - - public ByteBuf retain(int i) { - return this.a.retain(i); - } - - public ByteBuf retain() { - return this.a.retain(); - } - - public int refCnt() { - return this.a.refCnt(); - } - - public boolean release() { - return this.a.release(); - } - - public boolean release(int i) { - return this.a.release(i); - } -} diff --git a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java b/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java deleted file mode 100644 index 16d47650..00000000 --- a/src/main/java/net/minecraft/server/PacketHandshakingInSetProtocol.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; // CraftBukkit - -public class PacketHandshakingInSetProtocol extends Packet { - - private int a; - public String b; // CraftBukkit private -> public - public int c; // CraftBukkit private -> public - private EnumProtocol d; - - public PacketHandshakingInSetProtocol() {} - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.a = packetdataserializer.a(); - this.b = packetdataserializer.c(255); - this.c = packetdataserializer.readUnsignedShort(); - this.d = EnumProtocol.a(packetdataserializer.a()); - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.b(this.a); - packetdataserializer.a(this.b); - packetdataserializer.writeShort(this.c); - packetdataserializer.b(this.d.c()); - } - - public void a(PacketHandshakingInListener packethandshakinginlistener) { - packethandshakinginlistener.a(this); - } - - public boolean a() { - return true; - } - - public EnumProtocol c() { - return this.d; - } - - public int d() { - return this.a; - } - - public void handle(PacketListener packetlistener) { - this.a((PacketHandshakingInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayInChat.java b/src/main/java/net/minecraft/server/PacketPlayInChat.java deleted file mode 100644 index 604a7af5..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayInChat.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; // CraftBukkit - -public class PacketPlayInChat extends Packet { - - private String message; - - public PacketPlayInChat() {} - - public PacketPlayInChat(String s) { - if (s.length() > 100) { - s = s.substring(0, 100); - } - - this.message = s; - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.message = packetdataserializer.c(100); - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.a(this.message); - } - - public void a(PacketPlayInListener packetplayinlistener) { - packetplayinlistener.a(this); - } - - public String b() { - return String.format("message=\'%s\'", new Object[] { this.message}); - } - - public String c() { - return this.message; - } - - // CraftBukkit start - make chat async - @Override - public boolean a() { - return !this.message.startsWith("/"); - } - // CraftBukkit end - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java b/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java deleted file mode 100644 index 43df03a9..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayInCloseWindow.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.minecraft.server; - -public class PacketPlayInCloseWindow extends Packet { - - private int a; - - public PacketPlayInCloseWindow() {} - - // CraftBukkit start - Add constructor - public PacketPlayInCloseWindow(int id) { - this.a = id; - } - // CraftBukkit end - public void a(PacketPlayInListener packetplayinlistener) { - packetplayinlistener.a(this); - } - - public void a(PacketDataSerializer packetdataserializer) { - this.a = packetdataserializer.readByte(); - } - - public void b(PacketDataSerializer packetdataserializer) { - packetdataserializer.writeByte(this.a); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java b/src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java deleted file mode 100644 index 5df99a44..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayInCustomPayload.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; // CraftBukkit - -public class PacketPlayInCustomPayload extends Packet { - - private String tag; - public int length; // CraftBukkit - private -> public - private byte[] data; - - public PacketPlayInCustomPayload() {} - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.tag = packetdataserializer.c(20); - this.length = packetdataserializer.readShort(); - if (this.length > 0 && this.length < 32767) { - this.data = new byte[this.length]; - packetdataserializer.readBytes(this.data); - } - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.a(this.tag); - packetdataserializer.writeShort((short) this.length); - if (this.data != null) { - packetdataserializer.writeBytes(this.data); - } - } - - public void a(PacketPlayInListener packetplayinlistener) { - packetplayinlistener.a(this); - } - - public String c() { - return this.tag; - } - - public byte[] e() { - return this.data; - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayInListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java b/src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java deleted file mode 100644 index 4c622e26..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutBlockChange.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -public class PacketPlayOutBlockChange extends Packet { - - private int a; - private int b; - private int c; - public Block block; // CraftBukkit - public - public int data; // CraftBukkit - public - - public PacketPlayOutBlockChange() {} - - public PacketPlayOutBlockChange(int i, int j, int k, World world) { - this.a = i; - this.b = j; - this.c = k; - this.block = world.getType(i, j, k); - this.data = world.getData(i, j, k); - } - - public void a(PacketDataSerializer packetdataserializer) { - this.a = packetdataserializer.readInt(); - this.b = packetdataserializer.readUnsignedByte(); - this.c = packetdataserializer.readInt(); - this.block = Block.getById(packetdataserializer.a()); - this.data = packetdataserializer.readUnsignedByte(); - } - - public void b(PacketDataSerializer packetdataserializer) { - packetdataserializer.writeInt(this.a); - packetdataserializer.writeByte(this.b); - packetdataserializer.writeInt(this.c); - packetdataserializer.b(Block.getId(this.block)); - packetdataserializer.writeByte(this.data); - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public String b() { - return String.format("type=%d, data=%d, x=%d, y=%d, z=%d", new Object[] { Integer.valueOf(Block.getId(this.block)), Integer.valueOf(this.data), Integer.valueOf(this.a), Integer.valueOf(this.b), Integer.valueOf(this.c)}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java deleted file mode 100644 index 3eac231d..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunkBulk.java +++ /dev/null @@ -1,190 +0,0 @@ -package net.minecraft.server; - -import java.io.IOException; -import java.util.List; -import java.util.zip.DataFormatException; -import java.util.zip.Deflater; -import java.util.zip.Inflater; - -public class PacketPlayOutMapChunkBulk extends Packet { - - private int[] a; - private int[] b; - private int[] c; - private int[] d; - private byte[] buffer; - private byte[][] inflatedBuffers; - private int size; - private boolean h; - private byte[] buildBuffer = new byte[0]; // CraftBukkit - remove static - // CraftBukkit start - static final ThreadLocal<Deflater> localDeflater = new ThreadLocal<Deflater>() { - @Override - protected Deflater initialValue() { - // Don't use higher compression level, slows things down too much - return new Deflater(6); - } - }; - // CraftBukkit end - - public PacketPlayOutMapChunkBulk() {} - - public PacketPlayOutMapChunkBulk(List list) { - int i = list.size(); - - this.a = new int[i]; - this.b = new int[i]; - this.c = new int[i]; - this.d = new int[i]; - this.inflatedBuffers = new byte[i][]; - this.h = !list.isEmpty() && !((Chunk) list.get(0)).world.worldProvider.g; - int j = 0; - - for (int k = 0; k < i; ++k) { - Chunk chunk = (Chunk) list.get(k); - ChunkMap chunkmap = PacketPlayOutMapChunk.a(chunk, true, '\uffff'); - - if (buildBuffer.length < j + chunkmap.a.length) { - byte[] abyte = new byte[j + chunkmap.a.length]; - - System.arraycopy(buildBuffer, 0, abyte, 0, buildBuffer.length); - buildBuffer = abyte; - } - - System.arraycopy(chunkmap.a, 0, buildBuffer, j, chunkmap.a.length); - j += chunkmap.a.length; - this.a[k] = chunk.locX; - this.b[k] = chunk.locZ; - this.c[k] = chunkmap.b; - this.d[k] = chunkmap.c; - this.inflatedBuffers[k] = chunkmap.a; - } - - /* CraftBukkit start - Moved to compress() - Deflater deflater = new Deflater(-1); - - try { - deflater.setInput(buildBuffer, 0, j); - deflater.finish(); - this.buffer = new byte[j]; - this.size = deflater.deflate(this.buffer); - } finally { - deflater.end(); - } - */ - } - - // Add compression method - public void compress() { - if (this.buffer != null) { - return; - } - - Deflater deflater = localDeflater.get(); - deflater.reset(); - deflater.setInput(this.buildBuffer); - deflater.finish(); - - this.buffer = new byte[this.buildBuffer.length + 100]; - this.size = deflater.deflate(this.buffer); - } - // CraftBukkit end - - public static int c() { - return 5; - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - throws IOException - short short1 = packetdataserializer.readShort(); - - this.size = packetdataserializer.readInt(); - this.h = packetdataserializer.readBoolean(); - this.a = new int[short1]; - this.b = new int[short1]; - this.c = new int[short1]; - this.d = new int[short1]; - this.inflatedBuffers = new byte[short1][]; - if (buildBuffer.length < this.size) { - buildBuffer = new byte[this.size]; - } - - packetdataserializer.readBytes(buildBuffer, 0, this.size); - byte[] abyte = new byte[PacketPlayOutMapChunk.c() * short1]; - Inflater inflater = new Inflater(); - - inflater.setInput(buildBuffer, 0, this.size); - - try { - inflater.inflate(abyte); - } catch (DataFormatException dataformatexception) { - throw new IOException("Bad compressed data format"); - } finally { - inflater.end(); - } - - int i = 0; - - for (int j = 0; j < short1; ++j) { - this.a[j] = packetdataserializer.readInt(); - this.b[j] = packetdataserializer.readInt(); - this.c[j] = packetdataserializer.readShort(); - this.d[j] = packetdataserializer.readShort(); - int k = 0; - int l = 0; - - int i1; - - for (i1 = 0; i1 < 16; ++i1) { - k += this.c[j] >> i1 & 1; - l += this.d[j] >> i1 & 1; - } - - i1 = 2048 * 4 * k + 256; - i1 += 2048 * l; - if (this.h) { - i1 += 2048 * k; - } - - this.inflatedBuffers[j] = new byte[i1]; - System.arraycopy(abyte, i, this.inflatedBuffers[j], 0, i1); - i += i1; - } - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - throws IOException - compress(); // CraftBukkit - packetdataserializer.writeShort(this.a.length); - packetdataserializer.writeInt(this.size); - packetdataserializer.writeBoolean(this.h); - packetdataserializer.writeBytes(this.buffer, 0, this.size); - - for (int i = 0; i < this.a.length; ++i) { - packetdataserializer.writeInt(this.a[i]); - packetdataserializer.writeInt(this.b[i]); - packetdataserializer.writeShort((short) (this.c[i] & '\uffff')); - packetdataserializer.writeShort((short) (this.d[i] & '\uffff')); - } - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public String b() { - StringBuilder stringbuilder = new StringBuilder(); - - for (int i = 0; i < this.a.length; ++i) { - if (i > 0) { - stringbuilder.append(", "); - } - - stringbuilder.append(String.format("{x=%d, z=%d, sections=%d, adds=%d, data=%d}", new Object[] { Integer.valueOf(this.a[i]), Integer.valueOf(this.b[i]), Integer.valueOf(this.c[i]), Integer.valueOf(this.d[i]), Integer.valueOf(this.inflatedBuffers[i].length)})); - } - - return String.format("size=%d, chunks=%d[%s]", new Object[] { Integer.valueOf(this.size), Integer.valueOf(this.a.length), stringbuilder}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java b/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java deleted file mode 100644 index 0023f18d..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutNamedEntitySpawn.java +++ /dev/null @@ -1,102 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.UUID; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.properties.Property; - -import java.io.IOException; // CraftBukkit - -public class PacketPlayOutNamedEntitySpawn extends Packet { - - private int a; - private GameProfile b; - private int c; - private int d; - private int e; - private byte f; - private byte g; - private int h; - private DataWatcher i; - private List j; - - public PacketPlayOutNamedEntitySpawn() {} - - public PacketPlayOutNamedEntitySpawn(EntityHuman entityhuman) { - this.a = entityhuman.getId(); - this.b = entityhuman.getProfile(); - this.c = MathHelper.floor(entityhuman.locX * 32.0D); - this.d = MathHelper.floor(entityhuman.locY * 32.0D); - this.e = MathHelper.floor(entityhuman.locZ * 32.0D); - this.f = (byte) ((int) (entityhuman.yaw * 256.0F / 360.0F)); - this.g = (byte) ((int) (entityhuman.pitch * 256.0F / 360.0F)); - ItemStack itemstack = entityhuman.inventory.getItemInHand(); - - this.h = itemstack == null ? 0 : Item.getId(itemstack.getItem()); - this.i = entityhuman.getDataWatcher(); - } - - public void a(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - this.a = packetdataserializer.a(); - UUID uuid = UUID.fromString(packetdataserializer.c(36)); - - this.b = new GameProfile(uuid, packetdataserializer.c(16)); - int i = packetdataserializer.a(); - - for (int j = 0; j < i; ++j) { - String s = packetdataserializer.c(32767); - String s1 = packetdataserializer.c(32767); - String s2 = packetdataserializer.c(32767); - - this.b.getProperties().put(s, new Property(s, s1, s2)); - } - - this.c = packetdataserializer.readInt(); - this.d = packetdataserializer.readInt(); - this.e = packetdataserializer.readInt(); - this.f = packetdataserializer.readByte(); - this.g = packetdataserializer.readByte(); - this.h = packetdataserializer.readShort(); - this.j = DataWatcher.b(packetdataserializer); - } - - public void b(PacketDataSerializer packetdataserializer) throws IOException { // CraftBukkit - added throws - packetdataserializer.b(this.a); - UUID uuid = this.b.getId(); - - packetdataserializer.a(uuid == null ? "" : uuid.toString()); - packetdataserializer.a(this.b.getName().length() > 16 ? this.b.getName().substring(0, 16) : this.b.getName()); // CraftBukkit - Limit name length to 16 characters - packetdataserializer.b(this.b.getProperties().size()); - Iterator iterator = this.b.getProperties().values().iterator(); - - while (iterator.hasNext()) { - Property property = (Property) iterator.next(); - - packetdataserializer.a(property.getName()); - packetdataserializer.a(property.getValue()); - packetdataserializer.a(property.getSignature()); - } - - packetdataserializer.writeInt(this.c); - packetdataserializer.writeInt(this.d); - packetdataserializer.writeInt(this.e); - packetdataserializer.writeByte(this.f); - packetdataserializer.writeByte(this.g); - packetdataserializer.writeShort(this.h); - this.i.a(packetdataserializer); - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public String b() { - return String.format("id=%d, gameProfile=\'%s\', x=%.2f, y=%.2f, z=%.2f, carried=%d", new Object[] { Integer.valueOf(this.a), this.b, Float.valueOf((float) this.c / 32.0F), Float.valueOf((float) this.d / 32.0F), Float.valueOf((float) this.e / 32.0F), Integer.valueOf(this.h)}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java b/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java deleted file mode 100644 index 92e40367..00000000 --- a/src/main/java/net/minecraft/server/PacketPlayOutSpawnPosition.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.minecraft.server; - -public class PacketPlayOutSpawnPosition extends Packet { - - public int x; // CraftBukkit - private -> public - public int y; // CraftBukkit - private -> public - public int z; // CraftBukkit - private -> public - - public PacketPlayOutSpawnPosition() {} - - public PacketPlayOutSpawnPosition(int i, int j, int k) { - this.x = i; - this.y = j; - this.z = k; - } - - public void a(PacketDataSerializer packetdataserializer) { - this.x = packetdataserializer.readInt(); - this.y = packetdataserializer.readInt(); - this.z = packetdataserializer.readInt(); - } - - public void b(PacketDataSerializer packetdataserializer) { - packetdataserializer.writeInt(this.x); - packetdataserializer.writeInt(this.y); - packetdataserializer.writeInt(this.z); - } - - public void a(PacketPlayOutListener packetplayoutlistener) { - packetplayoutlistener.a(this); - } - - public boolean a() { - return false; - } - - public String b() { - return String.format("x=%d, y=%d, z=%d", new Object[] { Integer.valueOf(this.x), Integer.valueOf(this.y), Integer.valueOf(this.z)}); - } - - public void handle(PacketListener packetlistener) { - this.a((PacketPlayOutListener) packetlistener); - } -} diff --git a/src/main/java/net/minecraft/server/PacketStatusListener.java b/src/main/java/net/minecraft/server/PacketStatusListener.java deleted file mode 100644 index cd063053..00000000 --- a/src/main/java/net/minecraft/server/PacketStatusListener.java +++ /dev/null @@ -1,128 +0,0 @@ -package net.minecraft.server; - -import java.net.InetSocketAddress; - -// CraftBukkit start -import java.util.Iterator; - -import org.bukkit.craftbukkit.util.CraftIconCache; -import org.bukkit.entity.Player; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -// CraftBukkit end - -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; - -public class PacketStatusListener implements PacketStatusInListener { - - private final MinecraftServer minecraftServer; - private final NetworkManager networkManager; - - public PacketStatusListener(MinecraftServer minecraftserver, NetworkManager networkmanager) { - this.minecraftServer = minecraftserver; - this.networkManager = networkmanager; - } - - public void a(IChatBaseComponent ichatbasecomponent) {} - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - if (enumprotocol1 != EnumProtocol.STATUS) { - throw new UnsupportedOperationException("Unexpected change in protocol to " + enumprotocol1); - } - } - - public void a() {} - - public void a(PacketStatusInStart packetstatusinstart) { - // CraftBukkit start - fire ping event - final Object[] players = minecraftServer.getPlayerList().players.toArray(); - class ServerListPingEvent extends org.bukkit.event.server.ServerListPingEvent { - CraftIconCache icon = minecraftServer.server.getServerIcon(); - - ServerListPingEvent() { - super(((InetSocketAddress) networkManager.getSocketAddress()).getAddress(), minecraftServer.getMotd(), minecraftServer.getPlayerList().getMaxPlayers()); - } - - @Override - public void setServerIcon(org.bukkit.util.CachedServerIcon icon) { - if (!(icon instanceof CraftIconCache)) { - throw new IllegalArgumentException(icon + " was not created by " + org.bukkit.craftbukkit.CraftServer.class); - } - this.icon = (CraftIconCache) icon; - } - - @Override - public Iterator<Player> iterator() throws UnsupportedOperationException { - return new Iterator<Player>() { - int i; - int ret = Integer.MIN_VALUE; - EntityPlayer player; - - @Override - public boolean hasNext() { - if (player != null) { - return true; - } - final Object[] currentPlayers = players; - for (int length = currentPlayers.length, i = this.i; i < length; i++) { - final EntityPlayer player = (EntityPlayer) currentPlayers[i]; - if (player != null) { - this.i = i + 1; - this.player = player; - return true; - } - } - return false; - } - - @Override - public Player next() { - if (!hasNext()) { - throw new java.util.NoSuchElementException(); - } - final EntityPlayer player = this.player; - this.player = null; - this.ret = this.i - 1; - return player.getBukkitEntity(); - } - - @Override - public void remove() { - final Object[] currentPlayers = players; - final int i = this.ret; - if (i < 0 || currentPlayers[i] == null) { - throw new IllegalStateException(); - } - currentPlayers[i] = null; - } - }; - } - } - - ServerListPingEvent event = new ServerListPingEvent(); - this.minecraftServer.server.getPluginManager().callEvent(event); - - java.util.List<GameProfile> profiles = new java.util.ArrayList<GameProfile>(players.length); - for (Object player : players) { - if (player != null) { - profiles.add(((EntityPlayer) player).getProfile()); - } - } - - ServerPingPlayerSample playerSample = new ServerPingPlayerSample(event.getMaxPlayers(), profiles.size()); - playerSample.a(profiles.toArray(new GameProfile[profiles.size()])); - - ServerPing ping = new ServerPing(); - ping.setFavicon(event.icon.value); - ping.setMOTD(new ChatComponentText(event.getMotd())); - ping.setPlayerSample(playerSample); - ping.setServerInfo(new ServerPingServerData(minecraftServer.getServerModName() + " " + minecraftServer.getVersion(), 5)); // TODO: Update when protocol changes - - this.networkManager.handle(new PacketStatusOutServerInfo(ping), new GenericFutureListener[0]); - // CraftBukkit end - } - - public void a(PacketStatusInPing packetstatusinping) { - this.networkManager.handle(new PacketStatusOutPong(packetstatusinping.c()), new GenericFutureListener[0]); - } -} diff --git a/src/main/java/net/minecraft/server/Path.java b/src/main/java/net/minecraft/server/Path.java deleted file mode 100644 index 90c3ef97..00000000 --- a/src/main/java/net/minecraft/server/Path.java +++ /dev/null @@ -1,128 +0,0 @@ -package net.minecraft.server; - -public class Path { - - private PathPoint[] a = new PathPoint[128]; // CraftBukkit - reduce default size - private int b; - - public Path() {} - - public PathPoint a(PathPoint pathpoint) { - if (pathpoint.d >= 0) { - throw new IllegalStateException("OW KNOWS!"); - } else { - if (this.b == this.a.length) { - PathPoint[] apathpoint = new PathPoint[this.b << 1]; - - System.arraycopy(this.a, 0, apathpoint, 0, this.b); - this.a = apathpoint; - } - - this.a[this.b] = pathpoint; - pathpoint.d = this.b; - this.a(this.b++); - return pathpoint; - } - } - - public void a() { - this.b = 0; - } - - public PathPoint c() { - PathPoint pathpoint = this.a[0]; - - this.a[0] = this.a[--this.b]; - this.a[this.b] = null; - if (this.b > 0) { - this.b(0); - } - - pathpoint.d = -1; - return pathpoint; - } - - public void a(PathPoint pathpoint, float f) { - float f1 = pathpoint.g; - - pathpoint.g = f; - if (f < f1) { - this.a(pathpoint.d); - } else { - this.b(pathpoint.d); - } - } - - private void a(int i) { - PathPoint pathpoint = this.a[i]; - - int j; - - for (float f = pathpoint.g; i > 0; i = j) { - j = i - 1 >> 1; - PathPoint pathpoint1 = this.a[j]; - - if (f >= pathpoint1.g) { - break; - } - - this.a[i] = pathpoint1; - pathpoint1.d = i; - } - - this.a[i] = pathpoint; - pathpoint.d = i; - } - - private void b(int i) { - PathPoint pathpoint = this.a[i]; - float f = pathpoint.g; - - while (true) { - int j = 1 + (i << 1); - int k = j + 1; - - if (j >= this.b) { - break; - } - - PathPoint pathpoint1 = this.a[j]; - float f1 = pathpoint1.g; - PathPoint pathpoint2; - float f2; - - if (k >= this.b) { - pathpoint2 = null; - f2 = Float.POSITIVE_INFINITY; - } else { - pathpoint2 = this.a[k]; - f2 = pathpoint2.g; - } - - if (f1 < f2) { - if (f1 >= f) { - break; - } - - this.a[i] = pathpoint1; - pathpoint1.d = i; - i = j; - } else { - if (f2 >= f) { - break; - } - - this.a[i] = pathpoint2; - pathpoint2.d = i; - i = k; - } - } - - this.a[i] = pathpoint; - pathpoint.d = i; - } - - public boolean e() { - return this.b == 0; - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java deleted file mode 100644 index cb2af02f..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalArrowAttack.java +++ /dev/null @@ -1,105 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class PathfinderGoalArrowAttack extends PathfinderGoal { - - private final EntityInsentient a; - private final IRangedEntity b; - private EntityLiving c; - private int d; - private double e; - private int f; - private int g; - private int h; - private float i; - private float j; - - public PathfinderGoalArrowAttack(IRangedEntity irangedentity, double d0, int i, float f) { - this(irangedentity, d0, i, i, f); - } - - public PathfinderGoalArrowAttack(IRangedEntity irangedentity, double d0, int i, int j, float f) { - this.d = -1; - if (!(irangedentity instanceof EntityLiving)) { - throw new IllegalArgumentException("ArrowAttackGoal requires Mob implements RangedAttackMob"); - } else { - this.b = irangedentity; - this.a = (EntityInsentient) irangedentity; - this.e = d0; - this.g = i; - this.h = j; - this.i = f; - this.j = f * f; - this.a(3); - } - } - - public boolean a() { - EntityLiving entityliving = this.a.getGoalTarget(); - - if (entityliving == null) { - return false; - } else { - this.c = entityliving; - return true; - } - } - - public boolean b() { - return this.a() || !this.a.getNavigation().g(); - } - - public void d() { - // CraftBukkit start - EntityTargetEvent.TargetReason reason = this.c.isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; - org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent((Entity) b, null, reason); - // CraftBukkit end - this.c = null; - this.f = 0; - this.d = -1; - } - - public void e() { - double d0 = this.a.e(this.c.locX, this.c.boundingBox.b, this.c.locZ); - boolean flag = this.a.getEntitySenses().canSee(this.c); - - if (flag) { - ++this.f; - } else { - this.f = 0; - } - - if (d0 <= (double) this.j && this.f >= 20) { - this.a.getNavigation().h(); - } else { - this.a.getNavigation().a((Entity) this.c, this.e); - } - - this.a.getControllerLook().a(this.c, 30.0F, 30.0F); - float f; - - if (--this.d == 0) { - if (d0 > (double) this.j || !flag) { - return; - } - - f = MathHelper.sqrt(d0) / this.i; - float f1 = f; - - if (f < 0.1F) { - f1 = 0.1F; - } - - if (f1 > 1.0F) { - f1 = 1.0F; - } - - this.b.a(this.c, f1); - this.d = MathHelper.d(f * (float) (this.h - this.g) + (float) this.g); - } else if (this.d < 0) { - f = MathHelper.sqrt(d0) / this.i; - this.d = MathHelper.d(f * (float) (this.h - this.g) + (float) this.g); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java b/src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java deleted file mode 100644 index 727f5f0c..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalBreakDoor.java +++ /dev/null @@ -1,59 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalBreakDoor extends PathfinderGoalDoorInteract { - - private int i; - private int j = -1; - - public PathfinderGoalBreakDoor(EntityInsentient entityinsentient) { - super(entityinsentient); - } - - public boolean a() { - return !super.a() ? false : (!this.a.world.getGameRules().getBoolean("mobGriefing") ? false : !this.e.f((IBlockAccess) this.a.world, this.b, this.c, this.d)); // CraftBukkit - Fix decompilation issue by casting world to IBlockAccess - } - - public void c() { - super.c(); - this.i = 0; - } - - public boolean b() { - double d0 = this.a.e((double) this.b, (double) this.c, (double) this.d); - - return this.i <= 240 && !this.e.f((IBlockAccess) this.a.world, this.b, this.c, this.d) && d0 < 4.0D; // CraftBukkit - Fix decompilation issue by casting world to IBlockAccess - } - - public void d() { - super.d(); - this.a.world.d(this.a.getId(), this.b, this.c, this.d, -1); - } - - public void e() { - super.e(); - if (this.a.aI().nextInt(20) == 0) { - this.a.world.triggerEffect(1010, this.b, this.c, this.d, 0); - } - - ++this.i; - int i = (int) ((float) this.i / 240.0F * 10.0F); - - if (i != this.j) { - this.a.world.d(this.a.getId(), this.b, this.c, this.d, i); - this.j = i; - } - - if (this.i == 240 && this.a.world.difficulty == EnumDifficulty.HARD) { - // CraftBukkit start - if (org.bukkit.craftbukkit.event.CraftEventFactory.callEntityBreakDoorEvent(this.a, this.b, this.c, this.d).isCancelled()) { - this.c(); - return; - } - // CraftBukkit end - - this.a.world.setAir(this.b, this.c, this.d); - this.a.world.triggerEffect(1012, this.b, this.c, this.d, 0); - this.a.world.triggerEffect(2001, this.b, this.c, this.d, Block.getId(this.e)); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java b/src/main/java/net/minecraft/server/PathfinderGoalBreed.java deleted file mode 100644 index 65f86908..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalBreed.java +++ /dev/null @@ -1,112 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -public class PathfinderGoalBreed extends PathfinderGoal { - - private EntityAnimal d; - World a; - private EntityAnimal e; - int b; - double c; - - public PathfinderGoalBreed(EntityAnimal entityanimal, double d0) { - this.d = entityanimal; - this.a = entityanimal.world; - this.c = d0; - this.a(3); - } - - public boolean a() { - if (!this.d.ce()) { - return false; - } else { - this.e = this.f(); - return this.e != null; - } - } - - public boolean b() { - return this.e.isAlive() && this.e.ce() && this.b < 60; - } - - public void d() { - this.e = null; - this.b = 0; - } - - public void e() { - this.d.getControllerLook().a(this.e, 10.0F, (float) this.d.x()); - this.d.getNavigation().a((Entity) this.e, this.c); - ++this.b; - if (this.b >= 60 && this.d.f(this.e) < 9.0D) { - this.g(); - } - } - - private EntityAnimal f() { - float f = 8.0F; - List list = this.a.a(this.d.getClass(), this.d.boundingBox.grow((double) f, (double) f, (double) f)); - double d0 = Double.MAX_VALUE; - EntityAnimal entityanimal = null; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityAnimal entityanimal1 = (EntityAnimal) iterator.next(); - - if (this.d.mate(entityanimal1) && this.d.f(entityanimal1) < d0) { - entityanimal = entityanimal1; - d0 = this.d.f(entityanimal1); - } - } - - return entityanimal; - } - - private void g() { - EntityAgeable entityageable = this.d.createChild(this.e); - - if (entityageable != null) { - // CraftBukkit start - set persistence for tame animals - if (entityageable instanceof EntityTameableAnimal && ((EntityTameableAnimal) entityageable).isTamed()) { - entityageable.persistent = true; - } - // CraftBukkit end - EntityHuman entityhuman = this.d.cd(); - - if (entityhuman == null && this.e.cd() != null) { - entityhuman = this.e.cd(); - } - - if (entityhuman != null) { - entityhuman.a(StatisticList.x); - if (this.d instanceof EntityCow) { - entityhuman.a((Statistic) AchievementList.H); - } - } - - this.d.setAge(6000); - this.e.setAge(6000); - this.d.cf(); - this.e.cf(); - entityageable.setAge(-24000); - entityageable.setPositionRotation(this.d.locX, this.d.locY, this.d.locZ, 0.0F, 0.0F); - this.a.addEntity(entityageable, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - Random random = this.d.aI(); - - for (int i = 0; i < 7; ++i) { - double d0 = random.nextGaussian() * 0.02D; - double d1 = random.nextGaussian() * 0.02D; - double d2 = random.nextGaussian() * 0.02D; - - this.a.addParticle("heart", this.d.locX + (double) (random.nextFloat() * this.d.width * 2.0F) - (double) this.d.width, this.d.locY + 0.5D + (double) (random.nextFloat() * this.d.length), this.d.locZ + (double) (random.nextFloat() * this.d.width * 2.0F) - (double) this.d.width, d0, d1, d2); - } - - if (this.a.getGameRules().getBoolean("doMobLoot")) { - this.a.addEntity(new EntityExperienceOrb(this.a, this.d.locX, this.d.locY, this.d.locZ, random.nextInt(7) + 1)); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalEatTile.java b/src/main/java/net/minecraft/server/PathfinderGoalEatTile.java deleted file mode 100644 index a38f2a26..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalEatTile.java +++ /dev/null @@ -1,75 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.Material; -// CraftBukkit end - -public class PathfinderGoalEatTile extends PathfinderGoal { - - private EntityInsentient b; - private World c; - int a; - - public PathfinderGoalEatTile(EntityInsentient entityinsentient) { - this.b = entityinsentient; - this.c = entityinsentient.world; - this.a(7); - } - - public boolean a() { - if (this.b.aI().nextInt(this.b.isBaby() ? 50 : 1000) != 0) { - return false; - } else { - int i = MathHelper.floor(this.b.locX); - int j = MathHelper.floor(this.b.locY); - int k = MathHelper.floor(this.b.locZ); - - return this.c.getType(i, j, k) == Blocks.LONG_GRASS && this.c.getData(i, j, k) == 1 ? true : this.c.getType(i, j - 1, k) == Blocks.GRASS; - } - } - - public void c() { - this.a = 40; - this.c.broadcastEntityEffect(this.b, (byte) 10); - this.b.getNavigation().h(); - } - - public void d() { - this.a = 0; - } - - public boolean b() { - return this.a > 0; - } - - public int f() { - return this.a; - } - - public void e() { - this.a = Math.max(0, this.a - 1); - if (this.a == 4) { - int i = MathHelper.floor(this.b.locX); - int j = MathHelper.floor(this.b.locY); - int k = MathHelper.floor(this.b.locZ); - - if (this.c.getType(i, j, k) == Blocks.LONG_GRASS) { - // CraftBukkit - if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, this.b.world.getWorld().getBlockAt(i, j, k), Material.AIR, !this.c.getGameRules().getBoolean("mobGriefing")).isCancelled()) { - this.c.setAir(i, j, k, false); - } - - this.b.p(); - } else if (this.c.getType(i, j - 1, k) == Blocks.GRASS) { - // CraftBukkit - if (!CraftEventFactory.callEntityChangeBlockEvent(this.b, this.b.world.getWorld().getBlockAt(i, j - 1, k), Material.DIRT, !this.c.getGameRules().getBoolean("mobGriefing")).isCancelled()) { - this.c.triggerEffect(2001, i, j - 1, k, Block.getId(Blocks.GRASS)); - this.c.setTypeAndData(i, j - 1, k, Blocks.DIRT, 0, 2); - } - - this.b.p(); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java deleted file mode 100644 index 4f476e6f..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalHurtByTarget.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -public class PathfinderGoalHurtByTarget extends PathfinderGoalTarget { - - boolean a; - private int b; - - public PathfinderGoalHurtByTarget(EntityCreature entitycreature, boolean flag) { - super(entitycreature, false); - this.a = flag; - this.a(1); - } - - public boolean a() { - int i = this.c.aK(); - - return i != this.b && this.a(this.c.getLastDamager(), false); - } - - public void c() { - this.c.setGoalTarget(this.c.getLastDamager()); - this.b = this.c.aK(); - if (this.a) { - double d0 = this.f(); - List list = this.c.world.a(this.c.getClass(), AxisAlignedBB.a(this.c.locX, this.c.locY, this.c.locZ, this.c.locX + 1.0D, this.c.locY + 1.0D, this.c.locZ + 1.0D).grow(d0, 10.0D, d0)); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityCreature entitycreature = (EntityCreature) iterator.next(); - - if (this.c != entitycreature && entitycreature.getGoalTarget() == null && !entitycreature.c(this.c.getLastDamager())) { - // CraftBukkit start - call EntityTargetEvent - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(entitycreature, this.c.getLastDamager(), org.bukkit.event.entity.EntityTargetEvent.TargetReason.TARGET_ATTACKED_NEARBY_ENTITY); - if (event.isCancelled()) { - continue; - } - entitycreature.setGoalTarget(event.getTarget() == null ? null : ((org.bukkit.craftbukkit.entity.CraftLivingEntity) event.getTarget()).getHandle()); - // CraftBukkit end - } - } - } - - super.c(); - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java b/src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java deleted file mode 100644 index f7bd8e82..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalMakeLove.java +++ /dev/null @@ -1,90 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalMakeLove extends PathfinderGoal { - - private EntityVillager b; - private EntityVillager c; - private World d; - private int e; - Village a; - - public PathfinderGoalMakeLove(EntityVillager entityvillager) { - this.b = entityvillager; - this.d = entityvillager.world; - this.a(3); - } - - public boolean a() { - if (this.b.getAge() != 0) { - return false; - } else if (this.b.aI().nextInt(500) != 0) { - return false; - } else { - this.a = this.d.villages.getClosestVillage(MathHelper.floor(this.b.locX), MathHelper.floor(this.b.locY), MathHelper.floor(this.b.locZ), 0); - if (this.a == null) { - return false; - } else if (!this.f()) { - return false; - } else { - Entity entity = this.d.a(EntityVillager.class, this.b.boundingBox.grow(8.0D, 3.0D, 8.0D), (Entity) this.b); - - if (entity == null) { - return false; - } else { - this.c = (EntityVillager) entity; - return this.c.getAge() == 0; - } - } - } - } - - public void c() { - this.e = 300; - this.b.i(true); - } - - public void d() { - this.a = null; - this.c = null; - this.b.i(false); - } - - public boolean b() { - return this.e >= 0 && this.f() && this.b.getAge() == 0; - } - - public void e() { - --this.e; - this.b.getControllerLook().a(this.c, 10.0F, 30.0F); - if (this.b.f(this.c) > 2.25D) { - this.b.getNavigation().a((Entity) this.c, 0.25D); - } else if (this.e == 0 && this.c.ca()) { - this.g(); - } - - if (this.b.aI().nextInt(35) == 0) { - this.d.broadcastEntityEffect(this.b, (byte) 12); - } - } - - private boolean f() { - if (!this.a.i()) { - return false; - } else { - int i = (int) ((double) ((float) this.a.getDoorCount()) * 0.35D); - - return this.a.getPopulationCount() < i; - } - } - - private void g() { - EntityVillager entityvillager = this.b.b((EntityAgeable) this.c); - - this.c.setAge(6000); - this.b.setAge(6000); - entityvillager.setAge(-24000); - entityvillager.setPositionRotation(this.b.locX, this.b.locY, this.b.locZ, 0.0F, 0.0F); - this.d.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.BREEDING); // CraftBukkit - added SpawnReason - this.d.broadcastEntityEffect(entityvillager, (byte) 12); - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java deleted file mode 100644 index be541f81..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalMeleeAttack.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class PathfinderGoalMeleeAttack extends PathfinderGoal { - - World a; - EntityCreature b; - int c; - double d; - boolean e; - PathEntity f; - Class g; - private int h; - private double i; - private double j; - private double k; - - public PathfinderGoalMeleeAttack(EntityCreature entitycreature, Class oclass, double d0, boolean flag) { - this(entitycreature, d0, flag); - this.g = oclass; - } - - public PathfinderGoalMeleeAttack(EntityCreature entitycreature, double d0, boolean flag) { - this.b = entitycreature; - this.a = entitycreature.world; - this.d = d0; - this.e = flag; - this.a(3); - } - - public boolean a() { - EntityLiving entityliving = this.b.getGoalTarget(); - - if (entityliving == null) { - return false; - } else if (!entityliving.isAlive()) { - return false; - } else if (this.g != null && !this.g.isAssignableFrom(entityliving.getClass())) { - return false; - } else { - this.f = this.b.getNavigation().a(entityliving); - return this.f != null; - } - } - - public boolean b() { - EntityLiving entityliving = this.b.getGoalTarget(); - - // CraftBukkit start - EntityTargetEvent.TargetReason reason = this.b.getGoalTarget() == null ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; - if (this.b.getGoalTarget() == null || (this.b.getGoalTarget() != null && !this.b.getGoalTarget().isAlive())) { - org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(b, null, reason); - } - // CraftBukkit end - - return entityliving == null ? false : (!entityliving.isAlive() ? false : (!this.e ? !this.b.getNavigation().g() : this.b.b(MathHelper.floor(entityliving.locX), MathHelper.floor(entityliving.locY), MathHelper.floor(entityliving.locZ)))); - } - - public void c() { - this.b.getNavigation().a(this.f, this.d); - this.h = 0; - } - - public void d() { - this.b.getNavigation().h(); - } - - public void e() { - EntityLiving entityliving = this.b.getGoalTarget(); - - this.b.getControllerLook().a(entityliving, 30.0F, 30.0F); - double d0 = this.b.e(entityliving.locX, entityliving.boundingBox.b, entityliving.locZ); - double d1 = (double) (this.b.width * 2.0F * this.b.width * 2.0F + entityliving.width); - - --this.h; - if ((this.e || this.b.getEntitySenses().canSee(entityliving)) && this.h <= 0 && (this.i == 0.0D && this.j == 0.0D && this.k == 0.0D || entityliving.e(this.i, this.j, this.k) >= 1.0D || this.b.aI().nextFloat() < 0.05F)) { - this.i = entityliving.locX; - this.j = entityliving.boundingBox.b; - this.k = entityliving.locZ; - this.h = 4 + this.b.aI().nextInt(7); - if (d0 > 1024.0D) { - this.h += 10; - } else if (d0 > 256.0D) { - this.h += 5; - } - - if (!this.b.getNavigation().a((Entity) entityliving, this.d)) { - this.h += 15; - } - } - - this.c = Math.max(this.c - 1, 0); - if (d0 <= d1 && this.c <= 20) { - this.c = 20; - if (this.b.be() != null) { - this.b.ba(); - } - - this.b.n(entityliving); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java b/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java deleted file mode 100644 index 0c08df38..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalOcelotAttack.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.entity.EntityTargetEvent; // CraftBukkit - -public class PathfinderGoalOcelotAttack extends PathfinderGoal { - - World a; - EntityInsentient b; - EntityLiving c; - int d; - - public PathfinderGoalOcelotAttack(EntityInsentient entityinsentient) { - this.b = entityinsentient; - this.a = entityinsentient.world; - this.a(3); - } - - public boolean a() { - EntityLiving entityliving = this.b.getGoalTarget(); - - if (entityliving == null) { - return false; - } else { - this.c = entityliving; - return true; - } - } - - public boolean b() { - return !this.c.isAlive() ? false : (this.b.f(this.c) > 225.0D ? false : !this.b.getNavigation().g() || this.a()); - } - - public void d() { - // CraftBukkit start - EntityTargetEvent.TargetReason reason = this.c.isAlive() ? EntityTargetEvent.TargetReason.FORGOT_TARGET : EntityTargetEvent.TargetReason.TARGET_DIED; - org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetEvent(this.c, null, reason); - // CraftBukkit end - this.c = null; - this.b.getNavigation().h(); - } - - public void e() { - this.b.getControllerLook().a(this.c, 30.0F, 30.0F); - double d0 = (double) (this.b.width * 2.0F * this.b.width * 2.0F); - double d1 = this.b.e(this.c.locX, this.c.boundingBox.b, this.c.locZ); - double d2 = 0.8D; - - if (d1 > d0 && d1 < 16.0D) { - d2 = 1.33D; - } else if (d1 < 225.0D) { - d2 = 0.6D; - } - - this.b.getNavigation().a((Entity) this.c, d2); - this.d = Math.max(this.d - 1, 0); - if (d1 <= d0) { - if (this.d <= 0) { - this.d = 20; - this.b.n(this.c); - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalPanic.java b/src/main/java/net/minecraft/server/PathfinderGoalPanic.java deleted file mode 100644 index 1b8608d0..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalPanic.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalPanic extends PathfinderGoal { - - private EntityCreature a; - private double b; - private double c; - private double d; - private double e; - - public PathfinderGoalPanic(EntityCreature entitycreature, double d0) { - this.a = entitycreature; - this.b = d0; - this.a(1); - } - - public boolean a() { - if (this.a.getLastDamager() == null && !this.a.isBurning()) { - return false; - } else { - Vec3D vec3d = RandomPositionGenerator.a(this.a, 5, 4); - - if (vec3d == null) { - return false; - } else { - this.c = vec3d.a; - this.d = vec3d.b; - this.e = vec3d.c; - return true; - } - } - } - - public void c() { - this.a.getNavigation().a(this.c, this.d, this.e, this.b); - } - - public boolean b() { - // CraftBukkit start - introduce a temporary timeout hack until this is fixed properly - if ((this.a.ticksLived - this.a.aK()) > 100) { - this.a.b((EntityLiving) null); - return false; - } - // CraftBukkit end - return !this.a.getNavigation().g(); - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java b/src/main/java/net/minecraft/server/PathfinderGoalSelector.java deleted file mode 100644 index 33aded08..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalSelector.java +++ /dev/null @@ -1,153 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.craftbukkit.util.UnsafeList; // CraftBukkit - -public class PathfinderGoalSelector { - - private static final Logger a = LogManager.getLogger(); - // CraftBukkit start - ArrayList -> UnsafeList - private List b = new UnsafeList(); - private List c = new UnsafeList(); - // CraftBukkit end - private final MethodProfiler d; - private int e; - private int f = 3; - - public PathfinderGoalSelector(MethodProfiler methodprofiler) { - this.d = methodprofiler; - } - - public void a(int i, PathfinderGoal pathfindergoal) { - this.b.add(new PathfinderGoalSelectorItem(this, i, pathfindergoal)); - } - - public void a(PathfinderGoal pathfindergoal) { - Iterator iterator = this.b.iterator(); - - while (iterator.hasNext()) { - PathfinderGoalSelectorItem pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - PathfinderGoal pathfindergoal1 = pathfindergoalselectoritem.a; - - if (pathfindergoal1 == pathfindergoal) { - if (this.c.contains(pathfindergoalselectoritem)) { - pathfindergoal1.d(); - this.c.remove(pathfindergoalselectoritem); - } - - iterator.remove(); - } - } - } - - public void a() { - // ArrayList arraylist = new ArrayList(); // CraftBukkit - remove usage - Iterator iterator; - PathfinderGoalSelectorItem pathfindergoalselectoritem; - - if (this.e++ % this.f == 0) { - iterator = this.b.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - boolean flag = this.c.contains(pathfindergoalselectoritem); - - if (flag) { - if (this.b(pathfindergoalselectoritem) && this.a(pathfindergoalselectoritem)) { - continue; - } - - pathfindergoalselectoritem.a.d(); - this.c.remove(pathfindergoalselectoritem); - } - - if (this.b(pathfindergoalselectoritem) && pathfindergoalselectoritem.a.a()) { - // CraftBukkit start - call method now instead of queueing - // arraylist.add(pathfindergoalselectoritem); - pathfindergoalselectoritem.a.c(); - // CraftBukkit end - this.c.add(pathfindergoalselectoritem); - } - } - } else { - iterator = this.c.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - if (!pathfindergoalselectoritem.a.b()) { - pathfindergoalselectoritem.a.d(); - iterator.remove(); - } - } - } - - this.d.a("goalStart"); - // CraftBukkit start - removed usage of arraylist - /*iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - this.d.a(pathfindergoalselectoritem.a.getClass().getSimpleName()); - pathfindergoalselectoritem.a.c(); - this.d.b(); - }*/ - // CraftBukkit end - - this.d.b(); - this.d.a("goalTick"); - iterator = this.c.iterator(); - - while (iterator.hasNext()) { - pathfindergoalselectoritem = (PathfinderGoalSelectorItem) iterator.next(); - pathfindergoalselectoritem.a.e(); - } - - this.d.b(); - } - - private boolean a(PathfinderGoalSelectorItem pathfindergoalselectoritem) { - this.d.a("canContinue"); - boolean flag = pathfindergoalselectoritem.a.b(); - - this.d.b(); - return flag; - } - - private boolean b(PathfinderGoalSelectorItem pathfindergoalselectoritem) { - this.d.a("canUse"); - Iterator iterator = this.b.iterator(); - - while (iterator.hasNext()) { - PathfinderGoalSelectorItem pathfindergoalselectoritem1 = (PathfinderGoalSelectorItem) iterator.next(); - - if (pathfindergoalselectoritem1 != pathfindergoalselectoritem) { - if (pathfindergoalselectoritem.b >= pathfindergoalselectoritem1.b) { - // CraftBukkit - switch order - if (!this.a(pathfindergoalselectoritem, pathfindergoalselectoritem1) && this.c.contains(pathfindergoalselectoritem1)) { - this.d.b(); - ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse - return false; - } - // CraftBukkit - switch order - } else if (!pathfindergoalselectoritem1.a.i() && this.c.contains(pathfindergoalselectoritem1)) { - this.d.b(); - ((UnsafeList.Itr) iterator).valid = false; // CraftBukkit - mark iterator for reuse - return false; - } - } - } - - this.d.b(); - return true; - } - - private boolean a(PathfinderGoalSelectorItem pathfindergoalselectoritem, PathfinderGoalSelectorItem pathfindergoalselectoritem1) { - return (pathfindergoalselectoritem.a.j() & pathfindergoalselectoritem1.a.j()) == 0; - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalSit.java b/src/main/java/net/minecraft/server/PathfinderGoalSit.java deleted file mode 100644 index 60371bed..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalSit.java +++ /dev/null @@ -1,39 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalSit extends PathfinderGoal { - - private EntityTameableAnimal entity; - private boolean willSit; - - public PathfinderGoalSit(EntityTameableAnimal entitytameableanimal) { - this.entity = entitytameableanimal; - this.a(5); - } - - public boolean a() { - if (!this.entity.isTamed()) { - return this.willSit && this.entity.getGoalTarget() == null; // CraftBukkit - Allow sitting for wild animals - } else if (this.entity.M()) { - return false; - } else if (!this.entity.onGround) { - return false; - } else { - EntityLiving entityliving = this.entity.getOwner(); - - return entityliving == null ? true : (this.entity.f(entityliving) < 144.0D && entityliving.getLastDamager() != null ? false : this.willSit); - } - } - - public void c() { - this.entity.getNavigation().h(); - this.entity.setSitting(true); - } - - public void d() { - this.entity.setSitting(false); - } - - public void setSitting(boolean flag) { - this.willSit = flag; - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalTame.java b/src/main/java/net/minecraft/server/PathfinderGoalTame.java deleted file mode 100644 index a13c6382..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalTame.java +++ /dev/null @@ -1,72 +0,0 @@ -package net.minecraft.server; - -public class PathfinderGoalTame extends PathfinderGoal { - - private EntityHorse entity; - private double b; - private double c; - private double d; - private double e; - - public PathfinderGoalTame(EntityHorse entityhorse, double d0) { - this.entity = entityhorse; - this.b = d0; - this.a(1); - } - - public boolean a() { - if (!this.entity.isTame() && this.entity.passenger != null) { - Vec3D vec3d = RandomPositionGenerator.a(this.entity, 5, 4); - - if (vec3d == null) { - return false; - } else { - this.c = vec3d.a; - this.d = vec3d.b; - this.e = vec3d.c; - return true; - } - } else { - return false; - } - } - - public void c() { - this.entity.getNavigation().a(this.c, this.d, this.e, this.b); - } - - public boolean b() { - return !this.entity.getNavigation().g() && this.entity.passenger != null; - } - - public void e() { - if (this.entity.aI().nextInt(50) == 0) { - if (this.entity.passenger instanceof EntityHuman) { - int i = this.entity.getTemper(); - int j = this.entity.getMaxDomestication(); - - // CraftBukkit - fire EntityTameEvent - if (j > 0 && this.entity.aI().nextInt(j) < i && !org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTameEvent(this.entity, (EntityHuman) this.entity.passenger).isCancelled() && this.entity.passenger instanceof EntityHuman) { - this.entity.h((EntityHuman) this.entity.passenger); - this.entity.world.broadcastEntityEffect(this.entity, (byte) 7); - return; - } - - this.entity.v(5); - } - - // CraftBukkit start - Handle dismounting to account for VehicleExitEvent being fired. - if (this.entity.passenger != null) { - this.entity.passenger.mount((Entity) null); - // If the entity still has a passenger, then a plugin cancelled the event. - if (this.entity.passenger != null) { - return; - } - } - // this.entity.passenger = null; - // CraftBukkit end - this.entity.cJ(); - this.entity.world.broadcastEntityEffect(this.entity, (byte) 6); - } - } -} diff --git a/src/main/java/net/minecraft/server/PathfinderGoalTarget.java b/src/main/java/net/minecraft/server/PathfinderGoalTarget.java deleted file mode 100644 index 761fe6da..00000000 --- a/src/main/java/net/minecraft/server/PathfinderGoalTarget.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.org.apache.commons.lang3.StringUtils; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.event.entity.EntityTargetEvent; -// CraftBukkit end - -public abstract class PathfinderGoalTarget extends PathfinderGoal { - - protected EntityCreature c; - protected boolean d; - private boolean a; - private int b; - private int e; - private int f; - - public PathfinderGoalTarget(EntityCreature entitycreature, boolean flag) { - this(entitycreature, flag, false); - } - - public PathfinderGoalTarget(EntityCreature entitycreature, boolean flag, boolean flag1) { - this.c = entitycreature; - this.d = flag; - this.a = flag1; - } - - public boolean b() { - EntityLiving entityliving = this.c.getGoalTarget(); - - if (entityliving == null) { - return false; - } else if (!entityliving.isAlive()) { - return false; - } else { - double d0 = this.f(); - - if (this.c.f(entityliving) > d0 * d0) { - return false; - } else { - if (this.d) { - if (this.c.getEntitySenses().canSee(entityliving)) { - this.f = 0; - } else if (++this.f > 60) { - return false; - } - } - - return !(entityliving instanceof EntityPlayer) || !((EntityPlayer) entityliving).playerInteractManager.isCreative(); - } - } - } - - protected double f() { - AttributeInstance attributeinstance = this.c.getAttributeInstance(GenericAttributes.b); - - return attributeinstance == null ? 16.0D : attributeinstance.getValue(); - } - - public void c() { - this.b = 0; - this.e = 0; - this.f = 0; - } - - public void d() { - this.c.setGoalTarget((EntityLiving) null); - } - - protected boolean a(EntityLiving entityliving, boolean flag) { - if (entityliving == null) { - return false; - } else if (entityliving == this.c) { - return false; - } else if (!entityliving.isAlive()) { - return false; - } else if (!this.c.a(entityliving.getClass())) { - return false; - } else { - if (this.c instanceof EntityOwnable && StringUtils.isNotEmpty(((EntityOwnable) this.c).getOwnerUUID())) { - if (entityliving instanceof EntityOwnable && ((EntityOwnable) this.c).getOwnerUUID().equals(((EntityOwnable) entityliving).getOwnerUUID())) { - return false; - } - - if (entityliving == ((EntityOwnable) this.c).getOwner()) { - return false; - } - } else if (entityliving instanceof EntityHuman && !flag && ((EntityHuman) entityliving).abilities.isInvulnerable) { - return false; - } - - if (!this.c.b(MathHelper.floor(entityliving.locX), MathHelper.floor(entityliving.locY), MathHelper.floor(entityliving.locZ))) { - return false; - } else if (this.d && !this.c.getEntitySenses().canSee(entityliving)) { - return false; - } else { - if (this.a) { - if (--this.e <= 0) { - this.b = 0; - } - - if (this.b == 0) { - this.b = this.a(entityliving) ? 1 : 2; - } - - if (this.b == 2) { - return false; - } - } - - // CraftBukkit start - Check all the different target goals for the reason, default to RANDOM_TARGET - EntityTargetEvent.TargetReason reason = EntityTargetEvent.TargetReason.RANDOM_TARGET; - - if (this instanceof PathfinderGoalDefendVillage) { - reason = EntityTargetEvent.TargetReason.DEFEND_VILLAGE; - } else if (this instanceof PathfinderGoalHurtByTarget) { - reason = EntityTargetEvent.TargetReason.TARGET_ATTACKED_ENTITY; - } else if (this instanceof PathfinderGoalNearestAttackableTarget) { - if (entityliving instanceof EntityHuman) { - reason = EntityTargetEvent.TargetReason.CLOSEST_PLAYER; - } - } else if (this instanceof PathfinderGoalOwnerHurtByTarget) { - reason = EntityTargetEvent.TargetReason.TARGET_ATTACKED_OWNER; - } else if (this instanceof PathfinderGoalOwnerHurtTarget) { - reason = EntityTargetEvent.TargetReason.OWNER_ATTACKED_TARGET; - } - - org.bukkit.event.entity.EntityTargetLivingEntityEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callEntityTargetLivingEvent(this.c, entityliving, reason); - if (event.isCancelled() || event.getTarget() == null) { - this.c.setGoalTarget(null); - return false; - } else if (entityliving.getBukkitEntity() != event.getTarget()) { - this.c.setGoalTarget((EntityLiving) ((CraftEntity) event.getTarget()).getHandle()); - } - if (this.c instanceof EntityCreature) { - ((EntityCreature) this.c).target = ((CraftEntity) event.getTarget()).getHandle(); - } - // CraftBukkit end - - return true; - } - } - } - - private boolean a(EntityLiving entityliving) { - this.e = 10 + this.c.aI().nextInt(5); - PathEntity pathentity = this.c.getNavigation().a(entityliving); - - if (pathentity == null) { - return false; - } else { - PathPoint pathpoint = pathentity.c(); - - if (pathpoint == null) { - return false; - } else { - int i = pathpoint.a - MathHelper.floor(entityliving.locX); - int j = pathpoint.c - MathHelper.floor(entityliving.locZ); - - return (double) (i * i + j * j) <= 2.25D; - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PlayerAbilities.java b/src/main/java/net/minecraft/server/PlayerAbilities.java deleted file mode 100644 index 88718ce0..00000000 --- a/src/main/java/net/minecraft/server/PlayerAbilities.java +++ /dev/null @@ -1,54 +0,0 @@ -package net.minecraft.server; - -public class PlayerAbilities { - - public boolean isInvulnerable; - public boolean isFlying; - public boolean canFly; - public boolean canInstantlyBuild; - public boolean mayBuild = true; - public float flySpeed = 0.05F; // CraftBukkit private -> public - public float walkSpeed = 0.1F; // CraftBukkit private -> public - - public PlayerAbilities() {} - - public void a(NBTTagCompound nbttagcompound) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setBoolean("invulnerable", this.isInvulnerable); - nbttagcompound1.setBoolean("flying", this.isFlying); - nbttagcompound1.setBoolean("mayfly", this.canFly); - nbttagcompound1.setBoolean("instabuild", this.canInstantlyBuild); - nbttagcompound1.setBoolean("mayBuild", this.mayBuild); - nbttagcompound1.setFloat("flySpeed", this.flySpeed); - nbttagcompound1.setFloat("walkSpeed", this.walkSpeed); - nbttagcompound.set("abilities", nbttagcompound1); - } - - public void b(NBTTagCompound nbttagcompound) { - if (nbttagcompound.hasKeyOfType("abilities", 10)) { - NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("abilities"); - - this.isInvulnerable = nbttagcompound1.getBoolean("invulnerable"); - this.isFlying = nbttagcompound1.getBoolean("flying"); - this.canFly = nbttagcompound1.getBoolean("mayfly"); - this.canInstantlyBuild = nbttagcompound1.getBoolean("instabuild"); - if (nbttagcompound1.hasKeyOfType("flySpeed", 99)) { - this.flySpeed = nbttagcompound1.getFloat("flySpeed"); - this.walkSpeed = nbttagcompound1.getFloat("walkSpeed"); - } - - if (nbttagcompound1.hasKeyOfType("mayBuild", 1)) { - this.mayBuild = nbttagcompound1.getBoolean("mayBuild"); - } - } - } - - public float a() { - return this.flySpeed; - } - - public float b() { - return this.walkSpeed; - } -} diff --git a/src/main/java/net/minecraft/server/PlayerChunk.java b/src/main/java/net/minecraft/server/PlayerChunk.java deleted file mode 100644 index f5afcb7e..00000000 --- a/src/main/java/net/minecraft/server/PlayerChunk.java +++ /dev/null @@ -1,215 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; -import java.util.HashMap; -// CraftBukkit end - -class PlayerChunk { - - private final List b; - private final ChunkCoordIntPair location; - private short[] dirtyBlocks; - private int dirtyCount; - private int f; - private long g; - final PlayerChunkMap playerChunkMap; - // CraftBukkit start - add fields - private final HashMap<EntityPlayer, Runnable> players = new HashMap<EntityPlayer, Runnable>(); - private boolean loaded = false; - private Runnable loadedRunnable = new Runnable() { - public void run() { - PlayerChunk.this.loaded = true; - } - }; - // CraftBukkit end - - public PlayerChunk(PlayerChunkMap playerchunkmap, int i, int j) { - this.playerChunkMap = playerchunkmap; - this.b = new ArrayList(); - this.dirtyBlocks = new short[64]; - this.location = new ChunkCoordIntPair(i, j); - playerchunkmap.a().chunkProviderServer.getChunkAt(i, j, this.loadedRunnable); // CraftBukkit - } - - public void a(final EntityPlayer entityplayer) { // CraftBukkit - added final to argument - if (this.b.contains(entityplayer)) { - PlayerChunkMap.c().debug("Failed to add player. {} already is in chunk {}, {}", new Object[] { entityplayer, Integer.valueOf(this.location.x), Integer.valueOf(this.location.z)}); - } else { - if (this.b.isEmpty()) { - this.g = PlayerChunkMap.a(this.playerChunkMap).getTime(); - } - - this.b.add(entityplayer); - // CraftBukkit start - use async chunk io - Runnable playerRunnable; - if (this.loaded) { - playerRunnable = null; - entityplayer.chunkCoordIntPairQueue.add(this.location); - } else { - playerRunnable = new Runnable() { - public void run() { - entityplayer.chunkCoordIntPairQueue.add(PlayerChunk.this.location); - } - }; - this.playerChunkMap.a().chunkProviderServer.getChunkAt(this.location.x, this.location.z, playerRunnable); - } - - this.players.put(entityplayer, playerRunnable); - // CraftBukkit end - } - } - - public void b(EntityPlayer entityplayer) { - if (this.b.contains(entityplayer)) { - // CraftBukkit start - If we haven't loaded yet don't load the chunk just so we can clean it up - if (!this.loaded) { - ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.players.get(entityplayer)); - this.b.remove(entityplayer); - this.players.remove(entityplayer); - - if (this.b.isEmpty()) { - ChunkIOExecutor.dropQueuedChunkLoad(this.playerChunkMap.a(), this.location.x, this.location.z, this.loadedRunnable); - long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; - PlayerChunkMap.b(this.playerChunkMap).remove(i); - PlayerChunkMap.c(this.playerChunkMap).remove(this); - } - - return; - } - // CraftBukkit end - - Chunk chunk = PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z); - - if (chunk.isReady()) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutMapChunk(chunk, true, 0)); - } - - this.players.remove(entityplayer); // CraftBukkit - this.b.remove(entityplayer); - entityplayer.chunkCoordIntPairQueue.remove(this.location); - if (this.b.isEmpty()) { - long i = (long) this.location.x + 2147483647L | (long) this.location.z + 2147483647L << 32; - - this.a(chunk); - PlayerChunkMap.b(this.playerChunkMap).remove(i); - PlayerChunkMap.c(this.playerChunkMap).remove(this); - if (this.dirtyCount > 0) { - PlayerChunkMap.d(this.playerChunkMap).remove(this); - } - - this.playerChunkMap.a().chunkProviderServer.queueUnload(this.location.x, this.location.z); - } - } - } - - public void a() { - this.a(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z)); - } - - private void a(Chunk chunk) { - chunk.s += PlayerChunkMap.a(this.playerChunkMap).getTime() - this.g; - this.g = PlayerChunkMap.a(this.playerChunkMap).getTime(); - } - - public void a(int i, int j, int k) { - if (this.dirtyCount == 0) { - PlayerChunkMap.d(this.playerChunkMap).add(this); - } - - this.f |= 1 << (j >> 4); - if (this.dirtyCount < 64) { - short short1 = (short) (i << 12 | k << 8 | j); - - for (int l = 0; l < this.dirtyCount; ++l) { - if (this.dirtyBlocks[l] == short1) { - return; - } - } - - this.dirtyBlocks[this.dirtyCount++] = short1; - } - } - - public void sendAll(Packet packet) { - for (int i = 0; i < this.b.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) this.b.get(i); - - if (!entityplayer.chunkCoordIntPairQueue.contains(this.location)) { - entityplayer.playerConnection.sendPacket(packet); - } - } - } - - public void b() { - if (this.dirtyCount != 0) { - int i; - int j; - int k; - - if (this.dirtyCount == 1) { - i = this.location.x * 16 + (this.dirtyBlocks[0] >> 12 & 15); - j = this.dirtyBlocks[0] & 255; - k = this.location.z * 16 + (this.dirtyBlocks[0] >> 8 & 15); - this.sendAll(new PacketPlayOutBlockChange(i, j, k, PlayerChunkMap.a(this.playerChunkMap))); - if (PlayerChunkMap.a(this.playerChunkMap).getType(i, j, k).isTileEntity()) { - this.sendTileEntity(PlayerChunkMap.a(this.playerChunkMap).getTileEntity(i, j, k)); - } - } else { - int l; - - if (this.dirtyCount == 64) { - i = this.location.x * 16; - j = this.location.z * 16; - this.sendAll(new PacketPlayOutMapChunk(PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z), (this.f == 0xFFFF), this.f)); // CraftBukkit - send everything (including biome) if all sections flagged - - for (k = 0; k < 16; ++k) { - if ((this.f & 1 << k) != 0) { - l = k << 4; - List list = PlayerChunkMap.a(this.playerChunkMap).getTileEntities(i, l, j, i + 16, l + 16, j + 16); - - for (int i1 = 0; i1 < list.size(); ++i1) { - this.sendTileEntity((TileEntity) list.get(i1)); - } - } - } - } else { - this.sendAll(new PacketPlayOutMultiBlockChange(this.dirtyCount, this.dirtyBlocks, PlayerChunkMap.a(this.playerChunkMap).getChunkAt(this.location.x, this.location.z))); - - for (i = 0; i < this.dirtyCount; ++i) { - j = this.location.x * 16 + (this.dirtyBlocks[i] >> 12 & 15); - k = this.dirtyBlocks[i] & 255; - l = this.location.z * 16 + (this.dirtyBlocks[i] >> 8 & 15); - if (PlayerChunkMap.a(this.playerChunkMap).getType(j, k, l).isTileEntity()) { - this.sendTileEntity(PlayerChunkMap.a(this.playerChunkMap).getTileEntity(j, k, l)); - } - } - } - } - - this.dirtyCount = 0; - this.f = 0; - } - } - - private void sendTileEntity(TileEntity tileentity) { - if (tileentity != null) { - Packet packet = tileentity.getUpdatePacket(); - - if (packet != null) { - this.sendAll(packet); - } - } - } - - static ChunkCoordIntPair a(PlayerChunk playerchunk) { - return playerchunk.location; - } - - static List b(PlayerChunk playerchunk) { - return playerchunk.b; - } -} diff --git a/src/main/java/net/minecraft/server/PlayerChunkMap.java b/src/main/java/net/minecraft/server/PlayerChunkMap.java deleted file mode 100644 index ae53635d..00000000 --- a/src/main/java/net/minecraft/server/PlayerChunkMap.java +++ /dev/null @@ -1,371 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import java.util.Collections; -import java.util.Queue; -import java.util.LinkedList; -// CraftBukkit end - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -public class PlayerChunkMap { - - private static final Logger a = LogManager.getLogger(); - private final WorldServer world; - private final List managedPlayers = new ArrayList(); - private final LongHashMap d = new LongHashMap(); - private final Queue e = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue - private final Queue f = new java.util.concurrent.ConcurrentLinkedQueue(); // CraftBukkit ArrayList -> ConcurrentLinkedQueue - private int g; - private long h; - private final int[][] i = new int[][] { { 1, 0}, { 0, 1}, { -1, 0}, { 0, -1}}; - private boolean wasNotEmpty; // CraftBukkit - add field - - public PlayerChunkMap(WorldServer worldserver) { - this.world = worldserver; - this.a(worldserver.getMinecraftServer().getPlayerList().s()); - } - - public WorldServer a() { - return this.world; - } - - public void flush() { - long i = this.world.getTime(); - int j; - PlayerChunk playerchunk; - - if (i - this.h > 8000L) { - this.h = i; - - // CraftBukkit start - Use iterator - java.util.Iterator iterator = this.f.iterator(); - while (iterator.hasNext()) { - playerchunk = (PlayerChunk) iterator.next(); - playerchunk.b(); - playerchunk.a(); - } - } else { - java.util.Iterator iterator = this.e.iterator(); - - while (iterator.hasNext()) { - playerchunk = (PlayerChunk) iterator.next(); - playerchunk.b(); - iterator.remove(); - // CraftBukkit end - } - } - - // this.e.clear(); // CraftBukkit - Removals are already covered - if (this.managedPlayers.isEmpty()) { - if (!wasNotEmpty) return; // CraftBukkit - Only do unload when we go from non-empty to empty - WorldProvider worldprovider = this.world.worldProvider; - - if (!worldprovider.e()) { - this.world.chunkProviderServer.b(); - } - // CraftBukkit start - wasNotEmpty = false; - } else { - wasNotEmpty = true; - } - // CraftBukkit end - } - - public boolean a(int i, int j) { - long k = (long) i + 2147483647L | (long) j + 2147483647L << 32; - - return this.d.getEntry(k) != null; - } - - private PlayerChunk a(int i, int j, boolean flag) { - long k = (long) i + 2147483647L | (long) j + 2147483647L << 32; - PlayerChunk playerchunk = (PlayerChunk) this.d.getEntry(k); - - if (playerchunk == null && flag) { - playerchunk = new PlayerChunk(this, i, j); - this.d.put(k, playerchunk); - this.f.add(playerchunk); - } - - return playerchunk; - } - // CraftBukkit start - add method - public final boolean isChunkInUse(int x, int z) { - PlayerChunk pi = a(x, z, false); - if (pi != null) { - return (PlayerChunk.b(pi).size() > 0); - } - return false; - } - // CraftBukkit end - - public void flagDirty(int i, int j, int k) { - int l = i >> 4; - int i1 = k >> 4; - PlayerChunk playerchunk = this.a(l, i1, false); - - if (playerchunk != null) { - playerchunk.a(i & 15, j, k & 15); - } - } - - public void addPlayer(EntityPlayer entityplayer) { - int i = (int) entityplayer.locX >> 4; - int j = (int) entityplayer.locZ >> 4; - - entityplayer.d = entityplayer.locX; - entityplayer.e = entityplayer.locZ; - - // CraftBukkit start - Load nearby chunks first - List<ChunkCoordIntPair> chunkList = new LinkedList<ChunkCoordIntPair>(); - for (int k = i - this.g; k <= i + this.g; ++k) { - for (int l = j - this.g; l <= j + this.g; ++l) { - chunkList.add(new ChunkCoordIntPair(k, l)); - } - } - - Collections.sort(chunkList, new ChunkCoordComparator(entityplayer)); - for (ChunkCoordIntPair pair : chunkList) { - this.a(pair.x, pair.z, true).a(entityplayer); - } - // CraftBukkit end - - this.managedPlayers.add(entityplayer); - this.b(entityplayer); - } - - public void b(EntityPlayer entityplayer) { - ArrayList arraylist = new ArrayList(entityplayer.chunkCoordIntPairQueue); - int i = 0; - int j = this.g; - int k = (int) entityplayer.locX >> 4; - int l = (int) entityplayer.locZ >> 4; - int i1 = 0; - int j1 = 0; - ChunkCoordIntPair chunkcoordintpair = PlayerChunk.a(this.a(k, l, true)); - - entityplayer.chunkCoordIntPairQueue.clear(); - if (arraylist.contains(chunkcoordintpair)) { - entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); - } - - int k1; - - for (k1 = 1; k1 <= j * 2; ++k1) { - for (int l1 = 0; l1 < 2; ++l1) { - int[] aint = this.i[i++ % 4]; - - for (int i2 = 0; i2 < k1; ++i2) { - i1 += aint[0]; - j1 += aint[1]; - chunkcoordintpair = PlayerChunk.a(this.a(k + i1, l + j1, true)); - if (arraylist.contains(chunkcoordintpair)) { - entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); - } - } - } - } - - i %= 4; - - for (k1 = 0; k1 < j * 2; ++k1) { - i1 += this.i[i][0]; - j1 += this.i[i][1]; - chunkcoordintpair = PlayerChunk.a(this.a(k + i1, l + j1, true)); - if (arraylist.contains(chunkcoordintpair)) { - entityplayer.chunkCoordIntPairQueue.add(chunkcoordintpair); - } - } - } - - public void removePlayer(EntityPlayer entityplayer) { - int i = (int) entityplayer.d >> 4; - int j = (int) entityplayer.e >> 4; - - for (int k = i - this.g; k <= i + this.g; ++k) { - for (int l = j - this.g; l <= j + this.g; ++l) { - PlayerChunk playerchunk = this.a(k, l, false); - - if (playerchunk != null) { - playerchunk.b(entityplayer); - } - } - } - - this.managedPlayers.remove(entityplayer); - } - - private boolean a(int i, int j, int k, int l, int i1) { - int j1 = i - k; - int k1 = j - l; - - return j1 >= -i1 && j1 <= i1 ? k1 >= -i1 && k1 <= i1 : false; - } - - public void movePlayer(EntityPlayer entityplayer) { - int i = (int) entityplayer.locX >> 4; - int j = (int) entityplayer.locZ >> 4; - double d0 = entityplayer.d - entityplayer.locX; - double d1 = entityplayer.e - entityplayer.locZ; - double d2 = d0 * d0 + d1 * d1; - - if (d2 >= 64.0D) { - int k = (int) entityplayer.d >> 4; - int l = (int) entityplayer.e >> 4; - int i1 = this.g; - int j1 = i - k; - int k1 = j - l; - List<ChunkCoordIntPair> chunksToLoad = new LinkedList<ChunkCoordIntPair>(); // CraftBukkit - - if (j1 != 0 || k1 != 0) { - for (int l1 = i - i1; l1 <= i + i1; ++l1) { - for (int i2 = j - i1; i2 <= j + i1; ++i2) { - if (!this.a(l1, i2, k, l, i1)) { - chunksToLoad.add(new ChunkCoordIntPair(l1, i2)); // CraftBukkit - } - - if (!this.a(l1 - j1, i2 - k1, i, j, i1)) { - PlayerChunk playerchunk = this.a(l1 - j1, i2 - k1, false); - - if (playerchunk != null) { - playerchunk.b(entityplayer); - } - } - } - } - - this.b(entityplayer); - entityplayer.d = entityplayer.locX; - entityplayer.e = entityplayer.locZ; - - // CraftBukkit start - send nearest chunks first - Collections.sort(chunksToLoad, new ChunkCoordComparator(entityplayer)); - for (ChunkCoordIntPair pair : chunksToLoad) { - this.a(pair.x, pair.z, true).a(entityplayer); - } - - if (i1 > 1 || i1 < -1 || j1 > 1 || j1 < -1) { - Collections.sort(entityplayer.chunkCoordIntPairQueue, new ChunkCoordComparator(entityplayer)); - } - // CraftBukkit end - } - } - } - - public boolean a(EntityPlayer entityplayer, int i, int j) { - PlayerChunk playerchunk = this.a(i, j, false); - - return playerchunk != null && PlayerChunk.b(playerchunk).contains(entityplayer) && !entityplayer.chunkCoordIntPairQueue.contains(PlayerChunk.a(playerchunk)); - } - - public void a(int i) { - i = MathHelper.a(i, 3, 20); - if (i != this.g) { - int j = i - this.g; - Iterator iterator = this.managedPlayers.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - int k = (int) entityplayer.locX >> 4; - int l = (int) entityplayer.locZ >> 4; - int i1; - int j1; - - if (j > 0) { - for (i1 = k - i; i1 <= k + i; ++i1) { - for (j1 = l - i; j1 <= l + i; ++j1) { - PlayerChunk playerchunk = this.a(i1, j1, true); - - if (!PlayerChunk.b(playerchunk).contains(entityplayer)) { - playerchunk.a(entityplayer); - } - } - } - } else { - for (i1 = k - this.g; i1 <= k + this.g; ++i1) { - for (j1 = l - this.g; j1 <= l + this.g; ++j1) { - if (!this.a(i1, j1, k, l, i)) { - this.a(i1, j1, true).b(entityplayer); - } - } - } - } - } - - this.g = i; - } - } - - public static int getFurthestViewableBlock(int i) { - return i * 16 - 16; - } - - static Logger c() { - return a; - } - - static WorldServer a(PlayerChunkMap playerchunkmap) { - return playerchunkmap.world; - } - - static LongHashMap b(PlayerChunkMap playerchunkmap) { - return playerchunkmap.d; - } - - static Queue c(PlayerChunkMap playermanager) { // CraftBukkit List -> Queue - return playermanager.f; - } - - static Queue d(PlayerChunkMap playermanager) { // CraftBukkit List -> Queue - return playermanager.e; - } - - // CraftBukkit start - Sorter to load nearby chunks first - private static class ChunkCoordComparator implements java.util.Comparator<ChunkCoordIntPair> { - private int x; - private int z; - - public ChunkCoordComparator (EntityPlayer entityplayer) { - x = (int) entityplayer.locX >> 4; - z = (int) entityplayer.locZ >> 4; - } - - public int compare(ChunkCoordIntPair a, ChunkCoordIntPair b) { - if (a.equals(b)) { - return 0; - } - - // Subtract current position to set center point - int ax = a.x - this.x; - int az = a.z - this.z; - int bx = b.x - this.x; - int bz = b.z - this.z; - - int result = ((ax - bx) * (ax + bx)) + ((az - bz) * (az + bz)); - if (result != 0) { - return result; - } - - if (ax < 0) { - if (bx < 0) { - return bz - az; - } else { - return -1; - } - } else { - if (bx < 0) { - return 1; - } else { - return az - bz; - } - } - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java deleted file mode 100644 index 3a984394..00000000 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ /dev/null @@ -1,1855 +0,0 @@ -package net.minecraft.server; - -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Date; -import java.util.Iterator; -import java.util.Random; -import java.util.concurrent.Callable; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; -import net.minecraft.util.org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.io.UnsupportedEncodingException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; -import java.util.HashSet; - -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.craftbukkit.inventory.CraftInventoryView; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.util.CraftChatMessage; -import org.bukkit.craftbukkit.util.LazyPlayerSet; -import org.bukkit.craftbukkit.util.Waitable; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.Event; -import org.bukkit.event.block.Action; -import org.bukkit.event.block.SignChangeEvent; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.CraftItemEvent; -import org.bukkit.event.inventory.InventoryAction; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryCreativeEvent; -import org.bukkit.event.inventory.InventoryType.SlotType; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import org.bukkit.event.player.PlayerAnimationEvent; -import org.bukkit.event.player.PlayerChatEvent; -import org.bukkit.event.player.PlayerCommandPreprocessEvent; -import org.bukkit.event.player.PlayerInteractEntityEvent; -import org.bukkit.event.player.PlayerItemHeldEvent; -import org.bukkit.event.player.PlayerKickEvent; -import org.bukkit.event.player.PlayerMoveEvent; -import org.bukkit.event.player.PlayerTeleportEvent; -import org.bukkit.event.player.PlayerToggleFlightEvent; -import org.bukkit.event.player.PlayerToggleSneakEvent; -import org.bukkit.event.player.PlayerToggleSprintEvent; -import org.bukkit.inventory.CraftingInventory; -import org.bukkit.inventory.InventoryView; -import org.bukkit.util.NumberConversions; -// CraftBukkit end - -public class PlayerConnection implements PacketPlayInListener { - - private static final Logger c = LogManager.getLogger(); - public final NetworkManager networkManager; - private final MinecraftServer minecraftServer; - public EntityPlayer player; - private int e; - private int f; - private boolean g; - private int h; - private long i; - private static Random j = new Random(); - private long k; - private volatile int chatThrottle; private static final AtomicIntegerFieldUpdater chatSpamField = AtomicIntegerFieldUpdater.newUpdater(PlayerConnection.class, "chatThrottle"); // CraftBukkit - multithreaded field - private int x; - private IntHashMap n = new IntHashMap(); - private double y; - private double z; - private double q; - public boolean checkMovement = true; // CraftBukkit - private -> public - private boolean processedDisconnect; // CraftBukkit - added - - public PlayerConnection(MinecraftServer minecraftserver, NetworkManager networkmanager, EntityPlayer entityplayer) { - this.minecraftServer = minecraftserver; - this.networkManager = networkmanager; - networkmanager.a((PacketListener) this); - this.player = entityplayer; - entityplayer.playerConnection = this; - - // CraftBukkit start - add fields and methods - this.server = minecraftserver.server; - } - - private final org.bukkit.craftbukkit.CraftServer server; - private int lastTick = MinecraftServer.currentTick; - private int lastDropTick = MinecraftServer.currentTick; - private int dropCount = 0; - private static final int SURVIVAL_PLACE_DISTANCE_SQUARED = 6 * 6; - private static final int CREATIVE_PLACE_DISTANCE_SQUARED = 7 * 7; - - // Get position of last block hit for BlockDamageLevel.STOPPED - private double lastPosX = Double.MAX_VALUE; - private double lastPosY = Double.MAX_VALUE; - private double lastPosZ = Double.MAX_VALUE; - private float lastPitch = Float.MAX_VALUE; - private float lastYaw = Float.MAX_VALUE; - private boolean justTeleported = false; - - // For the PacketPlayOutBlockPlace hack :( - Long lastPacket; - - // Store the last block right clicked and what type it was - private Item lastMaterial; - - public CraftPlayer getPlayer() { - return (this.player == null) ? null : (CraftPlayer) this.player.getBukkitEntity(); - } - private final static HashSet<Integer> invalidItems = new HashSet<Integer>(java.util.Arrays.asList(8, 9, 10, 11, 26, 34, 36, 43, 51, 52, 55, 59, 60, 62, 63, 64, 68, 71, 74, 75, 83, 90, 92, 93, 94, 104, 105, 115, 117, 118, 119, 125, 127, 132, 140, 141, 142, 144)); // TODO: Check after every update. - // CraftBukkit end - - public void a() { - this.g = false; - ++this.e; - this.minecraftServer.methodProfiler.a("keepAlive"); - if ((long) this.e - this.k > 40L) { - this.k = (long) this.e; - this.i = this.d(); - this.h = (int) this.i; - this.sendPacket(new PacketPlayOutKeepAlive(this.h)); - } - - // CraftBukkit start - for (int spam; (spam = this.chatThrottle) > 0 && !chatSpamField.compareAndSet(this, spam, spam - 1); ) ; - /* Use thread-safe field access instead - if (this.chatThrottle > 0) { - --this.chatThrottle; - } - */ - // CraftBukkit end - - if (this.x > 0) { - --this.x; - } - - if (this.player.x() > 0L && this.minecraftServer.getIdleTimeout() > 0 && MinecraftServer.ar() - this.player.x() > (long) (this.minecraftServer.getIdleTimeout() * 1000 * 60)) { - this.disconnect("You have been idle for too long!"); - } - } - - public NetworkManager b() { - return this.networkManager; - } - - public void disconnect(String s) { - // CraftBukkit start - fire PlayerKickEvent - String leaveMessage = EnumChatFormat.YELLOW + this.player.getName() + " left the game."; - - PlayerKickEvent event = new PlayerKickEvent(this.server.getPlayer(this.player), s, leaveMessage); - - if (this.server.getServer().isRunning()) { - this.server.getPluginManager().callEvent(event); - } - - if (event.isCancelled()) { - // Do not kick the player - return; - } - // Send the possibly modified leave message - s = event.getReason(); - // CraftBukkit end - ChatComponentText chatcomponenttext = new ChatComponentText(s); - - this.networkManager.handle(new PacketPlayOutKickDisconnect(chatcomponenttext), new GenericFutureListener[] { new PlayerConnectionFuture(this, chatcomponenttext)}); - this.a(chatcomponenttext); // CraftBukkit - Process quit immediately - this.networkManager.g(); - } - - public void a(PacketPlayInSteerVehicle packetplayinsteervehicle) { - this.player.a(packetplayinsteervehicle.c(), packetplayinsteervehicle.d(), packetplayinsteervehicle.e(), packetplayinsteervehicle.f()); - } - - public void a(PacketPlayInFlying packetplayinflying) { - // CraftBukkit start - Check for NaN - if (Double.isNaN(packetplayinflying.x) || Double.isNaN(packetplayinflying.y) || Double.isNaN(packetplayinflying.z) || Double.isNaN(packetplayinflying.stance)) { - c.warn(player.getName() + " was caught trying to crash the server with an invalid position."); - getPlayer().kickPlayer("Nope!"); - return; - } - // CraftBukkit end - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - this.g = true; - if (!this.player.viewingCredits) { - double d0; - - if (!this.checkMovement) { - d0 = packetplayinflying.d() - this.z; - if (packetplayinflying.c() == this.y && d0 * d0 < 0.01D && packetplayinflying.e() == this.q) { - this.checkMovement = true; - } - } - - // CraftBukkit start - fire PlayerMoveEvent - Player player = this.getPlayer(); - Location from = new Location(player.getWorld(), lastPosX, lastPosY, lastPosZ, lastYaw, lastPitch); // Get the Players previous Event location. - Location to = player.getLocation().clone(); // Start off the To location as the Players current location. - - // If the packet contains movement information then we update the To location with the correct XYZ. - if (packetplayinflying.hasPos && !(packetplayinflying.hasPos && packetplayinflying.y == -999.0D && packetplayinflying.stance == -999.0D)) { - to.setX(packetplayinflying.x); - to.setY(packetplayinflying.y); - to.setZ(packetplayinflying.z); - } - - // If the packet contains look information then we update the To location with the correct Yaw & Pitch. - if (packetplayinflying.hasLook) { - to.setYaw(packetplayinflying.yaw); - to.setPitch(packetplayinflying.pitch); - } - - // Prevent 40 event-calls for less than a single pixel of movement >.> - double delta = Math.pow(this.lastPosX - to.getX(), 2) + Math.pow(this.lastPosY - to.getY(), 2) + Math.pow(this.lastPosZ - to.getZ(), 2); - float deltaAngle = Math.abs(this.lastYaw - to.getYaw()) + Math.abs(this.lastPitch - to.getPitch()); - - if ((delta > 1f / 256 || deltaAngle > 10f) && (this.checkMovement && !this.player.dead)) { - this.lastPosX = to.getX(); - this.lastPosY = to.getY(); - this.lastPosZ = to.getZ(); - this.lastYaw = to.getYaw(); - this.lastPitch = to.getPitch(); - - // Skip the first time we do this - if (from.getX() != Double.MAX_VALUE) { - PlayerMoveEvent event = new PlayerMoveEvent(player, from, to); - this.server.getPluginManager().callEvent(event); - - // If the event is cancelled we move the player back to their old location. - if (event.isCancelled()) { - this.player.playerConnection.sendPacket(new PacketPlayOutPosition(from.getX(), from.getY() + 1.6200000047683716D, from.getZ(), from.getYaw(), from.getPitch(), false)); - return; - } - - /* If a Plugin has changed the To destination then we teleport the Player - there to avoid any 'Moved wrongly' or 'Moved too quickly' errors. - We only do this if the Event was not cancelled. */ - if (!to.equals(event.getTo()) && !event.isCancelled()) { - this.player.getBukkitEntity().teleport(event.getTo(), PlayerTeleportEvent.TeleportCause.UNKNOWN); - return; - } - - /* Check to see if the Players Location has some how changed during the call of the event. - This can happen due to a plugin teleporting the player instead of using .setTo() */ - if (!from.equals(this.getPlayer().getLocation()) && this.justTeleported) { - this.justTeleported = false; - return; - } - } - } - - if (this.checkMovement && !this.player.dead) { - // CraftBukkit end - double d1; - double d2; - double d3; - - if (this.player.vehicle != null) { - float f = this.player.yaw; - float f1 = this.player.pitch; - - this.player.vehicle.ac(); - d1 = this.player.locX; - d2 = this.player.locY; - d3 = this.player.locZ; - if (packetplayinflying.k()) { - f = packetplayinflying.g(); - f1 = packetplayinflying.h(); - } - - this.player.onGround = packetplayinflying.i(); - this.player.i(); - this.player.V = 0.0F; - this.player.setLocation(d1, d2, d3, f, f1); - if (this.player.vehicle != null) { - this.player.vehicle.ac(); - } - - this.minecraftServer.getPlayerList().d(this.player); - if (this.checkMovement) { - this.y = this.player.locX; - this.z = this.player.locY; - this.q = this.player.locZ; - } - - worldserver.playerJoinedWorld(this.player); - return; - } - - if (this.player.isSleeping()) { - this.player.i(); - this.player.setLocation(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - worldserver.playerJoinedWorld(this.player); - return; - } - - d0 = this.player.locY; - this.y = this.player.locX; - this.z = this.player.locY; - this.q = this.player.locZ; - d1 = this.player.locX; - d2 = this.player.locY; - d3 = this.player.locZ; - float f2 = this.player.yaw; - float f3 = this.player.pitch; - - if (packetplayinflying.j() && packetplayinflying.d() == -999.0D && packetplayinflying.f() == -999.0D) { - packetplayinflying.a(false); - } - - double d4; - - if (packetplayinflying.j()) { - d1 = packetplayinflying.c(); - d2 = packetplayinflying.d(); - d3 = packetplayinflying.e(); - d4 = packetplayinflying.f() - packetplayinflying.d(); - if (!this.player.isSleeping() && (d4 > 1.65D || d4 < 0.1D)) { - this.disconnect("Illegal stance"); - c.warn(this.player.getName() + " had an illegal stance: " + d4); - return; - } - - if (Math.abs(packetplayinflying.c()) > 3.2E7D || Math.abs(packetplayinflying.e()) > 3.2E7D) { - this.disconnect("Illegal position"); - return; - } - } - - if (packetplayinflying.k()) { - f2 = packetplayinflying.g(); - f3 = packetplayinflying.h(); - } - - this.player.i(); - this.player.V = 0.0F; - this.player.setLocation(this.y, this.z, this.q, f2, f3); - if (!this.checkMovement) { - return; - } - - d4 = d1 - this.player.locX; - double d5 = d2 - this.player.locY; - double d6 = d3 - this.player.locZ; - // CraftBukkit start - min to max - double d7 = Math.max(Math.abs(d4), Math.abs(this.player.motX)); - double d8 = Math.max(Math.abs(d5), Math.abs(this.player.motY)); - double d9 = Math.max(Math.abs(d6), Math.abs(this.player.motZ)); - // CraftBukkit end - double d10 = d7 * d7 + d8 * d8 + d9 * d9; - - if (d10 > 100.0D && this.checkMovement && (!this.minecraftServer.N() || !this.minecraftServer.M().equals(this.player.getName()))) { // CraftBukkit - Added this.checkMovement condition to solve this check being triggered by teleports - c.warn(this.player.getName() + " moved too quickly! " + d4 + "," + d5 + "," + d6 + " (" + d7 + ", " + d8 + ", " + d9 + ")"); - this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - return; - } - - float f4 = 0.0625F; - boolean flag = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty(); - - if (this.player.onGround && !packetplayinflying.i() && d5 > 0.0D) { - this.player.bj(); - } - - this.player.move(d4, d5, d6); - this.player.onGround = packetplayinflying.i(); - this.player.checkMovement(d4, d5, d6); - double d11 = d5; - - d4 = d1 - this.player.locX; - d5 = d2 - this.player.locY; - if (d5 > -0.5D || d5 < 0.5D) { - d5 = 0.0D; - } - - d6 = d3 - this.player.locZ; - d10 = d4 * d4 + d5 * d5 + d6 * d6; - boolean flag1 = false; - - if (d10 > 0.0625D && !this.player.isSleeping() && !this.player.playerInteractManager.isCreative()) { - flag1 = true; - c.warn(this.player.getName() + " moved wrongly!"); - } - - this.player.setLocation(d1, d2, d3, f2, f3); - boolean flag2 = worldserver.getCubes(this.player, this.player.boundingBox.clone().shrink((double) f4, (double) f4, (double) f4)).isEmpty(); - - if (flag && (flag1 || !flag2) && !this.player.isSleeping()) { - this.a(this.y, this.z, this.q, f2, f3); - return; - } - - AxisAlignedBB axisalignedbb = this.player.boundingBox.clone().grow((double) f4, (double) f4, (double) f4).a(0.0D, -0.55D, 0.0D); - - if (!this.minecraftServer.getAllowFlight() && !this.player.abilities.canFly && !worldserver.c(axisalignedbb)) { // CraftBukkit - check abilities instead of creative mode - if (d11 >= -0.03125D) { - ++this.f; - if (this.f > 80) { - c.warn(this.player.getName() + " was kicked for floating too long!"); - this.disconnect("Flying is not enabled on this server"); - return; - } - } - } else { - this.f = 0; - } - - this.player.onGround = packetplayinflying.i(); - this.minecraftServer.getPlayerList().d(this.player); - this.player.b(this.player.locY - d0, packetplayinflying.i()); - } else if (this.e % 20 == 0) { - this.a(this.y, this.z, this.q, this.player.yaw, this.player.pitch); - } - } - } - - public void a(double d0, double d1, double d2, float f, float f1) { - // CraftBukkit start - Delegate to teleport(Location) - Player player = this.getPlayer(); - Location from = player.getLocation(); - Location to = new Location(this.getPlayer().getWorld(), d0, d1, d2, f, f1); - PlayerTeleportEvent event = new PlayerTeleportEvent(player, from, to, PlayerTeleportEvent.TeleportCause.UNKNOWN); - this.server.getPluginManager().callEvent(event); - - from = event.getFrom(); - to = event.isCancelled() ? from : event.getTo(); - - this.teleport(to); - } - - public void teleport(Location dest) { - double d0, d1, d2; - float f, f1; - - d0 = dest.getX(); - d1 = dest.getY(); - d2 = dest.getZ(); - f = dest.getYaw(); - f1 = dest.getPitch(); - - // TODO: make sure this is the best way to address this. - if (Float.isNaN(f)) { - f = 0; - } - - if (Float.isNaN(f1)) { - f1 = 0; - } - - this.lastPosX = d0; - this.lastPosY = d1; - this.lastPosZ = d2; - this.lastYaw = f; - this.lastPitch = f1; - this.justTeleported = true; - // CraftBukkit end - - this.checkMovement = false; - this.y = d0; - this.z = d1; - this.q = d2; - this.player.setLocation(d0, d1, d2, f, f1); - this.player.playerConnection.sendPacket(new PacketPlayOutPosition(d0, d1 + 1.6200000047683716D, d2, f, f1, false)); - } - - public void a(PacketPlayInBlockDig packetplayinblockdig) { - if (this.player.dead) return; // CraftBukkit - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - this.player.v(); - if (packetplayinblockdig.g() == 4) { - // CraftBukkit start - limit how quickly items can be dropped - // If the ticks aren't the same then the count starts from 0 and we update the lastDropTick. - if (this.lastDropTick != MinecraftServer.currentTick) { - this.dropCount = 0; - this.lastDropTick = MinecraftServer.currentTick; - } else { - // Else we increment the drop count and check the amount. - this.dropCount++; - if (this.dropCount >= 20) { - this.c.warn(this.player.getName() + " dropped their items too quickly!"); - this.disconnect("You dropped your items too quickly (Hacking?)"); - return; - } - } - // CraftBukkit end - this.player.a(false); - } else if (packetplayinblockdig.g() == 3) { - this.player.a(true); - } else if (packetplayinblockdig.g() == 5) { - this.player.bA(); - } else { - boolean flag = false; - - if (packetplayinblockdig.g() == 0) { - flag = true; - } - - if (packetplayinblockdig.g() == 1) { - flag = true; - } - - if (packetplayinblockdig.g() == 2) { - flag = true; - } - - int i = packetplayinblockdig.c(); - int j = packetplayinblockdig.d(); - int k = packetplayinblockdig.e(); - - if (flag) { - double d0 = this.player.locX - ((double) i + 0.5D); - double d1 = this.player.locY - ((double) j + 0.5D) + 1.5D; - double d2 = this.player.locZ - ((double) k + 0.5D); - double d3 = d0 * d0 + d1 * d1 + d2 * d2; - - if (d3 > 36.0D) { - return; - } - - if (j >= this.minecraftServer.getMaxBuildHeight()) { - return; - } - } - - if (packetplayinblockdig.g() == 0) { - if (!this.minecraftServer.a(worldserver, i, j, k, this.player)) { - this.player.playerInteractManager.dig(i, j, k, packetplayinblockdig.f()); - } else { - // CraftBukkit start - fire PlayerInteractEvent - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, packetplayinblockdig.f(), this.player.inventory.getItemInHand()); - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - // Update any tile entity data for this block - TileEntity tileentity = worldserver.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); - } - // CraftBukkit end - } - } else if (packetplayinblockdig.g() == 2) { - this.player.playerInteractManager.a(i, j, k); - if (worldserver.getType(i, j, k).getMaterial() != Material.AIR) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - } - } else if (packetplayinblockdig.g() == 1) { - this.player.playerInteractManager.c(i, j, k); - if (worldserver.getType(i, j, k).getMaterial() != Material.AIR) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - } - } - } - } - - public void a(PacketPlayInBlockPlace packetplayinblockplace) { - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - // CraftBukkit start - if (this.player.dead) return; - - // This is a horrible hack needed because the client sends 2 packets on 'right mouse click' - // aimed at a block. We shouldn't need to get the second packet if the data is handled - // but we cannot know what the client will do, so we might still get it - // - // If the time between packets is small enough, and the 'signature' similar, we discard the - // second one. This sadly has to remain until Mojang makes their packets saner. :( - // -- Grum - if (packetplayinblockplace.getFace() == 255) { - if (packetplayinblockplace.getItemStack() != null && packetplayinblockplace.getItemStack().getItem() == this.lastMaterial && this.lastPacket != null && packetplayinblockplace.timestamp - this.lastPacket < 100) { - this.lastPacket = null; - return; - } - } else { - this.lastMaterial = packetplayinblockplace.getItemStack() == null ? null : packetplayinblockplace.getItemStack().getItem(); - this.lastPacket = packetplayinblockplace.timestamp; - } - // CraftBukkit - if rightclick decremented the item, always send the update packet. */ - // this is not here for CraftBukkit's own functionality; rather it is to fix - // a notch bug where the item doesn't update correctly. - boolean always = false; - // CraftBukkit end - - ItemStack itemstack = this.player.inventory.getItemInHand(); - boolean flag = false; - int i = packetplayinblockplace.c(); - int j = packetplayinblockplace.d(); - int k = packetplayinblockplace.e(); - int l = packetplayinblockplace.getFace(); - - this.player.v(); - if (packetplayinblockplace.getFace() == 255) { - if (itemstack == null) { - return; - } - - // CraftBukkit start - int itemstackAmount = itemstack.count; - org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack); - if (event.useItemInHand() != Event.Result.DENY) { - this.player.playerInteractManager.useItem(this.player, this.player.world, itemstack); - } - - // CraftBukkit - notch decrements the counter by 1 in the above method with food, - // snowballs and so forth, but he does it in a place that doesn't cause the - // inventory update packet to get sent - always = (itemstack.count != itemstackAmount) || itemstack.getItem() == Item.getItemOf(Blocks.WATER_LILY); - // CraftBukkit end - } else if (packetplayinblockplace.d() >= this.minecraftServer.getMaxBuildHeight() - 1 && (packetplayinblockplace.getFace() == 1 || packetplayinblockplace.d() >= this.minecraftServer.getMaxBuildHeight())) { - ChatMessage chatmessage = new ChatMessage("build.tooHigh", new Object[] { Integer.valueOf(this.minecraftServer.getMaxBuildHeight())}); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - this.player.playerConnection.sendPacket(new PacketPlayOutChat(chatmessage)); - flag = true; - } else { - // CraftBukkit start - Check if we can actually do something over this large a distance - Location eyeLoc = this.getPlayer().getEyeLocation(); - double reachDistance = NumberConversions.square(eyeLoc.getX() - i) + NumberConversions.square(eyeLoc.getY() - j) + NumberConversions.square(eyeLoc.getZ() - k); - if (reachDistance > (this.getPlayer().getGameMode() == org.bukkit.GameMode.CREATIVE ? CREATIVE_PLACE_DISTANCE_SQUARED : SURVIVAL_PLACE_DISTANCE_SQUARED)) { - return; - } - - if (!this.player.playerInteractManager.interact(this.player, worldserver, itemstack, i, j, k, l, packetplayinblockplace.h(), packetplayinblockplace.i(), packetplayinblockplace.j())) { - always = true; // force PacketPlayOutSetSlot to be sent to client to update ItemStack count - } - // CraftBukkit end - - flag = true; - } - - if (flag) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, worldserver)); - } - - itemstack = this.player.inventory.getItemInHand(); - if (itemstack != null && itemstack.count == 0) { - this.player.inventory.items[this.player.inventory.itemInHandIndex] = null; - itemstack = null; - } - - if (itemstack == null || itemstack.n() == 0) { - this.player.g = true; - this.player.inventory.items[this.player.inventory.itemInHandIndex] = ItemStack.b(this.player.inventory.items[this.player.inventory.itemInHandIndex]); - Slot slot = this.player.activeContainer.getSlot((IInventory) this.player.inventory, this.player.inventory.itemInHandIndex); - - this.player.activeContainer.b(); - this.player.g = false; - // CraftBukkit - TODO CHECK IF NEEDED -- new if structure might not need 'always'. Kept it in for now, but may be able to remove in future - if (!ItemStack.matches(this.player.inventory.getItemInHand(), packetplayinblockplace.getItemStack()) || always) { - this.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, slot.rawSlotIndex, this.player.inventory.getItemInHand())); - } - } - } - - public void a(IChatBaseComponent ichatbasecomponent) { - // CraftBukkit start - Rarely it would send a disconnect line twice - if (this.processedDisconnect) { - return; - } else { - this.processedDisconnect = true; - } - // CraftBukkit end - c.info(this.player.getName() + " lost connection: " + ichatbasecomponent.c()); // CraftBukkit - Don't toString the component - this.minecraftServer.az(); - // CraftBukkit start - Replace vanilla quit message handling with our own. - /* - ChatMessage chatmessage = new ChatMessage("multiplayer.player.left", new Object[] { this.player.getScoreboardDisplayName()}); - - chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); - this.minecraftServer.getPlayerList().sendMessage(chatmessage); - */ - - this.player.n(); - String quitMessage = this.minecraftServer.getPlayerList().disconnect(this.player); - if ((quitMessage != null) && (quitMessage.length() > 0)) { - this.minecraftServer.getPlayerList().sendMessage(CraftChatMessage.fromString(quitMessage)); - } - // CraftBukkit end - if (this.minecraftServer.N() && this.player.getName().equals(this.minecraftServer.M())) { - c.info("Stopping singleplayer server as player logged out"); - this.minecraftServer.safeShutdown(); - } - } - - public void sendPacket(Packet packet) { - if (packet instanceof PacketPlayOutChat) { - PacketPlayOutChat packetplayoutchat = (PacketPlayOutChat) packet; - EnumChatVisibility enumchatvisibility = this.player.getChatFlags(); - - if (enumchatvisibility == EnumChatVisibility.HIDDEN) { - return; - } - - if (enumchatvisibility == EnumChatVisibility.SYSTEM && !packetplayoutchat.d()) { - return; - } - } - - // CraftBukkit start - if (packet == null) { - return; - } else if (packet instanceof PacketPlayOutSpawnPosition) { - PacketPlayOutSpawnPosition packet6 = (PacketPlayOutSpawnPosition) packet; - this.player.compassTarget = new Location(this.getPlayer().getWorld(), packet6.x, packet6.y, packet6.z); - } - // CraftBukkit end - - try { - this.networkManager.handle(packet, new GenericFutureListener[0]); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Sending packet"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Packet being sent"); - - crashreportsystemdetails.a("Packet class", (Callable) (new CrashReportConnectionPacketClass(this, packet))); - throw new ReportedException(crashreport); - } - } - - public void a(PacketPlayInHeldItemSlot packetplayinhelditemslot) { - // CraftBukkit start - if (this.player.dead) return; - - if (packetplayinhelditemslot.c() >= 0 && packetplayinhelditemslot.c() < PlayerInventory.getHotbarSize()) { - PlayerItemHeldEvent event = new PlayerItemHeldEvent(this.getPlayer(), this.player.inventory.itemInHandIndex, packetplayinhelditemslot.c()); - this.server.getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.sendPacket(new PacketPlayOutHeldItemSlot(this.player.inventory.itemInHandIndex)); - this.player.v(); - return; - } - // CraftBukkit end - - this.player.inventory.itemInHandIndex = packetplayinhelditemslot.c(); - this.player.v(); - } else { - c.warn(this.player.getName() + " tried to set an invalid carried item"); - this.disconnect("Nope!"); // CraftBukkit - } - } - - public void a(PacketPlayInChat packetplayinchat) { - if (this.player.dead || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { // CraftBukkit - dead men tell no tales - ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - this.sendPacket(new PacketPlayOutChat(chatmessage)); - } else { - this.player.v(); - String s = packetplayinchat.c(); - - s = StringUtils.normalizeSpace(s); - - for (int i = 0; i < s.length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(s.charAt(i))) { - // CraftBukkit start - threadsafety - if (packetplayinchat.a()) { - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - PlayerConnection.this.disconnect("Illegal characters in chat"); - return null; - } - }; - - this.minecraftServer.processQueue.add(waitable); - - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } else { - this.disconnect("Illegal characters in chat"); - } - // CraftBukkit end - return; - } - } - - // CraftBukkit start - if (!packetplayinchat.a()) { - try { - this.minecraftServer.server.playerCommandState = true; - this.handleCommand(s); - } finally { - this.minecraftServer.server.playerCommandState = false; - } - } else if (s.isEmpty()) { - c.warn(this.player.getName() + " tried to send an empty message"); - } else if (getPlayer().isConversing()) { - getPlayer().acceptConversationInput(s); - } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { // Re-add "Command Only" flag check - ChatMessage chatmessage = new ChatMessage("chat.cannotSend", new Object[0]); - - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - this.sendPacket(new PacketPlayOutChat(chatmessage)); - } else if (true) { - this.chat(s, true); - // CraftBukkit end - the below is for reference. :) - } else { - ChatMessage chatmessage1 = new ChatMessage("chat.type.text", new Object[] { this.player.getScoreboardDisplayName(), s}); - - this.minecraftServer.getPlayerList().sendMessage(chatmessage1, false); - } - - // CraftBukkit start - replaced with thread safe throttle - // this.chatThrottle += 20; - if (chatSpamField.addAndGet(this, 20) > 200 && !this.minecraftServer.getPlayerList().isOp(this.player.getProfile())) { - if (packetplayinchat.a()) { - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - PlayerConnection.this.disconnect("disconnect.spam"); - return null; - } - }; - - this.minecraftServer.processQueue.add(waitable); - - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } catch (ExecutionException e) { - throw new RuntimeException(e); - } - } else { - this.disconnect("disconnect.spam"); - } - // CraftBukkit end - } - } - } - - // CraftBukkit start - add method - public void chat(String s, boolean async) { - if (s.isEmpty() || this.player.getChatFlags() == EnumChatVisibility.HIDDEN) { - return; - } - - if (!async && s.startsWith("/")) { - this.handleCommand(s); - } else if (this.player.getChatFlags() == EnumChatVisibility.SYSTEM) { - // Do nothing, this is coming from a plugin - } else { - Player player = this.getPlayer(); - AsyncPlayerChatEvent event = new AsyncPlayerChatEvent(async, player, s, new LazyPlayerSet()); - this.server.getPluginManager().callEvent(event); - - if (PlayerChatEvent.getHandlerList().getRegisteredListeners().length != 0) { - // Evil plugins still listening to deprecated event - final PlayerChatEvent queueEvent = new PlayerChatEvent(player, event.getMessage(), event.getFormat(), event.getRecipients()); - queueEvent.setCancelled(event.isCancelled()); - Waitable waitable = new Waitable() { - @Override - protected Object evaluate() { - org.bukkit.Bukkit.getPluginManager().callEvent(queueEvent); - - if (queueEvent.isCancelled()) { - return null; - } - - String message = String.format(queueEvent.getFormat(), queueEvent.getPlayer().getDisplayName(), queueEvent.getMessage()); - PlayerConnection.this.minecraftServer.console.sendMessage(message); - if (((LazyPlayerSet) queueEvent.getRecipients()).isLazy()) { - for (Object player : PlayerConnection.this.minecraftServer.getPlayerList().players) { - ((EntityPlayer) player).sendMessage(CraftChatMessage.fromString(message)); - } - } else { - for (Player player : queueEvent.getRecipients()) { - player.sendMessage(message); - } - } - return null; - }}; - if (async) { - minecraftServer.processQueue.add(waitable); - } else { - waitable.run(); - } - try { - waitable.get(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); // This is proper habit for java. If we aren't handling it, pass it on! - } catch (ExecutionException e) { - throw new RuntimeException("Exception processing chat event", e.getCause()); - } - } else { - if (event.isCancelled()) { - return; - } - - s = String.format(event.getFormat(), event.getPlayer().getDisplayName(), event.getMessage()); - minecraftServer.console.sendMessage(s); - if (((LazyPlayerSet) event.getRecipients()).isLazy()) { - for (Object recipient : minecraftServer.getPlayerList().players) { - ((EntityPlayer) recipient).sendMessage(CraftChatMessage.fromString(s)); - } - } else { - for (Player recipient : event.getRecipients()) { - recipient.sendMessage(s); - } - } - } - } - } - // CraftBukkit end - - private void handleCommand(String s) { - // CraftBukkit start - whole method - this.c.info(this.player.getName() + " issued server command: " + s); - - CraftPlayer player = this.getPlayer(); - - PlayerCommandPreprocessEvent event = new PlayerCommandPreprocessEvent(player, s, new LazyPlayerSet()); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - - try { - if (this.server.dispatchCommand(event.getPlayer(), event.getMessage().substring(1))) { - return; - } - } catch (org.bukkit.command.CommandException ex) { - player.sendMessage(org.bukkit.ChatColor.RED + "An internal error occurred while attempting to perform this command"); - java.util.logging.Logger.getLogger(PlayerConnection.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); - return; - } - //this.minecraftServer.getCommandHandler().a(this.player, s); - // CraftBukkit end - } - - public void a(PacketPlayInArmAnimation packetplayinarmanimation) { - if (this.player.dead) return; // CraftBukkit - this.player.v(); - if (packetplayinarmanimation.d() == 1) { - // CraftBukkit start - Raytrace to look for 'rogue armswings' - float f = 1.0F; - float f1 = this.player.lastPitch + (this.player.pitch - this.player.lastPitch) * f; - float f2 = this.player.lastYaw + (this.player.yaw - this.player.lastYaw) * f; - double d0 = this.player.lastX + (this.player.locX - this.player.lastX) * (double) f; - double d1 = this.player.lastY + (this.player.locY - this.player.lastY) * (double) f + 1.62D - (double) this.player.height; - double d2 = this.player.lastZ + (this.player.locZ - this.player.lastZ) * (double) f; - Vec3D vec3d = Vec3D.a(d0, d1, d2); - - float f3 = MathHelper.cos(-f2 * 0.017453292F - 3.1415927F); - float f4 = MathHelper.sin(-f2 * 0.017453292F - 3.1415927F); - float f5 = -MathHelper.cos(-f1 * 0.017453292F); - float f6 = MathHelper.sin(-f1 * 0.017453292F); - float f7 = f4 * f5; - float f8 = f3 * f5; - double d3 = 5.0D; - Vec3D vec3d1 = vec3d.add((double) f7 * d3, (double) f6 * d3, (double) f8 * d3); - MovingObjectPosition movingobjectposition = this.player.world.rayTrace(vec3d, vec3d1, false); - - if (movingobjectposition == null || movingobjectposition.type != EnumMovingObjectType.BLOCK) { - CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.inventory.getItemInHand()); - } - - // Arm swing animation - PlayerAnimationEvent event = new PlayerAnimationEvent(this.getPlayer()); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) return; - // CraftBukkit end - - this.player.ba(); - } - } - - public void a(PacketPlayInEntityAction packetplayinentityaction) { - // CraftBukkit start - if (this.player.dead) return; - - this.player.v(); - if (packetplayinentityaction.d() == 1 || packetplayinentityaction.d() == 2) { - PlayerToggleSneakEvent event = new PlayerToggleSneakEvent(this.getPlayer(), packetplayinentityaction.d() == 1); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - - if (packetplayinentityaction.d() == 4 || packetplayinentityaction.d() == 5) { - PlayerToggleSprintEvent event = new PlayerToggleSprintEvent(this.getPlayer(), packetplayinentityaction.d() == 4); - this.server.getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - if (packetplayinentityaction.d() == 1) { - this.player.setSneaking(true); - } else if (packetplayinentityaction.d() == 2) { - this.player.setSneaking(false); - } else if (packetplayinentityaction.d() == 4) { - this.player.setSprinting(true); - } else if (packetplayinentityaction.d() == 5) { - this.player.setSprinting(false); - } else if (packetplayinentityaction.d() == 3) { - this.player.a(false, true, true); - //this.checkMovement = false; // CraftBukkit - this is handled in teleport - } else if (packetplayinentityaction.d() == 6) { - if (this.player.vehicle != null && this.player.vehicle instanceof EntityHorse) { - ((EntityHorse) this.player.vehicle).w(packetplayinentityaction.e()); - } - } else if (packetplayinentityaction.d() == 7 && this.player.vehicle != null && this.player.vehicle instanceof EntityHorse) { - ((EntityHorse) this.player.vehicle).g(this.player); - } - } - - public void a(PacketPlayInUseEntity packetplayinuseentity) { - if (this.player.dead) return; // CraftBukkit - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - Entity entity = packetplayinuseentity.a((World) worldserver); - - this.player.v(); - if (entity != null) { - boolean flag = this.player.hasLineOfSight(entity); - double d0 = 36.0D; - - if (!flag) { - d0 = 9.0D; - } - - if (this.player.f(entity) < d0) { - ItemStack itemInHand = this.player.inventory.getItemInHand(); // CraftBukkit - if (packetplayinuseentity.c() == EnumEntityUseAction.INTERACT) { - // CraftBukkit start - boolean triggerTagUpdate = itemInHand != null && itemInHand.getItem() == Items.NAME_TAG && entity instanceof EntityInsentient; - boolean triggerChestUpdate = itemInHand != null && itemInHand.getItem() == Item.getItemOf(Blocks.CHEST) && entity instanceof EntityHorse; - boolean triggerLeashUpdate = itemInHand != null && itemInHand.getItem() == Items.LEASH && entity instanceof EntityInsentient; - PlayerInteractEntityEvent event = new PlayerInteractEntityEvent((Player) this.getPlayer(), entity.getBukkitEntity()); - this.server.getPluginManager().callEvent(event); - - if (triggerLeashUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.LEASH)) { - // Refresh the current leash state - this.sendPacket(new PacketPlayOutAttachEntity(1, entity, ((EntityInsentient) entity).getLeashHolder())); - } - - if (triggerTagUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Items.NAME_TAG)) { - // Refresh the current entity metadata - this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); - } - if (triggerChestUpdate && (event.isCancelled() || this.player.inventory.getItemInHand() == null || this.player.inventory.getItemInHand().getItem() != Item.getItemOf(Blocks.CHEST))) { - this.sendPacket(new PacketPlayOutEntityMetadata(entity.getId(), entity.datawatcher, true)); - } - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - - this.player.q(entity); - - // CraftBukkit start - if (itemInHand != null && itemInHand.count <= -1) { - this.player.updateInventory(this.player.activeContainer); - } - // CraftBukkit end - } else if (packetplayinuseentity.c() == EnumEntityUseAction.ATTACK) { - if (entity instanceof EntityItem || entity instanceof EntityExperienceOrb || entity instanceof EntityArrow || entity == this.player) { - this.disconnect("Attempting to attack an invalid entity"); - this.minecraftServer.warning("Player " + this.player.getName() + " tried to attack an invalid entity"); - return; - } - - this.player.attack(entity); - - // CraftBukkit start - if (itemInHand != null && itemInHand.count <= -1) { - this.player.updateInventory(this.player.activeContainer); - } - // CraftBukkit end - } - } - } - } - - public void a(PacketPlayInClientCommand packetplayinclientcommand) { - this.player.v(); - EnumClientCommand enumclientcommand = packetplayinclientcommand.c(); - - switch (ClientCommandOrdinalWrapper.a[enumclientcommand.ordinal()]) { - case 1: - if (this.player.viewingCredits) { - this.minecraftServer.getPlayerList().changeDimension(this.player, 0, PlayerTeleportEvent.TeleportCause.END_PORTAL); // CraftBukkit - reroute logic through custom portal management - } else if (this.player.r().getWorldData().isHardcore()) { - if (this.minecraftServer.N() && this.player.getName().equals(this.minecraftServer.M())) { - this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); - this.minecraftServer.U(); - } else { - GameProfileBanEntry gameprofilebanentry = new GameProfileBanEntry(this.player.getProfile(), (Date) null, "(You just lost the game)", (Date) null, "Death in Hardcore"); - - this.minecraftServer.getPlayerList().getProfileBans().add(gameprofilebanentry); - this.player.playerConnection.disconnect("You have died. Game over, man, it\'s game over!"); - } - } else { - if (this.player.getHealth() > 0.0F) { - return; - } - - this.player = this.minecraftServer.getPlayerList().moveToWorld(this.player, 0, false); - } - break; - - case 2: - this.player.getStatisticManager().a(this.player); - break; - - case 3: - this.player.a((Statistic) AchievementList.f); - } - } - - public void a(PacketPlayInCloseWindow packetplayinclosewindow) { - if (this.player.dead) return; // CraftBukkit - - CraftEventFactory.handleInventoryCloseEvent(this.player); // CraftBukkit - - this.player.m(); - } - - public void a(PacketPlayInWindowClick packetplayinwindowclick) { - if (this.player.dead) return; // CraftBukkit - - this.player.v(); - if (this.player.activeContainer.windowId == packetplayinwindowclick.c() && this.player.activeContainer.c(this.player)) { - // CraftBukkit start - Call InventoryClickEvent - if (packetplayinwindowclick.d() < -1 && packetplayinwindowclick.d() != -999) { - return; - } - - InventoryView inventory = this.player.activeContainer.getBukkitView(); - SlotType type = CraftInventoryView.getSlotType(inventory, packetplayinwindowclick.d()); - - InventoryClickEvent event = null; - ClickType click = ClickType.UNKNOWN; - InventoryAction action = InventoryAction.UNKNOWN; - - ItemStack itemstack = null; - - if (packetplayinwindowclick.d() == -1) { - type = SlotType.OUTSIDE; // override - click = packetplayinwindowclick.e() == 0 ? ClickType.WINDOW_BORDER_LEFT : ClickType.WINDOW_BORDER_RIGHT; - action = InventoryAction.NOTHING; - } else if (packetplayinwindowclick.h() == 0) { - if (packetplayinwindowclick.e() == 0) { - click = ClickType.LEFT; - } else if (packetplayinwindowclick.e() == 1) { - click = ClickType.RIGHT; - } - if (packetplayinwindowclick.e() == 0 || packetplayinwindowclick.e() == 1) { - action = InventoryAction.NOTHING; // Don't want to repeat ourselves - if (packetplayinwindowclick.d() == -999) { - if (player.inventory.getCarried() != null) { - action = packetplayinwindowclick.e() == 0 ? InventoryAction.DROP_ALL_CURSOR : InventoryAction.DROP_ONE_CURSOR; - } - } else { - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null) { - ItemStack clickedItem = slot.getItem(); - ItemStack cursor = player.inventory.getCarried(); - if (clickedItem == null) { - if (cursor != null) { - action = packetplayinwindowclick.e() == 0 ? InventoryAction.PLACE_ALL : InventoryAction.PLACE_ONE; - } - } else if (slot.isAllowed(player)) { - if (cursor == null) { - action = packetplayinwindowclick.e() == 0 ? InventoryAction.PICKUP_ALL : InventoryAction.PICKUP_HALF; - } else if (slot.isAllowed(cursor)) { - if (clickedItem.doMaterialsMatch(cursor) && ItemStack.equals(clickedItem, cursor)) { - int toPlace = packetplayinwindowclick.e() == 0 ? cursor.count : 1; - toPlace = Math.min(toPlace, clickedItem.getMaxStackSize() - clickedItem.count); - toPlace = Math.min(toPlace, slot.inventory.getMaxStackSize() - clickedItem.count); - if (toPlace == 1) { - action = InventoryAction.PLACE_ONE; - } else if (toPlace == cursor.count) { - action = InventoryAction.PLACE_ALL; - } else if (toPlace < 0) { - action = toPlace != -1 ? InventoryAction.PICKUP_SOME : InventoryAction.PICKUP_ONE; // this happens with oversized stacks - } else if (toPlace != 0) { - action = InventoryAction.PLACE_SOME; - } - } else if (cursor.count <= slot.getMaxStackSize()) { - action = InventoryAction.SWAP_WITH_CURSOR; - } - } else if (cursor.getItem() == clickedItem.getItem() && (!cursor.usesData() || cursor.getData() == clickedItem.getData()) && ItemStack.equals(cursor, clickedItem)) { - if (clickedItem.count >= 0) { - if (clickedItem.count + cursor.count <= cursor.getMaxStackSize()) { - // As of 1.5, this is result slots only - action = InventoryAction.PICKUP_ALL; - } - } - } - } - } - } - } - } else if (packetplayinwindowclick.h() == 1) { - if (packetplayinwindowclick.e() == 0) { - click = ClickType.SHIFT_LEFT; - } else if (packetplayinwindowclick.e() == 1) { - click = ClickType.SHIFT_RIGHT; - } - if (packetplayinwindowclick.e() == 0 || packetplayinwindowclick.e() == 1) { - if (packetplayinwindowclick.d() < 0) { - action = InventoryAction.NOTHING; - } else { - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.isAllowed(this.player) && slot.hasItem()) { - action = InventoryAction.MOVE_TO_OTHER_INVENTORY; - } else { - action = InventoryAction.NOTHING; - } - } - } - } else if (packetplayinwindowclick.h() == 2) { - if (packetplayinwindowclick.e() >= 0 && packetplayinwindowclick.e() < 9) { - click = ClickType.NUMBER_KEY; - Slot clickedSlot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (clickedSlot.isAllowed(player)) { - ItemStack hotbar = this.player.inventory.getItem(packetplayinwindowclick.e()); - boolean canCleanSwap = hotbar == null || (clickedSlot.inventory == player.inventory && clickedSlot.isAllowed(hotbar)); // the slot will accept the hotbar item - if (clickedSlot.hasItem()) { - if (canCleanSwap) { - action = InventoryAction.HOTBAR_SWAP; - } else { - int firstEmptySlot = player.inventory.getFirstEmptySlotIndex(); - if (firstEmptySlot > -1) { - action = InventoryAction.HOTBAR_MOVE_AND_READD; - } else { - action = InventoryAction.NOTHING; // This is not sane! Mojang: You should test for other slots of same type - } - } - } else if (!clickedSlot.hasItem() && hotbar != null && clickedSlot.isAllowed(hotbar)) { - action = InventoryAction.HOTBAR_SWAP; - } else { - action = InventoryAction.NOTHING; - } - } else { - action = InventoryAction.NOTHING; - } - // Special constructor for number key - event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.d(), click, action, packetplayinwindowclick.e()); - } - } else if (packetplayinwindowclick.h() == 3) { - if (packetplayinwindowclick.e() == 2) { - click = ClickType.MIDDLE; - if (packetplayinwindowclick.d() == -999) { - action = InventoryAction.NOTHING; - } else { - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.hasItem() && player.abilities.canInstantlyBuild && player.inventory.getCarried() == null) { - action = InventoryAction.CLONE_STACK; - } else { - action = InventoryAction.NOTHING; - } - } - } else { - click = ClickType.UNKNOWN; - action = InventoryAction.UNKNOWN; - } - } else if (packetplayinwindowclick.h() == 4) { - if (packetplayinwindowclick.d() >= 0) { - if (packetplayinwindowclick.e() == 0) { - click = ClickType.DROP; - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { - action = InventoryAction.DROP_ONE_SLOT; - } else { - action = InventoryAction.NOTHING; - } - } else if (packetplayinwindowclick.e() == 1) { - click = ClickType.CONTROL_DROP; - Slot slot = this.player.activeContainer.getSlot(packetplayinwindowclick.d()); - if (slot != null && slot.hasItem() && slot.isAllowed(player) && slot.getItem() != null && slot.getItem().getItem() != Item.getItemOf(Blocks.AIR)) { - action = InventoryAction.DROP_ALL_SLOT; - } else { - action = InventoryAction.NOTHING; - } - } - } else { - // Sane default (because this happens when they are holding nothing. Don't ask why.) - click = ClickType.LEFT; - if (packetplayinwindowclick.e() == 1) { - click = ClickType.RIGHT; - } - action = InventoryAction.NOTHING; - } - } else if (packetplayinwindowclick.h() == 5) { - itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.d(), packetplayinwindowclick.e(), 5, this.player); - } else if (packetplayinwindowclick.h() == 6) { - click = ClickType.DOUBLE_CLICK; - action = InventoryAction.NOTHING; - if (packetplayinwindowclick.d() >= 0 && this.player.inventory.getCarried() != null) { - ItemStack cursor = this.player.inventory.getCarried(); - action = InventoryAction.NOTHING; - // Quick check for if we have any of the item - if (inventory.getTopInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem()))) || inventory.getBottomInventory().contains(org.bukkit.Material.getMaterial(Item.getId(cursor.getItem())))) { - action = InventoryAction.COLLECT_TO_CURSOR; - } - } - } - // TODO check on updates - - if (packetplayinwindowclick.h() != 5) { - if (click == ClickType.NUMBER_KEY) { - event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.d(), click, action, packetplayinwindowclick.e()); - } else { - event = new InventoryClickEvent(inventory, type, packetplayinwindowclick.d(), click, action); - } - - org.bukkit.inventory.Inventory top = inventory.getTopInventory(); - if (packetplayinwindowclick.d() == 0 && top instanceof CraftingInventory) { - org.bukkit.inventory.Recipe recipe = ((CraftingInventory) top).getRecipe(); - if (recipe != null) { - if (click == ClickType.NUMBER_KEY) { - event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.d(), click, action, packetplayinwindowclick.e()); - } else { - event = new CraftItemEvent(recipe, inventory, type, packetplayinwindowclick.d(), click, action); - } - } - } - - server.getPluginManager().callEvent(event); - - switch (event.getResult()) { - case ALLOW: - case DEFAULT: - itemstack = this.player.activeContainer.clickItem(packetplayinwindowclick.d(), packetplayinwindowclick.e(), packetplayinwindowclick.h(), this.player); - break; - case DENY: - /* Needs enum constructor in InventoryAction - if (action.modifiesOtherSlots()) { - - } else { - if (action.modifiesCursor()) { - this.player.playerConnection.sendPacket(new Packet103SetSlot(-1, -1, this.player.inventory.getCarried())); - } - if (action.modifiesClicked()) { - this.player.playerConnection.sendPacket(new Packet103SetSlot(this.player.activeContainer.windowId, packet102windowclick.slot, this.player.activeContainer.getSlot(packet102windowclick.slot).getItem())); - } - }*/ - switch (action) { - // Modified other slots - case PICKUP_ALL: - case MOVE_TO_OTHER_INVENTORY: - case HOTBAR_MOVE_AND_READD: - case HOTBAR_SWAP: - case COLLECT_TO_CURSOR: - case UNKNOWN: - this.player.updateInventory(this.player.activeContainer); - break; - // Modified cursor and clicked - case PICKUP_SOME: - case PICKUP_HALF: - case PICKUP_ONE: - case PLACE_ALL: - case PLACE_SOME: - case PLACE_ONE: - case SWAP_WITH_CURSOR: - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.d(), this.player.activeContainer.getSlot(packetplayinwindowclick.d()).getItem())); - break; - // Modified clicked only - case DROP_ALL_SLOT: - case DROP_ONE_SLOT: - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, packetplayinwindowclick.d(), this.player.activeContainer.getSlot(packetplayinwindowclick.d()).getItem())); - break; - // Modified cursor only - case DROP_ALL_CURSOR: - case DROP_ONE_CURSOR: - case CLONE_STACK: - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, this.player.inventory.getCarried())); - break; - // Nothing - case NOTHING: - break; - } - return; - } - } - // CraftBukkit end - - if (ItemStack.matches(packetplayinwindowclick.g(), itemstack)) { - this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.c(), packetplayinwindowclick.f(), true)); - this.player.g = true; - this.player.activeContainer.b(); - this.player.broadcastCarriedItem(); - this.player.g = false; - } else { - this.n.a(this.player.activeContainer.windowId, Short.valueOf(packetplayinwindowclick.f())); - this.player.playerConnection.sendPacket(new PacketPlayOutTransaction(packetplayinwindowclick.c(), packetplayinwindowclick.f(), false)); - this.player.activeContainer.a(this.player, false); - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < this.player.activeContainer.c.size(); ++i) { - arraylist.add(((Slot) this.player.activeContainer.c.get(i)).getItem()); - } - - this.player.a(this.player.activeContainer, arraylist); - - // CraftBukkit start - Send a Set Slot to update the crafting result slot - if (type == SlotType.RESULT && itemstack != null) { - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.activeContainer.windowId, 0, itemstack)); - } - // CraftBukkit end - } - } - } - - public void a(PacketPlayInEnchantItem packetplayinenchantitem) { - this.player.v(); - if (this.player.activeContainer.windowId == packetplayinenchantitem.c() && this.player.activeContainer.c(this.player)) { - this.player.activeContainer.a(this.player, packetplayinenchantitem.d()); - this.player.activeContainer.b(); - } - } - - public void a(PacketPlayInSetCreativeSlot packetplayinsetcreativeslot) { - if (this.player.playerInteractManager.isCreative()) { - boolean flag = packetplayinsetcreativeslot.c() < 0; - ItemStack itemstack = packetplayinsetcreativeslot.getItemStack(); - boolean flag1 = packetplayinsetcreativeslot.c() >= 1 && packetplayinsetcreativeslot.c() < 36 + PlayerInventory.getHotbarSize(); - // CraftBukkit - Add invalidItems check - boolean flag2 = itemstack == null || itemstack.getItem() != null && !invalidItems.contains(Item.getId(itemstack.getItem())); - boolean flag3 = itemstack == null || itemstack.getData() >= 0 && itemstack.count <= 64 && itemstack.count > 0; - - // CraftBukkit start - Call click event - if (flag || (flag1 && !ItemStack.matches(this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.c()).getItem(), packetplayinsetcreativeslot.getItemStack()))) { // Insist on valid slot - - org.bukkit.entity.HumanEntity player = this.player.getBukkitEntity(); - InventoryView inventory = new CraftInventoryView(player, player.getInventory(), this.player.defaultContainer); - org.bukkit.inventory.ItemStack item = CraftItemStack.asBukkitCopy(packetplayinsetcreativeslot.getItemStack()); - - SlotType type = SlotType.QUICKBAR; - if (flag) { - type = SlotType.OUTSIDE; - } else if (packetplayinsetcreativeslot.c() < 36) { - if (packetplayinsetcreativeslot.c() >= 5 && packetplayinsetcreativeslot.c() < 9) { - type = SlotType.ARMOR; - } else { - type = SlotType.CONTAINER; - } - } - InventoryCreativeEvent event = new InventoryCreativeEvent(inventory, type, flag ? -999 : packetplayinsetcreativeslot.c(), item); - server.getPluginManager().callEvent(event); - - itemstack = CraftItemStack.asNMSCopy(event.getCursor()); - - switch (event.getResult()) { - case ALLOW: - // Plugin cleared the id / stacksize checks - flag2 = flag3 = true; - break; - case DEFAULT: - break; - case DENY: - // Reset the slot - if (packetplayinsetcreativeslot.c() >= 0) { - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(this.player.defaultContainer.windowId, packetplayinsetcreativeslot.c(), this.player.defaultContainer.getSlot(packetplayinsetcreativeslot.c()).getItem())); - this.player.playerConnection.sendPacket(new PacketPlayOutSetSlot(-1, -1, null)); - } - return; - } - } - // CraftBukkit end - - if (flag1 && flag2 && flag3) { - if (itemstack == null) { - this.player.defaultContainer.setItem(packetplayinsetcreativeslot.c(), (ItemStack) null); - } else { - this.player.defaultContainer.setItem(packetplayinsetcreativeslot.c(), itemstack); - } - - this.player.defaultContainer.a(this.player, true); - } else if (flag && flag2 && flag3 && this.x < 200) { - this.x += 20; - EntityItem entityitem = this.player.drop(itemstack, true); - - if (entityitem != null) { - entityitem.e(); - } - } - } - } - - public void a(PacketPlayInTransaction packetplayintransaction) { - if (this.player.dead) return; // CraftBukkit - Short oshort = (Short) this.n.get(this.player.activeContainer.windowId); - - if (oshort != null && packetplayintransaction.d() == oshort.shortValue() && this.player.activeContainer.windowId == packetplayintransaction.c() && !this.player.activeContainer.c(this.player)) { - this.player.activeContainer.a(this.player, true); - } - } - - public void a(PacketPlayInUpdateSign packetplayinupdatesign) { - if (this.player.dead) return; // CraftBukkit - - this.player.v(); - WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); - - if (worldserver.isLoaded(packetplayinupdatesign.c(), packetplayinupdatesign.d(), packetplayinupdatesign.e())) { - TileEntity tileentity = worldserver.getTileEntity(packetplayinupdatesign.c(), packetplayinupdatesign.d(), packetplayinupdatesign.e()); - - if (tileentity instanceof TileEntitySign) { - TileEntitySign tileentitysign = (TileEntitySign) tileentity; - - if (!tileentitysign.a() || tileentitysign.b() != this.player) { - this.minecraftServer.warning("Player " + this.player.getName() + " just tried to change non-editable sign"); - this.sendPacket(new PacketPlayOutUpdateSign(packetplayinupdatesign.c(), packetplayinupdatesign.d(), packetplayinupdatesign.e(), tileentitysign.lines)); // CraftBukkit - return; - } - } - - int i; - int j; - - for (j = 0; j < 4; ++j) { - boolean flag = true; - - if (packetplayinupdatesign.f()[j].length() > 15) { - flag = false; - } else { - for (i = 0; i < packetplayinupdatesign.f()[j].length(); ++i) { - if (!SharedConstants.isAllowedChatCharacter(packetplayinupdatesign.f()[j].charAt(i))) { - flag = false; - } - } - } - - if (!flag) { - packetplayinupdatesign.f()[j] = "!?"; - } - } - - if (tileentity instanceof TileEntitySign) { - j = packetplayinupdatesign.c(); - int k = packetplayinupdatesign.d(); - - i = packetplayinupdatesign.e(); - TileEntitySign tileentitysign1 = (TileEntitySign) tileentity; - - // CraftBukkit start - Player player = this.server.getPlayer(this.player); - SignChangeEvent event = new SignChangeEvent((org.bukkit.craftbukkit.block.CraftBlock) player.getWorld().getBlockAt(j, k, i), this.server.getPlayer(this.player), packetplayinupdatesign.f()); - this.server.getPluginManager().callEvent(event); - - if (!event.isCancelled()) { - tileentitysign1.lines = org.bukkit.craftbukkit.block.CraftSign.sanitizeLines(event.getLines()); - tileentitysign1.isEditable = false; - } - // System.arraycopy(packetplayinupdatesign.f(), 0, tileentitysign1.lines, 0, 4); - // CraftBukkit end - - tileentitysign1.update(); - worldserver.notify(j, k, i); - } - } - } - - public void a(PacketPlayInKeepAlive packetplayinkeepalive) { - if (packetplayinkeepalive.c() == this.h) { - int i = (int) (this.d() - this.i); - - this.player.ping = (this.player.ping * 3 + i) / 4; - } - } - - private long d() { - return System.nanoTime() / 1000000L; - } - - public void a(PacketPlayInAbilities packetplayinabilities) { - // CraftBukkit start - if (this.player.abilities.canFly && this.player.abilities.isFlying != packetplayinabilities.isFlying()) { - PlayerToggleFlightEvent event = new PlayerToggleFlightEvent(this.server.getPlayer(this.player), packetplayinabilities.isFlying()); - this.server.getPluginManager().callEvent(event); - if (!event.isCancelled()) { - this.player.abilities.isFlying = packetplayinabilities.isFlying(); // Actually set the player's flying status - } else { - this.player.updateAbilities(); // Tell the player their ability was reverted - } - } - // CraftBukkit end - } - - public void a(PacketPlayInTabComplete packetplayintabcomplete) { - ArrayList arraylist = Lists.newArrayList(); - Iterator iterator = this.minecraftServer.a(this.player, packetplayintabcomplete.c()).iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - arraylist.add(s); - } - - this.player.playerConnection.sendPacket(new PacketPlayOutTabComplete((String[]) arraylist.toArray(new String[arraylist.size()]))); - } - - public void a(PacketPlayInSettings packetplayinsettings) { - this.player.a(packetplayinsettings); - } - - public void a(PacketPlayInCustomPayload packetplayincustompayload) { - PacketDataSerializer packetdataserializer; - ItemStack itemstack; - ItemStack itemstack1; - - // CraftBukkit start - Ignore empty payloads - if (packetplayincustompayload.length <= 0) { - return; - } - // CraftBukkit end - - if ("MC|BEdit".equals(packetplayincustompayload.c())) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.e())); - - try { - itemstack = packetdataserializer.c(); - if (itemstack != null) { - if (!ItemBookAndQuill.a(itemstack.getTag())) { - throw new IOException("Invalid book tag!"); - } - - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack1 == null) { - return; - } - - if (itemstack.getItem() == Items.BOOK_AND_QUILL && itemstack.getItem() == itemstack1.getItem()) { - CraftEventFactory.handleEditBookEvent(player, itemstack); // CraftBukkit - } - - return; - } - // CraftBukkit start - } catch (Exception exception) { - c.error("Couldn\'t handle book info", exception); - this.disconnect("Invalid book data!"); - return; - // CraftBukkit end - } finally { - packetdataserializer.release(); - } - - return; - } else if ("MC|BSign".equals(packetplayincustompayload.c())) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.e())); - - try { - itemstack = packetdataserializer.c(); - if (itemstack != null) { - if (!ItemWrittenBook.a(itemstack.getTag())) { - throw new IOException("Invalid book tag!"); - } - - itemstack1 = this.player.inventory.getItemInHand(); - if (itemstack1 == null) { - return; - } - - if (itemstack.getItem() == Items.WRITTEN_BOOK && itemstack1.getItem() == Items.BOOK_AND_QUILL) { - CraftEventFactory.handleEditBookEvent(player, itemstack); // CraftBukkit - } - - return; - } - // CraftBukkit start - } catch (Throwable exception1) { - c.error("Couldn\'t sign book", exception1); - this.disconnect("Invalid book data!"); - // CraftBukkit end - return; - } finally { - packetdataserializer.release(); - } - - return; - } else { - int i; - DataInputStream datainputstream; - - if ("MC|TrSel".equals(packetplayincustompayload.c())) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packetplayincustompayload.e())); - i = datainputstream.readInt(); - Container container = this.player.activeContainer; - - if (container instanceof ContainerMerchant) { - ((ContainerMerchant) container).e(i); - } - // CraftBukkit start - } catch (Throwable exception2) { - c.error("Couldn\'t select trade", exception2); - this.disconnect("Invalid trade data!"); - // CraftBukkit end - } - } else if ("MC|AdvCdm".equals(packetplayincustompayload.c())) { - if (!this.minecraftServer.getEnableCommandBlock()) { - this.player.sendMessage(new ChatMessage("advMode.notEnabled", new Object[0])); - } else if (this.player.a(2, "") && this.player.abilities.canInstantlyBuild) { - packetdataserializer = new PacketDataSerializer(Unpooled.wrappedBuffer(packetplayincustompayload.e())); - - try { - byte b0 = packetdataserializer.readByte(); - CommandBlockListenerAbstract commandblocklistenerabstract = null; - - if (b0 == 0) { - TileEntity tileentity = this.player.world.getTileEntity(packetdataserializer.readInt(), packetdataserializer.readInt(), packetdataserializer.readInt()); - - if (tileentity instanceof TileEntityCommand) { - commandblocklistenerabstract = ((TileEntityCommand) tileentity).getCommandBlock(); - } - } else if (b0 == 1) { - Entity entity = this.player.world.getEntity(packetdataserializer.readInt()); - - if (entity instanceof EntityMinecartCommandBlock) { - commandblocklistenerabstract = ((EntityMinecartCommandBlock) entity).getCommandBlock(); - } - } - - String s = packetdataserializer.c(packetdataserializer.readableBytes()); - - if (commandblocklistenerabstract != null) { - commandblocklistenerabstract.setCommand(s); - commandblocklistenerabstract.e(); - this.player.sendMessage(new ChatMessage("advMode.setCommand.success", new Object[] { s})); - } - // CraftBukkit start - } catch (Throwable exception3) { - c.error("Couldn\'t set command block", exception3); - this.disconnect("Invalid CommandBlock data!"); - // CraftBukkit end - } finally { - packetdataserializer.release(); - } - } else { - this.player.sendMessage(new ChatMessage("advMode.notAllowed", new Object[0])); - } - } else if ("MC|Beacon".equals(packetplayincustompayload.c())) { - if (this.player.activeContainer instanceof ContainerBeacon) { - try { - datainputstream = new DataInputStream(new ByteArrayInputStream(packetplayincustompayload.e())); - i = datainputstream.readInt(); - int j = datainputstream.readInt(); - ContainerBeacon containerbeacon = (ContainerBeacon) this.player.activeContainer; - Slot slot = containerbeacon.getSlot(0); - - if (slot.hasItem()) { - slot.a(1); - TileEntityBeacon tileentitybeacon = containerbeacon.e(); - - tileentitybeacon.d(i); - tileentitybeacon.e(j); - tileentitybeacon.update(); - } - // CraftBukkit start - } catch (Throwable exception4) { - c.error("Couldn\'t set beacon", exception4); - this.disconnect("Invalid beacon data!"); - // CraftBukkit end - } - } - } else if ("MC|ItemName".equals(packetplayincustompayload.c()) && this.player.activeContainer instanceof ContainerAnvil) { - ContainerAnvil containeranvil = (ContainerAnvil) this.player.activeContainer; - - if (packetplayincustompayload.e() != null && packetplayincustompayload.e().length >= 1) { - String s1 = SharedConstants.a(new String(packetplayincustompayload.e(), Charsets.UTF_8)); - - if (s1.length() <= 30) { - containeranvil.a(s1); - } - } else { - containeranvil.a(""); - } - } - // CraftBukkit start - else if (packetplayincustompayload.c().equals("REGISTER")) { - try { - String channels = new String(packetplayincustompayload.e(), "UTF8"); - for (String channel : channels.split("\0")) { - getPlayer().addChannel(channel); - } - } catch (UnsupportedEncodingException ex) { - throw new AssertionError(ex); - } - } else if (packetplayincustompayload.c().equals("UNREGISTER")) { - try { - String channels = new String(packetplayincustompayload.e(), "UTF8"); - for (String channel : channels.split("\0")) { - getPlayer().removeChannel(channel); - } - } catch (UnsupportedEncodingException ex) { - throw new AssertionError(ex); - } - } else { - server.getMessenger().dispatchIncomingMessage(player.getBukkitEntity(), packetplayincustompayload.c(), packetplayincustompayload.e()); - } - // CraftBukkit end - } - } - - public void a(EnumProtocol enumprotocol, EnumProtocol enumprotocol1) { - if (enumprotocol1 != EnumProtocol.PLAY) { - throw new IllegalStateException("Unexpected change in protocol!"); - } - } - - // CraftBukkit start - Add "isDisconnected" method - public final boolean isDisconnected() { - return !this.player.joining && !NetworkManager.a(this.networkManager).config().isAutoRead(); - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/PlayerDatFileConverter.java b/src/main/java/net/minecraft/server/PlayerDatFileConverter.java deleted file mode 100644 index 27651b5a..00000000 --- a/src/main/java/net/minecraft/server/PlayerDatFileConverter.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.util.UUID; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.ProfileLookupCallback; -import net.minecraft.util.com.mojang.authlib.yggdrasil.ProfileNotFoundException; - -final class PlayerDatFileConverter implements ProfileLookupCallback { - - final DedicatedServer a; - final File b; - final File c; - final File d; - final String[] e; - - PlayerDatFileConverter(DedicatedServer dedicatedserver, File file1, File file2, File file3, String[] astring) { - this.a = dedicatedserver; - this.b = file1; - this.c = file2; - this.d = file3; - this.e = astring; - } - - public void onProfileLookupSucceeded(GameProfile gameprofile) { - this.a.getUserCache().a(gameprofile); - UUID uuid = gameprofile.getId(); - - if (uuid == null) { - throw new FileConversionException("Missing UUID for user profile " + gameprofile.getName(), (PredicateEmptyList) null); - } else { - this.a(this.b, this.a(gameprofile), uuid.toString()); - } - } - - public void onProfileLookupFailed(GameProfile gameprofile, Exception exception) { - NameReferencingFileConverter.a().warn("Could not lookup user uuid for " + gameprofile.getName(), exception); - if (exception instanceof ProfileNotFoundException) { - String s = this.a(gameprofile); - - this.a(this.c, s, s); - } else { - throw new FileConversionException("Could not request user " + gameprofile.getName() + " from backend systems", exception, (PredicateEmptyList) null); - } - } - - private void a(File file1, String s, String s1) { - File file2 = new File(this.d, s + ".dat"); - File file3 = new File(file1, s1 + ".dat"); - - // CraftBukkit start - Use old file name to seed lastKnownName - NBTTagCompound root = null; - - try { - root = NBTCompressedStreamTools.a(new java.io.FileInputStream(file2)); - } catch (Exception exception) { - exception.printStackTrace(); - } - - if (root != null) { - if (!root.hasKey("bukkit")) { - root.set("bukkit", new NBTTagCompound()); - } - NBTTagCompound data = root.getCompound("bukkit"); - data.setString("lastKnownName", s); - - try { - NBTCompressedStreamTools.a(root, new java.io.FileOutputStream(file2)); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - // CraftBukkit end - - NameReferencingFileConverter.a(file1); - if (!file2.renameTo(file3)) { - throw new FileConversionException("Could not convert file for " + s, (PredicateEmptyList) null); - } - } - - private String a(GameProfile gameprofile) { - String s = null; - - for (int i = 0; i < this.e.length; ++i) { - if (this.e[i] != null && this.e[i].equalsIgnoreCase(gameprofile.getName())) { - s = this.e[i]; - break; - } - } - - if (s == null) { - throw new FileConversionException("Could not find the filename for " + gameprofile.getName() + " anymore", (PredicateEmptyList) null); - } else { - return s; - } - } -} diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java deleted file mode 100644 index 7607155f..00000000 --- a/src/main/java/net/minecraft/server/PlayerInteractManager.java +++ /dev/null @@ -1,411 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.Event; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -// CraftBukkit end - -public class PlayerInteractManager { - - public World world; - public EntityPlayer player; - private EnumGamemode gamemode; - private boolean d; - private int lastDigTick; - private int f; - private int g; - private int h; - private int currentTick; - private boolean j; - private int k; - private int l; - private int m; - private int n; - private int o; - - public PlayerInteractManager(World world) { - this.gamemode = EnumGamemode.NONE; - this.o = -1; - this.world = world; - } - - public void setGameMode(EnumGamemode enumgamemode) { - this.gamemode = enumgamemode; - enumgamemode.a(this.player.abilities); - this.player.updateAbilities(); - } - - public EnumGamemode getGameMode() { - return this.gamemode; - } - - public boolean isCreative() { - return this.gamemode.d(); - } - - public void b(EnumGamemode enumgamemode) { - if (this.gamemode == EnumGamemode.NONE) { - this.gamemode = enumgamemode; - } - - this.setGameMode(this.gamemode); - } - - public void a() { - this.currentTick = MinecraftServer.currentTick; // CraftBukkit - float f; - int i; - - if (this.j) { - int j = this.currentTick - this.n; - Block block = this.world.getType(this.k, this.l, this.m); - - if (block.getMaterial() == Material.AIR) { - this.j = false; - } else { - f = block.getDamage(this.player, this.player.world, this.k, this.l, this.m) * (float) (j + 1); - i = (int) (f * 10.0F); - if (i != this.o) { - this.world.d(this.player.getId(), this.k, this.l, this.m, i); - this.o = i; - } - - if (f >= 1.0F) { - this.j = false; - this.breakBlock(this.k, this.l, this.m); - } - } - } else if (this.d) { - Block block1 = this.world.getType(this.f, this.g, this.h); - - if (block1.getMaterial() == Material.AIR) { - this.world.d(this.player.getId(), this.f, this.g, this.h, -1); - this.o = -1; - this.d = false; - } else { - int k = this.currentTick - this.lastDigTick; - - f = block1.getDamage(this.player, this.player.world, this.f, this.g, this.h) * (float) (k + 1); - i = (int) (f * 10.0F); - if (i != this.o) { - this.world.d(this.player.getId(), this.f, this.g, this.h, i); - this.o = i; - } - } - } - } - - public void dig(int i, int j, int k, int l) { - // CraftBukkit start - PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_BLOCK, i, j, k, l, this.player.inventory.getItemInHand()); - if (!this.gamemode.isAdventure() || this.player.d(i, j, k)) { - if (event.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - // Update any tile entity data for this block - TileEntity tileentity = this.world.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); - } - return; - } - // CraftBukkit end - if (this.isCreative()) { - if (!this.world.douseFire((EntityHuman) null, i, j, k, l)) { - this.breakBlock(i, j, k); - } - } else { - // this.world.douseFire((EntityHuman) null, i, j, k, l); // CraftBukkit - Moved down - this.lastDigTick = this.currentTick; - float f = 1.0F; - Block block = this.world.getType(i, j, k); - // CraftBukkit start - Swings at air do *NOT* exist. - if (event.useInteractedBlock() == Event.Result.DENY) { - // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. - if (block == Blocks.WOODEN_DOOR) { - // For some reason *BOTH* the bottom/top part have to be marked updated. - boolean bottom = (this.world.getData(i, j, k) & 8) == 0; - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j + (bottom ? 1 : -1), k, this.world)); - } else if (block == Blocks.TRAP_DOOR) { - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - } - } else if (block.getMaterial() != Material.AIR) { - block.attack(this.world, i, j, k, this.player); - f = block.getDamage(this.player, this.player.world, i, j, k); - // Allow fire punching to be blocked - this.world.douseFire((EntityHuman) null, i, j, k, l); - } - - if (event.useItemInHand() == Event.Result.DENY) { - // If we 'insta destroyed' then the client needs to be informed. - if (f > 1.0f) { - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - } - return; - } - org.bukkit.event.block.BlockDamageEvent blockEvent = CraftEventFactory.callBlockDamageEvent(this.player, i, j, k, this.player.inventory.getItemInHand(), f >= 1.0f); - - if (blockEvent.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - return; - } - - if (blockEvent.getInstaBreak()) { - f = 2.0f; - } - // CraftBukkit end - - if (block.getMaterial() != Material.AIR && f >= 1.0F) { - this.breakBlock(i, j, k); - } else { - this.d = true; - this.f = i; - this.g = j; - this.h = k; - int i1 = (int) (f * 10.0F); - - this.world.d(this.player.getId(), i, j, k, i1); - this.o = i1; - } - } - } - } - - public void a(int i, int j, int k) { - if (i == this.f && j == this.g && k == this.h) { - this.currentTick = MinecraftServer.currentTick; // CraftBukkit - int l = this.currentTick - this.lastDigTick; - Block block = this.world.getType(i, j, k); - - if (block.getMaterial() != Material.AIR) { - float f = block.getDamage(this.player, this.player.world, i, j, k) * (float) (l + 1); - - if (f >= 0.7F) { - this.d = false; - this.world.d(this.player.getId(), i, j, k, -1); - this.breakBlock(i, j, k); - } else if (!this.j) { - this.d = false; - this.j = true; - this.k = i; - this.l = j; - this.m = k; - this.n = this.lastDigTick; - } - } - // CraftBukkit start - Force block reset to client - } else { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - // CraftBukkit end - } - } - - public void c(int i, int j, int k) { - this.d = false; - this.world.d(this.player.getId(), this.f, this.g, this.h, -1); - } - - private boolean d(int i, int j, int k) { - Block block = this.world.getType(i, j, k); - int l = this.world.getData(i, j, k); - - block.a(this.world, i, j, k, l, this.player); - boolean flag = this.world.setAir(i, j, k); - - if (flag) { - block.postBreak(this.world, i, j, k, l); - } - - return flag; - } - - public boolean breakBlock(int i, int j, int k) { - // CraftBukkit start - fire BlockBreakEvent - BlockBreakEvent event = null; - - if (this.player instanceof EntityPlayer) { - org.bukkit.block.Block block = this.world.getWorld().getBlockAt(i, j, k); - - // Tell client the block is gone immediately then process events - if (world.getTileEntity(i, j, k) == null) { - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(i, j, k, this.world); - packet.block = Blocks.AIR; - packet.data = 0; - ((EntityPlayer) this.player).playerConnection.sendPacket(packet); - } - - event = new BlockBreakEvent(block, this.player.getBukkitEntity()); - - // Adventure mode pre-cancel - event.setCancelled(this.gamemode.isAdventure() && !this.player.d(i, j, k)); - - // Sword + Creative mode pre-cancel - event.setCancelled(event.isCancelled() || (this.gamemode.d() && this.player.be() != null && this.player.be().getItem() instanceof ItemSword)); - - // Calculate default block experience - Block nmsBlock = this.world.getType(i, j, k); - - if (nmsBlock != null && !event.isCancelled() && !this.isCreative() && this.player.a(nmsBlock)) { - // Copied from block.a(world, entityhuman, int, int, int, int) - if (!(nmsBlock.E() && EnchantmentManager.hasSilkTouchEnchantment(this.player))) { - int data = block.getData(); - int bonusLevel = EnchantmentManager.getBonusBlockLootEnchantmentLevel(this.player); - - event.setExpToDrop(nmsBlock.getExpDrop(this.world, data, bonusLevel)); - } - } - - this.world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - // Let the client know the block still exists - ((EntityPlayer) this.player).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - // Update any tile entity data for this block - TileEntity tileentity = this.world.getTileEntity(i, j, k); - if (tileentity != null) { - this.player.playerConnection.sendPacket(tileentity.getUpdatePacket()); - } - return false; - } - } - - if (false && this.gamemode.isAdventure() && !this.player.d(i, j, k)) { // Never trigger - // CraftBukkit end - return false; - } else if (false && this.gamemode.d() && this.player.be() != null && this.player.be().getItem() instanceof ItemSword) { // CraftBukkit - never trigger - return false; - } else { - Block block = this.world.getType(i, j, k); - if (block == Blocks.AIR) return false; // CraftBukkit - A plugin set block to air without cancelling - int l = this.world.getData(i, j, k); - - // CraftBukkit start - Special case skulls, their item data comes from a tile entity - if (block == Blocks.SKULL && !this.isCreative()) { - block.dropNaturally(world, i, j, k, l, 1.0F, 0); - return this.d(i, j, k); - } - // CraftBukkit end - - this.world.a(this.player, 2001, i, j, k, Block.getId(block) + (this.world.getData(i, j, k) << 12)); - boolean flag = this.d(i, j, k); - - if (this.isCreative()) { - this.player.playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j, k, this.world)); - } else { - ItemStack itemstack = this.player.bF(); - boolean flag1 = this.player.a(block); - - if (itemstack != null) { - itemstack.a(this.world, block, i, j, k, this.player); - if (itemstack.count == 0) { - this.player.bG(); - } - } - - if (flag && flag1) { - block.a(this.world, this.player, i, j, k, l); - } - } - - // CraftBukkit start - Drop event experience - if (flag && event != null) { - block.dropExperience(this.world, i, j, k, event.getExpToDrop()); - } - // CraftBukkit end - - return flag; - } - } - - public boolean useItem(EntityHuman entityhuman, World world, ItemStack itemstack) { - int i = itemstack.count; - int j = itemstack.getData(); - ItemStack itemstack1 = itemstack.a(world, entityhuman); - - if (itemstack1 == itemstack && (itemstack1 == null || itemstack1.count == i && itemstack1.n() <= 0 && itemstack1.getData() == j)) { - return false; - } else { - entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = itemstack1; - if (this.isCreative()) { - itemstack1.count = i; - if (itemstack1.g()) { - itemstack1.setData(j); - } - } - - if (itemstack1.count == 0) { - entityhuman.inventory.items[entityhuman.inventory.itemInHandIndex] = null; - } - - if (!entityhuman.by()) { - ((EntityPlayer) entityhuman).updateInventory(entityhuman.defaultContainer); - } - - return true; - } - } - - public boolean interact(EntityHuman entityhuman, World world, ItemStack itemstack, int i, int j, int k, int l, float f, float f1, float f2) { - /* CraftBukkit start - whole method - if ((!entityhuman.isSneaking() || entityhuman.be() == null) && world.getType(i, j, k).interact(world, i, j, k, entityhuman, l, f, f1, f2)) { - return true; - } else if (itemstack == null) { - return false; - } else if (this.isCreative()) { - int i1 = itemstack.getData(); - int j1 = itemstack.count; - boolean flag = itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); - - itemstack.setData(i1); - itemstack.count = j1; - return flag; - } else { - return itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); - } - // Interract event */ - Block block = world.getType(i, j, k); - boolean result = false; - if (block != Blocks.AIR) { - PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(entityhuman, Action.RIGHT_CLICK_BLOCK, i, j, k, l, itemstack); - if (event.useInteractedBlock() == Event.Result.DENY) { - // If we denied a door from opening, we need to send a correcting update to the client, as it already opened the door. - if (block == Blocks.WOODEN_DOOR) { - boolean bottom = (world.getData(i, j, k) & 8) == 0; - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutBlockChange(i, j + (bottom ? 1 : -1), k, world)); - } - result = (event.useItemInHand() != Event.Result.ALLOW); - } else if (!entityhuman.isSneaking() || itemstack == null) { - result = block.interact(world, i, j, k, entityhuman, l, f, f1, f2); - } - - if (itemstack != null && !result) { - int j1 = itemstack.getData(); - int k1 = itemstack.count; - - result = itemstack.placeItem(entityhuman, world, i, j, k, l, f, f1, f2); - - // The item count should not decrement in Creative mode. - if (this.isCreative()) { - itemstack.setData(j1); - itemstack.count = k1; - } - } - - // If we have 'true' and no explicit deny *or* an explicit allow -- run the item part of the hook - if (itemstack != null && ((!result && event.useItemInHand() != Event.Result.DENY) || event.useItemInHand() == Event.Result.ALLOW)) { - this.useItem(entityhuman, world, itemstack); - } - } - return result; - // CraftBukkit end - } - - public void a(WorldServer worldserver) { - this.world = worldserver; - } -} diff --git a/src/main/java/net/minecraft/server/PlayerInventory.java b/src/main/java/net/minecraft/server/PlayerInventory.java deleted file mode 100644 index 5cd6e14f..00000000 --- a/src/main/java/net/minecraft/server/PlayerInventory.java +++ /dev/null @@ -1,539 +0,0 @@ -package net.minecraft.server; - -import java.util.concurrent.Callable; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class PlayerInventory implements IInventory { - - public ItemStack[] items = new ItemStack[36]; - public ItemStack[] armor = new ItemStack[4]; - public int itemInHandIndex; - public EntityHuman player; - private ItemStack g; - public boolean e; - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public ItemStack[] getArmorContents() { - return this.armor; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public org.bukkit.inventory.InventoryHolder getOwner() { - return this.player.getBukkitEntity(); - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public PlayerInventory(EntityHuman entityhuman) { - this.player = entityhuman; - } - - public ItemStack getItemInHand() { - return this.itemInHandIndex < 9 && this.itemInHandIndex >= 0 ? this.items[this.itemInHandIndex] : null; - } - - public static int getHotbarSize() { - return 9; - } - - private int c(Item item) { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null && this.items[i].getItem() == item) { - return i; - } - } - - return -1; - } - - private int firstPartial(ItemStack itemstack) { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { - return i; - } - } - - return -1; - } - - // CraftBukkit start - Watch method above! :D - public int canHold(ItemStack itemstack) { - int remains = itemstack.count; - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null) return itemstack.count; - - // Taken from firstPartial(ItemStack) - if (this.items[i] != null && this.items[i].getItem() == itemstack.getItem() && this.items[i].isStackable() && this.items[i].count < this.items[i].getMaxStackSize() && this.items[i].count < this.getMaxStackSize() && (!this.items[i].usesData() || this.items[i].getData() == itemstack.getData()) && ItemStack.equals(this.items[i], itemstack)) { - remains -= (this.items[i].getMaxStackSize() < this.getMaxStackSize() ? this.items[i].getMaxStackSize() : this.getMaxStackSize()) - this.items[i].count; - } - if (remains <= 0) return itemstack.count; - } - return itemstack.count - remains; - } - // CraftBukkit end - - public int getFirstEmptySlotIndex() { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null) { - return i; - } - } - - return -1; - } - - public int a(Item item, int i) { - int j = 0; - - int k; - ItemStack itemstack; - - for (k = 0; k < this.items.length; ++k) { - itemstack = this.items[k]; - if (itemstack != null && (item == null || itemstack.getItem() == item) && (i <= -1 || itemstack.getData() == i)) { - j += itemstack.count; - this.items[k] = null; - } - } - - for (k = 0; k < this.armor.length; ++k) { - itemstack = this.armor[k]; - if (itemstack != null && (item == null || itemstack.getItem() == item) && (i <= -1 || itemstack.getData() == i)) { - j += itemstack.count; - this.armor[k] = null; - } - } - - if (this.g != null) { - if (item != null && this.g.getItem() != item) { - return j; - } - - if (i > -1 && this.g.getData() != i) { - return j; - } - - j += this.g.count; - this.setCarried((ItemStack) null); - } - - return j; - } - - private int e(ItemStack itemstack) { - Item item = itemstack.getItem(); - int i = itemstack.count; - int j; - - if (itemstack.getMaxStackSize() == 1) { - j = this.getFirstEmptySlotIndex(); - if (j < 0) { - return i; - } else { - if (this.items[j] == null) { - this.items[j] = ItemStack.b(itemstack); - } - - return 0; - } - } else { - j = this.firstPartial(itemstack); - if (j < 0) { - j = this.getFirstEmptySlotIndex(); - } - - if (j < 0) { - return i; - } else { - if (this.items[j] == null) { - this.items[j] = new ItemStack(item, 0, itemstack.getData()); - if (itemstack.hasTag()) { - this.items[j].setTag((NBTTagCompound) itemstack.getTag().clone()); - } - } - - int k = i; - - if (i > this.items[j].getMaxStackSize() - this.items[j].count) { - k = this.items[j].getMaxStackSize() - this.items[j].count; - } - - if (k > this.getMaxStackSize() - this.items[j].count) { - k = this.getMaxStackSize() - this.items[j].count; - } - - if (k == 0) { - return i; - } else { - i -= k; - this.items[j].count += k; - this.items[j].c = 5; - return i; - } - } - } - } - - public void k() { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - this.items[i].a(this.player.world, this.player, i, this.itemInHandIndex == i); - } - } - } - - public boolean a(Item item) { - int i = this.c(item); - - if (i < 0) { - return false; - } else { - if (--this.items[i].count <= 0) { - this.items[i] = null; - } - - return true; - } - } - - public boolean b(Item item) { - int i = this.c(item); - - return i >= 0; - } - - public boolean pickup(ItemStack itemstack) { - if (itemstack != null && itemstack.count != 0 && itemstack.getItem() != null) { - try { - int i; - - if (itemstack.i()) { - i = this.getFirstEmptySlotIndex(); - if (i >= 0) { - this.items[i] = ItemStack.b(itemstack); - this.items[i].c = 5; - itemstack.count = 0; - return true; - } else if (this.player.abilities.canInstantlyBuild) { - itemstack.count = 0; - return true; - } else { - return false; - } - } else { - do { - i = itemstack.count; - itemstack.count = this.e(itemstack); - } while (itemstack.count > 0 && itemstack.count < i); - - if (itemstack.count == i && this.player.abilities.canInstantlyBuild) { - itemstack.count = 0; - return true; - } else { - return itemstack.count < i; - } - } - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Adding item to inventory"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Item being added"); - - crashreportsystemdetails.a("Item ID", Integer.valueOf(Item.getId(itemstack.getItem()))); - crashreportsystemdetails.a("Item data", Integer.valueOf(itemstack.getData())); - crashreportsystemdetails.a("Item name", (Callable) (new CrashReportItemName(this, itemstack))); - throw new ReportedException(crashreport); - } - } else { - return false; - } - } - - public ItemStack splitStack(int i, int j) { - ItemStack[] aitemstack = this.items; - - if (i >= this.items.length) { - aitemstack = this.armor; - i -= this.items.length; - } - - if (aitemstack[i] != null) { - ItemStack itemstack; - - if (aitemstack[i].count <= j) { - itemstack = aitemstack[i]; - aitemstack[i] = null; - return itemstack; - } else { - itemstack = aitemstack[i].a(j); - if (aitemstack[i].count == 0) { - aitemstack[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - ItemStack[] aitemstack = this.items; - - if (i >= this.items.length) { - aitemstack = this.armor; - i -= this.items.length; - } - - if (aitemstack[i] != null) { - ItemStack itemstack = aitemstack[i]; - - aitemstack[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - ItemStack[] aitemstack = this.items; - - if (i >= aitemstack.length) { - i -= aitemstack.length; - aitemstack = this.armor; - } - - aitemstack[i] = itemstack; - } - - public float a(Block block) { - float f = 1.0F; - - if (this.items[this.itemInHandIndex] != null) { - f *= this.items[this.itemInHandIndex].a(block); - } - - return f; - } - - public NBTTagList a(NBTTagList nbttaglist) { - int i; - NBTTagCompound nbttagcompound; - - for (i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - nbttagcompound = new NBTTagCompound(); - nbttagcompound.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound); - nbttaglist.add(nbttagcompound); - } - } - - for (i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null) { - nbttagcompound = new NBTTagCompound(); - nbttagcompound.setByte("Slot", (byte) (i + 100)); - this.armor[i].save(nbttagcompound); - nbttaglist.add(nbttagcompound); - } - } - - return nbttaglist; - } - - public void b(NBTTagList nbttaglist) { - this.items = new ItemStack[36]; - this.armor = new ItemStack[4]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound = nbttaglist.get(i); - int j = nbttagcompound.getByte("Slot") & 255; - ItemStack itemstack = ItemStack.createStack(nbttagcompound); - - if (itemstack != null) { - if (j >= 0 && j < this.items.length) { - this.items[j] = itemstack; - } - - if (j >= 100 && j < this.armor.length + 100) { - this.armor[j - 100] = itemstack; - } - } - } - } - - public int getSize() { - return this.items.length + 4; - } - - public ItemStack getItem(int i) { - ItemStack[] aitemstack = this.items; - - if (i >= aitemstack.length) { - i -= aitemstack.length; - aitemstack = this.armor; - } - - return aitemstack[i]; - } - - public String getInventoryName() { - return "container.inventory"; - } - - public boolean k_() { - return false; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean b(Block block) { - if (block.getMaterial().isAlwaysDestroyable()) { - return true; - } else { - ItemStack itemstack = this.getItem(this.itemInHandIndex); - - return itemstack != null ? itemstack.b(block) : false; - } - } - - public ItemStack d(int i) { - return this.armor[i]; - } - - public int l() { - int i = 0; - - for (int j = 0; j < this.armor.length; ++j) { - if (this.armor[j] != null && this.armor[j].getItem() instanceof ItemArmor) { - int k = ((ItemArmor) this.armor[j].getItem()).c; - - i += k; - } - } - - return i; - } - - public void a(float f) { - f /= 4.0F; - if (f < 1.0F) { - f = 1.0F; - } - - for (int i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null && this.armor[i].getItem() instanceof ItemArmor) { - this.armor[i].damage((int) f, this.player); - if (this.armor[i].count == 0) { - this.armor[i] = null; - } - } - } - } - - public void m() { - int i; - - for (i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - this.player.a(this.items[i], true, false); - this.items[i] = null; - } - } - - for (i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null) { - this.player.a(this.armor[i], true, false); - this.armor[i] = null; - } - } - } - - public void update() { - this.e = true; - } - - public void setCarried(ItemStack itemstack) { - this.g = itemstack; - } - - public ItemStack getCarried() { - // CraftBukkit start - if (this.g != null && this.g.count == 0) { - this.setCarried(null); - } - // CraftBukkit end - return this.g; - } - - public boolean a(EntityHuman entityhuman) { - return this.player.dead ? false : entityhuman.f(this.player) <= 64.0D; - } - - public boolean c(ItemStack itemstack) { - int i; - - for (i = 0; i < this.armor.length; ++i) { - if (this.armor[i] != null && this.armor[i].doMaterialsMatch(itemstack)) { - return true; - } - } - - for (i = 0; i < this.items.length; ++i) { - if (this.items[i] != null && this.items[i].doMaterialsMatch(itemstack)) { - return true; - } - } - - return false; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void b(PlayerInventory playerinventory) { - int i; - - for (i = 0; i < this.items.length; ++i) { - this.items[i] = ItemStack.b(playerinventory.items[i]); - } - - for (i = 0; i < this.armor.length; ++i) { - this.armor[i] = ItemStack.b(playerinventory.armor[i]); - } - - this.itemInHandIndex = playerinventory.itemInHandIndex; - } -} diff --git a/src/main/java/net/minecraft/server/PlayerList.java b/src/main/java/net/minecraft/server/PlayerList.java deleted file mode 100644 index e6012fba..00000000 --- a/src/main/java/net/minecraft/server/PlayerList.java +++ /dev/null @@ -1,1216 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.net.SocketAddress; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.Map.Entry; - -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.google.common.collect.Lists; -import net.minecraft.util.com.google.common.collect.Maps; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.chunkio.ChunkIOExecutor; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.TravelAgent; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerChangedWorldEvent; -import org.bukkit.event.player.PlayerPortalEvent; -import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.player.PlayerRespawnEvent; -import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; -import org.bukkit.util.Vector; -// CraftBukkit end - -public abstract class PlayerList { - - public static final File a = new File("banned-players.json"); - public static final File b = new File("banned-ips.json"); - public static final File c = new File("ops.json"); - public static final File d = new File("whitelist.json"); - private static final Logger g = LogManager.getLogger(); - private static final SimpleDateFormat h = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); - private final MinecraftServer server; - public final List players = new java.util.concurrent.CopyOnWriteArrayList(); // CraftBukkit - ArrayList -> CopyOnWriteArrayList: Iterator safety - private final GameProfileBanList j; - private final IpBanList k; - private final OpList operators; - private final WhiteList whitelist; - private final Map n; - public IPlayerFileData playerFileData; // CraftBukkit - private -> public - public boolean hasWhitelist; // CraftBukkit - private -> public - protected int maxPlayers; - private int q; - private EnumGamemode r; - private boolean s; - private int t; - - // CraftBukkit start - private CraftServer cserver; - - public PlayerList(MinecraftServer minecraftserver) { - minecraftserver.server = new CraftServer(minecraftserver, this); - minecraftserver.console = org.bukkit.craftbukkit.command.ColouredConsoleSender.getInstance(); - minecraftserver.reader.addCompleter(new org.bukkit.craftbukkit.command.ConsoleCommandCompleter(minecraftserver.server)); - this.cserver = minecraftserver.server; - // CraftBukkit end - - this.j = new GameProfileBanList(a); - this.k = new IpBanList(b); - this.operators = new OpList(c); - this.whitelist = new WhiteList(d); - this.n = Maps.newHashMap(); - this.server = minecraftserver; - this.j.a(false); - this.k.a(false); - this.maxPlayers = 8; - } - - public void a(NetworkManager networkmanager, EntityPlayer entityplayer) { - GameProfile gameprofile = entityplayer.getProfile(); - UserCache usercache = this.server.getUserCache(); - GameProfile gameprofile1 = usercache.a(gameprofile.getId()); - String s = gameprofile1 == null ? gameprofile.getName() : gameprofile1.getName(); - - usercache.a(gameprofile); - NBTTagCompound nbttagcompound = this.a(entityplayer); - - entityplayer.spawnIn(this.server.getWorldServer(entityplayer.dimension)); - entityplayer.playerInteractManager.a((WorldServer) entityplayer.world); - String s1 = "local"; - - if (networkmanager.getSocketAddress() != null) { - s1 = networkmanager.getSocketAddress().toString(); - } - - // CraftBukkit - Moved message to after join - // g.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at (" + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); - WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - - this.a(entityplayer, (EntityPlayer) null, worldserver); - PlayerConnection playerconnection = new PlayerConnection(this.server, networkmanager, entityplayer); - - // CraftBukkit start - Don't send a higher than 60 MaxPlayer size, otherwise the PlayerInfo window won't render correctly. - int maxPlayers = this.getMaxPlayers(); - if (maxPlayers > 60) { - maxPlayers = 60; - } - playerconnection.sendPacket(new PacketPlayOutLogin(entityplayer.getId(), entityplayer.playerInteractManager.getGameMode(), worldserver.getWorldData().isHardcore(), worldserver.worldProvider.dimension, worldserver.difficulty, maxPlayers, worldserver.getWorldData().getType())); - entityplayer.getBukkitEntity().sendSupportedChannels(); - // CraftBukkit end - playerconnection.sendPacket(new PacketPlayOutCustomPayload("MC|Brand", this.getServer().getServerModName().getBytes(Charsets.UTF_8))); - playerconnection.sendPacket(new PacketPlayOutSpawnPosition(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z)); - playerconnection.sendPacket(new PacketPlayOutAbilities(entityplayer.abilities)); - playerconnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); - entityplayer.getStatisticManager().d(); - entityplayer.getStatisticManager().updateStatistics(entityplayer); - this.sendScoreboard((ScoreboardServer) worldserver.getScoreboard(), entityplayer); - this.server.az(); - /* CraftBukkit start - login message is handled in the event - ChatMessage chatmessage; - - if (!entityplayer.getName().equalsIgnoreCase(s)) { - chatmessage = new ChatMessage("multiplayer.player.joined.renamed", new Object[] { entityplayer.getScoreboardDisplayName(), s}); - } else { - chatmessage = new ChatMessage("multiplayer.player.joined", new Object[] { entityplayer.getScoreboardDisplayName()}); - } - - chatmessage.getChatModifier().setColor(EnumChatFormat.YELLOW); - this.sendMessage(chatmessage); - // CraftBukkit end */ - this.c(entityplayer); - worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - Update in case join event changed it - playerconnection.a(entityplayer.locX, entityplayer.locY, entityplayer.locZ, entityplayer.yaw, entityplayer.pitch); - this.b(entityplayer, worldserver); - if (this.server.getResourcePack().length() > 0) { - entityplayer.setResourcePack(this.server.getResourcePack()); - } - - Iterator iterator = entityplayer.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - playerconnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer.getId(), mobeffect)); - } - - entityplayer.syncInventory(); - if (nbttagcompound != null && nbttagcompound.hasKeyOfType("Riding", 10)) { - Entity entity = EntityTypes.a(nbttagcompound.getCompound("Riding"), worldserver); - - if (entity != null) { - entity.attachedToPlayer = true; - worldserver.addEntity(entity); - entityplayer.mount(entity); - entity.attachedToPlayer = false; - } - } - - // CraftBukkit - Moved from above, added world - g.info(entityplayer.getName() + "[" + s1 + "] logged in with entity id " + entityplayer.getId() + " at ([" + entityplayer.world.worldData.getName() + "] " + entityplayer.locX + ", " + entityplayer.locY + ", " + entityplayer.locZ + ")"); - } - - public void sendScoreboard(ScoreboardServer scoreboardserver, EntityPlayer entityplayer) { // CraftBukkit - protected -> public - HashSet hashset = new HashSet(); - Iterator iterator = scoreboardserver.getTeams().iterator(); - - while (iterator.hasNext()) { - ScoreboardTeam scoreboardteam = (ScoreboardTeam) iterator.next(); - - entityplayer.playerConnection.sendPacket(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); - } - - for (int i = 0; i < 3; ++i) { - ScoreboardObjective scoreboardobjective = scoreboardserver.getObjectiveForSlot(i); - - if (scoreboardobjective != null && !hashset.contains(scoreboardobjective)) { - List list = scoreboardserver.getScoreboardScorePacketsForObjective(scoreboardobjective); - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - Packet packet = (Packet) iterator1.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - - hashset.add(scoreboardobjective); - } - } - } - - public void setPlayerFileData(WorldServer[] aworldserver) { - if (this.playerFileData != null) return; // CraftBukkit - this.playerFileData = aworldserver[0].getDataManager().getPlayerFileData(); - } - - public void a(EntityPlayer entityplayer, WorldServer worldserver) { - WorldServer worldserver1 = entityplayer.r(); - - if (worldserver != null) { - worldserver.getPlayerChunkMap().removePlayer(entityplayer); - } - - worldserver1.getPlayerChunkMap().addPlayer(entityplayer); - worldserver1.chunkProviderServer.getChunkAt((int) entityplayer.locX >> 4, (int) entityplayer.locZ >> 4); - } - - public int d() { - return PlayerChunkMap.getFurthestViewableBlock(this.s()); - } - - public NBTTagCompound a(EntityPlayer entityplayer) { - // CraftBukkit - fix reference to worldserver array - NBTTagCompound nbttagcompound = this.server.worlds.get(0).getWorldData().i(); - NBTTagCompound nbttagcompound1; - - if (entityplayer.getName().equals(this.server.M()) && nbttagcompound != null) { - entityplayer.f(nbttagcompound); - nbttagcompound1 = nbttagcompound; - g.debug("loading single player"); - } else { - nbttagcompound1 = this.playerFileData.load(entityplayer); - } - - return nbttagcompound1; - } - - protected void b(EntityPlayer entityplayer) { - this.playerFileData.save(entityplayer); - ServerStatisticManager serverstatisticmanager = (ServerStatisticManager) this.n.get(entityplayer.getUniqueID()); - - if (serverstatisticmanager != null) { - serverstatisticmanager.b(); - } - } - - public void c(EntityPlayer entityplayer) { - cserver.detectListNameConflict(entityplayer); // CraftBukkit - // this.sendAll(new PacketPlayOutPlayerInfo(entityplayer.getName(), true, 1000)); // CraftBukkit - replaced with loop below - this.players.add(entityplayer); - WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); - - // CraftBukkit start - PlayerJoinEvent playerJoinEvent = new PlayerJoinEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " joined the game."); - this.cserver.getPluginManager().callEvent(playerJoinEvent); - - String joinMessage = playerJoinEvent.getJoinMessage(); - - if ((joinMessage != null) && (joinMessage.length() > 0)) { - for (IChatBaseComponent line : org.bukkit.craftbukkit.util.CraftChatMessage.fromString(joinMessage)) { - this.server.getPlayerList().sendAll(new PacketPlayOutChat(line)); - } - } - this.cserver.onPlayerJoin(playerJoinEvent.getPlayer()); - - ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); - // CraftBukkit end - - // CraftBukkit start - Only add if the player wasn't moved in the event - if (entityplayer.world == worldserver && !worldserver.players.contains(entityplayer)) { - worldserver.addEntity(entityplayer); - this.a(entityplayer, (WorldServer) null); - } - // CraftBukkit end - - // CraftBukkit start - sendAll above replaced with this loop - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(entityplayer.listName, true, 1000); - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - - if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { - entityplayer1.playerConnection.sendPacket(packet); - } - } - // CraftBukkit end - - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - - // CraftBukkit start - if (!entityplayer.getBukkitEntity().canSee(entityplayer1.getBukkitEntity())) { - continue; - } - // .name -> .listName - entityplayer.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(entityplayer1.listName, true, entityplayer1.ping)); - // CraftBukkit end - } - } - - public void d(EntityPlayer entityplayer) { - entityplayer.r().getPlayerChunkMap().movePlayer(entityplayer); - } - - public String disconnect(EntityPlayer entityplayer) { // CraftBukkit - return string - entityplayer.a(StatisticList.f); - - // CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it - org.bukkit.craftbukkit.event.CraftEventFactory.handleInventoryCloseEvent(entityplayer); - - PlayerQuitEvent playerQuitEvent = new PlayerQuitEvent(this.cserver.getPlayer(entityplayer), "\u00A7e" + entityplayer.getName() + " left the game."); - this.cserver.getPluginManager().callEvent(playerQuitEvent); - entityplayer.getBukkitEntity().disconnect(playerQuitEvent.getQuitMessage()); - // CraftBukkit end - - this.b(entityplayer); - WorldServer worldserver = entityplayer.r(); - - if (entityplayer.vehicle != null && !(entityplayer.vehicle instanceof EntityPlayer)) { // CraftBukkit - Don't remove players - worldserver.removeEntity(entityplayer.vehicle); - g.debug("removing player mount"); - } - - worldserver.kill(entityplayer); - worldserver.getPlayerChunkMap().removePlayer(entityplayer); - this.players.remove(entityplayer); - this.n.remove(entityplayer.getUniqueID()); - ChunkIOExecutor.adjustPoolSize(this.getPlayerCount()); // CraftBukkit - - // CraftBukkit start - .name -> .listName, replace sendAll with loop - // this.sendAll(new PacketPlayOutPlayerInfo(entityplayer.getName(), false, 9999)); - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(entityplayer.listName, false, 9999); - for (int i = 0; i < this.players.size(); ++i) { - EntityPlayer entityplayer1 = (EntityPlayer) this.players.get(i); - - if (entityplayer1.getBukkitEntity().canSee(entityplayer.getBukkitEntity())) { - entityplayer1.playerConnection.sendPacket(packet); - } else { - entityplayer1.getBukkitEntity().removeDisconnectingPlayer(entityplayer.getBukkitEntity()); - } - } - // This removes the scoreboard (and player reference) for the specific player in the manager - this.cserver.getScoreboardManager().removePlayer(entityplayer.getBukkitEntity()); - - return playerQuitEvent.getQuitMessage(); - // CraftBukkit end - } - - // CraftBukkit start - Whole method, SocketAddress to LoginListener, added hostname to signature, return EntityPlayer - public EntityPlayer attemptLogin(LoginListener loginlistener, GameProfile gameprofile, String hostname) { - // Instead of kicking then returning, we need to store the kick reason - // in the event, check with plugins to see if it's ok, and THEN kick - // depending on the outcome. - SocketAddress socketaddress = loginlistener.networkManager.getSocketAddress(); - - EntityPlayer entity = new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, new PlayerInteractManager(this.server.getWorldServer(0))); - Player player = entity.getBukkitEntity(); - PlayerLoginEvent event = new PlayerLoginEvent(player, hostname, ((java.net.InetSocketAddress) socketaddress).getAddress()); - String s; - - if (this.j.isBanned(gameprofile) && !this.j.get(gameprofile).hasExpired()) { - GameProfileBanEntry gameprofilebanentry = (GameProfileBanEntry) this.j.get(gameprofile); - - s = "You are banned from this server!\nReason: " + gameprofilebanentry.getReason(); - if (gameprofilebanentry.getExpires() != null) { - s = s + "\nYour ban will be removed on " + h.format(gameprofilebanentry.getExpires()); - } - - // return s; - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); - } else if (!this.isWhitelisted(gameprofile)) { - // return "You are not white-listed on this server!"; - event.disallow(PlayerLoginEvent.Result.KICK_WHITELIST, "You are not white-listed on this server!"); - } else if (this.k.isBanned(socketaddress) && !this.k.get(gameprofile).hasExpired()) { - IpBanEntry ipbanentry = this.k.get(socketaddress); - - s = "Your IP address is banned from this server!\nReason: " + ipbanentry.getReason(); - if (ipbanentry.getExpires() != null) { - s = s + "\nYour ban will be removed on " + h.format(ipbanentry.getExpires()); - } - - // return s; - event.disallow(PlayerLoginEvent.Result.KICK_BANNED, s); - } else { - // return this.players.size() >= this.maxPlayers ? "The server is full!" : null; - if (this.players.size() >= this.maxPlayers) { - event.disallow(PlayerLoginEvent.Result.KICK_FULL, "The server is full!"); - } - } - - this.cserver.getPluginManager().callEvent(event); - if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { - loginlistener.disconnect(event.getKickMessage()); - return null; - } - - return entity; - // CraftBukkit end - } - - public EntityPlayer processLogin(GameProfile gameprofile, EntityPlayer player) { // CraftBukkit - added EntityPlayer - UUID uuid = EntityHuman.a(gameprofile); - ArrayList arraylist = Lists.newArrayList(); - - EntityPlayer entityplayer; - - for (int i = 0; i < this.players.size(); ++i) { - entityplayer = (EntityPlayer) this.players.get(i); - if (entityplayer.getUniqueID().equals(uuid)) { - arraylist.add(entityplayer); - } - } - - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - entityplayer = (EntityPlayer) iterator.next(); - entityplayer.playerConnection.disconnect("You logged in from another location"); - } - - /* CraftBukkit start - Object object; - - if (this.server.R()) { - object = new DemoPlayerInteractManager(this.server.getWorldServer(0)); - } else { - object = new PlayerInteractManager(this.server.getWorldServer(0)); - } - - return new EntityPlayer(this.server, this.server.getWorldServer(0), gameprofile, (PlayerInteractManager) object); - // */ - return player; - // CraftBukkit end - } - - // CraftBukkit start - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag) { - return this.moveToWorld(entityplayer, i, flag, null, true); - } - - public EntityPlayer moveToWorld(EntityPlayer entityplayer, int i, boolean flag, Location location, boolean avoidSuffocation) { - // CraftBukkit end - entityplayer.r().getTracker().untrackPlayer(entityplayer); - // entityplayer.r().getTracker().untrackEntity(entityplayer); // CraftBukkit - entityplayer.r().getPlayerChunkMap().removePlayer(entityplayer); - this.players.remove(entityplayer); - this.server.getWorldServer(entityplayer.dimension).removeEntity(entityplayer); - ChunkCoordinates chunkcoordinates = entityplayer.getBed(); - boolean flag1 = entityplayer.isRespawnForced(); - - /* CraftBukkit start - entityplayer.dimension = i; - Object object; - - if (this.server.R()) { - object = new DemoPlayerInteractManager(this.server.getWorldServer(entityplayer.dimension)); - } else { - object = new PlayerInteractManager(this.server.getWorldServer(entityplayer.dimension)); - } - - EntityPlayer entityplayer1 = new EntityPlayer(this.server, this.server.getWorldServer(entityplayer.dimension), entityplayer.getProfile(), (PlayerInteractManager) object); - // */ - EntityPlayer entityplayer1 = entityplayer; - org.bukkit.World fromWorld = entityplayer1.getBukkitEntity().getWorld(); - entityplayer1.viewingCredits = false; - // CraftBukkit end - - entityplayer1.playerConnection = entityplayer.playerConnection; - entityplayer1.copyTo(entityplayer, flag); - entityplayer1.d(entityplayer.getId()); - // WorldServer worldserver = this.server.getWorldServer(entityplayer.dimension); // CraftBukkit - handled later - - // this.a(entityplayer1, entityplayer, worldserver); // CraftBukkit - removed - ChunkCoordinates chunkcoordinates1; - - // CraftBukkit start - fire PlayerRespawnEvent - if (location == null) { - boolean isBedSpawn = false; - CraftWorld cworld = (CraftWorld) this.server.server.getWorld(entityplayer.spawnWorld); - if (cworld != null && chunkcoordinates != null) { - chunkcoordinates1 = EntityHuman.getBed(cworld.getHandle(), chunkcoordinates, flag1); - if (chunkcoordinates1 != null) { - isBedSpawn = true; - location = new Location(cworld, chunkcoordinates1.x + 0.5, chunkcoordinates1.y, chunkcoordinates1.z + 0.5); - } else { - entityplayer1.setRespawnPosition(null, true); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutGameStateChange(0, 0)); - } - } - - if (location == null) { - cworld = (CraftWorld) this.server.server.getWorlds().get(0); - chunkcoordinates = cworld.getHandle().getSpawn(); - location = new Location(cworld, chunkcoordinates.x + 0.5, chunkcoordinates.y, chunkcoordinates.z + 0.5); - } - - Player respawnPlayer = this.cserver.getPlayer(entityplayer1); - PlayerRespawnEvent respawnEvent = new PlayerRespawnEvent(respawnPlayer, location, isBedSpawn); - this.cserver.getPluginManager().callEvent(respawnEvent); - - location = respawnEvent.getRespawnLocation(); - entityplayer.reset(); - } else { - location.setWorld(this.server.getWorldServer(i).getWorld()); - } - WorldServer worldserver = ((CraftWorld) location.getWorld()).getHandle(); - entityplayer1.setLocation(location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); - // CraftBukkit end - - worldserver.chunkProviderServer.getChunkAt((int) entityplayer1.locX >> 4, (int) entityplayer1.locZ >> 4); - - while (avoidSuffocation && !worldserver.getCubes(entityplayer1, entityplayer1.boundingBox).isEmpty()) { // CraftBukkit - entityplayer1.setPosition(entityplayer1.locX, entityplayer1.locY + 1.0D, entityplayer1.locZ); - } - - // CraftBukkit start - byte actualDimension = (byte) (worldserver.getWorld().getEnvironment().getId()); - // Force the client to refresh their chunk cache. - entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn((byte) (actualDimension >= 0 ? -1 : 0), worldserver.difficulty, worldserver.getWorldData().getType(), entityplayer.playerInteractManager.getGameMode())); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutRespawn(actualDimension, worldserver.difficulty, worldserver.getWorldData().getType(), entityplayer1.playerInteractManager.getGameMode())); - entityplayer1.spawnIn(worldserver); - entityplayer1.dead = false; - entityplayer1.playerConnection.teleport(new Location(worldserver.getWorld(), entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch)); - entityplayer1.setSneaking(false); - chunkcoordinates1 = worldserver.getSpawn(); - // entityplayer1.playerConnection.a(entityplayer1.locX, entityplayer1.locY, entityplayer1.locZ, entityplayer1.yaw, entityplayer1.pitch); - // CraftBukkit end - entityplayer1.playerConnection.sendPacket(new PacketPlayOutSpawnPosition(chunkcoordinates1.x, chunkcoordinates1.y, chunkcoordinates1.z)); - entityplayer1.playerConnection.sendPacket(new PacketPlayOutExperience(entityplayer1.exp, entityplayer1.expTotal, entityplayer1.expLevel)); - this.b(entityplayer1, worldserver); - // CraftBukkit start - // Don't re-add player to player list if disconnected - if (!entityplayer.playerConnection.isDisconnected()) { - worldserver.getPlayerChunkMap().addPlayer(entityplayer1); - worldserver.addEntity(entityplayer1); - this.players.add(entityplayer1); - } - // Added from changeDimension - this.updateClient(entityplayer1); // Update health, etc... - entityplayer1.updateAbilities(); - Iterator iterator = entityplayer1.getEffects().iterator(); - - while (iterator.hasNext()) { - MobEffect mobeffect = (MobEffect) iterator.next(); - - entityplayer1.playerConnection.sendPacket(new PacketPlayOutEntityEffect(entityplayer1.getId(), mobeffect)); - } - // entityplayer1.syncInventory(); - // CraftBukkit end - entityplayer1.setHealth(entityplayer1.getHealth()); - - // CraftBukkit start - // Don't fire on respawn - if (fromWorld != location.getWorld()) { - PlayerChangedWorldEvent event = new PlayerChangedWorldEvent((Player) entityplayer1.getBukkitEntity(), fromWorld); - Bukkit.getServer().getPluginManager().callEvent(event); - } - - // Save player file again if they were disconnected - if (entityplayer.playerConnection.isDisconnected()) { - this.b(entityplayer1); - } - // CraftBukkit end - - return entityplayer1; - } - - // CraftBukkit start - Replaced the standard handling of portals with a more customised method. - public void changeDimension(EntityPlayer entityplayer, int i, TeleportCause cause) { - WorldServer exitWorld = null; - if (entityplayer.dimension < CraftWorld.CUSTOM_DIMENSION_OFFSET) { // plugins must specify exit from custom Bukkit worlds - // only target existing worlds (compensate for allow-nether/allow-end as false) - for (WorldServer world : this.server.worlds) { - if (world.dimension == i) { - exitWorld = world; - } - } - } - - Location enter = entityplayer.getBukkitEntity().getLocation(); - Location exit = null; - boolean useTravelAgent = false; // don't use agent for custom worlds or return from THE_END - if (exitWorld != null) { - if ((cause == TeleportCause.END_PORTAL) && (i == 0)) { - // THE_END -> NORMAL; use bed if available, otherwise default spawn - exit = ((org.bukkit.craftbukkit.entity.CraftPlayer) entityplayer.getBukkitEntity()).getBedSpawnLocation(); - if (exit == null || ((CraftWorld) exit.getWorld()).getHandle().dimension != 0) { - exit = exitWorld.getWorld().getSpawnLocation(); - } - } else { - // NORMAL <-> NETHER or NORMAL -> THE_END - exit = this.calculateTarget(enter, exitWorld); - useTravelAgent = true; - } - } - - TravelAgent agent = exit != null ? (TravelAgent) ((CraftWorld) exit.getWorld()).getHandle().getTravelAgent() : org.bukkit.craftbukkit.CraftTravelAgent.DEFAULT; // return arbitrary TA to compensate for implementation dependent plugins - PlayerPortalEvent event = new PlayerPortalEvent(entityplayer.getBukkitEntity(), enter, exit, agent, cause); - event.useTravelAgent(useTravelAgent); - Bukkit.getServer().getPluginManager().callEvent(event); - if (event.isCancelled() || event.getTo() == null) { - return; - } - - exit = event.useTravelAgent() ? event.getPortalTravelAgent().findOrCreate(event.getTo()) : event.getTo(); - if (exit == null) { - return; - } - exitWorld = ((CraftWorld) exit.getWorld()).getHandle(); - - Vector velocity = entityplayer.getBukkitEntity().getVelocity(); - boolean before = exitWorld.chunkProviderServer.forceChunkLoad; - exitWorld.chunkProviderServer.forceChunkLoad = true; - exitWorld.getTravelAgent().adjustExit(entityplayer, exit, velocity); - exitWorld.chunkProviderServer.forceChunkLoad = before; - - this.moveToWorld(entityplayer, exitWorld.dimension, true, exit, false); // Vanilla doesn't check for suffocation when handling portals, so neither should we - if (entityplayer.motX != velocity.getX() || entityplayer.motY != velocity.getY() || entityplayer.motZ != velocity.getZ()) { - entityplayer.getBukkitEntity().setVelocity(velocity); - } - // CraftBukkit end - } - - public void a(Entity entity, int i, WorldServer worldserver, WorldServer worldserver1) { - // CraftBukkit start - Split into modular functions - Location exit = this.calculateTarget(entity.getBukkitEntity().getLocation(), worldserver1); - this.repositionEntity(entity, exit, true); - } - - // Copy of original a(Entity, int, WorldServer, WorldServer) method with only location calculation logic - public Location calculateTarget(Location enter, World target) { - WorldServer worldserver = ((CraftWorld) enter.getWorld()).getHandle(); - WorldServer worldserver1 = ((CraftWorld) target.getWorld()).getHandle(); - int i = worldserver.dimension; - - double y = enter.getY(); - float yaw = enter.getYaw(); - float pitch = enter.getPitch(); - double d0 = enter.getX(); - double d1 = enter.getZ(); - double d2 = 8.0D; - /* - double d3 = entity.locX; - double d4 = entity.locY; - double d5 = entity.locZ; - float f = entity.yaw; - - worldserver.methodProfiler.a("moving"); - */ - if (worldserver1.dimension == -1) { - d0 /= d2; - d1 /= d2; - /* - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - */ - } else if (worldserver1.dimension == 0) { - d0 *= d2; - d1 *= d2; - /* - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - */ - } else { - ChunkCoordinates chunkcoordinates; - - if (i == 1) { - // use default NORMAL world spawn instead of target - worldserver1 = this.server.worlds.get(0); - chunkcoordinates = worldserver1.getSpawn(); - } else { - chunkcoordinates = worldserver1.getDimensionSpawn(); - } - - d0 = (double) chunkcoordinates.x; - y = (double) chunkcoordinates.y; - d1 = (double) chunkcoordinates.z; - yaw = 90.0F; - pitch = 0.0F; - /* - entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - */ - } - - // worldserver.methodProfiler.b(); - if (i != 1) { - // worldserver.methodProfiler.a("placing"); - d0 = (double) MathHelper.a((int) d0, -29999872, 29999872); - d1 = (double) MathHelper.a((int) d1, -29999872, 29999872); - /* - if (entity.isAlive()) { - worldserver1.addEntity(entity); - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - worldserver1.entityJoinedWorld(entity, false); - worldserver1.getTravelAgent().a(entity, d3, d4, d5, f); - } - - worldserver.methodProfiler.b(); - */ - } - - // entity.spawnIn(worldserver1); - return new Location(worldserver1.getWorld(), d0, y, d1, yaw, pitch); - } - - // copy of original a(Entity, int, WorldServer, WorldServer) method with only entity repositioning logic - public void repositionEntity(Entity entity, Location exit, boolean portal) { - int i = entity.dimension; - WorldServer worldserver = (WorldServer) entity.world; - WorldServer worldserver1 = ((CraftWorld) exit.getWorld()).getHandle(); - /* - double d0 = entity.locX; - double d1 = entity.locZ; - double d2 = 8.0D; - double d3 = entity.locX; - double d4 = entity.locY; - double d5 = entity.locZ; - float f = entity.yaw; - */ - - worldserver.methodProfiler.a("moving"); - entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - /* - if (entity.dimension == -1) { - d0 /= d2; - d1 /= d2; - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - } else if (entity.dimension == 0) { - d0 *= d2; - d1 *= d2; - entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - } else { - ChunkCoordinates chunkcoordinates; - - if (i == 1) { - chunkcoordinates = worldserver1.getSpawn(); - } else { - chunkcoordinates = worldserver1.getDimensionSpawn(); - } - - d0 = (double) chunkcoordinates.x; - entity.locY = (double) chunkcoordinates.y; - d1 = (double) chunkcoordinates.z; - entity.setPositionRotation(d0, entity.locY, d1, 90.0F, 0.0F); - if (entity.isAlive()) { - worldserver.entityJoinedWorld(entity, false); - } - } - */ - - worldserver.methodProfiler.b(); - if (i != 1) { - worldserver.methodProfiler.a("placing"); - /* - d0 = (double) MathHelper.a((int) d0, -29999872, 29999872); - d1 = (double) MathHelper.a((int) d1, -29999872, 29999872); - */ - if (entity.isAlive()) { - // entity.setPositionRotation(d0, entity.locY, d1, entity.yaw, entity.pitch) - // worldserver1.getTravelAgent().a(entity, d3, d4, d5, f); - if (portal) { - Vector velocity = entity.getBukkitEntity().getVelocity(); - worldserver1.getTravelAgent().adjustExit(entity, exit, velocity); - entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); - if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { - entity.getBukkitEntity().setVelocity(velocity); - } - } - worldserver1.addEntity(entity); - worldserver1.entityJoinedWorld(entity, false); - } - - worldserver.methodProfiler.b(); - } - - entity.spawnIn(worldserver1); - // CraftBukkit end - } - - public void tick() { - if (++this.t > 600) { - this.t = 0; - } - - /* CraftBukkit start - Remove updating of lag to players -- it spams way to much on big servers. - if (this.t < this.players.size()) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(this.p); - - this.sendAll(new PacketPlayOutPlayerInfo(entityplayer.getName(), true, entityplayer.ping)); - } - // CraftBukkit end */ - } - - public void sendAll(Packet packet) { - for (int i = 0; i < this.players.size(); ++i) { - ((EntityPlayer) this.players.get(i)).playerConnection.sendPacket(packet); - } - } - - public void a(Packet packet, int i) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - - if (entityplayer.dimension == i) { - entityplayer.playerConnection.sendPacket(packet); - } - } - } - - public String b(boolean flag) { - String s = ""; - ArrayList arraylist = Lists.newArrayList(this.players); - - for (int i = 0; i < arraylist.size(); ++i) { - if (i > 0) { - s = s + ", "; - } - - s = s + ((EntityPlayer) arraylist.get(i)).getName(); - if (flag) { - s = s + " (" + ((EntityPlayer) arraylist.get(i)).getUniqueID().toString() + ")"; - } - } - - return s; - } - - public String[] f() { - String[] astring = new String[this.players.size()]; - - for (int i = 0; i < this.players.size(); ++i) { - astring[i] = ((EntityPlayer) this.players.get(i)).getName(); - } - - return astring; - } - - public GameProfile[] g() { - GameProfile[] agameprofile = new GameProfile[this.players.size()]; - - for (int i = 0; i < this.players.size(); ++i) { - agameprofile[i] = ((EntityPlayer) this.players.get(i)).getProfile(); - } - - return agameprofile; - } - - public GameProfileBanList getProfileBans() { - return this.j; - } - - public IpBanList getIPBans() { - return this.k; - } - - public void addOp(GameProfile gameprofile) { - this.operators.add(new OpListEntry(gameprofile, this.server.l())); - - // CraftBukkit start - Player player = server.server.getPlayer(gameprofile.getId()); - if (player != null) { - player.recalculatePermissions(); - } - // CraftBukkit end - } - - public void removeOp(GameProfile gameprofile) { - this.operators.remove(gameprofile); - - // CraftBukkit start - Player player = server.server.getPlayer(gameprofile.getId()); - if (player != null) { - player.recalculatePermissions(); - } - // CraftBukkit end - } - - public boolean isWhitelisted(GameProfile gameprofile) { - return !this.hasWhitelist || this.operators.d(gameprofile) || this.whitelist.d(gameprofile); - } - - public boolean isOp(GameProfile gameprofile) { - // CraftBukkit - fix reference to worldserver array - return this.operators.d(gameprofile) || this.server.N() && this.server.worlds.get(0).getWorldData().allowCommands() && this.server.M().equalsIgnoreCase(gameprofile.getName()) || this.s; - } - - public EntityPlayer getPlayer(String s) { - Iterator iterator = this.players.iterator(); - - EntityPlayer entityplayer; - - do { - if (!iterator.hasNext()) { - return null; - } - - entityplayer = (EntityPlayer) iterator.next(); - } while (!entityplayer.getName().equalsIgnoreCase(s)); - - return entityplayer; - } - - public List a(ChunkCoordinates chunkcoordinates, int i, int j, int k, int l, int i1, int j1, Map map, String s, String s1, World world) { - if (this.players.isEmpty()) { - return Collections.emptyList(); - } else { - Object object = new ArrayList(); - boolean flag = k < 0; - boolean flag1 = s != null && s.startsWith("!"); - boolean flag2 = s1 != null && s1.startsWith("!"); - int k1 = i * i; - int l1 = j * j; - - k = MathHelper.a(k); - if (flag1) { - s = s.substring(1); - } - - if (flag2) { - s1 = s1.substring(1); - } - - for (int i2 = 0; i2 < this.players.size(); ++i2) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(i2); - - if ((world == null || entityplayer.world == world) && (s == null || flag1 != s.equalsIgnoreCase(entityplayer.getName()))) { - if (s1 != null) { - ScoreboardTeamBase scoreboardteambase = entityplayer.getScoreboardTeam(); - String s2 = scoreboardteambase == null ? "" : scoreboardteambase.getName(); - - if (flag2 == s1.equalsIgnoreCase(s2)) { - continue; - } - } - - if (chunkcoordinates != null && (i > 0 || j > 0)) { - float f = chunkcoordinates.e(entityplayer.getChunkCoordinates()); - - if (i > 0 && f < (float) k1 || j > 0 && f > (float) l1) { - continue; - } - } - - if (this.a((EntityHuman) entityplayer, map) && (l == EnumGamemode.NONE.getId() || l == entityplayer.playerInteractManager.getGameMode().getId()) && (i1 <= 0 || entityplayer.expLevel >= i1) && entityplayer.expLevel <= j1) { - ((List) object).add(entityplayer); - } - } - } - - if (chunkcoordinates != null) { - Collections.sort((List) object, new PlayerDistanceComparator(chunkcoordinates)); - } - - if (flag) { - Collections.reverse((List) object); - } - - if (k > 0) { - object = ((List) object).subList(0, Math.min(k, ((List) object).size())); - } - - return (List) object; - } - } - - private boolean a(EntityHuman entityhuman, Map map) { - if (map != null && map.size() != 0) { - Iterator iterator = map.entrySet().iterator(); - - Entry entry; - boolean flag; - int i; - - do { - if (!iterator.hasNext()) { - return true; - } - - entry = (Entry) iterator.next(); - String s = (String) entry.getKey(); - - flag = false; - if (s.endsWith("_min") && s.length() > 4) { - flag = true; - s = s.substring(0, s.length() - 4); - } - - Scoreboard scoreboard = entityhuman.getScoreboard(); - ScoreboardObjective scoreboardobjective = scoreboard.getObjective(s); - - if (scoreboardobjective == null) { - return false; - } - - ScoreboardScore scoreboardscore = entityhuman.getScoreboard().getPlayerScoreForObjective(entityhuman.getName(), scoreboardobjective); - - i = scoreboardscore.getScore(); - if (i < ((Integer) entry.getValue()).intValue() && flag) { - return false; - } - } while (i <= ((Integer) entry.getValue()).intValue() || flag); - - return false; - } else { - return true; - } - } - - public void sendPacketNearby(double d0, double d1, double d2, double d3, int i, Packet packet) { - this.sendPacketNearby((EntityHuman) null, d0, d1, d2, d3, i, packet); - } - - public void sendPacketNearby(EntityHuman entityhuman, double d0, double d1, double d2, double d3, int i, Packet packet) { - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - - // CraftBukkit start - Test if player receiving packet can see the source of the packet - if (entityhuman != null && entityhuman instanceof EntityPlayer && !entityplayer.getBukkitEntity().canSee(((EntityPlayer) entityhuman).getBukkitEntity())) { - continue; - } - // CraftBukkit end - - if (entityplayer != entityhuman && entityplayer.dimension == i) { - double d4 = d0 - entityplayer.locX; - double d5 = d1 - entityplayer.locY; - double d6 = d2 - entityplayer.locZ; - - if (d4 * d4 + d5 * d5 + d6 * d6 < d3 * d3) { - entityplayer.playerConnection.sendPacket(packet); - } - } - } - } - - public void savePlayers() { - for (int i = 0; i < this.players.size(); ++i) { - this.b((EntityPlayer) this.players.get(i)); - } - } - - public void addWhitelist(GameProfile gameprofile) { - this.whitelist.add(new WhiteListEntry(gameprofile)); - } - - public void removeWhitelist(GameProfile gameprofile) { - this.whitelist.remove(gameprofile); - } - - public WhiteList getWhitelist() { - return this.whitelist; - } - - public String[] getWhitelisted() { - return this.whitelist.getEntries(); - } - - public OpList getOPs() { - return this.operators; - } - - public String[] n() { - return this.operators.getEntries(); - } - - public void reloadWhitelist() {} - - public void b(EntityPlayer entityplayer, WorldServer worldserver) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutUpdateTime(worldserver.getTime(), worldserver.getDayTime(), worldserver.getGameRules().getBoolean("doDaylightCycle"))); - if (worldserver.Q()) { - // CraftBukkit start - handle player weather - // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(1, 0.0F)); - // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(7, worldserver.j(1.0F))); - // entityplayer.playerConnection.sendPacket(new PacketPlayOutGameStateChange(8, worldserver.h(1.0F))); - entityplayer.setPlayerWeather(org.bukkit.WeatherType.DOWNFALL, false); - // CraftBukkit end - } - } - - public void updateClient(EntityPlayer entityplayer) { - entityplayer.updateInventory(entityplayer.defaultContainer); - entityplayer.getBukkitEntity().updateScaledHealth(); // CraftBukkit - Update scaled health on respawn and worldchange - entityplayer.playerConnection.sendPacket(new PacketPlayOutHeldItemSlot(entityplayer.inventory.itemInHandIndex)); - } - - public int getPlayerCount() { - return this.players.size(); - } - - public int getMaxPlayers() { - return this.maxPlayers; - } - - public String[] getSeenPlayers() { - // CraftBukkit - fix reference to worldserver array - return this.server.worlds.get(0).getDataManager().getPlayerFileData().getSeenPlayers(); - } - - public boolean getHasWhitelist() { - return this.hasWhitelist; - } - - public void setHasWhitelist(boolean flag) { - this.hasWhitelist = flag; - } - - public List b(String s) { - ArrayList arraylist = new ArrayList(); - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - if (entityplayer.s().equals(s)) { - arraylist.add(entityplayer); - } - } - - return arraylist; - } - - public int s() { - return this.q; - } - - public MinecraftServer getServer() { - return this.server; - } - - public NBTTagCompound t() { - return null; - } - - private void a(EntityPlayer entityplayer, EntityPlayer entityplayer1, World world) { - if (entityplayer1 != null) { - entityplayer.playerInteractManager.setGameMode(entityplayer1.playerInteractManager.getGameMode()); - } else if (this.r != null) { - entityplayer.playerInteractManager.setGameMode(this.r); - } - - entityplayer.playerInteractManager.b(world.getWorldData().getGameType()); - } - - public void u() { - for (int i = 0; i < this.players.size(); ++i) { - ((EntityPlayer) this.players.get(i)).playerConnection.disconnect(this.server.server.getShutdownMessage()); // CraftBukkit - add custom shutdown message - } - } - - // CraftBukkit start - Support multi-line messages - public void sendMessage(IChatBaseComponent[] ichatbasecomponent) { - for (IChatBaseComponent component : ichatbasecomponent) { - sendMessage(component, true); - } - } - // CraftBukkit end - - public void sendMessage(IChatBaseComponent ichatbasecomponent, boolean flag) { - this.server.sendMessage(ichatbasecomponent); - this.sendAll(new PacketPlayOutChat(ichatbasecomponent, flag)); - } - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.sendMessage(ichatbasecomponent, true); - } - - public ServerStatisticManager a(EntityHuman entityhuman) { - UUID uuid = entityhuman.getUniqueID(); - ServerStatisticManager serverstatisticmanager = uuid == null ? null : (ServerStatisticManager) this.n.get(uuid); - - if (serverstatisticmanager == null) { - File file1 = new File(this.server.getWorldServer(0).getDataManager().getDirectory(), "stats"); - File file2 = new File(file1, uuid.toString() + ".json"); - - if (!file2.exists()) { - File file3 = new File(file1, entityhuman.getName() + ".json"); - - if (file3.exists() && file3.isFile()) { - file3.renameTo(file2); - } - } - - serverstatisticmanager = new ServerStatisticManager(this.server, file2); - serverstatisticmanager.a(); - this.n.put(uuid, serverstatisticmanager); - } - - return serverstatisticmanager; - } - - public void a(int i) { - this.q = i; - if (this.server.worldServer != null) { - WorldServer[] aworldserver = this.server.worldServer; - int j = aworldserver.length; - - for (int k = 0; k < j; ++k) { - WorldServer worldserver = aworldserver[k]; - - if (worldserver != null) { - worldserver.getPlayerChunkMap().a(i); - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PlayerSelector.java b/src/main/java/net/minecraft/server/PlayerSelector.java deleted file mode 100644 index 819a1333..00000000 --- a/src/main/java/net/minecraft/server/PlayerSelector.java +++ /dev/null @@ -1,247 +0,0 @@ -package net.minecraft.server; - -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class PlayerSelector { - - private static final Pattern a = Pattern.compile("^@([parf])(?:\\[([\\w=,!-]*)\\])?$"); - private static final Pattern b = Pattern.compile("\\G([-!]?[\\w-]*)(?:$|,)"); - private static final Pattern c = Pattern.compile("\\G(\\w+)=([-!]?[\\w-]*)(?:$|,)"); - - public static EntityPlayer getPlayer(ICommandListener icommandlistener, String s) { - EntityPlayer[] aentityplayer = getPlayers(icommandlistener, s); - - return aentityplayer != null && aentityplayer.length == 1 ? aentityplayer[0] : null; - } - - public static IChatBaseComponent getPlayerNames(ICommandListener icommandlistener, String s) { - EntityPlayer[] aentityplayer = getPlayers(icommandlistener, s); - - if (aentityplayer != null && aentityplayer.length != 0) { - IChatBaseComponent[] aichatbasecomponent = new IChatBaseComponent[aentityplayer.length]; - - for (int i = 0; i < aichatbasecomponent.length; ++i) { - aichatbasecomponent[i] = aentityplayer[i].getScoreboardDisplayName(); - } - - return CommandAbstract.a(aichatbasecomponent); - } else { - return null; - } - } - - public static EntityPlayer[] getPlayers(ICommandListener icommandlistener, String s) { - // CraftBukkit start - disable playerselections for ICommandListeners other than command blocks - if (!(icommandlistener instanceof CommandBlockListenerAbstract)) { - return null; - } - // CraftBukkit end - - Matcher matcher = a.matcher(s); - - if (matcher.matches()) { - Map map = h(matcher.group(2)); - String s1 = matcher.group(1); - int i = c(s1); - int j = d(s1); - int k = f(s1); - int l = e(s1); - int i1 = g(s1); - int j1 = EnumGamemode.NONE.getId(); - ChunkCoordinates chunkcoordinates = icommandlistener.getChunkCoordinates(); - Map map1 = a(map); - String s2 = null; - String s3 = null; - boolean flag = false; - - if (map.containsKey("rm")) { - i = MathHelper.a((String) map.get("rm"), i); - flag = true; - } - - if (map.containsKey("r")) { - j = MathHelper.a((String) map.get("r"), j); - flag = true; - } - - if (map.containsKey("lm")) { - k = MathHelper.a((String) map.get("lm"), k); - } - - if (map.containsKey("l")) { - l = MathHelper.a((String) map.get("l"), l); - } - - if (map.containsKey("x")) { - chunkcoordinates.x = MathHelper.a((String) map.get("x"), chunkcoordinates.x); - flag = true; - } - - if (map.containsKey("y")) { - chunkcoordinates.y = MathHelper.a((String) map.get("y"), chunkcoordinates.y); - flag = true; - } - - if (map.containsKey("z")) { - chunkcoordinates.z = MathHelper.a((String) map.get("z"), chunkcoordinates.z); - flag = true; - } - - if (map.containsKey("m")) { - j1 = MathHelper.a((String) map.get("m"), j1); - } - - if (map.containsKey("c")) { - i1 = MathHelper.a((String) map.get("c"), i1); - } - - if (map.containsKey("team")) { - s3 = (String) map.get("team"); - } - - if (map.containsKey("name")) { - s2 = (String) map.get("name"); - } - - World world = flag ? icommandlistener.getWorld() : null; - List list; - - if (!s1.equals("p") && !s1.equals("a")) { - if (s1.equals("r")) { - list = MinecraftServer.getServer().getPlayerList().a(chunkcoordinates, i, j, 0, j1, k, l, map1, s2, s3, world); - Collections.shuffle(list); - list = list.subList(0, Math.min(i1, list.size())); - return list.isEmpty() ? new EntityPlayer[0] : (EntityPlayer[]) list.toArray(new EntityPlayer[list.size()]); - } else { - return null; - } - } else { - list = MinecraftServer.getServer().getPlayerList().a(chunkcoordinates, i, j, i1, j1, k, l, map1, s2, s3, world); - return list.isEmpty() ? new EntityPlayer[0] : (EntityPlayer[]) list.toArray(new EntityPlayer[list.size()]); - } - } else { - return null; - } - } - - public static Map a(Map map) { - HashMap hashmap = new HashMap(); - Iterator iterator = map.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - if (s.startsWith("score_") && s.length() > "score_".length()) { - String s1 = s.substring("score_".length()); - - hashmap.put(s1, Integer.valueOf(MathHelper.a((String) map.get(s), 1))); - } - } - - return hashmap; - } - - public static boolean isList(String s) { - Matcher matcher = a.matcher(s); - - if (matcher.matches()) { - Map map = h(matcher.group(2)); - String s1 = matcher.group(1); - int i = g(s1); - - if (map.containsKey("c")) { - i = MathHelper.a((String) map.get("c"), i); - } - - return i != 1; - } else { - return false; - } - } - - public static boolean isPattern(String s, String s1) { - Matcher matcher = a.matcher(s); - - if (matcher.matches()) { - String s2 = matcher.group(1); - - return s1 == null || s1.equals(s2); - } else { - return false; - } - } - - public static boolean isPattern(String s) { - return isPattern(s, (String) null); - } - - private static final int c(String s) { - return 0; - } - - private static final int d(String s) { - return 0; - } - - private static final int e(String s) { - return Integer.MAX_VALUE; - } - - private static final int f(String s) { - return 0; - } - - private static final int g(String s) { - return s.equals("a") ? 0 : 1; - } - - private static Map h(String s) { - HashMap hashmap = new HashMap(); - - if (s == null) { - return hashmap; - } else { - Matcher matcher = b.matcher(s); - int i = 0; - - int j; - - for (j = -1; matcher.find(); j = matcher.end()) { - String s1 = null; - - switch (i++) { - case 0: - s1 = "x"; - break; - - case 1: - s1 = "y"; - break; - - case 2: - s1 = "z"; - break; - - case 3: - s1 = "r"; - } - - if (s1 != null && matcher.group(1).length() > 0) { - hashmap.put(s1, matcher.group(1)); - } - } - - if (j < s.length()) { - matcher = c.matcher(j == -1 ? s : s.substring(j)); - - while (matcher.find()) { - hashmap.put(matcher.group(1), matcher.group(2)); - } - } - - return hashmap; - } - } -} diff --git a/src/main/java/net/minecraft/server/PortalCreator.java b/src/main/java/net/minecraft/server/PortalCreator.java deleted file mode 100644 index 309239de..00000000 --- a/src/main/java/net/minecraft/server/PortalCreator.java +++ /dev/null @@ -1,197 +0,0 @@ -package net.minecraft.server; - -import org.bukkit.event.world.PortalCreateEvent; // CraftBukkit - -public class PortalCreator { - - private final World a; - private final int b; - private final int c; - private final int d; - private int e = 0; - private ChunkCoordinates f; - private int g; - private int h; - java.util.Collection<org.bukkit.block.Block> blocks = new java.util.HashSet<org.bukkit.block.Block>(); // CraftBukkit - add field - - public PortalCreator(World world, int i, int j, int k, int l) { - this.a = world; - this.b = l; - this.d = BlockPortal.a[l][0]; - this.c = BlockPortal.a[l][1]; - - for (int i1 = j; j > i1 - 21 && j > 0 && this.a(world.getType(i, j - 1, k)); --j) { - ; - } - - int j1 = this.a(i, j, k, this.d) - 1; - - if (j1 >= 0) { - this.f = new ChunkCoordinates(i + j1 * Direction.a[this.d], j, k + j1 * Direction.b[this.d]); - this.h = this.a(this.f.x, this.f.y, this.f.z, this.c); - if (this.h < 2 || this.h > 21) { - this.f = null; - this.h = 0; - } - } - - if (this.f != null) { - this.g = this.a(); - } - } - - protected int a(int i, int j, int k, int l) { - int i1 = Direction.a[l]; - int j1 = Direction.b[l]; - - int k1; - Block block; - - for (k1 = 0; k1 < 22; ++k1) { - block = this.a.getType(i + i1 * k1, j, k + j1 * k1); - if (!this.a(block)) { - break; - } - - Block block1 = this.a.getType(i + i1 * k1, j - 1, k + j1 * k1); - - if (block1 != Blocks.OBSIDIAN) { - break; - } - } - - block = this.a.getType(i + i1 * k1, j, k + j1 * k1); - return block == Blocks.OBSIDIAN ? k1 : 0; - } - - protected int a() { - // CraftBukkit start - this.blocks.clear(); - org.bukkit.World bworld = this.a.getWorld(); - // CraftBukkit end - int i; - int j; - int k; - int l; - - label56: - for (this.g = 0; this.g < 21; ++this.g) { - i = this.f.y + this.g; - - for (j = 0; j < this.h; ++j) { - k = this.f.x + j * Direction.a[BlockPortal.a[this.b][1]]; - l = this.f.z + j * Direction.b[BlockPortal.a[this.b][1]]; - Block block = this.a.getType(k, i, l); - - if (!this.a(block)) { - break label56; - } - - if (block == Blocks.PORTAL) { - ++this.e; - } - - if (j == 0) { - block = this.a.getType(k + Direction.a[BlockPortal.a[this.b][0]], i, l + Direction.b[BlockPortal.a[this.b][0]]); - if (block != Blocks.OBSIDIAN) { - break label56; - // CraftBukkit start - add the block to our list - } else { - blocks.add(bworld.getBlockAt(k + Direction.a[BlockPortal.a[this.b][0]], i, l + Direction.b[BlockPortal.a[this.b][0]])); - // CraftBukkit end - } - } else if (j == this.h - 1) { - block = this.a.getType(k + Direction.a[BlockPortal.a[this.b][1]], i, l + Direction.b[BlockPortal.a[this.b][1]]); - if (block != Blocks.OBSIDIAN) { - break label56; - // CraftBukkit start - add the block to our list - } else { - blocks.add(bworld.getBlockAt(k + Direction.a[BlockPortal.a[this.b][1]], i, l + Direction.b[BlockPortal.a[this.b][1]])); - // CraftBukkit end - } - } - } - } - - for (i = 0; i < this.h; ++i) { - j = this.f.x + i * Direction.a[BlockPortal.a[this.b][1]]; - k = this.f.y + this.g; - l = this.f.z + i * Direction.b[BlockPortal.a[this.b][1]]; - if (this.a.getType(j, k, l) != Blocks.OBSIDIAN) { - this.g = 0; - break; - // CraftBukkit start - add the block to our list - } else { - blocks.add(bworld.getBlockAt(j, k, l)); - // CraftBukkit end - } - } - - if (this.g <= 21 && this.g >= 3) { - return this.g; - } else { - this.f = null; - this.h = 0; - this.g = 0; - return 0; - } - } - - protected boolean a(Block block) { - return block.material == Material.AIR || block == Blocks.FIRE || block == Blocks.PORTAL; - } - - public boolean b() { - return this.f != null && this.h >= 2 && this.h <= 21 && this.g >= 3 && this.g <= 21; - } - - // CraftBukkit start - return boolean - public boolean c() { - org.bukkit.World bworld = this.a.getWorld(); - - // Copy below for loop - for (int i = 0; i < this.h; ++i) { - int j = this.f.x + Direction.a[this.c] * i; - int k = this.f.z + Direction.b[this.c] * i; - - for (int l = 0; l < this.g; ++l) { - int i1 = this.f.y + l; - - blocks.add(bworld.getBlockAt(j, i1, k)); - } - } - - PortalCreateEvent event = new PortalCreateEvent(blocks, bworld, PortalCreateEvent.CreateReason.FIRE); - this.a.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - for (int i = 0; i < this.h; ++i) { - int j = this.f.x + Direction.a[this.c] * i; - int k = this.f.z + Direction.b[this.c] * i; - - for (int l = 0; l < this.g; ++l) { - int i1 = this.f.y + l; - - this.a.setTypeAndData(j, i1, k, Blocks.PORTAL, this.b, 2); - } - } - - return true; // CraftBukkit - } - - static int a(PortalCreator portalcreator) { - return portalcreator.e; - } - - static int b(PortalCreator portalcreator) { - return portalcreator.h; - } - - static int c(PortalCreator portalcreator) { - return portalcreator.g; - } -} diff --git a/src/main/java/net/minecraft/server/PortalTravelAgent.java b/src/main/java/net/minecraft/server/PortalTravelAgent.java deleted file mode 100644 index 70e6e81d..00000000 --- a/src/main/java/net/minecraft/server/PortalTravelAgent.java +++ /dev/null @@ -1,533 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.Location; -import org.bukkit.event.entity.EntityPortalExitEvent; -import org.bukkit.util.Vector; -// CraftBukkit end - -public class PortalTravelAgent { - - private final WorldServer a; - private final Random b; - private final LongHashMap c = new LongHashMap(); - private final List d = new ArrayList(); - - public PortalTravelAgent(WorldServer worldserver) { - this.a = worldserver; - this.b = new Random(worldserver.getSeed()); - } - - public void a(Entity entity, double d0, double d1, double d2, float f) { - if (this.a.worldProvider.dimension != 1) { - if (!this.b(entity, d0, d1, d2, f)) { - this.a(entity); - this.b(entity, d0, d1, d2, f); - } - } else { - // CraftBukkit start - Modularize end portal creation - ChunkCoordinates created = this.createEndPortal(d0, d1, d2); - entity.setPositionRotation((double) created.x, (double) created.y, (double) created.z, entity.yaw, 0.0F); - entity.motX = entity.motY = entity.motZ = 0.0D; - } - } - - // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal - private ChunkCoordinates createEndPortal(double x, double y, double z) { - int i = MathHelper.floor(x); - int j = MathHelper.floor(y) - 1; - int k = MathHelper.floor(z); - // CraftBukkit end - byte b0 = 1; - byte b1 = 0; - - for (int l = -2; l <= 2; ++l) { - for (int i1 = -2; i1 <= 2; ++i1) { - for (int j1 = -1; j1 < 3; ++j1) { - int k1 = i + i1 * b0 + l * b1; - int l1 = j + j1; - int i2 = k + i1 * b1 - l * b0; - boolean flag = j1 < 0; - - this.a.setTypeUpdate(k1, l1, i2, flag ? Blocks.OBSIDIAN : Blocks.AIR); - } - } - } - - // CraftBukkit start - return new ChunkCoordinates(i, j, k); - } - - // use logic based on creation to verify end portal - private ChunkCoordinates findEndPortal(ChunkCoordinates portal) { - int i = portal.x; - int j = portal.y - 1; - int k = portal.z; - byte b0 = 1; - byte b1 = 0; - - for (int l = -2; l <= 2; ++l) { - for (int i1 = -2; i1 <= 2; ++i1) { - for (int j1 = -1; j1 < 3; ++j1) { - int k1 = i + i1 * b0 + l * b1; - int l1 = j + j1; - int i2 = k + i1 * b1 - l * b0; - boolean flag = j1 < 0; - - if (this.a.getType(k1, l1, i2) != (flag ? Blocks.OBSIDIAN : Blocks.AIR)) { - return null; - } - } - } - } - return new ChunkCoordinates(i, j, k); - } - // CraftBukkit end - - public boolean b(Entity entity, double d0, double d1, double d2, float f) { - // CraftBukkit start - Modularize portal search process and entity teleportation - ChunkCoordinates found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128); - if (found == null) { - return false; - } - - Location exit = new Location(this.a.getWorld(), found.x, found.y, found.z, f, entity.pitch); - Vector velocity = entity.getBukkitEntity().getVelocity(); - this.adjustExit(entity, exit, velocity); - entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch()); - if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) { - entity.getBukkitEntity().setVelocity(velocity); - } - return true; - } - - public ChunkCoordinates findPortal(double x, double y, double z, int short1) { - if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { - return this.findEndPortal(this.a.worldProvider.h()); - } - // CraftBukkit end - double d3 = -1.0D; - int i = 0; - int j = 0; - int k = 0; - // CraftBukkit start - int l = MathHelper.floor(x); - int i1 = MathHelper.floor(z); - // CraftBukkit end - long j1 = ChunkCoordIntPair.a(l, i1); - boolean flag = true; - double d4; - int k1; - - if (this.c.contains(j1)) { - ChunkCoordinatesPortal chunkcoordinatesportal = (ChunkCoordinatesPortal) this.c.getEntry(j1); - - d3 = 0.0D; - i = chunkcoordinatesportal.x; - j = chunkcoordinatesportal.y; - k = chunkcoordinatesportal.z; - chunkcoordinatesportal.d = this.a.getTime(); - flag = false; - } else { - for (k1 = l - short1; k1 <= l + short1; ++k1) { - double d5 = (double) k1 + 0.5D - x; // CraftBukkit - - for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) { - double d6 = (double) l1 + 0.5D - z; // CraftBukkit - - for (int i2 = this.a.S() - 1; i2 >= 0; --i2) { - if (this.a.getType(k1, i2, l1) == Blocks.PORTAL) { - while (this.a.getType(k1, i2 - 1, l1) == Blocks.PORTAL) { - --i2; - } - - d4 = (double) i2 + 0.5D - y; // CraftBukkit - double d7 = d5 * d5 + d4 * d4 + d6 * d6; - - if (d3 < 0.0D || d7 < d3) { - d3 = d7; - i = k1; - j = i2; - k = l1; - } - } - } - } - } - } - - if (d3 >= 0.0D) { - if (flag) { - this.c.put(j1, new ChunkCoordinatesPortal(this, i, j, k, this.a.getTime())); - this.d.add(Long.valueOf(j1)); - } - // CraftBukkit start - Moved entity teleportation logic into exit - return new ChunkCoordinates(i, j, k); - } else { - return null; - } - } - // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method - public void adjustExit(Entity entity, Location position, Vector velocity) { - Location from = position.clone(); - Vector before = velocity.clone(); - int i = position.getBlockX(); - int j = position.getBlockY(); - int k = position.getBlockZ(); - float f = position.getYaw(); - - if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { - // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F); - // entity.motX = entity.motY = entity.motZ = 0.0D; - position.setPitch(0.0F); - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); - } else { - double d4; - int k1; - // CraftBukkit end - - double d8 = (double) i + 0.5D; - double d9 = (double) j + 0.5D; - - d4 = (double) k + 0.5D; - int j2 = -1; - - if (this.a.getType(i - 1, j, k) == Blocks.PORTAL) { - j2 = 2; - } - - if (this.a.getType(i + 1, j, k) == Blocks.PORTAL) { - j2 = 0; - } - - if (this.a.getType(i, j, k - 1) == Blocks.PORTAL) { - j2 = 3; - } - - if (this.a.getType(i, j, k + 1) == Blocks.PORTAL) { - j2 = 1; - } - - int k2 = entity.ay(); - - if (j2 > -1) { - int l2 = Direction.h[j2]; - int i3 = Direction.a[j2]; - int j3 = Direction.b[j2]; - int k3 = Direction.a[l2]; - int l3 = Direction.b[l2]; - boolean flag1 = !this.a.isEmpty(i + i3 + k3, j, k + j3 + l3) || !this.a.isEmpty(i + i3 + k3, j + 1, k + j3 + l3); - boolean flag2 = !this.a.isEmpty(i + i3, j, k + j3) || !this.a.isEmpty(i + i3, j + 1, k + j3); - - if (flag1 && flag2) { - j2 = Direction.f[j2]; - l2 = Direction.f[l2]; - i3 = Direction.a[j2]; - j3 = Direction.b[j2]; - k3 = Direction.a[l2]; - l3 = Direction.b[l2]; - k1 = i - k3; - d8 -= (double) k3; - int i4 = k - l3; - - d4 -= (double) l3; - flag1 = !this.a.isEmpty(k1 + i3 + k3, j, i4 + j3 + l3) || !this.a.isEmpty(k1 + i3 + k3, j + 1, i4 + j3 + l3); - flag2 = !this.a.isEmpty(k1 + i3, j, i4 + j3) || !this.a.isEmpty(k1 + i3, j + 1, i4 + j3); - } - - float f1 = 0.5F; - float f2 = 0.5F; - - if (!flag1 && flag2) { - f1 = 1.0F; - } else if (flag1 && !flag2) { - f1 = 0.0F; - } else if (flag1 && flag2) { - f2 = 0.0F; - } - - d8 += (double) ((float) k3 * f1 + f2 * (float) i3); - d4 += (double) ((float) l3 * f1 + f2 * (float) j3); - float f3 = 0.0F; - float f4 = 0.0F; - float f5 = 0.0F; - float f6 = 0.0F; - - if (j2 == k2) { - f3 = 1.0F; - f4 = 1.0F; - } else if (j2 == Direction.f[k2]) { - f3 = -1.0F; - f4 = -1.0F; - } else if (j2 == Direction.g[k2]) { - f5 = 1.0F; - f6 = -1.0F; - } else { - f5 = -1.0F; - f6 = 1.0F; - } - - // CraftBukkit start - double d10 = velocity.getX(); - double d11 = velocity.getZ(); - // CraftBukkit end - - // CraftBukkit start - Adjust position and velocity instances instead of entity - velocity.setX(d10 * (double) f3 + d11 * (double) f6); - velocity.setZ(d10 * (double) f5 + d11 * (double) f4); - f = f - (float) (k2 * 90) + (float) (j2 * 90); - } else { - // entity.motX = entity.motY = entity.motZ = 0.0D; - velocity.setX(0); - velocity.setY(0); - velocity.setZ(0); - } - - // entity.setPositionRotation(d8, d9, d4, entity.yaw, entity.pitch); - position.setX(d8); - position.setY(d9); - position.setZ(d4); - position.setYaw(f); - } - - EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity); - this.a.getServer().getPluginManager().callEvent(event); - Location to = event.getTo(); - if (event.isCancelled() || to == null || !entity.isAlive()) { - position.setX(from.getX()); - position.setY(from.getY()); - position.setZ(from.getZ()); - position.setYaw(from.getYaw()); - position.setPitch(from.getPitch()); - velocity.copy(before); - } else { - position.setX(to.getX()); - position.setY(to.getY()); - position.setZ(to.getZ()); - position.setYaw(to.getYaw()); - position.setPitch(to.getPitch()); - velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in - } - // CraftBukkit end - } - - public boolean a(Entity entity) { - // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity - return this.createPortal(entity.locX, entity.locY, entity.locZ, 16); - } - - public boolean createPortal(double x, double y, double z, int b0) { - if (this.a.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) { - this.createEndPortal(x, y, z); - return true; - } - // CraftBukkit end - double d0 = -1.0D; - // CraftBukkit start - int i = MathHelper.floor(x); - int j = MathHelper.floor(y); - int k = MathHelper.floor(z); - // CraftBukkit end - int l = i; - int i1 = j; - int j1 = k; - int k1 = 0; - int l1 = this.b.nextInt(4); - - int i2; - double d1; - double d2; - int j2; - int k2; - int l2; - int i3; - int j3; - int k3; - int l3; - int i4; - int j4; - int k4; - double d3; - double d4; - - for (i2 = i - b0; i2 <= i + b0; ++i2) { - d1 = (double) i2 + 0.5D - x; // CraftBukkit - - for (j2 = k - b0; j2 <= k + b0; ++j2) { - d2 = (double) j2 + 0.5D - z; // CraftBukkit - - label274: - for (k2 = this.a.S() - 1; k2 >= 0; --k2) { - if (this.a.isEmpty(i2, k2, j2)) { - while (k2 > 0 && this.a.isEmpty(i2, k2 - 1, j2)) { - --k2; - } - - for (i3 = l1; i3 < l1 + 4; ++i3) { - l2 = i3 % 2; - k3 = 1 - l2; - if (i3 % 4 >= 2) { - l2 = -l2; - k3 = -k3; - } - - for (j3 = 0; j3 < 3; ++j3) { - for (i4 = 0; i4 < 4; ++i4) { - for (l3 = -1; l3 < 4; ++l3) { - k4 = i2 + (i4 - 1) * l2 + j3 * k3; - j4 = k2 + l3; - int l4 = j2 + (i4 - 1) * k3 - j3 * l2; - - if (l3 < 0 && !this.a.getType(k4, j4, l4).getMaterial().isBuildable() || l3 >= 0 && !this.a.isEmpty(k4, j4, l4)) { - continue label274; - } - } - } - } - - d3 = (double) k2 + 0.5D - y; // CraftBukkit - d4 = d1 * d1 + d3 * d3 + d2 * d2; - if (d0 < 0.0D || d4 < d0) { - d0 = d4; - l = i2; - i1 = k2; - j1 = j2; - k1 = i3 % 4; - } - } - } - } - } - } - - if (d0 < 0.0D) { - for (i2 = i - b0; i2 <= i + b0; ++i2) { - d1 = (double) i2 + 0.5D - x; // CraftBukkit - - for (j2 = k - b0; j2 <= k + b0; ++j2) { - d2 = (double) j2 + 0.5D - z; // CraftBukkit - - label222: - for (k2 = this.a.S() - 1; k2 >= 0; --k2) { - if (this.a.isEmpty(i2, k2, j2)) { - while (k2 > 0 && this.a.isEmpty(i2, k2 - 1, j2)) { - --k2; - } - - for (i3 = l1; i3 < l1 + 2; ++i3) { - l2 = i3 % 2; - k3 = 1 - l2; - - for (j3 = 0; j3 < 4; ++j3) { - for (i4 = -1; i4 < 4; ++i4) { - l3 = i2 + (j3 - 1) * l2; - k4 = k2 + i4; - j4 = j2 + (j3 - 1) * k3; - if (i4 < 0 && !this.a.getType(l3, k4, j4).getMaterial().isBuildable() || i4 >= 0 && !this.a.isEmpty(l3, k4, j4)) { - continue label222; - } - } - } - - d3 = (double) k2 + 0.5D - y; // CraftBukkit - d4 = d1 * d1 + d3 * d3 + d2 * d2; - if (d0 < 0.0D || d4 < d0) { - d0 = d4; - l = i2; - i1 = k2; - j1 = j2; - k1 = i3 % 2; - } - } - } - } - } - } - } - - int i5 = l; - int j5 = i1; - - j2 = j1; - int k5 = k1 % 2; - int l5 = 1 - k5; - - if (k1 % 4 >= 2) { - k5 = -k5; - l5 = -l5; - } - - boolean flag; - - if (d0 < 0.0D) { - if (i1 < 70) { - i1 = 70; - } - - if (i1 > this.a.S() - 10) { - i1 = this.a.S() - 10; - } - - j5 = i1; - - for (k2 = -1; k2 <= 1; ++k2) { - for (i3 = 1; i3 < 3; ++i3) { - for (l2 = -1; l2 < 3; ++l2) { - k3 = i5 + (i3 - 1) * k5 + k2 * l5; - j3 = j5 + l2; - i4 = j2 + (i3 - 1) * l5 - k2 * k5; - flag = l2 < 0; - this.a.setTypeUpdate(k3, j3, i4, flag ? Blocks.OBSIDIAN : Blocks.AIR); - } - } - } - } - - for (k2 = 0; k2 < 4; ++k2) { - for (i3 = 0; i3 < 4; ++i3) { - for (l2 = -1; l2 < 4; ++l2) { - k3 = i5 + (i3 - 1) * k5; - j3 = j5 + l2; - i4 = j2 + (i3 - 1) * l5; - flag = i3 == 0 || i3 == 3 || l2 == -1 || l2 == 3; - this.a.setTypeAndData(k3, j3, i4, flag ? Blocks.OBSIDIAN : Blocks.PORTAL, 0, 2); - } - } - - for (i3 = 0; i3 < 4; ++i3) { - for (l2 = -1; l2 < 4; ++l2) { - k3 = i5 + (i3 - 1) * k5; - j3 = j5 + l2; - i4 = j2 + (i3 - 1) * l5; - this.a.applyPhysics(k3, j3, i4, this.a.getType(k3, j3, i4)); - } - } - } - - return true; - } - - public void a(long i) { - if (i % 100L == 0L) { - Iterator iterator = this.d.iterator(); - long j = i - 600L; - - while (iterator.hasNext()) { - Long olong = (Long) iterator.next(); - ChunkCoordinatesPortal chunkcoordinatesportal = (ChunkCoordinatesPortal) this.c.getEntry(olong.longValue()); - - if (chunkcoordinatesportal == null || chunkcoordinatesportal.d < j) { - iterator.remove(); - this.c.remove(olong.longValue()); - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/PropertyManager.java b/src/main/java/net/minecraft/server/PropertyManager.java deleted file mode 100644 index c6cd6fb6..00000000 --- a/src/main/java/net/minecraft/server/PropertyManager.java +++ /dev/null @@ -1,130 +0,0 @@ -package net.minecraft.server; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Properties; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import joptsimple.OptionSet; // CraftBukkit - -public class PropertyManager { - - private static final Logger loggingAgent = LogManager.getLogger(); - public final Properties properties = new Properties(); // CraftBukkit - private -> public - private final File c; - - public PropertyManager(File file1) { - this.c = file1; - if (file1.exists()) { - FileInputStream fileinputstream = null; - - try { - fileinputstream = new FileInputStream(file1); - this.properties.load(fileinputstream); - } catch (Exception exception) { - loggingAgent.warn("Failed to load " + file1, exception); - this.a(); - } finally { - if (fileinputstream != null) { - try { - fileinputstream.close(); - } catch (IOException ioexception) { - ; - } - } - } - } else { - loggingAgent.warn(file1 + " does not exist"); - this.a(); - } - } - - // CraftBukkit start - private OptionSet options = null; - - public PropertyManager(final OptionSet options) { - this((File) options.valueOf("config")); - - this.options = options; - } - - private <T> T getOverride(String name, T value) { - if ((this.options != null) && (this.options.has(name))) { - return (T) this.options.valueOf(name); - } - - return value; - } - // CraftBukkit end - - public void a() { - loggingAgent.info("Generating new properties file"); - this.savePropertiesFile(); - } - - public void savePropertiesFile() { - FileOutputStream fileoutputstream = null; - - try { - // CraftBukkit start - Don't attempt writing to file if it's read only - if (this.c.exists() && !this.c.canWrite()) { - return; - } - // CraftBukkit end - fileoutputstream = new FileOutputStream(this.c); - this.properties.store(fileoutputstream, "Minecraft server properties"); - } catch (Exception exception) { - loggingAgent.warn("Failed to save " + this.c, exception); - this.a(); - } finally { - if (fileoutputstream != null) { - try { - fileoutputstream.close(); - } catch (IOException ioexception) { - ; - } - } - } - } - - public File c() { - return this.c; - } - - public String getString(String s, String s1) { - if (!this.properties.containsKey(s)) { - this.properties.setProperty(s, s1); - this.savePropertiesFile(); - this.savePropertiesFile(); - } - - return this.getOverride(s, this.properties.getProperty(s, s1)); // CraftBukkit - } - - public int getInt(String s, int i) { - try { - return this.getOverride(s, Integer.parseInt(this.getString(s, "" + i))); // CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + i); - this.savePropertiesFile(); - return this.getOverride(s, i); // CraftBukkit - } - } - - public boolean getBoolean(String s, boolean flag) { - try { - return this.getOverride(s, Boolean.parseBoolean(this.getString(s, "" + flag))); // CraftBukkit - } catch (Exception exception) { - this.properties.setProperty(s, "" + flag); - this.savePropertiesFile(); - return this.getOverride(s, flag); // CraftBukkit - } - } - - public void setProperty(String s, Object object) { - this.properties.setProperty(s, "" + object); - } -} diff --git a/src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java b/src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java deleted file mode 100644 index d6e7f362..00000000 --- a/src/main/java/net/minecraft/server/ProtocolOrdinalWrapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - import package private class -class ProtocolOrdinalWrapper { - - static final int[] a = new int[EnumProtocol.values().length]; - - static { - try { - a[EnumProtocol.LOGIN.ordinal()] = 1; - } catch (NoSuchFieldError nosuchfielderror) { - ; - } - - try { - a[EnumProtocol.STATUS.ordinal()] = 2; - } catch (NoSuchFieldError nosuchfielderror1) { - ; - } - } -} diff --git a/src/main/java/net/minecraft/server/QueuedPacket.java b/src/main/java/net/minecraft/server/QueuedPacket.java deleted file mode 100644 index fdebf9dd..00000000 --- a/src/main/java/net/minecraft/server/QueuedPacket.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minecraft.server; - -import net.minecraft.util.io.netty.util.concurrent.GenericFutureListener; - -// CraftBukkit - imported class because the methods are package private -class QueuedPacket { - - private final Packet a; - private final GenericFutureListener[] b; - - public QueuedPacket(Packet packet, GenericFutureListener... agenericfuturelistener) { - this.a = packet; - this.b = agenericfuturelistener; - } - - static Packet a(QueuedPacket queuedpacket) { - return queuedpacket.a; - } - - static GenericFutureListener[] b(QueuedPacket queuedpacket) { - return queuedpacket.b; - } -} diff --git a/src/main/java/net/minecraft/server/RecipeArmorDye.java b/src/main/java/net/minecraft/server/RecipeArmorDye.java deleted file mode 100644 index 13bb7082..00000000 --- a/src/main/java/net/minecraft/server/RecipeArmorDye.java +++ /dev/null @@ -1,124 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -public class RecipeArmorDye extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - // CraftBukkit start - Delegate to new parent class with bogus info - public RecipeArmorDye() { - super(new ItemStack(Items.LEATHER_HELMET, 0, 0), java.util.Arrays.asList(new ItemStack(Items.INK_SACK, 0, 5))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ItemStack itemstack = null; - ArrayList arraylist = new ArrayList(); - - for (int i = 0; i < inventorycrafting.getSize(); ++i) { - ItemStack itemstack1 = inventorycrafting.getItem(i); - - if (itemstack1 != null) { - if (itemstack1.getItem() instanceof ItemArmor) { - ItemArmor itemarmor = (ItemArmor) itemstack1.getItem(); - - if (itemarmor.m_() != EnumArmorMaterial.CLOTH || itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.INK_SACK) { - return false; - } - - arraylist.add(itemstack1); - } - } - } - - return itemstack != null && !arraylist.isEmpty(); - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - ItemStack itemstack = null; - int[] aint = new int[3]; - int i = 0; - int j = 0; - ItemArmor itemarmor = null; - - int k; - int l; - float f; - float f1; - int i1; - - for (k = 0; k < inventorycrafting.getSize(); ++k) { - ItemStack itemstack1 = inventorycrafting.getItem(k); - - if (itemstack1 != null) { - if (itemstack1.getItem() instanceof ItemArmor) { - itemarmor = (ItemArmor) itemstack1.getItem(); - if (itemarmor.m_() != EnumArmorMaterial.CLOTH || itemstack != null) { - return null; - } - - itemstack = itemstack1.cloneItemStack(); - itemstack.count = 1; - if (itemarmor.c_(itemstack1)) { - l = itemarmor.b(itemstack); - f = (float) (l >> 16 & 255) / 255.0F; - f1 = (float) (l >> 8 & 255) / 255.0F; - float f2 = (float) (l & 255) / 255.0F; - - i = (int) ((float) i + Math.max(f, Math.max(f1, f2)) * 255.0F); - aint[0] = (int) ((float) aint[0] + f * 255.0F); - aint[1] = (int) ((float) aint[1] + f1 * 255.0F); - aint[2] = (int) ((float) aint[2] + f2 * 255.0F); - ++j; - } - } else { - if (itemstack1.getItem() != Items.INK_SACK) { - return null; - } - - float[] afloat = EntitySheep.bp[BlockCloth.b(itemstack1.getData())]; - int j1 = (int) (afloat[0] * 255.0F); - int k1 = (int) (afloat[1] * 255.0F); - - i1 = (int) (afloat[2] * 255.0F); - i += Math.max(j1, Math.max(k1, i1)); - aint[0] += j1; - aint[1] += k1; - aint[2] += i1; - ++j; - } - } - } - - if (itemarmor == null) { - return null; - } else { - k = aint[0] / j; - int l1 = aint[1] / j; - - l = aint[2] / j; - f = (float) i / (float) j; - f1 = (float) Math.max(k, Math.max(l1, l)); - k = (int) ((float) k * f / f1); - l1 = (int) ((float) l1 * f / f1); - l = (int) ((float) l * f / f1); - i1 = (k << 8) + l1; - i1 = (i1 << 8) + l; - itemarmor.b(itemstack, i1); - return itemstack; - } - } - - public int a() { - return 10; - } - - public ItemStack b() { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/RecipeBookClone.java b/src/main/java/net/minecraft/server/RecipeBookClone.java deleted file mode 100644 index 8182a5fd..00000000 --- a/src/main/java/net/minecraft/server/RecipeBookClone.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -public class RecipeBookClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - // CraftBukkit start - Delegate to new parent class - public RecipeBookClone() { - super(new ItemStack(Items.WRITTEN_BOOK, 0, -1), java.util.Arrays.asList(new ItemStack(Items.BOOK_AND_QUILL, 0, 0))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventoryCrafting, World paramWorld) { - int i = 0; - ItemStack itemStack = null; - for (int j = 0; j < inventoryCrafting.getSize(); j++) { - ItemStack itemStack1 = inventoryCrafting.getItem(j); - if (itemStack1 != null) { - if (itemStack1.getItem() == Items.WRITTEN_BOOK) { - if (itemStack != null) { - return false; - } - itemStack = itemStack1; - } else if (itemStack1.getItem() == Items.BOOK_AND_QUILL) { - i++; - } else { - return false; - } - } - } - return (itemStack != null) && (i > 0); - } - - public ItemStack a(InventoryCrafting inventoryCrafting) { - int i = 0; - ItemStack itemStack = null; - for (int j = 0; j < inventoryCrafting.getSize(); j++) { - ItemStack itemStack2 = inventoryCrafting.getItem(j); - if (itemStack2 != null) { - if (itemStack2.getItem() == Items.WRITTEN_BOOK) { - if (itemStack != null) { - return null; - } - itemStack = itemStack2; - } else if (itemStack2.getItem() == Items.BOOK_AND_QUILL) { - i++; - } else { - return null; - } - } - } - if ((itemStack == null) || (i < 1)) { - return null; - } - ItemStack itemStack1 = new ItemStack(Items.WRITTEN_BOOK, i + 1); - itemStack1.setTag((NBTTagCompound) itemStack.getTag().clone()); - if (itemStack.hasName()) { - itemStack1.c(itemStack.getName()); - } - return itemStack1; - } - - public int a() { - return 9; - } - - public ItemStack b() { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/RecipeFireworks.java b/src/main/java/net/minecraft/server/RecipeFireworks.java deleted file mode 100644 index 816df8c1..00000000 --- a/src/main/java/net/minecraft/server/RecipeFireworks.java +++ /dev/null @@ -1,176 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; - -public class RecipeFireworks extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - private ItemStack a; - - // CraftBukkit start - Delegate to new parent class with bogus info - public RecipeFireworks() { - super(new ItemStack(Items.FIREWORKS, 0, 0), java.util.Arrays.asList(new ItemStack(Items.SULPHUR, 0, 5))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - this.a = null; - int i = 0; - int j = 0; - int k = 0; - int l = 0; - int i1 = 0; - int j1 = 0; - - for (int k1 = 0; k1 < inventorycrafting.getSize(); ++k1) { - ItemStack itemstack = inventorycrafting.getItem(k1); - - if (itemstack != null) { - if (itemstack.getItem() == Items.SULPHUR) { - ++j; - } else if (itemstack.getItem() == Items.FIREWORKS_CHARGE) { - ++l; - } else if (itemstack.getItem() == Items.INK_SACK) { - ++k; - } else if (itemstack.getItem() == Items.PAPER) { - ++i; - } else if (itemstack.getItem() == Items.GLOWSTONE_DUST) { - ++i1; - } else if (itemstack.getItem() == Items.DIAMOND) { - ++i1; - } else if (itemstack.getItem() == Items.FIREBALL) { - ++j1; - } else if (itemstack.getItem() == Items.FEATHER) { - ++j1; - } else if (itemstack.getItem() == Items.GOLD_NUGGET) { - ++j1; - } else { - if (itemstack.getItem() != Items.SKULL) { - return false; - } - - ++j1; - } - } - } - - i1 += k + j1; - if (j <= 3 && i <= 1) { - NBTTagCompound nbttagcompound; - NBTTagCompound nbttagcompound1; - - if (j >= 1 && i == 1 && i1 == 0) { - this.a = new ItemStack(Items.FIREWORKS); - if (l > 0) { - nbttagcompound = new NBTTagCompound(); - nbttagcompound1 = new NBTTagCompound(); - NBTTagList nbttaglist = new NBTTagList(); - - for (int l1 = 0; l1 < inventorycrafting.getSize(); ++l1) { - ItemStack itemstack1 = inventorycrafting.getItem(l1); - - if (itemstack1 != null && itemstack1.getItem() == Items.FIREWORKS_CHARGE && itemstack1.hasTag() && itemstack1.getTag().hasKeyOfType("Explosion", 10)) { - nbttaglist.add(itemstack1.getTag().getCompound("Explosion")); - } - } - - nbttagcompound1.set("Explosions", nbttaglist); - nbttagcompound1.setByte("Flight", (byte) j); - nbttagcompound.set("Fireworks", nbttagcompound1); - this.a.setTag(nbttagcompound); - } - - return true; - } else if (j == 1 && i == 0 && l == 0 && k > 0 && j1 <= 1) { - this.a = new ItemStack(Items.FIREWORKS_CHARGE); - nbttagcompound = new NBTTagCompound(); - nbttagcompound1 = new NBTTagCompound(); - byte b0 = 0; - ArrayList arraylist = new ArrayList(); - - for (int i2 = 0; i2 < inventorycrafting.getSize(); ++i2) { - ItemStack itemstack2 = inventorycrafting.getItem(i2); - - if (itemstack2 != null) { - if (itemstack2.getItem() == Items.INK_SACK) { - arraylist.add(Integer.valueOf(ItemDye.c[itemstack2.getData()])); - } else if (itemstack2.getItem() == Items.GLOWSTONE_DUST) { - nbttagcompound1.setBoolean("Flicker", true); - } else if (itemstack2.getItem() == Items.DIAMOND) { - nbttagcompound1.setBoolean("Trail", true); - } else if (itemstack2.getItem() == Items.FIREBALL) { - b0 = 1; - } else if (itemstack2.getItem() == Items.FEATHER) { - b0 = 4; - } else if (itemstack2.getItem() == Items.GOLD_NUGGET) { - b0 = 2; - } else if (itemstack2.getItem() == Items.SKULL) { - b0 = 3; - } - } - } - - int[] aint = new int[arraylist.size()]; - - for (int j2 = 0; j2 < aint.length; ++j2) { - aint[j2] = ((Integer) arraylist.get(j2)).intValue(); - } - - nbttagcompound1.setIntArray("Colors", aint); - nbttagcompound1.setByte("Type", b0); - nbttagcompound.set("Explosion", nbttagcompound1); - this.a.setTag(nbttagcompound); - return true; - } else if (j == 0 && i == 0 && l == 1 && k > 0 && k == i1) { - ArrayList arraylist1 = new ArrayList(); - - for (int k2 = 0; k2 < inventorycrafting.getSize(); ++k2) { - ItemStack itemstack3 = inventorycrafting.getItem(k2); - - if (itemstack3 != null) { - if (itemstack3.getItem() == Items.INK_SACK) { - arraylist1.add(Integer.valueOf(ItemDye.c[itemstack3.getData()])); - } else if (itemstack3.getItem() == Items.FIREWORKS_CHARGE) { - this.a = itemstack3.cloneItemStack(); - this.a.count = 1; - } - } - } - - int[] aint1 = new int[arraylist1.size()]; - - for (int l2 = 0; l2 < aint1.length; ++l2) { - aint1[l2] = ((Integer) arraylist1.get(l2)).intValue(); - } - - if (this.a != null && this.a.hasTag()) { - NBTTagCompound nbttagcompound2 = this.a.getTag().getCompound("Explosion"); - - if (nbttagcompound2 == null) { - return false; - } else { - nbttagcompound2.setIntArray("FadeColors", aint1); - return true; - } - } else { - return false; - } - } else { - return false; - } - } else { - return false; - } - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - return this.a.cloneItemStack(); - } - - public int a() { - return 10; - } - - public ItemStack b() { - return this.a; - } -} diff --git a/src/main/java/net/minecraft/server/RecipeMapClone.java b/src/main/java/net/minecraft/server/RecipeMapClone.java deleted file mode 100644 index 793883fe..00000000 --- a/src/main/java/net/minecraft/server/RecipeMapClone.java +++ /dev/null @@ -1,82 +0,0 @@ -package net.minecraft.server; - -public class RecipeMapClone extends ShapelessRecipes implements IRecipe { // CraftBukkit - added extends - - // CraftBukkit start - Delegate to new parent class - public RecipeMapClone() { - super(new ItemStack(Items.MAP, 0, -1), java.util.Arrays.asList(new ItemStack(Items.MAP_EMPTY, 0, 0))); - } - // CraftBukkit end - - public boolean a(InventoryCrafting inventorycrafting, World world) { - int i = 0; - ItemStack itemstack = null; - - for (int j = 0; j < inventorycrafting.getSize(); ++j) { - ItemStack itemstack1 = inventorycrafting.getItem(j); - - if (itemstack1 != null) { - if (itemstack1.getItem() == Items.MAP) { - if (itemstack != null) { - return false; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.MAP_EMPTY) { - return false; - } - - ++i; - } - } - } - - return itemstack != null && i > 0; - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - int i = 0; - ItemStack itemstack = null; - - for (int j = 0; j < inventorycrafting.getSize(); ++j) { - ItemStack itemstack1 = inventorycrafting.getItem(j); - - if (itemstack1 != null) { - if (itemstack1.getItem() == Items.MAP) { - if (itemstack != null) { - return null; - } - - itemstack = itemstack1; - } else { - if (itemstack1.getItem() != Items.MAP_EMPTY) { - return null; - } - - ++i; - } - } - } - - if (itemstack != null && i >= 1) { - ItemStack itemstack2 = new ItemStack(Items.MAP, i + 1, itemstack.getData()); - - if (itemstack.hasName()) { - itemstack2.c(itemstack.getName()); - } - - return itemstack2; - } else { - return null; - } - } - - public int a() { - return 9; - } - - public ItemStack b() { - return null; - } -} diff --git a/src/main/java/net/minecraft/server/RecipesFurnace.java b/src/main/java/net/minecraft/server/RecipesFurnace.java deleted file mode 100644 index c474d548..00000000 --- a/src/main/java/net/minecraft/server/RecipesFurnace.java +++ /dev/null @@ -1,121 +0,0 @@ -package net.minecraft.server; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Map.Entry; - -public class RecipesFurnace { - - private static final RecipesFurnace a = new RecipesFurnace(); - public Map recipes = new HashMap(); // CraftBukkit - private -> public - private Map c = new HashMap(); - public Map customRecipes = new HashMap(); // CraftBukkit - add field - - public static RecipesFurnace getInstance() { - return a; - } - - public RecipesFurnace() { // CraftBukkit - private -> public - this.registerRecipe(Blocks.IRON_ORE, new ItemStack(Items.IRON_INGOT), 0.7F); - this.registerRecipe(Blocks.GOLD_ORE, new ItemStack(Items.GOLD_INGOT), 1.0F); - this.registerRecipe(Blocks.DIAMOND_ORE, new ItemStack(Items.DIAMOND), 1.0F); - this.registerRecipe(Blocks.SAND, new ItemStack(Blocks.GLASS), 0.1F); - this.a(Items.PORK, new ItemStack(Items.GRILLED_PORK), 0.35F); - this.a(Items.RAW_BEEF, new ItemStack(Items.COOKED_BEEF), 0.35F); - this.a(Items.RAW_CHICKEN, new ItemStack(Items.COOKED_CHICKEN), 0.35F); - this.registerRecipe(Blocks.COBBLESTONE, new ItemStack(Blocks.STONE), 0.1F); - this.a(Items.CLAY_BALL, new ItemStack(Items.CLAY_BRICK), 0.3F); - this.registerRecipe(Blocks.CLAY, new ItemStack(Blocks.HARDENED_CLAY), 0.35F); - this.registerRecipe(Blocks.CACTUS, new ItemStack(Items.INK_SACK, 1, 2), 0.2F); - this.registerRecipe(Blocks.LOG, new ItemStack(Items.COAL, 1, 1), 0.15F); - this.registerRecipe(Blocks.LOG2, new ItemStack(Items.COAL, 1, 1), 0.15F); - this.registerRecipe(Blocks.EMERALD_ORE, new ItemStack(Items.EMERALD), 1.0F); - this.a(Items.POTATO, new ItemStack(Items.POTATO_BAKED), 0.35F); - this.registerRecipe(Blocks.NETHERRACK, new ItemStack(Items.NETHER_BRICK), 0.1F); - EnumFish[] aenumfish = EnumFish.values(); - int i = aenumfish.length; - - for (int j = 0; j < i; ++j) { - EnumFish enumfish = aenumfish[j]; - - if (enumfish.i()) { - this.a(new ItemStack(Items.RAW_FISH, 1, enumfish.a()), new ItemStack(Items.COOKED_FISH, 1, enumfish.a()), 0.35F); - } - } - - this.registerRecipe(Blocks.COAL_ORE, new ItemStack(Items.COAL), 0.1F); - this.registerRecipe(Blocks.REDSTONE_ORE, new ItemStack(Items.REDSTONE), 0.7F); - this.registerRecipe(Blocks.LAPIS_ORE, new ItemStack(Items.INK_SACK, 1, 4), 0.2F); - this.registerRecipe(Blocks.QUARTZ_ORE, new ItemStack(Items.QUARTZ), 0.2F); - } - - public void registerRecipe(Block block, ItemStack itemstack, float f) { - this.a(Item.getItemOf(block), itemstack, f); - } - - public void a(Item item, ItemStack itemstack, float f) { - this.a(new ItemStack(item, 1, 32767), itemstack, f); - } - - public void a(ItemStack itemstack, ItemStack itemstack1, float f) { - this.recipes.put(itemstack, itemstack1); - this.c.put(itemstack1, Float.valueOf(f)); - } - - // CraftBukkit start - add method - public void registerRecipe(ItemStack itemstack, ItemStack itemstack1) { - this.customRecipes.put(itemstack, itemstack1); - } - // CraftBukkit end - - public ItemStack getResult(ItemStack itemstack) { - // CraftBukkit start - initialize to customRecipes - boolean vanilla = false; - Iterator iterator = this.customRecipes.entrySet().iterator(); - // CraftBukkit end - - Entry entry; - - do { - if (!iterator.hasNext()) { - // CraftBukkit start - fall back to vanilla recipes - if (!vanilla && recipes.size() != 0) { - iterator = this.recipes.entrySet().iterator(); - vanilla = true; - } else { - return null; - } - // CraftBukkit end - } - - entry = (Entry) iterator.next(); - } while (!this.a(itemstack, (ItemStack) entry.getKey())); - - return (ItemStack) entry.getValue(); - } - - private boolean a(ItemStack itemstack, ItemStack itemstack1) { - return itemstack1.getItem() == itemstack.getItem() && (itemstack1.getData() == 32767 || itemstack1.getData() == itemstack.getData()); - } - - public Map getRecipes() { - return this.recipes; - } - - public float b(ItemStack itemstack) { - Iterator iterator = this.c.entrySet().iterator(); - - Entry entry; - - do { - if (!iterator.hasNext()) { - return 0.0F; - } - - entry = (Entry) iterator.next(); - } while (!this.a(itemstack, (ItemStack) entry.getKey())); - - return ((Float) entry.getValue()).floatValue(); - } -} diff --git a/src/main/java/net/minecraft/server/RegionFile.java b/src/main/java/net/minecraft/server/RegionFile.java deleted file mode 100644 index 9cd34a44..00000000 --- a/src/main/java/net/minecraft/server/RegionFile.java +++ /dev/null @@ -1,289 +0,0 @@ -package net.minecraft.server; - -import java.io.BufferedInputStream; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.RandomAccessFile; -import java.util.ArrayList; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.GZIPInputStream; -import java.util.zip.InflaterInputStream; - -public class RegionFile { - - private static final byte[] a = new byte[4096]; - private final File b; - private RandomAccessFile c; - private final int[] d = new int[1024]; - private final int[] e = new int[1024]; - private ArrayList f; - private int g; - private long h; - - public RegionFile(File file1) { - this.b = file1; - this.g = 0; - - try { - if (file1.exists()) { - this.h = file1.lastModified(); - } - - this.c = new RandomAccessFile(file1, "rw"); - int i; - - if (this.c.length() < 4096L) { - for (i = 0; i < 1024; ++i) { - this.c.writeInt(0); - } - - for (i = 0; i < 1024; ++i) { - this.c.writeInt(0); - } - - this.g += 8192; - } - - if ((this.c.length() & 4095L) != 0L) { - for (i = 0; (long) i < (this.c.length() & 4095L); ++i) { - this.c.write(0); - } - } - - i = (int) this.c.length() / 4096; - this.f = new ArrayList(i); - - int j; - - for (j = 0; j < i; ++j) { - this.f.add(Boolean.valueOf(true)); - } - - this.f.set(0, Boolean.valueOf(false)); - this.f.set(1, Boolean.valueOf(false)); - this.c.seek(0L); - - int k; - - for (j = 0; j < 1024; ++j) { - k = this.c.readInt(); - this.d[j] = k; - if (k != 0 && (k >> 8) + (k & 255) <= this.f.size()) { - for (int l = 0; l < (k & 255); ++l) { - this.f.set((k >> 8) + l, Boolean.valueOf(false)); - } - } - } - - for (j = 0; j < 1024; ++j) { - k = this.c.readInt(); - this.e[j] = k; - } - } catch (IOException ioexception) { - ioexception.printStackTrace(); - } - } - - // CraftBukkit start - This is a copy (sort of) of the method below it, make sure they stay in sync - public synchronized boolean chunkExists(int i, int j) { - if (this.d(i, j)) { - return false; - } else { - try { - int k = this.e(i, j); - - if (k == 0) { - return false; - } else { - int l = k >> 8; - int i1 = k & 255; - - if (l + i1 > this.f.size()) { - return false; - } - - this.c.seek((long) (l * 4096)); - int j1 = this.c.readInt(); - - if (j1 > 4096 * i1 || j1 <= 0) { - return false; - } - - byte b0 = this.c.readByte(); - if (b0 == 1 || b0 == 2) { - return true; - } - } - } catch (IOException ioexception) { - return false; - } - } - - return false; - } - // CraftBukkit end - - public synchronized DataInputStream a(int i, int j) { - if (this.d(i, j)) { - return null; - } else { - try { - int k = this.e(i, j); - - if (k == 0) { - return null; - } else { - int l = k >> 8; - int i1 = k & 255; - - if (l + i1 > this.f.size()) { - return null; - } else { - this.c.seek((long) (l * 4096)); - int j1 = this.c.readInt(); - - if (j1 > 4096 * i1) { - return null; - } else if (j1 <= 0) { - return null; - } else { - byte b0 = this.c.readByte(); - byte[] abyte; - - if (b0 == 1) { - abyte = new byte[j1 - 1]; - this.c.read(abyte); - return new DataInputStream(new BufferedInputStream(new GZIPInputStream(new ByteArrayInputStream(abyte)))); - } else if (b0 == 2) { - abyte = new byte[j1 - 1]; - this.c.read(abyte); - return new DataInputStream(new BufferedInputStream(new InflaterInputStream(new ByteArrayInputStream(abyte)))); - } else { - return null; - } - } - } - } - } catch (IOException ioexception) { - return null; - } - } - } - - public DataOutputStream b(int i, int j) { - return this.d(i, j) ? null : new DataOutputStream(new DeflaterOutputStream(new ChunkBuffer(this, i, j))); - } - - protected synchronized void a(int i, int j, byte[] abyte, int k) { - try { - int l = this.e(i, j); - int i1 = l >> 8; - int j1 = l & 255; - int k1 = (k + 5) / 4096 + 1; - - if (k1 >= 256) { - return; - } - - if (i1 != 0 && j1 == k1) { - this.a(i1, abyte, k); - } else { - int l1; - - for (l1 = 0; l1 < j1; ++l1) { - this.f.set(i1 + l1, Boolean.valueOf(true)); - } - - l1 = this.f.indexOf(Boolean.valueOf(true)); - int i2 = 0; - int j2; - - if (l1 != -1) { - for (j2 = l1; j2 < this.f.size(); ++j2) { - if (i2 != 0) { - if (((Boolean) this.f.get(j2)).booleanValue()) { - ++i2; - } else { - i2 = 0; - } - } else if (((Boolean) this.f.get(j2)).booleanValue()) { - l1 = j2; - i2 = 1; - } - - if (i2 >= k1) { - break; - } - } - } - - if (i2 >= k1) { - i1 = l1; - this.a(i, j, l1 << 8 | k1); - - for (j2 = 0; j2 < k1; ++j2) { - this.f.set(i1 + j2, Boolean.valueOf(false)); - } - - this.a(i1, abyte, k); - } else { - this.c.seek(this.c.length()); - i1 = this.f.size(); - - for (j2 = 0; j2 < k1; ++j2) { - this.c.write(a); - this.f.add(Boolean.valueOf(false)); - } - - this.g += 4096 * k1; - this.a(i1, abyte, k); - this.a(i, j, i1 << 8 | k1); - } - } - - this.b(i, j, (int) (MinecraftServer.ar() / 1000L)); - } catch (IOException ioexception) { - ioexception.printStackTrace(); - } - } - - private void a(int i, byte[] abyte, int j) throws IOException { // CraftBukkit - added throws - this.c.seek((long) (i * 4096)); - this.c.writeInt(j + 1); - this.c.writeByte(2); - this.c.write(abyte, 0, j); - } - - private boolean d(int i, int j) { - return i < 0 || i >= 32 || j < 0 || j >= 32; - } - - private int e(int i, int j) { - return this.d[i + j * 32]; - } - - public boolean c(int i, int j) { - return this.e(i, j) != 0; - } - - private void a(int i, int j, int k) throws IOException { // CraftBukkit - added throws - this.d[i + j * 32] = k; - this.c.seek((long) ((i + j * 32) * 4)); - this.c.writeInt(k); - } - - private void b(int i, int j, int k) throws IOException { // CraftBukkit - added throws - this.e[i + j * 32] = k; - this.c.seek((long) (4096 + (i + j * 32) * 4)); - this.c.writeInt(k); - } - - public void c() throws IOException { // CraftBukkit - added throws - if (this.c != null) { - this.c.close(); - } - } -} diff --git a/src/main/java/net/minecraft/server/RemoteControlCommandListener.java b/src/main/java/net/minecraft/server/RemoteControlCommandListener.java deleted file mode 100644 index fd967c12..00000000 --- a/src/main/java/net/minecraft/server/RemoteControlCommandListener.java +++ /dev/null @@ -1,47 +0,0 @@ -package net.minecraft.server; - -public class RemoteControlCommandListener implements ICommandListener { - - public static final RemoteControlCommandListener instance = new RemoteControlCommandListener(); - private StringBuffer b = new StringBuffer(); - - public RemoteControlCommandListener() {} - - public void e() { - this.b.setLength(0); - } - - public String f() { - return this.b.toString(); - } - - public String getName() { - return "Rcon"; - } - - public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(this.getName()); - } - - // CraftBukkit start - Send a String - public void sendMessage(String message) { - this.b.append(message); - } - // CraftBukkit end - - public void sendMessage(IChatBaseComponent ichatbasecomponent) { - this.b.append(ichatbasecomponent.c()); - } - - public boolean a(int i, String s) { - return true; - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(0, 0, 0); - } - - public World getWorld() { - return MinecraftServer.getServer().getWorld(); - } -} diff --git a/src/main/java/net/minecraft/server/ScoreboardServer.java b/src/main/java/net/minecraft/server/ScoreboardServer.java deleted file mode 100644 index 15910585..00000000 --- a/src/main/java/net/minecraft/server/ScoreboardServer.java +++ /dev/null @@ -1,222 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; - -public class ScoreboardServer extends Scoreboard { - - private final MinecraftServer a; - private final Set b = new HashSet(); - private PersistentScoreboard c; - - public ScoreboardServer(MinecraftServer minecraftserver) { - this.a = minecraftserver; - } - - public void handleScoreChanged(ScoreboardScore scoreboardscore) { - super.handleScoreChanged(scoreboardscore); - if (this.b.contains(scoreboardscore.getObjective())) { - this.sendAll(new PacketPlayOutScoreboardScore(scoreboardscore, 0)); // CraftBukkit - Internal packet method - } - - this.b(); - } - - public void handlePlayerRemoved(String s) { - super.handlePlayerRemoved(s); - this.sendAll(new PacketPlayOutScoreboardScore(s)); // CraftBukkit - Internal packet method - this.b(); - } - - public void setDisplaySlot(int i, ScoreboardObjective scoreboardobjective) { - ScoreboardObjective scoreboardobjective1 = this.getObjectiveForSlot(i); - - super.setDisplaySlot(i, scoreboardobjective); - if (scoreboardobjective1 != scoreboardobjective && scoreboardobjective1 != null) { - if (this.h(scoreboardobjective1) > 0) { - this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method - } else { - this.g(scoreboardobjective1); - } - } - - if (scoreboardobjective != null) { - if (this.b.contains(scoreboardobjective)) { - this.sendAll(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); // CraftBukkit - Internal packet method - } else { - this.e(scoreboardobjective); - } - } - - this.b(); - } - - public boolean addPlayerToTeam(String s, String s1) { - if (super.addPlayerToTeam(s, s1)) { - ScoreboardTeam scoreboardteam = this.getTeam(s1); - - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 3)); // CraftBukkit - Internal packet method - this.b(); - return true; - } else { - return false; - } - } - - public void removePlayerFromTeam(String s, ScoreboardTeam scoreboardteam) { - super.removePlayerFromTeam(s, scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, Arrays.asList(new String[] { s}), 4)); // CraftBukkit - Internal packet method - this.b(); - } - - public void handleObjectiveAdded(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveAdded(scoreboardobjective); - this.b(); - } - - public void handleObjectiveChanged(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveChanged(scoreboardobjective); - if (this.b.contains(scoreboardobjective)) { - this.sendAll(new PacketPlayOutScoreboardObjective(scoreboardobjective, 2)); // CraftBukkit - Internal packet method - } - - this.b(); - } - - public void handleObjectiveRemoved(ScoreboardObjective scoreboardobjective) { - super.handleObjectiveRemoved(scoreboardobjective); - if (this.b.contains(scoreboardobjective)) { - this.g(scoreboardobjective); - } - - this.b(); - } - - public void handleTeamAdded(ScoreboardTeam scoreboardteam) { - super.handleTeamAdded(scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 0)); // CraftBukkit - Internal packet method - this.b(); - } - - public void handleTeamChanged(ScoreboardTeam scoreboardteam) { - super.handleTeamChanged(scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 2)); // CraftBukkit - Internal packet method - this.b(); - } - - public void handleTeamRemoved(ScoreboardTeam scoreboardteam) { - super.handleTeamRemoved(scoreboardteam); - this.sendAll(new PacketPlayOutScoreboardTeam(scoreboardteam, 1)); // CraftBukkit - Internal packet method - this.b(); - } - - public void a(PersistentScoreboard persistentscoreboard) { - this.c = persistentscoreboard; - } - - protected void b() { - if (this.c != null) { - this.c.c(); - } - } - - public List getScoreboardScorePacketsForObjective(ScoreboardObjective scoreboardobjective) { - ArrayList arraylist = new ArrayList(); - - arraylist.add(new PacketPlayOutScoreboardObjective(scoreboardobjective, 0)); - - for (int i = 0; i < 3; ++i) { - if (this.getObjectiveForSlot(i) == scoreboardobjective) { - arraylist.add(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); - } - } - - Iterator iterator = this.getScoresForObjective(scoreboardobjective).iterator(); - - while (iterator.hasNext()) { - ScoreboardScore scoreboardscore = (ScoreboardScore) iterator.next(); - - arraylist.add(new PacketPlayOutScoreboardScore(scoreboardscore, 0)); - } - - return arraylist; - } - - public void e(ScoreboardObjective scoreboardobjective) { - List list = this.getScoreboardScorePacketsForObjective(scoreboardobjective); - Iterator iterator = this.a.getPlayerList().players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - Packet packet = (Packet) iterator1.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - } - - this.b.add(scoreboardobjective); - } - - public List f(ScoreboardObjective scoreboardobjective) { - ArrayList arraylist = new ArrayList(); - - arraylist.add(new PacketPlayOutScoreboardObjective(scoreboardobjective, 1)); - - for (int i = 0; i < 3; ++i) { - if (this.getObjectiveForSlot(i) == scoreboardobjective) { - arraylist.add(new PacketPlayOutScoreboardDisplayObjective(i, scoreboardobjective)); - } - } - - return arraylist; - } - - public void g(ScoreboardObjective scoreboardobjective) { - List list = this.f(scoreboardobjective); - Iterator iterator = this.a.getPlayerList().players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - if (entityplayer.getBukkitEntity().getScoreboard().getHandle() != this) continue; // CraftBukkit - Only players on this board - Iterator iterator1 = list.iterator(); - - while (iterator1.hasNext()) { - Packet packet = (Packet) iterator1.next(); - - entityplayer.playerConnection.sendPacket(packet); - } - } - - this.b.remove(scoreboardobjective); - } - - public int h(ScoreboardObjective scoreboardobjective) { - int i = 0; - - for (int j = 0; j < 3; ++j) { - if (this.getObjectiveForSlot(j) == scoreboardobjective) { - ++i; - } - } - - return i; - } - - // CraftBukkit start - Send to players - private void sendAll(Packet packet) { - for (EntityPlayer entityplayer : (List<EntityPlayer>) this.a.getPlayerList().players) { - if (entityplayer.getBukkitEntity().getScoreboard().getHandle() == this) { - entityplayer.playerConnection.sendPacket(packet); - } - } - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/SecondaryWorldServer.java b/src/main/java/net/minecraft/server/SecondaryWorldServer.java deleted file mode 100644 index 5236f81e..00000000 --- a/src/main/java/net/minecraft/server/SecondaryWorldServer.java +++ /dev/null @@ -1,14 +0,0 @@ -package net.minecraft.server; - -public class SecondaryWorldServer extends WorldServer { - // CraftBukkit start - Add Environment and ChunkGenerator arguments - public SecondaryWorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, String s, int i, WorldSettings worldsettings, WorldServer worldserver, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { - super(minecraftserver, idatamanager, s, i, worldsettings, methodprofiler, env, gen); - // CraftBukkit end - this.worldMaps = worldserver.worldMaps; - this.scoreboard = worldserver.getScoreboard(); - // this.worldData = new SecondaryWorldData(worldserver.getWorldData()); // CraftBukkit - use unique worlddata - } - - // protected void a() {} // CraftBukkit - save world data! -} diff --git a/src/main/java/net/minecraft/server/ShapedRecipes.java b/src/main/java/net/minecraft/server/ShapedRecipes.java deleted file mode 100644 index cc444db8..00000000 --- a/src/main/java/net/minecraft/server/ShapedRecipes.java +++ /dev/null @@ -1,159 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.inventory.CraftShapedRecipe; -// CraftBukkit end - -public class ShapedRecipes implements IRecipe { - - private int width; - private int height; - private ItemStack[] items; - private ItemStack result; - private boolean e; - - public ShapedRecipes(int i, int j, ItemStack[] aitemstack, ItemStack itemstack) { - this.width = i; - this.height = j; - this.items = aitemstack; - this.result = itemstack; - } - - // CraftBukkit start - public org.bukkit.inventory.ShapedRecipe toBukkitRecipe() { - CraftItemStack result = CraftItemStack.asCraftMirror(this.result); - CraftShapedRecipe recipe = new CraftShapedRecipe(result, this); - switch (this.height) { - case 1: - switch (this.width) { - case 1: - recipe.shape("a"); - break; - case 2: - recipe.shape("ab"); - break; - case 3: - recipe.shape("abc"); - break; - } - break; - case 2: - switch (this.width) { - case 1: - recipe.shape("a","b"); - break; - case 2: - recipe.shape("ab","cd"); - break; - case 3: - recipe.shape("abc","def"); - break; - } - break; - case 3: - switch (this.width) { - case 1: - recipe.shape("a","b","c"); - break; - case 2: - recipe.shape("ab","cd","ef"); - break; - case 3: - recipe.shape("abc","def","ghi"); - break; - } - break; - } - char c = 'a'; - for (ItemStack stack : this.items) { - if (stack != null) { - recipe.setIngredient(c, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); - } - c++; - } - return recipe; - } - // CraftBukkit end - - public ItemStack b() { - return this.result; - } - - public boolean a(InventoryCrafting inventorycrafting, World world) { - for (int i = 0; i <= 3 - this.width; ++i) { - for (int j = 0; j <= 3 - this.height; ++j) { - if (this.a(inventorycrafting, i, j, true)) { - return true; - } - - if (this.a(inventorycrafting, i, j, false)) { - return true; - } - } - } - - return false; - } - - private boolean a(InventoryCrafting inventorycrafting, int i, int j, boolean flag) { - for (int k = 0; k < 3; ++k) { - for (int l = 0; l < 3; ++l) { - int i1 = k - i; - int j1 = l - j; - ItemStack itemstack = null; - - if (i1 >= 0 && j1 >= 0 && i1 < this.width && j1 < this.height) { - if (flag) { - itemstack = this.items[this.width - i1 - 1 + j1 * this.width]; - } else { - itemstack = this.items[i1 + j1 * this.width]; - } - } - - ItemStack itemstack1 = inventorycrafting.b(k, l); - - if (itemstack1 != null || itemstack != null) { - if (itemstack1 == null && itemstack != null || itemstack1 != null && itemstack == null) { - return false; - } - - if (itemstack.getItem() != itemstack1.getItem()) { - return false; - } - - if (itemstack.getData() != 32767 && itemstack.getData() != itemstack1.getData()) { - return false; - } - } - } - } - - return true; - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - ItemStack itemstack = this.b().cloneItemStack(); - - if (this.e) { - for (int i = 0; i < inventorycrafting.getSize(); ++i) { - ItemStack itemstack1 = inventorycrafting.getItem(i); - - if (itemstack1 != null && itemstack1.hasTag()) { - itemstack.setTag((NBTTagCompound) itemstack1.tag.clone()); - } - } - } - - return itemstack; - } - - public int a() { - return this.width * this.height; - } - - public ShapedRecipes c() { - this.e = true; - return this; - } -} diff --git a/src/main/java/net/minecraft/server/ShapelessRecipes.java b/src/main/java/net/minecraft/server/ShapelessRecipes.java deleted file mode 100644 index 0fab83c6..00000000 --- a/src/main/java/net/minecraft/server/ShapelessRecipes.java +++ /dev/null @@ -1,78 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.craftbukkit.inventory.CraftShapelessRecipe; -// CraftBukkit end - -public class ShapelessRecipes implements IRecipe { - - private final ItemStack result; - private final List ingredients; - - public ShapelessRecipes(ItemStack itemstack, List list) { - this.result = itemstack; - this.ingredients = list; - } - - // CraftBukkit start - @SuppressWarnings("unchecked") - public org.bukkit.inventory.ShapelessRecipe toBukkitRecipe() { - CraftItemStack result = CraftItemStack.asCraftMirror(this.result); - CraftShapelessRecipe recipe = new CraftShapelessRecipe(result, this); - for (ItemStack stack : (List<ItemStack>) this.ingredients) { - if (stack != null) { - recipe.addIngredient(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(stack.getItem()), stack.getData()); - } - } - return recipe; - } - // CraftBukkit end - - public ItemStack b() { - return this.result; - } - - public boolean a(InventoryCrafting inventorycrafting, World world) { - ArrayList arraylist = new ArrayList(this.ingredients); - - for (int i = 0; i < 3; ++i) { - for (int j = 0; j < 3; ++j) { - ItemStack itemstack = inventorycrafting.b(j, i); - - if (itemstack != null) { - boolean flag = false; - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - ItemStack itemstack1 = (ItemStack) iterator.next(); - - if (itemstack.getItem() == itemstack1.getItem() && (itemstack1.getData() == 32767 || itemstack.getData() == itemstack1.getData())) { - flag = true; - arraylist.remove(itemstack1); - break; - } - } - - if (!flag) { - return false; - } - } - } - } - - return arraylist.isEmpty(); - } - - public ItemStack a(InventoryCrafting inventorycrafting) { - return this.result.cloneItemStack(); - } - - public int a() { - return this.ingredients.size(); - } -} diff --git a/src/main/java/net/minecraft/server/Slot.java b/src/main/java/net/minecraft/server/Slot.java deleted file mode 100644 index ac9e04cf..00000000 --- a/src/main/java/net/minecraft/server/Slot.java +++ /dev/null @@ -1,74 +0,0 @@ -package net.minecraft.server; - -public class Slot { - - public final int index; // CraftBukkit - private -> public - public final IInventory inventory; - public int rawSlotIndex; - public int h; - public int i; - - public Slot(IInventory iinventory, int i, int j, int k) { - this.inventory = iinventory; - this.index = i; - this.h = j; - this.i = k; - } - - public void a(ItemStack itemstack, ItemStack itemstack1) { - if (itemstack != null && itemstack1 != null) { - if (itemstack.getItem() == itemstack1.getItem()) { - int i = itemstack1.count - itemstack.count; - - if (i > 0) { - this.a(itemstack, i); - } - } - } - } - - protected void a(ItemStack itemstack, int i) {} - - protected void b(ItemStack itemstack) {} - - public void a(EntityHuman entityhuman, ItemStack itemstack) { - this.f(); - } - - public boolean isAllowed(ItemStack itemstack) { - return true; - } - - public ItemStack getItem() { - return this.inventory.getItem(this.index); - } - - public boolean hasItem() { - return this.getItem() != null; - } - - public void set(ItemStack itemstack) { - this.inventory.setItem(this.index, itemstack); - this.f(); - } - - public void f() { - this.inventory.update(); - } - - public int getMaxStackSize() { - return this.inventory.getMaxStackSize(); - } - - public ItemStack a(int i) { - return this.inventory.splitStack(this.index, i); - } - - public boolean a(IInventory iinventory, int i) { - return iinventory == this.inventory && i == this.index; - } - - public boolean isAllowed(EntityHuman entityhuman) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/SlotFurnaceResult.java b/src/main/java/net/minecraft/server/SlotFurnaceResult.java deleted file mode 100644 index 9b8e39bc..00000000 --- a/src/main/java/net/minecraft/server/SlotFurnaceResult.java +++ /dev/null @@ -1,85 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.FurnaceExtractEvent; -// CraftBukkit end - -public class SlotFurnaceResult extends Slot { - - private EntityHuman a; - private int b; - - public SlotFurnaceResult(EntityHuman entityhuman, IInventory iinventory, int i, int j, int k) { - super(iinventory, i, j, k); - this.a = entityhuman; - } - - public boolean isAllowed(ItemStack itemstack) { - return false; - } - - public ItemStack a(int i) { - if (this.hasItem()) { - this.b += Math.min(i, this.getItem().count); - } - - return super.a(i); - } - - public void a(EntityHuman entityhuman, ItemStack itemstack) { - this.b(itemstack); - super.a(entityhuman, itemstack); - } - - protected void a(ItemStack itemstack, int i) { - this.b += i; - this.b(itemstack); - } - - protected void b(ItemStack itemstack) { - itemstack.a(this.a.world, this.a, this.b); - if (!this.a.world.isStatic) { - int i = this.b; - float f = RecipesFurnace.getInstance().b(itemstack); - int j; - - if (f == 0.0F) { - i = 0; - } else if (f < 1.0F) { - j = MathHelper.d((float) i * f); - if (j < MathHelper.f((float) i * f) && (float) Math.random() < (float) i * f - (float) j) { - ++j; - } - - i = j; - } - - // CraftBukkit start - fire FurnaceExtractEvent - Player player = (Player) a.getBukkitEntity(); - TileEntityFurnace furnace = ((TileEntityFurnace) this.inventory); - org.bukkit.block.Block block = a.world.getWorld().getBlockAt(furnace.x, furnace.y, furnace.z); - - FurnaceExtractEvent event = new FurnaceExtractEvent(player, block, org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(itemstack.getItem()), itemstack.count, i); - a.world.getServer().getPluginManager().callEvent(event); - - i = event.getExpToDrop(); - // CraftBukkit end - - while (i > 0) { - j = EntityExperienceOrb.getOrbValue(i); - i -= j; - this.a.world.addEntity(new EntityExperienceOrb(this.a.world, this.a.locX, this.a.locY + 0.5D, this.a.locZ + 0.5D, j)); - } - } - - this.b = 0; - if (itemstack.getItem() == Items.IRON_INGOT) { - this.a.a((Statistic) AchievementList.k, 1); - } - - if (itemstack.getItem() == Items.COOKED_FISH) { - this.a.a((Statistic) AchievementList.p, 1); - } - } -} diff --git a/src/main/java/net/minecraft/server/SpawnerCreature.java b/src/main/java/net/minecraft/server/SpawnerCreature.java deleted file mode 100644 index 1dfc3460..00000000 --- a/src/main/java/net/minecraft/server/SpawnerCreature.java +++ /dev/null @@ -1,255 +0,0 @@ -package net.minecraft.server; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.LongHash; -import org.bukkit.craftbukkit.util.LongObjectHashMap; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -// CraftBukkit end - -public final class SpawnerCreature { - - private LongObjectHashMap<Boolean> a = new LongObjectHashMap<Boolean>(); // CraftBukkit - HashMap -> LongObjectHashMap - - public SpawnerCreature() {} - - protected static ChunkPosition getRandomPosition(World world, int i, int j) { - Chunk chunk = world.getChunkAt(i, j); - int k = i * 16 + world.random.nextInt(16); - int l = j * 16 + world.random.nextInt(16); - int i1 = world.random.nextInt(chunk == null ? world.S() : chunk.h() + 16 - 1); - - return new ChunkPosition(k, i1, l); - } - - public int spawnEntities(WorldServer worldserver, boolean flag, boolean flag1, boolean flag2) { - if (!flag && !flag1) { - return 0; - } else { - this.a.clear(); - - int i; - int j; - - for (i = 0; i < worldserver.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) worldserver.players.get(i); - int k = MathHelper.floor(entityhuman.locX / 16.0D); - - j = MathHelper.floor(entityhuman.locZ / 16.0D); - byte b0 = 8; - - for (int l = -b0; l <= b0; ++l) { - for (int i1 = -b0; i1 <= b0; ++i1) { - boolean flag3 = l == -b0 || l == b0 || i1 == -b0 || i1 == b0; - - // CraftBukkit start - use LongHash and LongObjectHashMap - long chunkCoords = LongHash.toLong(l + k, i1 + j); - - if (!flag3) { - this.a.put(chunkCoords, false); - } else if (!this.a.containsKey(chunkCoords)) { - this.a.put(chunkCoords, true); - } - // CraftBukkit end - } - } - } - - i = 0; - ChunkCoordinates chunkcoordinates = worldserver.getSpawn(); - EnumCreatureType[] aenumcreaturetype = EnumCreatureType.values(); - - j = aenumcreaturetype.length; - - for (int j1 = 0; j1 < j; ++j1) { - EnumCreatureType enumcreaturetype = aenumcreaturetype[j1]; - - // CraftBukkit start - Use per-world spawn limits - int limit = enumcreaturetype.b(); - switch (enumcreaturetype) { - case MONSTER: - limit = worldserver.getWorld().getMonsterSpawnLimit(); - break; - case CREATURE: - limit = worldserver.getWorld().getAnimalSpawnLimit(); - break; - case WATER_CREATURE: - limit = worldserver.getWorld().getWaterAnimalSpawnLimit(); - break; - case AMBIENT: - limit = worldserver.getWorld().getAmbientSpawnLimit(); - break; - } - - if (limit == 0) { - continue; - } - // CraftBukkit end - - if ((!enumcreaturetype.d() || flag1) && (enumcreaturetype.d() || flag) && (!enumcreaturetype.e() || flag2) && worldserver.a(enumcreaturetype.a()) <= limit * this.a.size() / 256) { // CraftBukkit - use per-world limits - Iterator iterator = this.a.keySet().iterator(); - - label110: - while (iterator.hasNext()) { - // CraftBukkit start = use LongHash and LongObjectHashMap - long key = ((Long) iterator.next()).longValue(); - - if (!this.a.get(key)) { - ChunkPosition chunkposition = getRandomPosition(worldserver, LongHash.msw(key), LongHash.lsw(key)); - // CraftBukkit end - int k1 = chunkposition.x; - int l1 = chunkposition.y; - int i2 = chunkposition.z; - - if (!worldserver.getType(k1, l1, i2).r() && worldserver.getType(k1, l1, i2).getMaterial() == enumcreaturetype.c()) { - int j2 = 0; - int k2 = 0; - - while (k2 < 3) { - int l2 = k1; - int i3 = l1; - int j3 = i2; - byte b1 = 6; - BiomeMeta biomemeta = null; - GroupDataEntity groupdataentity = null; - int k3 = 0; - - while (true) { - if (k3 < 4) { - label103: { - l2 += worldserver.random.nextInt(b1) - worldserver.random.nextInt(b1); - i3 += worldserver.random.nextInt(1) - worldserver.random.nextInt(1); - j3 += worldserver.random.nextInt(b1) - worldserver.random.nextInt(b1); - if (a(enumcreaturetype, worldserver, l2, i3, j3)) { - float f = (float) l2 + 0.5F; - float f1 = (float) i3; - float f2 = (float) j3 + 0.5F; - - if (worldserver.findNearbyPlayer((double) f, (double) f1, (double) f2, 24.0D) == null) { - float f3 = f - (float) chunkcoordinates.x; - float f4 = f1 - (float) chunkcoordinates.y; - float f5 = f2 - (float) chunkcoordinates.z; - float f6 = f3 * f3 + f4 * f4 + f5 * f5; - - if (f6 >= 576.0F) { - if (biomemeta == null) { - biomemeta = worldserver.a(enumcreaturetype, l2, i3, j3); - if (biomemeta == null) { - break label103; - } - } - - EntityInsentient entityinsentient; - - try { - entityinsentient = (EntityInsentient) biomemeta.b.getConstructor(new Class[] { World.class}).newInstance(new Object[] { worldserver}); - } catch (Exception exception) { - exception.printStackTrace(); - return i; - } - - entityinsentient.setPositionRotation((double) f, (double) f1, (double) f2, worldserver.random.nextFloat() * 360.0F, 0.0F); - if (entityinsentient.canSpawn()) { - ++j2; - // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.a(groupdataentity) up - groupdataentity = entityinsentient.prepare(groupdataentity); - worldserver.addEntity(entityinsentient, SpawnReason.NATURAL); - // CraftBukkit end - if (j2 >= entityinsentient.bB()) { - continue label110; - } - } - - i += j2; - } - } - } - - ++k3; - continue; - } - } - - ++k2; - break; - } - } - } - } - } - } - } - - return i; - } - } - - public static boolean a(EnumCreatureType enumcreaturetype, World world, int i, int j, int k) { - if (enumcreaturetype.c() == Material.WATER) { - return world.getType(i, j, k).getMaterial().isLiquid() && world.getType(i, j - 1, k).getMaterial().isLiquid() && !world.getType(i, j + 1, k).r(); - } else if (!World.a((IBlockAccess) world, i, j - 1, k)) { - return false; - } else { - Block block = world.getType(i, j - 1, k); - - return block != Blocks.BEDROCK && !world.getType(i, j, k).r() && !world.getType(i, j, k).getMaterial().isLiquid() && !world.getType(i, j + 1, k).r(); - } - } - - public static void a(World world, BiomeBase biomebase, int i, int j, int k, int l, Random random) { - List list = biomebase.getMobs(EnumCreatureType.CREATURE); - - if (!list.isEmpty()) { - while (random.nextFloat() < biomebase.g()) { - BiomeMeta biomemeta = (BiomeMeta) WeightedRandom.a(world.random, (Collection) list); - GroupDataEntity groupdataentity = null; - int i1 = biomemeta.c + random.nextInt(1 + biomemeta.d - biomemeta.c); - int j1 = i + random.nextInt(k); - int k1 = j + random.nextInt(l); - int l1 = j1; - int i2 = k1; - - for (int j2 = 0; j2 < i1; ++j2) { - boolean flag = false; - - for (int k2 = 0; !flag && k2 < 4; ++k2) { - int l2 = world.i(j1, k1); - - if (a(EnumCreatureType.CREATURE, world, j1, l2, k1)) { - float f = (float) j1 + 0.5F; - float f1 = (float) l2; - float f2 = (float) k1 + 0.5F; - - EntityInsentient entityinsentient; - - try { - entityinsentient = (EntityInsentient) biomemeta.b.getConstructor(new Class[] { World.class}).newInstance(new Object[] { world}); - } catch (Exception exception) { - exception.printStackTrace(); - continue; - } - - entityinsentient.setPositionRotation((double) f, (double) f1, (double) f2, random.nextFloat() * 360.0F, 0.0F); - // CraftBukkit start - Added a reason for spawning this creature, moved entityinsentient.a(groupdataentity) up - groupdataentity = entityinsentient.prepare(groupdataentity); - world.addEntity(entityinsentient, SpawnReason.CHUNK_GEN); - // CraftBukkit end - flag = true; - } - - j1 += random.nextInt(5) - random.nextInt(5); - - for (k1 += random.nextInt(5) - random.nextInt(5); j1 < i || j1 >= i + k || k1 < j || k1 >= j + k; k1 = i2 + random.nextInt(5) - random.nextInt(5)) { - j1 = l1 + random.nextInt(5) - random.nextInt(5); - } - } - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/StatisticManager.java b/src/main/java/net/minecraft/server/StatisticManager.java deleted file mode 100644 index d41dc4dd..00000000 --- a/src/main/java/net/minecraft/server/StatisticManager.java +++ /dev/null @@ -1,68 +0,0 @@ -package net.minecraft.server; - -import java.util.Map; - -import net.minecraft.util.com.google.common.collect.Maps; - -public class StatisticManager { - - protected final Map a = Maps.newConcurrentMap(); - - public StatisticManager() { - } - - public boolean hasAchievement(Achievement achievement) { - return this.getStatisticValue((Statistic) achievement) > 0; - } - - public boolean b(Achievement achievement) { - return achievement.c == null || this.hasAchievement(achievement.c); - } - - public void b(EntityHuman entityhuman, Statistic statistic, int i) { - if (!statistic.d() || this.b((Achievement) statistic)) { - // CraftBukkit start - fire Statistic events - org.bukkit.event.Cancellable cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.handleStatisticsIncrease(entityhuman, statistic, this.getStatisticValue(statistic), i); - if (cancellable != null && cancellable.isCancelled()) { - return; - } - // CraftBukkit end - this.setStatistic(entityhuman, statistic, this.getStatisticValue(statistic) + i); - } - } - - public void setStatistic(EntityHuman entityhuman, Statistic statistic, int i) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - if (statisticwrapper == null) { - statisticwrapper = new StatisticWrapper(); - this.a.put(statistic, statisticwrapper); - } - - statisticwrapper.a(i); - } - - public int getStatisticValue(Statistic statistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - return statisticwrapper == null ? 0 : statisticwrapper.a(); - } - - public IJsonStatistic b(Statistic statistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - return statisticwrapper != null ? statisticwrapper.b() : null; - } - - public IJsonStatistic a(Statistic statistic, IJsonStatistic ijsonstatistic) { - StatisticWrapper statisticwrapper = (StatisticWrapper) this.a.get(statistic); - - if (statisticwrapper == null) { - statisticwrapper = new StatisticWrapper(); - this.a.put(statistic, statisticwrapper); - } - - statisticwrapper.a(ijsonstatistic); - return ijsonstatistic; - } -} diff --git a/src/main/java/net/minecraft/server/ThreadCommandReader.java b/src/main/java/net/minecraft/server/ThreadCommandReader.java deleted file mode 100644 index a5e8a45e..00000000 --- a/src/main/java/net/minecraft/server/ThreadCommandReader.java +++ /dev/null @@ -1,45 +0,0 @@ -package net.minecraft.server; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; - -import static org.bukkit.craftbukkit.Main.*; // CraftBukkit - -class ThreadCommandReader extends Thread { - - final DedicatedServer server; - - ThreadCommandReader(DedicatedServer dedicatedserver, String s) { - super(s); - this.server = dedicatedserver; - } - - public void run() { - // CraftBukkit start - if (!useConsole) { - return; - } - // CraftBukkit end - - jline.console.ConsoleReader bufferedreader = this.server.reader; // CraftBukkit - String s; - - try { - // CraftBukkit start - JLine disabling compatibility - while (!this.server.isStopped() && this.server.isRunning()) { - if (useJline) { - s = bufferedreader.readLine(">", null); - } else { - s = bufferedreader.readLine(); - } - if (s != null) { - this.server.issueCommand(s, this.server); - } - // CraftBukkit end - } - } catch (IOException ioexception) { - DedicatedServer.aF().error("Exception handling console input", ioexception); - } - } -} diff --git a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java b/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java deleted file mode 100644 index 6b91be70..00000000 --- a/src/main/java/net/minecraft/server/ThreadPlayerLookupUUID.java +++ /dev/null @@ -1,96 +0,0 @@ -package net.minecraft.server; - -import java.math.BigInteger; -import java.util.UUID; - -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.exceptions.AuthenticationUnavailableException; - -// CraftBukkit start -import org.bukkit.craftbukkit.util.Waitable; -import org.bukkit.event.player.AsyncPlayerPreLoginEvent; -import org.bukkit.event.player.PlayerPreLoginEvent; -// CraftBukkit end - -class ThreadPlayerLookupUUID extends Thread { - - final LoginListener a; - - ThreadPlayerLookupUUID(LoginListener loginlistener, String s) { - super(s); - this.a = loginlistener; - } - - public void run() { - GameProfile gameprofile = LoginListener.a(this.a); - - try { - String s = (new BigInteger(MinecraftEncryption.a(LoginListener.b(this.a), LoginListener.c(this.a).K().getPublic(), LoginListener.d(this.a)))).toString(16); - - LoginListener.a(this.a, LoginListener.c(this.a).av().hasJoinedServer(new GameProfile((UUID) null, gameprofile.getName()), s)); - if (LoginListener.a(this.a) != null) { - // CraftBukkit start - fire PlayerPreLoginEvent - if (!this.a.networkManager.isConnected()) { - return; - } - - String playerName = LoginListener.a(this.a).getName(); - java.net.InetAddress address = ((java.net.InetSocketAddress) a.networkManager.getSocketAddress()).getAddress(); - java.util.UUID uniqueId = LoginListener.a(this.a).getId(); - final org.bukkit.craftbukkit.CraftServer server = LoginListener.c(this.a).server; - - AsyncPlayerPreLoginEvent asyncEvent = new AsyncPlayerPreLoginEvent(playerName, address, uniqueId); - server.getPluginManager().callEvent(asyncEvent); - - if (PlayerPreLoginEvent.getHandlerList().getRegisteredListeners().length != 0) { - final PlayerPreLoginEvent event = new PlayerPreLoginEvent(playerName, address, uniqueId); - if (asyncEvent.getResult() != PlayerPreLoginEvent.Result.ALLOWED) { - event.disallow(asyncEvent.getResult(), asyncEvent.getKickMessage()); - } - Waitable<PlayerPreLoginEvent.Result> waitable = new Waitable<PlayerPreLoginEvent.Result>() { - @Override - protected PlayerPreLoginEvent.Result evaluate() { - server.getPluginManager().callEvent(event); - return event.getResult(); - }}; - - LoginListener.c(this.a).processQueue.add(waitable); - if (waitable.get() != PlayerPreLoginEvent.Result.ALLOWED) { - this.a.disconnect(event.getKickMessage()); - return; - } - } else { - if (asyncEvent.getLoginResult() != AsyncPlayerPreLoginEvent.Result.ALLOWED) { - this.a.disconnect(asyncEvent.getKickMessage()); - return; - } - } - // CraftBukkit end - - LoginListener.e().info("UUID of player " + LoginListener.a(this.a).getName() + " is " + LoginListener.a(this.a).getId()); - LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); - } else if (LoginListener.c(this.a).N()) { - LoginListener.e().warn("Failed to verify username but will let them in anyway!"); - LoginListener.a(this.a, this.a.a(gameprofile)); - LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); - } else { - this.a.disconnect("Failed to verify username!"); - LoginListener.e().error("Username \'" + LoginListener.a(this.a).getName() + "\' tried to join with an invalid session"); - } - } catch (AuthenticationUnavailableException authenticationunavailableexception) { - if (LoginListener.c(this.a).N()) { - LoginListener.e().warn("Authentication servers are down but will let them in anyway!"); - LoginListener.a(this.a, this.a.a(gameprofile)); - LoginListener.a(this.a, EnumProtocolState.READY_TO_ACCEPT); - } else { - this.a.disconnect("Authentication servers are down. Please try again later, sorry!"); - LoginListener.e().error("Couldn\'t verify username because servers are unavailable"); - } - // CraftBukkit start - catch all exceptions - } catch (Exception exception) { - this.a.disconnect("Failed to verify username!"); - LoginListener.c(this.a).server.getLogger().log(java.util.logging.Level.WARNING, "Exception verifying " + LoginListener.a(this.a).getName(), exception); - // CraftBukkit end - } - } -} diff --git a/src/main/java/net/minecraft/server/TileEntity.java b/src/main/java/net/minecraft/server/TileEntity.java deleted file mode 100644 index b2de58b5..00000000 --- a/src/main/java/net/minecraft/server/TileEntity.java +++ /dev/null @@ -1,183 +0,0 @@ -package net.minecraft.server; - -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Callable; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import org.bukkit.inventory.InventoryHolder; // CraftBukkit - -public class TileEntity { - - private static final Logger a = LogManager.getLogger(); - private static Map i = new HashMap(); - private static Map j = new HashMap(); - protected World world; - public int x; - public int y; - public int z; - protected boolean f; - public int g = -1; - public Block h; - - public TileEntity() {} - - private static void a(Class oclass, String s) { - if (i.containsKey(s)) { - throw new IllegalArgumentException("Duplicate id: " + s); - } else { - i.put(s, oclass); - j.put(oclass, s); - } - } - - public World getWorld() { - return this.world; - } - - public void a(World world) { - this.world = world; - } - - public boolean o() { - return this.world != null; - } - - public void a(NBTTagCompound nbttagcompound) { - this.x = nbttagcompound.getInt("x"); - this.y = nbttagcompound.getInt("y"); - this.z = nbttagcompound.getInt("z"); - } - - public void b(NBTTagCompound nbttagcompound) { - String s = (String) j.get(this.getClass()); - - if (s == null) { - throw new RuntimeException(this.getClass() + " is missing a mapping! This is a bug!"); - } else { - nbttagcompound.setString("id", s); - nbttagcompound.setInt("x", this.x); - nbttagcompound.setInt("y", this.y); - nbttagcompound.setInt("z", this.z); - } - } - - public void h() {} - - public static TileEntity c(NBTTagCompound nbttagcompound) { - TileEntity tileentity = null; - - try { - Class oclass = (Class) i.get(nbttagcompound.getString("id")); - - if (oclass != null) { - tileentity = (TileEntity) oclass.newInstance(); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - - if (tileentity != null) { - tileentity.a(nbttagcompound); - } else { - a.warn("Skipping BlockEntity with id " + nbttagcompound.getString("id")); - } - - return tileentity; - } - - public int p() { - if (this.g == -1) { - this.g = this.world.getData(this.x, this.y, this.z); - } - - return this.g; - } - - public void update() { - if (this.world != null) { - this.g = this.world.getData(this.x, this.y, this.z); - this.world.b(this.x, this.y, this.z, this); - if (this.q() != Blocks.AIR) { - this.world.updateAdjacentComparators(this.x, this.y, this.z, this.q()); - } - } - } - - public Block q() { - if (this.h == null) { - this.h = this.world.getType(this.x, this.y, this.z); - } - - return this.h; - } - - public Packet getUpdatePacket() { - return null; - } - - public boolean r() { - return this.f; - } - - public void s() { - this.f = true; - } - - public void t() { - this.f = false; - } - - public boolean c(int i, int j) { - return false; - } - - public void u() { - this.h = null; - this.g = -1; - } - - public void a(CrashReportSystemDetails crashreportsystemdetails) { - crashreportsystemdetails.a("Name", (Callable) (new CrashReportTileEntityName(this))); - CrashReportSystemDetails.a(crashreportsystemdetails, this.x, this.y, this.z, this.q(), this.p()); - crashreportsystemdetails.a("Actual block type", (Callable) (new CrashReportTileEntityType(this))); - crashreportsystemdetails.a("Actual block data value", (Callable) (new CrashReportTileEntityData(this))); - } - - static Map v() { - return j; - } - - static { - a(TileEntityFurnace.class, "Furnace"); - a(TileEntityChest.class, "Chest"); - a(TileEntityEnderChest.class, "EnderChest"); - a(TileEntityRecordPlayer.class, "RecordPlayer"); - a(TileEntityDispenser.class, "Trap"); - a(TileEntityDropper.class, "Dropper"); - a(TileEntitySign.class, "Sign"); - a(TileEntityMobSpawner.class, "MobSpawner"); - a(TileEntityNote.class, "Music"); - a(TileEntityPiston.class, "Piston"); - a(TileEntityBrewingStand.class, "Cauldron"); - a(TileEntityEnchantTable.class, "EnchantTable"); - a(TileEntityEnderPortal.class, "Airportal"); - a(TileEntityCommand.class, "Control"); - a(TileEntityBeacon.class, "Beacon"); - a(TileEntitySkull.class, "Skull"); - a(TileEntityLightDetector.class, "DLDetector"); - a(TileEntityHopper.class, "Hopper"); - a(TileEntityComparator.class, "Comparator"); - a(TileEntityFlowerPot.class, "FlowerPot"); - } - - // CraftBukkit start - add method - public InventoryHolder getOwner() { - org.bukkit.block.BlockState state = world.getWorld().getBlockAt(x, y, z).getState(); - if (state instanceof InventoryHolder) return (InventoryHolder) state; - return null; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/TileEntityBeacon.java b/src/main/java/net/minecraft/server/TileEntityBeacon.java deleted file mode 100644 index 09313eae..00000000 --- a/src/main/java/net/minecraft/server/TileEntityBeacon.java +++ /dev/null @@ -1,276 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class TileEntityBeacon extends TileEntity implements IInventory { - - public static final MobEffectList[][] a = new MobEffectList[][] { { MobEffectList.FASTER_MOVEMENT, MobEffectList.FASTER_DIG}, { MobEffectList.RESISTANCE, MobEffectList.JUMP}, { MobEffectList.INCREASE_DAMAGE}, { MobEffectList.REGENERATION}}; - private boolean k; - private int l = -1; - private int m; - private int n; - private ItemStack inventorySlot; - private String p; - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return new ItemStack[] { this.inventorySlot }; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityBeacon() {} - - public void h() { - if (this.world.getTime() % 80L == 0L) { - this.y(); - this.x(); - } - } - - private void x() { - if (this.k && this.l > 0 && !this.world.isStatic && this.m > 0) { - double d0 = (double) (this.l * 10 + 10); - byte b0 = 0; - - if (this.l >= 4 && this.m == this.n) { - b0 = 1; - } - - AxisAlignedBB axisalignedbb = AxisAlignedBB.a((double) this.x, (double) this.y, (double) this.z, (double) (this.x + 1), (double) (this.y + 1), (double) (this.z + 1)).grow(d0, d0, d0); - - axisalignedbb.e = (double) this.world.getHeight(); - List list = this.world.a(EntityHuman.class, axisalignedbb); - Iterator iterator = list.iterator(); - - EntityHuman entityhuman; - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.addEffect(new MobEffect(this.m, 180, b0, true)); - } - - if (this.l >= 4 && this.m != this.n && this.n > 0) { - iterator = list.iterator(); - - while (iterator.hasNext()) { - entityhuman = (EntityHuman) iterator.next(); - entityhuman.addEffect(new MobEffect(this.n, 180, 0, true)); - } - } - } - } - - private void y() { - int i = this.l; - - if (!this.world.i(this.x, this.y + 1, this.z)) { - this.k = false; - this.l = 0; - } else { - this.k = true; - this.l = 0; - - for (int j = 1; j <= 4; this.l = j++) { - int k = this.y - j; - - if (k < 0) { - break; - } - - boolean flag = true; - - for (int l = this.x - j; l <= this.x + j && flag; ++l) { - for (int i1 = this.z - j; i1 <= this.z + j; ++i1) { - Block block = this.world.getType(l, k, i1); - - if (block != Blocks.EMERALD_BLOCK && block != Blocks.GOLD_BLOCK && block != Blocks.DIAMOND_BLOCK && block != Blocks.IRON_BLOCK) { - flag = false; - break; - } - } - } - - if (!flag) { - break; - } - } - - if (this.l == 0) { - this.k = false; - } - } - - if (!this.world.isStatic && this.l == 4 && i < this.l) { - Iterator iterator = this.world.a(EntityHuman.class, AxisAlignedBB.a((double) this.x, (double) this.y, (double) this.z, (double) this.x, (double) (this.y - 4), (double) this.z).grow(10.0D, 5.0D, 10.0D)).iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - entityhuman.a((Statistic) AchievementList.K); - } - } - } - - public int j() { - return this.m; - } - - public int k() { - return this.n; - } - - public int l() { - return this.l; - } - - public void d(int i) { - this.m = 0; - - for (int j = 0; j < this.l && j < 3; ++j) { - MobEffectList[] amobeffectlist = a[j]; - int k = amobeffectlist.length; - - for (int l = 0; l < k; ++l) { - MobEffectList mobeffectlist = amobeffectlist[l]; - - if (mobeffectlist.id == i) { - this.m = i; - return; - } - } - } - } - - public void e(int i) { - this.n = 0; - if (this.l >= 4) { - for (int j = 0; j < 4; ++j) { - MobEffectList[] amobeffectlist = a[j]; - int k = amobeffectlist.length; - - for (int l = 0; l < k; ++l) { - MobEffectList mobeffectlist = amobeffectlist[l]; - - if (mobeffectlist.id == i) { - this.n = i; - return; - } - } - } - } - } - - public Packet getUpdatePacket() { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - this.b(nbttagcompound); - return new PacketPlayOutTileEntityData(this.x, this.y, this.z, 3, nbttagcompound); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.m = nbttagcompound.getInt("Primary"); - this.n = nbttagcompound.getInt("Secondary"); - this.l = nbttagcompound.getInt("Levels"); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("Primary", this.m); - nbttagcompound.setInt("Secondary", this.n); - nbttagcompound.setInt("Levels", this.l); - } - - public int getSize() { - return 1; - } - - public ItemStack getItem(int i) { - return i == 0 ? this.inventorySlot : null; - } - - public ItemStack splitStack(int i, int j) { - if (i == 0 && this.inventorySlot != null) { - if (j >= this.inventorySlot.count) { - ItemStack itemstack = this.inventorySlot; - - this.inventorySlot = null; - return itemstack; - } else { - this.inventorySlot.count -= j; - return new ItemStack(this.inventorySlot.getItem(), j, this.inventorySlot.getData()); - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (i == 0 && this.inventorySlot != null) { - ItemStack itemstack = this.inventorySlot; - - this.inventorySlot = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - if (i == 0) { - this.inventorySlot = itemstack; - } - } - - public String getInventoryName() { - return this.k_() ? this.p : "container.beacon"; - } - - public boolean k_() { - return this.p != null && this.p.length() > 0; - } - - public void a(String s) { - this.p = s; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return itemstack.getItem() == Items.EMERALD || itemstack.getItem() == Items.DIAMOND || itemstack.getItem() == Items.GOLD_INGOT || itemstack.getItem() == Items.IRON_INGOT; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java deleted file mode 100644 index c0ca4a49..00000000 --- a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java +++ /dev/null @@ -1,297 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.BrewEvent; -// CraftBukkit end - -public class TileEntityBrewingStand extends TileEntity implements IWorldInventory { - - private static final int[] a = new int[] { 3}; - private static final int[] i = new int[] { 0, 1, 2}; - public ItemStack[] items = new ItemStack[4]; // CraftBukkit - private -> public - public int brewTime; // CraftBukkit - private -> public - private int l; - private Item m; - private String n; - private int lastTick = MinecraftServer.currentTick; // CraftBukkit - add field - - public TileEntityBrewingStand() {} - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = 64; - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public ItemStack[] getContents() { - return this.items; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public String getInventoryName() { - return this.k_() ? this.n : "container.brewing"; - } - - public boolean k_() { - return this.n != null && this.n.length() > 0; - } - - public void a(String s) { - this.n = s; - } - - public int getSize() { - return this.items.length; - } - - public void h() { - // CraftBukkit start - Use wall time instead of ticks for brewing - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.lastTick = MinecraftServer.currentTick; - - if (this.brewTime > 0) { - this.brewTime -= elapsedTicks; - if (this.brewTime <= 0) { // == -> <= - // CraftBukkit end - this.l(); - this.update(); - } else if (!this.k()) { - this.brewTime = 0; - this.update(); - } else if (this.m != this.items[3].getItem()) { - this.brewTime = 0; - this.update(); - } - } else if (this.k()) { - this.brewTime = 400; - this.m = this.items[3].getItem(); - } - - int i = this.j(); - - if (i != this.l) { - this.l = i; - this.world.setData(this.x, this.y, this.z, i, 2); - } - - super.h(); - } - - public int i() { - return this.brewTime; - } - - private boolean k() { - if (this.items[3] != null && this.items[3].count > 0) { - ItemStack itemstack = this.items[3]; - - if (!itemstack.getItem().m(itemstack)) { - return false; - } else { - boolean flag = false; - - for (int i = 0; i < 3; ++i) { - if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { - int j = this.items[i].getData(); - int k = this.c(j, itemstack); - - if (!ItemPotion.g(j) && ItemPotion.g(k)) { - flag = true; - break; - } - - List list = Items.POTION.c(j); - List list1 = Items.POTION.c(k); - - if ((j <= 0 || list != list1) && (list == null || !list.equals(list1) && list1 != null) && j != k) { - flag = true; - break; - } - } - } - - return flag; - } - } else { - return false; - } - } - - private void l() { - if (this.k()) { - ItemStack itemstack = this.items[3]; - - // CraftBukkit start - if (getOwner() != null) { - BrewEvent event = new BrewEvent(world.getWorld().getBlockAt(x, y, z), (org.bukkit.inventory.BrewerInventory) this.getOwner().getInventory()); - org.bukkit.Bukkit.getPluginManager().callEvent(event); - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - for (int i = 0; i < 3; ++i) { - if (this.items[i] != null && this.items[i].getItem() == Items.POTION) { - int j = this.items[i].getData(); - int k = this.c(j, itemstack); - List list = Items.POTION.c(j); - List list1 = Items.POTION.c(k); - - if ((j <= 0 || list != list1) && (list == null || !list.equals(list1) && list1 != null)) { - if (j != k) { - this.items[i].setData(k); - } - } else if (!ItemPotion.g(j) && ItemPotion.g(k)) { - this.items[i].setData(k); - } - } - } - - if (itemstack.getItem().u()) { - this.items[3] = new ItemStack(itemstack.getItem().t()); - } else { - --this.items[3].count; - if (this.items[3].count <= 0) { - this.items[3] = null; - } - } - } - } - - private int c(int i, ItemStack itemstack) { - return itemstack == null ? i : (itemstack.getItem().m(itemstack) ? PotionBrewer.a(i, itemstack.getItem().i(itemstack)) : i); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - byte b0 = nbttagcompound1.getByte("Slot"); - - if (b0 >= 0 && b0 < this.items.length) { - this.items[b0] = ItemStack.createStack(nbttagcompound1); - } - } - - this.brewTime = nbttagcompound.getShort("BrewTime"); - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.n = nbttagcompound.getString("CustomName"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("BrewTime", (short) this.brewTime); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.n); - } - } - - public ItemStack getItem(int i) { - return i >= 0 && i < this.items.length ? this.items[i] : null; - } - - public ItemStack splitStack(int i, int j) { - if (i >= 0 && i < this.items.length) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (i >= 0 && i < this.items.length) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - if (i >= 0 && i < this.items.length) { - this.items[i] = itemstack; - } - } - - public int getMaxStackSize() { - return this.maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return i == 3 ? itemstack.getItem().m(itemstack) : itemstack.getItem() == Items.POTION || itemstack.getItem() == Items.GLASS_BOTTLE; - } - - public int j() { - int i = 0; - - for (int j = 0; j < 3; ++j) { - if (this.items[j] != null) { - i |= 1 << j; - } - } - - return i; - } - - public int[] getSlotsForFace(int i) { - return i == 1 ? a : TileEntityBrewingStand.i; // CraftBukkit - decompilation error - } - - public boolean canPlaceItemThroughFace(int i, ItemStack itemstack, int j) { - return this.b(i, itemstack); - } - - public boolean canTakeItemThroughFace(int i, ItemStack itemstack, int j) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityChest.java b/src/main/java/net/minecraft/server/TileEntityChest.java deleted file mode 100644 index c900cafb..00000000 --- a/src/main/java/net/minecraft/server/TileEntityChest.java +++ /dev/null @@ -1,410 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class TileEntityChest extends TileEntity implements IInventory { - - private ItemStack[] items = new ItemStack[27]; // CraftBukkit - 36 -> 27 - public boolean a; - public TileEntityChest i; - public TileEntityChest j; - public TileEntityChest k; - public TileEntityChest l; - public float m; - public float n; - public int o; - private int ticks; - private int r = -1; - private String s; - - public TileEntityChest() {} - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public int getSize() { - return 27; - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.update(); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.update(); - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - this.update(); - } - - public String getInventoryName() { - return this.k_() ? this.s : "container.chest"; - } - - public boolean k_() { - return this.s != null && this.s.length() > 0; - } - - public void a(String s) { - this.s = s; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.s = nbttagcompound.getString("CustomName"); - } - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.items.length) { - this.items[j] = ItemStack.createStack(nbttagcompound1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.s); - } - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - if (this.world == null) return true; // CraftBukkit - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void u() { - super.u(); - this.a = false; - } - - private void a(TileEntityChest tileentitychest, int i) { - if (tileentitychest.r()) { - this.a = false; - } else if (this.a) { - switch (i) { - case 0: - if (this.l != tileentitychest) { - this.a = false; - } - break; - - case 1: - if (this.k != tileentitychest) { - this.a = false; - } - break; - - case 2: - if (this.i != tileentitychest) { - this.a = false; - } - break; - - case 3: - if (this.j != tileentitychest) { - this.a = false; - } - } - } - } - - public void i() { - if (!this.a) { - this.a = true; - this.i = null; - this.j = null; - this.k = null; - this.l = null; - if (this.a(this.x - 1, this.y, this.z)) { - this.k = (TileEntityChest) this.world.getTileEntity(this.x - 1, this.y, this.z); - } - - if (this.a(this.x + 1, this.y, this.z)) { - this.j = (TileEntityChest) this.world.getTileEntity(this.x + 1, this.y, this.z); - } - - if (this.a(this.x, this.y, this.z - 1)) { - this.i = (TileEntityChest) this.world.getTileEntity(this.x, this.y, this.z - 1); - } - - if (this.a(this.x, this.y, this.z + 1)) { - this.l = (TileEntityChest) this.world.getTileEntity(this.x, this.y, this.z + 1); - } - - if (this.i != null) { - this.i.a(this, 0); - } - - if (this.l != null) { - this.l.a(this, 2); - } - - if (this.j != null) { - this.j.a(this, 1); - } - - if (this.k != null) { - this.k.a(this, 3); - } - } - } - - private boolean a(int i, int j, int k) { - if (this.world == null) { - return false; - } else { - Block block = this.world.getType(i, j, k); - - return block instanceof BlockChest && ((BlockChest) block).a == this.j(); - } - } - - public void h() { - super.h(); - if (this.world == null) return; // CraftBukkit - this.i(); - ++this.ticks; - float f; - - if (!this.world.isStatic && this.o != 0 && (this.ticks + this.x + this.y + this.z) % 200 == 0) { - this.o = 0; - f = 5.0F; - List list = this.world.a(EntityHuman.class, AxisAlignedBB.a((double) ((float) this.x - f), (double) ((float) this.y - f), (double) ((float) this.z - f), (double) ((float) (this.x + 1) + f), (double) ((float) (this.y + 1) + f), (double) ((float) (this.z + 1) + f))); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (entityhuman.activeContainer instanceof ContainerChest) { - IInventory iinventory = ((ContainerChest) entityhuman.activeContainer).e(); - - if (iinventory == this || iinventory instanceof InventoryLargeChest && ((InventoryLargeChest) iinventory).a((IInventory) this)) { - ++this.o; - } - } - } - } - - this.n = this.m; - f = 0.1F; - double d0; - - if (this.o > 0 && this.m == 0.0F && this.i == null && this.k == null) { - double d1 = (double) this.x + 0.5D; - - d0 = (double) this.z + 0.5D; - if (this.l != null) { - d0 += 0.5D; - } - - if (this.j != null) { - d1 += 0.5D; - } - - this.world.makeSound(d1, (double) this.y + 0.5D, d0, "random.chestopen", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); - } - - if (this.o == 0 && this.m > 0.0F || this.o > 0 && this.m < 1.0F) { - float f1 = this.m; - - if (this.o > 0) { - this.m += f; - } else { - this.m -= f; - } - - if (this.m > 1.0F) { - this.m = 1.0F; - } - - float f2 = 0.5F; - - if (this.m < f2 && f1 >= f2 && this.i == null && this.k == null) { - d0 = (double) this.x + 0.5D; - double d2 = (double) this.z + 0.5D; - - if (this.l != null) { - d2 += 0.5D; - } - - if (this.j != null) { - d0 += 0.5D; - } - - this.world.makeSound(d0, (double) this.y + 0.5D, d2, "random.chestclosed", 0.5F, this.world.random.nextFloat() * 0.1F + 0.9F); - } - - if (this.m < 0.0F) { - this.m = 0.0F; - } - } - } - - public boolean c(int i, int j) { - if (i == 1) { - this.o = j; - return true; - } else { - return super.c(i, j); - } - } - - public void startOpen() { - if (this.o < 0) { - this.o = 0; - } - - int oldPower = Math.max(0, Math.min(15, this.o)); // CraftBukkit - Get power before new viewer is added - - ++this.o; - if (this.world == null) return; // CraftBukkit - this.world.playBlockAction(this.x, this.y, this.z, this.q(), 1, this.o); - - // CraftBukkit start - Call redstone event - if (this.q() == Blocks.TRAPPED_CHEST) { - int newPower = Math.max(0, Math.min(15, this.o)); - - if (oldPower != newPower) { - org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, this.x, this.y, this.z, oldPower, newPower); - } - } - // CraftBukkit end - - this.world.applyPhysics(this.x, this.y, this.z, this.q()); - this.world.applyPhysics(this.x, this.y - 1, this.z, this.q()); - } - - public void closeContainer() { - if (this.q() instanceof BlockChest) { - int oldPower = Math.max(0, Math.min(15, this.o)); // CraftBukkit - Get power before new viewer is added - - --this.o; - if (this.world == null) return; // CraftBukkit - this.world.playBlockAction(this.x, this.y, this.z, this.q(), 1, this.o); - - // CraftBukkit start - Call redstone event - if (this.q() == Blocks.TRAPPED_CHEST) { - int newPower = Math.max(0, Math.min(15, this.o)); - - if (oldPower != newPower) { - org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(world, this.x, this.y, this.z, oldPower, newPower); - } - } - // CraftBukkit end - - this.world.applyPhysics(this.x, this.y, this.z, this.q()); - this.world.applyPhysics(this.x, this.y - 1, this.z, this.q()); - } - } - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void s() { - super.s(); - this.u(); - this.i(); - } - - public int j() { - if (this.r == -1) { - if (this.world == null || !(this.q() instanceof BlockChest)) { - return 0; - } - - this.r = ((BlockChest) this.q()).a; - } - - return this.r; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityCommandListener.java b/src/main/java/net/minecraft/server/TileEntityCommandListener.java deleted file mode 100644 index 45cefdac..00000000 --- a/src/main/java/net/minecraft/server/TileEntityCommandListener.java +++ /dev/null @@ -1,29 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit - package-private -> public -public class TileEntityCommandListener extends CommandBlockListenerAbstract { - - final TileEntityCommand a; - - TileEntityCommandListener(TileEntityCommand tileentitycommand) { - this.a = tileentitycommand; - sender = new org.bukkit.craftbukkit.command.CraftBlockCommandSender(this); // CraftBukkit - add sender - } - - public ChunkCoordinates getChunkCoordinates() { - return new ChunkCoordinates(this.a.x, this.a.y, this.a.z); - } - - public World getWorld() { - return this.a.getWorld(); - } - - public void setCommand(String s) { - super.setCommand(s); - this.a.update(); - } - - public void e() { - this.a.getWorld().notify(this.a.x, this.a.y, this.a.z); - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityDispenser.java b/src/main/java/net/minecraft/server/TileEntityDispenser.java deleted file mode 100644 index 7900b37e..00000000 --- a/src/main/java/net/minecraft/server/TileEntityDispenser.java +++ /dev/null @@ -1,188 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.entity.HumanEntity; -// CraftBukkit end - -public class TileEntityDispenser extends TileEntity implements IInventory { - - private ItemStack[] items = new ItemStack[9]; - private Random j = new Random(); - protected String a; - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityDispenser() {} - - public int getSize() { - return 9; - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - this.update(); - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - this.update(); - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public int i() { - int i = -1; - int j = 1; - - for (int k = 0; k < this.items.length; ++k) { - if (this.items[k] != null && this.j.nextInt(j++) == 0) { - if (this.items[k].count == 0) continue; // CraftBukkit - i = k; - } - } - - return i; - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - - this.update(); - } - - public int addItem(ItemStack itemstack) { - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] == null || this.items[i].getItem() == null) { - this.setItem(i, itemstack); - return i; - } - } - - return -1; - } - - public String getInventoryName() { - return this.k_() ? this.a : "container.dispenser"; - } - - public void a(String s) { - this.a = s; - } - - public boolean k_() { - return this.a != null; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - int j = nbttagcompound1.getByte("Slot") & 255; - - if (j >= 0 && j < this.items.length) { - this.items[j] = ItemStack.createStack(nbttagcompound1); - } - } - - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.a = nbttagcompound.getString("CustomName"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.a); - } - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java deleted file mode 100644 index 430fc69c..00000000 --- a/src/main/java/net/minecraft/server/TileEntityFurnace.java +++ /dev/null @@ -1,343 +0,0 @@ -package net.minecraft.server; - -// CraftBukkit start -import java.util.List; - -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.FurnaceBurnEvent; -import org.bukkit.event.inventory.FurnaceSmeltEvent; -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -// CraftBukkit end - -public class TileEntityFurnace extends TileEntity implements IWorldInventory { - - private static final int[] k = new int[] { 0}; - private static final int[] l = new int[] { 2, 1}; - private static final int[] m = new int[] { 1}; - private ItemStack[] items = new ItemStack[3]; - public int burnTime; - public int ticksForCurrentFuel; - public int cookTime; - private String o; - - // CraftBukkit start - add fields and methods - private int lastTick = MinecraftServer.currentTick; - private int maxStack = MAX_STACK; - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - - public ItemStack[] getContents() { - return this.items; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityFurnace() {} - - public int getSize() { - return this.items.length; - } - - public ItemStack getItem(int i) { - return this.items[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.items[i] != null) { - ItemStack itemstack; - - if (this.items[i].count <= j) { - itemstack = this.items[i]; - this.items[i] = null; - return itemstack; - } else { - itemstack = this.items[i].a(j); - if (this.items[i].count == 0) { - this.items[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.items[i] != null) { - ItemStack itemstack = this.items[i]; - - this.items[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.items[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - } - - public String getInventoryName() { - return this.k_() ? this.o : "container.furnace"; - } - - public boolean k_() { - return this.o != null && this.o.length() > 0; - } - - public void a(String s) { - this.o = s; - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.items = new ItemStack[this.getSize()]; - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - byte b0 = nbttagcompound1.getByte("Slot"); - - if (b0 >= 0 && b0 < this.items.length) { - this.items[b0] = ItemStack.createStack(nbttagcompound1); - } - } - - this.burnTime = nbttagcompound.getShort("BurnTime"); - this.cookTime = nbttagcompound.getShort("CookTime"); - this.ticksForCurrentFuel = fuelTime(this.items[1]); - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.o = nbttagcompound.getString("CustomName"); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setShort("BurnTime", (short) this.burnTime); - nbttagcompound.setShort("CookTime", (short) this.cookTime); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.items.length; ++i) { - if (this.items[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.items[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.o); - } - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean isBurning() { - return this.burnTime > 0; - } - - public void h() { - boolean flag = this.burnTime > 0; - boolean flag1 = false; - - // CraftBukkit start - Use wall time instead of ticks for cooking - int elapsedTicks = MinecraftServer.currentTick - this.lastTick; - this.lastTick = MinecraftServer.currentTick; - - // CraftBukkit - moved from below - if (this.isBurning() && this.canBurn()) { - this.cookTime += elapsedTicks; - if (this.cookTime >= 200) { - this.cookTime %= 200; - this.burn(); - flag1 = true; - } - } else { - this.cookTime = 0; - } - // CraftBukkit end - - if (this.burnTime > 0) { - this.burnTime -= elapsedTicks; // CraftBukkit - use elapsedTicks in place of constant - } - - if (!this.world.isStatic) { - if (this.burnTime != 0 || this.items[1] != null && this.items[0] != null) { - // CraftBukkit start - Handle multiple elapsed ticks - if (this.burnTime <= 0 && this.canBurn()) { // CraftBukkit - == to <= - CraftItemStack fuel = CraftItemStack.asCraftMirror(this.items[1]); - - FurnaceBurnEvent furnaceBurnEvent = new FurnaceBurnEvent(this.world.getWorld().getBlockAt(this.x, this.y, this.z), fuel, fuelTime(this.items[1])); - this.world.getServer().getPluginManager().callEvent(furnaceBurnEvent); - - if (furnaceBurnEvent.isCancelled()) { - return; - } - - this.ticksForCurrentFuel = furnaceBurnEvent.getBurnTime(); - this.burnTime += this.ticksForCurrentFuel; - if (this.burnTime > 0 && furnaceBurnEvent.isBurning()) { - // CraftBukkit end - flag1 = true; - if (this.items[1] != null) { - --this.items[1].count; - if (this.items[1].count == 0) { - Item item = this.items[1].getItem().t(); - - this.items[1] = item != null ? new ItemStack(item) : null; - } - } - } - } - - /* CraftBukkit start - Moved up - if (this.isBurning() && this.canBurn()) { - ++this.cookTime; - if (this.cookTime == 200) { - this.cookTime = 0; - this.burn(); - flag1 = true; - } - } else { - this.cookTime = 0; - } - */ - } - - if (flag != this.burnTime > 0) { - flag1 = true; - BlockFurnace.a(this.burnTime > 0, this.world, this.x, this.y, this.z); - } - } - - if (flag1) { - this.update(); - } - } - - private boolean canBurn() { - if (this.items[0] == null) { - return false; - } else { - ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); - - // CraftBukkit - consider resultant count instead of current count - return itemstack == null ? false : (this.items[2] == null ? true : (!this.items[2].doMaterialsMatch(itemstack) ? false : (this.items[2].count + itemstack.count <= this.getMaxStackSize() && this.items[2].count < this.items[2].getMaxStackSize() ? true : this.items[2].count + itemstack.count <= itemstack.getMaxStackSize()))); - } - } - - public void burn() { - if (this.canBurn()) { - ItemStack itemstack = RecipesFurnace.getInstance().getResult(this.items[0]); - - // CraftBukkit start - fire FurnaceSmeltEvent - CraftItemStack source = CraftItemStack.asCraftMirror(this.items[0]); - org.bukkit.inventory.ItemStack result = CraftItemStack.asBukkitCopy(itemstack); - - FurnaceSmeltEvent furnaceSmeltEvent = new FurnaceSmeltEvent(this.world.getWorld().getBlockAt(this.x, this.y, this.z), source, result); - this.world.getServer().getPluginManager().callEvent(furnaceSmeltEvent); - - if (furnaceSmeltEvent.isCancelled()) { - return; - } - - result = furnaceSmeltEvent.getResult(); - itemstack = CraftItemStack.asNMSCopy(result); - - if (itemstack != null) { - if (this.items[2] == null) { - this.items[2] = itemstack; - } else if (CraftItemStack.asCraftMirror(this.items[2]).isSimilar(result)) { - this.items[2].count += itemstack.count; - } else { - return; - } - } - // CraftBukkit end - - --this.items[0].count; - if (this.items[0].count <= 0) { - this.items[0] = null; - } - } - } - - public static int fuelTime(ItemStack itemstack) { - if (itemstack == null) { - return 0; - } else { - Item item = itemstack.getItem(); - - if (item instanceof ItemBlock && Block.a(item) != Blocks.AIR) { - Block block = Block.a(item); - - if (block == Blocks.WOOD_STEP) { - return 150; - } - - if (block.getMaterial() == Material.WOOD) { - return 300; - } - - if (block == Blocks.COAL_BLOCK) { - return 16000; - } - } - - return item instanceof ItemTool && ((ItemTool) item).j().equals("WOOD") ? 200 : (item instanceof ItemSword && ((ItemSword) item).j().equals("WOOD") ? 200 : (item instanceof ItemHoe && ((ItemHoe) item).i().equals("WOOD") ? 200 : (item == Items.STICK ? 100 : (item == Items.COAL ? 1600 : (item == Items.LAVA_BUCKET ? 20000 : (item == Item.getItemOf(Blocks.SAPLING) ? 100 : (item == Items.BLAZE_ROD ? 2400 : 0))))))); - } - } - - public static boolean isFuel(ItemStack itemstack) { - return fuelTime(itemstack) > 0; - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return i == 2 ? false : (i == 1 ? isFuel(itemstack) : true); - } - - public int[] getSlotsForFace(int i) { - return i == 0 ? l : (i == 1 ? k : m); - } - - public boolean canPlaceItemThroughFace(int i, ItemStack itemstack, int j) { - return this.b(i, itemstack); - } - - public boolean canTakeItemThroughFace(int i, ItemStack itemstack, int j) { - return j != 0 || i != 1 || itemstack.getItem() == Items.BUCKET; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java deleted file mode 100644 index ebdf08e7..00000000 --- a/src/main/java/net/minecraft/server/TileEntityHopper.java +++ /dev/null @@ -1,584 +0,0 @@ -package net.minecraft.server; - -import java.util.List; - -// CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftHumanEntity; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.entity.HumanEntity; -import org.bukkit.event.inventory.InventoryMoveItemEvent; -import org.bukkit.event.inventory.InventoryPickupItemEvent; -import org.bukkit.inventory.Inventory; -// CraftBukkit end - -public class TileEntityHopper extends TileEntity implements IHopper { - - private ItemStack[] a = new ItemStack[5]; - private String i; - private int j = -1; - - // CraftBukkit start - add fields and methods - public List<HumanEntity> transaction = new java.util.ArrayList<HumanEntity>(); - private int maxStack = MAX_STACK; - - public ItemStack[] getContents() { - return this.a; - } - - public void onOpen(CraftHumanEntity who) { - transaction.add(who); - } - - public void onClose(CraftHumanEntity who) { - transaction.remove(who); - } - - public List<HumanEntity> getViewers() { - return transaction; - } - - public void setMaxStackSize(int size) { - maxStack = size; - } - // CraftBukkit end - - public TileEntityHopper() {} - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - NBTTagList nbttaglist = nbttagcompound.getList("Items", 10); - - this.a = new ItemStack[this.getSize()]; - if (nbttagcompound.hasKeyOfType("CustomName", 8)) { - this.i = nbttagcompound.getString("CustomName"); - } - - this.j = nbttagcompound.getInt("TransferCooldown"); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - byte b0 = nbttagcompound1.getByte("Slot"); - - if (b0 >= 0 && b0 < this.a.length) { - this.a[b0] = ItemStack.createStack(nbttagcompound1); - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - NBTTagList nbttaglist = new NBTTagList(); - - for (int i = 0; i < this.a.length; ++i) { - if (this.a[i] != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setByte("Slot", (byte) i); - this.a[i].save(nbttagcompound1); - nbttaglist.add(nbttagcompound1); - } - } - - nbttagcompound.set("Items", nbttaglist); - nbttagcompound.setInt("TransferCooldown", this.j); - if (this.k_()) { - nbttagcompound.setString("CustomName", this.i); - } - } - - public void update() { - super.update(); - } - - public int getSize() { - return this.a.length; - } - - public ItemStack getItem(int i) { - return this.a[i]; - } - - public ItemStack splitStack(int i, int j) { - if (this.a[i] != null) { - ItemStack itemstack; - - if (this.a[i].count <= j) { - itemstack = this.a[i]; - this.a[i] = null; - return itemstack; - } else { - itemstack = this.a[i].a(j); - if (this.a[i].count == 0) { - this.a[i] = null; - } - - return itemstack; - } - } else { - return null; - } - } - - public ItemStack splitWithoutUpdate(int i) { - if (this.a[i] != null) { - ItemStack itemstack = this.a[i]; - - this.a[i] = null; - return itemstack; - } else { - return null; - } - } - - public void setItem(int i, ItemStack itemstack) { - this.a[i] = itemstack; - if (itemstack != null && itemstack.count > this.getMaxStackSize()) { - itemstack.count = this.getMaxStackSize(); - } - } - - public String getInventoryName() { - return this.k_() ? this.i : "container.hopper"; - } - - public boolean k_() { - return this.i != null && this.i.length() > 0; - } - - public void a(String s) { - this.i = s; - } - - public int getMaxStackSize() { - return maxStack; // CraftBukkit - } - - public boolean a(EntityHuman entityhuman) { - return this.world.getTileEntity(this.x, this.y, this.z) != this ? false : entityhuman.e((double) this.x + 0.5D, (double) this.y + 0.5D, (double) this.z + 0.5D) <= 64.0D; - } - - public void startOpen() {} - - public void closeContainer() {} - - public boolean b(int i, ItemStack itemstack) { - return true; - } - - public void h() { - if (this.world != null && !this.world.isStatic) { - --this.j; - if (!this.j()) { - this.c(0); - this.i(); - } - } - } - - public boolean i() { - if (this.world != null && !this.world.isStatic) { - if (!this.j() && BlockHopper.c(this.p())) { - boolean flag = false; - - if (!this.k()) { - flag = this.y(); - } - - if (!this.l()) { - flag = suckInItems(this) || flag; - } - - if (flag) { - this.c(8); - this.update(); - return true; - } - } - - return false; - } else { - return false; - } - } - - private boolean k() { - ItemStack[] aitemstack = this.a; - int i = aitemstack.length; - - for (int j = 0; j < i; ++j) { - ItemStack itemstack = aitemstack[j]; - - if (itemstack != null) { - return false; - } - } - - return true; - } - - private boolean l() { - ItemStack[] aitemstack = this.a; - int i = aitemstack.length; - - for (int j = 0; j < i; ++j) { - ItemStack itemstack = aitemstack[j]; - - if (itemstack == null || itemstack.count != itemstack.getMaxStackSize()) { - return false; - } - } - - return true; - } - - private boolean y() { - IInventory iinventory = this.z(); - - if (iinventory == null) { - return false; - } else { - int i = Facing.OPPOSITE_FACING[BlockHopper.b(this.p())]; - - if (this.a(iinventory, i)) { - return false; - } else { - for (int j = 0; j < this.getSize(); ++j) { - if (this.getItem(j) != null) { - ItemStack itemstack = this.getItem(j).cloneItemStack(); - // CraftBukkit start - Call event when pushing items into other inventories - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(this.splitStack(j, 1)); - - Inventory destinationInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - destinationInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - destinationInventory = iinventory.getOwner().getInventory(); - } - - InventoryMoveItemEvent event = new InventoryMoveItemEvent(this.getOwner().getInventory(), oitemstack.clone(), destinationInventory, true); - this.getWorld().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - this.setItem(j, itemstack); - this.c(8); // Delay hopper checks - return false; - } - ItemStack itemstack1 = addItem(iinventory, CraftItemStack.asNMSCopy(event.getItem()), i); - - if (itemstack1 == null || itemstack1.count == 0) { - if (event.getItem().equals(oitemstack)) { - iinventory.update(); - } else { - this.setItem(j, itemstack); - } - // CraftBukkit end - return true; - } - - this.setItem(j, itemstack); - } - } - - return false; - } - } - } - - private boolean a(IInventory iinventory, int i) { - if (iinventory instanceof IWorldInventory && i > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(i); - - for (int j = 0; j < aint.length; ++j) { - ItemStack itemstack = iworldinventory.getItem(aint[j]); - - if (itemstack == null || itemstack.count != itemstack.getMaxStackSize()) { - return false; - } - } - } else { - int k = iinventory.getSize(); - - for (int l = 0; l < k; ++l) { - ItemStack itemstack1 = iinventory.getItem(l); - - if (itemstack1 == null || itemstack1.count != itemstack1.getMaxStackSize()) { - return false; - } - } - } - - return true; - } - - private static boolean b(IInventory iinventory, int i) { - if (iinventory instanceof IWorldInventory && i > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(i); - - for (int j = 0; j < aint.length; ++j) { - if (iworldinventory.getItem(aint[j]) != null) { - return false; - } - } - } else { - int k = iinventory.getSize(); - - for (int l = 0; l < k; ++l) { - if (iinventory.getItem(l) != null) { - return false; - } - } - } - - return true; - } - - public static boolean suckInItems(IHopper ihopper) { - IInventory iinventory = getSourceInventory(ihopper); - - if (iinventory != null) { - byte b0 = 0; - - if (b(iinventory, b0)) { - return false; - } - - if (iinventory instanceof IWorldInventory && b0 > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(b0); - - for (int i = 0; i < aint.length; ++i) { - if (tryTakeInItemFromSlot(ihopper, iinventory, aint[i], b0)) { - return true; - } - } - } else { - int j = iinventory.getSize(); - - for (int k = 0; k < j; ++k) { - if (tryTakeInItemFromSlot(ihopper, iinventory, k, b0)) { - return true; - } - } - } - } else { - EntityItem entityitem = getEntityItemAt(ihopper.getWorld(), ihopper.x(), ihopper.aD() + 1.0D, ihopper.aE()); - - if (entityitem != null) { - return addEntityItem(ihopper, entityitem); - } - } - - return false; - } - - private static boolean tryTakeInItemFromSlot(IHopper ihopper, IInventory iinventory, int i, int j) { - ItemStack itemstack = iinventory.getItem(i); - - if (itemstack != null && canTakeItemFromInventory(iinventory, itemstack, i, j)) { - ItemStack itemstack1 = itemstack.cloneItemStack(); - // CraftBukkit start - Call event on collection of items from inventories into the hopper - CraftItemStack oitemstack = CraftItemStack.asCraftMirror(iinventory.splitStack(i, 1)); - - Inventory sourceInventory; - // Have to special case large chests as they work oddly - if (iinventory instanceof InventoryLargeChest) { - sourceInventory = new org.bukkit.craftbukkit.inventory.CraftInventoryDoubleChest((InventoryLargeChest) iinventory); - } else { - sourceInventory = iinventory.getOwner().getInventory(); - } - - InventoryMoveItemEvent event = new InventoryMoveItemEvent(sourceInventory, oitemstack.clone(), ihopper.getOwner().getInventory(), false); - - ihopper.getWorld().getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - iinventory.setItem(i, itemstack1); - - if (ihopper instanceof TileEntityHopper) { - ((TileEntityHopper) ihopper).c(8); // Delay hopper checks - } else if (ihopper instanceof EntityMinecartHopper) { - ((EntityMinecartHopper) ihopper).l(4); // Delay hopper minecart checks - } - - return false; - } - ItemStack itemstack2 = addItem(ihopper, CraftItemStack.asNMSCopy(event.getItem()), -1); - - if (itemstack2 == null || itemstack2.count == 0) { - if (event.getItem().equals(oitemstack)) { - iinventory.update(); - } else { - iinventory.setItem(i, itemstack1); - } - // CraftBukkit end - - return true; - } - - iinventory.setItem(i, itemstack1); - } - - return false; - } - - public static boolean addEntityItem(IInventory iinventory, EntityItem entityitem) { - boolean flag = false; - - if (entityitem == null) { - return false; - } else { - // CraftBukkit start - InventoryPickupItemEvent event = new InventoryPickupItemEvent(iinventory.getOwner().getInventory(), (org.bukkit.entity.Item) entityitem.getBukkitEntity()); - entityitem.world.getServer().getPluginManager().callEvent(event); - if (event.isCancelled()) { - return false; - } - // CraftBukkit end - - ItemStack itemstack = entityitem.getItemStack().cloneItemStack(); - ItemStack itemstack1 = addItem(iinventory, itemstack, -1); - - if (itemstack1 != null && itemstack1.count != 0) { - entityitem.setItemStack(itemstack1); - } else { - flag = true; - entityitem.die(); - } - - return flag; - } - } - - public static ItemStack addItem(IInventory iinventory, ItemStack itemstack, int i) { - if (iinventory instanceof IWorldInventory && i > -1) { - IWorldInventory iworldinventory = (IWorldInventory) iinventory; - int[] aint = iworldinventory.getSlotsForFace(i); - - for (int j = 0; j < aint.length && itemstack != null && itemstack.count > 0; ++j) { - itemstack = tryMoveInItem(iinventory, itemstack, aint[j], i); - } - } else { - int k = iinventory.getSize(); - - for (int l = 0; l < k && itemstack != null && itemstack.count > 0; ++l) { - itemstack = tryMoveInItem(iinventory, itemstack, l, i); - } - } - - if (itemstack != null && itemstack.count == 0) { - itemstack = null; - } - - return itemstack; - } - - private static boolean canPlaceItemInInventory(IInventory iinventory, ItemStack itemstack, int i, int j) { - return !iinventory.b(i, itemstack) ? false : !(iinventory instanceof IWorldInventory) || ((IWorldInventory) iinventory).canPlaceItemThroughFace(i, itemstack, j); - } - - private static boolean canTakeItemFromInventory(IInventory iinventory, ItemStack itemstack, int i, int j) { - return !(iinventory instanceof IWorldInventory) || ((IWorldInventory) iinventory).canTakeItemThroughFace(i, itemstack, j); - } - - private static ItemStack tryMoveInItem(IInventory iinventory, ItemStack itemstack, int i, int j) { - ItemStack itemstack1 = iinventory.getItem(i); - - if (canPlaceItemInInventory(iinventory, itemstack, i, j)) { - boolean flag = false; - - if (itemstack1 == null) { - iinventory.setItem(i, itemstack); - itemstack = null; - flag = true; - } else if (canMergeItems(itemstack1, itemstack)) { - int k = itemstack.getMaxStackSize() - itemstack1.count; - int l = Math.min(itemstack.count, k); - - itemstack.count -= l; - itemstack1.count += l; - flag = l > 0; - } - - if (flag) { - if (iinventory instanceof TileEntityHopper) { - ((TileEntityHopper) iinventory).c(8); - iinventory.update(); - } - - iinventory.update(); - } - } - - return itemstack; - } - - private IInventory z() { - int i = BlockHopper.b(this.p()); - - return getInventoryAt(this.getWorld(), (double) (this.x + Facing.b[i]), (double) (this.y + Facing.c[i]), (double) (this.z + Facing.d[i])); - } - - public static IInventory getSourceInventory(IHopper ihopper) { - return getInventoryAt(ihopper.getWorld(), ihopper.x(), ihopper.aD() + 1.0D, ihopper.aE()); - } - - public static EntityItem getEntityItemAt(World world, double d0, double d1, double d2) { - List list = world.a(EntityItem.class, AxisAlignedBB.a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.a); - - return list.size() > 0 ? (EntityItem) list.get(0) : null; - } - - public static IInventory getInventoryAt(World world, double d0, double d1, double d2) { - IInventory iinventory = null; - int i = MathHelper.floor(d0); - int j = MathHelper.floor(d1); - int k = MathHelper.floor(d2); - TileEntity tileentity = world.getTileEntity(i, j, k); - - if (tileentity != null && tileentity instanceof IInventory) { - iinventory = (IInventory) tileentity; - if (iinventory instanceof TileEntityChest) { - Block block = world.getType(i, j, k); - - if (block instanceof BlockChest) { - iinventory = ((BlockChest) block).m(world, i, j, k); - } - } - } - - if (iinventory == null) { - List list = world.getEntities((Entity) null, AxisAlignedBB.a(d0, d1, d2, d0 + 1.0D, d1 + 1.0D, d2 + 1.0D), IEntitySelector.c); - - if (list != null && list.size() > 0) { - iinventory = (IInventory) list.get(world.random.nextInt(list.size())); - } - } - - return iinventory; - } - - private static boolean canMergeItems(ItemStack itemstack, ItemStack itemstack1) { - return itemstack.getItem() != itemstack1.getItem() ? false : (itemstack.getData() != itemstack1.getData() ? false : (itemstack.count > itemstack.getMaxStackSize() ? false : ItemStack.equals(itemstack, itemstack1))); - } - - public double x() { - return (double) this.x; - } - - public double aD() { - return (double) this.y; - } - - public double aE() { - return (double) this.z; - } - - public void c(int i) { - this.j = i; - } - - public boolean j() { - return this.j > 0; - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityNote.java b/src/main/java/net/minecraft/server/TileEntityNote.java deleted file mode 100644 index aa020389..00000000 --- a/src/main/java/net/minecraft/server/TileEntityNote.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.minecraft.server; - -public class TileEntityNote extends TileEntity { - - public byte note; - public boolean i; - - public TileEntityNote() {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setByte("note", this.note); - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.note = nbttagcompound.getByte("note"); - if (this.note < 0) { - this.note = 0; - } - - if (this.note > 24) { - this.note = 24; - } - } - - public void a() { - this.note = (byte) ((this.note + 1) % 25); - this.update(); - } - - public void play(World world, int i, int j, int k) { - if (world.getType(i, j + 1, k).getMaterial() == Material.AIR) { - Material material = world.getType(i, j - 1, k).getMaterial(); - byte b0 = 0; - - if (material == Material.STONE) { - b0 = 1; - } - - if (material == Material.SAND) { - b0 = 2; - } - - if (material == Material.SHATTERABLE) { - b0 = 3; - } - - if (material == Material.WOOD) { - b0 = 4; - } - - // CraftBukkit start - org.bukkit.event.block.NotePlayEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callNotePlayEvent(this.world, i, j, k, b0, this.note); - if (!event.isCancelled()) { - this.world.playBlockAction(i, j, k, Blocks.NOTE_BLOCK, event.getInstrument().getType(), event.getNote().getId()); - } - // CraftBukkit end - } - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityPiston.java b/src/main/java/net/minecraft/server/TileEntityPiston.java deleted file mode 100644 index 69fe247b..00000000 --- a/src/main/java/net/minecraft/server/TileEntityPiston.java +++ /dev/null @@ -1,132 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -public class TileEntityPiston extends TileEntity { - - private Block a; - private int i; - private int j; - private boolean k; - private boolean l; - private float m; - private float n; - private List o = new ArrayList(); - - public TileEntityPiston() {} - - public TileEntityPiston(Block block, int i, int j, boolean flag, boolean flag1) { - this.a = block; - this.i = i; - this.j = j; - this.k = flag; - this.l = flag1; - } - - public Block a() { - return this.a; - } - - public int p() { - return this.i; - } - - public boolean b() { - return this.k; - } - - public int c() { - return this.j; - } - - public float a(float f) { - if (f > 1.0F) { - f = 1.0F; - } - - return this.n + (this.m - this.n) * f; - } - - private void a(float f, float f1) { - if (this.k) { - f = 1.0F - f; - } else { - --f; - } - - AxisAlignedBB axisalignedbb = Blocks.PISTON_MOVING.a(this.world, this.x, this.y, this.z, this.a, f, this.j); - - if (axisalignedbb != null) { - List list = this.world.getEntities((Entity) null, axisalignedbb); - - if (!list.isEmpty()) { - this.o.addAll(list); - Iterator iterator = this.o.iterator(); - - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - - entity.move((double) (f1 * (float) Facing.b[this.j]), (double) (f1 * (float) Facing.c[this.j]), (double) (f1 * (float) Facing.d[this.j])); - } - - this.o.clear(); - } - } - } - - public void f() { - if (this.n < 1.0F && this.world != null) { - this.n = this.m = 1.0F; - this.world.p(this.x, this.y, this.z); - this.s(); - if (this.world.getType(this.x, this.y, this.z) == Blocks.PISTON_MOVING) { - this.world.setTypeAndData(this.x, this.y, this.z, this.a, this.i, 3); - this.world.e(this.x, this.y, this.z, this.a); - } - } - } - - public void h() { - if (this.world == null) return; // CraftBukkit - - this.n = this.m; - if (this.n >= 1.0F) { - this.a(1.0F, 0.25F); - this.world.p(this.x, this.y, this.z); - this.s(); - if (this.world.getType(this.x, this.y, this.z) == Blocks.PISTON_MOVING) { - this.world.setTypeAndData(this.x, this.y, this.z, this.a, this.i, 3); - this.world.e(this.x, this.y, this.z, this.a); - } - } else { - this.m += 0.5F; - if (this.m >= 1.0F) { - this.m = 1.0F; - } - - if (this.k) { - this.a(this.m, this.m - this.n + 0.0625F); - } - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.a = Block.getById(nbttagcompound.getInt("blockId")); - this.i = nbttagcompound.getInt("blockData"); - this.j = nbttagcompound.getInt("facing"); - this.n = this.m = nbttagcompound.getFloat("progress"); - this.k = nbttagcompound.getBoolean("extending"); - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setInt("blockId", Block.getId(this.a)); - nbttagcompound.setInt("blockData", this.i); - nbttagcompound.setInt("facing", this.j); - nbttagcompound.setFloat("progress", this.n); - nbttagcompound.setBoolean("extending", this.k); - } -} diff --git a/src/main/java/net/minecraft/server/TileEntityRecordPlayer.java b/src/main/java/net/minecraft/server/TileEntityRecordPlayer.java deleted file mode 100644 index 8abeac49..00000000 --- a/src/main/java/net/minecraft/server/TileEntityRecordPlayer.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.minecraft.server; - -public class TileEntityRecordPlayer extends TileEntity { - - private ItemStack record; - - public TileEntityRecordPlayer() {} - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - if (nbttagcompound.hasKeyOfType("RecordItem", 10)) { - this.setRecord(ItemStack.createStack(nbttagcompound.getCompound("RecordItem"))); - } else if (nbttagcompound.getInt("Record") > 0) { - this.setRecord(new ItemStack(Item.getById(nbttagcompound.getInt("Record")), 1, 0)); - } - } - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - if (this.getRecord() != null) { - nbttagcompound.set("RecordItem", this.getRecord().save(new NBTTagCompound())); - nbttagcompound.setInt("Record", Item.getId(this.getRecord().getItem())); - } - } - - public ItemStack getRecord() { - return this.record; - } - - public void setRecord(ItemStack itemstack) { - // CraftBukkit start - There can only be one - if (itemstack != null) { - itemstack.count = 1; - } - // CraftBukkit end - - this.record = itemstack; - this.update(); - } -} diff --git a/src/main/java/net/minecraft/server/TileEntitySign.java b/src/main/java/net/minecraft/server/TileEntitySign.java deleted file mode 100644 index 552919c4..00000000 --- a/src/main/java/net/minecraft/server/TileEntitySign.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.minecraft.server; - -public class TileEntitySign extends TileEntity { - - public String[] lines = new String[] { "", "", "", ""}; - public int i = -1; - public boolean isEditable = true; // CraftBukkit - private -> public - private EntityHuman k; - - public TileEntitySign() {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setString("Text1", this.lines[0]); - nbttagcompound.setString("Text2", this.lines[1]); - nbttagcompound.setString("Text3", this.lines[2]); - nbttagcompound.setString("Text4", this.lines[3]); - } - - public void a(NBTTagCompound nbttagcompound) { - this.isEditable = false; - super.a(nbttagcompound); - - for (int i = 0; i < 4; ++i) { - this.lines[i] = nbttagcompound.getString("Text" + (i + 1)); - if (this.lines[i].length() > 15) { - this.lines[i] = this.lines[i].substring(0, 15); - } - } - } - - public Packet getUpdatePacket() { - String[] astring = sanitizeLines(this.lines); // CraftBukkit - call sign line sanitizer to limit line length - - return new PacketPlayOutUpdateSign(this.x, this.y, this.z, astring); - } - - public boolean a() { - return this.isEditable; - } - - public void a(EntityHuman entityhuman) { - this.k = entityhuman; - } - - public EntityHuman b() { - return this.k; - } - - // CraftBukkit start - central method to limit sign text to 15 chars per line - public static String[] sanitizeLines(String[] lines) { - String[] astring = new String[4]; - for (int i = 0; i < 4; ++i) { - astring[i] = lines[i]; - - if (lines[i].length() > 15) { - astring[i] = lines[i].substring(0, 15); - } - } - return astring; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/TileEntitySkull.java b/src/main/java/net/minecraft/server/TileEntitySkull.java deleted file mode 100644 index 7c3757fb..00000000 --- a/src/main/java/net/minecraft/server/TileEntitySkull.java +++ /dev/null @@ -1,97 +0,0 @@ -package net.minecraft.server; - -import java.util.UUID; - -import net.minecraft.util.com.google.common.collect.Iterables; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.com.mojang.authlib.properties.Property; - -public class TileEntitySkull extends TileEntity { - - private int a; - private int i; - private GameProfile j = null; - - public TileEntitySkull() {} - - public void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - nbttagcompound.setByte("SkullType", (byte) (this.a & 255)); - nbttagcompound.setByte("Rot", (byte) (this.i & 255)); - if (this.j != null) { - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - GameProfileSerializer.serialize(nbttagcompound1, this.j); - nbttagcompound.set("Owner", nbttagcompound1); - } - } - - public void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - this.a = nbttagcompound.getByte("SkullType"); - this.i = nbttagcompound.getByte("Rot"); - if (this.a == 3) { - if (nbttagcompound.hasKeyOfType("Owner", 10)) { - this.j = GameProfileSerializer.deserialize(nbttagcompound.getCompound("Owner")); - } else if (nbttagcompound.hasKeyOfType("ExtraType", 8) && !UtilColor.b(nbttagcompound.getString("ExtraType"))) { - this.j = new GameProfile((UUID) null, nbttagcompound.getString("ExtraType")); - this.d(); - } - } - } - - public GameProfile getGameProfile() { - return this.j; - } - - public Packet getUpdatePacket() { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - this.b(nbttagcompound); - return new PacketPlayOutTileEntityData(this.x, this.y, this.z, 4, nbttagcompound); - } - - public void setSkullType(int i) { - this.a = i; - this.j = null; - } - - public void setGameProfile(GameProfile gameprofile) { - this.a = 3; - this.j = gameprofile; - this.d(); - } - - private void d() { - if (this.j != null && !UtilColor.b(this.j.getName())) { - if (!this.j.isComplete() || !this.j.getProperties().containsKey("textures")) { - GameProfile gameprofile = MinecraftServer.getServer().getUserCache().getProfile(this.j.getName()); - - if (gameprofile != null) { - Property property = (Property) Iterables.getFirst(gameprofile.getProperties().get("textures"), null); - - if (property == null) { - gameprofile = MinecraftServer.getServer().av().fillProfileProperties(gameprofile, true); - } - - this.j = gameprofile; - this.update(); - } - } - } - } - - public int getSkullType() { - return this.a; - } - - public void setRotation(int i) { - this.i = i; - } - - // CraftBukkit start - add method - public int getRotation() { - return this.i; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/Village.java b/src/main/java/net/minecraft/server/Village.java deleted file mode 100644 index 89f1b74e..00000000 --- a/src/main/java/net/minecraft/server/Village.java +++ /dev/null @@ -1,446 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.TreeMap; - -public class Village { - - private World world; - private final List doors = new ArrayList(); - private final ChunkCoordinates c = new ChunkCoordinates(0, 0, 0); - private final ChunkCoordinates center = new ChunkCoordinates(0, 0, 0); - private int size; - private int f; - private int time; - private int population; - private int noBreedTicks; - private TreeMap playerStandings = new TreeMap(); - private List aggressors = new ArrayList(); - private int ironGolemCount; - - public Village() {} - - public Village(World world) { - this.world = world; - } - - public void a(World world) { - this.world = world; - } - - public void tick(int i) { - this.time = i; - this.m(); - this.l(); - if (i % 20 == 0) { - this.k(); - } - - if (i % 30 == 0) { - this.countPopulation(); - } - - int j = this.population / 10; - - if (this.ironGolemCount < j && this.doors.size() > 20 && this.world.random.nextInt(7000) == 0) { - Vec3D vec3d = this.a(MathHelper.d((float) this.center.x), MathHelper.d((float) this.center.y), MathHelper.d((float) this.center.z), 2, 4, 2); - - if (vec3d != null) { - EntityIronGolem entityirongolem = new EntityIronGolem(this.world); - - entityirongolem.setPosition(vec3d.a, vec3d.b, vec3d.c); - this.world.addEntity(entityirongolem, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_DEFENSE); // CraftBukkit - ++this.ironGolemCount; - } - } - } - - private Vec3D a(int i, int j, int k, int l, int i1, int j1) { - for (int k1 = 0; k1 < 10; ++k1) { - int l1 = i + this.world.random.nextInt(16) - 8; - int i2 = j + this.world.random.nextInt(6) - 3; - int j2 = k + this.world.random.nextInt(16) - 8; - - if (this.a(l1, i2, j2) && this.b(l1, i2, j2, l, i1, j1)) { - return Vec3D.a((double) l1, (double) i2, (double) j2); - } - } - - return null; - } - - private boolean b(int i, int j, int k, int l, int i1, int j1) { - if (!World.a((IBlockAccess) this.world, i, j - 1, k)) { - return false; - } else { - int k1 = i - l / 2; - int l1 = k - j1 / 2; - - for (int i2 = k1; i2 < k1 + l; ++i2) { - for (int j2 = j; j2 < j + i1; ++j2) { - for (int k2 = l1; k2 < l1 + j1; ++k2) { - if (this.world.getType(i2, j2, k2).r()) { - return false; - } - } - } - } - - return true; - } - } - - private void countPopulation() { - List list = this.world.a(EntityIronGolem.class, AxisAlignedBB.a((double) (this.center.x - this.size), (double) (this.center.y - 4), (double) (this.center.z - this.size), (double) (this.center.x + this.size), (double) (this.center.y + 4), (double) (this.center.z + this.size))); - - this.ironGolemCount = list.size(); - } - - private void k() { - List list = this.world.a(EntityVillager.class, AxisAlignedBB.a((double) (this.center.x - this.size), (double) (this.center.y - 4), (double) (this.center.z - this.size), (double) (this.center.x + this.size), (double) (this.center.y + 4), (double) (this.center.z + this.size))); - - this.population = list.size(); - if (this.population == 0) { - this.playerStandings.clear(); - } - } - - public ChunkCoordinates getCenter() { - return this.center; - } - - public int getSize() { - return this.size; - } - - public int getDoorCount() { - return this.doors.size(); - } - - public int d() { - return this.time - this.f; - } - - public int getPopulationCount() { - return this.population; - } - - public boolean a(int i, int j, int k) { - return this.center.e(i, j, k) < (float) (this.size * this.size); - } - - public List getDoors() { - return this.doors; - } - - public VillageDoor b(int i, int j, int k) { - VillageDoor villagedoor = null; - int l = Integer.MAX_VALUE; - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor1 = (VillageDoor) iterator.next(); - int i1 = villagedoor1.b(i, j, k); - - if (i1 < l) { - villagedoor = villagedoor1; - l = i1; - } - } - - return villagedoor; - } - - public VillageDoor c(int i, int j, int k) { - VillageDoor villagedoor = null; - int l = Integer.MAX_VALUE; - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor1 = (VillageDoor) iterator.next(); - int i1 = villagedoor1.b(i, j, k); - - if (i1 > 256) { - i1 *= 1000; - } else { - i1 = villagedoor1.f(); - } - - if (i1 < l) { - villagedoor = villagedoor1; - l = i1; - } - } - - return villagedoor; - } - - public VillageDoor e(int i, int j, int k) { - if (this.center.e(i, j, k) > (float) (this.size * this.size)) { - return null; - } else { - Iterator iterator = this.doors.iterator(); - - VillageDoor villagedoor; - - do { - if (!iterator.hasNext()) { - return null; - } - - villagedoor = (VillageDoor) iterator.next(); - } while (villagedoor.locX != i || villagedoor.locZ != k || Math.abs(villagedoor.locY - j) > 1); - - return villagedoor; - } - } - - public void addDoor(VillageDoor villagedoor) { - this.doors.add(villagedoor); - this.c.x += villagedoor.locX; - this.c.y += villagedoor.locY; - this.c.z += villagedoor.locZ; - this.n(); - this.f = villagedoor.addedTime; - } - - public boolean isAbandoned() { - return this.doors.isEmpty(); - } - - public void a(EntityLiving entityliving) { - Iterator iterator = this.aggressors.iterator(); - - VillageAggressor villageaggressor; - - do { - if (!iterator.hasNext()) { - this.aggressors.add(new VillageAggressor(this, entityliving, this.time)); - return; - } - - villageaggressor = (VillageAggressor) iterator.next(); - } while (villageaggressor.a != entityliving); - - villageaggressor.b = this.time; - } - - public EntityLiving b(EntityLiving entityliving) { - double d0 = Double.MAX_VALUE; - VillageAggressor villageaggressor = null; - - for (int i = 0; i < this.aggressors.size(); ++i) { - VillageAggressor villageaggressor1 = (VillageAggressor) this.aggressors.get(i); - double d1 = villageaggressor1.a.f(entityliving); - - if (d1 <= d0) { - villageaggressor = villageaggressor1; - d0 = d1; - } - } - - return villageaggressor != null ? villageaggressor.a : null; - } - - public EntityHuman c(EntityLiving entityliving) { - double d0 = Double.MAX_VALUE; - EntityHuman entityhuman = null; - Iterator iterator = this.playerStandings.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - if (this.d(s)) { - EntityHuman entityhuman1 = this.world.a(s); - - if (entityhuman1 != null) { - double d1 = entityhuman1.f(entityliving); - - if (d1 <= d0) { - entityhuman = entityhuman1; - d0 = d1; - } - } - } - } - - return entityhuman; - } - - private void l() { - Iterator iterator = this.aggressors.iterator(); - - while (iterator.hasNext()) { - VillageAggressor villageaggressor = (VillageAggressor) iterator.next(); - - if (!villageaggressor.a.isAlive() || Math.abs(this.time - villageaggressor.b) > 300) { - iterator.remove(); - } - } - } - - private void m() { - boolean flag = false; - boolean flag1 = this.world.random.nextInt(50) == 0; - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor = (VillageDoor) iterator.next(); - - if (flag1) { - villagedoor.d(); - } - - if (!this.isDoor(villagedoor.locX, villagedoor.locY, villagedoor.locZ) || Math.abs(this.time - villagedoor.addedTime) > 1200) { - this.c.x -= villagedoor.locX; - this.c.y -= villagedoor.locY; - this.c.z -= villagedoor.locZ; - flag = true; - villagedoor.removed = true; - iterator.remove(); - } - } - - if (flag) { - this.n(); - } - } - - private boolean isDoor(int i, int j, int k) { - return this.world.getType(i, j, k) == Blocks.WOODEN_DOOR; - } - - private void n() { - int i = this.doors.size(); - - if (i == 0) { - this.center.b(0, 0, 0); - this.size = 0; - } else { - this.center.b(this.c.x / i, this.c.y / i, this.c.z / i); - int j = 0; - - VillageDoor villagedoor; - - for (Iterator iterator = this.doors.iterator(); iterator.hasNext(); j = Math.max(villagedoor.b(this.center.x, this.center.y, this.center.z), j)) { - villagedoor = (VillageDoor) iterator.next(); - } - - this.size = Math.max(32, (int) Math.sqrt((double) j) + 1); - } - } - - public int a(String s) { - Integer integer = (Integer) this.playerStandings.get(s); - - return integer != null ? integer.intValue() : 0; - } - - public int a(String s, int i) { - int j = this.a(s); - int k = MathHelper.a(j + i, -30, 10); - - this.playerStandings.put(s, Integer.valueOf(k)); - return k; - } - - public boolean d(String s) { - return this.a(s) <= -15; - } - - public void a(NBTTagCompound nbttagcompound) { - this.population = nbttagcompound.getInt("PopSize"); - this.size = nbttagcompound.getInt("Radius"); - this.ironGolemCount = nbttagcompound.getInt("Golems"); - this.f = nbttagcompound.getInt("Stable"); - this.time = nbttagcompound.getInt("Tick"); - this.noBreedTicks = nbttagcompound.getInt("MTick"); - this.center.x = nbttagcompound.getInt("CX"); - this.center.y = nbttagcompound.getInt("CY"); - this.center.z = nbttagcompound.getInt("CZ"); - this.c.x = nbttagcompound.getInt("ACX"); - this.c.y = nbttagcompound.getInt("ACY"); - this.c.z = nbttagcompound.getInt("ACZ"); - NBTTagList nbttaglist = nbttagcompound.getList("Doors", 10); - - for (int i = 0; i < nbttaglist.size(); ++i) { - NBTTagCompound nbttagcompound1 = nbttaglist.get(i); - VillageDoor villagedoor = new VillageDoor(nbttagcompound1.getInt("X"), nbttagcompound1.getInt("Y"), nbttagcompound1.getInt("Z"), nbttagcompound1.getInt("IDX"), nbttagcompound1.getInt("IDZ"), nbttagcompound1.getInt("TS")); - - this.doors.add(villagedoor); - } - - NBTTagList nbttaglist1 = nbttagcompound.getList("Players", 10); - - for (int j = 0; j < nbttaglist1.size(); ++j) { - NBTTagCompound nbttagcompound2 = nbttaglist1.get(j); - - this.playerStandings.put(nbttagcompound2.getString("Name"), Integer.valueOf(nbttagcompound2.getInt("S"))); - } - } - - public void b(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("PopSize", this.population); - nbttagcompound.setInt("Radius", this.size); - nbttagcompound.setInt("Golems", this.ironGolemCount); - nbttagcompound.setInt("Stable", this.f); - nbttagcompound.setInt("Tick", this.time); - nbttagcompound.setInt("MTick", this.noBreedTicks); - nbttagcompound.setInt("CX", this.center.x); - nbttagcompound.setInt("CY", this.center.y); - nbttagcompound.setInt("CZ", this.center.z); - nbttagcompound.setInt("ACX", this.c.x); - nbttagcompound.setInt("ACY", this.c.y); - nbttagcompound.setInt("ACZ", this.c.z); - NBTTagList nbttaglist = new NBTTagList(); - Iterator iterator = this.doors.iterator(); - - while (iterator.hasNext()) { - VillageDoor villagedoor = (VillageDoor) iterator.next(); - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.setInt("X", villagedoor.locX); - nbttagcompound1.setInt("Y", villagedoor.locY); - nbttagcompound1.setInt("Z", villagedoor.locZ); - nbttagcompound1.setInt("IDX", villagedoor.d); - nbttagcompound1.setInt("IDZ", villagedoor.e); - nbttagcompound1.setInt("TS", villagedoor.addedTime); - nbttaglist.add(nbttagcompound1); - } - - nbttagcompound.set("Doors", nbttaglist); - NBTTagList nbttaglist1 = new NBTTagList(); - Iterator iterator1 = this.playerStandings.keySet().iterator(); - - while (iterator1.hasNext()) { - String s = (String) iterator1.next(); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - nbttagcompound2.setString("Name", s); - nbttagcompound2.setInt("S", ((Integer) this.playerStandings.get(s)).intValue()); - nbttaglist1.add(nbttagcompound2); - } - - nbttagcompound.set("Players", nbttaglist1); - } - - public void h() { - this.noBreedTicks = this.time; - } - - public boolean i() { - return this.noBreedTicks == 0 || this.time - this.noBreedTicks >= 3600; - } - - public void b(int i) { - Iterator iterator = this.playerStandings.keySet().iterator(); - - while (iterator.hasNext()) { - String s = (String) iterator.next(); - - this.a(s, i); - } - } -} diff --git a/src/main/java/net/minecraft/server/VillageSiege.java b/src/main/java/net/minecraft/server/VillageSiege.java deleted file mode 100644 index 93e1a1ed..00000000 --- a/src/main/java/net/minecraft/server/VillageSiege.java +++ /dev/null @@ -1,172 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; -import java.util.List; - -public class VillageSiege { - - private World world; - private boolean b; - private int c = -1; - private int d; - private int e; - private Village f; - private int g; - private int h; - private int i; - - public VillageSiege(World world) { - this.world = world; - } - - public void a() { - boolean flag = false; - - if (flag) { - if (this.c == 2) { - this.d = 100; - return; - } - } else { - if (this.world.w()) { - this.c = 0; - return; - } - - if (this.c == 2) { - return; - } - - if (this.c == 0) { - float f = this.world.c(0.0F); - - if ((double) f < 0.5D || (double) f > 0.501D) { - return; - } - - this.c = this.world.random.nextInt(10) == 0 ? 1 : 2; - this.b = false; - if (this.c == 2) { - return; - } - } - } - - if (!this.b) { - if (!this.b()) { - return; - } - - this.b = true; - } - - if (this.e > 0) { - --this.e; - } else { - this.e = 2; - if (this.d > 0) { - this.c(); - --this.d; - } else { - this.c = 2; - } - } - } - - private boolean b() { - List list = this.world.players; - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - this.f = this.world.villages.getClosestVillage((int) entityhuman.locX, (int) entityhuman.locY, (int) entityhuman.locZ, 1); - if (this.f != null && this.f.getDoorCount() >= 10 && this.f.d() >= 20 && this.f.getPopulationCount() >= 20) { - ChunkCoordinates chunkcoordinates = this.f.getCenter(); - float f = (float) this.f.getSize(); - boolean flag = false; - int i = 0; - - while (true) { - if (i < 10) { - this.g = chunkcoordinates.x + (int) ((double) (MathHelper.cos(this.world.random.nextFloat() * 3.1415927F * 2.0F) * f) * 0.9D); - this.h = chunkcoordinates.y; - this.i = chunkcoordinates.z + (int) ((double) (MathHelper.sin(this.world.random.nextFloat() * 3.1415927F * 2.0F) * f) * 0.9D); - flag = false; - Iterator iterator1 = this.world.villages.getVillages().iterator(); - - while (iterator1.hasNext()) { - Village village = (Village) iterator1.next(); - - if (village != this.f && village.a(this.g, this.h, this.i)) { - flag = true; - break; - } - } - - if (flag) { - ++i; - continue; - } - } - - if (flag) { - return false; - } - - Vec3D vec3d = this.a(this.g, this.h, this.i); - - if (vec3d != null) { - this.e = 0; - this.d = 20; - return true; - } - break; - } - } - } - - return false; - } - - private boolean c() { - Vec3D vec3d = this.a(this.g, this.h, this.i); - - if (vec3d == null) { - return false; - } else { - EntityZombie entityzombie; - - try { - entityzombie = new EntityZombie(this.world); - entityzombie.prepare((GroupDataEntity) null); - entityzombie.setVillager(false); - } catch (Exception exception) { - exception.printStackTrace(); - return false; - } - - entityzombie.setPositionRotation(vec3d.a, vec3d.b, vec3d.c, this.world.random.nextFloat() * 360.0F, 0.0F); - this.world.addEntity(entityzombie, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.VILLAGE_INVASION); // CraftBukkit - ChunkCoordinates chunkcoordinates = this.f.getCenter(); - - entityzombie.a(chunkcoordinates.x, chunkcoordinates.y, chunkcoordinates.z, this.f.getSize()); - return true; - } - } - - private Vec3D a(int i, int j, int k) { - for (int l = 0; l < 10; ++l) { - int i1 = i + this.world.random.nextInt(16) - 8; - int j1 = j + this.world.random.nextInt(6) - 3; - int k1 = k + this.world.random.nextInt(16) - 8; - - if (this.f.a(i1, j1, k1) && SpawnerCreature.a(EnumCreatureType.MONSTER, this.world, i1, j1, k1)) { - // CraftBukkit - add Return - return Vec3D.a((double) i1, (double) j1, (double) k1); - } - } - - return null; - } -} diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java deleted file mode 100644 index 08c506ce..00000000 --- a/src/main/java/net/minecraft/server/World.java +++ /dev/null @@ -1,2873 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.Callable; - -// CraftBukkit start -import org.bukkit.Bukkit; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; -import org.bukkit.craftbukkit.util.LongHashSet; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.event.CraftEventFactory; -import org.bukkit.event.block.BlockCanBuildEvent; -import org.bukkit.event.block.BlockPhysicsEvent; -import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; -import org.bukkit.event.weather.WeatherChangeEvent; -import org.bukkit.event.weather.ThunderChangeEvent; -// CraftBukkit end - -public abstract class World implements IBlockAccess { - - public boolean d; - public List entityList = new ArrayList(); - protected List f = new ArrayList(); - public Set tileEntityList = new HashSet(); // CraftBukkit - ArrayList -> HashSet - private List a = new ArrayList(); - private List b = new ArrayList(); - public List players = new ArrayList(); - public List i = new ArrayList(); - private long c = 16777215L; - public int j; - protected int k = (new Random()).nextInt(); - protected final int l = 1013904223; - protected float m; - protected float n; - protected float o; - protected float p; - public int q; - public EnumDifficulty difficulty; - public Random random = new Random(); - public WorldProvider worldProvider; // CraftBukkit - remove final - protected List u = new ArrayList(); - public IChunkProvider chunkProvider; // CraftBukkit - public - protected final IDataManager dataManager; - public WorldData worldData; // CraftBukkit - public - public boolean isLoading; - public PersistentCollection worldMaps; - public final PersistentVillage villages; - protected final VillageSiege siegeManager = new VillageSiege(this); - public final MethodProfiler methodProfiler; - private final Calendar J = Calendar.getInstance(); - public Scoreboard scoreboard = new Scoreboard(); // CraftBukkit - protected -> public - public boolean isStatic; - // CraftBukkit start - public, longhashset - protected LongHashSet chunkTickList = new LongHashSet(); - private int K; - public boolean allowMonsters; - public boolean allowAnimals; - // Added the following - public boolean captureBlockStates = false; - public boolean captureTreeGeneration = false; - public ArrayList<BlockState> capturedBlockStates= new ArrayList<BlockState>(); - public long ticksPerAnimalSpawns; - public long ticksPerMonsterSpawns; - public boolean populating; - private int tickPosition; - // CraftBukkit end - private ArrayList L; - private boolean M; - int[] I; - - public BiomeBase getBiome(int i, int j) { - if (this.isLoaded(i, 0, j)) { - Chunk chunk = this.getChunkAtWorldCoords(i, j); - - try { - return chunk.getBiome(i & 15, j & 15, this.worldProvider.e); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Getting biome"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Coordinates of biome request"); - - crashreportsystemdetails.a("Location", (Callable) (new CrashReportWorldLocation(this, i, j))); - throw new ReportedException(crashreport); - } - } else { - return this.worldProvider.e.getBiome(i, j); - } - } - - public WorldChunkManager getWorldChunkManager() { - return this.worldProvider.e; - } - - // CraftBukkit start - private final CraftWorld world; - public boolean pvpMode; - public boolean keepSpawnInMemory = true; - public ChunkGenerator generator; - - public CraftWorld getWorld() { - return this.world; - } - - public CraftServer getServer() { - return (CraftServer) Bukkit.getServer(); - } - - public Chunk getChunkIfLoaded(int x, int z) { - return ((ChunkProviderServer) this.chunkProvider).getChunkIfLoaded(x, z); - } - - // Changed signature - added gen and env - public World(IDataManager idatamanager, String s, WorldSettings worldsettings, WorldProvider worldprovider, MethodProfiler methodprofiler, ChunkGenerator gen, org.bukkit.World.Environment env) { - this.generator = gen; - this.world = new CraftWorld((WorldServer) this, gen, env); - this.ticksPerAnimalSpawns = this.getServer().getTicksPerAnimalSpawns(); // CraftBukkit - this.ticksPerMonsterSpawns = this.getServer().getTicksPerMonsterSpawns(); // CraftBukkit - // CraftBukkit end - - this.K = this.random.nextInt(12000); - this.allowMonsters = true; - this.allowAnimals = true; - this.L = new ArrayList(); - this.I = new int['\u8000']; - this.dataManager = idatamanager; - this.methodProfiler = methodprofiler; - this.worldMaps = new PersistentCollection(idatamanager); - this.worldData = idatamanager.getWorldData(); - if (worldprovider != null) { - this.worldProvider = worldprovider; - } else if (this.worldData != null && this.worldData.j() != 0) { - this.worldProvider = WorldProvider.byDimension(this.worldData.j()); - } else { - this.worldProvider = WorldProvider.byDimension(0); - } - - if (this.worldData == null) { - this.worldData = new WorldData(worldsettings, s); - } else { - this.worldData.setName(s); - } - - this.worldProvider.a(this); - this.chunkProvider = this.j(); - if (!this.worldData.isInitialized()) { - try { - this.a(worldsettings); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception initializing level"); - - try { - this.a(crashreport); - } catch (Throwable throwable1) { - ; - } - - throw new ReportedException(crashreport); - } - - this.worldData.d(true); - } - - PersistentVillage persistentvillage = (PersistentVillage) this.worldMaps.get(PersistentVillage.class, "villages"); - - if (persistentvillage == null) { - this.villages = new PersistentVillage(this); - this.worldMaps.a("villages", this.villages); - } else { - this.villages = persistentvillage; - this.villages.a(this); - } - - this.B(); - this.a(); - - this.getServer().addWorld(this.world); // CraftBukkit - } - - protected abstract IChunkProvider j(); - - protected void a(WorldSettings worldsettings) { - this.worldData.d(true); - } - - public Block b(int i, int j) { - int k; - - for (k = 63; !this.isEmpty(i, k + 1, j); ++k) { - ; - } - - return this.getType(i, k, j); - } - - public Block getType(int i, int j, int k) { - // CraftBukkit start - tree generation - if (captureTreeGeneration) { - Iterator<BlockState> it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - return CraftMagicNumbers.getBlock(previous.getTypeId()); - } - } - } - // CraftBukkit end - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000 && j >= 0 && j < 256) { - Chunk chunk = null; - - try { - chunk = this.getChunkAt(i >> 4, k >> 4); - return chunk.getType(i & 15, j, k & 15); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception getting block type in world"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Requested block coordinates"); - - crashreportsystemdetails.a("Found chunk", Boolean.valueOf(chunk == null)); - crashreportsystemdetails.a("Location", CrashReportSystemDetails.a(i, j, k)); - throw new ReportedException(crashreport); - } - } else { - return Blocks.AIR; - } - } - - public boolean isEmpty(int i, int j, int k) { - return this.getType(i, j, k).getMaterial() == Material.AIR; - } - - public boolean isLoaded(int i, int j, int k) { - return j >= 0 && j < 256 ? this.isChunkLoaded(i >> 4, k >> 4) : false; - } - - public boolean areChunksLoaded(int i, int j, int k, int l) { - return this.b(i - l, j - l, k - l, i + l, j + l, k + l); - } - - public boolean b(int i, int j, int k, int l, int i1, int j1) { - if (i1 >= 0 && j < 256) { - i >>= 4; - k >>= 4; - l >>= 4; - j1 >>= 4; - - for (int k1 = i; k1 <= l; ++k1) { - for (int l1 = k; l1 <= j1; ++l1) { - if (!this.isChunkLoaded(k1, l1)) { - return false; - } - } - } - - return true; - } else { - return false; - } - } - - protected boolean isChunkLoaded(int i, int j) { - return this.chunkProvider.isChunkLoaded(i, j); - } - - public Chunk getChunkAtWorldCoords(int i, int j) { - return this.getChunkAt(i >> 4, j >> 4); - } - - public Chunk getChunkAt(int i, int j) { - return this.chunkProvider.getOrCreateChunk(i, j); - } - - public boolean setTypeAndData(int i, int j, int k, Block block, int l, int i1) { - // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { - BlockState blockstate = null; - Iterator<BlockState> it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - blockstate = previous; - it.remove(); - break; - } - } - if (blockstate == null) { - blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1); - } - blockstate.setTypeId(CraftMagicNumbers.getId(block)); - blockstate.setRawData((byte) l); - this.capturedBlockStates.add(blockstate); - return true; - } - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j < 0) { - return false; - } else if (j >= 256) { - return false; - } else { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - Block block1 = null; - - if ((i1 & 1) != 0) { - block1 = chunk.getType(i & 15, j, k & 15); - } - - // CraftBukkit start - capture blockstates - BlockState blockstate = null; - if (this.captureBlockStates) { - blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1); - this.capturedBlockStates.add(blockstate); - } - // CraftBukkit end - - boolean flag = chunk.a(i & 15, j, k & 15, block, l); - - // CraftBukkit start - remove blockstate if failed - if (!flag && this.captureBlockStates) { - this.capturedBlockStates.remove(blockstate); - } - // CraftBukkit end - - this.methodProfiler.a("checkLight"); - this.t(i, j, k); - this.methodProfiler.b(); - // CraftBukkit start - if (flag && !this.captureBlockStates) { // Don't notify clients or update physics while capturing blockstates - // Modularize client and physic updates - this.notifyAndUpdatePhysics(i, j, k, chunk, block1, block, i1); - // CraftBukkit end - } - - return flag; - } - } else { - return false; - } - } - - // CraftBukkit start - Split off from original setTypeAndData(int i, int j, int k, Block block, int l, int i1) method in order to directly send client and physic updates - public void notifyAndUpdatePhysics(int i, int j, int k, Chunk chunk, Block oldBlock, Block newBlock, int flag) - { - // should be isReady() - if ((flag & 2) != 0 && (chunk == null || chunk.isReady())) { // allow chunk to be null here as chunk.isReady() is false when we send our notification during block placement - this.notify(i, j, k); - } - - if ((flag & 1) != 0) { - this.update(i, j, k, oldBlock); - if (newBlock.isComplexRedstone()) { - this.updateAdjacentComparators(i, j, k, newBlock); - } - } - } - // CraftBukkit end - - public int getData(int i, int j, int k) { - // CraftBukkit start - tree generation - if (captureTreeGeneration) { - Iterator<BlockState> it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - return previous.getRawData(); - } - } - } - // CraftBukkit end - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j < 0) { - return 0; - } else if (j >= 256) { - return 0; - } else { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - i &= 15; - k &= 15; - return chunk.getData(i, j, k); - } - } else { - return 0; - } - } - - public boolean setData(int i, int j, int k, int l, int i1) { - // CraftBukkit start - tree generation - if (this.captureTreeGeneration) { - BlockState blockstate = null; - Iterator<BlockState> it = capturedBlockStates.iterator(); - while (it.hasNext()) { - BlockState previous = it.next(); - if (previous.getX() == i && previous.getY() == j && previous.getZ() == k) { - blockstate = previous; - it.remove(); - break; - } - } - if (blockstate == null) { - blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(this, i, j, k, i1); - } - blockstate.setRawData((byte) l); - this.capturedBlockStates.add(blockstate); - return true; - } - // CraftBukkit end - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j < 0) { - return false; - } else if (j >= 256) { - return false; - } else { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - int j1 = i & 15; - int k1 = k & 15; - boolean flag = chunk.a(j1, j, k1, l); - - if (flag) { - Block block = chunk.getType(j1, j, k1); - - if ((i1 & 2) != 0 && (!this.isStatic || (i1 & 4) == 0) && chunk.isReady()) { - this.notify(i, j, k); - } - - if (!this.isStatic && (i1 & 1) != 0) { - this.update(i, j, k, block); - if (block.isComplexRedstone()) { - this.updateAdjacentComparators(i, j, k, block); - } - } - } - - return flag; - } - } else { - return false; - } - } - - public boolean setAir(int i, int j, int k) { - return this.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); - } - - public boolean setAir(int i, int j, int k, boolean flag) { - Block block = this.getType(i, j, k); - - if (block.getMaterial() == Material.AIR) { - return false; - } else { - int l = this.getData(i, j, k); - - this.triggerEffect(2001, i, j, k, Block.getId(block) + (l << 12)); - if (flag) { - block.b(this, i, j, k, l, 0); - } - - return this.setTypeAndData(i, j, k, Blocks.AIR, 0, 3); - } - } - - public boolean setTypeUpdate(int i, int j, int k, Block block) { - return this.setTypeAndData(i, j, k, block, 0, 3); - } - - public void notify(int i, int j, int k) { - for (int l = 0; l < this.u.size(); ++l) { - ((IWorldAccess) this.u.get(l)).a(i, j, k); - } - } - - public void update(int i, int j, int k, Block block) { - // CraftBukkit start - if (this.populating) { - return; - } - // CraftBukkit end - this.applyPhysics(i, j, k, block); - } - - public void b(int i, int j, int k, int l) { - int i1; - - if (k > l) { - i1 = l; - l = k; - k = i1; - } - - if (!this.worldProvider.g) { - for (i1 = k; i1 <= l; ++i1) { - this.c(EnumSkyBlock.SKY, i, i1, j); - } - } - - this.c(i, k, j, i, l, j); - } - - public void c(int i, int j, int k, int l, int i1, int j1) { - for (int k1 = 0; k1 < this.u.size(); ++k1) { - ((IWorldAccess) this.u.get(k1)).a(i, j, k, l, i1, j1); - } - } - - public void applyPhysics(int i, int j, int k, Block block) { - this.e(i - 1, j, k, block); - this.e(i + 1, j, k, block); - this.e(i, j - 1, k, block); - this.e(i, j + 1, k, block); - this.e(i, j, k - 1, block); - this.e(i, j, k + 1, block); - } - - public void b(int i, int j, int k, Block block, int l) { - if (l != 4) { - this.e(i - 1, j, k, block); - } - - if (l != 5) { - this.e(i + 1, j, k, block); - } - - if (l != 0) { - this.e(i, j - 1, k, block); - } - - if (l != 1) { - this.e(i, j + 1, k, block); - } - - if (l != 2) { - this.e(i, j, k - 1, block); - } - - if (l != 3) { - this.e(i, j, k + 1, block); - } - } - - public void e(int i, int j, int k, Block block) { - if (!this.isStatic) { - Block block1 = this.getType(i, j, k); - - try { - // CraftBukkit start - CraftWorld world = ((WorldServer) this).getWorld(); - if (world != null) { - BlockPhysicsEvent event = new BlockPhysicsEvent(world.getBlockAt(i, j, k), CraftMagicNumbers.getId(block)); - this.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - } - // CraftBukkit end - - block1.doPhysics(this, i, j, k, block); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception while updating neighbours"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being updated"); - - int l; - - try { - l = this.getData(i, j, k); - } catch (Throwable throwable1) { - l = -1; - } - - crashreportsystemdetails.a("Source block type", (Callable) (new CrashReportSourceBlockType(this, block))); - CrashReportSystemDetails.a(crashreportsystemdetails, i, j, k, block1, l); - throw new ReportedException(crashreport); - } - } - } - - public boolean a(int i, int j, int k, Block block) { - return false; - } - - public boolean i(int i, int j, int k) { - return this.getChunkAt(i >> 4, k >> 4).d(i & 15, j, k & 15); - } - - public int j(int i, int j, int k) { - if (j < 0) { - return 0; - } else { - if (j >= 256) { - j = 255; - } - - return this.getChunkAt(i >> 4, k >> 4).b(i & 15, j, k & 15, 0); - } - } - - public int getLightLevel(int i, int j, int k) { - return this.b(i, j, k, true); - } - - public int b(int i, int j, int k, boolean flag) { - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (flag && this.getType(i, j, k).n()) { - int l = this.b(i, j + 1, k, false); - int i1 = this.b(i + 1, j, k, false); - int j1 = this.b(i - 1, j, k, false); - int k1 = this.b(i, j, k + 1, false); - int l1 = this.b(i, j, k - 1, false); - - if (i1 > l) { - l = i1; - } - - if (j1 > l) { - l = j1; - } - - if (k1 > l) { - l = k1; - } - - if (l1 > l) { - l = l1; - } - - return l; - } else if (j < 0) { - return 0; - } else { - if (j >= 256) { - j = 255; - } - - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - i &= 15; - k &= 15; - return chunk.b(i, j, k, this.j); - } - } else { - return 15; - } - } - - public int getHighestBlockYAt(int i, int j) { - if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) { - if (!this.isChunkLoaded(i >> 4, j >> 4)) { - return 0; - } else { - Chunk chunk = this.getChunkAt(i >> 4, j >> 4); - - return chunk.b(i & 15, j & 15); - } - } else { - return 64; - } - } - - public int g(int i, int j) { - if (i >= -30000000 && j >= -30000000 && i < 30000000 && j < 30000000) { - if (!this.isChunkLoaded(i >> 4, j >> 4)) { - return 0; - } else { - Chunk chunk = this.getChunkAt(i >> 4, j >> 4); - - return chunk.r; - } - } else { - return 64; - } - } - - public int b(EnumSkyBlock enumskyblock, int i, int j, int k) { - if (j < 0) { - j = 0; - } - - if (j >= 256) { - j = 255; - } - - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - int l = i >> 4; - int i1 = k >> 4; - - if (!this.isChunkLoaded(l, i1)) { - return enumskyblock.c; - } else { - Chunk chunk = this.getChunkAt(l, i1); - - return chunk.getBrightness(enumskyblock, i & 15, j, k & 15); - } - } else { - return enumskyblock.c; - } - } - - public void b(EnumSkyBlock enumskyblock, int i, int j, int k, int l) { - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - if (j >= 0) { - if (j < 256) { - if (this.isChunkLoaded(i >> 4, k >> 4)) { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - chunk.a(enumskyblock, i & 15, j, k & 15, l); - - for (int i1 = 0; i1 < this.u.size(); ++i1) { - ((IWorldAccess) this.u.get(i1)).b(i, j, k); - } - } - } - } - } - } - - public void m(int i, int j, int k) { - for (int l = 0; l < this.u.size(); ++l) { - ((IWorldAccess) this.u.get(l)).b(i, j, k); - } - } - - public float n(int i, int j, int k) { - return this.worldProvider.h[this.getLightLevel(i, j, k)]; - } - - public boolean w() { - return this.j < 4; - } - - public MovingObjectPosition a(Vec3D vec3d, Vec3D vec3d1) { - return this.rayTrace(vec3d, vec3d1, false, false, false); - } - - public MovingObjectPosition rayTrace(Vec3D vec3d, Vec3D vec3d1, boolean flag) { - return this.rayTrace(vec3d, vec3d1, flag, false, false); - } - - public MovingObjectPosition rayTrace(Vec3D vec3d, Vec3D vec3d1, boolean flag, boolean flag1, boolean flag2) { - if (!Double.isNaN(vec3d.a) && !Double.isNaN(vec3d.b) && !Double.isNaN(vec3d.c)) { - if (!Double.isNaN(vec3d1.a) && !Double.isNaN(vec3d1.b) && !Double.isNaN(vec3d1.c)) { - int i = MathHelper.floor(vec3d1.a); - int j = MathHelper.floor(vec3d1.b); - int k = MathHelper.floor(vec3d1.c); - int l = MathHelper.floor(vec3d.a); - int i1 = MathHelper.floor(vec3d.b); - int j1 = MathHelper.floor(vec3d.c); - Block block = this.getType(l, i1, j1); - int k1 = this.getData(l, i1, j1); - - if ((!flag1 || block.a(this, l, i1, j1) != null) && block.a(k1, flag)) { - MovingObjectPosition movingobjectposition = block.a(this, l, i1, j1, vec3d, vec3d1); - - if (movingobjectposition != null) { - return movingobjectposition; - } - } - - MovingObjectPosition movingobjectposition1 = null; - - k1 = 200; - - while (k1-- >= 0) { - if (Double.isNaN(vec3d.a) || Double.isNaN(vec3d.b) || Double.isNaN(vec3d.c)) { - return null; - } - - if (l == i && i1 == j && j1 == k) { - return flag2 ? movingobjectposition1 : null; - } - - boolean flag3 = true; - boolean flag4 = true; - boolean flag5 = true; - double d0 = 999.0D; - double d1 = 999.0D; - double d2 = 999.0D; - - if (i > l) { - d0 = (double) l + 1.0D; - } else if (i < l) { - d0 = (double) l + 0.0D; - } else { - flag3 = false; - } - - if (j > i1) { - d1 = (double) i1 + 1.0D; - } else if (j < i1) { - d1 = (double) i1 + 0.0D; - } else { - flag4 = false; - } - - if (k > j1) { - d2 = (double) j1 + 1.0D; - } else if (k < j1) { - d2 = (double) j1 + 0.0D; - } else { - flag5 = false; - } - - double d3 = 999.0D; - double d4 = 999.0D; - double d5 = 999.0D; - double d6 = vec3d1.a - vec3d.a; - double d7 = vec3d1.b - vec3d.b; - double d8 = vec3d1.c - vec3d.c; - - if (flag3) { - d3 = (d0 - vec3d.a) / d6; - } - - if (flag4) { - d4 = (d1 - vec3d.b) / d7; - } - - if (flag5) { - d5 = (d2 - vec3d.c) / d8; - } - - boolean flag6 = false; - byte b0; - - if (d3 < d4 && d3 < d5) { - if (i > l) { - b0 = 4; - } else { - b0 = 5; - } - - vec3d.a = d0; - vec3d.b += d7 * d3; - vec3d.c += d8 * d3; - } else if (d4 < d5) { - if (j > i1) { - b0 = 0; - } else { - b0 = 1; - } - - vec3d.a += d6 * d4; - vec3d.b = d1; - vec3d.c += d8 * d4; - } else { - if (k > j1) { - b0 = 2; - } else { - b0 = 3; - } - - vec3d.a += d6 * d5; - vec3d.b += d7 * d5; - vec3d.c = d2; - } - - Vec3D vec3d2 = Vec3D.a(vec3d.a, vec3d.b, vec3d.c); - - l = (int) (vec3d2.a = (double) MathHelper.floor(vec3d.a)); - if (b0 == 5) { - --l; - ++vec3d2.a; - } - - i1 = (int) (vec3d2.b = (double) MathHelper.floor(vec3d.b)); - if (b0 == 1) { - --i1; - ++vec3d2.b; - } - - j1 = (int) (vec3d2.c = (double) MathHelper.floor(vec3d.c)); - if (b0 == 3) { - --j1; - ++vec3d2.c; - } - - Block block1 = this.getType(l, i1, j1); - int l1 = this.getData(l, i1, j1); - - if (!flag1 || block1.a(this, l, i1, j1) != null) { - if (block1.a(l1, flag)) { - MovingObjectPosition movingobjectposition2 = block1.a(this, l, i1, j1, vec3d, vec3d1); - - if (movingobjectposition2 != null) { - return movingobjectposition2; - } - } else { - movingobjectposition1 = new MovingObjectPosition(l, i1, j1, b0, vec3d, false); - } - } - } - - return flag2 ? movingobjectposition1 : null; - } else { - return null; - } - } else { - return null; - } - } - - public void makeSound(Entity entity, String s, float f, float f1) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(s, entity.locX, entity.locY - (double) entity.height, entity.locZ, f, f1); - } - } - - public void a(EntityHuman entityhuman, String s, float f, float f1) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(entityhuman, s, entityhuman.locX, entityhuman.locY - (double) entityhuman.height, entityhuman.locZ, f, f1); - } - } - - public void makeSound(double d0, double d1, double d2, String s, float f, float f1) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(s, d0, d1, d2, f, f1); - } - } - - public void a(double d0, double d1, double d2, String s, float f, float f1, boolean flag) {} - - public void a(String s, int i, int j, int k) { - for (int l = 0; l < this.u.size(); ++l) { - ((IWorldAccess) this.u.get(l)).a(s, i, j, k); - } - } - - public void addParticle(String s, double d0, double d1, double d2, double d3, double d4, double d5) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(s, d0, d1, d2, d3, d4, d5); - } - } - - public boolean strikeLightning(Entity entity) { - this.i.add(entity); - return true; - } - - public boolean addEntity(Entity entity) { - // CraftBukkit start - Used for entities other than creatures - return this.addEntity(entity, SpawnReason.DEFAULT); // Set reason as DEFAULT - } - - public boolean addEntity(Entity entity, SpawnReason spawnReason) { // Changed signature, added SpawnReason - if (entity == null) return false; - // CraftBukkit end - - int i = MathHelper.floor(entity.locX / 16.0D); - int j = MathHelper.floor(entity.locZ / 16.0D); - boolean flag = entity.attachedToPlayer; - - if (entity instanceof EntityHuman) { - flag = true; - } - - // CraftBukkit start - org.bukkit.event.Cancellable event = null; - if (entity instanceof EntityLiving && !(entity instanceof EntityPlayer)) { - boolean isAnimal = entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal || entity instanceof EntityGolem; - boolean isMonster = entity instanceof EntityMonster || entity instanceof EntityGhast || entity instanceof EntitySlime; - - if (spawnReason != SpawnReason.CUSTOM) { - if (isAnimal && !allowAnimals || isMonster && !allowMonsters) { - entity.dead = true; - return false; - } - } - - event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason); - } else if (entity instanceof EntityItem) { - event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity); - } else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) { - // Not all projectiles extend EntityProjectile, so check for Bukkit interface instead - event = CraftEventFactory.callProjectileLaunchEvent(entity); - } - - if (event != null && (event.isCancelled() || entity.dead)) { - entity.dead = true; - return false; - } - // CraftBukkit end - - if (!flag && !this.isChunkLoaded(i, j)) { - entity.dead = true; // CraftBukkit - return false; - } else { - if (entity instanceof EntityHuman) { - EntityHuman entityhuman = (EntityHuman) entity; - - this.players.add(entityhuman); - this.everyoneSleeping(); - this.b(entity); - } - - this.getChunkAt(i, j).a(entity); - this.entityList.add(entity); - this.a(entity); - return true; - } - } - - protected void a(Entity entity) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).a(entity); - } - - entity.valid = true; // CraftBukkit - } - - protected void b(Entity entity) { - for (int i = 0; i < this.u.size(); ++i) { - ((IWorldAccess) this.u.get(i)).b(entity); - } - - entity.valid = false; // CraftBukkit - } - - public void kill(Entity entity) { - if (entity.passenger != null) { - entity.passenger.mount((Entity) null); - } - - if (entity.vehicle != null) { - entity.mount((Entity) null); - } - - entity.die(); - if (entity instanceof EntityHuman) { - this.players.remove(entity); - this.everyoneSleeping(); - } - } - - public void removeEntity(Entity entity) { - entity.die(); - if (entity instanceof EntityHuman) { - this.players.remove(entity); - this.everyoneSleeping(); - } - - int i = entity.ah; - int j = entity.aj; - - if (entity.ag && this.isChunkLoaded(i, j)) { - this.getChunkAt(i, j).b(entity); - } - - // CraftBukkit start - Decrement loop variable field if we've already ticked this entity - int index = this.entityList.indexOf(entity); - if (index != -1) { - if (index <= this.tickPosition) { - this.tickPosition--; - } - this.entityList.remove(index); - } - // CraftBukkit end - - this.b(entity); - } - - public void addIWorldAccess(IWorldAccess iworldaccess) { - this.u.add(iworldaccess); - } - - public List getCubes(Entity entity, AxisAlignedBB axisalignedbb) { - this.L.clear(); - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = i1; l1 < j1; ++l1) { - if (this.isLoaded(k1, 64, l1)) { - for (int i2 = k - 1; i2 < l; ++i2) { - Block block; - - if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) { - block = this.getType(k1, i2, l1); - } else { - block = Blocks.STONE; - } - - block.a(this, k1, i2, l1, axisalignedbb, this.L, entity); - } - } - } - } - - double d0 = 0.25D; - List list = this.getEntities(entity, axisalignedbb.grow(d0, d0, d0)); - - for (int j2 = 0; j2 < list.size(); ++j2) { - AxisAlignedBB axisalignedbb1 = ((Entity) list.get(j2)).J(); - - if (axisalignedbb1 != null && axisalignedbb1.b(axisalignedbb)) { - this.L.add(axisalignedbb1); - } - - axisalignedbb1 = entity.h((Entity) list.get(j2)); - if (axisalignedbb1 != null && axisalignedbb1.b(axisalignedbb)) { - this.L.add(axisalignedbb1); - } - } - - return this.L; - } - - public List a(AxisAlignedBB axisalignedbb) { - this.L.clear(); - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = i1; l1 < j1; ++l1) { - if (this.isLoaded(k1, 64, l1)) { - for (int i2 = k - 1; i2 < l; ++i2) { - Block block; - - if (k1 >= -30000000 && k1 < 30000000 && l1 >= -30000000 && l1 < 30000000) { - block = this.getType(k1, i2, l1); - } else { - block = Blocks.BEDROCK; - } - - block.a(this, k1, i2, l1, axisalignedbb, this.L, (Entity) null); - } - } - } - } - - return this.L; - } - - public int a(float f) { - float f1 = this.c(f); - float f2 = 1.0F - (MathHelper.cos(f1 * 3.1415927F * 2.0F) * 2.0F + 0.5F); - - if (f2 < 0.0F) { - f2 = 0.0F; - } - - if (f2 > 1.0F) { - f2 = 1.0F; - } - - f2 = 1.0F - f2; - f2 = (float) ((double) f2 * (1.0D - (double) (this.j(f) * 5.0F) / 16.0D)); - f2 = (float) ((double) f2 * (1.0D - (double) (this.h(f) * 5.0F) / 16.0D)); - f2 = 1.0F - f2; - return (int) (f2 * 11.0F); - } - - public float c(float f) { - return this.worldProvider.a(this.worldData.getDayTime(), f); - } - - public float y() { - return WorldProvider.a[this.worldProvider.a(this.worldData.getDayTime())]; - } - - public float d(float f) { - float f1 = this.c(f); - - return f1 * 3.1415927F * 2.0F; - } - - public int h(int i, int j) { - return this.getChunkAtWorldCoords(i, j).d(i & 15, j & 15); - } - - public int i(int i, int j) { - Chunk chunk = this.getChunkAtWorldCoords(i, j); - int k = chunk.h() + 15; - - i &= 15; - - for (j &= 15; k > 0; --k) { - Block block = chunk.getType(i, k, j); - - if (block.getMaterial().isSolid() && block.getMaterial() != Material.LEAVES) { - return k + 1; - } - } - - return -1; - } - - public void a(int i, int j, int k, Block block, int l) {} - - public void a(int i, int j, int k, Block block, int l, int i1) {} - - public void b(int i, int j, int k, Block block, int l, int i1) {} - - public void tickEntities() { - this.methodProfiler.a("entities"); - this.methodProfiler.a("global"); - - int i; - Entity entity; - CrashReport crashreport; - CrashReportSystemDetails crashreportsystemdetails; - - for (i = 0; i < this.i.size(); ++i) { - entity = (Entity) this.i.get(i); - // CraftBukkit start - Fixed an NPE - if (entity == null) { - continue; - } - // CraftBukkit end - - try { - ++entity.ticksLived; - entity.h(); - } catch (Throwable throwable) { - crashreport = CrashReport.a(throwable, "Ticking entity"); - crashreportsystemdetails = crashreport.a("Entity being ticked"); - if (entity == null) { - crashreportsystemdetails.a("Entity", "~~NULL~~"); - } else { - entity.a(crashreportsystemdetails); - } - - throw new ReportedException(crashreport); - } - - if (entity.dead) { - this.i.remove(i--); - } - } - - this.methodProfiler.c("remove"); - this.entityList.removeAll(this.f); - - int j; - int k; - - for (i = 0; i < this.f.size(); ++i) { - entity = (Entity) this.f.get(i); - j = entity.ah; - k = entity.aj; - if (entity.ag && this.isChunkLoaded(j, k)) { - this.getChunkAt(j, k).b(entity); - } - } - - for (i = 0; i < this.f.size(); ++i) { - this.b((Entity) this.f.get(i)); - } - - this.f.clear(); - this.methodProfiler.c("regular"); - - // CraftBukkit start - Use field for loop variable - for (this.tickPosition = 0; this.tickPosition < this.entityList.size(); ++this.tickPosition) { - entity = (Entity) this.entityList.get(this.tickPosition); - if (entity.vehicle != null) { - if (!entity.vehicle.dead && entity.vehicle.passenger == entity) { - continue; - } - - entity.vehicle.passenger = null; - entity.vehicle = null; - } - - this.methodProfiler.a("tick"); - if (!entity.dead) { - try { - this.playerJoinedWorld(entity); - } catch (Throwable throwable1) { - crashreport = CrashReport.a(throwable1, "Ticking entity"); - crashreportsystemdetails = crashreport.a("Entity being ticked"); - entity.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - this.methodProfiler.b(); - this.methodProfiler.a("remove"); - if (entity.dead) { - j = entity.ah; - k = entity.aj; - if (entity.ag && this.isChunkLoaded(j, k)) { - this.getChunkAt(j, k).b(entity); - } - - this.entityList.remove(this.tickPosition--); // CraftBukkit - Use field for loop variable - this.b(entity); - } - - this.methodProfiler.b(); - } - - this.methodProfiler.c("blockEntities"); - this.M = true; - // CraftBukkit start - From below, clean up tile entities before ticking them - if (!this.b.isEmpty()) { - this.tileEntityList.removeAll(this.b); - this.b.clear(); - } - // CraftBukkit end - - Iterator iterator = this.tileEntityList.iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity = (TileEntity) iterator.next(); - - if (!tileentity.r() && tileentity.o() && this.isLoaded(tileentity.x, tileentity.y, tileentity.z)) { - try { - tileentity.h(); - } catch (Throwable throwable2) { - crashreport = CrashReport.a(throwable2, "Ticking block entity"); - crashreportsystemdetails = crashreport.a("Block entity being ticked"); - tileentity.a(crashreportsystemdetails); - throw new ReportedException(crashreport); - } - } - - if (tileentity.r()) { - iterator.remove(); - if (this.isChunkLoaded(tileentity.x >> 4, tileentity.z >> 4)) { - Chunk chunk = this.getChunkAt(tileentity.x >> 4, tileentity.z >> 4); - - if (chunk != null) { - chunk.f(tileentity.x & 15, tileentity.y, tileentity.z & 15); - } - } - } - } - - this.M = false; - /* CraftBukkit start - Moved up - if (!this.b.isEmpty()) { - this.tileEntityList.removeAll(this.b); - this.b.clear(); - } - */ // CraftBukkit end - - this.methodProfiler.c("pendingBlockEntities"); - if (!this.a.isEmpty()) { - for (int l = 0; l < this.a.size(); ++l) { - TileEntity tileentity1 = (TileEntity) this.a.get(l); - - if (!tileentity1.r()) { - /* CraftBukkit start - Order matters, moved down - if (!this.tileEntityList.contains(tileentity1)) { - this.tileEntityList.add(tileentity1); - } - // CraftBukkit end */ - - if (this.isChunkLoaded(tileentity1.x >> 4, tileentity1.z >> 4)) { - Chunk chunk1 = this.getChunkAt(tileentity1.x >> 4, tileentity1.z >> 4); - - if (chunk1 != null) { - chunk1.a(tileentity1.x & 15, tileentity1.y, tileentity1.z & 15, tileentity1); - // CraftBukkit start - Moved down from above - if (!this.tileEntityList.contains(tileentity1)) { - this.tileEntityList.add(tileentity1); - } - // CraftBukkit end - } - } - - this.notify(tileentity1.x, tileentity1.y, tileentity1.z); - } - } - - this.a.clear(); - } - - this.methodProfiler.b(); - this.methodProfiler.b(); - } - - public void a(Collection collection) { - if (this.M) { - this.a.addAll(collection); - } else { - this.tileEntityList.addAll(collection); - } - } - - public void playerJoinedWorld(Entity entity) { - this.entityJoinedWorld(entity, true); - } - - public void entityJoinedWorld(Entity entity, boolean flag) { - int i = MathHelper.floor(entity.locX); - int j = MathHelper.floor(entity.locZ); - byte b0 = 32; - - // CraftBukkit start - Use neighbor cache instead of looking up - Chunk startingChunk = this.getChunkIfLoaded(i >> 4, j >> 4); - if (!flag || (startingChunk != null && startingChunk.areNeighborsLoaded(2)) /* this.b(i - b0, 0, j - b0, i + b0, 0, j + b0) */) { - // CraftBukkit end - entity.S = entity.locX; - entity.T = entity.locY; - entity.U = entity.locZ; - entity.lastYaw = entity.yaw; - entity.lastPitch = entity.pitch; - if (flag && entity.ag) { - ++entity.ticksLived; - if (entity.vehicle != null) { - entity.ab(); - } else { - entity.h(); - } - } - - this.methodProfiler.a("chunkCheck"); - if (Double.isNaN(entity.locX) || Double.isInfinite(entity.locX)) { - entity.locX = entity.S; - } - - if (Double.isNaN(entity.locY) || Double.isInfinite(entity.locY)) { - entity.locY = entity.T; - } - - if (Double.isNaN(entity.locZ) || Double.isInfinite(entity.locZ)) { - entity.locZ = entity.U; - } - - if (Double.isNaN((double) entity.pitch) || Double.isInfinite((double) entity.pitch)) { - entity.pitch = entity.lastPitch; - } - - if (Double.isNaN((double) entity.yaw) || Double.isInfinite((double) entity.yaw)) { - entity.yaw = entity.lastYaw; - } - - int k = MathHelper.floor(entity.locX / 16.0D); - int l = MathHelper.floor(entity.locY / 16.0D); - int i1 = MathHelper.floor(entity.locZ / 16.0D); - - if (!entity.ag || entity.ah != k || entity.ai != l || entity.aj != i1) { - if (entity.ag && this.isChunkLoaded(entity.ah, entity.aj)) { - this.getChunkAt(entity.ah, entity.aj).a(entity, entity.ai); - } - - if (this.isChunkLoaded(k, i1)) { - entity.ag = true; - this.getChunkAt(k, i1).a(entity); - } else { - entity.ag = false; - } - } - - this.methodProfiler.b(); - if (flag && entity.ag && entity.passenger != null) { - if (!entity.passenger.dead && entity.passenger.vehicle == entity) { - this.playerJoinedWorld(entity.passenger); - } else { - entity.passenger.vehicle = null; - entity.passenger = null; - } - } - } - } - - public boolean b(AxisAlignedBB axisalignedbb) { - return this.a(axisalignedbb, (Entity) null); - } - - public boolean a(AxisAlignedBB axisalignedbb, Entity entity) { - List list = this.getEntities((Entity) null, axisalignedbb); - - for (int i = 0; i < list.size(); ++i) { - Entity entity1 = (Entity) list.get(i); - - if (!entity1.dead && entity1.k && entity1 != entity) { - return false; - } - } - - return true; - } - - public boolean c(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (axisalignedbb.a < 0.0D) { - --i; - } - - if (axisalignedbb.b < 0.0D) { - --k; - } - - if (axisalignedbb.c < 0.0D) { - --i1; - } - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial() != Material.AIR) { - return true; - } - } - } - } - - return false; - } - - public boolean containsLiquid(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (axisalignedbb.a < 0.0D) { - --i; - } - - if (axisalignedbb.b < 0.0D) { - --k; - } - - if (axisalignedbb.c < 0.0D) { - --i1; - } - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial().isLiquid()) { - return true; - } - } - } - } - - return false; - } - - public boolean e(AxisAlignedBB axisalignedbb) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (this.b(i, k, i1, j, l, j1)) { - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block == Blocks.FIRE || block == Blocks.LAVA || block == Blocks.STATIONARY_LAVA) { - return true; - } - } - } - } - } - - return false; - } - - public boolean a(AxisAlignedBB axisalignedbb, Material material, Entity entity) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - if (!this.b(i, k, i1, j, l, j1)) { - return false; - } else { - boolean flag = false; - Vec3D vec3d = Vec3D.a(0.0D, 0.0D, 0.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial() == material) { - double d0 = (double) ((float) (l1 + 1) - BlockFluids.b(this.getData(k1, l1, i2))); - - if ((double) l >= d0) { - flag = true; - block.a(this, k1, l1, i2, entity, vec3d); - } - } - } - } - } - - if (vec3d.b() > 0.0D && entity.aC()) { - vec3d = vec3d.a(); - double d1 = 0.014D; - - entity.motX += vec3d.a * d1; - entity.motY += vec3d.b * d1; - entity.motZ += vec3d.c * d1; - } - - return flag; - } - } - - public boolean a(AxisAlignedBB axisalignedbb, Material material) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - if (this.getType(k1, l1, i2).getMaterial() == material) { - return true; - } - } - } - } - - return false; - } - - public boolean b(AxisAlignedBB axisalignedbb, Material material) { - int i = MathHelper.floor(axisalignedbb.a); - int j = MathHelper.floor(axisalignedbb.d + 1.0D); - int k = MathHelper.floor(axisalignedbb.b); - int l = MathHelper.floor(axisalignedbb.e + 1.0D); - int i1 = MathHelper.floor(axisalignedbb.c); - int j1 = MathHelper.floor(axisalignedbb.f + 1.0D); - - for (int k1 = i; k1 < j; ++k1) { - for (int l1 = k; l1 < l; ++l1) { - for (int i2 = i1; i2 < j1; ++i2) { - Block block = this.getType(k1, l1, i2); - - if (block.getMaterial() == material) { - int j2 = this.getData(k1, l1, i2); - double d0 = (double) (l1 + 1); - - if (j2 < 8) { - d0 = (double) (l1 + 1) - (double) j2 / 8.0D; - } - - if (d0 >= axisalignedbb.b) { - return true; - } - } - } - } - } - - return false; - } - - public Explosion explode(Entity entity, double d0, double d1, double d2, float f, boolean flag) { - return this.createExplosion(entity, d0, d1, d2, f, false, flag); - } - - public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { - Explosion explosion = new Explosion(this, entity, d0, d1, d2, f); - - explosion.a = flag; - explosion.b = flag1; - explosion.a(); - explosion.a(true); - return explosion; - } - - public float a(Vec3D vec3d, AxisAlignedBB axisalignedbb) { - double d0 = 1.0D / ((axisalignedbb.d - axisalignedbb.a) * 2.0D + 1.0D); - double d1 = 1.0D / ((axisalignedbb.e - axisalignedbb.b) * 2.0D + 1.0D); - double d2 = 1.0D / ((axisalignedbb.f - axisalignedbb.c) * 2.0D + 1.0D); - - if (d0 >= 0.0D && d1 >= 0.0D && d2 >= 0.0D) { - int i = 0; - int j = 0; - - Vec3D vec3d2 = vec3d.a(0, 0, 0); // CraftBukkit - for (float f = 0.0F; f <= 1.0F; f = (float) ((double) f + d0)) { - for (float f1 = 0.0F; f1 <= 1.0F; f1 = (float) ((double) f1 + d1)) { - for (float f2 = 0.0F; f2 <= 1.0F; f2 = (float) ((double) f2 + d2)) { - double d3 = axisalignedbb.a + (axisalignedbb.d - axisalignedbb.a) * (double) f; - double d4 = axisalignedbb.b + (axisalignedbb.e - axisalignedbb.b) * (double) f1; - double d5 = axisalignedbb.c + (axisalignedbb.f - axisalignedbb.c) * (double) f2; - - if (this.a(vec3d2.b(d3, d4, d5), vec3d) == null) { // CraftBukkit - ++i; - } - - ++j; - } - } - } - - return (float) i / (float) j; - } else { - return 0.0F; - } - } - - public boolean douseFire(EntityHuman entityhuman, int i, int j, int k, int l) { - if (l == 0) { - --j; - } - - if (l == 1) { - ++j; - } - - if (l == 2) { - --k; - } - - if (l == 3) { - ++k; - } - - if (l == 4) { - --i; - } - - if (l == 5) { - ++i; - } - - if (this.getType(i, j, k) == Blocks.FIRE) { - this.a(entityhuman, 1004, i, j, k, 0); - this.setAir(i, j, k); - return true; - } else { - return false; - } - } - - public TileEntity getTileEntity(int i, int j, int k) { - if (j >= 0 && j < 256) { - TileEntity tileentity = null; - int l; - TileEntity tileentity1; - - if (this.M) { - for (l = 0; l < this.a.size(); ++l) { - tileentity1 = (TileEntity) this.a.get(l); - if (!tileentity1.r() && tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) { - tileentity = tileentity1; - break; - } - } - } - - if (tileentity == null) { - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - if (chunk != null) { - tileentity = chunk.e(i & 15, j, k & 15); - } - } - - if (tileentity == null) { - for (l = 0; l < this.a.size(); ++l) { - tileentity1 = (TileEntity) this.a.get(l); - if (!tileentity1.r() && tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) { - tileentity = tileentity1; - break; - } - } - } - - return tileentity; - } else { - return null; - } - } - - public void setTileEntity(int i, int j, int k, TileEntity tileentity) { - if (tileentity != null && !tileentity.r()) { - if (this.M) { - tileentity.x = i; - tileentity.y = j; - tileentity.z = k; - Iterator iterator = this.a.iterator(); - - while (iterator.hasNext()) { - TileEntity tileentity1 = (TileEntity) iterator.next(); - - if (tileentity1.x == i && tileentity1.y == j && tileentity1.z == k) { - tileentity1.s(); - iterator.remove(); - } - } - - this.a.add(tileentity); - } else { - this.tileEntityList.add(tileentity); - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - if (chunk != null) { - chunk.a(i & 15, j, k & 15, tileentity); - } - } - } - } - - public void p(int i, int j, int k) { - TileEntity tileentity = this.getTileEntity(i, j, k); - - if (tileentity != null && this.M) { - tileentity.s(); - this.a.remove(tileentity); - } else { - if (tileentity != null) { - this.a.remove(tileentity); - this.tileEntityList.remove(tileentity); - } - - Chunk chunk = this.getChunkAt(i >> 4, k >> 4); - - if (chunk != null) { - chunk.f(i & 15, j, k & 15); - } - } - } - - public void a(TileEntity tileentity) { - this.b.add(tileentity); - } - - public boolean q(int i, int j, int k) { - AxisAlignedBB axisalignedbb = this.getType(i, j, k).a(this, i, j, k); - - return axisalignedbb != null && axisalignedbb.a() >= 1.0D; - } - - public static boolean a(IBlockAccess iblockaccess, int i, int j, int k) { - Block block = iblockaccess.getType(i, j, k); - int l = iblockaccess.getData(i, j, k); - - return block.getMaterial().k() && block.d() ? true : (block instanceof BlockStairs ? (l & 4) == 4 : (block instanceof BlockStepAbstract ? (l & 8) == 8 : (block instanceof BlockHopper ? true : (block instanceof BlockSnow ? (l & 7) == 7 : false)))); - } - - public boolean c(int i, int j, int k, boolean flag) { - if (i >= -30000000 && k >= -30000000 && i < 30000000 && k < 30000000) { - Chunk chunk = this.chunkProvider.getOrCreateChunk(i >> 4, k >> 4); - - if (chunk != null && !chunk.isEmpty()) { - Block block = this.getType(i, j, k); - - return block.getMaterial().k() && block.d(); - } else { - return flag; - } - } else { - return flag; - } - } - - public void B() { - int i = this.a(1.0F); - - if (i != this.j) { - this.j = i; - } - } - - public void setSpawnFlags(boolean flag, boolean flag1) { - this.allowMonsters = flag; - this.allowAnimals = flag1; - } - - public void doTick() { - this.o(); - } - - private void a() { - if (this.worldData.hasStorm()) { - this.n = 1.0F; - if (this.worldData.isThundering()) { - this.p = 1.0F; - } - } - } - - protected void o() { - if (!this.worldProvider.g) { - if (!this.isStatic) { - int i = this.worldData.getThunderDuration(); - - if (i <= 0) { - if (this.worldData.isThundering()) { - this.worldData.setThunderDuration(this.random.nextInt(12000) + 3600); - } else { - this.worldData.setThunderDuration(this.random.nextInt(168000) + 12000); - } - } else { - --i; - this.worldData.setThunderDuration(i); - if (i <= 0) { - // CraftBukkit start - ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), !this.worldData.isThundering()); - this.getServer().getPluginManager().callEvent(thunder); - if (!thunder.isCancelled()) { - this.worldData.setThundering(!this.worldData.isThundering()); - } - // CraftBukkit end - } - } - - this.o = this.p; - if (this.worldData.isThundering()) { - this.p = (float) ((double) this.p + 0.01D); - } else { - this.p = (float) ((double) this.p - 0.01D); - } - - this.p = MathHelper.a(this.p, 0.0F, 1.0F); - int j = this.worldData.getWeatherDuration(); - - if (j <= 0) { - if (this.worldData.hasStorm()) { - this.worldData.setWeatherDuration(this.random.nextInt(12000) + 12000); - } else { - this.worldData.setWeatherDuration(this.random.nextInt(168000) + 12000); - } - } else { - --j; - this.worldData.setWeatherDuration(j); - if (j <= 0) { - // CraftBukkit start - WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), !this.worldData.hasStorm()); - this.getServer().getPluginManager().callEvent(weather); - - if (!weather.isCancelled()) { - this.worldData.setStorm(!this.worldData.hasStorm()); - } - // CraftBukkit end - } - } - - this.m = this.n; - if (this.worldData.hasStorm()) { - this.n = (float) ((double) this.n + 0.01D); - } else { - this.n = (float) ((double) this.n - 0.01D); - } - - this.n = MathHelper.a(this.n, 0.0F, 1.0F); - } - } - } - - protected void C() { - // this.chunkTickList.clear(); // CraftBukkit - removed - this.methodProfiler.a("buildList"); - - int i; - EntityHuman entityhuman; - int j; - int k; - int l; - - for (i = 0; i < this.players.size(); ++i) { - entityhuman = (EntityHuman) this.players.get(i); - j = MathHelper.floor(entityhuman.locX / 16.0D); - k = MathHelper.floor(entityhuman.locZ / 16.0D); - l = this.p(); - - for (int i1 = -l; i1 <= l; ++i1) { - for (int j1 = -l; j1 <= l; ++j1) { - this.chunkTickList.add(org.bukkit.craftbukkit.util.LongHash.toLong(i1 + j, j1 + k)); // CraftBukkit - } - } - } - - this.methodProfiler.b(); - if (this.K > 0) { - --this.K; - } - - this.methodProfiler.a("playerCheckLight"); - if (!this.players.isEmpty()) { - i = this.random.nextInt(this.players.size()); - entityhuman = (EntityHuman) this.players.get(i); - j = MathHelper.floor(entityhuman.locX) + this.random.nextInt(11) - 5; - k = MathHelper.floor(entityhuman.locY) + this.random.nextInt(11) - 5; - l = MathHelper.floor(entityhuman.locZ) + this.random.nextInt(11) - 5; - this.t(j, k, l); - } - - this.methodProfiler.b(); - } - - protected abstract int p(); - - protected void a(int i, int j, Chunk chunk) { - this.methodProfiler.c("moodSound"); - if (this.K == 0 && !this.isStatic) { - this.k = this.k * 3 + 1013904223; - int k = this.k >> 2; - int l = k & 15; - int i1 = k >> 8 & 15; - int j1 = k >> 16 & 255; - Block block = chunk.getType(l, j1, i1); - - l += i; - i1 += j; - if (block.getMaterial() == Material.AIR && this.j(l, j1, i1) <= this.random.nextInt(8) && this.b(EnumSkyBlock.SKY, l, j1, i1) <= 0) { - EntityHuman entityhuman = this.findNearbyPlayer((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D, 8.0D); - - if (entityhuman != null && entityhuman.e((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D) > 4.0D) { - this.makeSound((double) l + 0.5D, (double) j1 + 0.5D, (double) i1 + 0.5D, "ambient.cave.cave", 0.7F, 0.8F + this.random.nextFloat() * 0.2F); - this.K = this.random.nextInt(12000) + 6000; - } - } - } - - this.methodProfiler.c("checkLight"); - chunk.o(); - } - - protected void g() { - this.C(); - } - - public boolean r(int i, int j, int k) { - return this.d(i, j, k, false); - } - - public boolean s(int i, int j, int k) { - return this.d(i, j, k, true); - } - - public boolean d(int i, int j, int k, boolean flag) { - BiomeBase biomebase = this.getBiome(i, k); - float f = biomebase.a(i, j, k); - - if (f > 0.15F) { - return false; - } else { - if (j >= 0 && j < 256 && this.b(EnumSkyBlock.BLOCK, i, j, k) < 10) { - Block block = this.getType(i, j, k); - - if ((block == Blocks.STATIONARY_WATER || block == Blocks.WATER) && this.getData(i, j, k) == 0) { - if (!flag) { - return true; - } - - boolean flag1 = true; - - if (flag1 && this.getType(i - 1, j, k).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (flag1 && this.getType(i + 1, j, k).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (flag1 && this.getType(i, j, k - 1).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (flag1 && this.getType(i, j, k + 1).getMaterial() != Material.WATER) { - flag1 = false; - } - - if (!flag1) { - return true; - } - } - } - - return false; - } - } - - public boolean e(int i, int j, int k, boolean flag) { - BiomeBase biomebase = this.getBiome(i, k); - float f = biomebase.a(i, j, k); - - if (f > 0.15F) { - return false; - } else if (!flag) { - return true; - } else { - if (j >= 0 && j < 256 && this.b(EnumSkyBlock.BLOCK, i, j, k) < 10) { - Block block = this.getType(i, j, k); - - if (block.getMaterial() == Material.AIR && Blocks.SNOW.canPlace(this, i, j, k)) { - return true; - } - } - - return false; - } - } - - public boolean t(int i, int j, int k) { - boolean flag = false; - - if (!this.worldProvider.g) { - flag |= this.c(EnumSkyBlock.SKY, i, j, k); - } - - flag |= this.c(EnumSkyBlock.BLOCK, i, j, k); - return flag; - } - - private int a(int i, int j, int k, EnumSkyBlock enumskyblock) { - if (enumskyblock == EnumSkyBlock.SKY && this.i(i, j, k)) { - return 15; - } else { - Block block = this.getType(i, j, k); - int l = enumskyblock == EnumSkyBlock.SKY ? 0 : block.m(); - int i1 = block.k(); - - if (i1 >= 15 && block.m() > 0) { - i1 = 1; - } - - if (i1 < 1) { - i1 = 1; - } - - if (i1 >= 15) { - return 0; - } else if (l >= 14) { - return l; - } else { - for (int j1 = 0; j1 < 6; ++j1) { - int k1 = i + Facing.b[j1]; - int l1 = j + Facing.c[j1]; - int i2 = k + Facing.d[j1]; - int j2 = this.b(enumskyblock, k1, l1, i2) - i1; - - if (j2 > l) { - l = j2; - } - - if (l >= 14) { - return l; - } - } - - return l; - } - } - } - - public boolean c(EnumSkyBlock enumskyblock, int i, int j, int k) { - // CraftBukkit start - Use neighbor cache instead of looking up - Chunk chunk = this.getChunkIfLoaded(i >> 4, k >> 4); - if (chunk == null || !chunk.areNeighborsLoaded(1) /* !this.areChunksLoaded(i, j, k, 17)*/) { - // CraftBukkit end - return false; - } else { - int l = 0; - int i1 = 0; - - this.methodProfiler.a("getBrightness"); - int j1 = this.b(enumskyblock, i, j, k); - int k1 = this.a(i, j, k, enumskyblock); - int l1; - int i2; - int j2; - int k2; - int l2; - int i3; - int j3; - int k3; - int l3; - - if (k1 > j1) { - this.I[i1++] = 133152; - } else if (k1 < j1) { - this.I[i1++] = 133152 | j1 << 18; - - while (l < i1) { - l1 = this.I[l++]; - i2 = (l1 & 63) - 32 + i; - j2 = (l1 >> 6 & 63) - 32 + j; - k2 = (l1 >> 12 & 63) - 32 + k; - l2 = l1 >> 18 & 15; - i3 = this.b(enumskyblock, i2, j2, k2); - if (i3 == l2) { - this.b(enumskyblock, i2, j2, k2, 0); - if (l2 > 0) { - j3 = MathHelper.a(i2 - i); - l3 = MathHelper.a(j2 - j); - k3 = MathHelper.a(k2 - k); - if (j3 + l3 + k3 < 17) { - for (int i4 = 0; i4 < 6; ++i4) { - int j4 = i2 + Facing.b[i4]; - int k4 = j2 + Facing.c[i4]; - int l4 = k2 + Facing.d[i4]; - int i5 = Math.max(1, this.getType(j4, k4, l4).k()); - - i3 = this.b(enumskyblock, j4, k4, l4); - if (i3 == l2 - i5 && i1 < this.I.length) { - this.I[i1++] = j4 - i + 32 | k4 - j + 32 << 6 | l4 - k + 32 << 12 | l2 - i5 << 18; - } - } - } - } - } - } - - l = 0; - } - - this.methodProfiler.b(); - this.methodProfiler.a("checkedPosition < toCheckCount"); - - while (l < i1) { - l1 = this.I[l++]; - i2 = (l1 & 63) - 32 + i; - j2 = (l1 >> 6 & 63) - 32 + j; - k2 = (l1 >> 12 & 63) - 32 + k; - l2 = this.b(enumskyblock, i2, j2, k2); - i3 = this.a(i2, j2, k2, enumskyblock); - if (i3 != l2) { - this.b(enumskyblock, i2, j2, k2, i3); - if (i3 > l2) { - j3 = Math.abs(i2 - i); - l3 = Math.abs(j2 - j); - k3 = Math.abs(k2 - k); - boolean flag = i1 < this.I.length - 6; - - if (j3 + l3 + k3 < 17 && flag) { - if (this.b(enumskyblock, i2 - 1, j2, k2) < i3) { - this.I[i1++] = i2 - 1 - i + 32 + (j2 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2 + 1, j2, k2) < i3) { - this.I[i1++] = i2 + 1 - i + 32 + (j2 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2 - 1, k2) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 - 1 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2 + 1, k2) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 + 1 - j + 32 << 6) + (k2 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2, k2 - 1) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 - j + 32 << 6) + (k2 - 1 - k + 32 << 12); - } - - if (this.b(enumskyblock, i2, j2, k2 + 1) < i3) { - this.I[i1++] = i2 - i + 32 + (j2 - j + 32 << 6) + (k2 + 1 - k + 32 << 12); - } - } - } - } - } - - this.methodProfiler.b(); - return true; - } - } - - public boolean a(boolean flag) { - return false; - } - - public List a(Chunk chunk, boolean flag) { - return null; - } - - public List getEntities(Entity entity, AxisAlignedBB axisalignedbb) { - return this.getEntities(entity, axisalignedbb, (IEntitySelector) null); - } - - public List getEntities(Entity entity, AxisAlignedBB axisalignedbb, IEntitySelector ientityselector) { - ArrayList arraylist = new ArrayList(); - int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); - int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); - int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); - int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); - - for (int i1 = i; i1 <= j; ++i1) { - for (int j1 = k; j1 <= l; ++j1) { - if (this.isChunkLoaded(i1, j1)) { - this.getChunkAt(i1, j1).a(entity, axisalignedbb, arraylist, ientityselector); - } - } - } - - return arraylist; - } - - public List a(Class oclass, AxisAlignedBB axisalignedbb) { - return this.a(oclass, axisalignedbb, (IEntitySelector) null); - } - - public List a(Class oclass, AxisAlignedBB axisalignedbb, IEntitySelector ientityselector) { - int i = MathHelper.floor((axisalignedbb.a - 2.0D) / 16.0D); - int j = MathHelper.floor((axisalignedbb.d + 2.0D) / 16.0D); - int k = MathHelper.floor((axisalignedbb.c - 2.0D) / 16.0D); - int l = MathHelper.floor((axisalignedbb.f + 2.0D) / 16.0D); - ArrayList arraylist = new ArrayList(); - - for (int i1 = i; i1 <= j; ++i1) { - for (int j1 = k; j1 <= l; ++j1) { - if (this.isChunkLoaded(i1, j1)) { - this.getChunkAt(i1, j1).a(oclass, axisalignedbb, arraylist, ientityselector); - } - } - } - - return arraylist; - } - - public Entity a(Class oclass, AxisAlignedBB axisalignedbb, Entity entity) { - List list = this.a(oclass, axisalignedbb); - Entity entity1 = null; - double d0 = Double.MAX_VALUE; - - for (int i = 0; i < list.size(); ++i) { - Entity entity2 = (Entity) list.get(i); - - if (entity2 != entity) { - double d1 = entity.f(entity2); - - if (d1 <= d0) { - entity1 = entity2; - d0 = d1; - } - } - } - - return entity1; - } - - public abstract Entity getEntity(int i); - - public void b(int i, int j, int k, TileEntity tileentity) { - if (this.isLoaded(i, j, k)) { - this.getChunkAtWorldCoords(i, k).e(); - } - } - - public int a(Class oclass) { - int i = 0; - - for (int j = 0; j < this.entityList.size(); ++j) { - Entity entity = (Entity) this.entityList.get(j); - - // CraftBukkit start - Split out persistent check, don't apply it to special persistent mobs - if (entity instanceof EntityInsentient) { - EntityInsentient entityinsentient = (EntityInsentient) entity; - if (entityinsentient.isTypeNotPersistent() && entityinsentient.isPersistent()) { - continue; - } - } - - if (oclass.isAssignableFrom(entity.getClass())) { - // if ((!(entity instanceof EntityInsentient) || !((EntityInsentient) entity).isPersistent()) && oclass.isAssignableFrom(entity.getClass())) { - // CraftBukkit end - ++i; - } - } - - return i; - } - - public void a(List list) { - // CraftBukkit start - // this.entityList.addAll(list); - Entity entity = null; - - for (int i = 0; i < list.size(); ++i) { - entity = (Entity) list.get(i); - if (entity == null) { - continue; - } - this.entityList.add(entity); - // CraftBukkit end - this.a((Entity) list.get(i)); - } - } - - public void b(List list) { - this.f.addAll(list); - } - - public boolean mayPlace(Block block, int i, int j, int k, boolean flag, int l, Entity entity, ItemStack itemstack) { - Block block1 = this.getType(i, j, k); - AxisAlignedBB axisalignedbb = flag ? null : block.a(this, i, j, k); - - // CraftBukkit start - store default return - boolean defaultReturn = axisalignedbb != null && !this.a(axisalignedbb, entity) ? false : (block1.getMaterial() == Material.ORIENTABLE && block == Blocks.ANVIL ? true : block1.getMaterial().isReplaceable() && block.canPlace(this, i, j, k, l, itemstack)); - - // CraftBukkit start - BlockCanBuildEvent event = new BlockCanBuildEvent(this.getWorld().getBlockAt(i, j, k), CraftMagicNumbers.getId(block), defaultReturn); - this.getServer().getPluginManager().callEvent(event); - - return event.isBuildable(); - // CraftBukkit end - } - - public PathEntity findPath(Entity entity, Entity entity1, float f, boolean flag, boolean flag1, boolean flag2, boolean flag3) { - this.methodProfiler.a("pathfind"); - int i = MathHelper.floor(entity.locX); - int j = MathHelper.floor(entity.locY + 1.0D); - int k = MathHelper.floor(entity.locZ); - int l = (int) (f + 16.0F); - int i1 = i - l; - int j1 = j - l; - int k1 = k - l; - int l1 = i + l; - int i2 = j + l; - int j2 = k + l; - ChunkCache chunkcache = new ChunkCache(this, i1, j1, k1, l1, i2, j2, 0); - PathEntity pathentity = (new Pathfinder(chunkcache, flag, flag1, flag2, flag3)).a(entity, entity1, f); - - this.methodProfiler.b(); - return pathentity; - } - - public PathEntity a(Entity entity, int i, int j, int k, float f, boolean flag, boolean flag1, boolean flag2, boolean flag3) { - this.methodProfiler.a("pathfind"); - int l = MathHelper.floor(entity.locX); - int i1 = MathHelper.floor(entity.locY); - int j1 = MathHelper.floor(entity.locZ); - int k1 = (int) (f + 8.0F); - int l1 = l - k1; - int i2 = i1 - k1; - int j2 = j1 - k1; - int k2 = l + k1; - int l2 = i1 + k1; - int i3 = j1 + k1; - ChunkCache chunkcache = new ChunkCache(this, l1, i2, j2, k2, l2, i3, 0); - PathEntity pathentity = (new Pathfinder(chunkcache, flag, flag1, flag2, flag3)).a(entity, i, j, k, f); - - this.methodProfiler.b(); - return pathentity; - } - - public int getBlockPower(int i, int j, int k, int l) { - return this.getType(i, j, k).c(this, i, j, k, l); - } - - public int getBlockPower(int i, int j, int k) { - byte b0 = 0; - int l = Math.max(b0, this.getBlockPower(i, j - 1, k, 0)); - - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i, j + 1, k, 1)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i, j, k - 1, 2)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i, j, k + 1, 3)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i - 1, j, k, 4)); - if (l >= 15) { - return l; - } else { - l = Math.max(l, this.getBlockPower(i + 1, j, k, 5)); - return l >= 15 ? l : l; - } - } - } - } - } - } - - public boolean isBlockFacePowered(int i, int j, int k, int l) { - return this.getBlockFacePower(i, j, k, l) > 0; - } - - public int getBlockFacePower(int i, int j, int k, int l) { - return this.getType(i, j, k).r() ? this.getBlockPower(i, j, k) : this.getType(i, j, k).b(this, i, j, k, l); - } - - public boolean isBlockIndirectlyPowered(int i, int j, int k) { - return this.getBlockFacePower(i, j - 1, k, 0) > 0 ? true : (this.getBlockFacePower(i, j + 1, k, 1) > 0 ? true : (this.getBlockFacePower(i, j, k - 1, 2) > 0 ? true : (this.getBlockFacePower(i, j, k + 1, 3) > 0 ? true : (this.getBlockFacePower(i - 1, j, k, 4) > 0 ? true : this.getBlockFacePower(i + 1, j, k, 5) > 0)))); - } - - public int getHighestNeighborSignal(int i, int j, int k) { - int l = 0; - - for (int i1 = 0; i1 < 6; ++i1) { - int j1 = this.getBlockFacePower(i + Facing.b[i1], j + Facing.c[i1], k + Facing.d[i1], i1); - - if (j1 >= 15) { - return 15; - } - - if (j1 > l) { - l = j1; - } - } - - return l; - } - - public EntityHuman findNearbyPlayer(Entity entity, double d0) { - return this.findNearbyPlayer(entity.locX, entity.locY, entity.locZ, d0); - } - - public EntityHuman findNearbyPlayer(double d0, double d1, double d2, double d3) { - double d4 = -1.0D; - EntityHuman entityhuman = null; - - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); - // CraftBukkit start - Fixed an NPE - if (entityhuman1 == null || entityhuman1.dead) { - continue; - } - // CraftBukkit end - double d5 = entityhuman1.e(d0, d1, d2); - - if ((d3 < 0.0D || d5 < d3 * d3) && (d4 == -1.0D || d5 < d4)) { - d4 = d5; - entityhuman = entityhuman1; - } - } - - return entityhuman; - } - - public EntityHuman findNearbyVulnerablePlayer(Entity entity, double d0) { - return this.findNearbyVulnerablePlayer(entity.locX, entity.locY, entity.locZ, d0); - } - - public EntityHuman findNearbyVulnerablePlayer(double d0, double d1, double d2, double d3) { - double d4 = -1.0D; - EntityHuman entityhuman = null; - - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman1 = (EntityHuman) this.players.get(i); - // CraftBukkit start - Fixed an NPE - if (entityhuman1 == null || entityhuman1.dead) { - continue; - } - // CraftBukkit end - - if (!entityhuman1.abilities.isInvulnerable && entityhuman1.isAlive()) { - double d5 = entityhuman1.e(d0, d1, d2); - double d6 = d3; - - if (entityhuman1.isSneaking()) { - d6 = d3 * 0.800000011920929D; - } - - if (entityhuman1.isInvisible()) { - float f = entityhuman1.bE(); - - if (f < 0.1F) { - f = 0.1F; - } - - d6 *= (double) (0.7F * f); - } - - if ((d3 < 0.0D || d5 < d6 * d6) && (d4 == -1.0D || d5 < d4)) { - d4 = d5; - entityhuman = entityhuman1; - } - } - } - - return entityhuman; - } - - public EntityHuman a(String s) { - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) this.players.get(i); - - if (s.equals(entityhuman.getName())) { - return entityhuman; - } - } - - return null; - } - - public EntityHuman a(UUID uuid) { - for (int i = 0; i < this.players.size(); ++i) { - EntityHuman entityhuman = (EntityHuman) this.players.get(i); - - if (uuid.equals(entityhuman.getUniqueID())) { - return entityhuman; - } - } - - return null; - } - - public void G() throws ExceptionWorldConflict { // CraftBukkit - added throws - this.dataManager.checkSession(); - } - - public long getSeed() { - return this.worldData.getSeed(); - } - - public long getTime() { - return this.worldData.getTime(); - } - - public long getDayTime() { - return this.worldData.getDayTime(); - } - - public void setDayTime(long i) { - this.worldData.setDayTime(i); - } - - public ChunkCoordinates getSpawn() { - return new ChunkCoordinates(this.worldData.c(), this.worldData.d(), this.worldData.e()); - } - - public void x(int i, int j, int k) { - this.worldData.setSpawn(i, j, k); - } - - public boolean a(EntityHuman entityhuman, int i, int j, int k) { - return true; - } - - public void broadcastEntityEffect(Entity entity, byte b0) {} - - public IChunkProvider L() { - return this.chunkProvider; - } - - public void playBlockAction(int i, int j, int k, Block block, int l, int i1) { - block.a(this, i, j, k, l, i1); - } - - public IDataManager getDataManager() { - return this.dataManager; - } - - public WorldData getWorldData() { - return this.worldData; - } - - public GameRules getGameRules() { - return this.worldData.getGameRules(); - } - - public void everyoneSleeping() {} - - // CraftBukkit start - // Calls the method that checks to see if players are sleeping - // Called by CraftPlayer.setPermanentSleeping() - public void checkSleepStatus() { - if (!this.isStatic) { - this.everyoneSleeping(); - } - } - // CraftBukkit end - - public float h(float f) { - return (this.o + (this.p - this.o) * f) * this.j(f); - } - - public float j(float f) { - return this.m + (this.n - this.m) * f; - } - - public boolean P() { - return (double) this.h(1.0F) > 0.9D; - } - - public boolean Q() { - return (double) this.j(1.0F) > 0.2D; - } - - public boolean isRainingAt(int i, int j, int k) { - if (!this.Q()) { - return false; - } else if (!this.i(i, j, k)) { - return false; - } else if (this.h(i, k) > j) { - return false; - } else { - BiomeBase biomebase = this.getBiome(i, k); - - return biomebase.d() ? false : (this.e(i, j, k, false) ? false : biomebase.e()); - } - } - - public boolean z(int i, int j, int k) { - BiomeBase biomebase = this.getBiome(i, k); - - return biomebase.f(); - } - - public void a(String s, PersistentBase persistentbase) { - this.worldMaps.a(s, persistentbase); - } - - public PersistentBase a(Class oclass, String s) { - return this.worldMaps.get(oclass, s); - } - - public int b(String s) { - return this.worldMaps.a(s); - } - - public void b(int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.u.size(); ++j1) { - ((IWorldAccess) this.u.get(j1)).a(i, j, k, l, i1); - } - } - - public void triggerEffect(int i, int j, int k, int l, int i1) { - this.a((EntityHuman) null, i, j, k, l, i1); - } - - public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) { - try { - for (int j1 = 0; j1 < this.u.size(); ++j1) { - ((IWorldAccess) this.u.get(j1)).a(entityhuman, i, j, k, l, i1); - } - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Playing level event"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Level event being played"); - - crashreportsystemdetails.a("Block coordinates", CrashReportSystemDetails.a(j, k, l)); - crashreportsystemdetails.a("Event source", entityhuman); - crashreportsystemdetails.a("Event type", Integer.valueOf(i)); - crashreportsystemdetails.a("Event data", Integer.valueOf(i1)); - throw new ReportedException(crashreport); - } - } - - public int getHeight() { - return 256; - } - - public int S() { - return this.worldProvider.g ? 128 : 256; - } - - public Random A(int i, int j, int k) { - long l = (long) i * 341873128712L + (long) j * 132897987541L + this.getWorldData().getSeed() + (long) k; - - this.random.setSeed(l); - return this.random; - } - - public ChunkPosition b(String s, int i, int j, int k) { - return this.L().findNearestMapFeature(this, s, i, j, k); - } - - public CrashReportSystemDetails a(CrashReport crashreport) { - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Affected level", 1); - - crashreportsystemdetails.a("Level name", (this.worldData == null ? "????" : this.worldData.getName())); - crashreportsystemdetails.a("All players", (Callable) (new CrashReportPlayers(this))); - crashreportsystemdetails.a("Chunk stats", (Callable) (new CrashReportChunkStats(this))); - - try { - this.worldData.a(crashreportsystemdetails); - } catch (Throwable throwable) { - crashreportsystemdetails.a("Level Data Unobtainable", throwable); - } - - return crashreportsystemdetails; - } - - public void d(int i, int j, int k, int l, int i1) { - for (int j1 = 0; j1 < this.u.size(); ++j1) { - IWorldAccess iworldaccess = (IWorldAccess) this.u.get(j1); - - iworldaccess.b(i, j, k, l, i1); - } - } - - public Calendar V() { - if (this.getTime() % 600L == 0L) { - this.J.setTimeInMillis(MinecraftServer.ar()); - } - - return this.J; - } - - public Scoreboard getScoreboard() { - return this.scoreboard; - } - - public void updateAdjacentComparators(int i, int j, int k, Block block) { - for (int l = 0; l < 4; ++l) { - int i1 = i + Direction.a[l]; - int j1 = k + Direction.b[l]; - Block block1 = this.getType(i1, j, j1); - - if (Blocks.REDSTONE_COMPARATOR_OFF.e(block1)) { - block1.doPhysics(this, i1, j, j1, block); - } else if (block1.r()) { - i1 += Direction.a[l]; - j1 += Direction.b[l]; - Block block2 = this.getType(i1, j, j1); - - if (Blocks.REDSTONE_COMPARATOR_OFF.e(block2)) { - block2.doPhysics(this, i1, j, j1, block); - } - } - } - } - - public float b(double d0, double d1, double d2) { - return this.B(MathHelper.floor(d0), MathHelper.floor(d1), MathHelper.floor(d2)); - } - - public float B(int i, int j, int k) { - float f = 0.0F; - boolean flag = this.difficulty == EnumDifficulty.HARD; - - if (this.isLoaded(i, j, k)) { - float f1 = this.y(); - - f += MathHelper.a((float) this.getChunkAtWorldCoords(i, k).s / 3600000.0F, 0.0F, 1.0F) * (flag ? 1.0F : 0.75F); - f += f1 * 0.25F; - } - - if (this.difficulty == EnumDifficulty.EASY || this.difficulty == EnumDifficulty.PEACEFUL) { - f *= (float) this.difficulty.a() / 2.0F; - } - - return MathHelper.a(f, 0.0F, flag ? 1.5F : 1.0F); - } - - public void X() { - Iterator iterator = this.u.iterator(); - - while (iterator.hasNext()) { - IWorldAccess iworldaccess = (IWorldAccess) iterator.next(); - - iworldaccess.b(); - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenBigTree.java b/src/main/java/net/minecraft/server/WorldGenBigTree.java deleted file mode 100644 index 1f8f1a98..00000000 --- a/src/main/java/net/minecraft/server/WorldGenBigTree.java +++ /dev/null @@ -1,372 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class WorldGenBigTree extends WorldGenTreeAbstract { - - static final byte[] a = new byte[] { (byte) 2, (byte) 0, (byte) 0, (byte) 1, (byte) 2, (byte) 1}; - Random b = new Random(); - World world; - int[] d = new int[] { 0, 0, 0}; - int e; - int f; - double g = 0.618D; - double h = 1.0D; - double i = 0.381D; - double j = 1.0D; - double k = 1.0D; - int l = 1; - int m = 12; - int n = 4; - int[][] o; - - public WorldGenBigTree(boolean flag) { - super(flag); - } - - void a() { - this.f = (int) ((double) this.e * this.g); - if (this.f >= this.e) { - this.f = this.e - 1; - } - - int i = (int) (1.382D + Math.pow(this.k * (double) this.e / 13.0D, 2.0D)); - - if (i < 1) { - i = 1; - } - - int[][] aint = new int[i * this.e][4]; - int j = this.d[1] + this.e - this.n; - int k = 1; - int l = this.d[1] + this.f; - int i1 = j - this.d[1]; - - aint[0][0] = this.d[0]; - aint[0][1] = j; - aint[0][2] = this.d[2]; - aint[0][3] = l; - --j; - - while (i1 >= 0) { - int j1 = 0; - float f = this.a(i1); - - if (f < 0.0F) { - --j; - --i1; - } else { - for (double d0 = 0.5D; j1 < i; ++j1) { - double d1 = this.j * (double) f * ((double) this.b.nextFloat() + 0.328D); - double d2 = (double) this.b.nextFloat() * 2.0D * 3.14159D; - int k1 = MathHelper.floor(d1 * Math.sin(d2) + (double) this.d[0] + d0); - int l1 = MathHelper.floor(d1 * Math.cos(d2) + (double) this.d[2] + d0); - int[] aint1 = new int[] { k1, j, l1}; - int[] aint2 = new int[] { k1, j + this.n, l1}; - - if (this.a(aint1, aint2) == -1) { - int[] aint3 = new int[] { this.d[0], this.d[1], this.d[2]}; - double d3 = Math.sqrt(Math.pow((double) Math.abs(this.d[0] - aint1[0]), 2.0D) + Math.pow((double) Math.abs(this.d[2] - aint1[2]), 2.0D)); - double d4 = d3 * this.i; - - if ((double) aint1[1] - d4 > (double) l) { - aint3[1] = l; - } else { - aint3[1] = (int) ((double) aint1[1] - d4); - } - - if (this.a(aint3, aint1) == -1) { - aint[k][0] = k1; - aint[k][1] = j; - aint[k][2] = l1; - aint[k][3] = aint3[1]; - ++k; - } - } - } - - --j; - --i1; - } - } - - this.o = new int[k][4]; - System.arraycopy(aint, 0, this.o, 0, k); - } - - void a(int i, int j, int k, float f, byte b0, Block block) { - int l = (int) ((double) f + 0.618D); - byte b1 = a[b0]; - byte b2 = a[b0 + 3]; - int[] aint = new int[] { i, j, k}; - int[] aint1 = new int[] { 0, 0, 0}; - int i1 = -l; - int j1 = -l; - - for (aint1[b0] = aint[b0]; i1 <= l; ++i1) { - aint1[b1] = aint[b1] + i1; - j1 = -l; - - while (j1 <= l) { - double d0 = Math.pow((double) Math.abs(i1) + 0.5D, 2.0D) + Math.pow((double) Math.abs(j1) + 0.5D, 2.0D); - - if (d0 > (double) (f * f)) { - ++j1; - } else { - aint1[b2] = aint[b2] + j1; - Block block1 = this.world.getType(aint1[0], aint1[1], aint1[2]); - - if (block1.getMaterial() != Material.AIR && block1.getMaterial() != Material.LEAVES) { - ++j1; - } else { - this.setTypeAndData(this.world, aint1[0], aint1[1], aint1[2], block, 0); - ++j1; - } - } - } - } - } - - float a(int i) { - if ((double) i < (double) ((float) this.e) * 0.3D) { - return -1.618F; - } else { - float f = (float) this.e / 2.0F; - float f1 = (float) this.e / 2.0F - (float) i; - float f2; - - if (f1 == 0.0F) { - f2 = f; - } else if (Math.abs(f1) >= f) { - f2 = 0.0F; - } else { - f2 = (float) Math.sqrt(Math.pow((double) Math.abs(f), 2.0D) - Math.pow((double) Math.abs(f1), 2.0D)); - } - - f2 *= 0.5F; - return f2; - } - } - - float b(int i) { - return i >= 0 && i < this.n ? (i != 0 && i != this.n - 1 ? 3.0F : 2.0F) : -1.0F; - } - - void a(int i, int j, int k) { - int l = j; - - for (int i1 = j + this.n; l < i1; ++l) { - float f = this.b(l - j); - - this.a(i, l, k, f, (byte) 1, Blocks.LEAVES); - } - } - - void a(int[] aint, int[] aint1, Block block) { - int[] aint2 = new int[] { 0, 0, 0}; - byte b0 = 0; - - byte b1; - - for (b1 = 0; b0 < 3; ++b0) { - aint2[b0] = aint1[b0] - aint[b0]; - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { - b1 = b0; - } - } - - if (aint2[b1] != 0) { - byte b2 = a[b1]; - byte b3 = a[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) { - b4 = 1; - } else { - b4 = -1; - } - - double d0 = (double) aint2[b2] / (double) aint2[b1]; - double d1 = (double) aint2[b3] / (double) aint2[b1]; - int[] aint3 = new int[] { 0, 0, 0}; - int i = 0; - - for (int j = aint2[b1] + b4; i != j; i += b4) { - aint3[b1] = MathHelper.floor((double) (aint[b1] + i) + 0.5D); - aint3[b2] = MathHelper.floor((double) aint[b2] + (double) i * d0 + 0.5D); - aint3[b3] = MathHelper.floor((double) aint[b3] + (double) i * d1 + 0.5D); - byte b5 = 0; - int k = Math.abs(aint3[0] - aint[0]); - int l = Math.abs(aint3[2] - aint[2]); - int i1 = Math.max(k, l); - - if (i1 > 0) { - if (k == i1) { - b5 = 4; - } else if (l == i1) { - b5 = 8; - } - } - - this.setTypeAndData(this.world, aint3[0], aint3[1], aint3[2], block, b5); - } - } - } - - void b() { - int i = 0; - - for (int j = this.o.length; i < j; ++i) { - int k = this.o[i][0]; - int l = this.o[i][1]; - int i1 = this.o[i][2]; - - this.a(k, l, i1); - } - } - - boolean c(int i) { - return (double) i >= (double) this.e * 0.2D; - } - - void c() { - int i = this.d[0]; - int j = this.d[1]; - int k = this.d[1] + this.f; - int l = this.d[2]; - int[] aint = new int[] { i, j, l}; - int[] aint1 = new int[] { i, k, l}; - - this.a(aint, aint1, Blocks.LOG); - if (this.l == 2) { - ++aint[0]; - ++aint1[0]; - this.a(aint, aint1, Blocks.LOG); - ++aint[2]; - ++aint1[2]; - this.a(aint, aint1, Blocks.LOG); - aint[0] += -1; - aint1[0] += -1; - this.a(aint, aint1, Blocks.LOG); - } - } - - void d() { - int i = 0; - int j = this.o.length; - - for (int[] aint = new int[] { this.d[0], this.d[1], this.d[2]}; i < j; ++i) { - int[] aint1 = this.o[i]; - int[] aint2 = new int[] { aint1[0], aint1[1], aint1[2]}; - - aint[1] = aint1[3]; - int k = aint[1] - this.d[1]; - - if (this.c(k)) { - this.a(aint, aint2, Blocks.LOG); - } - } - } - - int a(int[] aint, int[] aint1) { - int[] aint2 = new int[] { 0, 0, 0}; - byte b0 = 0; - - byte b1; - - for (b1 = 0; b0 < 3; ++b0) { - aint2[b0] = aint1[b0] - aint[b0]; - if (Math.abs(aint2[b0]) > Math.abs(aint2[b1])) { - b1 = b0; - } - } - - if (aint2[b1] == 0) { - return -1; - } else { - byte b2 = a[b1]; - byte b3 = a[b1 + 3]; - byte b4; - - if (aint2[b1] > 0) { - b4 = 1; - } else { - b4 = -1; - } - - double d0 = (double) aint2[b2] / (double) aint2[b1]; - double d1 = (double) aint2[b3] / (double) aint2[b1]; - int[] aint3 = new int[] { 0, 0, 0}; - int i = 0; - - int j; - - for (j = aint2[b1] + b4; i != j; i += b4) { - aint3[b1] = aint[b1] + i; - aint3[b2] = MathHelper.floor((double) aint[b2] + (double) i * d0); - aint3[b3] = MathHelper.floor((double) aint[b3] + (double) i * d1); - Block block = this.world.getType(aint3[0], aint3[1], aint3[2]); - - if (!this.a(block) || aint[1] >= 256) { // CraftBukkit - fix trees wrapping around - break; - } - } - - return i == j ? -1 : Math.abs(i); - } - } - - boolean e() { - int[] aint = new int[] { this.d[0], this.d[1], this.d[2]}; - int[] aint1 = new int[] { this.d[0], this.d[1] + this.e - 1, this.d[2]}; - Block block = this.world.getType(this.d[0], this.d[1] - 1, this.d[2]); - - if (block != Blocks.DIRT && block != Blocks.GRASS && block != Blocks.SOIL) { - return false; - } else { - int i = this.a(aint, aint1); - - if (i == -1) { - return true; - } else if (i < 6) { - return false; - } else { - this.e = i; - return true; - } - } - } - - public void a(double d0, double d1, double d2) { - this.m = (int) (d0 * 12.0D); - if (d0 > 0.5D) { - this.n = 5; - } - - this.j = d1; - this.k = d2; - } - - public boolean generate(World world, Random random, int i, int j, int k) { - this.world = world; - long l = random.nextLong(); - - this.b.setSeed(l); - this.d[0] = i; - this.d[1] = j; - this.d[2] = k; - if (this.e == 0) { - this.e = 5 + this.b.nextInt(this.m); - } - - if (!this.e()) { - return false; - } else { - this.a(); - this.b(); - this.c(); - this.d(); - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenGroundBush.java b/src/main/java/net/minecraft/server/WorldGenGroundBush.java deleted file mode 100644 index ea8fdb55..00000000 --- a/src/main/java/net/minecraft/server/WorldGenGroundBush.java +++ /dev/null @@ -1,53 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class WorldGenGroundBush extends WorldGenTrees { - - private int a; - private int b; - - public WorldGenGroundBush(int i, int j) { - super(false); - this.b = i; - this.a = j; - } - - public boolean a(World world, Random random, int i, int j, int k) { - Block block; - - while (((block = world.getType(i, j, k)).getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) && j > 0) { - --j; - } - - Block block1 = world.getType(i, j, k); - - if (block1 == Blocks.DIRT || block1 == Blocks.GRASS) { - ++j; - this.setTypeAndData(world, i, j, k, Blocks.LOG, this.b); - - for (int l = j; l <= j + 2; ++l) { - int i1 = l - j; - int j1 = 2 - i1; - - for (int k1 = i - j1; k1 <= i + j1; ++k1) { - int l1 = k1 - i; - - for (int i2 = k - j1; i2 <= k + j1; ++i2) { - int j2 = i2 - k; - - if ((Math.abs(l1) != j1 || Math.abs(j2) != j1 || random.nextInt(2) != 0) && !world.getType(k1, l, i2).j()) { - this.setTypeAndData(world, k1, l, i2, Blocks.LEAVES, this.a); - } - } - } - } - // CraftBukkit start - Return false if gen was unsuccessful - } else { - return false; - } - // CraftBukkit end - - return true; - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java b/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java deleted file mode 100644 index 0fd21716..00000000 --- a/src/main/java/net/minecraft/server/WorldGenMegaTreeAbstract.java +++ /dev/null @@ -1,126 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public abstract class WorldGenMegaTreeAbstract extends WorldGenTreeAbstract { - - protected final int a; - protected final int b; - protected final int c; - protected int d; - - public WorldGenMegaTreeAbstract(boolean flag, int i, int j, int k, int l) { - super(flag); - this.a = i; - this.d = j; - this.b = k; - this.c = l; - } - - protected int a(Random random) { - int i = random.nextInt(3) + this.a; - - if (this.d > 1) { - i += random.nextInt(this.d); - } - - return i; - } - - private boolean b(World world, Random random, int i, int j, int k, int l) { - boolean flag = true; - - if (j >= 1 && j + l + 1 <= 256) { - for (int i1 = j; i1 <= j + 1 + l; ++i1) { - byte b0 = 2; - - if (i1 == j) { - b0 = 1; - } - - if (i1 >= j + 1 + l - 2) { - b0 = 2; - } - - for (int j1 = i - b0; j1 <= i + b0 && flag; ++j1) { - for (int k1 = k - b0; k1 <= k + b0 && flag; ++k1) { - if (i1 >= 0 && i1 < 256) { - Block block = world.getType(j1, i1, k1); - - // CraftBukkit - ignore our own saplings - if (block != Blocks.SAPLING && !this.a(block)) { - flag = false; - } - } else { - flag = false; - } - } - } - } - - return flag; - } else { - return false; - } - } - - private boolean c(World world, Random random, int i, int j, int k) { - Block block = world.getType(i, j - 1, k); - - if ((block == Blocks.GRASS || block == Blocks.DIRT) && j >= 2) { - world.setTypeAndData(i, j - 1, k, Blocks.DIRT, 0, 2); - world.setTypeAndData(i + 1, j - 1, k, Blocks.DIRT, 0, 2); - world.setTypeAndData(i, j - 1, k + 1, Blocks.DIRT, 0, 2); - world.setTypeAndData(i + 1, j - 1, k + 1, Blocks.DIRT, 0, 2); - return true; - } else { - return false; - } - } - - protected boolean a(World world, Random random, int i, int j, int k, int l) { - return this.b(world, random, i, j, k, l) && this.c(world, random, i, j, k); - } - - protected void a(World world, int i, int j, int k, int l, Random random) { - int i1 = l * l; - - for (int j1 = i - l; j1 <= i + l + 1; ++j1) { - int k1 = j1 - i; - - for (int l1 = k - l; l1 <= k + l + 1; ++l1) { - int i2 = l1 - k; - int j2 = k1 - 1; - int k2 = i2 - 1; - - if (k1 * k1 + i2 * i2 <= i1 || j2 * j2 + k2 * k2 <= i1 || k1 * k1 + k2 * k2 <= i1 || j2 * j2 + i2 * i2 <= i1) { - Block block = world.getType(j1, j, l1); - - if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) { - this.setTypeAndData(world, j1, j, l1, Blocks.LEAVES, this.c); - } - } - } - } - } - - protected void b(World world, int i, int j, int k, int l, Random random) { - int i1 = l * l; - - for (int j1 = i - l; j1 <= i + l; ++j1) { - int k1 = j1 - i; - - for (int l1 = k - l; l1 <= k + l; ++l1) { - int i2 = l1 - k; - - if (k1 * k1 + i2 * i2 <= i1) { - Block block = world.getType(j1, j, l1); - - if (block.getMaterial() == Material.AIR || block.getMaterial() == Material.LEAVES) { - this.setTypeAndData(world, j1, j, l1, Blocks.LEAVES, this.c); - } - } - } - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenVillagePiece.java b/src/main/java/net/minecraft/server/WorldGenVillagePiece.java deleted file mode 100644 index dd228e77..00000000 --- a/src/main/java/net/minecraft/server/WorldGenVillagePiece.java +++ /dev/null @@ -1,189 +0,0 @@ -package net.minecraft.server; - -import java.util.List; -import java.util.Random; - -abstract class WorldGenVillagePiece extends StructurePiece { - - protected int k = -1; - private int a; - private boolean b; - - public WorldGenVillagePiece() {} - - protected WorldGenVillagePiece(WorldGenVillageStartPiece worldgenvillagestartpiece, int i) { - super(i); - if (worldgenvillagestartpiece != null) { - this.b = worldgenvillagestartpiece.b; - } - } - - protected void a(NBTTagCompound nbttagcompound) { - nbttagcompound.setInt("HPos", this.k); - nbttagcompound.setInt("VCount", this.a); - nbttagcompound.setBoolean("Desert", this.b); - } - - protected void b(NBTTagCompound nbttagcompound) { - this.k = nbttagcompound.getInt("HPos"); - this.a = nbttagcompound.getInt("VCount"); - this.b = nbttagcompound.getBoolean("Desert"); - } - - protected StructurePiece a(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j) { - switch (this.g) { - case 0: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a - 1, this.f.b + i, this.f.c + j, 1, this.d()); - - case 1: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.c - 1, 2, this.d()); - - case 2: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a - 1, this.f.b + i, this.f.c + j, 1, this.d()); - - case 3: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.c - 1, 2, this.d()); - - default: - return null; - } - } - - protected StructurePiece b(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j) { - switch (this.g) { - case 0: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.d + 1, this.f.b + i, this.f.c + j, 3, this.d()); - - case 1: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.f + 1, 0, this.d()); - - case 2: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.d + 1, this.f.b + i, this.f.c + j, 3, this.d()); - - case 3: - return WorldGenVillagePieces.a(worldgenvillagestartpiece, list, random, this.f.a + j, this.f.b + i, this.f.f + 1, 0, this.d()); - - default: - return null; - } - } - - protected int b(World world, StructureBoundingBox structureboundingbox) { - int i = 0; - int j = 0; - - for (int k = this.f.c; k <= this.f.f; ++k) { - for (int l = this.f.a; l <= this.f.d; ++l) { - if (structureboundingbox.b(l, 64, k)) { - i += Math.max(world.i(l, k), world.worldProvider.getSeaLevel()); - ++j; - } - } - } - - if (j == 0) { - return -1; - } else { - return i / j; - } - } - - protected static boolean a(StructureBoundingBox structureboundingbox) { - return structureboundingbox != null && structureboundingbox.b > 10; - } - - protected void a(World world, StructureBoundingBox structureboundingbox, int i, int j, int k, int l) { - if (this.a < l) { - for (int i1 = this.a; i1 < l; ++i1) { - int j1 = this.a(i + i1, k); - int k1 = this.a(j); - int l1 = this.b(i + i1, k); - - if (!structureboundingbox.b(j1, k1, l1)) { - break; - } - - ++this.a; - EntityVillager entityvillager = new EntityVillager(world, this.b(i1)); - - entityvillager.setPositionRotation((double) j1 + 0.5D, (double) k1, (double) l1 + 0.5D, 0.0F, 0.0F); - world.addEntity(entityvillager, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } - } - - protected int b(int i) { - return 0; - } - - protected Block b(Block block, int i) { - if (this.b) { - if (block == Blocks.LOG || block == Blocks.LOG2) { - return Blocks.SANDSTONE; - } - - if (block == Blocks.COBBLESTONE) { - return Blocks.SANDSTONE; - } - - if (block == Blocks.WOOD) { - return Blocks.SANDSTONE; - } - - if (block == Blocks.WOOD_STAIRS) { - return Blocks.SANDSTONE_STAIRS; - } - - if (block == Blocks.COBBLESTONE_STAIRS) { - return Blocks.SANDSTONE_STAIRS; - } - - if (block == Blocks.GRAVEL) { - return Blocks.SANDSTONE; - } - } - - return block; - } - - protected int c(Block block, int i) { - if (this.b) { - if (block == Blocks.LOG || block == Blocks.LOG2) { - return 0; - } - - if (block == Blocks.COBBLESTONE) { - return 0; - } - - if (block == Blocks.WOOD) { - return 2; - } - } - - return i; - } - - protected void a(World world, Block block, int i, int j, int k, int l, StructureBoundingBox structureboundingbox) { - Block block1 = this.b(block, i); - int i1 = this.c(block, i); - - super.a(world, block1, i1, j, k, l, structureboundingbox); - } - - protected void a(World world, StructureBoundingBox structureboundingbox, int i, int j, int k, int l, int i1, int j1, Block block, Block block1, boolean flag) { - Block block2 = this.b(block, 0); - int k1 = this.c(block, 0); - Block block3 = this.b(block1, 0); - int l1 = this.c(block1, 0); - - super.a(world, structureboundingbox, i, j, k, l, i1, j1, block2, k1, block3, l1, flag); - } - - protected void b(World world, Block block, int i, int j, int k, int l, StructureBoundingBox structureboundingbox) { - Block block1 = this.b(block, i); - int i1 = this.c(block, i); - - super.b(world, block1, i1, j, k, l, structureboundingbox); - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenVillagePieces.java b/src/main/java/net/minecraft/server/WorldGenVillagePieces.java deleted file mode 100644 index e08c6fe2..00000000 --- a/src/main/java/net/minecraft/server/WorldGenVillagePieces.java +++ /dev/null @@ -1,199 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Random; - -public class WorldGenVillagePieces { - - public static void a() { - WorldGenFactory.a(WorldGenVillageLibrary.class, "ViBH"); - WorldGenFactory.a(WorldGenVillageFarm2.class, "ViDF"); - WorldGenFactory.a(WorldGenVillageFarm.class, "ViF"); - WorldGenFactory.a(WorldGenVillageLight.class, "ViL"); - WorldGenFactory.a(WorldGenVillageButcher.class, "ViPH"); - WorldGenFactory.a(WorldGenVillageHouse.class, "ViSH"); - WorldGenFactory.a(WorldGenVillageHut.class, "ViSmH"); - WorldGenFactory.a(WorldGenVillageTemple.class, "ViST"); - WorldGenFactory.a(WorldGenVillageBlacksmith.class, "ViS"); - WorldGenFactory.a(WorldGenVillageStartPiece.class, "ViStart"); - WorldGenFactory.a(WorldGenVillageRoad.class, "ViSR"); - WorldGenFactory.a(WorldGenVillageHouse2.class, "ViTRH"); - WorldGenFactory.a(WorldGenVillageWell.class, "ViW"); - } - - public static List a(Random random, int i) { - ArrayList arraylist = new ArrayList(); - - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageHouse.class, 4, MathHelper.nextInt(random, 2 + i, 4 + i * 2))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageTemple.class, 20, MathHelper.nextInt(random, 0 + i, 1 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageLibrary.class, 20, MathHelper.nextInt(random, 0 + i, 2 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageHut.class, 3, MathHelper.nextInt(random, 2 + i, 5 + i * 3))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageButcher.class, 15, MathHelper.nextInt(random, 0 + i, 2 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageFarm2.class, 3, MathHelper.nextInt(random, 1 + i, 4 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageFarm.class, 3, MathHelper.nextInt(random, 2 + i, 4 + i * 2))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageBlacksmith.class, 15, MathHelper.nextInt(random, 0, 1 + i))); - arraylist.add(new WorldGenVillagePieceWeight(WorldGenVillageHouse2.class, 8, MathHelper.nextInt(random, 0 + i, 3 + i * 2))); - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - if (((WorldGenVillagePieceWeight) iterator.next()).d == 0) { - iterator.remove(); - } - } - - return arraylist; - } - - private static int a(List list) { - boolean flag = false; - int i = 0; - - WorldGenVillagePieceWeight worldgenvillagepieceweight; - - for (Iterator iterator = list.iterator(); iterator.hasNext(); i += worldgenvillagepieceweight.b) { - worldgenvillagepieceweight = (WorldGenVillagePieceWeight) iterator.next(); - if (worldgenvillagepieceweight.d > 0 && worldgenvillagepieceweight.c < worldgenvillagepieceweight.d) { - flag = true; - } - } - - return flag ? i : -1; - } - - private static WorldGenVillagePiece a(WorldGenVillageStartPiece worldgenvillagestartpiece, WorldGenVillagePieceWeight worldgenvillagepieceweight, List list, Random random, int i, int j, int k, int l, int i1) { - Class oclass = worldgenvillagepieceweight.a; - Object object = null; - - if (oclass == WorldGenVillageHouse.class) { - object = WorldGenVillageHouse.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageTemple.class) { - object = WorldGenVillageTemple.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageLibrary.class) { - object = WorldGenVillageLibrary.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageHut.class) { - object = WorldGenVillageHut.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageButcher.class) { - object = WorldGenVillageButcher.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageFarm2.class) { - object = WorldGenVillageFarm2.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageFarm.class) { - object = WorldGenVillageFarm.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageBlacksmith.class) { - object = WorldGenVillageBlacksmith.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } else if (oclass == WorldGenVillageHouse2.class) { - object = WorldGenVillageHouse2.a(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } - - return (WorldGenVillagePiece) object; - } - - private static WorldGenVillagePiece c(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - int j1 = a(worldgenvillagestartpiece.e); - - if (j1 <= 0) { - return null; - } else { - int k1 = 0; - - while (k1 < 5) { - ++k1; - int l1 = random.nextInt(j1); - Iterator iterator = worldgenvillagestartpiece.e.iterator(); - - while (iterator.hasNext()) { - WorldGenVillagePieceWeight worldgenvillagepieceweight = (WorldGenVillagePieceWeight) iterator.next(); - - l1 -= worldgenvillagepieceweight.b; - if (l1 < 0) { - if (!worldgenvillagepieceweight.a(i1) || worldgenvillagepieceweight == worldgenvillagestartpiece.d && worldgenvillagestartpiece.e.size() > 1) { - break; - } - - WorldGenVillagePiece worldgenvillagepiece = a(worldgenvillagestartpiece, worldgenvillagepieceweight, list, random, i, j, k, l, i1); - - if (worldgenvillagepiece != null) { - ++worldgenvillagepieceweight.c; - worldgenvillagestartpiece.d = worldgenvillagepieceweight; - if (!worldgenvillagepieceweight.a()) { - worldgenvillagestartpiece.e.remove(worldgenvillagepieceweight); - } - - return worldgenvillagepiece; - } - } - } - } - - StructureBoundingBox structureboundingbox = WorldGenVillageLight.a(worldgenvillagestartpiece, list, random, i, j, k, l); - - if (structureboundingbox != null) { - return new WorldGenVillageLight(worldgenvillagestartpiece, i1, random, structureboundingbox, l); - } else { - return null; - } - } - } - - private static StructurePiece d(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - if (i1 > 50) { - return null; - } else if (Math.abs(i - worldgenvillagestartpiece.c().a) <= 112 && Math.abs(k - worldgenvillagestartpiece.c().c) <= 112) { - WorldGenVillagePiece worldgenvillagepiece = c(worldgenvillagestartpiece, list, random, i, j, k, l, i1 + 1); - - if (worldgenvillagepiece != null) { - int j1 = (worldgenvillagepiece.f.a + worldgenvillagepiece.f.d) / 2; - int k1 = (worldgenvillagepiece.f.c + worldgenvillagepiece.f.f) / 2; - int l1 = worldgenvillagepiece.f.d - worldgenvillagepiece.f.a; - int i2 = worldgenvillagepiece.f.f - worldgenvillagepiece.f.c; - int j2 = l1 > i2 ? l1 : i2; - - if (worldgenvillagestartpiece.e().a(j1, k1, j2 / 2 + 4, WorldGenVillage.e)) { - list.add(worldgenvillagepiece); - worldgenvillagestartpiece.i.add(worldgenvillagepiece); - return worldgenvillagepiece; - } - } - - return null; - } else { - return null; - } - } - - private static StructurePiece e(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - if (i1 > 3 + worldgenvillagestartpiece.c) { - return null; - } else if (Math.abs(i - worldgenvillagestartpiece.c().a) <= 112 && Math.abs(k - worldgenvillagestartpiece.c().c) <= 112) { - StructureBoundingBox structureboundingbox = WorldGenVillageRoad.a(worldgenvillagestartpiece, list, random, i, j, k, l); - - if (structureboundingbox != null && structureboundingbox.b > 10) { - WorldGenVillageRoad worldgenvillageroad = new WorldGenVillageRoad(worldgenvillagestartpiece, i1, random, structureboundingbox, l); - int j1 = (worldgenvillageroad.f.a + worldgenvillageroad.f.d) / 2; - int k1 = (worldgenvillageroad.f.c + worldgenvillageroad.f.f) / 2; - int l1 = worldgenvillageroad.f.d - worldgenvillageroad.f.a; - int i2 = worldgenvillageroad.f.f - worldgenvillageroad.f.c; - int j2 = l1 > i2 ? l1 : i2; - - if (worldgenvillagestartpiece.e().a(j1, k1, j2 / 2 + 4, WorldGenVillage.e)) { - list.add(worldgenvillageroad); - worldgenvillagestartpiece.j.add(worldgenvillageroad); - return worldgenvillageroad; - } - } - - return null; - } else { - return null; - } - } - - static StructurePiece a(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - return d(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } - - static StructurePiece b(WorldGenVillageStartPiece worldgenvillagestartpiece, List list, Random random, int i, int j, int k, int l, int i1) { - return e(worldgenvillagestartpiece, list, random, i, j, k, l, i1); - } -} diff --git a/src/main/java/net/minecraft/server/WorldGenWitchHut.java b/src/main/java/net/minecraft/server/WorldGenWitchHut.java deleted file mode 100644 index ae60aeb8..00000000 --- a/src/main/java/net/minecraft/server/WorldGenWitchHut.java +++ /dev/null @@ -1,87 +0,0 @@ -package net.minecraft.server; - -import java.util.Random; - -public class WorldGenWitchHut extends WorldGenScatteredPiece { - - private boolean e; - - public WorldGenWitchHut() {} - - public WorldGenWitchHut(Random random, int i, int j) { - super(random, i, 64, j, 7, 5, 9); - } - - protected void a(NBTTagCompound nbttagcompound) { - super.a(nbttagcompound); - nbttagcompound.setBoolean("Witch", this.e); - } - - protected void b(NBTTagCompound nbttagcompound) { - super.b(nbttagcompound); - this.e = nbttagcompound.getBoolean("Witch"); - } - - public boolean a(World world, Random random, StructureBoundingBox structureboundingbox) { - if (!this.a(world, structureboundingbox, 0)) { - return false; - } else { - this.a(world, structureboundingbox, 1, 1, 1, 5, 1, 7, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 1, 4, 2, 5, 4, 7, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 2, 1, 0, 4, 1, 0, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 2, 2, 2, 3, 3, 2, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 1, 2, 3, 1, 3, 6, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 5, 2, 3, 5, 3, 6, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 2, 2, 7, 4, 3, 7, Blocks.WOOD, 1, Blocks.WOOD, 1, false); - this.a(world, structureboundingbox, 1, 0, 2, 1, 3, 2, Blocks.LOG, Blocks.LOG, false); - this.a(world, structureboundingbox, 5, 0, 2, 5, 3, 2, Blocks.LOG, Blocks.LOG, false); - this.a(world, structureboundingbox, 1, 0, 7, 1, 3, 7, Blocks.LOG, Blocks.LOG, false); - this.a(world, structureboundingbox, 5, 0, 7, 5, 3, 7, Blocks.LOG, Blocks.LOG, false); - this.a(world, Blocks.FENCE, 0, 2, 3, 2, structureboundingbox); - this.a(world, Blocks.FENCE, 0, 3, 3, 7, structureboundingbox); - this.a(world, Blocks.AIR, 0, 1, 3, 4, structureboundingbox); - this.a(world, Blocks.AIR, 0, 5, 3, 4, structureboundingbox); - this.a(world, Blocks.AIR, 0, 5, 3, 5, structureboundingbox); - this.a(world, Blocks.FLOWER_POT, 7, 1, 3, 5, structureboundingbox); - this.a(world, Blocks.WORKBENCH, 0, 3, 2, 6, structureboundingbox); - this.a(world, Blocks.CAULDRON, 0, 4, 2, 6, structureboundingbox); - this.a(world, Blocks.FENCE, 0, 1, 2, 1, structureboundingbox); - this.a(world, Blocks.FENCE, 0, 5, 2, 1, structureboundingbox); - int i = this.a(Blocks.WOOD_STAIRS, 3); - int j = this.a(Blocks.WOOD_STAIRS, 1); - int k = this.a(Blocks.WOOD_STAIRS, 0); - int l = this.a(Blocks.WOOD_STAIRS, 2); - - this.a(world, structureboundingbox, 0, 4, 1, 6, 4, 1, Blocks.SPRUCE_WOOD_STAIRS, i, Blocks.SPRUCE_WOOD_STAIRS, i, false); - this.a(world, structureboundingbox, 0, 4, 2, 0, 4, 7, Blocks.SPRUCE_WOOD_STAIRS, k, Blocks.SPRUCE_WOOD_STAIRS, k, false); - this.a(world, structureboundingbox, 6, 4, 2, 6, 4, 7, Blocks.SPRUCE_WOOD_STAIRS, j, Blocks.SPRUCE_WOOD_STAIRS, j, false); - this.a(world, structureboundingbox, 0, 4, 8, 6, 4, 8, Blocks.SPRUCE_WOOD_STAIRS, l, Blocks.SPRUCE_WOOD_STAIRS, l, false); - - int i1; - int j1; - - for (i1 = 2; i1 <= 7; i1 += 5) { - for (j1 = 1; j1 <= 5; j1 += 4) { - this.b(world, Blocks.LOG, 0, j1, -1, i1, structureboundingbox); - } - } - - if (!this.e) { - i1 = this.a(2, 5); - j1 = this.a(2); - int k1 = this.b(2, 5); - - if (structureboundingbox.b(i1, j1, k1)) { - this.e = true; - EntityWitch entitywitch = new EntityWitch(world); - - entitywitch.setPositionRotation((double) i1 + 0.5D, (double) j1, (double) k1 + 0.5D, 0.0F, 0.0F); - entitywitch.prepare((GroupDataEntity) null); - world.addEntity(entitywitch, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CHUNK_GEN); // CraftBukkit - add SpawnReason - } - } - - return true; - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldManager.java b/src/main/java/net/minecraft/server/WorldManager.java deleted file mode 100644 index b3499024..00000000 --- a/src/main/java/net/minecraft/server/WorldManager.java +++ /dev/null @@ -1,73 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; - -public class WorldManager implements IWorldAccess { - - private MinecraftServer server; - public WorldServer world; // CraftBukkit - private -> public - - public WorldManager(MinecraftServer minecraftserver, WorldServer worldserver) { - this.server = minecraftserver; - this.world = worldserver; - } - - public void a(String s, double d0, double d1, double d2, double d3, double d4, double d5) {} - - public void a(Entity entity) { - this.world.getTracker().track(entity); - } - - public void b(Entity entity) { - this.world.getTracker().untrackEntity(entity); - } - - public void a(String s, double d0, double d1, double d2, float f, float f1) { - // CraftBukkit - this.world.dimension - this.server.getPlayerList().sendPacketNearby(d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); - } - - public void a(EntityHuman entityhuman, String s, double d0, double d1, double d2, float f, float f1) { - // CraftBukkit - this.world.dimension - this.server.getPlayerList().sendPacketNearby(entityhuman, d0, d1, d2, f > 1.0F ? (double) (16.0F * f) : 16.0D, this.world.dimension, new PacketPlayOutNamedSoundEffect(s, d0, d1, d2, f, f1)); - } - - public void a(int i, int j, int k, int l, int i1, int j1) {} - - public void a(int i, int j, int k) { - this.world.getPlayerChunkMap().flagDirty(i, j, k); - } - - public void b(int i, int j, int k) {} - - public void a(String s, int i, int j, int k) {} - - public void a(EntityHuman entityhuman, int i, int j, int k, int l, int i1) { - // CraftBukkit - this.world.dimension - this.server.getPlayerList().sendPacketNearby(entityhuman, (double) j, (double) k, (double) l, 64.0D, this.world.dimension, new PacketPlayOutWorldEvent(i, j, k, l, i1, false)); - } - - public void a(int i, int j, int k, int l, int i1) { - this.server.getPlayerList().sendAll(new PacketPlayOutWorldEvent(i, j, k, l, i1, true)); - } - - public void b(int i, int j, int k, int l, int i1) { - Iterator iterator = this.server.getPlayerList().players.iterator(); - - while (iterator.hasNext()) { - EntityPlayer entityplayer = (EntityPlayer) iterator.next(); - - if (entityplayer != null && entityplayer.world == this.world && entityplayer.getId() != i) { - double d0 = (double) j - entityplayer.locX; - double d1 = (double) k - entityplayer.locY; - double d2 = (double) l - entityplayer.locZ; - - if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { - entityplayer.playerConnection.sendPacket(new PacketPlayOutBlockBreakAnimation(i, j, k, l, i1)); - } - } - } - } - - public void b() {} -} diff --git a/src/main/java/net/minecraft/server/WorldMap.java b/src/main/java/net/minecraft/server/WorldMap.java deleted file mode 100644 index bd5cfca8..00000000 --- a/src/main/java/net/minecraft/server/WorldMap.java +++ /dev/null @@ -1,243 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -// CraftBukkit start -import java.util.UUID; - -import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.map.CraftMapView; -// CraftBukkit end - -public class WorldMap extends PersistentBase { - - public int centerX; - public int centerZ; - public byte map; - public byte scale; - public byte[] colors = new byte[16384]; - public List f = new ArrayList(); - private Map i = new HashMap(); - public Map decorations = new LinkedHashMap(); - - // CraftBukkit start - public final CraftMapView mapView; - private CraftServer server; - private UUID uniqueId = null; - // CraftBukkit end - - public WorldMap(String s) { - super(s); - // CraftBukkit start - mapView = new CraftMapView(this); - server = (CraftServer) org.bukkit.Bukkit.getServer(); - // CraftBukkit end - } - - public void a(NBTTagCompound nbttagcompound) { - // CraftBukkit start - byte dimension = nbttagcompound.getByte("dimension"); - - if (dimension >= 10) { - long least = nbttagcompound.getLong("UUIDLeast"); - long most = nbttagcompound.getLong("UUIDMost"); - - if (least != 0L && most != 0L) { - this.uniqueId = new UUID(most, least); - - CraftWorld world = (CraftWorld) server.getWorld(this.uniqueId); - // Check if the stored world details are correct. - if (world == null) { - /* All Maps which do not have their valid world loaded are set to a dimension which hopefully won't be reached. - This is to prevent them being corrupted with the wrong map data. */ - dimension = 127; - } else { - dimension = (byte) world.getHandle().dimension; - } - } - } - - this.map = dimension; - // CraftBukkit end - this.centerX = nbttagcompound.getInt("xCenter"); - this.centerZ = nbttagcompound.getInt("zCenter"); - this.scale = nbttagcompound.getByte("scale"); - if (this.scale < 0) { - this.scale = 0; - } - - if (this.scale > 4) { - this.scale = 4; - } - - short short1 = nbttagcompound.getShort("width"); - short short2 = nbttagcompound.getShort("height"); - - if (short1 == 128 && short2 == 128) { - this.colors = nbttagcompound.getByteArray("colors"); - } else { - byte[] abyte = nbttagcompound.getByteArray("colors"); - - this.colors = new byte[16384]; - int i = (128 - short1) / 2; - int j = (128 - short2) / 2; - - for (int k = 0; k < short2; ++k) { - int l = k + j; - - if (l >= 0 || l < 128) { - for (int i1 = 0; i1 < short1; ++i1) { - int j1 = i1 + i; - - if (j1 >= 0 || j1 < 128) { - this.colors[j1 + l * 128] = abyte[i1 + k * short1]; - } - } - } - } - } - } - - public void b(NBTTagCompound nbttagcompound) { - // CraftBukkit start - if (this.map >= 10) { - if (this.uniqueId == null) { - for (org.bukkit.World world : server.getWorlds()) { - CraftWorld cWorld = (CraftWorld) world; - if (cWorld.getHandle().dimension == this.map) { - this.uniqueId = cWorld.getUID(); - break; - } - } - } - /* Perform a second check to see if a matching world was found, this is a necessary - change incase Maps are forcefully unlinked from a World and lack a UID.*/ - if (this.uniqueId != null) { - nbttagcompound.setLong("UUIDLeast", this.uniqueId.getLeastSignificantBits()); - nbttagcompound.setLong("UUIDMost", this.uniqueId.getMostSignificantBits()); - } - } - // CraftBukkit end - nbttagcompound.setByte("dimension", this.map); - nbttagcompound.setInt("xCenter", this.centerX); - nbttagcompound.setInt("zCenter", this.centerZ); - nbttagcompound.setByte("scale", this.scale); - nbttagcompound.setShort("width", (short) 128); - nbttagcompound.setShort("height", (short) 128); - nbttagcompound.setByteArray("colors", this.colors); - } - - public void a(EntityHuman entityhuman, ItemStack itemstack) { - if (!this.i.containsKey(entityhuman)) { - WorldMapHumanTracker worldmaphumantracker = new WorldMapHumanTracker(this, entityhuman); - - this.i.put(entityhuman, worldmaphumantracker); - this.f.add(worldmaphumantracker); - } - - if (!entityhuman.inventory.c(itemstack)) { - this.decorations.remove(entityhuman.getName()); - } - - for (int i = 0; i < this.f.size(); ++i) { - WorldMapHumanTracker worldmaphumantracker1 = (WorldMapHumanTracker) this.f.get(i); - - if (!worldmaphumantracker1.trackee.dead && (worldmaphumantracker1.trackee.inventory.c(itemstack) || itemstack.A())) { - if (!itemstack.A() && worldmaphumantracker1.trackee.dimension == this.map) { - this.a(0, worldmaphumantracker1.trackee.world, worldmaphumantracker1.trackee.getName(), worldmaphumantracker1.trackee.locX, worldmaphumantracker1.trackee.locZ, (double) worldmaphumantracker1.trackee.yaw); - } - } else { - this.i.remove(worldmaphumantracker1.trackee); - this.f.remove(worldmaphumantracker1); - } - } - - if (itemstack.A()) { - this.a(1, entityhuman.world, "frame-" + itemstack.B().getId(), (double) itemstack.B().x, (double) itemstack.B().z, (double) (itemstack.B().direction * 90)); - } - } - - private void a(int i, World world, String s, double d0, double d1, double d2) { - int j = 1 << this.scale; - float f = (float) (d0 - (double) this.centerX) / (float) j; - float f1 = (float) (d1 - (double) this.centerZ) / (float) j; - byte b0 = (byte) ((int) ((double) (f * 2.0F) + 0.5D)); - byte b1 = (byte) ((int) ((double) (f1 * 2.0F) + 0.5D)); - byte b2 = 63; - byte b3; - - if (f >= (float) (-b2) && f1 >= (float) (-b2) && f <= (float) b2 && f1 <= (float) b2) { - d2 += d2 < 0.0D ? -8.0D : 8.0D; - b3 = (byte) ((int) (d2 * 16.0D / 360.0D)); - if (this.map < 0) { - int k = (int) (world.getWorldData().getDayTime() / 10L); - - b3 = (byte) (k * k * 34187121 + k * 121 >> 15 & 15); - } - } else { - if (Math.abs(f) >= 320.0F || Math.abs(f1) >= 320.0F) { - this.decorations.remove(s); - return; - } - - i = 6; - b3 = 0; - if (f <= (float) (-b2)) { - b0 = (byte) ((int) ((double) (b2 * 2) + 2.5D)); - } - - if (f1 <= (float) (-b2)) { - b1 = (byte) ((int) ((double) (b2 * 2) + 2.5D)); - } - - if (f >= (float) b2) { - b0 = (byte) (b2 * 2 + 1); - } - - if (f1 >= (float) b2) { - b1 = (byte) (b2 * 2 + 1); - } - } - - this.decorations.put(s, new WorldMapDecoration(this, (byte) i, b0, b1, b3)); - } - - public byte[] getUpdatePacket(ItemStack itemstack, World world, EntityHuman entityhuman) { - WorldMapHumanTracker worldmaphumantracker = (WorldMapHumanTracker) this.i.get(entityhuman); - - return worldmaphumantracker == null ? null : worldmaphumantracker.a(itemstack); - } - - public void flagDirty(int i, int j, int k) { - super.c(); - - for (int l = 0; l < this.f.size(); ++l) { - WorldMapHumanTracker worldmaphumantracker = (WorldMapHumanTracker) this.f.get(l); - - if (worldmaphumantracker.b[i] < 0 || worldmaphumantracker.b[i] > j) { - worldmaphumantracker.b[i] = j; - } - - if (worldmaphumantracker.c[i] < 0 || worldmaphumantracker.c[i] < k) { - worldmaphumantracker.c[i] = k; - } - } - } - - public WorldMapHumanTracker a(EntityHuman entityhuman) { - WorldMapHumanTracker worldmaphumantracker = (WorldMapHumanTracker) this.i.get(entityhuman); - - if (worldmaphumantracker == null) { - worldmaphumantracker = new WorldMapHumanTracker(this, entityhuman); - this.i.put(entityhuman, worldmaphumantracker); - this.f.add(worldmaphumantracker); - } - - return worldmaphumantracker; - } -} diff --git a/src/main/java/net/minecraft/server/WorldMapHumanTracker.java b/src/main/java/net/minecraft/server/WorldMapHumanTracker.java deleted file mode 100644 index ec708d1a..00000000 --- a/src/main/java/net/minecraft/server/WorldMapHumanTracker.java +++ /dev/null @@ -1,103 +0,0 @@ -package net.minecraft.server; - -import java.util.Iterator; - -public class WorldMapHumanTracker { - - public final EntityHuman trackee; - public int[] b; - public int[] c; - private int f; - private int g; - private byte[] h; - public int d; - private boolean i; - final WorldMap worldMap; - - public WorldMapHumanTracker(WorldMap worldmap, EntityHuman entityhuman) { - this.worldMap = worldmap; - this.b = new int[128]; - this.c = new int[128]; - this.trackee = entityhuman; - - for (int i = 0; i < this.b.length; ++i) { - this.b[i] = 0; - this.c[i] = 127; - } - } - - public byte[] a(ItemStack itemstack) { - byte[] abyte; - - if (!this.i) { - abyte = new byte[] { (byte) 2, this.worldMap.scale}; - this.i = true; - return abyte; - } else { - int i; - int j; - - org.bukkit.craftbukkit.map.RenderData render = this.worldMap.mapView.render((org.bukkit.craftbukkit.entity.CraftPlayer) trackee.getBukkitEntity()); // CraftBukkit - - if (--this.g < 0) { - this.g = 4; - abyte = new byte[render.cursors.size() * 3 + 1]; // CraftBukkit - abyte[0] = 1; - i = 0; - - // CraftBukkit start - for (i = 0; i < render.cursors.size(); ++i) { - org.bukkit.map.MapCursor cursor = render.cursors.get(i); - if (!cursor.isVisible()) continue; - - abyte[i * 3 + 1] = (byte) (cursor.getRawType() << 4 | cursor.getDirection() & 15); - abyte[i * 3 + 2] = (byte) cursor.getX(); - abyte[i * 3 + 3] = (byte) cursor.getY(); - } - // CraftBukkit end - - boolean flag = !itemstack.A(); - - if (this.h != null && this.h.length == abyte.length) { - for (j = 0; j < abyte.length; ++j) { - if (abyte[j] != this.h[j]) { - flag = false; - break; - } - } - } else { - flag = false; - } - - if (!flag) { - this.h = abyte; - return abyte; - } - } - - for (int k = 0; k < 1; ++k) { - i = this.f++ * 11 % 128; - if (this.b[i] >= 0) { - int l = this.c[i] - this.b[i] + 1; - - j = this.b[i]; - byte[] abyte1 = new byte[l + 3]; - - abyte1[0] = 0; - abyte1[1] = (byte) i; - abyte1[2] = (byte) j; - - for (int i1 = 0; i1 < abyte1.length - 3; ++i1) { - abyte1[i1 + 3] = render.buffer[(i1 + j) * 128 + i]; // CraftBukkit - } - - this.c[i] = -1; - this.b[i] = -1; - return abyte1; - } - } - - return null; - } - } -} diff --git a/src/main/java/net/minecraft/server/WorldNBTStorage.java b/src/main/java/net/minecraft/server/WorldNBTStorage.java deleted file mode 100644 index 93ff8d3b..00000000 --- a/src/main/java/net/minecraft/server/WorldNBTStorage.java +++ /dev/null @@ -1,310 +0,0 @@ -package net.minecraft.server; - -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import java.util.UUID; - -import org.bukkit.craftbukkit.entity.CraftPlayer; -// CraftBukkit end - -public class WorldNBTStorage implements IDataManager, IPlayerFileData { - - private static final Logger a = LogManager.getLogger(); - private final File baseDir; - private final File playerDir; - private final File dataDir; - private final long sessionId = MinecraftServer.ar(); - private final String f; - private UUID uuid = null; // CraftBukkit - - public WorldNBTStorage(File file1, String s, boolean flag) { - this.baseDir = new File(file1, s); - this.baseDir.mkdirs(); - this.playerDir = new File(this.baseDir, "playerdata"); - this.dataDir = new File(this.baseDir, "data"); - this.dataDir.mkdirs(); - this.f = s; - if (flag) { - this.playerDir.mkdirs(); - } - - this.h(); - } - - private void h() { - try { - File file1 = new File(this.baseDir, "session.lock"); - DataOutputStream dataoutputstream = new DataOutputStream(new FileOutputStream(file1)); - - try { - dataoutputstream.writeLong(this.sessionId); - } finally { - dataoutputstream.close(); - } - } catch (IOException ioexception) { - ioexception.printStackTrace(); - throw new RuntimeException("Failed to check session lock, aborting"); - } - } - - public File getDirectory() { - return this.baseDir; - } - - public void checkSession() throws ExceptionWorldConflict { // CraftBukkit - throws ExceptionWorldConflict - try { - File file1 = new File(this.baseDir, "session.lock"); - DataInputStream datainputstream = new DataInputStream(new FileInputStream(file1)); - - try { - if (datainputstream.readLong() != this.sessionId) { - throw new ExceptionWorldConflict("The save is being accessed from another location, aborting"); - } - } finally { - datainputstream.close(); - } - } catch (IOException ioexception) { - throw new ExceptionWorldConflict("Failed to check session lock, aborting"); - } - } - - public IChunkLoader createChunkLoader(WorldProvider worldprovider) { - throw new RuntimeException("Old Chunk Storage is no longer supported."); - } - - public WorldData getWorldData() { - File file1 = new File(this.baseDir, "level.dat"); - NBTTagCompound nbttagcompound; - NBTTagCompound nbttagcompound1; - - if (file1.exists()) { - try { - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - nbttagcompound1 = nbttagcompound.getCompound("Data"); - return new WorldData(nbttagcompound1); - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - file1 = new File(this.baseDir, "level.dat_old"); - if (file1.exists()) { - try { - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - nbttagcompound1 = nbttagcompound.getCompound("Data"); - return new WorldData(nbttagcompound1); - } catch (Exception exception1) { - exception1.printStackTrace(); - } - } - - return null; - } - - public void saveWorldData(WorldData worlddata, NBTTagCompound nbttagcompound) { - NBTTagCompound nbttagcompound1 = worlddata.a(nbttagcompound); - NBTTagCompound nbttagcompound2 = new NBTTagCompound(); - - nbttagcompound2.set("Data", nbttagcompound1); - - try { - File file1 = new File(this.baseDir, "level.dat_new"); - File file2 = new File(this.baseDir, "level.dat_old"); - File file3 = new File(this.baseDir, "level.dat"); - - NBTCompressedStreamTools.a(nbttagcompound2, (OutputStream) (new FileOutputStream(file1))); - if (file2.exists()) { - file2.delete(); - } - - file3.renameTo(file2); - if (file3.exists()) { - file3.delete(); - } - - file1.renameTo(file3); - if (file1.exists()) { - file1.delete(); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void saveWorldData(WorldData worlddata) { - NBTTagCompound nbttagcompound = worlddata.a(); - NBTTagCompound nbttagcompound1 = new NBTTagCompound(); - - nbttagcompound1.set("Data", nbttagcompound); - - try { - File file1 = new File(this.baseDir, "level.dat_new"); - File file2 = new File(this.baseDir, "level.dat_old"); - File file3 = new File(this.baseDir, "level.dat"); - - NBTCompressedStreamTools.a(nbttagcompound1, (OutputStream) (new FileOutputStream(file1))); - if (file2.exists()) { - file2.delete(); - } - - file3.renameTo(file2); - if (file3.exists()) { - file3.delete(); - } - - file1.renameTo(file3); - if (file1.exists()) { - file1.delete(); - } - } catch (Exception exception) { - exception.printStackTrace(); - } - } - - public void save(EntityHuman entityhuman) { - try { - NBTTagCompound nbttagcompound = new NBTTagCompound(); - - entityhuman.e(nbttagcompound); - File file1 = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat.tmp"); - File file2 = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat"); - - NBTCompressedStreamTools.a(nbttagcompound, (OutputStream) (new FileOutputStream(file1))); - if (file2.exists()) { - file2.delete(); - } - - file1.renameTo(file2); - } catch (Exception exception) { - a.warn("Failed to save player data for " + entityhuman.getName()); - } - } - - public NBTTagCompound load(EntityHuman entityhuman) { - NBTTagCompound nbttagcompound = null; - - try { - File file1 = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat"); - - if (file1.exists() && file1.isFile()) { - nbttagcompound = NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - } - } catch (Exception exception) { - a.warn("Failed to load player data for " + entityhuman.getName()); - } - - if (nbttagcompound != null) { - // CraftBukkit start - if (entityhuman instanceof EntityPlayer) { - CraftPlayer player = (CraftPlayer) entityhuman.bukkitEntity; - // Only update first played if it is older than the one we have - long modified = new File(this.playerDir, entityhuman.getUniqueID().toString() + ".dat").lastModified(); - if (modified < player.getFirstPlayed()) { - player.setFirstPlayed(modified); - } - } - // CraftBukkit end - - entityhuman.f(nbttagcompound); - } - - return nbttagcompound; - } - - public NBTTagCompound getPlayerData(String s) { - try { - File file1 = new File(this.playerDir, s + ".dat"); - - if (file1.exists()) { - return NBTCompressedStreamTools.a((InputStream) (new FileInputStream(file1))); - } - } catch (Exception exception) { - a.warn("Failed to load player data for " + s); - } - - return null; - } - - public IPlayerFileData getPlayerFileData() { - return this; - } - - public String[] getSeenPlayers() { - String[] astring = this.playerDir.list(); - - for (int i = 0; i < astring.length; ++i) { - if (astring[i].endsWith(".dat")) { - astring[i] = astring[i].substring(0, astring[i].length() - 4); - } - } - - return astring; - } - - public void a() {} - - public File getDataFile(String s) { - return new File(this.dataDir, s + ".dat"); - } - - public String g() { - return this.f; - } - - // CraftBukkit start - public UUID getUUID() { - if (uuid != null) return uuid; - File file1 = new File(this.baseDir, "uid.dat"); - if (file1.exists()) { - DataInputStream dis = null; - try { - dis = new DataInputStream(new FileInputStream(file1)); - return uuid = new UUID(dis.readLong(), dis.readLong()); - } catch (IOException ex) { - a.warn("Failed to read " + file1 + ", generating new random UUID", ex); - } finally { - if (dis != null) { - try { - dis.close(); - } catch (IOException ex) { - // NOOP - } - } - } - } - uuid = UUID.randomUUID(); - DataOutputStream dos = null; - try { - dos = new DataOutputStream(new FileOutputStream(file1)); - dos.writeLong(uuid.getMostSignificantBits()); - dos.writeLong(uuid.getLeastSignificantBits()); - } catch (IOException ex) { - a.warn("Failed to write " + file1, ex); - } finally { - if (dos != null) { - try { - dos.close(); - } catch (IOException ex) { - // NOOP - } - } - } - return uuid; - } - - public File getPlayerDir() { - return playerDir; - } - // CraftBukkit end -} diff --git a/src/main/java/net/minecraft/server/WorldServer.java b/src/main/java/net/minecraft/server/WorldServer.java deleted file mode 100644 index ba7965db..00000000 --- a/src/main/java/net/minecraft/server/WorldServer.java +++ /dev/null @@ -1,1006 +0,0 @@ -package net.minecraft.server; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Random; -import java.util.Set; -import java.util.TreeSet; - -import net.minecraft.util.com.google.common.collect.Lists; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -// CraftBukkit start -import org.bukkit.WeatherType; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.util.LongHash; - -import org.bukkit.event.block.BlockFormEvent; -import org.bukkit.event.weather.LightningStrikeEvent; -import org.bukkit.event.weather.ThunderChangeEvent; -import org.bukkit.event.weather.WeatherChangeEvent; -// CraftBukkit end - -public class WorldServer extends World { - - private static final Logger a = LogManager.getLogger(); - private final MinecraftServer server; - public EntityTracker tracker; // CraftBukkit - private final -> public - private final PlayerChunkMap manager; - private Set M; - private TreeSet N; - public ChunkProviderServer chunkProviderServer; - public boolean savingDisabled; - private boolean O; - private int emptyTime; - private final PortalTravelAgent Q; - private final SpawnerCreature R = new SpawnerCreature(); - private BlockActionDataList[] S = new BlockActionDataList[] { new BlockActionDataList((BananaAPI) null), new BlockActionDataList((BananaAPI) null)}; - private int T; - private static final StructurePieceTreasure[] U = new StructurePieceTreasure[] { new StructurePieceTreasure(Items.STICK, 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.WOOD), 0, 1, 3, 10), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG), 0, 1, 3, 10), new StructurePieceTreasure(Items.STONE_AXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOOD_AXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.STONE_PICKAXE, 0, 1, 1, 3), new StructurePieceTreasure(Items.WOOD_PICKAXE, 0, 1, 1, 5), new StructurePieceTreasure(Items.APPLE, 0, 2, 3, 5), new StructurePieceTreasure(Items.BREAD, 0, 2, 3, 3), new StructurePieceTreasure(Item.getItemOf(Blocks.LOG2), 0, 1, 3, 10)}; - private List V = new ArrayList(); - private IntHashMap entitiesById; - - // CraftBukkit start - public final int dimension; - - // Add env and gen to constructor - public WorldServer(MinecraftServer minecraftserver, IDataManager idatamanager, String s, int i, WorldSettings worldsettings, MethodProfiler methodprofiler, org.bukkit.World.Environment env, org.bukkit.generator.ChunkGenerator gen) { - super(idatamanager, s, worldsettings, WorldProvider.byDimension(env.getId()), methodprofiler, gen, env); - this.dimension = i; - this.pvpMode = minecraftserver.getPvP(); - // CraftBukkit end - this.server = minecraftserver; - this.tracker = new EntityTracker(this); - this.manager = new PlayerChunkMap(this); - if (this.entitiesById == null) { - this.entitiesById = new IntHashMap(); - } - - if (this.M == null) { - this.M = new HashSet(); - } - - if (this.N == null) { - this.N = new TreeSet(); - } - - this.Q = new org.bukkit.craftbukkit.CraftTravelAgent(this); // CraftBukkit - this.scoreboard = new ScoreboardServer(minecraftserver); - PersistentScoreboard persistentscoreboard = (PersistentScoreboard) this.worldMaps.get(PersistentScoreboard.class, "scoreboard"); - - if (persistentscoreboard == null) { - persistentscoreboard = new PersistentScoreboard(); - this.worldMaps.a("scoreboard", persistentscoreboard); - } - - persistentscoreboard.a(this.scoreboard); - ((ScoreboardServer) this.scoreboard).a(persistentscoreboard); - } - - // CraftBukkit start - @Override - public TileEntity getTileEntity(int i, int j, int k) { - TileEntity result = super.getTileEntity(i, j, k); - Block type = getType(i, j, k); - - if (type == Blocks.CHEST) { - if (!(result instanceof TileEntityChest)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.FURNACE) { - if (!(result instanceof TileEntityFurnace)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.DROPPER) { - if (!(result instanceof TileEntityDropper)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.DISPENSER) { - if (!(result instanceof TileEntityDispenser)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.JUKEBOX) { - if (!(result instanceof TileEntityRecordPlayer)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.NOTE_BLOCK) { - if (!(result instanceof TileEntityNote)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.MOB_SPAWNER) { - if (!(result instanceof TileEntityMobSpawner)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if ((type == Blocks.SIGN_POST) || (type == Blocks.WALL_SIGN)) { - if (!(result instanceof TileEntitySign)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.ENDER_CHEST) { - if (!(result instanceof TileEntityEnderChest)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.BREWING_STAND) { - if (!(result instanceof TileEntityBrewingStand)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.BEACON) { - if (!(result instanceof TileEntityBeacon)) { - result = fixTileEntity(i, j, k, type, result); - } - } else if (type == Blocks.HOPPER) { - if (!(result instanceof TileEntityHopper)) { - result = fixTileEntity(i, j, k, type, result); - } - } - - return result; - } - - private TileEntity fixTileEntity(int x, int y, int z, Block type, TileEntity found) { - this.getServer().getLogger().severe("Block at " + x + "," + y + "," + z + " is " + org.bukkit.Material.getMaterial(Block.getId(type)).toString() + " but has " + found + ". " - + "Bukkit will attempt to fix this, but there may be additional damage that we cannot recover."); - - if (type instanceof IContainer) { - TileEntity replacement = ((IContainer) type).a(this, this.getData(x, y, z)); - replacement.world = this; - this.setTileEntity(x, y, z, replacement); - return replacement; - } else { - this.getServer().getLogger().severe("Don't know how to fix for this type... Can't do anything! :("); - return found; - } - } - - private boolean canSpawn(int x, int z) { - if (this.generator != null) { - return this.generator.canSpawn(this.getWorld(), x, z); - } else { - return this.worldProvider.canSpawn(x, z); - } - } - // CraftBukkit end - - public void doTick() { - super.doTick(); - if (this.getWorldData().isHardcore() && this.difficulty != EnumDifficulty.HARD) { - this.difficulty = EnumDifficulty.HARD; - } - - this.worldProvider.e.b(); - if (this.everyoneDeeplySleeping()) { - if (this.getGameRules().getBoolean("doDaylightCycle")) { - long i = this.worldData.getDayTime() + 24000L; - - this.worldData.setDayTime(i - i % 24000L); - } - - this.d(); - } - - this.methodProfiler.a("mobSpawner"); - // CraftBukkit start - Only call spawner if we have players online and the world allows for mobs or animals - long time = this.worldData.getTime(); - if (this.getGameRules().getBoolean("doMobSpawning") && (this.allowMonsters || this.allowAnimals) && (this instanceof WorldServer && this.players.size() > 0)) { - this.R.spawnEntities(this, this.allowMonsters && (this.ticksPerMonsterSpawns != 0 && time % this.ticksPerMonsterSpawns == 0L), this.allowAnimals && (this.ticksPerAnimalSpawns != 0 && time % this.ticksPerAnimalSpawns == 0L), this.worldData.getTime() % 400L == 0L); - // CraftBukkit end - } - - this.methodProfiler.c("chunkSource"); - this.chunkProvider.unloadChunks(); - int j = this.a(1.0F); - - if (j != this.j) { - this.j = j; - } - - this.worldData.setTime(this.worldData.getTime() + 1L); - if (this.getGameRules().getBoolean("doDaylightCycle")) { - this.worldData.setDayTime(this.worldData.getDayTime() + 1L); - } - - this.methodProfiler.c("tickPending"); - this.a(false); - this.methodProfiler.c("tickBlocks"); - this.g(); - this.methodProfiler.c("chunkMap"); - this.manager.flush(); - this.methodProfiler.c("village"); - this.villages.tick(); - this.siegeManager.a(); - this.methodProfiler.c("portalForcer"); - this.Q.a(this.getTime()); - this.methodProfiler.b(); - this.Z(); - - this.getWorld().processChunkGC(); // CraftBukkit - } - - public BiomeMeta a(EnumCreatureType enumcreaturetype, int i, int j, int k) { - List list = this.L().getMobsFor(enumcreaturetype, i, j, k); - - return list != null && !list.isEmpty() ? (BiomeMeta) WeightedRandom.a(this.random, (Collection) list) : null; - } - - public void everyoneSleeping() { - this.O = !this.players.isEmpty(); - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (!entityhuman.isSleeping() && !entityhuman.fauxSleeping) { // CraftBukkit - this.O = false; - break; - } - } - } - - protected void d() { - this.O = false; - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (entityhuman.isSleeping()) { - entityhuman.a(false, false, true); - } - } - - this.Y(); - } - - private void Y() { - // CraftBukkit start - WeatherChangeEvent weather = new WeatherChangeEvent(this.getWorld(), false); - this.getServer().getPluginManager().callEvent(weather); - - ThunderChangeEvent thunder = new ThunderChangeEvent(this.getWorld(), false); - this.getServer().getPluginManager().callEvent(thunder); - if (!weather.isCancelled()) { - this.worldData.setWeatherDuration(0); - this.worldData.setStorm(false); - } - if (!thunder.isCancelled()) { - this.worldData.setThunderDuration(0); - this.worldData.setThundering(false); - } - // CraftBukkit end - } - - public boolean everyoneDeeplySleeping() { - if (this.O && !this.isStatic) { - Iterator iterator = this.players.iterator(); - - // CraftBukkit - This allows us to assume that some people are in bed but not really, allowing time to pass in spite of AFKers - boolean foundActualSleepers = false; - - EntityHuman entityhuman; - - do { - if (!iterator.hasNext()) { - return foundActualSleepers; // CraftBukkit - } - - entityhuman = (EntityHuman) iterator.next(); - // CraftBukkit start - if (entityhuman.isDeeplySleeping()) { - foundActualSleepers = true; - } - } while (entityhuman.isDeeplySleeping() || entityhuman.fauxSleeping); - // CraftBukkit end - - return false; - } else { - return false; - } - } - - protected void g() { - super.g(); - int i = 0; - int j = 0; - // CraftBukkit start - // Iterator iterator = this.chunkTickList.iterator(); - - for (long chunkCoord : this.chunkTickList.popAll()) { - // ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next(); - int chunkX = LongHash.msw(chunkCoord); - int chunkZ = LongHash.lsw(chunkCoord); - int k = chunkX * 16; - int l = chunkZ * 16; - - this.methodProfiler.a("getChunk"); - Chunk chunk = this.getChunkAt(chunkX, chunkZ); - // CraftBukkit end - - this.a(k, l, chunk); - this.methodProfiler.c("tickChunk"); - chunk.b(false); - this.methodProfiler.c("thunder"); - int i1; - int j1; - int k1; - int l1; - - if (this.random.nextInt(100000) == 0 && this.Q() && this.P()) { - this.k = this.k * 3 + 1013904223; - i1 = this.k >> 2; - j1 = k + (i1 & 15); - k1 = l + (i1 >> 8 & 15); - l1 = this.h(j1, k1); - if (this.isRainingAt(j1, l1, k1)) { - this.strikeLightning(new EntityLightning(this, (double) j1, (double) l1, (double) k1)); - } - } - - this.methodProfiler.c("iceandsnow"); - if (this.random.nextInt(16) == 0) { - this.k = this.k * 3 + 1013904223; - i1 = this.k >> 2; - j1 = i1 & 15; - k1 = i1 >> 8 & 15; - l1 = this.h(j1 + k, k1 + l); - if (this.s(j1 + k, l1 - 1, k1 + l)) { - // CraftBukkit start - BlockState blockState = this.getWorld().getBlockAt(j1 + k, l1 - 1, k1 + l).getState(); - blockState.setTypeId(Block.getId(Blocks.ICE)); - - BlockFormEvent iceBlockForm = new BlockFormEvent(blockState.getBlock(), blockState); - this.getServer().getPluginManager().callEvent(iceBlockForm); - if (!iceBlockForm.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - - if (this.Q() && this.e(j1 + k, l1, k1 + l, true)) { - // CraftBukkit start - BlockState blockState = this.getWorld().getBlockAt(j1 + k, l1, k1 + l).getState(); - blockState.setTypeId(Block.getId(Blocks.SNOW)); - - BlockFormEvent snow = new BlockFormEvent(blockState.getBlock(), blockState); - this.getServer().getPluginManager().callEvent(snow); - if (!snow.isCancelled()) { - blockState.update(true); - } - // CraftBukkit end - } - - if (this.Q()) { - BiomeBase biomebase = this.getBiome(j1 + k, k1 + l); - - if (biomebase.e()) { - this.getType(j1 + k, l1 - 1, k1 + l).l(this, j1 + k, l1 - 1, k1 + l); - } - } - } - - this.methodProfiler.c("tickBlocks"); - ChunkSection[] achunksection = chunk.getSections(); - - j1 = achunksection.length; - - for (k1 = 0; k1 < j1; ++k1) { - ChunkSection chunksection = achunksection[k1]; - - if (chunksection != null && chunksection.shouldTick()) { - for (int i2 = 0; i2 < 3; ++i2) { - this.k = this.k * 3 + 1013904223; - int j2 = this.k >> 2; - int k2 = j2 & 15; - int l2 = j2 >> 8 & 15; - int i3 = j2 >> 16 & 15; - - ++j; - Block block = chunksection.getTypeId(k2, i3, l2); - - if (block.isTicking()) { - ++i; - block.a(this, k2 + k, i3 + chunksection.getYPosition(), l2 + l, this.random); - } - } - } - } - - this.methodProfiler.b(); - } - } - - public boolean a(int i, int j, int k, Block block) { - NextTickListEntry nextticklistentry = new NextTickListEntry(i, j, k, block); - - return this.V.contains(nextticklistentry); - } - - public void a(int i, int j, int k, Block block, int l) { - this.a(i, j, k, block, l, 0); - } - - public void a(int i, int j, int k, Block block, int l, int i1) { - NextTickListEntry nextticklistentry = new NextTickListEntry(i, j, k, block); - byte b0 = 0; - - if (this.d && block.getMaterial() != Material.AIR) { - if (block.L()) { - b0 = 8; - if (this.b(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) { - Block block1 = this.getType(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c); - - if (block1.getMaterial() != Material.AIR && block1 == nextticklistentry.a()) { - block1.a(this, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, this.random); - } - } - - return; - } - - l = 1; - } - - if (this.b(i - b0, j - b0, k - b0, i + b0, j + b0, k + b0)) { - if (block.getMaterial() != Material.AIR) { - nextticklistentry.a((long) l + this.worldData.getTime()); - nextticklistentry.a(i1); - } - - if (!this.M.contains(nextticklistentry)) { - this.M.add(nextticklistentry); - this.N.add(nextticklistentry); - } - } - } - - public void b(int i, int j, int k, Block block, int l, int i1) { - NextTickListEntry nextticklistentry = new NextTickListEntry(i, j, k, block); - - nextticklistentry.a(i1); - if (block.getMaterial() != Material.AIR) { - nextticklistentry.a((long) l + this.worldData.getTime()); - } - - if (!this.M.contains(nextticklistentry)) { - this.M.add(nextticklistentry); - this.N.add(nextticklistentry); - } - } - - public void tickEntities() { - if (false && this.players.isEmpty()) { // CraftBukkit - this prevents entity cleanup, other issues on servers with no players - if (this.emptyTime++ >= 1200) { - return; - } - } else { - this.i(); - } - - super.tickEntities(); - } - - public void i() { - this.emptyTime = 0; - } - - public boolean a(boolean flag) { - int i = this.N.size(); - - if (i != this.M.size()) { - throw new IllegalStateException("TickNextTick list out of synch"); - } else { - if (i > 1000) { - // CraftBukkit start - If the server has too much to process over time, try to alleviate that - if (i > 20 * 1000) { - i = i / 20; - } else { - i = 1000; - } - // CraftBukkit end - } - - this.methodProfiler.a("cleaning"); - - NextTickListEntry nextticklistentry; - - for (int j = 0; j < i; ++j) { - nextticklistentry = (NextTickListEntry) this.N.first(); - if (!flag && nextticklistentry.d > this.worldData.getTime()) { - break; - } - - this.N.remove(nextticklistentry); - this.M.remove(nextticklistentry); - this.V.add(nextticklistentry); - } - - this.methodProfiler.b(); - this.methodProfiler.a("ticking"); - Iterator iterator = this.V.iterator(); - - while (iterator.hasNext()) { - nextticklistentry = (NextTickListEntry) iterator.next(); - iterator.remove(); - byte b0 = 0; - - if (this.b(nextticklistentry.a - b0, nextticklistentry.b - b0, nextticklistentry.c - b0, nextticklistentry.a + b0, nextticklistentry.b + b0, nextticklistentry.c + b0)) { - Block block = this.getType(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c); - - if (block.getMaterial() != Material.AIR && Block.a(block, nextticklistentry.a())) { - try { - block.a(this, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, this.random); - } catch (Throwable throwable) { - CrashReport crashreport = CrashReport.a(throwable, "Exception while ticking a block"); - CrashReportSystemDetails crashreportsystemdetails = crashreport.a("Block being ticked"); - - int k; - - try { - k = this.getData(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c); - } catch (Throwable throwable1) { - k = -1; - } - - CrashReportSystemDetails.a(crashreportsystemdetails, nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, block, k); - throw new ReportedException(crashreport); - } - } - } else { - this.a(nextticklistentry.a, nextticklistentry.b, nextticklistentry.c, nextticklistentry.a(), 0); - } - } - - this.methodProfiler.b(); - this.V.clear(); - return !this.N.isEmpty(); - } - } - - public List a(Chunk chunk, boolean flag) { - ArrayList arraylist = null; - ChunkCoordIntPair chunkcoordintpair = chunk.l(); - int i = (chunkcoordintpair.x << 4) - 2; - int j = i + 16 + 2; - int k = (chunkcoordintpair.z << 4) - 2; - int l = k + 16 + 2; - - for (int i1 = 0; i1 < 2; ++i1) { - Iterator iterator; - - if (i1 == 0) { - iterator = this.N.iterator(); - } else { - iterator = this.V.iterator(); - if (!this.V.isEmpty()) { - a.debug("toBeTicked = " + this.V.size()); - } - } - - while (iterator.hasNext()) { - NextTickListEntry nextticklistentry = (NextTickListEntry) iterator.next(); - - if (nextticklistentry.a >= i && nextticklistentry.a < j && nextticklistentry.c >= k && nextticklistentry.c < l) { - if (flag) { - this.M.remove(nextticklistentry); - iterator.remove(); - } - - if (arraylist == null) { - arraylist = new ArrayList(); - } - - arraylist.add(nextticklistentry); - } - } - } - - return arraylist; - } - - /* CraftBukkit start - We prevent spawning in general, so this butchering is not needed - public void entityJoinedWorld(Entity entity, boolean flag) { - if (!this.server.getSpawnAnimals() && (entity instanceof EntityAnimal || entity instanceof EntityWaterAnimal)) { - entity.die(); - } - - if (!this.server.getSpawnNPCs() && entity instanceof NPC) { - entity.die(); - } - - super.entityJoinedWorld(entity, flag); - } - // CraftBukkit end */ - - protected IChunkProvider j() { - IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider); - - // CraftBukkit start - org.bukkit.craftbukkit.generator.InternalChunkGenerator gen; - - if (this.generator != null) { - gen = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, this.getSeed(), this.generator); - } else if (this.worldProvider instanceof WorldProviderHell) { - gen = new org.bukkit.craftbukkit.generator.NetherChunkGenerator(this, this.getSeed()); - } else if (this.worldProvider instanceof WorldProviderTheEnd) { - gen = new org.bukkit.craftbukkit.generator.SkyLandsChunkGenerator(this, this.getSeed()); - } else { - gen = new org.bukkit.craftbukkit.generator.NormalChunkGenerator(this, this.getSeed()); - } - - this.chunkProviderServer = new ChunkProviderServer(this, ichunkloader, gen); - // CraftBukkit end - - return this.chunkProviderServer; - } - - public List getTileEntities(int i, int j, int k, int l, int i1, int j1) { - ArrayList arraylist = new ArrayList(); - - // CraftBukkit start - Get tile entities from chunks instead of world - for (int chunkX = (i >> 4); chunkX <= ((l - 1) >> 4); chunkX++) { - for (int chunkZ = (k >> 4); chunkZ <= ((j1 - 1) >> 4); chunkZ++) { - Chunk chunk = getChunkAt(chunkX, chunkZ); - if (chunk == null) { - continue; - } - - for (Object te : chunk.tileEntities.values()) { - TileEntity tileentity = (TileEntity) te; - if ((tileentity.x >= i) && (tileentity.y >= j) && (tileentity.z >= k) && (tileentity.x < l) && (tileentity.y < i1) && (tileentity.z < j1)) { - arraylist.add(tileentity); - } - } - } - } - // CraftBukkit end - - return arraylist; - } - - public boolean a(EntityHuman entityhuman, int i, int j, int k) { - return !this.server.a(this, i, j, k, entityhuman); - } - - protected void a(WorldSettings worldsettings) { - if (this.entitiesById == null) { - this.entitiesById = new IntHashMap(); - } - - if (this.M == null) { - this.M = new HashSet(); - } - - if (this.N == null) { - this.N = new TreeSet(); - } - - this.b(worldsettings); - super.a(worldsettings); - } - - protected void b(WorldSettings worldsettings) { - if (!this.worldProvider.e()) { - this.worldData.setSpawn(0, this.worldProvider.getSeaLevel(), 0); - } else { - this.isLoading = true; - WorldChunkManager worldchunkmanager = this.worldProvider.e; - List list = worldchunkmanager.a(); - Random random = new Random(this.getSeed()); - ChunkPosition chunkposition = worldchunkmanager.a(0, 0, 256, list, random); - int i = 0; - int j = this.worldProvider.getSeaLevel(); - int k = 0; - - // CraftBukkit start - if (this.generator != null) { - Random rand = new Random(this.getSeed()); - org.bukkit.Location spawn = this.generator.getFixedSpawnLocation(((WorldServer) this).getWorld(), rand); - - if (spawn != null) { - if (spawn.getWorld() != ((WorldServer) this).getWorld()) { - throw new IllegalStateException("Cannot set spawn point for " + this.worldData.getName() + " to be in another world (" + spawn.getWorld().getName() + ")"); - } else { - this.worldData.setSpawn(spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ()); - this.isLoading = false; - return; - } - } - } - // CraftBukkit end - - if (chunkposition != null) { - i = chunkposition.x; - k = chunkposition.z; - } else { - a.warn("Unable to find spawn biome"); - } - - int l = 0; - - while (!this.canSpawn(i, k)) { // CraftBukkit - use our own canSpawn - i += random.nextInt(64) - random.nextInt(64); - k += random.nextInt(64) - random.nextInt(64); - ++l; - if (l == 1000) { - break; - } - } - - this.worldData.setSpawn(i, j, k); - this.isLoading = false; - if (worldsettings.c()) { - this.k(); - } - } - } - - protected void k() { - WorldGenBonusChest worldgenbonuschest = new WorldGenBonusChest(U, 10); - - for (int i = 0; i < 10; ++i) { - int j = this.worldData.c() + this.random.nextInt(6) - this.random.nextInt(6); - int k = this.worldData.e() + this.random.nextInt(6) - this.random.nextInt(6); - int l = this.i(j, k) + 1; - - if (worldgenbonuschest.generate(this, this.random, j, l, k)) { - break; - } - } - } - - public ChunkCoordinates getDimensionSpawn() { - return this.worldProvider.h(); - } - - public void save(boolean flag, IProgressUpdate iprogressupdate) throws ExceptionWorldConflict { // CraftBukkit - added throws - if (this.chunkProvider.canSave()) { - if (iprogressupdate != null) { - iprogressupdate.a("Saving level"); - } - - this.a(); - if (iprogressupdate != null) { - iprogressupdate.c("Saving chunks"); - } - - this.chunkProvider.saveChunks(flag, iprogressupdate); - // CraftBukkit - ArrayList -> Collection - Collection arraylist = this.chunkProviderServer.a(); - Iterator iterator = arraylist.iterator(); - - while (iterator.hasNext()) { - Chunk chunk = (Chunk) iterator.next(); - - if (chunk != null && !this.manager.a(chunk.locX, chunk.locZ)) { - this.chunkProviderServer.queueUnload(chunk.locX, chunk.locZ); - } - } - } - } - - public void flushSave() { - if (this.chunkProvider.canSave()) { - this.chunkProvider.c(); - } - } - - protected void a() throws ExceptionWorldConflict { // CraftBukkit - added throws - this.G(); - this.dataManager.saveWorldData(this.worldData, this.server.getPlayerList().t()); - // CraftBukkit start - save worldMaps once, rather than once per shared world - if (!(this instanceof SecondaryWorldServer)) { - this.worldMaps.a(); - } - // CraftBukkit end - } - - protected void a(Entity entity) { - super.a(entity); - this.entitiesById.a(entity.getId(), entity); - Entity[] aentity = entity.at(); - - if (aentity != null) { - for (int i = 0; i < aentity.length; ++i) { - this.entitiesById.a(aentity[i].getId(), aentity[i]); - } - } - } - - protected void b(Entity entity) { - super.b(entity); - this.entitiesById.d(entity.getId()); - Entity[] aentity = entity.at(); - - if (aentity != null) { - for (int i = 0; i < aentity.length; ++i) { - this.entitiesById.d(aentity[i].getId()); - } - } - } - - public Entity getEntity(int i) { - return (Entity) this.entitiesById.get(i); - } - - public boolean strikeLightning(Entity entity) { - // CraftBukkit start - LightningStrikeEvent lightning = new LightningStrikeEvent(this.getWorld(), (org.bukkit.entity.LightningStrike) entity.getBukkitEntity()); - this.getServer().getPluginManager().callEvent(lightning); - - if (lightning.isCancelled()) { - return false; - } - - if (super.strikeLightning(entity)) { - this.server.getPlayerList().sendPacketNearby(entity.locX, entity.locY, entity.locZ, 512.0D, this.dimension, new PacketPlayOutSpawnEntityWeather(entity)); - // CraftBukkit end - return true; - } else { - return false; - } - } - - public void broadcastEntityEffect(Entity entity, byte b0) { - this.getTracker().sendPacketToEntity(entity, new PacketPlayOutEntityStatus(entity, b0)); - } - - public Explosion createExplosion(Entity entity, double d0, double d1, double d2, float f, boolean flag, boolean flag1) { - // CraftBukkit start - Explosion explosion = super.createExplosion(entity, d0, d1, d2, f, flag, flag1); - - if (explosion.wasCanceled) { - return explosion; - } - - /* Remove - explosion.a = flag; - explosion.b = flag1; - explosion.a(); - explosion.a(false); - */ - // CraftBukkit end - TODO: Check if explosions are still properly implemented - - if (!flag1) { - explosion.blocks.clear(); - } - - Iterator iterator = this.players.iterator(); - - while (iterator.hasNext()) { - EntityHuman entityhuman = (EntityHuman) iterator.next(); - - if (entityhuman.e(d0, d1, d2) < 4096.0D) { - ((EntityPlayer) entityhuman).playerConnection.sendPacket(new PacketPlayOutExplosion(d0, d1, d2, f, explosion.blocks, (Vec3D) explosion.b().get(entityhuman))); - } - } - - return explosion; - } - - public void playBlockAction(int i, int j, int k, Block block, int l, int i1) { - BlockActionData blockactiondata = new BlockActionData(i, j, k, block, l, i1); - Iterator iterator = this.S[this.T].iterator(); - - BlockActionData blockactiondata1; - - do { - if (!iterator.hasNext()) { - this.S[this.T].add(blockactiondata); - return; - } - - blockactiondata1 = (BlockActionData) iterator.next(); - } while (!blockactiondata1.equals(blockactiondata)); - - } - - private void Z() { - while (!this.S[this.T].isEmpty()) { - int i = this.T; - - this.T ^= 1; - Iterator iterator = this.S[i].iterator(); - - while (iterator.hasNext()) { - BlockActionData blockactiondata = (BlockActionData) iterator.next(); - - if (this.a(blockactiondata)) { - // CraftBukkit - this.worldProvider.dimension -> this.dimension - this.server.getPlayerList().sendPacketNearby((double) blockactiondata.a(), (double) blockactiondata.b(), (double) blockactiondata.c(), 64.0D, this.dimension, new PacketPlayOutBlockAction(blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.f(), blockactiondata.d(), blockactiondata.e())); - } - } - - this.S[i].clear(); - } - } - - private boolean a(BlockActionData blockactiondata) { - Block block = this.getType(blockactiondata.a(), blockactiondata.b(), blockactiondata.c()); - - return block == blockactiondata.f() ? block.a(this, blockactiondata.a(), blockactiondata.b(), blockactiondata.c(), blockactiondata.d(), blockactiondata.e()) : false; - } - - public void saveLevel() { - this.dataManager.a(); - } - - protected void o() { - boolean flag = this.Q(); - - super.o(); - /* CraftBukkit start - if (this.m != this.n) { - this.server.getPlayerList().a(new PacketPlayOutGameStateChange(7, this.n), this.worldProvider.dimension); - } - - if (this.o != this.p) { - this.server.getPlayerList().a(new PacketPlayOutGameStateChange(8, this.p), this.worldProvider.dimension); - } - - if (flag != this.Q()) { - if (flag) { - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(2, 0.0F)); - } else { - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(1, 0.0F)); - } - - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(7, this.n)); - this.server.getPlayerList().sendAll(new PacketPlayOutGameStateChange(8, this.p)); - } - // */ - if (flag != this.Q()) { - // Only send weather packets to those affected - for (int i = 0; i < this.players.size(); ++i) { - if (((EntityPlayer) this.players.get(i)).world == this) { - ((EntityPlayer) this.players.get(i)).setPlayerWeather((!flag ? WeatherType.DOWNFALL : WeatherType.CLEAR), false); - } - } - // CraftBukkit end - } - } - - protected int p() { - return this.server.getPlayerList().s(); - } - - public MinecraftServer getMinecraftServer() { - return this.server; - } - - public EntityTracker getTracker() { - return this.tracker; - } - - public PlayerChunkMap getPlayerChunkMap() { - return this.manager; - } - - public PortalTravelAgent getTravelAgent() { - return this.Q; - } - - public void a(String s, double d0, double d1, double d2, int i, double d3, double d4, double d5, double d6) { - PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(s, (float) d0, (float) d1, (float) d2, (float) d3, (float) d4, (float) d5, (float) d6, i); - - for (int j = 0; j < this.players.size(); ++j) { - EntityPlayer entityplayer = (EntityPlayer) this.players.get(j); - ChunkCoordinates chunkcoordinates = entityplayer.getChunkCoordinates(); - double d7 = d0 - (double) chunkcoordinates.x; - double d8 = d1 - (double) chunkcoordinates.y; - double d9 = d2 - (double) chunkcoordinates.z; - double d10 = d7 * d7 + d8 * d8 + d9 * d9; - - if (d10 <= 256.0D) { - entityplayer.playerConnection.sendPacket(packetplayoutworldparticles); - } - } - } - - // CraftBukkit start - Helper method - public int getTypeId(int x, int y, int z) { - return Block.getId(getType(x, y, z)); - } - // CraftBukkit end -} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java index f617e9e2..dd4dc541 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java @@ -11,7 +11,7 @@ public class CraftArt { case KEBAB: return Art.KEBAB; case AZTEC: return Art.AZTEC; case ALBAN: return Art.ALBAN; - case AZTEC2: return Art.AZTEC2; + case AZTEC_2: return Art.AZTEC2; case BOMB: return Art.BOMB; case PLANT: return Art.PLANT; case WASTELAND: return Art.WASTELAND; @@ -30,9 +30,9 @@ public class CraftArt { case FIGHTERS: return Art.FIGHTERS; case POINTER: return Art.POINTER; case PIGSCENE: return Art.PIGSCENE; - case BURNINGSKULL: return Art.BURNINGSKULL; + case BURNING_SKULL: return Art.BURNINGSKULL; case SKELETON: return Art.SKELETON; - case DONKEYKONG: return Art.DONKEYKONG; + case DONKEY_KONG: return Art.DONKEYKONG; case WITHER: return Art.WITHER; default: throw new AssertionError(art); @@ -44,7 +44,7 @@ public class CraftArt { case KEBAB: return EnumArt.KEBAB; case AZTEC: return EnumArt.AZTEC; case ALBAN: return EnumArt.ALBAN; - case AZTEC2: return EnumArt.AZTEC2; + case AZTEC2: return EnumArt.AZTEC_2; case BOMB: return EnumArt.BOMB; case PLANT: return EnumArt.PLANT; case WASTELAND: return EnumArt.WASTELAND; @@ -63,9 +63,9 @@ public class CraftArt { case FIGHTERS: return EnumArt.FIGHTERS; case POINTER: return EnumArt.POINTER; case PIGSCENE: return EnumArt.PIGSCENE; - case BURNINGSKULL: return EnumArt.BURNINGSKULL; + case BURNINGSKULL: return EnumArt.BURNING_SKULL; case SKELETON: return EnumArt.SKELETON; - case DONKEYKONG: return EnumArt.DONKEYKONG; + case DONKEYKONG: return EnumArt.DONKEY_KONG; case WITHER: return EnumArt.WITHER; default: throw new AssertionError(art); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 99d3d40f..0cba7fd9 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -3,12 +3,7 @@ package org.bukkit.craftbukkit; import java.lang.ref.WeakReference; import java.util.Arrays; -import net.minecraft.server.BiomeBase; -import net.minecraft.server.ChunkPosition; -import net.minecraft.server.ChunkSection; -import net.minecraft.server.EmptyChunk; -import net.minecraft.server.WorldChunkManager; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.Chunk; import org.bukkit.World; @@ -91,6 +86,7 @@ public class CraftChunk implements Chunk { Entity[] entities = new Entity[count]; for (int i = 0; i < 16; i++) { + for (Object obj : chunk.entitySlices[i].toArray()) { if (!(obj instanceof net.minecraft.server.Entity)) { continue; @@ -106,15 +102,16 @@ public class CraftChunk implements Chunk { public BlockState[] getTileEntities() { int index = 0; net.minecraft.server.Chunk chunk = getHandle(); + BlockState[] entities = new BlockState[chunk.tileEntities.size()]; for (Object obj : chunk.tileEntities.keySet().toArray()) { - if (!(obj instanceof ChunkPosition)) { + if (!(obj instanceof BlockPosition)) { continue; } - ChunkPosition position = (ChunkPosition) obj; - entities[index++] = worldServer.getWorld().getBlockAt(position.x + (chunk.locX << 4), position.y, position.z + (chunk.locZ << 4)).getState(); + BlockPosition position = (BlockPosition) obj; + entities[index++] = worldServer.getWorld().getBlockAt(position.getX() + (chunk.locX << 4), position.getY(), position.getZ() + (chunk.locZ << 4)).getState(); } return entities; } @@ -158,49 +155,40 @@ public class CraftChunk implements Chunk { boolean[] sectionEmpty = new boolean[cs.length]; for (int i = 0; i < cs.length; i++) { - if (cs[i] == null) { /* Section is empty? */ + if (cs[i] == null) { // Section is empty? sectionBlockIDs[i] = emptyBlockIDs; sectionBlockData[i] = emptyData; sectionSkyLights[i] = emptySkyLight; sectionEmitLights[i] = emptyData; sectionEmpty[i] = true; - } else { /* Not empty */ + } else { // Not empty short[] blockids = new short[4096]; - byte[] baseids = cs[i].getIdArray(); + char[] baseids = cs[i].getIdArray(); + byte[] dataValues = sectionBlockData[i] = new byte[2048]; - /* Copy base IDs */ + // Copy base IDs for (int j = 0; j < 4096; j++) { - blockids[j] = (short) (baseids[j] & 0xFF); - } - - if (cs[i].getExtendedIdArray() != null) { /* If we've got extended IDs */ - byte[] extids = cs[i].getExtendedIdArray().a; - - for (int j = 0; j < 2048; j++) { - short b = (short) (extids[j] & 0xFF); - - if (b == 0) { - continue; - } - - blockids[j<<1] |= (b & 0x0F) << 8; - blockids[(j<<1)+1] |= (b & 0xF0) << 4; + IBlockData blockData = net.minecraft.server.Block.getByCombinedId(baseids[j]); + blockids[j] = (short) net.minecraft.server.Block.getId(blockData.getBlock()); + int data = blockData.getBlock().toLegacyData(blockData); + int jj = j >> 1; + if ((j & 1) == 0) { + dataValues[jj] = (byte) ((dataValues[jj] & 0xF0) | (data & 0xF)); + } else { + dataValues[jj] = (byte) ((dataValues[jj] & 0xF) | ((data & 0xF) << 4)); } - } + } sectionBlockIDs[i] = blockids; - - /* Get block data nibbles */ - sectionBlockData[i] = new byte[2048]; - System.arraycopy(cs[i].getDataArray().a, 0, sectionBlockData[i], 0, 2048); + if (cs[i].getSkyLightArray() == null) { sectionSkyLights[i] = emptyData; } else { sectionSkyLights[i] = new byte[2048]; - System.arraycopy(cs[i].getSkyLightArray().a, 0, sectionSkyLights[i], 0, 2048); + System.arraycopy(cs[i].getSkyLightArray().a(), 0, sectionSkyLights[i], 0, 2048); } sectionEmitLights[i] = new byte[2048]; - System.arraycopy(cs[i].getEmittedLightArray().a, 0, sectionEmitLights[i], 0, 2048); + System.arraycopy(cs[i].getEmittedLightArray().a(), 0, sectionEmitLights[i], 0, 2048); } } @@ -221,7 +209,7 @@ public class CraftChunk implements Chunk { if (includeBiome) { biome = new BiomeBase[256]; for (int i = 0; i < 256; i++) { - biome[i] = chunk.getBiome(i & 0xF, i >> 4, wcm); + biome[i] = chunk.getBiome(new BlockPosition(i & 0xF, 0, i >> 4), wcm); } } @@ -257,7 +245,7 @@ public class CraftChunk implements Chunk { if (includeBiome) { biome = new BiomeBase[256]; for (int i = 0; i < 256; i++) { - biome[i] = world.getHandle().getBiome((x << 4) + (i & 0xF), (z << 4) + (i >> 4)); + biome[i] = world.getHandle().getBiome(new BlockPosition((x << 4) + (i & 0xF), 0, (z << 4) + (i >> 4))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index 1328c175..8be06984 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit; +import com.mojang.authlib.GameProfile; import java.io.File; import java.util.LinkedHashMap; import java.util.List; @@ -10,7 +11,6 @@ import net.minecraft.server.EntityPlayer; import net.minecraft.server.NBTTagCompound; import net.minecraft.server.WorldNBTStorage; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.BanList; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java index 7ec00068..9540bf4f 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanEntry.java @@ -1,9 +1,9 @@ package org.bukkit.craftbukkit; +import com.mojang.authlib.GameProfile; import net.minecraft.server.GameProfileBanEntry; import net.minecraft.server.GameProfileBanList; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; import java.io.IOException; import java.util.Date; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java index fad6a965..700c9f7c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftProfileBanList.java @@ -8,12 +8,12 @@ import net.minecraft.server.GameProfileBanEntry; import net.minecraft.server.GameProfileBanList; import net.minecraft.server.JsonListEntry; import net.minecraft.server.MinecraftServer; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import com.google.common.collect.ImmutableSet; +import com.mojang.authlib.GameProfile; public class CraftProfileBanList implements org.bukkit.BanList { private final GameProfileBanList list; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index a666131f..f2a78c17 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -23,83 +23,7 @@ import java.util.regex.Pattern; import javax.imageio.ImageIO; -import net.minecraft.server.ChunkCoordinates; -import net.minecraft.server.CommandAchievement; -import net.minecraft.server.CommandBan; -import net.minecraft.server.CommandBanIp; -import net.minecraft.server.CommandBanList; -import net.minecraft.server.CommandClear; -import net.minecraft.server.CommandDeop; -import net.minecraft.server.CommandDifficulty; -import net.minecraft.server.CommandEffect; -import net.minecraft.server.CommandEnchant; -import net.minecraft.server.CommandGamemode; -import net.minecraft.server.CommandGamemodeDefault; -import net.minecraft.server.CommandGamerule; -import net.minecraft.server.CommandGive; -import net.minecraft.server.CommandHelp; -import net.minecraft.server.CommandIdleTimeout; -import net.minecraft.server.CommandKick; -import net.minecraft.server.CommandKill; -import net.minecraft.server.CommandList; -import net.minecraft.server.CommandMe; -import net.minecraft.server.CommandNetstat; -import net.minecraft.server.CommandOp; -import net.minecraft.server.CommandPardon; -import net.minecraft.server.CommandPardonIP; -import net.minecraft.server.CommandPlaySound; -import net.minecraft.server.CommandSay; -import net.minecraft.server.CommandScoreboard; -import net.minecraft.server.CommandSeed; -import net.minecraft.server.CommandSetBlock; -import net.minecraft.server.CommandSetWorldSpawn; -import net.minecraft.server.CommandSpawnpoint; -import net.minecraft.server.CommandSpreadPlayers; -import net.minecraft.server.CommandSummon; -import net.minecraft.server.CommandTell; -import net.minecraft.server.CommandTellRaw; -import net.minecraft.server.CommandTestFor; -import net.minecraft.server.CommandTestForBlock; -import net.minecraft.server.CommandTime; -import net.minecraft.server.CommandToggleDownfall; -import net.minecraft.server.CommandTp; -import net.minecraft.server.CommandWeather; -import net.minecraft.server.CommandWhitelist; -import net.minecraft.server.CommandXp; -import net.minecraft.server.Convertable; -import net.minecraft.server.ConvertProgressUpdater; -import net.minecraft.server.CraftingManager; -import net.minecraft.server.DedicatedPlayerList; -import net.minecraft.server.DedicatedServer; -import net.minecraft.server.Enchantment; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.EntityTracker; -import net.minecraft.server.EnumDifficulty; -import net.minecraft.server.EnumGamemode; -import net.minecraft.server.ExceptionWorldConflict; -import net.minecraft.server.Items; -import net.minecraft.server.JsonListEntry; -import net.minecraft.server.PlayerList; -import net.minecraft.server.RecipesFurnace; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.MobEffectList; -import net.minecraft.server.PropertyManager; -import net.minecraft.server.ServerCommand; -import net.minecraft.server.ServerNBTManager; -import net.minecraft.server.WorldLoaderServer; -import net.minecraft.server.WorldManager; -import net.minecraft.server.WorldMap; -import net.minecraft.server.PersistentCollection; -import net.minecraft.server.WorldNBTStorage; -import net.minecraft.server.WorldServer; -import net.minecraft.server.WorldSettings; -import net.minecraft.server.WorldType; -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.com.mojang.authlib.GameProfile; -import net.minecraft.util.io.netty.buffer.ByteBuf; -import net.minecraft.util.io.netty.buffer.ByteBufOutputStream; -import net.minecraft.util.io.netty.buffer.Unpooled; -import net.minecraft.util.io.netty.handler.codec.base64.Base64; +import net.minecraft.server.*; import org.bukkit.BanList; import org.bukkit.Bukkit; @@ -139,8 +63,6 @@ import org.bukkit.craftbukkit.metadata.WorldMetadataStore; import org.bukkit.craftbukkit.potion.CraftPotionBrewer; import org.bukkit.craftbukkit.scheduler.CraftScheduler; import org.bukkit.craftbukkit.scoreboard.CraftScoreboardManager; -import org.bukkit.craftbukkit.updater.AutoUpdater; -import org.bukkit.craftbukkit.updater.BukkitDLUpdaterService; import org.bukkit.craftbukkit.util.CraftIconCache; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.craftbukkit.util.DatFileFilter; @@ -186,8 +108,16 @@ import com.avaje.ebean.config.DataSourceConfig; import com.avaje.ebean.config.ServerConfig; import com.avaje.ebean.config.dbplatform.SQLitePlatform; import com.avaje.ebeaninternal.server.lib.sql.TransactionIsolation; +import com.google.common.base.Charsets; +import com.google.common.base.Function; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Lists; import com.google.common.collect.MapMaker; +import com.mojang.authlib.GameProfile; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.base64.Base64; import jline.console.ConsoleReader; @@ -210,7 +140,6 @@ public final class CraftServer implements Server { private YamlConfiguration commandsConfiguration; private final Yaml yaml = new Yaml(new SafeConstructor()); private final Map<UUID, OfflinePlayer> offlinePlayers = new MapMaker().softValues().makeMap(); - private final AutoUpdater updater; private final EntityMetadataStore entityMetadata = new EntityMetadataStore(); private final PlayerMetadataStore playerMetadata = new PlayerMetadataStore(); private final WorldMetadataStore worldMetadata = new WorldMetadataStore(); @@ -244,7 +173,7 @@ public final class CraftServer implements Server { public CraftServer(MinecraftServer console, PlayerList playerList) { this.console = console; this.playerList = (DedicatedPlayerList) playerList; - this.playerView = Collections.unmodifiableList(net.minecraft.util.com.google.common.collect.Lists.transform(playerList.players, new net.minecraft.util.com.google.common.base.Function<EntityPlayer, CraftPlayer>() { + this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function<EntityPlayer, CraftPlayer>() { @Override public CraftPlayer apply(EntityPlayer player) { return player.getBukkitEntity(); @@ -316,13 +245,6 @@ public final class CraftServer implements Server { chunkGCLoadThresh = configuration.getInt("chunk-gc.load-threshold"); loadIcon(); - updater = new AutoUpdater(new BukkitDLUpdaterService(configuration.getString("auto-updater.host")), getLogger(), configuration.getString("auto-updater.preferred-channel")); - updater.setEnabled(configuration.getBoolean("auto-updater.enabled")); - updater.setSuggestChannels(configuration.getBoolean("auto-updater.suggest-channels")); - updater.getOnBroken().addAll(configuration.getStringList("auto-updater.on-broken")); - updater.getOnUpdate().addAll(configuration.getStringList("auto-updater.on-update")); - updater.check(serverVersion); - loadPlugins(); enablePlugins(PluginLoadOrder.STARTUP); } @@ -405,49 +327,10 @@ public final class CraftServer implements Server { } private void setVanillaCommands() { - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandAchievement(), "/achievement give <stat_name> [player]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBan(), "/ban <playername> [reason]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanIp(), "/ban-ip <ip-address|playername>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanList(), "/banlist [ips]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandClear(), "/clear <playername> [item] [metadata]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemodeDefault(), "/defaultgamemode <mode>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDeop(), "/deop <playername>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDifficulty(), "/difficulty <new difficulty>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEffect(), "/effect <player> <effect|clear> [seconds] [amplifier]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEnchant(), "/enchant <playername> <enchantment ID> [enchantment level]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemode(), "/gamemode <mode> [player]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamerule(), "/gamerule <rulename> [true|false]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGive(), "/give <playername> <item> [amount] [metadata] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandHelp(), "/help [page|commandname]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandIdleTimeout(), "/setidletimeout <Minutes until kick>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandKick(), "/kick <playername> [reason]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandKill(), "/kill [playername]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandList(), "/list")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandMe(), "/me <actiontext>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandOp(), "/op <playername>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardon(), "/pardon <playername>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardonIP(), "/pardon-ip <ip-address>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPlaySound(), "/playsound <sound> <playername> [x] [y] [z] [volume] [pitch] [minimumVolume]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSay(), "/say <message>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandScoreboard(), "/scoreboard")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSeed(), "/seed")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetBlock(), "/setblock <x> <y> <z> <tilename> [datavalue] [oldblockHandling] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetWorldSpawn(), "/setworldspawn [x] [y] [z]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpawnpoint(), "/spawnpoint <playername> [x] [y] [z]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpreadPlayers(), "/spreadplayers <x> <z> [spreadDistance] [maxRange] [respectTeams] <playernames>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSummon(), "/summon <EntityName> [x] [y] [z] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTp(), "/tp [player] <target>\n/tp [player] <x> <y> <z>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTell(), "/tell <playername> <message>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTellRaw(), "/tellraw <playername> <raw message>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestFor(), "/testfor <playername | selector> [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestForBlock(), "/testforblock <x> <y> <z> <tilename> [datavalue] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTime(), "/time set <value>\n/time add <value>")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandToggleDownfall(), "/toggledownfall")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWeather(), "/weather <clear/rain/thunder> [duration in seconds]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWhitelist(), "/whitelist (add|remove) <player>\n/whitelist (on|off|list|reload)")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandXp(), "/xp <amount> [player]\n/xp <amount>L [player]")); - // This is what is in the lang file, I swear. - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandNetstat(), "/list")); + Map<String, ICommand> commands = new CommandDispatcher().getCommands(); + for (ICommand cmd : commands.values()) { + commandMap.register("minecraft", new VanillaCommandWrapper((CommandAbstract) cmd, LocaleI18n.get(cmd.getUsage(null)))); + } } private void loadPlugin(Plugin plugin) { @@ -550,7 +433,7 @@ public final class CraftServer implements Server { } public Player getPlayer(final EntityPlayer entity) { - return entity.playerConnection.getPlayer(); + return entity.getBukkitEntity(); } @Override @@ -759,12 +642,12 @@ public final class CraftServer implements Server { ((DedicatedServer) console).propertyManager = config; boolean animals = config.getBoolean("spawn-animals", console.getSpawnAnimals()); - boolean monsters = config.getBoolean("spawn-monsters", console.worlds.get(0).difficulty != EnumDifficulty.PEACEFUL); - EnumDifficulty difficulty = EnumDifficulty.getById(config.getInt("difficulty", console.worlds.get(0).difficulty.ordinal())); + boolean monsters = config.getBoolean("spawn-monsters", console.worlds.get(0).getDifficulty() != EnumDifficulty.PEACEFUL); + EnumDifficulty difficulty = EnumDifficulty.getById(config.getInt("difficulty", console.worlds.get(0).getDifficulty().ordinal())); online.value = config.getBoolean("online-mode", console.getOnlineMode()); console.setSpawnAnimals(config.getBoolean("spawn-animals", console.getSpawnAnimals())); - console.setPvP(config.getBoolean("pvp", console.getPvP())); + console.setPVP(config.getBoolean("pvp", console.getPVP())); console.setAllowFlight(config.getBoolean("allow-flight", console.getAllowFlight())); console.setMotd(config.getString("motd", console.getMotd())); monsterSpawn = configuration.getInt("spawn-limits.monsters"); @@ -790,7 +673,7 @@ public final class CraftServer implements Server { } for (WorldServer world : console.worlds) { - world.difficulty = difficulty; + world.worldData.setDifficulty(difficulty); world.setSpawnFlags(monsters, animals); if (this.getTicksPerAnimalSpawns() < 0) { world.ticksPerAnimalSpawns = 400; @@ -961,7 +844,8 @@ public final class CraftServer implements Server { } while(used); boolean hardcore = false; - WorldServer internal = new WorldServer(console, new ServerNBTManager(getWorldContainer(), name, true), name, dimension, new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type), console.methodProfiler, creator.environment(), generator); + WorldData worlddata = new WorldData(new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type), name); + WorldServer internal = (WorldServer) new WorldServer(console, new ServerNBTManager(getWorldContainer(), name, true), worlddata, dimension, console.methodProfiler, creator.environment(), generator).b(); if (!(worlds.containsKey(name.toLowerCase()))) { return null; @@ -971,7 +855,7 @@ public final class CraftServer implements Server { internal.tracker = new EntityTracker(internal); internal.addIWorldAccess(new WorldManager(console, internal)); - internal.difficulty = EnumDifficulty.EASY; + internal.worldData.setDifficulty(EnumDifficulty.EASY); internal.setSpawnFlags(true, true); console.worlds.add(internal); @@ -1001,8 +885,8 @@ public final class CraftServer implements Server { i = l; } - ChunkCoordinates chunkcoordinates = internal.getSpawn(); - internal.chunkProviderServer.getChunkAt(chunkcoordinates.x + j >> 4, chunkcoordinates.z + k >> 4); + BlockPosition chunkcoordinates = internal.getSpawn(); + internal.chunkProviderServer.getChunkAt(chunkcoordinates.getX() + j >> 4, chunkcoordinates.getZ() + k >> 4); } } } @@ -1055,7 +939,6 @@ public final class CraftServer implements Server { worlds.remove(world.getName().toLowerCase()); console.worlds.remove(console.worlds.indexOf(handle)); - return true; } @@ -1312,7 +1195,7 @@ public final class CraftServer implements Server { Validate.notNull(world, "World cannot be null"); net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(Items.MAP, 1, -1); - WorldMap worldmap = Items.MAP.getSavedMap(stack, ((CraftWorld) world).getHandle()); + WorldMap worldmap = Items.FILLED_MAP.getSavedMap(stack, ((CraftWorld) world).getHandle()); return worldmap.mapView; } @@ -1415,7 +1298,7 @@ public final class CraftServer implements Server { for (JsonListEntry entry : playerList.getProfileBans().getValues()) { result.add(getOfflinePlayer((GameProfile) entry.getKey())); - } + } return result; } @@ -1497,27 +1380,6 @@ public final class CraftServer implements Server { return worldMetadata; } - public void detectListNameConflict(EntityPlayer entityPlayer) { - // Collisions will make for invisible people - for (int i = 0; i < getHandle().players.size(); ++i) { - EntityPlayer testEntityPlayer = (EntityPlayer) getHandle().players.get(i); - - // We have a problem! - if (testEntityPlayer != entityPlayer && testEntityPlayer.listName.equals(entityPlayer.listName)) { - String oldName = entityPlayer.listName; - int spaceLeft = 16 - oldName.length(); - - if (spaceLeft <= 1) { // We also hit the list name length limit! - entityPlayer.listName = oldName.subSequence(0, oldName.length() - 2 - spaceLeft) + String.valueOf(System.currentTimeMillis() % 99); - } else { - entityPlayer.listName = oldName + String.valueOf(System.currentTimeMillis() % 99); - } - - return; - } - } - } - @Override public File getWorldContainer() { if (this.getServer().universe != null) { @@ -1575,16 +1437,6 @@ public final class CraftServer implements Server { return result; } - public void onPlayerJoin(Player player) { - if ((updater.isEnabled()) && (updater.getCurrent() != null) && (player.hasPermission(Server.BROADCAST_CHANNEL_ADMINISTRATIVE))) { - if ((updater.getCurrent().isBroken()) && (updater.getOnBroken().contains(AutoUpdater.WARN_OPERATORS))) { - player.sendMessage(ChatColor.DARK_RED + "The version of CraftBukkit that this server is running is known to be broken. Please consider updating to the latest version at dl.bukkit.org."); - } else if ((updater.isUpdateAvailable()) && (updater.getOnUpdate().contains(AutoUpdater.WARN_OPERATORS))) { - player.sendMessage(ChatColor.DARK_PURPLE + "The version of CraftBukkit that this server is running is out of date. Please consider updating to the latest version at dl.bukkit.org."); - } - } - } - @Override public Inventory createInventory(InventoryHolder owner, InventoryType type) { // TODO: Create the appropriate type, rather than Custom? diff --git a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java index 24c8bf24..a261c77d 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java @@ -13,6 +13,9 @@ import com.google.common.base.CaseFormat; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; +import net.minecraft.server.Block; +import net.minecraft.server.Item; +import net.minecraft.server.MinecraftKey; public class CraftStatistic { private static final BiMap<String, org.bukkit.Statistic> statistics; @@ -131,12 +134,19 @@ public class CraftStatistic { public static Material getMaterialFromStatistic(net.minecraft.server.Statistic statistic) { String statisticString = statistic.name; - int id; + String val = statisticString.substring(statisticString.lastIndexOf(".") + 1); + Item item = (Item) Item.REGISTRY.get(new MinecraftKey(val)); + if (item != null) { + return Material.getMaterial(Item.getId(item)); + } + Block block = (Block) Block.REGISTRY.get(new MinecraftKey(val)); + if (block != null) { + return Material.getMaterial(Block.getId(block)); + } try { - id = Integer.valueOf(statisticString.substring(statisticString.lastIndexOf(".") + 1)); + return Material.getMaterial(Integer.parseInt(val)); } catch (NumberFormatException e) { return null; } - return Material.getMaterial(id); } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java b/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java index f7ca6a3f..cae65cf8 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftTravelAgent.java @@ -1,6 +1,6 @@ package org.bukkit.craftbukkit; -import net.minecraft.server.ChunkCoordinates; +import net.minecraft.server.BlockPosition; import net.minecraft.server.PortalTravelAgent; import net.minecraft.server.WorldServer; @@ -22,6 +22,7 @@ public class CraftTravelAgent extends PortalTravelAgent implements TravelAgent { } } + @Override public Location findOrCreate(Location target) { WorldServer worldServer = ((CraftWorld) target.getWorld()).getHandle(); boolean before = worldServer.chunkProviderServer.forceChunkLoad; @@ -40,39 +41,47 @@ public class CraftTravelAgent extends PortalTravelAgent implements TravelAgent { return found; } + @Override public Location findPortal(Location location) { PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().getTravelAgent(); - ChunkCoordinates found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius()); - return found != null ? new Location(location.getWorld(), found.x, found.y, found.z, location.getYaw(), location.getPitch()) : null; + BlockPosition found = pta.findPortal(location.getX(), location.getY(), location.getZ(), this.getSearchRadius()); + return found != null ? new Location(location.getWorld(), found.getX(), found.getY(), found.getZ(), location.getYaw(), location.getPitch()) : null; } + @Override public boolean createPortal(Location location) { PortalTravelAgent pta = ((CraftWorld) location.getWorld()).getHandle().getTravelAgent(); return pta.createPortal(location.getX(), location.getY(), location.getZ(), this.getCreationRadius()); } + @Override public TravelAgent setSearchRadius(int radius) { this.searchRadius = radius; return this; } + @Override public int getSearchRadius() { return this.searchRadius; } + @Override public TravelAgent setCreationRadius(int radius) { this.creationRadius = radius < 2 ? 0 : radius; return this; } + @Override public int getCreationRadius() { return this.creationRadius; } + @Override public boolean getCanCreatePortal() { return this.canCreatePortal; } + @Override public void setCanCreatePortal(boolean create) { this.canCreatePortal = create; } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index f4dec5bf..f20a0406 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -86,7 +86,7 @@ public class CraftWorld implements World { } public int getBlockTypeIdAt(int x, int y, int z) { - return world.getTypeId(x, y, z); + return CraftMagicNumbers.getId(world.getType(new BlockPosition(x, y, z)).getBlock()); } public int getHighestBlockYAt(int x, int z) { @@ -94,18 +94,18 @@ public class CraftWorld implements World { loadChunk(x >> 4, z >> 4); } - return world.getHighestBlockYAt(x, z); + return world.getHighestBlockYAt(new BlockPosition(x, 0, z)).getY(); } public Location getSpawnLocation() { - ChunkCoordinates spawn = world.getSpawn(); - return new Location(this, spawn.x, spawn.y, spawn.z); + BlockPosition spawn = world.getSpawn(); + return new Location(this, spawn.getX(), spawn.getY(), spawn.getZ()); } public boolean setSpawnLocation(int x, int y, int z) { try { Location previousLocation = getSpawnLocation(); - world.worldData.setSpawn(x, y, z); + world.worldData.setSpawn(new BlockPosition(x, y, z)); // Notify anyone who's listening. SpawnChangeEvent event = new SpawnChangeEvent(this, previousLocation); @@ -227,9 +227,9 @@ public class CraftWorld implements World { // This flags 65 blocks distributed across all the sections of the chunk, so that everything is sent, including biomes int height = getMaxHeight() / 16; for (int idx = 0; idx < 64; idx++) { - world.notify(px + (idx / height), ((idx % height) * 16), pz); + world.notify(new BlockPosition(px + (idx / height), ((idx % height) * 16), pz)); } - world.notify(px + 15, (height * 16) - 1, pz + 15); + world.notify(new BlockPosition(px + 15, (height * 16) - 1, pz + 15)); return true; } @@ -407,7 +407,7 @@ public class CraftWorld implements World { break; } - return gen.generate(world, rand, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + return gen.generate(world, rand, new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); } public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -421,13 +421,14 @@ public class CraftWorld implements World { int x = blockstate.getX(); int y = blockstate.getY(); int z = blockstate.getZ(); - net.minecraft.server.Block oldBlock = world.getType(x, y, z); + BlockPosition position = new BlockPosition(x, y, z); + net.minecraft.server.Block oldBlock = world.getType(position).getBlock(); int typeId = blockstate.getTypeId(); int data = blockstate.getRawData(); int flag = ((CraftBlockState)blockstate).getFlag(); delegate.setTypeIdAndData(x, y, z, typeId, data); - net.minecraft.server.Block newBlock = world.getType(x, y, z); - world.notifyAndUpdatePhysics(x, y, z, null, oldBlock, newBlock, flag); + net.minecraft.server.Block newBlock = world.getType(position).getBlock(); + world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, flag); } world.capturedBlockStates.clear(); return true; @@ -438,7 +439,7 @@ public class CraftWorld implements World { } public TileEntity getTileEntityAt(final int x, final int y, final int z) { - return world.getTileEntity(x, y, z); + return world.getTileEntity(new BlockPosition(x, y, z)); } public String getName() { @@ -551,27 +552,27 @@ public class CraftWorld implements World { } public Biome getBiome(int x, int z) { - return CraftBlock.biomeBaseToBiome(this.world.getBiome(x, z)); + return CraftBlock.biomeBaseToBiome(this.world.getBiome(new BlockPosition(x, 0, z))); } public void setBiome(int x, int z, Biome bio) { BiomeBase bb = CraftBlock.biomeToBiomeBase(bio); - if (this.world.isLoaded(x, 0, z)) { - net.minecraft.server.Chunk chunk = this.world.getChunkAtWorldCoords(x, z); + if (this.world.isLoaded(new BlockPosition(x, 0, z))) { + net.minecraft.server.Chunk chunk = this.world.getChunkAtWorldCoords(new BlockPosition(x, 0, z)); if (chunk != null) { - byte[] biomevals = chunk.m(); + byte[] biomevals = chunk.getBiomeIndex(); biomevals[((z & 0xF) << 4) | (x & 0xF)] = (byte)bb.id; } } } public double getTemperature(int x, int z) { - return this.world.getBiome(x, z).temperature; + return this.world.getBiome(new BlockPosition(x, 0, z)).temperature; } public double getHumidity(int x, int z) { - return this.world.getBiome(x, z).humidity; + return this.world.getBiome(new BlockPosition(x, 0, z)).humidity; } public List<Entity> getEntities() { @@ -704,11 +705,11 @@ public class CraftWorld implements World { } public void setDifficulty(Difficulty difficulty) { - this.getHandle().difficulty = EnumDifficulty.getById(difficulty.getValue()); + this.getHandle().worldData.setDifficulty(EnumDifficulty.getById(difficulty.getValue())); } public Difficulty getDifficulty() { - return Difficulty.getByValue(this.getHandle().difficulty.ordinal()); + return Difficulty.getByValue(this.getHandle().getDifficulty().ordinal()); } public BlockMetadataStore getBlockMetadata() { @@ -814,7 +815,7 @@ public class CraftWorld implements World { Validate.notNull(effect, "Effect cannot be null"); Validate.notNull(location.getWorld(), "World cannot be null"); int packetData = effect.getId(); - PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, location.getBlockX(), location.getBlockY(), location.getBlockZ(), data, false); + PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()), data, false); int distance; radius *= radius; @@ -842,7 +843,7 @@ public class CraftWorld implements World { double y = location.getBlockY() + 0.5; double z = location.getBlockZ() + 0.5; - EntityFallingBlock entity = new EntityFallingBlock(world, x, y, z, net.minecraft.server.Block.getById(material.getId()), data); + EntityFallingBlock entity = new EntityFallingBlock(world, x, y, z, net.minecraft.server.Block.getById(material.getId()).fromLegacyData(data)); entity.ticksLived = 1; world.addEntity(entity, SpawnReason.CUSTOM); @@ -874,10 +875,11 @@ public class CraftWorld implements World { x = location.getBlockX(); y = location.getBlockY(); z = location.getBlockZ(); - int type = world.getTypeId((int) x, (int) y, (int) z); - int data = world.getData((int) x, (int) y, (int) z); + IBlockData blockData = world.getType(new BlockPosition(x, y, z)); + int type = CraftMagicNumbers.getId(blockData.getBlock()); + int data = blockData.getBlock().toLegacyData(blockData); - entity = new EntityFallingBlock(world, x + 0.5, y + 0.5, z + 0.5, net.minecraft.server.Block.getById(type), data); + entity = new EntityFallingBlock(world, x + 0.5, y + 0.5, z + 0.5, net.minecraft.server.Block.getById(type).fromLegacyData(data)); } else if (Projectile.class.isAssignableFrom(clazz)) { if (Snowball.class.isAssignableFrom(clazz)) { entity = new EntitySnowball(world, x, y, z); @@ -890,7 +892,7 @@ public class CraftWorld implements World { entity = new EntityThrownExpBottle(world); entity.setPositionRotation(x, y, z, 0, 0); } else if (EnderPearl.class.isAssignableFrom(clazz)) { - entity = new EntityEnderPearl(world); + entity = new EntityEnderPearl(world, null); entity.setPositionRotation(x, y, z, 0, 0); } else if (ThrownPotion.class.isAssignableFrom(clazz)) { entity = new EntityPotion(world, x, y, z, CraftItemStack.asNMSCopy(new ItemStack(org.bukkit.Material.POTION, 1))); @@ -1000,6 +1002,14 @@ public class CraftWorld implements World { if (Bat.class.isAssignableFrom(clazz)) { entity = new EntityBat(world); } + } else if (Rabbit.class.isAssignableFrom(clazz)) { + entity = new EntityRabbit(world); + } else if (Endermite.class.isAssignableFrom(clazz)) { + entity = new EntityEndermite(world); + } else if (Guardian.class.isAssignableFrom(clazz)){ + entity = new EntityGuardian(world); + } else if (ArmorStand.class.isAssignableFrom(clazz)) { + entity = new EntityArmorStand(world, x, y, z); } if (entity != null) { @@ -1017,29 +1027,29 @@ public class CraftWorld implements World { } else if (block.getRelative(BlockFace.SOUTH).getTypeId() == 0) { face = BlockFace.SOUTH; } - int dir; + EnumDirection dir; switch (face) { case SOUTH: default: - dir = 0; + dir = EnumDirection.SOUTH; break; case WEST: - dir = 1; + dir = EnumDirection.WEST; break; case NORTH: - dir = 2; + dir = EnumDirection.NORTH; break; case EAST: - dir = 3; + dir = EnumDirection.EAST; break; } if (Painting.class.isAssignableFrom(clazz)) { - entity = new EntityPainting(world, (int) x, (int) y, (int) z, dir); + entity = new EntityPainting(world, new BlockPosition((int) x, (int) y, (int) z), dir); } else if (ItemFrame.class.isAssignableFrom(clazz)) { - entity = new EntityItemFrame(world, (int) x, (int) y, (int) z, dir); + entity = new EntityItemFrame(world, new BlockPosition((int) x, (int) y, (int) z), dir); } else if (LeashHitch.class.isAssignableFrom(clazz)) { - entity = new EntityLeash(world, (int) x, (int) y, (int) z); + entity = new EntityLeash(world, new BlockPosition((int) x, (int) y, (int) z)); entity.attachedToPlayer = true; } @@ -1062,7 +1072,7 @@ public class CraftWorld implements World { if (entity != null) { if (entity instanceof EntityInsentient) { - ((EntityInsentient) entity).prepare((GroupDataEntity) null); + ((EntityInsentient) entity).prepare(getHandle().E(new BlockPosition(entity)), (GroupDataEntity) null); } world.addEntity(entity, reason); @@ -1103,9 +1113,9 @@ public class CraftWorld implements World { public void setKeepSpawnInMemory(boolean keepLoaded) { world.keepSpawnInMemory = keepLoaded; // Grab the worlds spawn chunk - ChunkCoordinates chunkcoordinates = this.world.getSpawn(); - int chunkCoordX = chunkcoordinates.x >> 4; - int chunkCoordZ = chunkcoordinates.z >> 4; + BlockPosition chunkcoordinates = this.world.getSpawn(); + int chunkCoordX = chunkcoordinates.getX() >> 4; + int chunkCoordZ = chunkcoordinates.getZ() >> 4; // Cycle through the 25x25 Chunks around it to load/unload the chunks. for (int x = -12; x <= 12; x++) { for (int z = -12; z <= 12; z++) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java new file mode 100644 index 00000000..5a76958d --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java @@ -0,0 +1,105 @@ +package org.bukkit.craftbukkit.block; + +import java.util.ArrayList; +import java.util.List; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.NBTTagList; +import net.minecraft.server.TileEntityBanner; +import org.bukkit.DyeColor; +import org.bukkit.block.Banner; +import org.bukkit.block.Block; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; +import org.bukkit.craftbukkit.CraftWorld; + +public class CraftBanner extends CraftBlockState implements Banner { + + private final TileEntityBanner banner; + private DyeColor base; + private List<Pattern> patterns = new ArrayList<Pattern>(); + + public CraftBanner(final Block block) { + super(block); + + CraftWorld world = (CraftWorld) block.getWorld(); + banner = (TileEntityBanner) world.getTileEntityAt(getX(), getY(), getZ()); + + base = DyeColor.getByDyeData((byte) banner.color); + + if (banner.patterns != null) { + for (int i = 0; i < banner.patterns.size(); i++) { + NBTTagCompound p = (NBTTagCompound) banner.patterns.get(i); + patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt("Color")), PatternType.getByIdentifier(p.getString("Pattern")))); + } + } + } + + @Override + public DyeColor getBaseColor() { + return this.base; + } + + @Override + public void setBaseColor(DyeColor color) { + this.base = color; + } + + @Override + public List<Pattern> getPatterns() { + return new ArrayList<Pattern>(patterns); + } + + @Override + public void setPatterns(List<Pattern> patterns) { + this.patterns = new ArrayList<Pattern>(patterns); + } + + @Override + public void addPattern(Pattern pattern) { + this.patterns.add(pattern); + } + + @Override + public Pattern getPattern(int i) { + return this.patterns.get(i); + } + + @Override + public Pattern removePattern(int i) { + return this.patterns.remove(i); + } + + @Override + public void setPattern(int i, Pattern pattern) { + this.patterns.set(i, pattern); + } + + @Override + public int numberOfPatterns() { + return patterns.size(); + } + + @Override + public boolean update(boolean force, boolean applyPhysics) { + boolean result = super.update(force, applyPhysics); + + if (result) { + banner.color = base.getDyeData(); + + NBTTagList newPatterns = new NBTTagList(); + + for (Pattern p : patterns) { + NBTTagCompound compound = new NBTTagCompound(); + compound.setInt("Color", p.getColor().getDyeData()); + compound.setString("Pattern", p.getPattern().getIdentifier()); + newPatterns.add(compound); + } + + banner.patterns = newPatterns; + + banner.update(); + } + + return result; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index 87d79aec..fe5d231e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -5,15 +5,7 @@ import java.util.Collection; import java.util.Collections; import java.util.List; -import net.minecraft.server.BiomeBase; -import net.minecraft.server.BlockCocoa; -import net.minecraft.server.BlockRedstoneWire; -import net.minecraft.server.Blocks; -import net.minecraft.server.EnumSkyBlock; -import net.minecraft.server.GameProfileSerializer; -import net.minecraft.server.Item; -import net.minecraft.server.NBTTagCompound; -import net.minecraft.server.TileEntitySkull; +import net.minecraft.server.*; import org.bukkit.Chunk; import org.bukkit.Location; @@ -97,19 +89,27 @@ public class CraftBlock implements Block { } public void setData(final byte data) { - chunk.getHandle().world.setData(x, y, z, data, 3); + setData(data, 3); } public void setData(final byte data, boolean applyPhysics) { if (applyPhysics) { - chunk.getHandle().world.setData(x, y, z, data, 3); + setData(data, 3); } else { - chunk.getHandle().world.setData(x, y, z, data, 2); + setData(data, 2); } } + private void setData(final byte data, int flag) { + net.minecraft.server.World world = chunk.getHandle().getWorld(); + BlockPosition position = new BlockPosition(x, y, z); + IBlockData blockData = world.getType(position); + world.setTypeAndData(position, blockData.getBlock().fromLegacyData(data), flag); + } + public byte getData() { - return (byte) chunk.getHandle().getData(this.x & 0xF, this.y & 0xFF, this.z & 0xF); + IBlockData blockData = chunk.getHandle().getBlockData(new BlockPosition(x, y, z)); + return (byte) blockData.getBlock().toLegacyData(blockData); } public void setType(final Material type) { @@ -125,12 +125,14 @@ public class CraftBlock implements Block { } public boolean setTypeIdAndData(final int type, final byte data, final boolean applyPhysics) { + IBlockData blockData = getNMSBlock(type).fromLegacyData(data); + BlockPosition position = new BlockPosition(x, y, z); if (applyPhysics) { - return chunk.getHandle().world.setTypeAndData(x, y, z, getNMSBlock(type), data, 3); + return chunk.getHandle().getWorld().setTypeAndData(position, blockData, 3); } else { - boolean success = chunk.getHandle().world.setTypeAndData(x, y, z, getNMSBlock(type), data, 2); + boolean success = chunk.getHandle().getWorld().setTypeAndData(position, blockData, 2); if (success) { - chunk.getHandle().world.notify(x, y, z); + chunk.getHandle().getWorld().notify(position); } return success; } @@ -143,19 +145,19 @@ public class CraftBlock implements Block { @Deprecated @Override public int getTypeId() { - return CraftMagicNumbers.getId(chunk.getHandle().getType(this.x & 0xF, this.y & 0xFF, this.z & 0xF)); + return CraftMagicNumbers.getId(chunk.getHandle().getType(new BlockPosition(this.x, this.y, this.z))); } public byte getLightLevel() { - return (byte) chunk.getHandle().world.getLightLevel(this.x, this.y, this.z); + return (byte) chunk.getHandle().getWorld().getLightLevel(new BlockPosition(this.x, this.y, this.z)); } public byte getLightFromSky() { - return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.SKY, this.x & 0xF, this.y & 0xFF, this.z & 0xF); + return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.SKY, new BlockPosition(this.x, this.y, this.z)); } public byte getLightFromBlocks() { - return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.BLOCK, this.x & 0xF, this.y & 0xFF, this.z & 0xF); + return (byte) chunk.getHandle().getBrightness(EnumSkyBlock.BLOCK, new BlockPosition(this.x, this.y, this.z)); } @@ -199,47 +201,42 @@ public class CraftBlock implements Block { return "CraftBlock{" + "chunk=" + chunk + ",x=" + x + ",y=" + y + ",z=" + z + ",type=" + getType() + ",data=" + getData() + '}'; } - /** - * Notch uses a 0-5 to mean DOWN, UP, NORTH, SOUTH, WEST, EAST - * in that order all over. This method is convenience to convert for us. - * - * @return BlockFace the BlockFace represented by this number - */ - public static BlockFace notchToBlockFace(int notch) { + public static BlockFace notchToBlockFace(EnumDirection notch) { + if (notch == null) return BlockFace.SELF; switch (notch) { - case 0: + case DOWN: return BlockFace.DOWN; - case 1: + case UP: return BlockFace.UP; - case 2: + case NORTH: return BlockFace.NORTH; - case 3: + case SOUTH: return BlockFace.SOUTH; - case 4: + case WEST: return BlockFace.WEST; - case 5: + case EAST: return BlockFace.EAST; default: return BlockFace.SELF; } } - public static int blockFaceToNotch(BlockFace face) { + public static EnumDirection blockFaceToNotch(BlockFace face) { switch (face) { case DOWN: - return 0; + return EnumDirection.DOWN; case UP: - return 1; + return EnumDirection.UP; case NORTH: - return 2; + return EnumDirection.NORTH; case SOUTH: - return 3; + return EnumDirection.SOUTH; case WEST: - return 4; + return EnumDirection.WEST; case EAST: - return 5; + return EnumDirection.EAST; default: - return 7; // Good as anything here, but technically invalid + return null; } } @@ -277,6 +274,9 @@ public class CraftBlock implements Block { return new CraftCommandBlock(this); case BEACON: return new CraftBeacon(this); + case BANNER: + case WALL_BANNER: + return new CraftBanner(this); default: return new CraftBlockState(this); } @@ -314,11 +314,11 @@ public class CraftBlock implements Block { } public boolean isBlockPowered() { - return chunk.getHandle().world.getBlockPower(x, y, z) > 0; + return chunk.getHandle().getWorld().getBlockPower(new BlockPosition(x, y, z)) > 0; } public boolean isBlockIndirectlyPowered() { - return chunk.getHandle().world.isBlockIndirectlyPowered(x, y, z); + return chunk.getHandle().getWorld().isBlockIndirectlyPowered(new BlockPosition(x, y, z)); } @Override @@ -336,11 +336,11 @@ public class CraftBlock implements Block { } public boolean isBlockFacePowered(BlockFace face) { - return chunk.getHandle().world.isBlockFacePowered(x, y, z, blockFaceToNotch(face)); + return chunk.getHandle().getWorld().isBlockFacePowered(new BlockPosition(x, y, z), blockFaceToNotch(face)); } public boolean isBlockFaceIndirectlyPowered(BlockFace face) { - int power = chunk.getHandle().world.getBlockFacePower(x, y, z, blockFaceToNotch(face)); + int power = chunk.getHandle().getWorld().getBlockFacePower(new BlockPosition(x, y, z), blockFaceToNotch(face)); Block relative = getRelative(face); if (relative.getType() == Material.REDSTONE_WIRE) { @@ -353,13 +353,13 @@ public class CraftBlock implements Block { public int getBlockPower(BlockFace face) { int power = 0; BlockRedstoneWire wire = Blocks.REDSTONE_WIRE; - net.minecraft.server.World world = chunk.getHandle().world; - if ((face == BlockFace.DOWN || face == BlockFace.SELF) && world.isBlockFacePowered(x, y - 1, z, 0)) power = wire.getPower(world, x, y - 1, z, power); - if ((face == BlockFace.UP || face == BlockFace.SELF) && world.isBlockFacePowered(x, y + 1, z, 1)) power = wire.getPower(world, x, y + 1, z, power); - if ((face == BlockFace.EAST || face == BlockFace.SELF) && world.isBlockFacePowered(x + 1, y, z, 2)) power = wire.getPower(world, x + 1, y, z, power); - if ((face == BlockFace.WEST || face == BlockFace.SELF) && world.isBlockFacePowered(x - 1, y, z, 3)) power = wire.getPower(world, x - 1, y, z, power); - if ((face == BlockFace.NORTH || face == BlockFace.SELF) && world.isBlockFacePowered(x, y, z - 1, 4)) power = wire.getPower(world, x, y, z - 1, power); - if ((face == BlockFace.SOUTH || face == BlockFace.SELF) && world.isBlockFacePowered(x, y, z + 1, 5)) power = wire.getPower(world, x, y, z - 1, power); + net.minecraft.server.World world = chunk.getHandle().getWorld(); + if ((face == BlockFace.DOWN || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y - 1, z), EnumDirection.DOWN)) power = wire.getPower(world, new BlockPosition(x, y - 1, z), power); + if ((face == BlockFace.UP || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y + 1, z), EnumDirection.UP)) power = wire.getPower(world, new BlockPosition(x, y + 1, z), power); + if ((face == BlockFace.EAST || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x + 1, y, z), EnumDirection.EAST)) power = wire.getPower(world, new BlockPosition(x + 1, y, z), power); + if ((face == BlockFace.WEST || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x - 1, y, z), EnumDirection.WEST)) power = wire.getPower(world, new BlockPosition(x - 1, y, z), power); + if ((face == BlockFace.NORTH || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y, z - 1), EnumDirection.NORTH)) power = wire.getPower(world, new BlockPosition(x, y, z - 1), power); + if ((face == BlockFace.SOUTH || face == BlockFace.SELF) && world.isBlockFacePowered(new BlockPosition(x, y, z + 1), EnumDirection.SOUTH)) power = wire.getPower(world, new BlockPosition(x, y, z - 1), power); return power > 0 ? power : (face == BlockFace.SELF ? isBlockIndirectlyPowered() : isBlockFaceIndirectlyPowered(face)) ? 15 : 0; } @@ -392,7 +392,7 @@ public class CraftBlock implements Block { boolean result = false; if (block != null && block != Blocks.AIR) { - block.dropNaturally(chunk.getHandle().world, x, y, z, data, 1.0F, 0); + block.dropNaturally(chunk.getHandle().getWorld(), new BlockPosition(x, y, z), block.fromLegacyData(data), 1.0F, 0); result = true; } @@ -415,14 +415,14 @@ public class CraftBlock implements Block { if (block != Blocks.AIR) { byte data = getData(); // based on nms.Block.dropNaturally - int count = block.getDropCount(0, chunk.getHandle().world.random); + int count = block.getDropCount(0, chunk.getHandle().getWorld().random); for (int i = 0; i < count; ++i) { - Item item = block.getDropType(data, chunk.getHandle().world.random, 0); + Item item = block.getDropType(block.fromLegacyData(data), chunk.getHandle().getWorld().random, 0); if (item != null) { // Skulls are special, their data is based on the tile entity if (Blocks.SKULL == block) { - net.minecraft.server.ItemStack nmsStack = new net.minecraft.server.ItemStack(item, 1, block.getDropData(chunk.getHandle().world, x, y, z)); - TileEntitySkull tileentityskull = (TileEntitySkull) chunk.getHandle().world.getTileEntity(x, y, z); + net.minecraft.server.ItemStack nmsStack = new net.minecraft.server.ItemStack(item, 1, block.getDropData(chunk.getHandle().getWorld(), new BlockPosition(x, y, z))); + TileEntitySkull tileentityskull = (TileEntitySkull) chunk.getHandle().getWorld().getTileEntity(new BlockPosition(x, y, z)); if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { nmsStack.setTag(new NBTTagCompound()); @@ -435,12 +435,13 @@ public class CraftBlock implements Block { drops.add(CraftItemStack.asBukkitCopy(nmsStack)); // We don't want to drop cocoa blocks, we want to drop cocoa beans. } else if (Blocks.COCOA == block) { - int dropAmount = (BlockCocoa.c(data) >= 2 ? 3 : 1); + int age = (Integer) block.fromLegacyData(data).get(BlockCocoa.AGE); + int dropAmount = (age >= 2 ? 3 : 1); for (int j = 0; j < dropAmount; ++j) { drops.add(new ItemStack(Material.INK_SACK, 1, (short) 3)); } } else { - drops.add(new ItemStack(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(item), 1, (short) block.getDropData(data))); + drops.add(new ItemStack(org.bukkit.craftbukkit.util.CraftMagicNumbers.getMaterial(item), 1, (short) block.getDropData(block.fromLegacyData(data)))); } } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index 2297cc75..9fb32a82 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockPosition; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.Chunk; @@ -147,7 +148,7 @@ public class CraftBlockState implements BlockState { } block.setData(getRawData(), applyPhysics); - world.getHandle().notify(x, y, z); + world.getHandle().notify(new BlockPosition(x, y, z)); return true; } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java index 21f7b732..0e5c2404 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockPosition; import net.minecraft.server.TileEntityChest; import org.bukkit.Material; @@ -41,19 +42,19 @@ public class CraftChest extends CraftBlockState implements Chest { } if (world.getBlockTypeIdAt(x - 1, y, z) == id) { - CraftInventory left = new CraftInventory((TileEntityChest)world.getHandle().getTileEntity(x - 1, y, z)); + CraftInventory left = new CraftInventory((TileEntityChest)world.getHandle().getTileEntity(new BlockPosition(x - 1, y, z))); inventory = new CraftInventoryDoubleChest(left, inventory); } if (world.getBlockTypeIdAt(x + 1, y, z) == id) { - CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x + 1, y, z)); + CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(new BlockPosition(x + 1, y, z))); inventory = new CraftInventoryDoubleChest(inventory, right); } if (world.getBlockTypeIdAt(x, y, z - 1) == id) { - CraftInventory left = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x, y, z - 1)); + CraftInventory left = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(new BlockPosition(x, y, z - 1))); inventory = new CraftInventoryDoubleChest(left, inventory); } if (world.getBlockTypeIdAt(x, y, z + 1) == id) { - CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(x, y, z + 1)); + CraftInventory right = new CraftInventory((TileEntityChest) world.getHandle().getTileEntity(new BlockPosition(x, y, z + 1))); inventory = new CraftInventoryDoubleChest(inventory, right); } return inventory; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java index 762a8e6d..ab6e55f4 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.block; import net.minecraft.server.BlockDispenser; +import net.minecraft.server.BlockPosition; import net.minecraft.server.Blocks; import net.minecraft.server.TileEntityDispenser; @@ -44,7 +45,7 @@ public class CraftDispenser extends CraftBlockState implements Dispenser { if (block.getType() == Material.DISPENSER) { BlockDispenser dispense = (BlockDispenser) Blocks.DISPENSER; - dispense.dispense(world.getHandle(), getX(), getY(), getZ()); + dispense.dispense(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); return true; } else { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java index 6b4ef8ad..327f4766 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.block; import net.minecraft.server.BlockDropper; +import net.minecraft.server.BlockPosition; import net.minecraft.server.Blocks; import net.minecraft.server.TileEntityDropper; @@ -32,7 +33,7 @@ public class CraftDropper extends CraftBlockState implements Dropper { if (block.getType() == Material.DROPPER) { BlockDropper drop = (BlockDropper) Blocks.DROPPER; - drop.dispense(world.getHandle(), getX(), getY(), getZ()); + drop.dispense(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java index 761b76af..ce744c97 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java @@ -1,9 +1,6 @@ package org.bukkit.craftbukkit.block; -import net.minecraft.server.BlockJukeBox; -import net.minecraft.server.Blocks; -import net.minecraft.server.ItemStack; -import net.minecraft.server.TileEntityRecordPlayer; +import net.minecraft.server.*; import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.block.Block; @@ -41,9 +38,13 @@ public class CraftJukebox extends CraftBlockState implements Jukebox { } jukebox.update(); if (record == Material.AIR) { - world.getHandle().setData(getX(), getY(), getZ(), 0, 3); + world.getHandle().setTypeAndData(new BlockPosition(getX(), getY(), getZ()), + Blocks.JUKEBOX.getBlockData() + .set(BlockJukeBox.HAS_RECORD, false), 3); } else { - world.getHandle().setData(getX(), getY(), getZ(), 1, 3); + world.getHandle().setTypeAndData(new BlockPosition(getX(), getY(), getZ()), + Blocks.JUKEBOX.getBlockData() + .set(BlockJukeBox.HAS_RECORD, true), 3); } world.playEffect(getLocation(), Effect.RECORD_PLAY, record.getId()); } @@ -54,7 +55,7 @@ public class CraftJukebox extends CraftBlockState implements Jukebox { public boolean eject() { boolean result = isPlaying(); - ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), getX(), getY(), getZ()); + ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), new BlockPosition(getX(), getY(), getZ()), null); return result; } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java index b83e3351..79d8e6dd 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockPosition; import net.minecraft.server.TileEntityNote; import org.bukkit.Instrument; @@ -41,7 +42,7 @@ public class CraftNoteBlock extends CraftBlockState implements NoteBlock { Block block = getBlock(); if (block.getType() == Material.NOTE_BLOCK) { - note.play(world.getHandle(), getX(), getY(), getZ()); + note.play(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); return true; } else { return false; @@ -53,7 +54,7 @@ public class CraftNoteBlock extends CraftBlockState implements NoteBlock { Block block = getBlock(); if (block.getType() == Material.NOTE_BLOCK) { - world.getHandle().playBlockAction(getX(), getY(), getZ(), CraftMagicNumbers.getBlock(block), instrument, note); + world.getHandle().playBlockAction(new BlockPosition(getX(), getY(), getZ()), CraftMagicNumbers.getBlock(block), instrument, note); return true; } else { return false; @@ -65,7 +66,7 @@ public class CraftNoteBlock extends CraftBlockState implements NoteBlock { Block block = getBlock(); if (block.getType() == Material.NOTE_BLOCK) { - world.getHandle().playBlockAction(getX(), getY(), getZ(), CraftMagicNumbers.getBlock(block), instrument.getType(), note.getId()); + world.getHandle().playBlockAction(new BlockPosition(getX(), getY(), getZ()), CraftMagicNumbers.getBlock(block), instrument.getType(), note.getId()); return true; } else { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java index 77717d5b..724dbd12 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java @@ -1,9 +1,12 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.ChatComponentText; +import net.minecraft.server.IChatBaseComponent; import net.minecraft.server.TileEntitySign; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftSign extends CraftBlockState implements Sign { private final TileEntitySign sign; @@ -15,7 +18,7 @@ public class CraftSign extends CraftBlockState implements Sign { CraftWorld world = (CraftWorld) block.getWorld(); sign = (TileEntitySign) world.getTileEntityAt(getX(), getY(), getZ()); lines = new String[sign.lines.length]; - System.arraycopy(sign.lines, 0, lines, 0, lines.length); + System.arraycopy(revertComponents(sign.lines), 0, lines, 0, lines.length); } public String[] getLines() { @@ -35,24 +38,37 @@ public class CraftSign extends CraftBlockState implements Sign { boolean result = super.update(force, applyPhysics); if (result) { - sign.lines = sanitizeLines(lines); + IChatBaseComponent[] newLines = sanitizeLines(lines); + System.arraycopy(newLines, 0, sign.lines, 0, 4); sign.update(); } return result; } - public static String[] sanitizeLines(String[] lines) { - String[] astring = new String[4]; + public static IChatBaseComponent[] sanitizeLines(String[] lines) { + IChatBaseComponent[] components = new IChatBaseComponent[4]; for (int i = 0; i < 4; i++) { if (i < lines.length && lines[i] != null) { - astring[i] = lines[i]; + components[i] = CraftChatMessage.fromString(lines[i])[0]; } else { - astring[i] = ""; + components[i] = new ChatComponentText(""); } } - return TileEntitySign.sanitizeLines(astring); + return components; + } + + public static String[] revertComponents(IChatBaseComponent[] components) { + String[] lines = new String[components.length]; + for (int i = 0; i < lines.length; i++) { + lines[i] = revertComponent(components[i]); + } + return lines; + } + + private static String revertComponent(IChatBaseComponent component) { + return CraftChatMessage.fromComponent(component); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java index dc9a587e..8d751c11 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java @@ -1,8 +1,8 @@ package org.bukkit.craftbukkit.block; +import com.mojang.authlib.GameProfile; import net.minecraft.server.MinecraftServer; import net.minecraft.server.TileEntitySkull; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.SkullType; import org.bukkit.block.Block; @@ -24,7 +24,7 @@ public class CraftSkull extends CraftBlockState implements Skull { skull = (TileEntitySkull) world.getTileEntityAt(getX(), getY(), getZ()); profile = skull.getGameProfile(); skullType = getSkullType(skull.getSkullType()); - rotation = (byte) skull.getRotation(); + rotation = (byte) skull.rotation; } static SkullType getSkullType(int id) { diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java index 9cf1b493..c2d4c2e4 100644 --- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java +++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java @@ -35,17 +35,17 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu } queuedChunk.loader.loadEntities(chunk, queuedChunk.compound.getCompound("Level"), queuedChunk.world); - chunk.lastSaved = queuedChunk.provider.world.getTime(); + chunk.setLastSaved(queuedChunk.provider.world.getTime()); queuedChunk.provider.chunks.put(LongHash.toLong(queuedChunk.x, queuedChunk.z), chunk); chunk.addEntities(); if (queuedChunk.provider.chunkProvider != null) { - queuedChunk.provider.chunkProvider.recreateStructures(queuedChunk.x, queuedChunk.z); + queuedChunk.provider.chunkProvider.recreateStructures(chunk, queuedChunk.x, queuedChunk.z); } Server server = queuedChunk.provider.world.getServer(); if (server != null) { - server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, false)); + server.getPluginManager().callEvent(new org.bukkit.event.world.ChunkLoadEvent(chunk.bukkitChunk, false)); } // Update neighbor counts diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java index bdee7d73..a5174166 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java +++ b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java @@ -18,7 +18,7 @@ public class CraftBlockCommandSender extends ServerCommandSender implements Bloc } public Block getBlock() { - return commandBlock.getWorld().getWorld().getBlockAt(commandBlock.getChunkCoordinates().x, commandBlock.getChunkCoordinates().y, commandBlock.getChunkCoordinates().z); + return commandBlock.getWorld().getWorld().getBlockAt(commandBlock.getChunkCoordinates().getX(), commandBlock.getChunkCoordinates().getY(), commandBlock.getChunkCoordinates().getZ()); } public void sendMessage(String message) { diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java index 25d12558..7c5523b0 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java +++ b/src/main/java/org/bukkit/craftbukkit/command/CraftRemoteConsoleCommandSender.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.command; +import net.minecraft.server.ChatComponentText; import net.minecraft.server.RemoteControlCommandListener; import org.bukkit.command.RemoteConsoleCommandSender; @@ -10,7 +11,7 @@ public class CraftRemoteConsoleCommandSender extends ServerCommandSender impleme @Override public void sendMessage(String message) { - RemoteControlCommandListener.instance.sendMessage(message + "\n"); // Send a newline after each message, to preserve formatting. + RemoteControlCommandListener.getInstance().sendMessage(new ChatComponentText(message + "\n")); // Send a newline after each message, to preserve formatting. } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java index 5909613c..229a65d9 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java +++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java @@ -1,22 +1,9 @@ package org.bukkit.craftbukkit.command; +import java.util.Iterator; import java.util.List; -import net.minecraft.server.ChatMessage; -import net.minecraft.server.CommandAbstract; -import net.minecraft.server.CommandBlockListenerAbstract; -import net.minecraft.server.CommandException; -import net.minecraft.server.EntityMinecartCommandBlock; -import net.minecraft.server.EntityMinecartCommandBlockListener; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.EnumChatFormat; -import net.minecraft.server.ExceptionUsage; -import net.minecraft.server.ICommandListener; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.PlayerSelector; -import net.minecraft.server.RemoteControlCommandListener; -import net.minecraft.server.TileEntityCommandListener; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.apache.commons.lang.Validate; import org.apache.logging.log4j.Level; @@ -58,6 +45,9 @@ public final class VanillaCommandWrapper extends VanillaCommand { MinecraftServer.getServer().worldServer = new WorldServer[]{(WorldServer) icommandlistener.getWorld()}; try { vanillaCommand.execute(icommandlistener, args); + // PAIL fake throws + if (false) throw new ExceptionUsage(null, null); + if (false) throw new CommandException(null, null); } catch (ExceptionUsage exceptionusage) { ChatMessage chatmessage = new ChatMessage("commands.generic.usage", new Object[] {new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs())}); chatmessage.getChatModifier().setColor(EnumChatFormat.RED); @@ -77,7 +67,7 @@ public final class VanillaCommandWrapper extends VanillaCommand { Validate.notNull(sender, "Sender cannot be null"); Validate.notNull(args, "Arguments cannot be null"); Validate.notNull(alias, "Alias cannot be null"); - return (List<String>) vanillaCommand.tabComplete(getListener(sender), args); + return (List<String>) vanillaCommand.tabComplete(getListener(sender), args, new BlockPosition(0, 0, 0)); } public final int dispatchVanillaCommandBlock(CommandBlockListenerAbstract icommandlistener, String s) { @@ -97,26 +87,35 @@ public final class VanillaCommandWrapper extends VanillaCommand { try { if (vanillaCommand.canUse(icommandlistener)) { if (i > -1) { - EntityPlayer aentityplayer[] = PlayerSelector.getPlayers(icommandlistener, as[i]); + List<Entity> list = ((List<Entity>)PlayerSelector.getPlayers(icommandlistener, as[i], Entity.class)); String s2 = as[i]; - EntityPlayer aentityplayer1[] = aentityplayer; - int k = aentityplayer1.length; - for (int l = 0; l < k;l++) { - EntityPlayer entityplayer = aentityplayer1[l]; - as[i] = entityplayer.getName(); + + icommandlistener.a(EnumCommandResult.AFFECTED_ENTITIES, list.size()); + Iterator<Entity> iterator = list.iterator(); + + while (iterator.hasNext()) { + Entity entity = iterator.next(); + try { + as[i] = entity.getUniqueID().toString(); vanillaCommand.execute(icommandlistener, as); j++; - continue; - } catch (CommandException commandexception1) { - ChatMessage chatmessage4 = new ChatMessage(commandexception1.getMessage(), commandexception1.getArgs()); - chatmessage4.getChatModifier().setColor(EnumChatFormat.RED); - icommandlistener.sendMessage(chatmessage4); - } + // PAIL fake throws + if (false) throw new ExceptionUsage(null, null); + if (false) throw new CommandException(null, null); + } catch (ExceptionUsage exceptionusage) { + ChatMessage chatmessage = new ChatMessage("commands.generic.usage", new Object[] { new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs())}); + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); + icommandlistener.sendMessage(chatmessage); + } catch (CommandException commandexception) { + ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs()); + chatmessage.getChatModifier().setColor(EnumChatFormat.RED); + icommandlistener.sendMessage(chatmessage); + } } - as[i] = s2; } else { + icommandlistener.a(EnumCommandResult.AFFECTED_ENTITIES, 1); vanillaCommand.execute(icommandlistener, as); j++; } @@ -125,6 +124,10 @@ public final class VanillaCommandWrapper extends VanillaCommand { chatmessage.getChatModifier().setColor(EnumChatFormat.RED); icommandlistener.sendMessage(chatmessage); } + // PAIL start: fix compile error + if (false) throw new ExceptionUsage(null, null); + if (false) throw new CommandException(null, null); + // PAIL end } catch (ExceptionUsage exceptionusage) { ChatMessage chatmessage1 = new ChatMessage("commands.generic.usage", new Object[] { new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs()) }); chatmessage1.getChatModifier().setColor(EnumChatFormat.RED); @@ -139,16 +142,17 @@ public final class VanillaCommandWrapper extends VanillaCommand { icommandlistener.sendMessage(chatmessage3); if(icommandlistener instanceof TileEntityCommandListener) { TileEntityCommandListener listener = (TileEntityCommandListener) icommandlistener; - MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), throwable); + MinecraftServer.getLogger().log(Level.WARN, String.format("CommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), throwable); } else if (icommandlistener instanceof EntityMinecartCommandBlockListener) { EntityMinecartCommandBlockListener listener = (EntityMinecartCommandBlockListener) icommandlistener; - MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().x, listener.getChunkCoordinates().y, listener.getChunkCoordinates().z), throwable); + MinecraftServer.getLogger().log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", listener.getChunkCoordinates().getX(), listener.getChunkCoordinates().getY(), listener.getChunkCoordinates().getZ()), throwable); } else { MinecraftServer.getLogger().log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), throwable); } } finally { MinecraftServer.getServer().worldServer = prev; } + icommandlistener.a(EnumCommandResult.SUCCESS_COUNT, j); return j; } @@ -163,7 +167,7 @@ public final class VanillaCommandWrapper extends VanillaCommand { return ((EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).getCommandBlock(); } if (sender instanceof RemoteConsoleCommandSender) { - return RemoteControlCommandListener.instance; + return RemoteControlCommandListener.getInstance(); } if (sender instanceof ConsoleCommandSender) { return ((CraftServer) sender.getServer()).getServer(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java new file mode 100644 index 00000000..2896603e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java @@ -0,0 +1,214 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityArmorStand; +import net.minecraft.server.Vector3f; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.EulerAngle; + +public class CraftArmorStand extends CraftLivingEntity implements ArmorStand { + + private static final int HAND = 0; + private static final int FEET = 1; + private static final int LEGS = 2; + private static final int CHEST = 3; + private static final int HEAD = 4; + + public CraftArmorStand(CraftServer server, EntityArmorStand entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftArmorStand"; + } + + @Override + public EntityType getType() { + return EntityType.ARMOR_STAND; + } + + @Override + public EntityArmorStand getHandle() { + return (EntityArmorStand) super.getHandle(); + } + + @Override + public ItemStack getItemInHand() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(HAND)); + } + + @Override + public void setItemInHand(ItemStack item) { + getHandle().setEquipment(HAND, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getBoots() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(FEET)); + } + + @Override + public void setBoots(ItemStack item) { + getHandle().setEquipment(FEET, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getLeggings() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(LEGS)); + } + + @Override + public void setLeggings(ItemStack item) { + getHandle().setEquipment(LEGS, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getChestplate() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(CHEST)); + } + + @Override + public void setChestplate(ItemStack item) { + getHandle().setEquipment(CHEST, CraftItemStack.asNMSCopy(item)); + } + + @Override + public ItemStack getHelmet() { + return CraftItemStack.asBukkitCopy(getHandle().getEquipment(HEAD)); + } + + @Override + public void setHelmet(ItemStack item) { + getHandle().setEquipment(HEAD, CraftItemStack.asNMSCopy(item)); + } + + @Override + public EulerAngle getBodyPose() { + return fromNMS(getHandle().bodyPose); + } + + @Override + public void setBodyPose(EulerAngle pose) { + getHandle().setBodyPose(toNMS(pose)); + } + + @Override + public EulerAngle getLeftArmPose() { + return fromNMS(getHandle().leftArmPose); + } + + @Override + public void setLeftArmPose(EulerAngle pose) { + getHandle().setLeftArmPose(toNMS(pose)); + } + + @Override + public EulerAngle getRightArmPose() { + return fromNMS(getHandle().rightArmPose); + } + + @Override + public void setRightArmPose(EulerAngle pose) { + getHandle().setRightArmPose(toNMS(pose)); + } + + @Override + public EulerAngle getLeftLegPose() { + return fromNMS(getHandle().leftLegPose); + } + + @Override + public void setLeftLegPose(EulerAngle pose) { + getHandle().setLeftLegPose(toNMS(pose)); + } + + @Override + public EulerAngle getRightLegPose() { + return fromNMS(getHandle().rightLegPose); + } + + @Override + public void setRightLegPose(EulerAngle pose) { + getHandle().setRightLegPose(toNMS(pose)); + } + + @Override + public EulerAngle getHeadPose() { + return fromNMS(getHandle().headPose); + } + + @Override + public void setHeadPose(EulerAngle pose) { + getHandle().setHeadPose(toNMS(pose)); + } + + @Override + public boolean hasBasePlate() { + return !getHandle().hasBasePlate(); + } + + @Override + public void setBasePlate(boolean basePlate) { + getHandle().setBasePlate(!basePlate); + } + + @Override + public boolean hasGravity() { + return !getHandle().hasGravity(); + } + + @Override + public void setGravity(boolean gravity) { + getHandle().setGravity(!gravity); + } + + @Override + public boolean isVisible() { + return !getHandle().isInvisible(); + } + + @Override + public void setVisible(boolean visible) { + getHandle().setInvisible(!visible); + } + + @Override + public boolean hasArms() { + return getHandle().hasArms(); + } + + @Override + public void setArms(boolean arms) { + getHandle().setArms(arms); + } + + @Override + public boolean isSmall() { + return getHandle().isSmall(); + } + + @Override + public void setSmall(boolean small) { + getHandle().setSmall(small); + } + + private static EulerAngle fromNMS(Vector3f old) { + return new EulerAngle( + Math.toRadians(old.getX()), + Math.toRadians(old.getY()), + Math.toRadians(old.getZ()) + ); + } + + private static Vector3f toNMS(EulerAngle old) { + return new Vector3f( + (float) Math.toDegrees(old.getX()), + (float) Math.toDegrees(old.getY()), + (float) Math.toDegrees(old.getZ()) + ); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java index 4f8d47d6..dca85204 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java @@ -33,7 +33,7 @@ public class CraftArrow extends AbstractProjectile implements Arrow { } public ProjectileSource getShooter() { - return getHandle().projectileSource; + return getHandle().projectileSource; } public void setShooter(ProjectileSource shooter) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java index a6c0b94e..09d42141 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCreature.java @@ -1,7 +1,6 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityCreature; -import net.minecraft.server.EntityLiving; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.Creature; import org.bukkit.entity.LivingEntity; @@ -14,20 +13,16 @@ public class CraftCreature extends CraftLivingEntity implements Creature { public void setTarget(LivingEntity target) { EntityCreature entity = getHandle(); if (target == null) { - entity.target = null; - entity.setGoalTarget(null); + entity.setGoalTarget(null, null, false); } else if (target instanceof CraftLivingEntity) { - entity.target = ((CraftLivingEntity) target).getHandle(); - entity.pathEntity = entity.world.findPath(entity, entity.target, 16.0F, true, false, false, true); - entity.setGoalTarget(((CraftLivingEntity) target).getHandle()); + entity.setGoalTarget(((CraftLivingEntity) target).getHandle(), null, false); } } public CraftLivingEntity getTarget() { - if (getHandle().target == null) return null; - if (!(getHandle().target instanceof EntityLiving)) return null; + if (getHandle().getGoalTarget() == null) return null; - return (CraftLivingEntity) getHandle().target.getBukkitEntity(); + return (CraftLivingEntity) getHandle().getGoalTarget().getBukkitEntity(); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java index 09a03c05..b1bf7a46 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java @@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityEnderman; +import net.minecraft.server.IBlockData; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.Enderman; @@ -14,12 +15,12 @@ public class CraftEnderman extends CraftMonster implements Enderman { } public MaterialData getCarriedMaterial() { - return CraftMagicNumbers.getMaterial(getHandle().getCarried()).getNewData((byte) getHandle().getCarriedData()); + IBlockData blockData = getHandle().getCarried(); + return CraftMagicNumbers.getMaterial(blockData.getBlock()).getNewData((byte) blockData.getBlock().toLegacyData(blockData)); } public void setCarriedMaterial(MaterialData data) { - getHandle().setCarried(CraftMagicNumbers.getBlock(data.getItemTypeId())); - getHandle().setCarriedData(data.getData()); + getHandle().setCarried(CraftMagicNumbers.getBlock(data.getItemTypeId()).fromLegacyData(data.getData())); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java new file mode 100644 index 00000000..4fd49ead --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityEndermite; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Endermite; +import org.bukkit.entity.EntityType; + +public class CraftEndermite extends CraftMonster implements Endermite { + + public CraftEndermite(CraftServer server, EntityEndermite entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftEndermite"; + } + + @Override + public EntityType getType() { + return EntityType.ENDERMITE; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index b8a9a148..b7e9d8fd 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -37,6 +37,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityPlayer) { return new CraftPlayer(server, (EntityPlayer) entity); } else { return new CraftHumanEntity(server, (EntityHuman) entity); } } + // Water Animals + else if (entity instanceof EntityWaterAnimal) { + if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } + else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); } + } else if (entity instanceof EntityCreature) { // Animals if (entity instanceof EntityAnimal) { @@ -52,6 +57,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } else if (entity instanceof EntitySheep) { return new CraftSheep(server, (EntitySheep) entity); } else if (entity instanceof EntityHorse) { return new CraftHorse(server, (EntityHorse) entity); } + else if (entity instanceof EntityRabbit) { return new CraftRabbit(server, (EntityRabbit) entity); } else { return new CraftAnimals(server, (EntityAnimal) entity); } } // Monsters @@ -72,14 +78,11 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityCaveSpider) { return new CraftCaveSpider(server, (EntityCaveSpider) entity); } else { return new CraftSpider(server, (EntitySpider) entity); } } + else if (entity instanceof EntityEndermite) { return new CraftEndermite(server, (EntityEndermite) entity); } + else if (entity instanceof EntityGuardian) { return new CraftGuardian(server, (EntityGuardian) entity); } else { return new CraftMonster(server, (EntityMonster) entity); } } - // Water Animals - else if (entity instanceof EntityWaterAnimal) { - if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } - else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); } - } else if (entity instanceof EntityGolem) { if (entity instanceof EntitySnowman) { return new CraftSnowman(server, (EntitySnowman) entity); } else if (entity instanceof EntityIronGolem) { return new CraftIronGolem(server, (EntityIronGolem) entity); } @@ -105,6 +108,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityBat) { return new CraftBat(server, (EntityBat) entity); } else { return new CraftAmbient(server, (EntityAmbient) entity); } } + else if (entity instanceof EntityArmorStand) { return new CraftArmorStand(server, (EntityArmorStand) entity); } else { return new CraftLivingEntity(server, (EntityLiving) entity); } } else if (entity instanceof EntityComplexPart) { @@ -154,7 +158,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { else if (entity instanceof EntityTNTPrimed) { return new CraftTNTPrimed(server, (EntityTNTPrimed) entity); } else if (entity instanceof EntityFireworks) { return new CraftFirework(server, (EntityFireworks) entity); } - throw new AssertionError("Unknown entity " + entity == null ? null : entity.getClass()); + throw new AssertionError("Unknown entity " + (entity == null ? null : entity.getClass())); } public Location getLocation() { @@ -224,7 +228,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { public List<org.bukkit.entity.Entity> getNearbyEntities(double x, double y, double z) { @SuppressWarnings("unchecked") - List<Entity> notchEntityList = entity.world.getEntities(entity, entity.boundingBox.grow(x, y, z)); + List<Entity> notchEntityList = entity.world.getEntities(entity, entity.getBoundingBox().grow(x, y, z)); List<org.bukkit.entity.Entity> bukkitEntityList = new java.util.ArrayList<org.bukkit.entity.Entity>(notchEntityList.size()); for (Entity e : notchEntityList) { @@ -316,7 +320,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } public UUID getUniqueId() { - return getHandle().uniqueID; + return getHandle().getUniqueID(); } public int getTicksLived() { @@ -402,4 +406,34 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return getHandle().vehicle.getBukkitEntity(); } + + @Override + public void setCustomName(String name) { + if (name == null) { + name = ""; + } + + getHandle().setCustomName(name); + } + + @Override + public String getCustomName() { + String name = getHandle().getCustomName(); + + if (name == null || name.length() == 0) { + return null; + } + + return name; + } + + @Override + public void setCustomNameVisible(boolean flag) { + getHandle().setCustomNameVisible(flag); + } + + @Override + public boolean isCustomNameVisible() { + return getHandle().getCustomNameVisible(); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java index d67ddd08..788f26ba 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingSand.java @@ -33,11 +33,11 @@ public class CraftFallingSand extends CraftEntity implements FallingSand { } public int getBlockId() { - return CraftMagicNumbers.getId(getHandle().id); + return CraftMagicNumbers.getId(getHandle().getBlock().getBlock()); } public byte getBlockData() { - return (byte) getHandle().data; + return (byte) getHandle().getBlock().getBlock().toLegacyData(getHandle().getBlock()); } public boolean getDropItem() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java index edb30e7c..ecfc316b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.entity; +import net.minecraft.server.BlockPosition; import net.minecraft.server.EntityFishingHook; import net.minecraft.server.EntityHuman; import net.minecraft.server.MathHelper; @@ -50,7 +51,7 @@ public class CraftFish extends AbstractProjectile implements Fish { EntityFishingHook hook = getHandle(); if (this.biteChance == -1) { - if (hook.world.isRainingAt(MathHelper.floor(hook.locX), MathHelper.floor(hook.locY) + 1, MathHelper.floor(hook.locZ))) { + if (hook.world.isRainingAt(new BlockPosition(MathHelper.floor(hook.locX), MathHelper.floor(hook.locY) + 1, MathHelper.floor(hook.locZ)))) { return 1/300.0; } return 1/500.0; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java new file mode 100644 index 00000000..f254e809 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityGuardian; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Guardian; + +public class CraftGuardian extends CraftMonster implements Guardian { + + public CraftGuardian(CraftServer server, EntityGuardian entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftGuardian"; + } + + @Override + public EntityType getType() { + return EntityType.GUARDIAN; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java index e51dddbd..3bf83db1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHanging.java @@ -1,6 +1,8 @@ package org.bukkit.craftbukkit.entity; +import net.minecraft.server.BlockPosition; import net.minecraft.server.EntityHanging; +import net.minecraft.server.EnumDirection; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.craftbukkit.CraftServer; @@ -23,30 +25,27 @@ public class CraftHanging extends CraftEntity implements Hanging { public boolean setFacingDirection(BlockFace face, boolean force) { Block block = getLocation().getBlock().getRelative(getAttachedFace()).getRelative(face.getOppositeFace()).getRelative(getFacing()); EntityHanging hanging = getHandle(); - int x = hanging.x, y = hanging.y, z = hanging.z, dir = hanging.direction; - hanging.x = block.getX(); - hanging.y = block.getY(); - hanging.z = block.getZ(); + BlockPosition old = hanging.getBlockPosition(); + EnumDirection dir = hanging.direction; + hanging.blockPosition = new BlockPosition(block.getX(), block.getY(), block.getZ()); switch (face) { case SOUTH: default: - getHandle().setDirection(0); + getHandle().setDirection(EnumDirection.SOUTH); break; case WEST: - getHandle().setDirection(1); + getHandle().setDirection(EnumDirection.WEST); break; case NORTH: - getHandle().setDirection(2); + getHandle().setDirection(EnumDirection.NORTH); break; case EAST: - getHandle().setDirection(3); + getHandle().setDirection(EnumDirection.EAST); break; } if (!force && !hanging.survives()) { // Revert since it doesn't fit - hanging.x = x; - hanging.y = y; - hanging.z = z; + hanging.blockPosition = old; hanging.setDirection(dir); return false; } @@ -55,14 +54,14 @@ public class CraftHanging extends CraftEntity implements Hanging { public BlockFace getFacing() { switch (this.getHandle().direction) { - case 0: + case SOUTH: default: return BlockFace.SOUTH; - case 1: + case WEST: return BlockFace.WEST; - case 2: + case NORTH: return BlockFace.NORTH; - case 3: + case EAST: return BlockFace.EAST; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java index 8522cad0..230ae9ee 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHorse.java @@ -107,7 +107,7 @@ public class CraftHorse extends CraftAnimals implements Horse { public void setOwner(AnimalTamer owner) { if (owner != null) { setTamed(true); - getHandle().setPathEntity(null); + getHandle().setGoalTarget(null, null, false); setOwnerUUID(owner.getUniqueId()); } else { setTamed(false); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index 3d1ca3d8..e69f417b 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -2,16 +2,7 @@ package org.bukkit.craftbukkit.entity; import java.util.Set; -import net.minecraft.server.Container; -import net.minecraft.server.EntityHuman; -import net.minecraft.server.EntityMinecartHopper; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.PacketPlayInCloseWindow; -import net.minecraft.server.PacketPlayOutOpenWindow; -import net.minecraft.server.TileEntityBrewingStand; -import net.minecraft.server.TileEntityDispenser; -import net.minecraft.server.TileEntityFurnace; -import net.minecraft.server.TileEntityHopper; +import net.minecraft.server.*; import org.bukkit.GameMode; import org.bukkit.Location; @@ -194,38 +185,38 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { break; case DISPENSER: if (craftinv.getInventory() instanceof TileEntityDispenser) { - getHandle().openDispenser((TileEntityDispenser) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityDispenser) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 3); + openCustomInventory(inventory, player, "minecraft:dispenser"); } break; case FURNACE: if (craftinv.getInventory() instanceof TileEntityFurnace) { - getHandle().openFurnace((TileEntityFurnace) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityFurnace) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 2); + openCustomInventory(inventory, player, "minecraft:furnace"); } break; case WORKBENCH: - openCustomInventory(inventory, player, 1); + openCustomInventory(inventory, player, "minecraft:crafting_table"); break; case BREWING: if (craftinv.getInventory() instanceof TileEntityBrewingStand) { - getHandle().openBrewingStand((TileEntityBrewingStand) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityBrewingStand) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 5); + openCustomInventory(inventory, player, "minecraft:brewing_stand"); } break; case ENCHANTING: - openCustomInventory(inventory, player, 4); + openCustomInventory(inventory, player, "minecraft:enchanting_table"); break; case HOPPER: if (craftinv.getInventory() instanceof TileEntityHopper) { - getHandle().openHopper((TileEntityHopper) craftinv.getInventory()); + getHandle().openTileEntity((TileEntityHopper) craftinv.getInventory()); } else if (craftinv.getInventory() instanceof EntityMinecartHopper) { - getHandle().openMinecartHopper((EntityMinecartHopper) craftinv.getInventory()); + getHandle().openTileEntity((EntityMinecartHopper) craftinv.getInventory()); } else { - openCustomInventory(inventory, player, 9); + openCustomInventory(inventory, player, "minecraft:hopper"); } break; case CREATIVE: @@ -239,7 +230,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { return getHandle().activeContainer.getBukkitView(); } - private void openCustomInventory(Inventory inventory, EntityPlayer player, int windowType) { + private void openCustomInventory(Inventory inventory, EntityPlayer player, String windowType) { if (player.playerConnection == null) return; Container container = new CraftContainer(inventory, this, player.nextContainerCounter()); @@ -249,7 +240,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { String title = container.getBukkitView().getTitle(); int size = container.getBukkitView().getTopInventory().getSize(); - player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title, size, true)); + player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, new ChatComponentText(title), size)); getHandle().activeContainer = container; getHandle().activeContainer.addSlotListener(player); } @@ -264,7 +255,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { if (location == null) { location = getLocation(); } - getHandle().startCrafting(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + getHandle().openTileEntity(new TileEntityContainerWorkbench(getHandle().world, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()))); if (force) { getHandle().activeContainer.checkReachable = false; } @@ -281,7 +272,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { if (location == null) { location = getLocation(); } - getHandle().startEnchanting(location.getBlockX(), location.getBlockY(), location.getBlockZ(), null); + getHandle().openTileEntity((ITileEntityContainer) getHandle().world.getTileEntity(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()))); if (force) { getHandle().activeContainer.checkReachable = false; } @@ -311,10 +302,10 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { // Now open the window InventoryType type = inventory.getType(); - int windowType = CraftContainer.getNotchInventoryType(type); + String windowType = CraftContainer.getNotchInventoryType(type); String title = inventory.getTitle(); int size = inventory.getTopInventory().getSize(); - player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, title, size, false)); + player.playerConnection.sendPacket(new PacketPlayOutOpenWindow(container.windowId, windowType, new ChatComponentText(title), size)); player.activeContainer = container; player.activeContainer.addSlotListener(player); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index add554e9..e31fcc17 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -197,11 +197,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { reason = DamageSource.mobAttack(((CraftLivingEntity) source).getHandle()); } - if (entity instanceof EntityEnderDragon) { - ((EntityEnderDragon) entity).dealDamage(reason, (float) amount); - } else { - entity.damageEntity(reason, (float) amount); - } + entity.damageEntity(reason, (float) amount); } public Location getEyeLocation() { @@ -263,7 +259,7 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { } removePotionEffect(effect.getType()); } - getHandle().addEffect(new MobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient())); + getHandle().addEffect(new MobEffect(effect.getType().getId(), effect.getDuration(), effect.getAmplifier(), effect.isAmbient(), true)); return true; } @@ -384,47 +380,6 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { return super.teleport(location, cause); } - public void setCustomName(String name) { - if (!(getHandle() instanceof EntityInsentient)) { - return; - } - - if (name == null) { - name = ""; - } - - // Names cannot be more than 64 characters due to DataWatcher limitations - if (name.length() > 64) { - name = name.substring(0, 64); - } - - ((EntityInsentient) getHandle()).setCustomName(name); - } - - public String getCustomName() { - if (!(getHandle() instanceof EntityInsentient)) { - return null; - } - - String name = ((EntityInsentient) getHandle()).getCustomName(); - - if (name == null || name.length() == 0) { - return null; - } - - return name; - } - - public void setCustomNameVisible(boolean flag) { - if (getHandle() instanceof EntityInsentient) { - ((EntityInsentient) getHandle()).setCustomNameVisible(flag); - } - } - - public boolean isCustomNameVisible() { - return getHandle() instanceof EntityInsentient && ((EntityInsentient) getHandle()).getCustomNameVisible(); - } - public boolean isLeashed() { if (!(getHandle() instanceof EntityInsentient)) { return false; diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java index 925a15f0..efad618f 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java @@ -54,9 +54,7 @@ public class CraftPainting extends CraftHanging implements Painting { private void update() { WorldServer world = ((CraftWorld) getWorld()).getHandle(); EntityPainting painting = new EntityPainting(world); - painting.x = getHandle().x; - painting.y = getHandle().y; - painting.z = getHandle().z; + painting.blockPosition = getHandle().blockPosition; painting.art = getHandle().art; painting.setDirection(getHandle().direction); getHandle().die(); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index bbf310b0..286a58c2 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -1,12 +1,14 @@ package org.bukkit.craftbukkit.entity; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.MapMaker; +import com.mojang.authlib.GameProfile; +import io.netty.buffer.Unpooled; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.LinkedHashMap; @@ -19,7 +21,6 @@ import java.util.logging.Logger; import net.minecraft.server.*; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.apache.commons.lang.Validate; import org.apache.commons.lang.NotImplementedException; import org.bukkit.*; @@ -53,6 +54,7 @@ import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerUnregisterChannelEvent; import org.bukkit.inventory.InventoryView.Property; +import org.bukkit.map.MapCursor; import org.bukkit.map.MapView; import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; @@ -174,44 +176,18 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public String getPlayerListName() { - return getHandle().listName; + return CraftChatMessage.fromComponent(getHandle().listName); } @Override public void setPlayerListName(String name) { - String oldName = getHandle().listName; - if (name == null) { name = getName(); } - - if (oldName.equals(name)) { - return; - } - - if (name.length() > 16) { - throw new IllegalArgumentException("Player list names can only be a maximum of 16 characters long"); - } - - // Collisions will make for invisible people - for (int i = 0; i < server.getHandle().players.size(); ++i) { - if (((EntityPlayer) server.getHandle().players.get(i)).listName.equals(name)) { - throw new IllegalArgumentException(name + " is already assigned as a player list name for someone"); - } - } - - getHandle().listName = name; - - // Change the name on the client side - PacketPlayOutPlayerInfo oldpacket = new PacketPlayOutPlayerInfo(oldName, false, 9999); - PacketPlayOutPlayerInfo packet = new PacketPlayOutPlayerInfo(name, true, getHandle().ping); - for (int i = 0; i < server.getHandle().players.size(); ++i) { - EntityPlayer entityplayer = (EntityPlayer) server.getHandle().players.get(i); - if (entityplayer.playerConnection == null) continue; - - if (entityplayer.getBukkitEntity().canSee(this)) { - entityplayer.playerConnection.sendPacket(oldpacket); - entityplayer.playerConnection.sendPacket(packet); + getHandle().listName = name.equals(getName()) ? null : CraftChatMessage.fromString(name)[0]; + for (EntityPlayer player : (List<EntityPlayer>)server.getHandle().players) { + if (player.getBukkitEntity().canSee(this)) { + player.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.UPDATE_DISPLAY_NAME, getHandle())); } } } @@ -248,7 +224,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; // Do not directly assign here, from the packethandler we'll assign it. - getHandle().playerConnection.sendPacket(new PacketPlayOutSpawnPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + getHandle().playerConnection.sendPacket(new PacketPlayOutSpawnPosition(new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()))); } @Override @@ -343,7 +319,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; int packetData = effect.getId(); - PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), data, false); + PacketPlayOutWorldEvent packet = new PacketPlayOutWorldEvent(packetData, new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), data, false); getHandle().playerConnection.sendPacket(packet); } @@ -368,10 +344,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void sendBlockChange(Location loc, int material, byte data) { if (getHandle().playerConnection == null) return; - PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), ((CraftWorld) loc.getWorld()).getHandle()); + PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld) loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - packet.block = CraftMagicNumbers.getBlock(material); - packet.data = data; + packet.block = CraftMagicNumbers.getBlock(material).fromLegacyData(data); getHandle().playerConnection.sendPacket(packet); } @@ -390,10 +365,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { throw new IllegalArgumentException("Must have at least 4 lines"); } - // Limit to 15 chars per line and set null lines to blank - String[] astring = CraftSign.sanitizeLines(lines); + IChatBaseComponent[] components = CraftSign.sanitizeLines(lines); - getHandle().playerConnection.sendPacket(new PacketPlayOutUpdateSign(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(), astring)); + getHandle().playerConnection.sendPacket(new PacketPlayOutUpdateSign(getHandle().world, new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()), components)); } @Override @@ -435,15 +409,15 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; RenderData data = ((CraftMapView) map).render(this); - for (int x = 0; x < 128; ++x) { - byte[] bytes = new byte[131]; - bytes[1] = (byte) x; - for (int y = 0; y < 128; ++y) { - bytes[y + 3] = data.buffer[y * 128 + x]; + Collection<MapIcon> icons = new ArrayList<MapIcon>(); + for (MapCursor cursor : data.cursors) { + if (cursor.isVisible()) { + icons.add(new MapIcon(cursor.getRawType(), cursor.getX(), cursor.getY(), cursor.getDirection())); } - PacketPlayOutMap packet = new PacketPlayOutMap(map.getId(), bytes); - getHandle().playerConnection.sendPacket(packet); } + + PacketPlayOutMap packet = new PacketPlayOutMap(map.getId(), map.getScale().getValue(), icons, data.buffer, 0, 0, 0, 0); + getHandle().playerConnection.sendPacket(packet); } @Override @@ -455,7 +429,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } if (entity.playerConnection == null || entity.playerConnection.isDisconnected()) { - return false; + return false; } if (entity.passenger != null) { @@ -781,7 +755,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (event.isCancelled()) { return; } - + + getHandle().e((Entity) getHandle()); // RENAME getHandle().playerInteractManager.setGameMode(EnumGamemode.getById(mode.getValue())); getHandle().fallDistance = 0; getHandle().playerConnection.sendPacket(new PacketPlayOutGameStateChange(3, mode.getValue())); @@ -793,90 +768,108 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return GameMode.getByValue(getHandle().playerInteractManager.getGameMode().getId()); } + @Override public void giveExp(int exp) { getHandle().giveExp(exp); } + @Override public void giveExpLevels(int levels) { getHandle().levelDown(levels); } + @Override public float getExp() { return getHandle().exp; } + @Override public void setExp(float exp) { getHandle().exp = exp; getHandle().lastSentExp = -1; } + @Override public int getLevel() { return getHandle().expLevel; } + @Override public void setLevel(int level) { getHandle().expLevel = level; getHandle().lastSentExp = -1; } + @Override public int getTotalExperience() { return getHandle().expTotal; } + @Override public void setTotalExperience(int exp) { getHandle().expTotal = exp; } + @Override public float getExhaustion() { return getHandle().getFoodData().exhaustionLevel; } + @Override public void setExhaustion(float value) { getHandle().getFoodData().exhaustionLevel = value; } + @Override public float getSaturation() { return getHandle().getFoodData().saturationLevel; } + @Override public void setSaturation(float value) { getHandle().getFoodData().saturationLevel = value; } + @Override public int getFoodLevel() { return getHandle().getFoodData().foodLevel; } + @Override public void setFoodLevel(int value) { getHandle().getFoodData().foodLevel = value; } + @Override public Location getBedSpawnLocation() { World world = getServer().getWorld(getHandle().spawnWorld); - ChunkCoordinates bed = getHandle().getBed(); + BlockPosition bed = getHandle().getBed(); if (world != null && bed != null) { bed = EntityHuman.getBed(((CraftWorld) world).getHandle(), bed, getHandle().isRespawnForced()); if (bed != null) { - return new Location(world, bed.x, bed.y, bed.z); + return new Location(world, bed.getX(), bed.getY(), bed.getZ()); } } return null; } + @Override public void setBedSpawnLocation(Location location) { setBedSpawnLocation(location, false); } + @Override public void setBedSpawnLocation(Location location, boolean override) { if (location == null) { getHandle().setRespawnPosition(null, override); } else { - getHandle().setRespawnPosition(new ChunkCoordinates(location.getBlockX(), location.getBlockY(), location.getBlockZ()), override); + getHandle().setRespawnPosition(new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()), override); getHandle().spawnWorld = location.getWorld().getName(); } } + @Override public void hidePlayer(Player player) { Validate.notNull(player, "hidden player cannot be null"); if (getHandle().playerConnection == null) return; @@ -893,9 +886,10 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } //remove the hidden player from this player user list - getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(player.getPlayerListName(), false, 9999)); + getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.REMOVE_PLAYER, other)); } + @Override public void showPlayer(Player player) { Validate.notNull(player, "shown player cannot be null"); if (getHandle().playerConnection == null) return; @@ -910,17 +904,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { entry.updatePlayer(getHandle()); } - getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(player.getPlayerListName(), true, getHandle().ping)); + getHandle().playerConnection.sendPacket(new PacketPlayOutPlayerInfo(EnumPlayerInfoAction.ADD_PLAYER, other)); } public void removeDisconnectingPlayer(Player player) { hiddenPlayers.remove(player.getUniqueId()); } + @Override public boolean canSee(Player player) { return !hiddenPlayers.contains(player.getUniqueId()); } + @Override public Map<String, Object> serialize() { Map<String, Object> result = new LinkedHashMap<String, Object>(); @@ -929,6 +925,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return result; } + @Override public Player getPlayer() { return this; } @@ -955,14 +952,17 @@ public class CraftPlayer extends CraftHumanEntity implements Player { return hash; } + @Override public long getFirstPlayed() { return firstPlayed; } + @Override public long getLastPlayed() { return lastPlayed; } + @Override public boolean hasPlayedBefore() { return hasPlayedBefore; } @@ -1009,36 +1009,43 @@ public class CraftPlayer extends CraftHumanEntity implements Player { data.setString("lastKnownName", handle.getName()); } + @Override public boolean beginConversation(Conversation conversation) { return conversationTracker.beginConversation(conversation); } + @Override public void abandonConversation(Conversation conversation) { conversationTracker.abandonConversation(conversation, new ConversationAbandonedEvent(conversation, new ManuallyAbandonedConversationCanceller())); } + @Override public void abandonConversation(Conversation conversation, ConversationAbandonedEvent details) { conversationTracker.abandonConversation(conversation, details); } + @Override public void acceptConversationInput(String input) { conversationTracker.acceptConversationInput(input); } + @Override public boolean isConversing() { return conversationTracker.isConversing(); } + @Override public void sendPluginMessage(Plugin source, String channel, byte[] message) { StandardMessenger.validatePluginMessage(server.getMessenger(), source, channel, message); if (getHandle().playerConnection == null) return; if (channels.contains(channel)) { - PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(channel, message); + PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(channel, new PacketDataSerializer(Unpooled.wrappedBuffer(message))); getHandle().playerConnection.sendPacket(packet); } } + @Override public void setTexturePack(String url) { setResourcePack(url); } @@ -1047,7 +1054,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void setResourcePack(String url) { Validate.notNull(url, "Resource pack URL cannot be null"); - getHandle().setResourcePack(url); + getHandle().setResourcePack(url, "null"); } public void addChannel(String channel) { @@ -1062,6 +1069,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } + @Override public Set<String> getListeningPluginChannels() { return ImmutableSet.copyOf(channels); } @@ -1082,7 +1090,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } - getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("REGISTER", stream.toByteArray())); + getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("REGISTER", new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray())))); } } @@ -1126,10 +1134,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { perm.clearPermissions(); } + @Override public boolean isFlying() { return getHandle().abilities.isFlying; } + @Override public void setFlying(boolean value) { if (!getAllowFlight() && value) { throw new IllegalArgumentException("Cannot make player fly if getAllowFlight() is false"); @@ -1139,10 +1149,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().updateAbilities(); } + @Override public boolean getAllowFlight() { return getHandle().abilities.canFly; } + @Override public void setAllowFlight(boolean value) { if (isFlying() && !value) { getHandle().abilities.isFlying = false; @@ -1161,6 +1173,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } + @Override public void setFlySpeed(float value) { validateSpeed(value); EntityPlayer player = getHandle(); @@ -1169,6 +1182,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } + @Override public void setWalkSpeed(float value) { validateSpeed(value); EntityPlayer player = getHandle(); @@ -1176,10 +1190,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { player.updateAbilities(); } + @Override public float getFlySpeed() { return getHandle().abilities.flySpeed * 2f; } + @Override public float getWalkSpeed() { return getHandle().abilities.walkSpeed * 2f; } @@ -1209,10 +1225,12 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().triggerHealthUpdate(); } + @Override public CraftScoreboard getScoreboard() { return this.server.getScoreboardManager().getPlayerBoard(this); } + @Override public void setScoreboard(Scoreboard scoreboard) { Validate.notNull(scoreboard, "Scoreboard cannot be null"); PlayerConnection playerConnection = getHandle().playerConnection; @@ -1226,6 +1244,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { this.server.getScoreboardManager().setPlayerBoard(this, scoreboard); } + @Override public void setHealthScale(double value) { Validate.isTrue((float) value > 0F, "Must be greater than 0"); healthScale = value; @@ -1233,16 +1252,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { updateScaledHealth(); } + @Override public double getHealthScale() { return healthScale; } + @Override public void setHealthScaled(boolean scale) { if (scaledHealth != (scaledHealth = scale)) { updateScaledHealth(); } } + @Override public boolean isHealthScaled() { return scaledHealth; } @@ -1285,6 +1307,6 @@ public class CraftPlayer extends CraftHumanEntity implements Player { break; } } - collection.add(new AttributeModifiable(getHandle().getAttributeMap(), (new AttributeRanged("generic.maxHealth", scaledHealth ? healthScale : getMaxHealth(), 0.0D, Float.MAX_VALUE)).a("Max Health").a(true))); + collection.add(new AttributeModifiable(getHandle().getAttributeMap(), (new AttributeRanged(null, "generic.maxHealth", scaledHealth ? healthScale : getMaxHealth(), 0.0D, Float.MAX_VALUE)).a("Max Health").a(true))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java new file mode 100644 index 00000000..62fc7ef2 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityRabbit; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Rabbit; + +public class CraftRabbit extends CraftAnimals implements Rabbit { + + public CraftRabbit(CraftServer server, EntityRabbit entity) { + super(server, entity); + } + + @Override + public String toString() { + return "CraftRabbit"; + } + + @Override + public EntityType getType() { + return EntityType.RABBIT; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java index 81b938a2..f7253554 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSheep.java @@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntitySheep; +import net.minecraft.server.EnumColor; import org.bukkit.DyeColor; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; @@ -13,11 +14,11 @@ public class CraftSheep extends CraftAnimals implements Sheep { } public DyeColor getColor() { - return DyeColor.getByWoolData((byte) getHandle().getColor()); + return DyeColor.getByWoolData((byte) getHandle().getColor().getColorIndex()); } public void setColor(DyeColor color) { - getHandle().setColor(color.getWoolData()); + getHandle().setColor(EnumColor.fromColorIndex(color.getWoolData())); } public boolean isSheared() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java index d4bf3a0e..ea1d10b3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTameableAnimal.java @@ -54,7 +54,7 @@ public class CraftTameableAnimal extends CraftAnimals implements Tameable, Creat public void setOwner(AnimalTamer tamer) { if (tamer != null) { setTamed(true); - getHandle().setPathEntity(null); + getHandle().setGoalTarget(null, null, false); setOwnerUUID(tamer.getUniqueId()); } else { setTamed(false); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java index 398029b9..6fe21cce 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -3,10 +3,13 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityVillager; import org.apache.commons.lang.Validate; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; -public class CraftVillager extends CraftAgeable implements Villager { +public class CraftVillager extends CraftAgeable implements Villager, InventoryHolder { public CraftVillager(CraftServer server, EntityVillager entity) { super(server, entity); } @@ -33,4 +36,9 @@ public class CraftVillager extends CraftAgeable implements Villager { Validate.notNull(profession); getHandle().setProfession(profession.getId()); } + + @Override + public Inventory getInventory() { + return new CraftInventory(getHandle().inventory); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java index 39e8d89b..ee21d7b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWaterMob.java @@ -3,9 +3,10 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityWaterAnimal; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.WaterMob; -public class CraftWaterMob extends CraftCreature implements WaterMob { +public class CraftWaterMob extends CraftLivingEntity implements WaterMob { public CraftWaterMob(CraftServer server, EntityWaterAnimal entity) { super(server, entity); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java index 3d0e7cb5..55ce37c7 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftWolf.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityWolf; +import net.minecraft.server.EnumColor; import org.bukkit.DyeColor; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.EntityType; @@ -30,10 +31,10 @@ public class CraftWolf extends CraftTameableAnimal implements Wolf { } public DyeColor getCollarColor() { - return DyeColor.getByWoolData((byte) getHandle().getCollarColor()); + return DyeColor.getByWoolData((byte) getHandle().getCollarColor().getColorIndex()); } public void setCollarColor(DyeColor color) { - getHandle().setCollarColor(color.getWoolData()); + getHandle().setCollarColor(EnumColor.fromColorIndex(color.getWoolData())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 9b10c418..cc1d3718 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -9,30 +9,7 @@ import java.util.Map; import com.google.common.base.Function; import com.google.common.base.Functions; -import net.minecraft.server.ChunkCoordinates; -import net.minecraft.server.Container; -import net.minecraft.server.DamageSource; -import net.minecraft.server.Entity; -import net.minecraft.server.EntityArrow; -import net.minecraft.server.EntityDamageSource; -import net.minecraft.server.EntityDamageSourceIndirect; -import net.minecraft.server.EntityEnderCrystal; -import net.minecraft.server.EntityEnderDragon; -import net.minecraft.server.EntityHuman; -import net.minecraft.server.EntityInsentient; -import net.minecraft.server.EntityItem; -import net.minecraft.server.EntityLiving; -import net.minecraft.server.EntityPlayer; -import net.minecraft.server.EntityPotion; -import net.minecraft.server.Explosion; -import net.minecraft.server.InventoryCrafting; -import net.minecraft.server.ItemStack; -import net.minecraft.server.Items; -import net.minecraft.server.PacketPlayInCloseWindow; -import net.minecraft.server.PacketPlayOutSetSlot; -import net.minecraft.server.Slot; -import net.minecraft.server.World; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -97,9 +74,9 @@ public class CraftEventFactory { if (((CraftServer) Bukkit.getServer()).getHandle().getOPs().isEmpty()) return true; if (player.isOp()) return true; - ChunkCoordinates chunkcoordinates = worldServer.getSpawn(); + BlockPosition chunkcoordinates = worldServer.getSpawn(); - int distanceFromSpawn = Math.max(Math.abs(x - chunkcoordinates.x), Math.abs(z - chunkcoordinates.z)); + int distanceFromSpawn = Math.max(Math.abs(x - chunkcoordinates.getX()), Math.abs(z - chunkcoordinates.getY())); return distanceFromSpawn > spawnSize; } @@ -152,15 +129,15 @@ public class CraftEventFactory { /** * Bucket methods */ - public static PlayerBucketEmptyEvent callPlayerBucketEmptyEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand) { + public static PlayerBucketEmptyEvent callPlayerBucketEmptyEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, EnumDirection clickedFace, ItemStack itemInHand) { return (PlayerBucketEmptyEvent) getPlayerBucketEvent(false, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, Items.BUCKET); } - public static PlayerBucketFillEvent callPlayerBucketFillEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemInHand, net.minecraft.server.Item bucket) { + public static PlayerBucketFillEvent callPlayerBucketFillEvent(EntityHuman who, int clickedX, int clickedY, int clickedZ, EnumDirection clickedFace, ItemStack itemInHand, net.minecraft.server.Item bucket) { return (PlayerBucketFillEvent) getPlayerBucketEvent(true, who, clickedX, clickedY, clickedZ, clickedFace, itemInHand, bucket); } - private static PlayerEvent getPlayerBucketEvent(boolean isFilling, EntityHuman who, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack, net.minecraft.server.Item item) { + private static PlayerEvent getPlayerBucketEvent(boolean isFilling, EntityHuman who, int clickedX, int clickedY, int clickedZ, EnumDirection clickedFace, ItemStack itemstack, net.minecraft.server.Item item) { Player player = (who == null) ? null : (Player) who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asNewCraftStack(item); Material bucket = CraftMagicNumbers.getMaterial(itemstack.getItem()); @@ -192,20 +169,24 @@ public class CraftEventFactory { if (action != Action.LEFT_CLICK_AIR && action != Action.RIGHT_CLICK_AIR) { throw new AssertionError(String.format("%s performing %s with %s", who, action, itemstack)); } - return callPlayerInteractEvent(who, action, 0, 256, 0, 0, itemstack); + return callPlayerInteractEvent(who, action, new BlockPosition(0, 256, 0), EnumDirection.SOUTH, itemstack); } - public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, int clickedX, int clickedY, int clickedZ, int clickedFace, ItemStack itemstack) { + public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, BlockPosition position, EnumDirection direction, ItemStack itemstack) { + return callPlayerInteractEvent(who, action, position, direction, itemstack, false); + } + + public static PlayerInteractEvent callPlayerInteractEvent(EntityHuman who, Action action, BlockPosition position, EnumDirection direction, ItemStack itemstack, boolean cancelledBlock) { Player player = (who == null) ? null : (Player) who.getBukkitEntity(); CraftItemStack itemInHand = CraftItemStack.asCraftMirror(itemstack); CraftWorld craftWorld = (CraftWorld) player.getWorld(); CraftServer craftServer = (CraftServer) player.getServer(); - Block blockClicked = craftWorld.getBlockAt(clickedX, clickedY, clickedZ); - BlockFace blockFace = CraftBlock.notchToBlockFace(clickedFace); + Block blockClicked = craftWorld.getBlockAt(position.getX(), position.getY(), position.getZ()); + BlockFace blockFace = CraftBlock.notchToBlockFace(direction); - if (clickedY > 255) { + if (position.getY() > 255) { blockClicked = null; switch (action) { case LEFT_CLICK_BLOCK: @@ -222,6 +203,9 @@ public class CraftEventFactory { } PlayerInteractEvent event = new PlayerInteractEvent(player, action, itemInHand, blockClicked, blockFace); + if (cancelledBlock) { + event.setUseInteractedBlock(Event.Result.DENY); + } craftServer.getPluginManager().callEvent(event); return event; @@ -415,7 +399,7 @@ public class CraftEventFactory { EntityDamageEvent event; if (damager == null) { event = new EntityDamageByBlockEvent(null, entity.getBukkitEntity(), DamageCause.BLOCK_EXPLOSION, modifiers, modifierFunctions); - } else if (entity instanceof EntityEnderDragon && ((EntityEnderDragon) entity).bC == damager) { + } else if (entity instanceof EntityEnderDragon && ((EntityEnderDragon) entity).bx == damager) { event = new EntityDamageEvent(entity.getBukkitEntity(), DamageCause.ENTITY_EXPLOSION, modifiers, modifierFunctions); } else { if (damager instanceof org.bukkit.entity.TNTPrimed) { @@ -840,7 +824,7 @@ public class CraftEventFactory { ItemStack itemInHand = player.inventory.getItem(itemInHandIndex); // If they've got the same item in their hand, it'll need to be updated. - if (itemInHand != null && itemInHand.getItem() == Items.BOOK_AND_QUILL) { + if (itemInHand != null && itemInHand.getItem() == Items.WRITABLE_BOOK) { if (!editBookEvent.isCancelled()) { CraftItemStack.setItemMeta(itemInHand, editBookEvent.getNewBookMeta()); if (editBookEvent.isSigning()) { @@ -876,6 +860,10 @@ public class CraftEventFactory { event = new PlayerAchievementAwardedEvent(player, CraftStatistic.getBukkitAchievement((net.minecraft.server.Achievement) statistic)); } else { org.bukkit.Statistic stat = CraftStatistic.getBukkitStatistic(statistic); + if (stat == null) { + System.err.println("Unhandled statistic: " + statistic); + return null; + } switch (stat) { case FALL_ONE_CM: case BOAT_ONE_CM: @@ -888,6 +876,9 @@ public class CraftEventFactory { case PLAY_ONE_TICK: case SWIM_ONE_CM: case WALK_ONE_CM: + case SPRINT_ONE_CM: + case CROUCH_ONE_CM: + case TIME_SINCE_DEATH: // Do not process event for these - too spammy return null; default: diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java index 9a46d0c7..d47755a0 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -3,16 +3,7 @@ package org.bukkit.craftbukkit.generator; import java.util.List; import java.util.Random; -import net.minecraft.server.BiomeBase; -import net.minecraft.server.Chunk; -import net.minecraft.server.ChunkPosition; -import net.minecraft.server.ChunkSection; -import net.minecraft.server.EnumCreatureType; -import net.minecraft.server.IChunkProvider; -import net.minecraft.server.IProgressUpdate; -import net.minecraft.server.World; -import net.minecraft.server.WorldGenStronghold; -import net.minecraft.server.WorldServer; +import net.minecraft.server.*; import org.bukkit.block.Biome; import org.bukkit.generator.BlockPopulator; @@ -71,27 +62,14 @@ public class CustomChunkGenerator extends InternalChunkGenerator { if (xbtypes[sec] == null) { continue; } - byte[] secBlkID = new byte[4096]; // Allocate blk ID bytes - byte[] secExtBlkID = null; // Delay getting extended ID nibbles + char[] secBlkID = new char[4096]; // Allocate blk ID bytes short[] bdata = xbtypes[sec]; // Loop through data, 2 blocks at a time - for (int i = 0, j = 0; i < bdata.length; i += 2, j++) { - short b1 = bdata[i]; - short b2 = bdata[i + 1]; - byte extb = (byte) ((b1 >> 8) | ((b2 >> 4) & 0xF0)); - - secBlkID[i] = (byte) b1; - secBlkID[(i + 1)] = (byte) b2; - - if (extb != 0) { // If extended block ID data - if (secExtBlkID == null) { // Allocate if needed - secExtBlkID = new byte[2048]; - } - secExtBlkID[j] = extb; - } + for (int i = 0; i < bdata.length; i++) { + secBlkID[i] = (char) ((int)bdata[i] << 4); } // Build chunk section - csect[sec] = new ChunkSection(sec << 4, true, secBlkID, secExtBlkID); + csect[sec] = new ChunkSection(sec << 4, true, secBlkID); } } else { // Else check for byte-per-block section data @@ -107,7 +85,12 @@ public class CustomChunkGenerator extends InternalChunkGenerator { if (btypes[sec] == null) { continue; } - csect[sec] = new ChunkSection(sec << 4, true, btypes[sec], null); + + char[] secBlkID = new char[4096]; // Allocate block ID bytes + for (int i = 0; i < secBlkID.length; i++) { + secBlkID[i] = (char)(((int) btypes[sec][i]) << 4); + } + csect[sec] = new ChunkSection(sec << 4, true, secBlkID); } } else { // Else, fall back to pre 1.2 method @@ -124,7 +107,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { // Loop through sections for (int sec = 0; sec < scnt; sec++) { ChunkSection cs = null; // Add sections when needed - byte[] csbytes = null; + char[] csbytes = null; for (int cy = 0; cy < 16; cy++) { int cyoff = cy | (sec << 4); @@ -140,7 +123,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { cs = csect[sec] = new ChunkSection(sec << 4, true); csbytes = cs.getIdArray(); } - csbytes[(cy << 8) | (cz << 4) | cx] = blk; + csbytes[(cy << 8) | (cz << 4) | cx] = (char)((int)blk << 4); } } } @@ -153,7 +136,7 @@ public class CustomChunkGenerator extends InternalChunkGenerator { } } // Set biome grid - byte[] biomeIndex = chunk.m(); + byte[] biomeIndex = chunk.getBiomeIndex(); for (int i = 0; i < biomeIndex.length; i++) { biomeIndex[i] = (byte) (biomegrid.biome[i].id & 0xFF); } @@ -163,10 +146,20 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return chunk; } + @Override + public Chunk getChunkAt(BlockPosition blockPosition) { + return getChunkAt(blockPosition.getX() >> 4, blockPosition.getZ() >> 4); + } + public void getChunkAt(IChunkProvider icp, int i, int i1) { // Nothing! } + @Override + public boolean a(IChunkProvider iChunkProvider, Chunk chunk, int i, int i1) { + return false; + } + public boolean saveChunks(boolean bln, IProgressUpdate ipu) { return true; } @@ -206,14 +199,16 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return generator.getDefaultPopulators(world); } - public List<?> getMobsFor(EnumCreatureType type, int x, int y, int z) { - BiomeBase biomebase = world.getBiome(x, z); + @Override + public List<?> getMobsFor(EnumCreatureType type, BlockPosition position) { + BiomeBase biomebase = world.getBiome(position); return biomebase == null ? null : biomebase.getMobs(type); } - public ChunkPosition findNearestMapFeature(World world, String type, int x, int y, int z) { - return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, x, y, z) : null; + @Override + public BlockPosition findNearestMapFeature(World world, String type, BlockPosition position) { + return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, position) : null; } public void recreateStructures(int i, int j) {} @@ -222,6 +217,11 @@ public class CustomChunkGenerator extends InternalChunkGenerator { return 0; } + @Override + public void recreateStructures(Chunk chunk, int i, int i1) { + + } + public String getName() { return "CustomChunkGenerator"; } diff --git a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java index ceab5816..4230bdb2 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java @@ -4,12 +4,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; -import net.minecraft.server.Chunk; -import net.minecraft.server.ChunkPosition; -import net.minecraft.server.EnumCreatureType; -import net.minecraft.server.IChunkProvider; -import net.minecraft.server.IProgressUpdate; -import net.minecraft.server.World; +import net.minecraft.server.*; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.generator.BlockPopulator; @@ -21,66 +16,87 @@ public class NormalChunkGenerator extends InternalChunkGenerator { provider = world.worldProvider.getChunkProvider(); } + @Override public byte[] generate(org.bukkit.World world, Random random, int x, int z) { throw new UnsupportedOperationException("Not supported."); } + @Override public boolean canSpawn(org.bukkit.World world, int x, int z) { return ((CraftWorld) world).getHandle().worldProvider.canSpawn(x, z); } + @Override public List<BlockPopulator> getDefaultPopulators(org.bukkit.World world) { return new ArrayList<BlockPopulator>(); } + @Override public boolean isChunkLoaded(int i, int i1) { return provider.isChunkLoaded(i, i1); } + @Override public Chunk getOrCreateChunk(int i, int i1) { return provider.getOrCreateChunk(i, i1); } - public Chunk getChunkAt(int i, int i1) { - return provider.getChunkAt(i, i1); + @Override + public Chunk getChunkAt(BlockPosition blockPosition) { + return provider.getChunkAt(blockPosition); } + @Override public void getChunkAt(IChunkProvider icp, int i, int i1) { provider.getChunkAt(icp, i, i1); } + @Override + public boolean a(IChunkProvider iChunkProvider, Chunk chunk, int i, int i1) { + return provider.a(provider, chunk, i, i1); + } + + @Override public boolean saveChunks(boolean bln, IProgressUpdate ipu) { return provider.saveChunks(bln, ipu); } + @Override public boolean unloadChunks() { return provider.unloadChunks(); } + @Override public boolean canSave() { return provider.canSave(); } - public List<?> getMobsFor(EnumCreatureType ect, int i, int i1, int i2) { - return provider.getMobsFor(ect, i, i1, i2); - } - - public ChunkPosition findNearestMapFeature(World world, String string, int i, int i1, int i2) { - return provider.findNearestMapFeature(world, string, i, i1, i2); + @Override + public List<?> getMobsFor(EnumCreatureType ect, BlockPosition position) { + return provider.getMobsFor(ect, position); } - public void recreateStructures(int i, int j) { - provider.recreateStructures(i, j); + @Override + public BlockPosition findNearestMapFeature(World world, String string, BlockPosition position) { + return provider.findNearestMapFeature(world, string, position); } // n.m.s implementations always return 0. (The true implementation is in ChunkProviderServer) + @Override public int getLoadedChunks() { return 0; } + @Override + public void recreateStructures(Chunk chunk, int i, int i1) { + provider.recreateStructures(chunk, i, i1); + } + + @Override public String getName() { return "NormalWorldGenerator"; } + @Override public void c() {} } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java index 42568a24..1dbc588e 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftContainer.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.inventory; +import net.minecraft.server.ChatComponentText; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryType; @@ -76,7 +77,7 @@ public class CraftContainer extends Container { cachedTitle = view.getTitle(); if (view.getPlayer() instanceof CraftPlayer) { CraftPlayer player = (CraftPlayer) view.getPlayer(); - int type = getNotchInventoryType(cachedType); + String type = getNotchInventoryType(cachedType); IInventory top = ((CraftInventory)view.getTopInventory()).getInventory(); IInventory bottom = ((CraftInventory)view.getBottomInventory()).getInventory(); this.b.clear(); @@ -85,44 +86,33 @@ public class CraftContainer extends Container { setupSlots(top, bottom); } int size = getSize(); - player.getHandle().playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.windowId, type, cachedTitle, size, true)); + player.getHandle().playerConnection.sendPacket(new PacketPlayOutOpenWindow(this.windowId, type, new ChatComponentText(cachedTitle), size)); player.updateInventory(); } return true; } - public static int getNotchInventoryType(InventoryType type) { - int typeID; + public static String getNotchInventoryType(InventoryType type) { switch(type) { case WORKBENCH: - typeID = 1; - break; + return "minecraft:crafting_table"; case FURNACE: - typeID = 2; - break; + return "minecraft:furnace"; case DISPENSER: - typeID = 3; - break; + return "minecraft:dispenser"; case ENCHANTING: - typeID = 4; - break; + return "minecraft:enchanting_table"; case BREWING: - typeID = 5; - break; + return "minecraft:brewing_stand"; case BEACON: - typeID = 7; - break; + return "minecraft:beacon"; case ANVIL: - typeID = 8; - break; + return "minecraft:anvil"; case HOPPER: - typeID = 9; - break; + return "minecraft:hopper"; default: - typeID = 0; - break; + return "minecraft:chest"; } - return typeID; } private void setupSlots(IInventory top, IInventory bottom) { diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java index 6748465d..7ae6f12c 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java @@ -42,7 +42,7 @@ public class CraftInventory implements Inventory { } public String getName() { - return getInventory().getInventoryName(); + return getInventory().getName(); } public ItemStack getItem(int index) { @@ -58,7 +58,6 @@ public class CraftInventory implements Inventory { for (int i = 0; i < size; i++) { items[i] = mcItems[i] == null ? null : CraftItemStack.asCraftMirror(mcItems[i]); } - return items; } @@ -421,7 +420,7 @@ public class CraftInventory implements Inventory { } public String getTitle() { - return inventory.getInventoryName(); + return inventory.getName(); } public InventoryType getType() { @@ -437,7 +436,7 @@ public class CraftInventory implements Inventory { } else if (inventory instanceof TileEntityFurnace) { return InventoryType.FURNACE; } else if (inventory instanceof ContainerEnchantTableInventory) { - return InventoryType.ENCHANTING; + return InventoryType.ENCHANTING; } else if (inventory instanceof TileEntityBrewingStand) { return InventoryType.BREWING; } else if (inventory instanceof CraftInventoryCustom.MinecraftInventory) { @@ -449,7 +448,7 @@ public class CraftInventory implements Inventory { } else if (inventory instanceof TileEntityBeacon) { return InventoryType.BEACON; } else if (inventory instanceof ContainerAnvilInventory) { - return InventoryType.ANVIL; + return InventoryType.ANVIL; } else if (inventory instanceof IHopper) { return InventoryType.HOPPER; } else { diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java index 7bbf1df5..e155329e 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java @@ -55,7 +55,7 @@ public class CraftInventoryCrafting extends CraftInventory implements CraftingIn for (int j = 0; j < mcItems.length; j++) { items[i + j] = CraftItemStack.asCraftMirror(mcItems[j]); } - + return items; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java index 8b8a317c..947c4939 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java @@ -2,7 +2,9 @@ package org.bukkit.craftbukkit.inventory; import java.util.ArrayList; import java.util.List; +import net.minecraft.server.ChatComponentText; +import net.minecraft.server.IChatBaseComponent; import org.apache.commons.lang.Validate; import org.bukkit.craftbukkit.entity.CraftHumanEntity; import org.bukkit.entity.HumanEntity; @@ -106,10 +108,6 @@ public class CraftInventoryCustom extends CraftInventory { } } - public String getInventoryName() { - return title; - } - public int getMaxStackSize() { return maxStack; } @@ -143,21 +141,58 @@ public class CraftInventoryCustom extends CraftInventory { public InventoryType getType() { return type; } - - public void closeContainer() {} - + public InventoryHolder getOwner() { return owner; } - public void startOpen() {} + public boolean b(int i, ItemStack itemstack) { + return true; + } + + @Override + public void startOpen(EntityHuman entityHuman) { - public boolean k_() { - return false; } - public boolean b(int i, ItemStack itemstack) { - return true; + @Override + public void closeContainer(EntityHuman entityHuman) { + + } + + @Override + public int getProperty(int i) { + return 0; + } + + @Override + public void b(int i, int i1) { + + } + + @Override + public int g() { + return 0; + } + + @Override + public void l() { + + } + + @Override + public String getName() { + return title; + } + + @Override + public boolean hasCustomName() { + return title != null; + } + + @Override + public IChatBaseComponent getScoreboardDisplayName() { + return new ChatComponentText(title); } } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java index 0459f41f..87252cad 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java @@ -1,5 +1,7 @@ package org.bukkit.craftbukkit.inventory; +import net.minecraft.server.ITileEntityContainer; +import net.minecraft.server.ITileInventory; import org.bukkit.block.DoubleChest; import org.bukkit.inventory.DoubleChestInventory; import org.bukkit.inventory.Inventory; @@ -12,7 +14,7 @@ public class CraftInventoryDoubleChest extends CraftInventory implements DoubleC private final CraftInventory right; public CraftInventoryDoubleChest(CraftInventory left, CraftInventory right) { - super(new InventoryLargeChest("Large chest", left.getInventory(), right.getInventory())); + super(new InventoryLargeChest("Large chest", (ITileInventory) left.getInventory(), (ITileInventory) right.getInventory())); this.left = left; this.right = right; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java index fdc58f16..068881d2 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryEnchanting.java @@ -10,10 +10,12 @@ public class CraftInventoryEnchanting extends CraftInventory implements Enchanti super(inventory); } + @Override public void setItem(ItemStack item) { setItem(0,item); } + @Override public ItemStack getItem() { return getItem(0); } @@ -22,4 +24,14 @@ public class CraftInventoryEnchanting extends CraftInventory implements Enchanti public ContainerEnchantTableInventory getInventory() { return (ContainerEnchantTableInventory)inventory; } + + @Override + public void setSecondary(ItemStack item) { + setItem(1, item); + } + + @Override + public ItemStack getSecondary() { + return getItem(1); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java index 1b2394de..8dd889de 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java @@ -81,6 +81,8 @@ public final class CraftItemFactory implements ItemFactory { return meta instanceof CraftMetaCharge ? meta : new CraftMetaCharge(meta); case ENCHANTED_BOOK: return meta instanceof CraftMetaEnchantedBook ? meta : new CraftMetaEnchantedBook(meta); + case BANNER: + return meta instanceof CraftMetaBanner ? meta : new CraftMetaBanner(meta); default: return new CraftMetaItem(meta); } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java index 704be690..b49c2dca 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -185,7 +185,7 @@ public final class CraftItemStack extends ItemStack { NBTTagList list = getEnchantmentList(handle); if (list == null) { list = new NBTTagList(); - handle.tag.set(ENCHANTMENTS.NBT, list); + handle.getTag().set(ENCHANTMENTS.NBT, list); } int size = list.size(); @@ -208,7 +208,7 @@ public final class CraftItemStack extends ItemStack { return false; } - if (item.tag == null) { + if (item.getTag() == null) { item.setTag(new NBTTagCompound()); } @@ -255,9 +255,9 @@ public final class CraftItemStack extends ItemStack { return 0; } if (size == 1) { - handle.tag.remove(ENCHANTMENTS.NBT); - if (handle.tag.isEmpty()) { - handle.tag = null; + handle.getTag().remove(ENCHANTMENTS.NBT); + if (handle.getTag().isEmpty()) { + handle.setTag(null); } return level; } @@ -269,7 +269,7 @@ public final class CraftItemStack extends ItemStack { listCopy.add(list.get(i)); } } - handle.tag.set(ENCHANTMENTS.NBT, listCopy); + handle.getTag().set(ENCHANTMENTS.NBT, listCopy); return level; } @@ -323,26 +323,28 @@ public final class CraftItemStack extends ItemStack { switch (getType(item)) { case WRITTEN_BOOK: case BOOK_AND_QUILL: - return new CraftMetaBook(item.tag); + return new CraftMetaBook(item.getTag()); case SKULL_ITEM: - return new CraftMetaSkull(item.tag); + return new CraftMetaSkull(item.getTag()); case LEATHER_HELMET: case LEATHER_CHESTPLATE: case LEATHER_LEGGINGS: case LEATHER_BOOTS: - return new CraftMetaLeatherArmor(item.tag); + return new CraftMetaLeatherArmor(item.getTag()); case POTION: - return new CraftMetaPotion(item.tag); + return new CraftMetaPotion(item.getTag()); case MAP: - return new CraftMetaMap(item.tag); + return new CraftMetaMap(item.getTag()); case FIREWORK: - return new CraftMetaFirework(item.tag); + return new CraftMetaFirework(item.getTag()); case FIREWORK_CHARGE: - return new CraftMetaCharge(item.tag); + return new CraftMetaCharge(item.getTag()); case ENCHANTED_BOOK: - return new CraftMetaEnchantedBook(item.tag); + return new CraftMetaEnchantedBook(item.getTag()); + case BANNER: + return new CraftMetaBanner(item.getTag()); default: - return new CraftMetaItem(item.tag); + return new CraftMetaItem(item.getTag()); } } @@ -361,7 +363,7 @@ public final class CraftItemStack extends ItemStack { return false; } if (CraftItemFactory.instance().equals(itemMeta, null)) { - item.tag = null; + item.setTag(null); return true; } if (!CraftItemFactory.instance().isApplicable(itemMeta, getType(item))) { @@ -397,7 +399,7 @@ public final class CraftItemStack extends ItemStack { if (!(that.getTypeId() == getTypeId() && getDurability() == that.getDurability())) { return false; } - return hasItemMeta() ? that.hasItemMeta() && handle.tag.equals(that.handle.tag) : !that.hasItemMeta(); + return hasItemMeta() ? that.hasItemMeta() && handle.getTag().equals(that.handle.getTag()) : !that.hasItemMeta(); } @Override @@ -406,6 +408,6 @@ public final class CraftItemStack extends ItemStack { } static boolean hasItemMeta(net.minecraft.server.ItemStack item) { - return !(item == null || item.tag == null || item.tag.isEmpty()); + return !(item == null || item.getTag() == null || item.getTag().isEmpty()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java new file mode 100644 index 00000000..d61615bf --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java @@ -0,0 +1,196 @@ +package org.bukkit.craftbukkit.inventory; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.NBTTagList; +import org.bukkit.DyeColor; +import org.bukkit.Material; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; +import org.bukkit.configuration.serialization.DelegateDeserialization; +import org.bukkit.inventory.meta.BannerMeta; + +@DelegateDeserialization(CraftMetaItem.SerializableMeta.class) +public class CraftMetaBanner extends CraftMetaItem implements BannerMeta { + + static final ItemMetaKey BASE = new ItemMetaKey("Base", "base-color"); + static final ItemMetaKey PATTERNS = new ItemMetaKey("Patterns", "patterns"); + static final ItemMetaKey COLOR = new ItemMetaKey("Color", "color"); + static final ItemMetaKey PATTERN = new ItemMetaKey("Pattern", "pattern"); + + private DyeColor base; + private List<Pattern> patterns = new ArrayList<Pattern>(); + + CraftMetaBanner(CraftMetaItem meta) { + super(meta); + + if (!(meta instanceof CraftMetaBanner)) { + return; + } + + CraftMetaBanner banner = (CraftMetaBanner) meta; + base = banner.base; + patterns = new ArrayList<Pattern>(banner.patterns); + } + + CraftMetaBanner(NBTTagCompound tag) { + super(tag); + + if (!tag.hasKey("BlockEntityTag")) { + return; + } + + NBTTagCompound entityTag = tag.getCompound("BlockEntityTag"); + + base = entityTag.hasKey(BASE.NBT) ? DyeColor.getByDyeData((byte) entityTag.getInt(BASE.NBT)) : null; + + if (entityTag.hasKey(PATTERNS.NBT)) { + NBTTagList patterns = entityTag.getList(PATTERNS.NBT, 10); + for (int i = 0; i < patterns.size(); i++) { + NBTTagCompound p = (NBTTagCompound) patterns.get(i); + this.patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt(COLOR.NBT)), PatternType.getByIdentifier(p.getString(PATTERN.NBT)))); + } + } + } + + CraftMetaBanner(Map<String, Object> map) { + super(map); + + base = SerializableMeta.getObject(DyeColor.class, map, BASE.BUKKIT, true); + + Iterable<?> rawPatternList = SerializableMeta.getObject(Iterable.class, map, PATTERNS.BUKKIT, true); + if (rawPatternList == null) { + return; + } + + for (Object obj : rawPatternList) { + if (!(obj instanceof Pattern)) { + throw new IllegalArgumentException("Object in pattern list is not valid. " + obj.getClass()); + } + addPattern((Pattern) obj); + } + } + @Override + void applyToItem(NBTTagCompound tag) { + super.applyToItem(tag); + + NBTTagCompound entityTag = new NBTTagCompound(); + if (base != null) { + entityTag.setInt(BASE.NBT, base.getDyeData()); + } + + NBTTagList newPatterns = new NBTTagList(); + + for (Pattern p : patterns) { + NBTTagCompound compound = new NBTTagCompound(); + compound.setInt(COLOR.NBT, p.getColor().getDyeData()); + compound.setString(PATTERN.NBT, p.getPattern().getIdentifier()); + newPatterns.add(compound); + } + entityTag.set(PATTERNS.NBT, newPatterns); + + tag.set("BlockEntityTag", entityTag); + } + + @Override + public DyeColor getBaseColor() { + return base; + } + + @Override + public void setBaseColor(DyeColor color) { + base = color; + } + + @Override + public List<Pattern> getPatterns() { + return new ArrayList<Pattern>(patterns); + } + + @Override + public void setPatterns(List<Pattern> patterns) { + this.patterns = new ArrayList<Pattern>(patterns); + } + + @Override + public void addPattern(Pattern pattern) { + patterns.add(pattern); + } + + @Override + public Pattern getPattern(int i) { + return patterns.get(i); + } + + @Override + public Pattern removePattern(int i) { + return patterns.remove(i); + } + + @Override + public void setPattern(int i, Pattern pattern) { + patterns.set(i, pattern); + } + + @Override + public int numberOfPatterns() { + return patterns.size(); + } + + @Override + ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) { + super.serialize(builder); + + builder.put(BASE.BUKKIT, base); + builder.put(PATTERNS.BUKKIT, ImmutableList.copyOf(patterns)); + + return builder; + } + + @Override + int applyHash() { + final int original; + int hash = original = super.applyHash(); + if (base != null) { + hash = 31 * hash + base.hashCode(); + } + if (!patterns.isEmpty()) { + hash = 31 * hash + patterns.hashCode(); + } + return original != hash ? CraftMetaBanner.class.hashCode() ^ hash : hash; + } + + @Override + public boolean equalsCommon(CraftMetaItem meta) { + if (!super.equalsCommon(meta)) { + return false; + } + if (meta instanceof CraftMetaBanner) { + CraftMetaBanner that = (CraftMetaBanner) meta; + + return base == that.base && patterns.equals(that.patterns); + } + return true; + } + + @Override + boolean notUncommon(CraftMetaItem meta) { + return super.notUncommon(meta) && (meta instanceof CraftMetaBanner || (patterns.isEmpty() && base == null)); + } + + + @Override + boolean isEmpty() { + return super.isEmpty() && patterns.isEmpty() && base == null; + } + + + @Override + boolean applicableTo(Material type) { + return type == Material.BANNER; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java index 1cf8fce4..9a24d2e7 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java @@ -16,18 +16,25 @@ import org.bukkit.inventory.meta.BookMeta; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap.Builder; +import net.minecraft.server.ChatSerializer; +import net.minecraft.server.NBTTagString; +import org.bukkit.craftbukkit.util.CraftChatMessage; @DelegateDeserialization(SerializableMeta.class) class CraftMetaBook extends CraftMetaItem implements BookMeta { static final ItemMetaKey BOOK_TITLE = new ItemMetaKey("title"); static final ItemMetaKey BOOK_AUTHOR = new ItemMetaKey("author"); static final ItemMetaKey BOOK_PAGES = new ItemMetaKey("pages"); + static final ItemMetaKey RESOLVED = new ItemMetaKey("resolved"); + static final ItemMetaKey GENERATION = new ItemMetaKey("generation"); static final int MAX_PAGE_LENGTH = 256; static final int MAX_TITLE_LENGTH = 0xffff; private String title; private String author; private List<String> pages = new ArrayList<String>(); + private Boolean resolved; + private Integer generation; CraftMetaBook(CraftMetaItem meta) { super(meta); @@ -39,6 +46,8 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { this.title = bookMeta.title; this.author = bookMeta.author; pages.addAll(bookMeta.pages); + this.resolved = bookMeta.resolved; + this.generation = bookMeta.generation; } CraftMetaBook(NBTTagCompound tag) { @@ -51,6 +60,14 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { if (tag.hasKey(BOOK_AUTHOR.NBT)) { this.author = tag.getString(BOOK_AUTHOR.NBT); } + + if (tag.hasKey(RESOLVED.NBT)) { + resolved = tag.getBoolean(RESOLVED.NBT); + } + + if (tag.hasKey(GENERATION.NBT)) { + generation = tag.getInt(GENERATION.NBT); + } if (tag.hasKey(BOOK_PAGES.NBT)) { NBTTagList pages = tag.getList(BOOK_PAGES.NBT, 8); @@ -58,6 +75,9 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { for (int i = 0; i < pages.size(); i++) { String page = pages.getString(i); + if (resolved != null && resolved) { + page = CraftChatMessage.fromComponent(ChatSerializer.a(page)); + } pageArray[i] = page; } @@ -74,6 +94,9 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { Iterable<?> pages = SerializableMeta.getObject(Iterable.class, map, BOOK_PAGES.BUKKIT, true); CraftMetaItem.safelyAdd(pages, this.pages, MAX_PAGE_LENGTH); + + resolved = SerializableMeta.getObject(Boolean.class, map, RESOLVED.BUKKIT, true); + generation = SerializableMeta.getObject(Integer.class, map, GENERATION.BUKKIT, true); } @Override @@ -89,7 +112,25 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { } if (hasPages()) { - itemData.set(BOOK_PAGES.NBT, createStringList(pages)); + NBTTagList list = new NBTTagList(); + for (String page : pages) { + if (resolved != null && resolved) { + list.add(new NBTTagString( + ChatSerializer.a(CraftChatMessage.fromString(page, true)[0]) + )); + } else { + list.add(new NBTTagString(page)); + } + } + itemData.set(BOOK_PAGES.NBT, list); + } + + if (resolved != null) { + itemData.setBoolean(RESOLVED.NBT, resolved); + } + + if (generation != null) { + itemData.setInt(GENERATION.NBT, generation); } } @@ -255,6 +296,14 @@ class CraftMetaBook extends CraftMetaItem implements BookMeta { if (hasPages()) { builder.put(BOOK_PAGES.BUKKIT, pages); } + + if (resolved != null) { + builder.put(RESOLVED.BUKKIT, resolved); + } + + if (generation != null) { + builder.put(GENERATION.BUKKIT, generation); + } return builder; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java index bff3be9d..6c6fde73 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java @@ -31,7 +31,7 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta { setEffect(SerializableMeta.getObject(FireworkEffect.class, map, EXPLOSION.BUKKIT, true)); } - + CraftMetaCharge(NBTTagCompound tag) { super(tag); @@ -40,14 +40,17 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta { } } + @Override public void setEffect(FireworkEffect effect) { this.effect = effect; } + @Override public boolean hasEffect() { return effect != null; } + @Override public FireworkEffect getEffect() { return effect; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java index d648d052..1d30e5e1 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java @@ -3,9 +3,7 @@ package org.bukkit.craftbukkit.inventory; import java.util.Map; import net.minecraft.server.GameProfileSerializer; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.NBTTagCompound; -import net.minecraft.util.com.mojang.authlib.GameProfile; import org.bukkit.Material; import org.bukkit.configuration.serialization.DelegateDeserialization; @@ -13,6 +11,7 @@ import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta; import org.bukkit.inventory.meta.SkullMeta; import com.google.common.collect.ImmutableMap.Builder; +import com.mojang.authlib.GameProfile; @DelegateDeserialization(SerializableMeta.class) class CraftMetaSkull extends CraftMetaItem implements SkullMeta { diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java index b5e9e310..1c3e1981 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapCanvas.java @@ -37,7 +37,7 @@ public class CraftMapCanvas implements MapCanvas { return; if (buffer[y * 128 + x] != color) { buffer[y * 128 + x] = color; - mapView.worldMap.flagDirty(x, y, y); + mapView.worldMap.flagDirty(x, y); } } diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java index 392dba4a..d56a291c 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java @@ -1,7 +1,7 @@ package org.bukkit.craftbukkit.map; import net.minecraft.server.WorldMap; -import net.minecraft.server.WorldMapDecoration; +import net.minecraft.server.MapIcon; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -41,8 +41,9 @@ public class CraftMapRenderer extends MapRenderer { continue; } - WorldMapDecoration decoration = (WorldMapDecoration) worldMap.decorations.get(key); - cursors.addCursor(decoration.locX, decoration.locY, (byte) (decoration.rotation & 15), decoration.type); + + MapIcon decoration = (MapIcon) worldMap.decorations.get(key); + cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRotation() & 15), decoration.getType()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java b/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java index 0959a09e..b8bf7541 100644 --- a/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java +++ b/src/main/java/org/bukkit/craftbukkit/projectiles/CraftBlockProjectileSource.java @@ -32,7 +32,7 @@ import net.minecraft.server.EntitySmallFireball; import net.minecraft.server.EntitySnowball; import net.minecraft.server.EntityThrownExpBottle; import net.minecraft.server.EntityWitherSkull; -import net.minecraft.server.EnumFacing; +import net.minecraft.server.EnumDirection; import net.minecraft.server.IPosition; import net.minecraft.server.IProjectile; import net.minecraft.server.MathHelper; @@ -48,7 +48,7 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { @Override public Block getBlock() { - return dispenserBlock.getWorld().getWorld().getBlockAt(dispenserBlock.x, dispenserBlock.y, dispenserBlock.z); + return dispenserBlock.getWorld().getWorld().getBlockAt(dispenserBlock.getPosition().getX(), dispenserBlock.getPosition().getY(), dispenserBlock.getPosition().getZ()); } @Override @@ -60,10 +60,10 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { public <T extends Projectile> T launchProjectile(Class<? extends T> projectile, Vector velocity) { Validate.isTrue(getBlock().getType() == Material.DISPENSER, "Block is no longer dispenser"); // Copied from BlockDispenser.dispense() - SourceBlock isourceblock = new SourceBlock(dispenserBlock.getWorld(), dispenserBlock.x, dispenserBlock.y, dispenserBlock.z); + SourceBlock isourceblock = new SourceBlock(dispenserBlock.getWorld(), dispenserBlock.getPosition()); // Copied from DispenseBehaviorProjectile IPosition iposition = BlockDispenser.a(isourceblock); - EnumFacing enumfacing = BlockDispenser.b(isourceblock.h()); + EnumDirection enumdirection = BlockDispenser.b(isourceblock.f()); net.minecraft.server.World world = dispenserBlock.getWorld(); net.minecraft.server.Entity launch = null; @@ -72,7 +72,7 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { } else if (Egg.class.isAssignableFrom(projectile)) { launch = new EntityEgg(world, iposition.getX(), iposition.getY(), iposition.getZ()); } else if (EnderPearl.class.isAssignableFrom(projectile)) { - launch = new EntityEnderPearl(world); + launch = new EntityEnderPearl(world, null); launch.setPosition(iposition.getX(), iposition.getY(), iposition.getZ()); } else if (ThrownExpBottle.class.isAssignableFrom(projectile)) { launch = new EntityThrownExpBottle(world, iposition.getX(), iposition.getY(), iposition.getZ()); @@ -83,13 +83,13 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { ((EntityArrow) launch).fromPlayer = 1; ((EntityArrow) launch).projectileSource = this; } else if (Fireball.class.isAssignableFrom(projectile)) { - double d0 = iposition.getX() + (double) ((float) enumfacing.getAdjacentX() * 0.3F); - double d1 = iposition.getY() + (double) ((float) enumfacing.getAdjacentY() * 0.3F); - double d2 = iposition.getZ() + (double) ((float) enumfacing.getAdjacentZ() * 0.3F); + double d0 = iposition.getX() + (double) ((float) enumdirection.getAdjacentX() * 0.3F); + double d1 = iposition.getY() + (double) ((float) enumdirection.getAdjacentY() * 0.3F); + double d2 = iposition.getZ() + (double) ((float) enumdirection.getAdjacentZ() * 0.3F); Random random = world.random; - double d3 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentX(); - double d4 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentY(); - double d5 = random.nextGaussian() * 0.05D + (double) enumfacing.getAdjacentZ(); + double d3 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentX(); + double d4 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentY(); + double d5 = random.nextGaussian() * 0.05D + (double) enumdirection.getAdjacentZ(); if (SmallFireball.class.isAssignableFrom(projectile)) { launch = new EntitySmallFireball(world, d0, d1, d2, d3, d4, d5); @@ -129,7 +129,7 @@ public class CraftBlockProjectileSource implements BlockProjectileSource { b *= 1.25F; } // Copied from DispenseBehaviorProjectile - ((IProjectile) launch).shoot((double) enumfacing.getAdjacentX(), (double) ((float) enumfacing.getAdjacentY() + 0.1F), (double) enumfacing.getAdjacentZ(), b, a); + ((IProjectile) launch).shoot((double) enumdirection.getAdjacentX(), (double) ((float) enumdirection.getAdjacentY() + 0.1F), (double) enumdirection.getAdjacentZ(), b, a); } if (velocity != null) { diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java index 612a5243..7dedd022 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftCriteria.java @@ -17,9 +17,6 @@ final class CraftCriteria { for (Map.Entry<?, ?> entry : ((Map<?,?> ) IScoreboardCriteria.criteria).entrySet()) { String name = entry.getKey().toString(); IScoreboardCriteria criteria = (IScoreboardCriteria) entry.getValue(); - if (!criteria.getName().equals(name)) { - throw new AssertionError("Unexpected entry " + name + " to criteria " + criteria + "(" + criteria.getName() + ")"); - } defaults.put(name, new CraftCriteria(criteria)); } diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java index ad65b3f8..62bb8a36 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java @@ -97,13 +97,17 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard { public void resetScores(OfflinePlayer player) throws IllegalArgumentException { Validate.notNull(player, "OfflinePlayer cannot be null"); - board.resetPlayerScores(player.getName()); + for (CraftObjective objective : objectives.values()) { + board.resetPlayerScores(player.getName(), objective.getHandle()); // PAIL: check me + } } public void resetScores(String entry) throws IllegalArgumentException { Validate.notNull(entry, "Entry cannot be null"); - board.resetPlayerScores(entry); + for (CraftObjective objective : objectives.values()) { + board.resetPlayerScores(entry, objective.getHandle()); // PAIL: check me + } } public Team getPlayerTeam(OfflinePlayer player) throws IllegalArgumentException { diff --git a/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java b/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java deleted file mode 100644 index a9c5eafc..00000000 --- a/src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import java.util.Date; - -public class ArtifactDetails { - private String brokenReason; - private boolean isBroken; - private int buildNumber; - private String htmlUrl; - private String version; - private Date created; - private FileDetails file; - private ChannelDetails channel; - - public ChannelDetails getChannel() { - return channel; - } - - public void setChannel(ChannelDetails channel) { - this.channel = channel; - } - - public boolean isIsBroken() { - return isBroken; - } - - public void setIsBroken(boolean isBroken) { - this.isBroken = isBroken; - } - - public FileDetails getFile() { - return file; - } - - public void setFile(FileDetails file) { - this.file = file; - } - - public String getBrokenReason() { - return brokenReason; - } - - public void setBrokenReason(String brokenReason) { - this.brokenReason = brokenReason; - } - - public int getBuildNumber() { - return buildNumber; - } - - public void setBuildNumber(int buildNumber) { - this.buildNumber = buildNumber; - } - - public Date getCreated() { - return created; - } - - public void setCreated(Date created) { - this.created = created; - } - - public String getHtmlUrl() { - return htmlUrl; - } - - public void setHtmlUrl(String htmlUrl) { - this.htmlUrl = htmlUrl; - } - - public boolean isBroken() { - return isBroken; - } - - public void setBroken(boolean isBroken) { - this.isBroken = isBroken; - } - - public String getVersion() { - return version; - } - - public void setVersion(String version) { - this.version = version; - } - - public static class FileDetails { - private String url; - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - } - - public static class ChannelDetails { - private String name; - private String slug; - private int priority; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getPriority() { - return priority; - } - - public void setPriority(int priority) { - this.priority = priority; - } - - public String getSlug() { - return slug; - } - - public void setSlug(String slug) { - this.slug = slug; - } - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java b/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java deleted file mode 100644 index f21301ce..00000000 --- a/src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -public class AutoUpdater { - public static final String WARN_CONSOLE = "warn-console"; - public static final String WARN_OPERATORS = "warn-ops"; - - private final BukkitDLUpdaterService service; - private final List<String> onUpdate = new ArrayList<String>(); - private final List<String> onBroken = new ArrayList<String>(); - private final Logger log; - private final String channel; - private boolean enabled; - private ArtifactDetails current = null; - private ArtifactDetails latest = null; - private boolean suggestChannels = true; - - public AutoUpdater(BukkitDLUpdaterService service, Logger log, String channel) { - this.service = service; - this.log = log; - this.channel = channel; - } - - public String getChannel() { - return channel; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean isEnabled) { - this.enabled = isEnabled; - } - - public boolean shouldSuggestChannels() { - return suggestChannels; - } - - public void setSuggestChannels(boolean suggestChannels) { - this.suggestChannels = suggestChannels; - } - - public List<String> getOnBroken() { - return onBroken; - } - - public List<String> getOnUpdate() { - return onUpdate; - } - - public boolean isUpdateAvailable() { - if ((latest == null) || (current == null) || (!isEnabled())) { - return false; - } else { - return latest.getCreated().after(current.getCreated()); - } - } - - public ArtifactDetails getCurrent() { - return current; - } - - public ArtifactDetails getLatest() { - return latest; - } - - public void check(final String currentSlug) { - if (!isEnabled()) return; - - new Thread() { - @Override - public void run() { - current = service.getArtifact(currentSlug, "information about this CraftBukkit version; perhaps you are running a custom one?"); - latest = service.getArtifact("latest-" + channel, "latest artifact information"); - - if (isUpdateAvailable()) { - if ((current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { - log.severe("----- Bukkit Auto Updater -----"); - log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); - log.severe("Known issues with your version:"); - - for (String line : current.getBrokenReason().split("\n")) { - log.severe("> " + line); - } - - log.severe("Newer version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); - log.severe("Details: " + latest.getHtmlUrl()); - log.severe("Download: " + latest.getFile().getUrl()); - log.severe("----- ------------------- -----"); - } else if (onUpdate.contains(WARN_CONSOLE)) { - log.warning("----- Bukkit Auto Updater -----"); - log.warning("Your version of CraftBukkit is out of date. Version " + latest.getVersion() + " (build #" + latest.getBuildNumber() + ") was released on " + latest.getCreated() + "."); - log.warning("Details: " + latest.getHtmlUrl()); - log.warning("Download: " + latest.getFile().getUrl()); - log.warning("----- ------------------- -----"); - } - } else if ((current != null) && (current.isBroken()) && (onBroken.contains(WARN_CONSOLE))) { - log.severe("----- Bukkit Auto Updater -----"); - log.severe("Your version of CraftBukkit is known to be broken. It is strongly advised that you update to a more recent version ASAP."); - log.severe("Known issues with your version:"); - - for (String line : current.getBrokenReason().split("\n")) { - log.severe("> " + line); - } - - log.severe("Unfortunately, there is not yet a newer version suitable for your server. We would advise you wait an hour or two, or try out a dev build."); - log.severe("----- ------------------- -----"); - } else if ((current != null) && (shouldSuggestChannels())) { - ArtifactDetails.ChannelDetails prefChan = service.getChannel(channel, "preferred channel details"); - - if ((prefChan != null) && (current.getChannel().getPriority() < prefChan.getPriority())) { - log.info("----- Bukkit Auto Updater -----"); - log.info("It appears that you're running a " + current.getChannel().getName() + ", when you've specified in bukkit.yml that you prefer to run " + prefChan.getName() + "s."); - log.info("If you would like to be kept informed about new " + current.getChannel().getName() + " releases, it is recommended that you change 'preferred-channel' in your bukkit.yml to '" + current.getChannel().getSlug() + "'."); - log.info("With that set, you will be told whenever a new version is available for download, so that you can always keep up to date and secure with the latest fixes."); - log.info("If you would like to disable this warning, simply set 'suggest-channels' to false in bukkit.yml."); - log.info("----- ------------------- -----"); - } - } - } - }.start(); - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java b/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java deleted file mode 100644 index 0145ac36..00000000 --- a/src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import com.google.gson.*; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Type; -import java.net.URL; -import java.net.URLConnection; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.bukkit.Bukkit; - -public class BukkitDLUpdaterService { - private static final String API_PREFIX_ARTIFACT = "/api/1.0/downloads/projects/craftbukkit/view/"; - private static final String API_PREFIX_CHANNEL = "/api/1.0/downloads/channels/"; - private static final DateDeserializer dateDeserializer = new DateDeserializer(); - private final String host; - - public BukkitDLUpdaterService(String host) { - this.host = host; - } - - public ArtifactDetails getArtifact(String slug, String name) { - try { - return fetchArtifact(slug); - } catch (UnsupportedEncodingException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } - - return null; - } - - private String getUserAgent() { - return "CraftBukkit/" + BukkitDLUpdaterService.class.getPackage().getImplementationVersion() + "/" + System.getProperty("java.version"); - } - - public ArtifactDetails fetchArtifact(String slug) throws IOException { - URL url = new URL("http", host, API_PREFIX_ARTIFACT + slug + "/"); - InputStreamReader reader = null; - - try { - URLConnection connection = url.openConnection(); - connection.setRequestProperty("User-Agent", getUserAgent()); - reader = new InputStreamReader(connection.getInputStream()); - Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - return gson.fromJson(reader, ArtifactDetails.class); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - public ArtifactDetails.ChannelDetails getChannel(String slug, String name) { - try { - return fetchChannel(slug); - } catch (UnsupportedEncodingException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } catch (IOException ex) { - Bukkit.getLogger().log(Level.WARNING, "Could not get " + name + ": " + ex.getClass().getSimpleName()); - } - - return null; - } - - public ArtifactDetails.ChannelDetails fetchChannel(String slug) throws IOException { - URL url = new URL("http", host, API_PREFIX_CHANNEL + slug + "/"); - InputStreamReader reader = null; - - try { - URLConnection connection = url.openConnection(); - connection.setRequestProperty("User-Agent", getUserAgent()); - reader = new InputStreamReader(connection.getInputStream()); - Gson gson = new GsonBuilder().registerTypeAdapter(Date.class, dateDeserializer).setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create(); - - return gson.fromJson(reader, ArtifactDetails.ChannelDetails.class); - } finally { - if (reader != null) { - reader.close(); - } - } - } - - static class DateDeserializer implements JsonDeserializer<Date> { - private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - public Date deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { - try { - return format.parse(je.getAsString()); - } catch (ParseException ex) { - throw new JsonParseException("Date is not formatted correctly", ex); - } - } - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java index 30f2622d..2dbedd2d 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java +++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java @@ -4,6 +4,8 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.server.Block; +import net.minecraft.server.BlockPosition; +import net.minecraft.server.IBlockData; import org.bukkit.World; import org.bukkit.block.BlockState; @@ -35,6 +37,11 @@ public class BlockStateListPopulator { public void setTypeUpdate(int x, int y, int z, Block block) { this.setType(x, y, z, block); + } + + public void setTypeUpdate(BlockPosition position, IBlockData data) { + setTypeAndData(position.getX(), position.getY(), position.getZ(), data.getBlock(), data.getBlock().toLegacyData(data), 0); + } public void setType(int x, int y, int z, Block block) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java index 256f0531..58ff7d96 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java @@ -24,7 +24,7 @@ public final class CraftChatMessage { static { Builder<Character, EnumChatFormat> builder = ImmutableMap.builder(); for (EnumChatFormat format : EnumChatFormat.values()) { - builder.put(Character.toLowerCase(format.getChar()), format); + builder.put(Character.toLowerCase(format.toString().charAt(1)), format); } formatMap = builder.build(); } @@ -36,7 +36,7 @@ public final class CraftChatMessage { private int currentIndex; private final String message; - private StringMessage(String message) { + private StringMessage(String message, boolean keepNewlines) { this.message = message; if (message == null) { output = new IChatBaseComponent[] { currentChatComponent }; @@ -71,7 +71,7 @@ public final class CraftChatMessage { case UNDERLINE: modifier.setUnderline(Boolean.TRUE); break; - case RANDOM: + case OBFUSCATED: modifier.setRandom(Boolean.TRUE); break; default: @@ -82,7 +82,11 @@ public final class CraftChatMessage { } break; case 2: - currentChatComponent = null; + if (keepNewlines) { + currentChatComponent.addSibling(new ChatComponentText("\n")); + } else { + currentChatComponent = null; + } break; case 3: modifier.setChatClickable(new ChatClickable(EnumClickAction.OPEN_URL, match)); @@ -119,7 +123,38 @@ public final class CraftChatMessage { } public static IChatBaseComponent[] fromString(String message) { - return new StringMessage(message).getOutput(); + return fromString(message, false); + } + + public static IChatBaseComponent[] fromString(String message, boolean keepNewlines) { + return new StringMessage(message, keepNewlines).getOutput(); + } + + public static String fromComponent(IChatBaseComponent component) { + if (component == null) return ""; + StringBuilder out = new StringBuilder(); + + for (IChatBaseComponent c : (Iterable<IChatBaseComponent>) component) { + ChatModifier modi = c.getChatModifier(); + out.append(modi.getColor() == null ? EnumChatFormat.BLACK : modi.getColor()); + if (modi.isBold()) { + out.append(EnumChatFormat.BOLD); + } + if (modi.isItalic()) { + out.append(EnumChatFormat.ITALIC); + } + if (modi.isUnderlined()) { + out.append(EnumChatFormat.UNDERLINE); + } + if (modi.isStrikethrough()) { + out.append(EnumChatFormat.STRIKETHROUGH); + } + if (modi.isRandom()) { + out.append(EnumChatFormat.OBFUSCATED); + } + out.append(c.getText()); + } + return out.toString(); } private CraftChatMessage() { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index 52aa5d18..b84ed46d 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -1,12 +1,15 @@ package org.bukkit.craftbukkit.util; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import java.util.Set; import net.minecraft.server.Block; import net.minecraft.server.Blocks; import net.minecraft.server.Item; +import net.minecraft.server.MinecraftKey; import net.minecraft.server.MojangsonParser; import net.minecraft.server.NBTTagCompound; import net.minecraft.server.StatisticList; @@ -88,12 +91,16 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public Material getMaterialFromInternalName(String name) { - return getMaterial((Item) Item.REGISTRY.get(name)); + return getMaterial((Item) Item.REGISTRY.get(new MinecraftKey(name))); } @Override public List<String> tabCompleteInternalMaterialName(String token, List<String> completions) { - return StringUtil.copyPartialMatches(token, Item.REGISTRY.keySet(), completions); + ArrayList<String> results = Lists.newArrayList(); + for (MinecraftKey key : (Set<MinecraftKey>)Item.REGISTRY.keySet()) { + results.add(key.toString()); + } + return StringUtil.copyPartialMatches(token, results, completions); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java index 90b2e6ac..ae19da4d 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java +++ b/src/main/java/org/bukkit/craftbukkit/util/LazyPlayerSet.java @@ -1,25 +1,25 @@ -package org.bukkit.craftbukkit.util;
-
-import java.util.HashSet;
-import java.util.List;
-import net.minecraft.server.EntityPlayer;
-import net.minecraft.server.MinecraftServer;
-
-import org.bukkit.entity.Player;
-
-public class LazyPlayerSet extends LazyHashSet<Player> {
-
- @Override
- HashSet<Player> makeReference() {
- if (reference != null) {
- throw new IllegalStateException("Reference already created!");
- }
- List<EntityPlayer> players = MinecraftServer.getServer().getPlayerList().players;
- HashSet<Player> reference = new HashSet<Player>(players.size());
- for (EntityPlayer player : players) {
- reference.add(player.getBukkitEntity());
- }
- return reference;
- }
-
-}
+package org.bukkit.craftbukkit.util; + +import java.util.HashSet; +import java.util.List; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.MinecraftServer; + +import org.bukkit.entity.Player; + +public class LazyPlayerSet extends LazyHashSet<Player> { + + @Override + HashSet<Player> makeReference() { + if (reference != null) { + throw new IllegalStateException("Reference already created!"); + } + List<EntityPlayer> players = MinecraftServer.getServer().getPlayerList().players; + HashSet<Player> reference = new HashSet<Player>(players.size()); + for (EntityPlayer player : players) { + reference.add(player.getBukkitEntity()); + } + return reference; + } + +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java b/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java index 1db4874d..93a8f0bd 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java +++ b/src/main/java/org/bukkit/craftbukkit/util/MojangNameLookup.java @@ -1,8 +1,7 @@ package org.bukkit.craftbukkit.util; -import net.minecraft.util.com.google.gson.Gson; -import net.minecraft.util.com.google.common.base.Charsets; -import net.minecraft.util.org.apache.commons.io.IOUtils; +import com.google.common.base.Charsets; +import com.google.gson.Gson; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -12,6 +11,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.UUID; +import org.apache.commons.io.IOUtils; public class MojangNameLookup { private static final Logger logger = LogManager.getFormatterLogger(MojangNameLookup.class); diff --git a/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java b/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java index 0bdfde6d..772f730f 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java +++ b/src/main/java/org/bukkit/craftbukkit/util/TerminalConsoleWriterThread.java @@ -5,7 +5,7 @@ import java.io.OutputStream; import java.util.logging.Level; import java.util.logging.Logger; import jline.console.ConsoleReader; -import net.minecraft.util.com.mojang.util.QueueLogAppender; +import com.mojang.util.QueueLogAppender; import org.bukkit.craftbukkit.Main; public class TerminalConsoleWriterThread implements Runnable { diff --git a/src/main/resources/configurations/bukkit.yml b/src/main/resources/configurations/bukkit.yml index 129ac34d..a6c11786 100644 --- a/src/main/resources/configurations/bukkit.yml +++ b/src/main/resources/configurations/bukkit.yml @@ -37,13 +37,6 @@ ticks-per: animal-spawns: 400 monster-spawns: 1 autosave: 6000 -auto-updater: - enabled: true - on-broken: [warn-console, warn-ops] - on-update: [warn-console, warn-ops] - preferred-channel: rb - host: dl.bukkit.org - suggest-channels: true aliases: now-in-commands.yml database: username: bukkit diff --git a/src/test/java/org/bukkit/DyeColorsTest.java b/src/test/java/org/bukkit/DyeColorsTest.java index 0e3a7c75..f0b889b3 100644 --- a/src/test/java/org/bukkit/DyeColorsTest.java +++ b/src/test/java/org/bukkit/DyeColorsTest.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.server.EntitySheep; +import net.minecraft.server.EnumColor; import net.minecraft.server.ItemDye; import org.bukkit.support.AbstractTestingBase; @@ -33,7 +34,7 @@ public class DyeColorsTest extends AbstractTestingBase { @Test public void checkColor() { Color color = dye.getColor(); - float[] nmsColorArray = EntitySheep.bp[dye.getWoolData()]; + float[] nmsColorArray = EntitySheep.a(EnumColor.fromColorIndex(dye.getWoolData())); Color nmsColor = Color.fromRGB((int) (nmsColorArray[0] * 255), (int) (nmsColorArray[1] * 255), (int) (nmsColorArray[2] * 255)); assertThat(color, is(nmsColor)); } @@ -41,7 +42,7 @@ public class DyeColorsTest extends AbstractTestingBase { @Test public void checkFireworkColor() { Color color = dye.getFireworkColor(); - int nmsColor = ItemDye.c[dye.getDyeData()]; + int nmsColor = ItemDye.a[dye.getDyeData()]; assertThat(color, is(Color.fromRGB(nmsColor))); } } diff --git a/src/test/java/org/bukkit/PerMaterialTest.java b/src/test/java/org/bukkit/PerMaterialTest.java index a33fcbff..f689cbf4 100644 --- a/src/test/java/org/bukkit/PerMaterialTest.java +++ b/src/test/java/org/bukkit/PerMaterialTest.java @@ -23,16 +23,18 @@ import org.junit.runners.Parameterized.Parameter; import org.junit.runners.Parameterized.Parameters; import com.google.common.collect.Lists; +import java.util.Map; +import net.minecraft.server.Block; import net.minecraft.server.Blocks; import org.bukkit.craftbukkit.util.CraftMagicNumbers; @RunWith(Parameterized.class) public class PerMaterialTest extends AbstractTestingBase { - private static int[] fireValues; + private static Map<Block, Integer> fireValues; @BeforeClass public static void getFireValues() { - fireValues = Util.getInternalState(BlockFire.class, Blocks.FIRE, "a"); + fireValues = Util.getInternalState(BlockFire.class, Blocks.FIRE, "S"); } @Parameters(name= "{index}: {0}") @@ -120,7 +122,8 @@ public class PerMaterialTest extends AbstractTestingBase { @Test public void isBurnable() { if (material.isBlock()) { - assertThat(material.isBurnable(), is(fireValues[material.getId()] > 0)); + Block block = CraftMagicNumbers.getBlock(material); + assertThat(material.isBurnable(), is(fireValues.containsKey(block) && fireValues.get(block) > 0)); } else { assertFalse(material.isBurnable()); } @@ -129,7 +132,7 @@ public class PerMaterialTest extends AbstractTestingBase { @Test public void isOccluding() { if (material.isBlock()) { - assertThat(material.isOccluding(), is(CraftMagicNumbers.getBlock(material).r())); + assertThat(material.isOccluding(), is(CraftMagicNumbers.getBlock(material).isOccluding())); } else { assertFalse(material.isOccluding()); } diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java index 2331c180..11d29069 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java @@ -8,15 +8,19 @@ import java.util.List; import org.bukkit.Bukkit; import org.bukkit.Color; +import org.bukkit.DyeColor; import org.bukkit.FireworkEffect; import org.bukkit.Material; import org.bukkit.FireworkEffect.Type; +import org.bukkit.block.banner.Pattern; +import org.bukkit.block.banner.PatternType; import org.bukkit.craftbukkit.inventory.ItemStackTest.StackProvider; import org.bukkit.craftbukkit.inventory.ItemStackTest.StackWrapper; import org.bukkit.craftbukkit.inventory.ItemStackTest.BukkitWrapper; import org.bukkit.craftbukkit.inventory.ItemStackTest.CraftWrapper; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BannerMeta; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.FireworkEffectMeta; @@ -25,7 +29,6 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.inventory.meta.MapMeta; import org.bukkit.inventory.meta.PotionMeta; -import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.potion.PotionEffectType; import org.bukkit.support.AbstractTestingBase; import org.junit.Test; @@ -192,6 +195,15 @@ public class ItemMetaTest extends AbstractTestingBase { cleanStack.setItemMeta(meta); return cleanStack; } + }, + new StackProvider(Material.BANNER) { + @Override ItemStack operate(ItemStack cleanStack) { + final BannerMeta meta = (BannerMeta) cleanStack.getItemMeta(); + meta.setBaseColor(DyeColor.CYAN); + meta.addPattern(new Pattern(DyeColor.WHITE, PatternType.BRICKS)); + cleanStack.setItemMeta(meta); + return cleanStack; + } } ); diff --git a/src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java b/src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java deleted file mode 100644 index df7437c9..00000000 --- a/src/test/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterServiceTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.bukkit.craftbukkit.updater; - -import static org.junit.Assert.*; -import static org.hamcrest.Matchers.*; - -import java.io.FileNotFoundException; -import java.io.IOException; - -import org.junit.Test; - -public class BukkitDLUpdaterServiceTest { - @Test(expected=IOException.class) - public void testHostNotFound() throws IOException { - BukkitDLUpdaterService service = new BukkitDLUpdaterService("404.example.org"); - - service.fetchArtifact("rb"); - } - - @Test(expected=FileNotFoundException.class) - public void testArtifactNotFound() throws IOException { - BukkitDLUpdaterService service = new BukkitDLUpdaterService("dl.bukkit.org"); - - service.fetchArtifact("meep"); - } - - @Test - public void testArtifactExists() throws IOException { - BukkitDLUpdaterService service = new BukkitDLUpdaterService("dl.bukkit.org"); - - assertThat(service.fetchArtifact("latest-dev"), is(not(nullValue()))); - } -} diff --git a/src/test/java/org/bukkit/support/AbstractTestingBase.java b/src/test/java/org/bukkit/support/AbstractTestingBase.java index 7c4484f0..b280ebe4 100644 --- a/src/test/java/org/bukkit/support/AbstractTestingBase.java +++ b/src/test/java/org/bukkit/support/AbstractTestingBase.java @@ -15,11 +15,62 @@ import org.junit.BeforeClass; * extend this class to solve it. */ public abstract class AbstractTestingBase { - public static final List<Material> INVALIDATED_MATERIALS = ImmutableList.<Material>builder().add(Material.BREWING_STAND, Material.BED_BLOCK, Material.NETHER_WARTS, Material.CAULDRON, Material.FLOWER_POT, Material.CROPS, Material.SUGAR_CANE_BLOCK, Material.CAKE_BLOCK, Material.SKULL, Material.PISTON_EXTENSION, Material.PISTON_MOVING_PIECE, Material.GLOWING_REDSTONE_ORE, Material.DIODE_BLOCK_ON, Material.PUMPKIN_STEM, Material.SIGN_POST, Material.REDSTONE_COMPARATOR_ON, Material.TRIPWIRE, Material.REDSTONE_LAMP_ON, Material.MELON_STEM, Material.REDSTONE_TORCH_OFF, Material.REDSTONE_COMPARATOR_OFF, Material.REDSTONE_WIRE, Material.WALL_SIGN, Material.DIODE_BLOCK_OFF, Material.IRON_DOOR_BLOCK, Material.WOODEN_DOOR).add(Material.LOCKED_CHEST).build(); + public static final List<Material> INVALIDATED_MATERIALS = ImmutableList.<Material>builder() + .add( + Material.BREWING_STAND, + Material.BED_BLOCK, + Material.NETHER_WARTS, + Material.CAULDRON, + Material.FLOWER_POT, + Material.CROPS, + Material.SUGAR_CANE_BLOCK, + Material.CAKE_BLOCK, + Material.SKULL, + Material.PISTON_EXTENSION, + Material.PISTON_MOVING_PIECE, + Material.GLOWING_REDSTONE_ORE, + Material.DIODE_BLOCK_ON, + Material.PUMPKIN_STEM, + Material.SIGN_POST, + Material.REDSTONE_COMPARATOR_ON, + Material.TRIPWIRE, + Material.REDSTONE_LAMP_ON, + Material.MELON_STEM, + Material.REDSTONE_TORCH_OFF, + Material.REDSTONE_COMPARATOR_OFF, + Material.REDSTONE_WIRE, + Material.WALL_SIGN, + Material.DIODE_BLOCK_OFF, + Material.IRON_DOOR_BLOCK, + Material.WOODEN_DOOR, + Material.LOCKED_CHEST, + Material.WATER, + Material.STATIONARY_WATER, + Material.LAVA, + Material.STATIONARY_LAVA, + Material.DOUBLE_STEP, + Material.DOUBLE_STEP, + Material.FIRE, + Material.PORTAL, + Material.ENDER_PORTAL, + Material.WOOD_DOUBLE_STEP, + Material.COCOA, + Material.CARROT, + Material.POTATO, + Material.STANDING_BANNER, + Material.WALL_BANNER, + Material.DAYLIGHT_DETECTOR_INVERTED, + Material.DOUBLE_STONE_SLAB2, + Material.SPRUCE_DOOR, + Material.BIRCH_DOOR, + Material.JUNGLE_DOOR, + Material.ACACIA_DOOR, + Material.DARK_OAK_DOOR + ).build(); @BeforeClass public static void setup() { - DispenserRegistry.b(); + DispenserRegistry.c(); DummyServer.setup(); DummyPotions.setup(); DummyEnchantments.setup(); diff --git a/src/test/java/org/bukkit/support/DummyEnchantments.java b/src/test/java/org/bukkit/support/DummyEnchantments.java index 5ed00a72..a0e0396b 100644 --- a/src/test/java/org/bukkit/support/DummyEnchantments.java +++ b/src/test/java/org/bukkit/support/DummyEnchantments.java @@ -4,7 +4,7 @@ import net.minecraft.server.Enchantment; public class DummyEnchantments { static { - Enchantment.byId.getClass(); + Enchantment.getNames(); org.bukkit.enchantments.Enchantment.stopAcceptingRegistrations(); } |