From 24557bc2b37deb6a0edf497d547471832457b1dd Mon Sep 17 00:00:00 2001 From: Thinkofdeath Date: Wed, 26 Nov 2014 08:32:16 +1100 Subject: Update to Minecraft 1.8 For more information please see http://www.spigotmc.org/ --- src/main/java/org/bukkit/craftbukkit/CraftArt.java | 12 +- .../java/org/bukkit/craftbukkit/CraftChunk.java | 62 +++--- .../org/bukkit/craftbukkit/CraftOfflinePlayer.java | 2 +- .../bukkit/craftbukkit/CraftProfileBanEntry.java | 2 +- .../bukkit/craftbukkit/CraftProfileBanList.java | 2 +- .../java/org/bukkit/craftbukkit/CraftServer.java | 200 +++---------------- .../org/bukkit/craftbukkit/CraftStatistic.java | 16 +- .../org/bukkit/craftbukkit/CraftTravelAgent.java | 15 +- .../java/org/bukkit/craftbukkit/CraftWorld.java | 86 +++++---- .../org/bukkit/craftbukkit/block/CraftBanner.java | 105 ++++++++++ .../org/bukkit/craftbukkit/block/CraftBlock.java | 119 ++++++------ .../bukkit/craftbukkit/block/CraftBlockState.java | 3 +- .../org/bukkit/craftbukkit/block/CraftChest.java | 9 +- .../bukkit/craftbukkit/block/CraftDispenser.java | 3 +- .../org/bukkit/craftbukkit/block/CraftDropper.java | 3 +- .../org/bukkit/craftbukkit/block/CraftJukebox.java | 15 +- .../bukkit/craftbukkit/block/CraftNoteBlock.java | 7 +- .../org/bukkit/craftbukkit/block/CraftSign.java | 30 ++- .../org/bukkit/craftbukkit/block/CraftSkull.java | 4 +- .../craftbukkit/chunkio/ChunkIOProvider.java | 6 +- .../command/CraftBlockCommandSender.java | 2 +- .../command/CraftRemoteConsoleCommandSender.java | 3 +- .../craftbukkit/command/VanillaCommandWrapper.java | 68 ++++--- .../bukkit/craftbukkit/entity/CraftArmorStand.java | 214 +++++++++++++++++++++ .../org/bukkit/craftbukkit/entity/CraftArrow.java | 2 +- .../bukkit/craftbukkit/entity/CraftCreature.java | 13 +- .../bukkit/craftbukkit/entity/CraftEnderman.java | 7 +- .../bukkit/craftbukkit/entity/CraftEndermite.java | 23 +++ .../org/bukkit/craftbukkit/entity/CraftEntity.java | 50 ++++- .../craftbukkit/entity/CraftFallingSand.java | 4 +- .../org/bukkit/craftbukkit/entity/CraftFish.java | 3 +- .../bukkit/craftbukkit/entity/CraftGuardian.java | 23 +++ .../bukkit/craftbukkit/entity/CraftHanging.java | 29 ++- .../org/bukkit/craftbukkit/entity/CraftHorse.java | 2 +- .../craftbukkit/entity/CraftHumanEntity.java | 45 ++--- .../craftbukkit/entity/CraftLivingEntity.java | 49 +---- .../bukkit/craftbukkit/entity/CraftPainting.java | 4 +- .../org/bukkit/craftbukkit/entity/CraftPlayer.java | 140 ++++++++------ .../org/bukkit/craftbukkit/entity/CraftRabbit.java | 23 +++ .../org/bukkit/craftbukkit/entity/CraftSheep.java | 5 +- .../craftbukkit/entity/CraftTameableAnimal.java | 2 +- .../bukkit/craftbukkit/entity/CraftVillager.java | 10 +- .../bukkit/craftbukkit/entity/CraftWaterMob.java | 3 +- .../org/bukkit/craftbukkit/entity/CraftWolf.java | 5 +- .../craftbukkit/event/CraftEventFactory.java | 63 +++--- .../generator/CustomChunkGenerator.java | 70 +++---- .../generator/NormalChunkGenerator.java | 48 +++-- .../craftbukkit/inventory/CraftContainer.java | 36 ++-- .../craftbukkit/inventory/CraftInventory.java | 9 +- .../inventory/CraftInventoryCrafting.java | 2 +- .../inventory/CraftInventoryCustom.java | 59 ++++-- .../inventory/CraftInventoryDoubleChest.java | 4 +- .../inventory/CraftInventoryEnchanting.java | 12 ++ .../craftbukkit/inventory/CraftItemFactory.java | 2 + .../craftbukkit/inventory/CraftItemStack.java | 38 ++-- .../craftbukkit/inventory/CraftMetaBanner.java | 196 +++++++++++++++++++ .../craftbukkit/inventory/CraftMetaBook.java | 51 ++++- .../craftbukkit/inventory/CraftMetaCharge.java | 5 +- .../craftbukkit/inventory/CraftMetaSkull.java | 3 +- .../org/bukkit/craftbukkit/map/CraftMapCanvas.java | 2 +- .../bukkit/craftbukkit/map/CraftMapRenderer.java | 7 +- .../projectiles/CraftBlockProjectileSource.java | 24 +-- .../craftbukkit/scoreboard/CraftCriteria.java | 3 - .../craftbukkit/scoreboard/CraftScoreboard.java | 8 +- .../craftbukkit/updater/ArtifactDetails.java | 128 ------------ .../bukkit/craftbukkit/updater/AutoUpdater.java | 127 ------------ .../updater/BukkitDLUpdaterService.java | 102 ---------- .../craftbukkit/util/BlockStateListPopulator.java | 7 + .../bukkit/craftbukkit/util/CraftChatMessage.java | 45 ++++- .../bukkit/craftbukkit/util/CraftMagicNumbers.java | 11 +- .../org/bukkit/craftbukkit/util/LazyPlayerSet.java | 50 ++--- .../bukkit/craftbukkit/util/MojangNameLookup.java | 6 +- .../util/TerminalConsoleWriterThread.java | 2 +- 73 files changed, 1416 insertions(+), 1134 deletions(-) create mode 100644 src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftArmorStand.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftEndermite.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftGuardian.java create mode 100644 src/main/java/org/bukkit/craftbukkit/entity/CraftRabbit.java create mode 100644 src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java delete mode 100644 src/main/java/org/bukkit/craftbukkit/updater/ArtifactDetails.java delete mode 100644 src/main/java/org/bukkit/craftbukkit/updater/AutoUpdater.java delete mode 100644 src/main/java/org/bukkit/craftbukkit/updater/BukkitDLUpdaterService.java (limited to 'src/main/java/org/bukkit') 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 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() { + this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, new Function() { @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 [player]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBan(), "/ban [reason]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanIp(), "/ban-ip ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandBanList(), "/banlist [ips]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandClear(), "/clear [item] [metadata]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemodeDefault(), "/defaultgamemode ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDeop(), "/deop ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandDifficulty(), "/difficulty ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEffect(), "/effect [seconds] [amplifier]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandEnchant(), "/enchant [enchantment level]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamemode(), "/gamemode [player]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGamerule(), "/gamerule [true|false]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandGive(), "/give [amount] [metadata] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandHelp(), "/help [page|commandname]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandIdleTimeout(), "/setidletimeout ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandKick(), "/kick [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 ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandOp(), "/op ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardon(), "/pardon ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPardonIP(), "/pardon-ip ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandPlaySound(), "/playsound [x] [y] [z] [volume] [pitch] [minimumVolume]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSay(), "/say ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandScoreboard(), "/scoreboard")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSeed(), "/seed")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetBlock(), "/setblock [datavalue] [oldblockHandling] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSetWorldSpawn(), "/setworldspawn [x] [y] [z]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpawnpoint(), "/spawnpoint [x] [y] [z]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSpreadPlayers(), "/spreadplayers [spreadDistance] [maxRange] [respectTeams] ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandSummon(), "/summon [x] [y] [z] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTp(), "/tp [player] \n/tp [player] ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTell(), "/tell ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTellRaw(), "/tellraw ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestFor(), "/testfor [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTestForBlock(), "/testforblock [datavalue] [dataTag]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandTime(), "/time set \n/time add ")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandToggleDownfall(), "/toggledownfall")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWeather(), "/weather [duration in seconds]")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandWhitelist(), "/whitelist (add|remove) \n/whitelist (on|off|list|reload)")); - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandXp(), "/xp [player]\n/xp L [player]")); - // This is what is in the lang file, I swear. - commandMap.register("minecraft", new VanillaCommandWrapper(new CommandNetstat(), "/list")); + Map 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 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 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 patterns = new ArrayList(); + + 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 getPatterns() { + return new ArrayList(patterns); + } + + @Override + public void setPatterns(List patterns) { + this.patterns = new ArrayList(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) vanillaCommand.tabComplete(getListener(sender), args); + return (List) 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 list = ((List)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 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 getNearbyEntities(double x, double y, double z) { @SuppressWarnings("unchecked") - List notchEntityList = entity.world.getEntities(entity, entity.boundingBox.grow(x, y, z)); + List notchEntityList = entity.world.getEntities(entity, entity.getBoundingBox().grow(x, y, z)); List bukkitEntityList = new java.util.ArrayList(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)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 icons = new ArrayList(); + 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 serialize() { Map result = new LinkedHashMap(); @@ -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 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 getDefaultPopulators(org.bukkit.World world) { return new ArrayList(); } + @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 patterns = new ArrayList(); + + CraftMetaBanner(CraftMetaItem meta) { + super(meta); + + if (!(meta instanceof CraftMetaBanner)) { + return; + } + + CraftMetaBanner banner = (CraftMetaBanner) meta; + base = banner.base; + patterns = new ArrayList(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 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 getPatterns() { + return new ArrayList(patterns); + } + + @Override + public void setPatterns(List patterns) { + this.patterns = new ArrayList(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 serialize(ImmutableMap.Builder 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 pages = new ArrayList(); + 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 launchProjectile(Class 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 onUpdate = new ArrayList(); - private final List onBroken = new ArrayList(); - 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 getOnBroken() { - return onBroken; - } - - public List 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 { - 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 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) 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 tabCompleteInternalMaterialName(String token, List completions) { - return StringUtil.copyPartialMatches(token, Item.REGISTRY.keySet(), completions); + ArrayList results = Lists.newArrayList(); + for (MinecraftKey key : (Set)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 { - - @Override - HashSet makeReference() { - if (reference != null) { - throw new IllegalStateException("Reference already created!"); - } - List players = MinecraftServer.getServer().getPlayerList().players; - HashSet reference = new HashSet(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 { + + @Override + HashSet makeReference() { + if (reference != null) { + throw new IllegalStateException("Reference already created!"); + } + List players = MinecraftServer.getServer().getPlayerList().players; + HashSet reference = new HashSet(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 { -- cgit v1.2.3