diff options
Diffstat (limited to 'src')
288 files changed, 11365 insertions, 2281 deletions
diff --git a/src/main/java/com/mojang/brigadier/tree/CommandNode.java b/src/main/java/com/mojang/brigadier/tree/CommandNode.java new file mode 100644 index 00000000..1196df6b --- /dev/null +++ b/src/main/java/com/mojang/brigadier/tree/CommandNode.java @@ -0,0 +1,200 @@ +package com.mojang.brigadier.tree; + +import com.google.common.collect.ComparisonChain; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import com.mojang.brigadier.AmbiguityConsumer; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.RedirectModifier; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.builder.ArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.context.CommandContextBuilder; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; + +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import net.minecraft.server.CommandListenerWrapper; // CraftBukkit + +public abstract class CommandNode<S> implements Comparable<CommandNode<S>> { + private Map<String, CommandNode<S>> children = Maps.newLinkedHashMap(); + private Map<String, LiteralCommandNode<S>> literals = Maps.newLinkedHashMap(); + private Map<String, ArgumentCommandNode<S, ?>> arguments = Maps.newLinkedHashMap(); + private final Predicate<S> requirement; + private final CommandNode<S> redirect; + private final RedirectModifier<S> modifier; + private final boolean forks; + private Command<S> command; + + protected CommandNode(final Command<S> command, final Predicate<S> requirement, final CommandNode<S> redirect, final RedirectModifier<S> modifier, final boolean forks) { + this.command = command; + this.requirement = requirement; + this.redirect = redirect; + this.modifier = modifier; + this.forks = forks; + } + + public Command<S> getCommand() { + return command; + } + + public Collection<CommandNode<S>> getChildren() { + return children.values(); + } + + public CommandNode<S> getChild(final String name) { + return children.get(name); + } + + public CommandNode<S> getRedirect() { + return redirect; + } + + public RedirectModifier<S> getRedirectModifier() { + return modifier; + } + + public boolean canUse(final S source) { + // CraftBukkit start + if (source instanceof CommandListenerWrapper) { + try { + ((CommandListenerWrapper) source).currentCommand = this; + return requirement.test(source); + } finally { + ((CommandListenerWrapper) source).currentCommand = null; + } + } + // CraftBukkit end + return requirement.test(source); + } + + public void addChild(final CommandNode<S> node) { + if (node instanceof RootCommandNode) { + throw new UnsupportedOperationException("Cannot add a RootCommandNode as a child to any other CommandNode"); + } + + final CommandNode<S> child = children.get(node.getName()); + if (child != null) { + // We've found something to merge onto + if (node.getCommand() != null) { + child.command = node.getCommand(); + } + for (final CommandNode<S> grandchild : node.getChildren()) { + child.addChild(grandchild); + } + } else { + children.put(node.getName(), node); + if (node instanceof LiteralCommandNode) { + literals.put(node.getName(), (LiteralCommandNode<S>) node); + } else if (node instanceof ArgumentCommandNode) { + arguments.put(node.getName(), (ArgumentCommandNode<S, ?>) node); + } + } + + children = children.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new)); + } + + public void findAmbiguities(final AmbiguityConsumer<S> consumer) { + Set<String> matches = Sets.newHashSet(); + + for (final CommandNode<S> child : children.values()) { + for (final CommandNode<S> sibling : children.values()) { + if (child == sibling) { + continue; + } + + for (final String input : child.getExamples()) { + if (sibling.isValidInput(input)) { + matches.add(input); + } + } + + if (matches.size() > 0) { + consumer.ambiguous(this, child, sibling, matches); + matches = Sets.newHashSet(); + } + } + + child.findAmbiguities(consumer); + } + } + + protected abstract boolean isValidInput(final String input); + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof CommandNode)) return false; + + final CommandNode<S> that = (CommandNode<S>) o; + + if (!children.equals(that.children)) return false; + if (command != null ? !command.equals(that.command) : that.command != null) return false; + + return true; + } + + @Override + public int hashCode() { + return 31 * children.hashCode() + (command != null ? command.hashCode() : 0); + } + + public Predicate<S> getRequirement() { + return requirement; + } + + public abstract String getName(); + + public abstract String getUsageText(); + + public abstract void parse(StringReader reader, CommandContextBuilder<S> contextBuilder) throws CommandSyntaxException; + + public abstract CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) throws CommandSyntaxException; + + public abstract ArgumentBuilder<S, ?> createBuilder(); + + protected abstract String getSortedKey(); + + public Collection<? extends CommandNode<S>> getRelevantNodes(final StringReader input) { + if (literals.size() > 0) { + final int cursor = input.getCursor(); + while (input.canRead() && input.peek() != ' ') { + input.skip(); + } + final String text = input.getString().substring(cursor, input.getCursor()); + input.setCursor(cursor); + final LiteralCommandNode<S> literal = literals.get(text); + if (literal != null) { + return Collections.singleton(literal); + } else { + return arguments.values(); + } + } else { + return arguments.values(); + } + } + + @Override + public int compareTo(final CommandNode<S> o) { + return ComparisonChain + .start() + .compareTrueFirst(this instanceof LiteralCommandNode, o instanceof LiteralCommandNode) + .compare(getSortedKey(), o.getSortedKey()) + .result(); + } + + public boolean isFork() { + return forks; + } + + public abstract Collection<String> getExamples(); +} diff --git a/src/main/java/org/bukkit/craftbukkit/CraftArt.java b/src/main/java/org/bukkit/craftbukkit/CraftArt.java index 6f94348d..1b17fd2b 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftArt.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftArt.java @@ -1,74 +1,33 @@ package org.bukkit.craftbukkit; -import net.minecraft.server.EntityPainting.EnumArt; +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import com.google.common.collect.ImmutableBiMap; +import net.minecraft.server.MinecraftKey; +import net.minecraft.server.Paintings; import org.bukkit.Art; -// Safety class, will break if either side changes public class CraftArt { + private static final BiMap<Paintings, Art> artwork; - public static Art NotchToBukkit(EnumArt art) { - switch (art) { - case KEBAB: return Art.KEBAB; - case AZTEC: return Art.AZTEC; - case ALBAN: return Art.ALBAN; - case AZTEC_2: return Art.AZTEC2; - case BOMB: return Art.BOMB; - case PLANT: return Art.PLANT; - case WASTELAND: return Art.WASTELAND; - case POOL: return Art.POOL; - case COURBET: return Art.COURBET; - case SEA: return Art.SEA; - case SUNSET: return Art.SUNSET; - case CREEBET: return Art.CREEBET; - case WANDERER: return Art.WANDERER; - case GRAHAM: return Art.GRAHAM; - case MATCH: return Art.MATCH; - case BUST: return Art.BUST; - case STAGE: return Art.STAGE; - case VOID: return Art.VOID; - case SKULL_AND_ROSES: return Art.SKULL_AND_ROSES; - case FIGHTERS: return Art.FIGHTERS; - case POINTER: return Art.POINTER; - case PIGSCENE: return Art.PIGSCENE; - case BURNING_SKULL: return Art.BURNINGSKULL; - case SKELETON: return Art.SKELETON; - case DONKEY_KONG: return Art.DONKEYKONG; - case WITHER: return Art.WITHER; - default: - throw new AssertionError(art); + static { + ImmutableBiMap.Builder<Paintings, Art> artworkBuilder = ImmutableBiMap.builder(); + for (MinecraftKey key : Paintings.a.keySet()) { + artworkBuilder.put(Paintings.a.get(key), Art.getByName(key.getKey())); } + + artwork = artworkBuilder.build(); } - public static EnumArt BukkitToNotch(Art art) { - switch (art) { - case KEBAB: return EnumArt.KEBAB; - case AZTEC: return EnumArt.AZTEC; - case ALBAN: return EnumArt.ALBAN; - case AZTEC2: return EnumArt.AZTEC_2; - case BOMB: return EnumArt.BOMB; - case PLANT: return EnumArt.PLANT; - case WASTELAND: return EnumArt.WASTELAND; - case POOL: return EnumArt.POOL; - case COURBET: return EnumArt.COURBET; - case SEA: return EnumArt.SEA; - case SUNSET: return EnumArt.SUNSET; - case CREEBET: return EnumArt.CREEBET; - case WANDERER: return EnumArt.WANDERER; - case GRAHAM: return EnumArt.GRAHAM; - case MATCH: return EnumArt.MATCH; - case BUST: return EnumArt.BUST; - case STAGE: return EnumArt.STAGE; - case VOID: return EnumArt.VOID; - case SKULL_AND_ROSES: return EnumArt.SKULL_AND_ROSES; - case FIGHTERS: return EnumArt.FIGHTERS; - case POINTER: return EnumArt.POINTER; - case PIGSCENE: return EnumArt.PIGSCENE; - case BURNINGSKULL: return EnumArt.BURNING_SKULL; - case SKELETON: return EnumArt.SKELETON; - case DONKEYKONG: return EnumArt.DONKEY_KONG; - case WITHER: return EnumArt.WITHER; - default: - throw new AssertionError(art); - } + public static Art NotchToBukkit(Paintings art) { + Art bukkit = artwork.get(art); + Preconditions.checkArgument(bukkit != null); + return bukkit; + } + + public static Paintings BukkitToNotch(Art art) { + Paintings nms = artwork.inverse().get(art); + Preconditions.checkArgument(nms != null); + return nms; } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java index 0cc838cc..b0297c64 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java @@ -20,7 +20,7 @@ public class CraftChunk implements Chunk { private final int x; private final int z; private static final byte[] emptyData = new byte[2048]; - private static final short[] emptyBlockIDs = new short[4096]; + private static final DataPaletteBlock<IBlockData> emptyBlockIDs = new ChunkSection(0, false).getBlocks(); private static final byte[] emptySkyLight = new byte[2048]; public CraftChunk(net.minecraft.server.Chunk chunk) { @@ -69,7 +69,7 @@ public class CraftChunk implements Chunk { } public Block getBlock(int x, int y, int z) { - return new CraftBlock(this, (getX() << 4) | (x & 0xF), y, (getZ() << 4) | (z & 0xF)); + return new CraftBlock(worldServer, new BlockPosition((this.x << 4) | x, y, (this.z << 4) | z)); } public Entity[] getEntities() { @@ -133,7 +133,7 @@ public class CraftChunk implements Chunk { @Override public boolean isSlimeChunk() { // 987234911L is deterimined in EntitySlime when seeing if a slime can spawn in a chunk - return getHandle().a(987234911L).nextInt(10) == 0; + return SeededRandom.a(getX(), getZ(), getWorld().getSeed(), 987234911L).nextInt(10) == 0; } public boolean unload(boolean save) { @@ -152,8 +152,7 @@ public class CraftChunk implements Chunk { net.minecraft.server.Chunk chunk = getHandle(); ChunkSection[] cs = chunk.getSections(); - short[][] sectionBlockIDs = new short[cs.length][]; - byte[][] sectionBlockData = new byte[cs.length][]; + DataPaletteBlock[] sectionBlockIDs = new DataPaletteBlock[cs.length]; byte[][] sectionSkyLights = new byte[cs.length][]; byte[][] sectionEmitLights = new byte[cs.length][]; boolean[] sectionEmpty = new boolean[cs.length]; @@ -161,28 +160,20 @@ public class CraftChunk implements Chunk { for (int i = 0; i < cs.length; i++) { 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 - short[] blockids = new short[4096]; + NBTTagCompound data = new NBTTagCompound(); + cs[i].getBlocks().b(data, "Spigot", "Magic"); - byte[] rawIds = new byte[4096]; - NibbleArray data = new NibbleArray(); - cs[i].getBlocks().exportData(rawIds, data); - - byte[] dataValues = sectionBlockData[i] = data.asBytes(); - - // Copy base IDs - for (int j = 0; j < 4096; j++) { - blockids[j] = (short) (rawIds[j] & 0xFF); - } + DataPaletteBlock blockids = new DataPaletteBlock<>(ChunkSection.GLOBAL_PALETTE, net.minecraft.server.Block.REGISTRY_ID, GameProfileSerializer::d, GameProfileSerializer::a, Blocks.AIR.getBlockData()); // TODO: snapshot whole ChunkSection + blockids.a(data, "Spigot", "Magic"); sectionBlockIDs[i] = blockids; if (cs[i].getSkyLightArray() == null) { - sectionSkyLights[i] = emptyData; + sectionSkyLights[i] = emptySkyLight; } else { sectionSkyLights[i] = new byte[2048]; System.arraycopy(cs[i].getSkyLightArray().asBytes(), 0, sectionSkyLights[i], 0, 2048); @@ -192,57 +183,46 @@ public class CraftChunk implements Chunk { } } - int[] hmap = null; + HeightMap hmap = null; if (includeMaxBlockY) { - hmap = new int[256]; // Get copy of height map - System.arraycopy(chunk.heightMap, 0, hmap, 0, 256); + hmap = new HeightMap(null, HeightMap.Type.LIGHT_BLOCKING); + hmap.a(chunk.heightMap.get(HeightMap.Type.LIGHT_BLOCKING).b()); } BiomeBase[] biome = null; double[] biomeTemp = null; - double[] biomeRain = null; if (includeBiome || includeBiomeTempRain) { - WorldChunkManager wcm = chunk.world.getWorldChunkManager(); + WorldChunkManager wcm = worldServer.getChunkProvider().getChunkGenerator().getWorldChunkManager(); if (includeBiome) { biome = new BiomeBase[256]; for (int i = 0; i < 256; i++) { - biome[i] = chunk.getBiome(new BlockPosition(i & 0xF, 0, i >> 4), wcm); + biome[i] = chunk.getBiome(new BlockPosition(i & 0xF, 0, i >> 4)); } } if (includeBiomeTempRain) { biomeTemp = new double[256]; - biomeRain = new double[256]; float[] dat = getTemperatures(wcm, getX() << 4, getZ() << 4); for (int i = 0; i < 256; i++) { biomeTemp[i] = dat[i]; } - - /* Removed 15w46a - dat = wcm.getWetness(null, getX() << 4, getZ() << 4, 16, 16); - - for (int i = 0; i < 256; i++) { - biomeRain[i] = dat[i]; - } - */ } } World world = getWorld(); - return new CraftChunkSnapshot(getX(), getZ(), world.getName(), world.getFullTime(), sectionBlockIDs, sectionBlockData, sectionSkyLights, sectionEmitLights, sectionEmpty, hmap, biome, biomeTemp, biomeRain); + return new CraftChunkSnapshot(getX(), getZ(), world.getName(), world.getFullTime(), sectionBlockIDs, sectionSkyLights, sectionEmitLights, sectionEmpty, hmap, biome, biomeTemp); } public static ChunkSnapshot getEmptyChunkSnapshot(int x, int z, CraftWorld world, boolean includeBiome, boolean includeBiomeTempRain) { BiomeBase[] biome = null; double[] biomeTemp = null; - double[] biomeRain = null; if (includeBiome || includeBiomeTempRain) { - WorldChunkManager wcm = world.getHandle().getWorldChunkManager(); + WorldChunkManager wcm = world.getHandle().getChunkProvider().getChunkGenerator().getWorldChunkManager(); if (includeBiome) { biome = new BiomeBase[256]; @@ -253,44 +233,33 @@ public class CraftChunk implements Chunk { if (includeBiomeTempRain) { biomeTemp = new double[256]; - biomeRain = new double[256]; float[] dat = getTemperatures(wcm, x << 4, z << 4); for (int i = 0; i < 256; i++) { biomeTemp[i] = dat[i]; } - - /* Removed 15w46a - dat = wcm.getWetness(null, x << 4, z << 4, 16, 16); - - for (int i = 0; i < 256; i++) { - biomeRain[i] = dat[i]; - } - */ } } /* Fill with empty data */ int hSection = world.getMaxHeight() >> 4; - short[][] blockIDs = new short[hSection][]; + DataPaletteBlock[] blockIDs = new DataPaletteBlock[hSection]; byte[][] skyLight = new byte[hSection][]; byte[][] emitLight = new byte[hSection][]; - byte[][] blockData = new byte[hSection][]; boolean[] empty = new boolean[hSection]; for (int i = 0; i < hSection; i++) { blockIDs[i] = emptyBlockIDs; skyLight[i] = emptySkyLight; emitLight[i] = emptyData; - blockData[i] = emptyData; empty[i] = true; } - return new CraftChunkSnapshot(x, z, world.getName(), world.getFullTime(), blockIDs, blockData, skyLight, emitLight, empty, new int[256], biome, biomeTemp, biomeRain); + return new CraftChunkSnapshot(x, z, world.getName(), world.getFullTime(), blockIDs, skyLight, emitLight, empty, new HeightMap(null, HeightMap.Type.LIGHT_BLOCKING), biome, biomeTemp); } private static float[] getTemperatures(WorldChunkManager chunkmanager, int chunkX, int chunkZ) { - BiomeBase[] biomes = chunkmanager.getBiomes(null, chunkX, chunkZ, 16, 16); + BiomeBase[] biomes = chunkmanager.getBiomes(chunkX, chunkZ, 16, 16); float[] temps = new float[biomes.length]; for (int i = 0; i < biomes.length; i++) { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java b/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java index c0fb34b9..8032f358 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftChunkSnapshot.java @@ -3,9 +3,15 @@ package org.bukkit.craftbukkit; import org.bukkit.ChunkSnapshot; import org.bukkit.Material; import org.bukkit.block.Biome; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; import net.minecraft.server.BiomeBase; +import net.minecraft.server.DataPaletteBlock; +import net.minecraft.server.HeightMap; +import net.minecraft.server.IBlockData; /** * Represents a static, thread-safe snapshot of chunk of blocks @@ -14,31 +20,27 @@ import net.minecraft.server.BiomeBase; public class CraftChunkSnapshot implements ChunkSnapshot { private final int x, z; private final String worldname; - private final short[][] blockids; /* Block IDs, by section */ - private final byte[][] blockdata; + private final DataPaletteBlock<IBlockData>[] blockids; private final byte[][] skylight; private final byte[][] emitlight; private final boolean[] empty; - private final int[] hmap; // Height map + private final HeightMap hmap; // Height map private final long captureFulltime; private final BiomeBase[] biome; private final double[] biomeTemp; - private final double[] biomeRain; - CraftChunkSnapshot(int x, int z, String wname, long wtime, short[][] sectionBlockIDs, byte[][] sectionBlockData, byte[][] sectionSkyLights, byte[][] sectionEmitLights, boolean[] sectionEmpty, int[] hmap, BiomeBase[] biome, double[] biomeTemp, double[] biomeRain) { + CraftChunkSnapshot(int x, int z, String wname, long wtime, DataPaletteBlock<IBlockData>[] sectionBlockIDs, byte[][] sectionSkyLights, byte[][] sectionEmitLights, boolean[] sectionEmpty, HeightMap hmap, BiomeBase[] biome, double[] biomeTemp) { this.x = x; this.z = z; this.worldname = wname; this.captureFulltime = wtime; this.blockids = sectionBlockIDs; - this.blockdata = sectionBlockData; this.skylight = sectionSkyLights; this.emitlight = sectionEmitLights; this.empty = sectionEmpty; this.hmap = hmap; this.biome = biome; this.biomeTemp = biomeTemp; - this.biomeRain = biomeRain; } public int getX() { @@ -55,16 +57,17 @@ public class CraftChunkSnapshot implements ChunkSnapshot { @Override public Material getBlockType(int x, int y, int z) { - return Material.getMaterial(getBlockTypeId(x, y, z)); + return CraftMagicNumbers.getMaterial(blockids[y >> 4].a(x, y & 0xF, z).getBlock()); } - public final int getBlockTypeId(int x, int y, int z) { - return blockids[y >> 4][((y & 0xF) << 8) | (z << 4) | x]; + @Override + public final BlockData getBlockData(int x, int y, int z) { + return CraftBlockData.fromData(blockids[y >> 4].a(x, y & 0xF, z)); } - public final int getBlockData(int x, int y, int z) { - int off = ((y & 0xF) << 7) | (z << 3) | (x >> 1); - return (blockdata[y >> 4][off] >> ((x & 1) << 2)) & 0xF; + @Override + public final int getData(int x, int y, int z) { + return CraftMagicNumbers.toLegacyData(blockids[y >> 4].a(x, y & 0xF, z)); } public final int getBlockSkyLight(int x, int y, int z) { @@ -78,7 +81,7 @@ public class CraftChunkSnapshot implements ChunkSnapshot { } public final int getHighestBlockYAt(int x, int z) { - return hmap[z << 4 | x]; + return hmap.a(x, z); } public final Biome getBiome(int x, int z) { @@ -89,10 +92,6 @@ public class CraftChunkSnapshot implements ChunkSnapshot { return biomeTemp[z << 4 | x]; } - public final double getRawBiomeRainfall(int x, int z) { - return biomeRain[z << 4 | x]; - } - public final long getCaptureFullTime() { return captureFulltime; } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java b/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java index 67f28566..921a57f5 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftCrashReport.java @@ -12,6 +12,7 @@ import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import net.minecraft.server.MinecraftServer; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; public class CraftCrashReport implements CrashReportCallable<Object> { @@ -22,7 +23,8 @@ public class CraftCrashReport implements CrashReportCallable<Object> { value.append("\n Plugins: {"); for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) { PluginDescriptionFile description = plugin.getDescription(); - value.append(' ').append(description.getFullName()).append(' ').append(description.getMain()).append(' ').append(Arrays.toString(description.getAuthors().toArray())).append(','); + boolean legacy = CraftMagicNumbers.isLegacy(description); + value.append(' ').append(description.getFullName()).append(legacy ? "*" : "").append(' ').append(description.getMain()).append(' ').append(Arrays.toString(description.getAuthors().toArray())).append(','); } value.append("}\n Warnings: ").append(Bukkit.getWarningState().name()); value.append("\n Reload Count: ").append(String.valueOf(MinecraftServer.getServer().server.reloadCount)); diff --git a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java index 16721835..c6edd7a5 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftEffect.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftEffect.java @@ -1,9 +1,12 @@ package org.bukkit.craftbukkit; +import net.minecraft.server.Block; +import net.minecraft.server.Item; import org.apache.commons.lang.Validate; import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.block.BlockFace; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.potion.Potion; public class CraftEffect { @@ -18,7 +21,7 @@ public class CraftEffect { break; case RECORD_PLAY: Validate.isTrue(((Material) data).isRecord(), "Invalid record type!"); - datavalue = ((Material) data).getId(); + datavalue = Item.getId(CraftMagicNumbers.getItem((Material) data)); break; case SMOKE: switch((BlockFace) data) { // TODO: Verify (Where did these values come from...?) @@ -56,7 +59,7 @@ public class CraftEffect { break; case STEP_SOUND: Validate.isTrue(((Material) data).isBlock(), "Material is not a block!"); - datavalue = ((Material) data).getId(); + datavalue = Block.getCombinedId(CraftMagicNumbers.getBlock((Material) data).getBlockData()); break; default: datavalue = 0; diff --git a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java index 45217866..7b49f673 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftOfflinePlayer.java @@ -9,6 +9,7 @@ import java.util.UUID; import net.minecraft.server.EntityPlayer; import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.WhiteListEntry; import net.minecraft.server.WorldNBTStorage; import org.bukkit.BanList; @@ -115,9 +116,9 @@ public class CraftOfflinePlayer implements OfflinePlayer, ConfigurationSerializa public void setWhitelisted(boolean value) { if (value) { - server.getHandle().addWhitelist(profile); + server.getHandle().getWhitelist().add(new WhiteListEntry(profile)); } else { - server.getHandle().removeWhitelist(profile); + server.getHandle().getWhitelist().remove(profile); } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftParticle.java b/src/main/java/org/bukkit/craftbukkit/CraftParticle.java index 4128e838..291f46fe 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftParticle.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftParticle.java @@ -1,41 +1,151 @@ package org.bukkit.craftbukkit; -import net.minecraft.server.Block; -import net.minecraft.server.EnumParticle; -import net.minecraft.server.IBlockData; +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import java.util.HashMap; +import java.util.Map; +import net.minecraft.server.MinecraftKey; +import net.minecraft.server.ParticleParam; +import net.minecraft.server.ParticleParamBlock; +import net.minecraft.server.ParticleParamItem; +import net.minecraft.server.ParticleParamRedstone; +import net.minecraft.server.ParticleType; +import org.bukkit.Color; import org.bukkit.Particle; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; -public class CraftParticle { +public enum CraftParticle { - public static EnumParticle toNMS(Particle bukkit) { - return EnumParticle.valueOf(bukkit.name()); + EXPLOSION_NORMAL("poof"), + EXPLOSION_LARGE("explosion"), + EXPLOSION_HUGE("explosion_emitter"), + FIREWORKS_SPARK("firework"), + WATER_BUBBLE("bubble"), + WATER_SPLASH("splash"), + WATER_WAKE("fishing"), + SUSPENDED("underwater"), + SUSPENDED_DEPTH("underwater"), + CRIT("crit"), + CRIT_MAGIC("enchanted_hit"), + SMOKE_NORMAL("smoke"), + SMOKE_LARGE("large_smoke"), + SPELL("effect"), + SPELL_INSTANT("instant_effect"), + SPELL_MOB("entity_effect"), + SPELL_MOB_AMBIENT("ambient_entity_effect"), + SPELL_WITCH("witch"), + DRIP_WATER("dripping_water"), + DRIP_LAVA("dripping_lava"), + VILLAGER_ANGRY("angry_villager"), + VILLAGER_HAPPY("happy_villager"), + TOWN_AURA("mycelium"), + NOTE("note"), + PORTAL("portal"), + ENCHANTMENT_TABLE("enchant"), + FLAME("flame"), + LAVA("lava"), + CLOUD("cloud"), + REDSTONE("dust"), + SNOWBALL("item_snowball"), + SNOW_SHOVEL("item_snowball"), + SLIME("item_slime"), + HEART("heart"), + BARRIER("barrier"), + ITEM_CRACK("item"), + BLOCK_CRACK("block"), + BLOCK_DUST("block"), + WATER_DROP("rain"), + MOB_APPEARANCE("elder_guardian"), + DRAGON_BREATH("dragon_breath"), + END_ROD("end_rod"), + DAMAGE_INDICATOR("damage_indicator"), + SWEEP_ATTACK("sweep_attack"), + FALLING_DUST("falling_dust"), + TOTEM("totem_of_undying"), + SPIT("spit"), + SQUID_INK("squid_ink"), + BUBBLE_POP("bubble_pop"), + CURRENT_DOWN("current_down"), + BUBBLE_COLUMN_UP("bubble_column_up"), + NAUTILUS("nautilus"), + DOLPHIN("dolphin"), + // ----- Legacy Separator ----- + LEGACY_BLOCK_CRACK("block"), + LEGACY_BLOCK_DUST("block"), + LEGACY_FALLING_DUST("falling_dust"); + private final MinecraftKey minecraftKey; + private final Particle bukkit; + private static final BiMap<Particle, MinecraftKey> particles; + private static final Map<Particle, Particle> aliases; + + static { + particles = HashBiMap.create(); + aliases = new HashMap<>(); + + for (CraftParticle particle : CraftParticle.values()) { + if (particles.containsValue(particle.minecraftKey)) { + aliases.put(particle.bukkit, particles.inverse().get(particle.minecraftKey)); + } else { + particles.put(particle.bukkit, particle.minecraftKey); + } + } } - public static Particle toBukkit(EnumParticle nms) { - return Particle.valueOf(nms.name()); + private CraftParticle(String minecraftKey) { + this.minecraftKey = new MinecraftKey(minecraftKey); + + this.bukkit = Particle.valueOf(this.name()); + Preconditions.checkState(bukkit != null, "Bukkit particle %s does not exist", this.name()); } - public static int[] toData(Particle particle, Object obj) { + public static ParticleParam toNMS(Particle bukkit) { + return toNMS(bukkit, null); + } + + public static <T> ParticleParam toNMS(Particle particle, T obj) { + Particle canonical = particle; + if (aliases.containsKey(particle)) { + canonical = aliases.get(particle); + } + + net.minecraft.server.Particle nms = net.minecraft.server.Particle.REGISTRY.get(particles.get(canonical)); + Preconditions.checkArgument(nms != null, "No NMS particle %s", particle); + if (particle.getDataType().equals(Void.class)) { - return new int[0]; + return (ParticleType) nms; } + Preconditions.checkArgument(obj != null, "Particle %s requires data, null provided", particle); if (particle.getDataType().equals(ItemStack.class)) { - if (obj == null) { - return new int[]{0, 0}; - } ItemStack itemStack = (ItemStack) obj; - return new int[]{itemStack.getType().getId(), itemStack.getDurability()}; + return new ParticleParamItem((net.minecraft.server.Particle<ParticleParamItem>) nms, CraftItemStack.asNMSCopy(itemStack)); } - if (particle.getDataType().equals(MaterialData.class)) { - if (obj == null) { - return new int[]{0}; - } + if (particle.getDataType() == MaterialData.class) { MaterialData data = (MaterialData) obj; - return new int[]{data.getItemTypeId() + ((int)(data.getData()) << 12)}; + return new ParticleParamBlock((net.minecraft.server.Particle<ParticleParamBlock>) nms, CraftMagicNumbers.getBlock(data)); + } + if (particle.getDataType() == BlockData.class) { + BlockData data = (BlockData) obj; + return new ParticleParamBlock((net.minecraft.server.Particle<ParticleParamBlock>) nms, ((CraftBlockData) data).getState()); + } + if (particle.getDataType() == Particle.DustOptions.class) { + Particle.DustOptions data = (Particle.DustOptions) obj; + Color color = data.getColor(); + return new ParticleParamRedstone(color.getRed(), color.getGreen(), color.getBlue(), data.getSize()); } throw new IllegalArgumentException(particle.getDataType().toString()); } + + public static Particle toBukkit(net.minecraft.server.ParticleParam nms) { + return toBukkit(nms.b()); + } + + public static Particle toBukkit(net.minecraft.server.Particle nms) { + return particles.inverse().get(nms.d()); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java index 0eaf9dab..db82051c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; @@ -17,6 +18,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; +import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Pattern; @@ -52,7 +54,6 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.serialization.ConfigurationSerialization; import org.bukkit.conversations.Conversable; import org.bukkit.craftbukkit.boss.CraftBossBar; -import org.bukkit.craftbukkit.command.VanillaCommandWrapper; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.generator.CraftChunkData; import org.bukkit.craftbukkit.help.SimpleHelpMap; @@ -122,14 +123,28 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.MapMaker; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; import com.mojang.authlib.GameProfile; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.tree.CommandNode; +import com.mojang.brigadier.tree.LiteralCommandNode; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufOutputStream; import io.netty.buffer.Unpooled; import io.netty.handler.codec.base64.Base64; +import java.util.HashMap; import jline.console.ConsoleReader; +import org.bukkit.Keyed; import org.bukkit.NamespacedKey; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.command.BukkitCommandWrapper; +import org.bukkit.craftbukkit.command.CraftCommandMap; +import org.bukkit.craftbukkit.command.VanillaCommandWrapper; +import org.bukkit.craftbukkit.tag.CraftBlockTag; +import org.bukkit.craftbukkit.tag.CraftItemTag; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.event.server.TabCompleteEvent; @@ -140,7 +155,7 @@ public final class CraftServer implements Server { private final Logger logger = Logger.getLogger("Minecraft"); private final ServicesManager servicesManager = new SimpleServicesManager(); private final CraftScheduler scheduler = new CraftScheduler(); - private final SimpleCommandMap commandMap = new SimpleCommandMap(this); + private final CraftCommandMap commandMap = new CraftCommandMap(this); private final SimpleHelpMap helpMap = new SimpleHelpMap(this); private final StandardMessenger messenger = new StandardMessenger(); private final SimplePluginManager pluginManager = new SimplePluginManager(this, commandMap); @@ -168,7 +183,6 @@ public final class CraftServer implements Server { private boolean printSaveWarning; private CraftIconCache icon; private boolean overrideAllCommandBlockCommands = false; - private boolean unrestrictedAdvancements; private final List<CraftPlayer> playerView; public int reloadCount; @@ -245,7 +259,6 @@ public final class CraftServer implements Server { saveCommandsConfig(); overrideAllCommandBlockCommands = commandsConfiguration.getStringList("command-block-overrides").contains("*"); - unrestrictedAdvancements = commandsConfiguration.getBoolean("unrestricted-advancements"); pluginManager.useTimings(configuration.getBoolean("settings.plugin-profiling")); monsterSpawn = configuration.getInt("spawn-limits.monsters"); animalSpawn = configuration.getInt("spawn-limits.animals"); @@ -258,14 +271,6 @@ public final class CraftServer implements Server { loadIcon(); } - public boolean getPermissionOverride(ICommandListener listener) { - while (listener instanceof CommandListenerWrapper) { - listener = ((CommandListenerWrapper) listener).base; - } - - return unrestrictedAdvancements && listener instanceof AdvancementRewards.AdvancementCommandListener; - } - public boolean getCommandBlockOverride(String command) { return overrideAllCommandBlockCommands || commandsConfiguration.getStringList("command-block-overrides").contains(command); } @@ -337,6 +342,7 @@ public final class CraftServer implements Server { DefaultPermissions.registerCorePermissions(); CraftDefaultPermissions.registerCorePermissions(); helpMap.initializeCommands(); + syncCommands(); } } @@ -345,9 +351,43 @@ public final class CraftServer implements Server { } private void setVanillaCommands() { - Map<String, ICommand> commands = new CommandDispatcher(console).getCommands(); - for (ICommand cmd : commands.values()) { - commandMap.register("minecraft", new VanillaCommandWrapper((CommandAbstract) cmd, LocaleI18n.get(cmd.getUsage(null)))); + CommandDispatcher dispatcher = console.getCommandDispatcher(); + + // Build a list of all Vanilla commands and create wrappers + for (CommandNode<CommandListenerWrapper> cmd : dispatcher.a().getRoot().getChildren()) { + commandMap.register("minecraft", new VanillaCommandWrapper(dispatcher, cmd)); + } + } + + private void syncCommands() { + // Clear existing commands + CommandDispatcher dispatcher = console.commandDispatcher = new CommandDispatcher(); + + // Register all commands, vanilla ones will be using the old dispatcher references + for (Map.Entry<String, Command> entry : commandMap.getKnownCommands().entrySet()) { + String label = entry.getKey(); + Command command = entry.getValue(); + + if (command instanceof VanillaCommandWrapper) { + LiteralCommandNode<CommandListenerWrapper> node = (LiteralCommandNode<CommandListenerWrapper>) ((VanillaCommandWrapper) command).vanillaCommand; + if (!node.getLiteral().equals(label)) { + LiteralCommandNode<CommandListenerWrapper> clone = new LiteralCommandNode(label, node.getCommand(), node.getRequirement(), node.getRedirect(), node.getRedirectModifier(), node.isFork()); + + for (CommandNode<CommandListenerWrapper> child : node.getChildren()) { + clone.addChild(child); + } + node = clone; + } + + dispatcher.a().getRoot().addChild(node); + } else { + new BukkitCommandWrapper(this, entry.getValue()).register(dispatcher.a(), label); + } + } + + // Refresh commands + for (EntityPlayer player : getHandle().players) { + dispatcher.a(player); } } @@ -837,23 +877,23 @@ public final class CraftServer implements Server { generator = getGenerator(name); } - Convertable converter = new WorldLoaderServer(getWorldContainer(), getHandle().getServer().dataConverterManager); + Convertable converter = new WorldLoaderServer(getWorldContainer().toPath(), getWorldContainer().toPath().resolveSibling("../backups"), getHandle().getServer().dataConverterManager); if (converter.isConvertable(name)) { getLogger().info("Converting world '" + name + "'"); converter.convert(name, new IProgressUpdate() { private long b = System.currentTimeMillis(); - public void a(String s) {} + public void a(IChatBaseComponent ichatbasecomponent) {} public void a(int i) { if (System.currentTimeMillis() - this.b >= 1000L) { this.b = System.currentTimeMillis(); - MinecraftServer.LOGGER.info("Converting... " + i + "%"); + MinecraftServer.LOGGER.info("Converting... {}%", Integer.valueOf(i)); } } - public void c(String s) {} + public void c(IChatBaseComponent ichatbasecomponent) {} }); } @@ -870,12 +910,15 @@ public final class CraftServer implements Server { } while(used); boolean hardcore = false; - IDataManager sdm = new ServerNBTManager(getWorldContainer(), name, true, getHandle().getServer().dataConverterManager); + IDataManager sdm = new ServerNBTManager(getWorldContainer(), name, getServer(), getHandle().getServer().dataConverterManager); WorldData worlddata = sdm.getWorldData(); WorldSettings worldSettings = null; if (worlddata == null) { worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type); - worldSettings.setGeneratorSettings(creator.generatorSettings()); + JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings()); + if (parsedSettings.isJsonObject()) { + worldSettings.setGeneratorSettings(parsedSettings.getAsJsonObject()); + } worlddata = new WorldData(worldSettings, name); } worlddata.checkName(name); // CraftBukkit - Migration did not rewrite the level.dat; This forces 1.8 to take the last loaded world as respawn (in this case the end) @@ -888,7 +931,6 @@ public final class CraftServer implements Server { if (worldSettings != null) { internal.a(worldSettings); } - internal.scoreboard = getScoreboardManager().getMainScoreboard().getHandle(); internal.tracker = new EntityTracker(internal); internal.addIWorldAccess(new WorldManager(console, internal)); @@ -962,7 +1004,7 @@ public final class CraftServer implements Server { if (save) { try { handle.save(true, null); - handle.saveLevel(); + handle.close(); } catch (ExceptionWorldConflict ex) { getLogger().log(Level.SEVERE, null, ex); } @@ -1075,19 +1117,12 @@ public final class CraftServer implements Server { @Override public void clearRecipes() { - CraftingManager.recipes = new RegistryMaterials(); - RecipesFurnace.getInstance().recipes.clear(); - RecipesFurnace.getInstance().customRecipes.clear(); - RecipesFurnace.getInstance().customExperience.clear(); + console.getCraftingManager().recipes.clear(); } @Override public void resetRecipes() { - CraftingManager.recipes = new RegistryMaterials(); - CraftingManager.init(); - RecipesFurnace.getInstance().recipes = new RecipesFurnace().recipes; - RecipesFurnace.getInstance().customRecipes.clear(); - RecipesFurnace.getInstance().customExperience.clear(); + console.getCraftingManager().a(console.getResourceManager()); } @Override @@ -1192,7 +1227,7 @@ public final class CraftServer implements Server { @Deprecated public CraftMapView getMap(short id) { PersistentCollection collection = console.worlds.get(0).worldMaps; - WorldMap worldmap = (WorldMap) collection.get(WorldMap.class, "map_" + id); + WorldMap worldmap = (WorldMap) collection.get(WorldMap::new, "map_" + id); if (worldmap == null) { return null; } @@ -1203,8 +1238,8 @@ public final class CraftServer implements Server { public CraftMapView createMap(World world) { Validate.notNull(world, "World cannot be null"); - net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(Items.MAP, 1, -1); - WorldMap worldmap = Items.FILLED_MAP.getSavedMap(stack, ((CraftWorld) world).getHandle()); + net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(Items.MAP, 1); + WorldMap worldmap = ItemWorldMap.getSavedMap(stack, ((CraftWorld) world).getHandle()); return worldmap.mapView; } @@ -1522,15 +1557,15 @@ public final class CraftServer implements Server { return warningState; } - public List<String> tabComplete(net.minecraft.server.ICommandListener sender, String message, BlockPosition pos, boolean forceCommand) { - if (!(sender instanceof EntityPlayer)) { + public List<String> tabComplete(CommandSender sender, String message, WorldServer world, Vec3D pos, boolean forceCommand) { + if (!(sender instanceof Player)) { return ImmutableList.of(); } List<String> offers; - Player player = ((EntityPlayer) sender).getBukkitEntity(); + Player player = (Player) sender; if (message.startsWith("/") || forceCommand) { - offers = tabCompleteCommand(player, message, pos); + offers = tabCompleteCommand(player, message, world, pos); } else { offers = tabCompleteChat(player, message); } @@ -1541,7 +1576,7 @@ public final class CraftServer implements Server { return tabEvent.isCancelled() ? Collections.EMPTY_LIST : tabEvent.getCompletions(); } - public List<String> tabCompleteCommand(Player player, String message, BlockPosition pos) { + public List<String> tabCompleteCommand(Player player, String message, WorldServer world, Vec3D pos) { List<String> completions = null; try { if (message.startsWith("/")) { @@ -1551,7 +1586,7 @@ public final class CraftServer implements Server { if (pos == null) { completions = getCommandMap().tabComplete(player, message); } else { - completions = getCommandMap().tabComplete(player, message, new Location(player.getWorld(), pos.getX(), pos.getY(), pos.getZ())); + completions = getCommandMap().tabComplete(player, message, new Location(world.getWorld(), pos.x, pos.y, pos.z)); } } catch (CommandException ex) { player.sendMessage(ChatColor.RED + "An internal error occurred while attempting to tab-complete this command"); @@ -1660,8 +1695,15 @@ public final class CraftServer implements Server { @Override public Entity getEntity(UUID uuid) { Validate.notNull(uuid, "UUID cannot be null"); - net.minecraft.server.Entity entity = console.a(uuid); // PAIL: getEntity - return entity == null ? null : entity.getBukkitEntity(); + + for (WorldServer world : getServer().worlds) { + net.minecraft.server.Entity entity = world.getEntity(uuid); + if (entity != null) { + return entity.getBukkitEntity(); + } + } + + return null; } @Override @@ -1674,7 +1716,7 @@ public final class CraftServer implements Server { @Override public Iterator<org.bukkit.advancement.Advancement> advancementIterator() { - return Iterators.unmodifiableIterator(Iterators.transform(console.getAdvancementData().c().iterator(), new Function<Advancement, org.bukkit.advancement.Advancement>() { // PAIL: rename + return Iterators.unmodifiableIterator(Iterators.transform(console.getAdvancementData().b().iterator(), new Function<Advancement, org.bukkit.advancement.Advancement>() { // PAIL: rename @Override public org.bukkit.advancement.Advancement apply(Advancement advancement) { return advancement.bukkit; @@ -1682,6 +1724,55 @@ public final class CraftServer implements Server { })); } + @Override + public BlockData createBlockData(org.bukkit.Material material) { + Validate.isTrue(material != null, "Must provide material"); + + return createBlockData(material, (String) null); + } + + @Override + public BlockData createBlockData(org.bukkit.Material material, Consumer<BlockData> consumer) { + BlockData data = createBlockData(material); + + if (consumer != null) { + consumer.accept(data); + } + + return data; + } + + @Override + public BlockData createBlockData(String data) throws IllegalArgumentException { + Validate.isTrue(data != null, "Must provide data"); + + return createBlockData(null, data); + } + + @Override + public BlockData createBlockData(org.bukkit.Material material, String data) { + Validate.isTrue(material != null || data != null, "Must provide one of material or data"); + + return CraftBlockData.newData(material, data); + } + + @Override + @SuppressWarnings("unchecked") + public <T extends Keyed> org.bukkit.Tag<T> getTag(String registry, NamespacedKey tag, Class<T> clazz) { + switch (registry) { + case org.bukkit.Tag.REGISTRY_BLOCKS: + Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Block namespace must have material type"); + + return (org.bukkit.Tag<T>) new CraftBlockTag(console.getTagRegistry().a().b(CraftNamespacedKey.toMinecraft(tag))); + case org.bukkit.Tag.REGISTRY_ITEMS: + Preconditions.checkArgument(clazz == org.bukkit.Material.class, "Item namespace must have material type"); + + return (org.bukkit.Tag<T>) new CraftItemTag(console.getTagRegistry().b().b(CraftNamespacedKey.toMinecraft(tag))); + default: + throw new IllegalArgumentException(); + } + } + @Deprecated @Override public UnsafeValues getUnsafe() { diff --git a/src/main/java/org/bukkit/craftbukkit/CraftSound.java b/src/main/java/org/bukkit/craftbukkit/CraftSound.java index 8871c6f3..1181701e 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftSound.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftSound.java @@ -10,6 +10,12 @@ import org.bukkit.Sound; public enum CraftSound { AMBIENT_CAVE("ambient.cave"), + AMBIENT_UNDERWATER_ENTER("ambient.underwater.enter"), + AMBIENT_UNDERWATER_EXIT("ambient.underwater.exit"), + AMBIENT_UNDERWATER_LOOP("ambient.underwater.loop"), + AMBIENT_UNDERWATER_LOOP_ADDITIONS("ambient.underwater.loop.additions"), + AMBIENT_UNDERWATER_LOOP_ADDITIONS_RARE("ambient.underwater.loop.additions.rare"), + AMBIENT_UNDERWATER_LOOP_ADDITIONS_ULTRA_RARE("ambient.underwater.loop.additions.ultra_rare"), BLOCK_ANVIL_BREAK("block.anvil.break"), BLOCK_ANVIL_DESTROY("block.anvil.destroy"), BLOCK_ANVIL_FALL("block.anvil.fall"), @@ -18,24 +24,38 @@ public enum CraftSound { BLOCK_ANVIL_PLACE("block.anvil.place"), BLOCK_ANVIL_STEP("block.anvil.step"), BLOCK_ANVIL_USE("block.anvil.use"), + BLOCK_BEACON_ACTIVATE("block.beacon.activate"), + BLOCK_BEACON_AMBIENT("block.beacon.ambient"), + BLOCK_BEACON_DEACTIVATE("block.beacon.deactivate"), + BLOCK_BEACON_POWER_SELECT("block.beacon.power_select"), BLOCK_BREWING_STAND_BREW("block.brewing_stand.brew"), + BLOCK_BUBBLE_COLUMN_BUBBLE_POP("block.bubble_column.bubble_pop"), + BLOCK_BUBBLE_COLUMN_UPWARDS_AMBIENT("block.bubble_column.upwards_ambient"), + BLOCK_BUBBLE_COLUMN_UPWARDS_INSIDE("block.bubble_column.upwards_inside"), + BLOCK_BUBBLE_COLUMN_WHIRLPOOL_AMBIENT("block.bubble_column.whirlpool_ambient"), + BLOCK_BUBBLE_COLUMN_WHIRLPOOL_INSIDE("block.bubble_column.whirlpool_inside"), BLOCK_CHEST_CLOSE("block.chest.close"), BLOCK_CHEST_LOCKED("block.chest.locked"), BLOCK_CHEST_OPEN("block.chest.open"), BLOCK_CHORUS_FLOWER_DEATH("block.chorus_flower.death"), BLOCK_CHORUS_FLOWER_GROW("block.chorus_flower.grow"), - BLOCK_CLOTH_BREAK("block.cloth.break"), - BLOCK_CLOTH_FALL("block.cloth.fall"), - BLOCK_CLOTH_HIT("block.cloth.hit"), - BLOCK_CLOTH_PLACE("block.cloth.place"), - BLOCK_CLOTH_STEP("block.cloth.step"), BLOCK_COMPARATOR_CLICK("block.comparator.click"), + BLOCK_CONDUIT_ACTIVATE("block.conduit.activate"), + BLOCK_CONDUIT_AMBIENT("block.conduit.ambient"), + BLOCK_CONDUIT_AMBIENT_SHORT("block.conduit.ambient.short"), + BLOCK_CONDUIT_ATTACK_TARGET("block.conduit.attack.target"), + BLOCK_CONDUIT_DEACTIVATE("block.conduit.deactivate"), + BLOCK_CORAL_BLOCK_BREAK("block.coral_block.break"), + BLOCK_CORAL_BLOCK_FALL("block.coral_block.fall"), + BLOCK_CORAL_BLOCK_HIT("block.coral_block.hit"), + BLOCK_CORAL_BLOCK_PLACE("block.coral_block.place"), + BLOCK_CORAL_BLOCK_STEP("block.coral_block.step"), BLOCK_DISPENSER_DISPENSE("block.dispenser.dispense"), BLOCK_DISPENSER_FAIL("block.dispenser.fail"), BLOCK_DISPENSER_LAUNCH("block.dispenser.launch"), BLOCK_ENCHANTMENT_TABLE_USE("block.enchantment_table.use"), - BLOCK_ENDERCHEST_CLOSE("block.enderchest.close"), - BLOCK_ENDERCHEST_OPEN("block.enderchest.open"), + BLOCK_ENDER_CHEST_CLOSE("block.ender_chest.close"), + BLOCK_ENDER_CHEST_OPEN("block.ender_chest.open"), BLOCK_END_GATEWAY_SPAWN("block.end_gateway.spawn"), BLOCK_END_PORTAL_FRAME_FILL("block.end_portal_frame.fill"), BLOCK_END_PORTAL_SPAWN("block.end_portal.spawn"), @@ -72,29 +92,31 @@ public enum CraftSound { BLOCK_LAVA_EXTINGUISH("block.lava.extinguish"), BLOCK_LAVA_POP("block.lava.pop"), BLOCK_LEVER_CLICK("block.lever.click"), + BLOCK_LILY_PAD_PLACE("block.lily_pad.place"), BLOCK_METAL_BREAK("block.metal.break"), BLOCK_METAL_FALL("block.metal.fall"), BLOCK_METAL_HIT("block.metal.hit"), BLOCK_METAL_PLACE("block.metal.place"), - BLOCK_METAL_PRESSUREPLATE_CLICK_OFF("block.metal_pressureplate.click_off"), - BLOCK_METAL_PRESSUREPLATE_CLICK_ON("block.metal_pressureplate.click_on"), + BLOCK_METAL_PRESSURE_PLATE_CLICK_OFF("block.metal_pressure_plate.click_off"), + BLOCK_METAL_PRESSURE_PLATE_CLICK_ON("block.metal_pressure_plate.click_on"), BLOCK_METAL_STEP("block.metal.step"), - BLOCK_NOTE_BASEDRUM("block.note.basedrum"), - BLOCK_NOTE_BASS("block.note.bass"), - BLOCK_NOTE_BELL("block.note.bell"), - BLOCK_NOTE_CHIME("block.note.chime"), - BLOCK_NOTE_FLUTE("block.note.flute"), - BLOCK_NOTE_GUITAR("block.note.guitar"), - BLOCK_NOTE_HARP("block.note.harp"), - BLOCK_NOTE_HAT("block.note.hat"), - BLOCK_NOTE_PLING("block.note.pling"), - BLOCK_NOTE_SNARE("block.note.snare"), - BLOCK_NOTE_XYLOPHONE("block.note.xylophone"), + BLOCK_NOTE_BLOCK_BASEDRUM("block.note_block.basedrum"), + BLOCK_NOTE_BLOCK_BASS("block.note_block.bass"), + BLOCK_NOTE_BLOCK_BELL("block.note_block.bell"), + BLOCK_NOTE_BLOCK_CHIME("block.note_block.chime"), + BLOCK_NOTE_BLOCK_FLUTE("block.note_block.flute"), + BLOCK_NOTE_BLOCK_GUITAR("block.note_block.guitar"), + BLOCK_NOTE_BLOCK_HARP("block.note_block.harp"), + BLOCK_NOTE_BLOCK_HAT("block.note_block.hat"), + BLOCK_NOTE_BLOCK_PLING("block.note_block.pling"), + BLOCK_NOTE_BLOCK_SNARE("block.note_block.snare"), + BLOCK_NOTE_BLOCK_XYLOPHONE("block.note_block.xylophone"), BLOCK_PISTON_CONTRACT("block.piston.contract"), BLOCK_PISTON_EXTEND("block.piston.extend"), BLOCK_PORTAL_AMBIENT("block.portal.ambient"), BLOCK_PORTAL_TRAVEL("block.portal.travel"), BLOCK_PORTAL_TRIGGER("block.portal.trigger"), + BLOCK_PUMPKIN_CARVE("block.pumpkin.carve"), BLOCK_REDSTONE_TORCH_BURNOUT("block.redstone_torch.burnout"), BLOCK_SAND_BREAK("block.sand.break"), BLOCK_SAND_FALL("block.sand.fall"), @@ -103,11 +125,11 @@ public enum CraftSound { BLOCK_SAND_STEP("block.sand.step"), BLOCK_SHULKER_BOX_CLOSE("block.shulker_box.close"), BLOCK_SHULKER_BOX_OPEN("block.shulker_box.open"), - BLOCK_SLIME_BREAK("block.slime.break"), - BLOCK_SLIME_FALL("block.slime.fall"), - BLOCK_SLIME_HIT("block.slime.hit"), - BLOCK_SLIME_PLACE("block.slime.place"), - BLOCK_SLIME_STEP("block.slime.step"), + BLOCK_SLIME_BLOCK_BREAK("block.slime_block.break"), + BLOCK_SLIME_BLOCK_FALL("block.slime_block.fall"), + BLOCK_SLIME_BLOCK_HIT("block.slime_block.hit"), + BLOCK_SLIME_BLOCK_PLACE("block.slime_block.place"), + BLOCK_SLIME_BLOCK_STEP("block.slime_block.step"), BLOCK_SNOW_BREAK("block.snow.break"), BLOCK_SNOW_FALL("block.snow.fall"), BLOCK_SNOW_HIT("block.snow.hit"), @@ -119,33 +141,42 @@ public enum CraftSound { BLOCK_STONE_FALL("block.stone.fall"), BLOCK_STONE_HIT("block.stone.hit"), BLOCK_STONE_PLACE("block.stone.place"), - BLOCK_STONE_PRESSUREPLATE_CLICK_OFF("block.stone_pressureplate.click_off"), - BLOCK_STONE_PRESSUREPLATE_CLICK_ON("block.stone_pressureplate.click_on"), + BLOCK_STONE_PRESSURE_PLATE_CLICK_OFF("block.stone_pressure_plate.click_off"), + BLOCK_STONE_PRESSURE_PLATE_CLICK_ON("block.stone_pressure_plate.click_on"), BLOCK_STONE_STEP("block.stone.step"), BLOCK_TRIPWIRE_ATTACH("block.tripwire.attach"), BLOCK_TRIPWIRE_CLICK_OFF("block.tripwire.click_off"), BLOCK_TRIPWIRE_CLICK_ON("block.tripwire.click_on"), BLOCK_TRIPWIRE_DETACH("block.tripwire.detach"), - BLOCK_WATERLILY_PLACE("block.waterlily.place"), BLOCK_WATER_AMBIENT("block.water.ambient"), + BLOCK_WET_GRASS_BREAK("block.wet_grass.break"), + BLOCK_WET_GRASS_FALL("block.wet_grass.fall"), + BLOCK_WET_GRASS_HIT("block.wet_grass.hit"), + BLOCK_WET_GRASS_PLACE("block.wet_grass.place"), + BLOCK_WET_GRASS_STEP("block.wet_grass.step"), + BLOCK_WOODEN_BUTTON_CLICK_OFF("block.wooden_button.click_off"), + BLOCK_WOODEN_BUTTON_CLICK_ON("block.wooden_button.click_on"), BLOCK_WOODEN_DOOR_CLOSE("block.wooden_door.close"), BLOCK_WOODEN_DOOR_OPEN("block.wooden_door.open"), + BLOCK_WOODEN_PRESSURE_PLATE_CLICK_OFF("block.wooden_pressure_plate.click_off"), + BLOCK_WOODEN_PRESSURE_PLATE_CLICK_ON("block.wooden_pressure_plate.click_on"), BLOCK_WOODEN_TRAPDOOR_CLOSE("block.wooden_trapdoor.close"), BLOCK_WOODEN_TRAPDOOR_OPEN("block.wooden_trapdoor.open"), BLOCK_WOOD_BREAK("block.wood.break"), - BLOCK_WOOD_BUTTON_CLICK_OFF("block.wood_button.click_off"), - BLOCK_WOOD_BUTTON_CLICK_ON("block.wood_button.click_on"), BLOCK_WOOD_FALL("block.wood.fall"), BLOCK_WOOD_HIT("block.wood.hit"), BLOCK_WOOD_PLACE("block.wood.place"), - BLOCK_WOOD_PRESSUREPLATE_CLICK_OFF("block.wood_pressureplate.click_off"), - BLOCK_WOOD_PRESSUREPLATE_CLICK_ON("block.wood_pressureplate.click_on"), BLOCK_WOOD_STEP("block.wood.step"), + BLOCK_WOOL_BREAK("block.wool.break"), + BLOCK_WOOL_FALL("block.wool.fall"), + BLOCK_WOOL_HIT("block.wool.hit"), + BLOCK_WOOL_PLACE("block.wool.place"), + BLOCK_WOOL_STEP("block.wool.step"), ENCHANT_THORNS_HIT("enchant.thorns.hit"), - ENTITY_ARMORSTAND_BREAK("entity.armorstand.break"), - ENTITY_ARMORSTAND_FALL("entity.armorstand.fall"), - ENTITY_ARMORSTAND_HIT("entity.armorstand.hit"), - ENTITY_ARMORSTAND_PLACE("entity.armorstand.place"), + ENTITY_ARMOR_STAND_BREAK("entity.armor_stand.break"), + ENTITY_ARMOR_STAND_FALL("entity.armor_stand.fall"), + ENTITY_ARMOR_STAND_HIT("entity.armor_stand.hit"), + ENTITY_ARMOR_STAND_PLACE("entity.armor_stand.place"), ENTITY_ARROW_HIT("entity.arrow.hit"), ENTITY_ARROW_HIT_PLAYER("entity.arrow.hit_player"), ENTITY_ARROW_SHOOT("entity.arrow.shoot"), @@ -161,9 +192,6 @@ public enum CraftSound { ENTITY_BLAZE_SHOOT("entity.blaze.shoot"), ENTITY_BOAT_PADDLE_LAND("entity.boat.paddle_land"), ENTITY_BOAT_PADDLE_WATER("entity.boat.paddle_water"), - ENTITY_BOBBER_RETRIEVE("entity.bobber.retrieve"), - ENTITY_BOBBER_SPLASH("entity.bobber.splash"), - ENTITY_BOBBER_THROW("entity.bobber.throw"), ENTITY_CAT_AMBIENT("entity.cat.ambient"), ENTITY_CAT_DEATH("entity.cat.death"), ENTITY_CAT_HISS("entity.cat.hiss"), @@ -175,6 +203,10 @@ public enum CraftSound { ENTITY_CHICKEN_EGG("entity.chicken.egg"), ENTITY_CHICKEN_HURT("entity.chicken.hurt"), ENTITY_CHICKEN_STEP("entity.chicken.step"), + ENTITY_COD_AMBIENT("entity.cod.ambient"), + ENTITY_COD_DEATH("entity.cod.death"), + ENTITY_COD_FLOP("entity.cod.flop"), + ENTITY_COD_HURT("entity.cod.hurt"), ENTITY_COW_AMBIENT("entity.cow.ambient"), ENTITY_COW_DEATH("entity.cow.death"), ENTITY_COW_HURT("entity.cow.hurt"), @@ -183,11 +215,31 @@ public enum CraftSound { ENTITY_CREEPER_DEATH("entity.creeper.death"), ENTITY_CREEPER_HURT("entity.creeper.hurt"), ENTITY_CREEPER_PRIMED("entity.creeper.primed"), + ENTITY_DOLPHIN_AMBIENT("entity.dolphin.ambient"), + ENTITY_DOLPHIN_AMBIENT_WATER("entity.dolphin.ambient_water"), + ENTITY_DOLPHIN_ATTACK("entity.dolphin.attack"), + ENTITY_DOLPHIN_DEATH("entity.dolphin.death"), + ENTITY_DOLPHIN_EAT("entity.dolphin.eat"), + ENTITY_DOLPHIN_HURT("entity.dolphin.hurt"), + ENTITY_DOLPHIN_JUMP("entity.dolphin.jump"), + ENTITY_DOLPHIN_PLAY("entity.dolphin.play"), + ENTITY_DOLPHIN_SPLASH("entity.dolphin.splash"), + ENTITY_DOLPHIN_SWIM("entity.dolphin.swim"), ENTITY_DONKEY_AMBIENT("entity.donkey.ambient"), ENTITY_DONKEY_ANGRY("entity.donkey.angry"), ENTITY_DONKEY_CHEST("entity.donkey.chest"), ENTITY_DONKEY_DEATH("entity.donkey.death"), ENTITY_DONKEY_HURT("entity.donkey.hurt"), + ENTITY_DRAGON_FIREBALL_EXPLODE("entity.dragon_fireball.explode"), + ENTITY_DROWNED_AMBIENT("entity.drowned.ambient"), + ENTITY_DROWNED_AMBIENT_WATER("entity.drowned.ambient_water"), + ENTITY_DROWNED_DEATH("entity.drowned.death"), + ENTITY_DROWNED_DEATH_WATER("entity.drowned.death_water"), + ENTITY_DROWNED_HURT("entity.drowned.hurt"), + ENTITY_DROWNED_HURT_WATER("entity.drowned.hurt_water"), + ENTITY_DROWNED_SHOOT("entity.drowned.shoot"), + ENTITY_DROWNED_STEP("entity.drowned.step"), + ENTITY_DROWNED_SWIM("entity.drowned.swim"), ENTITY_EGG_THROW("entity.egg.throw"), ENTITY_ELDER_GUARDIAN_AMBIENT("entity.elder_guardian.ambient"), ENTITY_ELDER_GUARDIAN_AMBIENT_LAND("entity.elder_guardian.ambient_land"), @@ -197,44 +249,47 @@ public enum CraftSound { ENTITY_ELDER_GUARDIAN_FLOP("entity.elder_guardian.flop"), ENTITY_ELDER_GUARDIAN_HURT("entity.elder_guardian.hurt"), ENTITY_ELDER_GUARDIAN_HURT_LAND("entity.elder_guardian.hurt_land"), - ENTITY_ENDERDRAGON_AMBIENT("entity.enderdragon.ambient"), - ENTITY_ENDERDRAGON_DEATH("entity.enderdragon.death"), - ENTITY_ENDERDRAGON_FIREBALL_EXPLODE("entity.enderdragon_fireball.explode"), - ENTITY_ENDERDRAGON_FLAP("entity.enderdragon.flap"), - ENTITY_ENDERDRAGON_GROWL("entity.enderdragon.growl"), - ENTITY_ENDERDRAGON_HURT("entity.enderdragon.hurt"), - ENTITY_ENDERDRAGON_SHOOT("entity.enderdragon.shoot"), - ENTITY_ENDEREYE_DEATH("entity.endereye.death"), - ENTITY_ENDEREYE_LAUNCH("entity.endereye.launch"), - ENTITY_ENDERMEN_AMBIENT("entity.endermen.ambient"), - ENTITY_ENDERMEN_DEATH("entity.endermen.death"), - ENTITY_ENDERMEN_HURT("entity.endermen.hurt"), - ENTITY_ENDERMEN_SCREAM("entity.endermen.scream"), - ENTITY_ENDERMEN_STARE("entity.endermen.stare"), - ENTITY_ENDERMEN_TELEPORT("entity.endermen.teleport"), + ENTITY_ENDERMAN_AMBIENT("entity.enderman.ambient"), + ENTITY_ENDERMAN_DEATH("entity.enderman.death"), + ENTITY_ENDERMAN_HURT("entity.enderman.hurt"), + ENTITY_ENDERMAN_SCREAM("entity.enderman.scream"), + ENTITY_ENDERMAN_STARE("entity.enderman.stare"), + ENTITY_ENDERMAN_TELEPORT("entity.enderman.teleport"), ENTITY_ENDERMITE_AMBIENT("entity.endermite.ambient"), ENTITY_ENDERMITE_DEATH("entity.endermite.death"), ENTITY_ENDERMITE_HURT("entity.endermite.hurt"), ENTITY_ENDERMITE_STEP("entity.endermite.step"), - ENTITY_ENDERPEARL_THROW("entity.enderpearl.throw"), - ENTITY_EVOCATION_FANGS_ATTACK("entity.evocation_fangs.attack"), - ENTITY_EVOCATION_ILLAGER_AMBIENT("entity.evocation_illager.ambient"), - ENTITY_EVOCATION_ILLAGER_CAST_SPELL("entity.evocation_illager.cast_spell"), - ENTITY_EVOCATION_ILLAGER_DEATH("entity.evocation_illager.death"), - ENTITY_EVOCATION_ILLAGER_HURT("entity.evocation_illager.hurt"), - ENTITY_EVOCATION_ILLAGER_PREPARE_ATTACK("entity.evocation_illager.prepare_attack"), - ENTITY_EVOCATION_ILLAGER_PREPARE_SUMMON("entity.evocation_illager.prepare_summon"), - ENTITY_EVOCATION_ILLAGER_PREPARE_WOLOLO("entity.evocation_illager.prepare_wololo"), + ENTITY_ENDER_DRAGON_AMBIENT("entity.ender_dragon.ambient"), + ENTITY_ENDER_DRAGON_DEATH("entity.ender_dragon.death"), + ENTITY_ENDER_DRAGON_FLAP("entity.ender_dragon.flap"), + ENTITY_ENDER_DRAGON_GROWL("entity.ender_dragon.growl"), + ENTITY_ENDER_DRAGON_HURT("entity.ender_dragon.hurt"), + ENTITY_ENDER_DRAGON_SHOOT("entity.ender_dragon.shoot"), + ENTITY_ENDER_EYE_DEATH("entity.ender_eye.death"), + ENTITY_ENDER_EYE_LAUNCH("entity.ender_eye.launch"), + ENTITY_ENDER_PEARL_THROW("entity.ender_pearl.throw"), + ENTITY_EVOKER_AMBIENT("entity.evoker.ambient"), + ENTITY_EVOKER_CAST_SPELL("entity.evoker.cast_spell"), + ENTITY_EVOKER_DEATH("entity.evoker.death"), + ENTITY_EVOKER_FANGS_ATTACK("entity.evoker_fangs.attack"), + ENTITY_EVOKER_HURT("entity.evoker.hurt"), + ENTITY_EVOKER_PREPARE_ATTACK("entity.evoker.prepare_attack"), + ENTITY_EVOKER_PREPARE_SUMMON("entity.evoker.prepare_summon"), + ENTITY_EVOKER_PREPARE_WOLOLO("entity.evoker.prepare_wololo"), ENTITY_EXPERIENCE_BOTTLE_THROW("entity.experience_bottle.throw"), ENTITY_EXPERIENCE_ORB_PICKUP("entity.experience_orb.pickup"), - ENTITY_FIREWORK_BLAST("entity.firework.blast"), - ENTITY_FIREWORK_BLAST_FAR("entity.firework.blast_far"), - ENTITY_FIREWORK_LARGE_BLAST("entity.firework.large_blast"), - ENTITY_FIREWORK_LARGE_BLAST_FAR("entity.firework.large_blast_far"), - ENTITY_FIREWORK_LAUNCH("entity.firework.launch"), - ENTITY_FIREWORK_SHOOT("entity.firework.shoot"), - ENTITY_FIREWORK_TWINKLE("entity.firework.twinkle"), - ENTITY_FIREWORK_TWINKLE_FAR("entity.firework.twinkle_far"), + ENTITY_FIREWORK_ROCKET_BLAST("entity.firework_rocket.blast"), + ENTITY_FIREWORK_ROCKET_BLAST_FAR("entity.firework_rocket.blast_far"), + ENTITY_FIREWORK_ROCKET_LARGE_BLAST("entity.firework_rocket.large_blast"), + ENTITY_FIREWORK_ROCKET_LARGE_BLAST_FAR("entity.firework_rocket.large_blast_far"), + ENTITY_FIREWORK_ROCKET_LAUNCH("entity.firework_rocket.launch"), + ENTITY_FIREWORK_ROCKET_SHOOT("entity.firework_rocket.shoot"), + ENTITY_FIREWORK_ROCKET_TWINKLE("entity.firework_rocket.twinkle"), + ENTITY_FIREWORK_ROCKET_TWINKLE_FAR("entity.firework_rocket.twinkle_far"), + ENTITY_FISHING_BOBBER_RETRIEVE("entity.fishing_bobber.retrieve"), + ENTITY_FISHING_BOBBER_SPLASH("entity.fishing_bobber.splash"), + ENTITY_FISHING_BOBBER_THROW("entity.fishing_bobber.throw"), + ENTITY_FISH_SWIM("entity.fish.swim"), ENTITY_GENERIC_BIG_FALL("entity.generic.big_fall"), ENTITY_GENERIC_BURN("entity.generic.burn"), ENTITY_GENERIC_DEATH("entity.generic.death"), @@ -280,32 +335,33 @@ public enum CraftSound { ENTITY_HOSTILE_SPLASH("entity.hostile.splash"), ENTITY_HOSTILE_SWIM("entity.hostile.swim"), ENTITY_HUSK_AMBIENT("entity.husk.ambient"), + ENTITY_HUSK_CONVERTED_TO_ZOMBIE("entity.husk.converted_to_zombie"), ENTITY_HUSK_DEATH("entity.husk.death"), ENTITY_HUSK_HURT("entity.husk.hurt"), ENTITY_HUSK_STEP("entity.husk.step"), - ENTITY_ILLUSION_ILLAGER_AMBIENT("entity.illusion_illager.ambient"), - ENTITY_ILLUSION_ILLAGER_CAST_SPELL("entity.illusion_illager.cast_spell"), - ENTITY_ILLUSION_ILLAGER_DEATH("entity.illusion_illager.death"), - ENTITY_ILLUSION_ILLAGER_HURT("entity.illusion_illager.hurt"), - ENTITY_ILLUSION_ILLAGER_MIRROR_MOVE("entity.illusion_illager.mirror_move"), - ENTITY_ILLUSION_ILLAGER_PREPARE_BLINDNESS("entity.illusion_illager.prepare_blindness"), - ENTITY_ILLUSION_ILLAGER_PREPARE_MIRROR("entity.illusion_illager.prepare_mirror"), - ENTITY_IRONGOLEM_ATTACK("entity.irongolem.attack"), - ENTITY_IRONGOLEM_DEATH("entity.irongolem.death"), - ENTITY_IRONGOLEM_HURT("entity.irongolem.hurt"), - ENTITY_IRONGOLEM_STEP("entity.irongolem.step"), - ENTITY_ITEMFRAME_ADD_ITEM("entity.itemframe.add_item"), - ENTITY_ITEMFRAME_BREAK("entity.itemframe.break"), - ENTITY_ITEMFRAME_PLACE("entity.itemframe.place"), - ENTITY_ITEMFRAME_REMOVE_ITEM("entity.itemframe.remove_item"), - ENTITY_ITEMFRAME_ROTATE_ITEM("entity.itemframe.rotate_item"), + ENTITY_ILLUSIONER_AMBIENT("entity.illusioner.ambient"), + ENTITY_ILLUSIONER_CAST_SPELL("entity.illusioner.cast_spell"), + ENTITY_ILLUSIONER_DEATH("entity.illusioner.death"), + ENTITY_ILLUSIONER_HURT("entity.illusioner.hurt"), + ENTITY_ILLUSIONER_MIRROR_MOVE("entity.illusioner.mirror_move"), + ENTITY_ILLUSIONER_PREPARE_BLINDNESS("entity.illusioner.prepare_blindness"), + ENTITY_ILLUSIONER_PREPARE_MIRROR("entity.illusioner.prepare_mirror"), + ENTITY_IRON_GOLEM_ATTACK("entity.iron_golem.attack"), + ENTITY_IRON_GOLEM_DEATH("entity.iron_golem.death"), + ENTITY_IRON_GOLEM_HURT("entity.iron_golem.hurt"), + ENTITY_IRON_GOLEM_STEP("entity.iron_golem.step"), ENTITY_ITEM_BREAK("entity.item.break"), + ENTITY_ITEM_FRAME_ADD_ITEM("entity.item_frame.add_item"), + ENTITY_ITEM_FRAME_BREAK("entity.item_frame.break"), + ENTITY_ITEM_FRAME_PLACE("entity.item_frame.place"), + ENTITY_ITEM_FRAME_REMOVE_ITEM("entity.item_frame.remove_item"), + ENTITY_ITEM_FRAME_ROTATE_ITEM("entity.item_frame.rotate_item"), ENTITY_ITEM_PICKUP("entity.item.pickup"), - ENTITY_LEASHKNOT_BREAK("entity.leashknot.break"), - ENTITY_LEASHKNOT_PLACE("entity.leashknot.place"), - ENTITY_LIGHTNING_IMPACT("entity.lightning.impact"), - ENTITY_LIGHTNING_THUNDER("entity.lightning.thunder"), - ENTITY_LINGERINGPOTION_THROW("entity.lingeringpotion.throw"), + ENTITY_LEASH_KNOT_BREAK("entity.leash_knot.break"), + ENTITY_LEASH_KNOT_PLACE("entity.leash_knot.place"), + ENTITY_LIGHTNING_BOLT_IMPACT("entity.lightning_bolt.impact"), + ENTITY_LIGHTNING_BOLT_THUNDER("entity.lightning_bolt.thunder"), + ENTITY_LINGERING_POTION_THROW("entity.lingering_potion.throw"), ENTITY_LLAMA_AMBIENT("entity.llama.ambient"), ENTITY_LLAMA_ANGRY("entity.llama.angry"), ENTITY_LLAMA_CHEST("entity.llama.chest"), @@ -315,10 +371,13 @@ public enum CraftSound { ENTITY_LLAMA_SPIT("entity.llama.spit"), ENTITY_LLAMA_STEP("entity.llama.step"), ENTITY_LLAMA_SWAG("entity.llama.swag"), - ENTITY_MAGMACUBE_DEATH("entity.magmacube.death"), - ENTITY_MAGMACUBE_HURT("entity.magmacube.hurt"), - ENTITY_MAGMACUBE_JUMP("entity.magmacube.jump"), - ENTITY_MAGMACUBE_SQUISH("entity.magmacube.squish"), + ENTITY_MAGMA_CUBE_DEATH("entity.magma_cube.death"), + ENTITY_MAGMA_CUBE_DEATH_SMALL("entity.magma_cube.death_small"), + ENTITY_MAGMA_CUBE_HURT("entity.magma_cube.hurt"), + ENTITY_MAGMA_CUBE_HURT_SMALL("entity.magma_cube.hurt_small"), + ENTITY_MAGMA_CUBE_JUMP("entity.magma_cube.jump"), + ENTITY_MAGMA_CUBE_SQUISH("entity.magma_cube.squish"), + ENTITY_MAGMA_CUBE_SQUISH_SMALL("entity.magma_cube.squish_small"), ENTITY_MINECART_INSIDE("entity.minecart.inside"), ENTITY_MINECART_RIDING("entity.minecart.riding"), ENTITY_MOOSHROOM_SHEAR("entity.mooshroom.shear"), @@ -335,15 +394,17 @@ public enum CraftSound { ENTITY_PARROT_HURT("entity.parrot.hurt"), ENTITY_PARROT_IMITATE_BLAZE("entity.parrot.imitate.blaze"), ENTITY_PARROT_IMITATE_CREEPER("entity.parrot.imitate.creeper"), + ENTITY_PARROT_IMITATE_DROWNED("entity.parrot.imitate.drowned"), ENTITY_PARROT_IMITATE_ELDER_GUARDIAN("entity.parrot.imitate.elder_guardian"), - ENTITY_PARROT_IMITATE_ENDERDRAGON("entity.parrot.imitate.enderdragon"), ENTITY_PARROT_IMITATE_ENDERMAN("entity.parrot.imitate.enderman"), ENTITY_PARROT_IMITATE_ENDERMITE("entity.parrot.imitate.endermite"), - ENTITY_PARROT_IMITATE_EVOCATION_ILLAGER("entity.parrot.imitate.evocation_illager"), + ENTITY_PARROT_IMITATE_ENDER_DRAGON("entity.parrot.imitate.ender_dragon"), + ENTITY_PARROT_IMITATE_EVOKER("entity.parrot.imitate.evoker"), ENTITY_PARROT_IMITATE_GHAST("entity.parrot.imitate.ghast"), ENTITY_PARROT_IMITATE_HUSK("entity.parrot.imitate.husk"), - ENTITY_PARROT_IMITATE_ILLUSION_ILLAGER("entity.parrot.imitate.illusion_illager"), - ENTITY_PARROT_IMITATE_MAGMACUBE("entity.parrot.imitate.magmacube"), + ENTITY_PARROT_IMITATE_ILLUSIONER("entity.parrot.imitate.illusioner"), + ENTITY_PARROT_IMITATE_MAGMA_CUBE("entity.parrot.imitate.magma_cube"), + ENTITY_PARROT_IMITATE_PHANTOM("entity.parrot.imitate.phantom"), ENTITY_PARROT_IMITATE_POLAR_BEAR("entity.parrot.imitate.polar_bear"), ENTITY_PARROT_IMITATE_SHULKER("entity.parrot.imitate.shulker"), ENTITY_PARROT_IMITATE_SILVERFISH("entity.parrot.imitate.silverfish"), @@ -352,7 +413,7 @@ public enum CraftSound { ENTITY_PARROT_IMITATE_SPIDER("entity.parrot.imitate.spider"), ENTITY_PARROT_IMITATE_STRAY("entity.parrot.imitate.stray"), ENTITY_PARROT_IMITATE_VEX("entity.parrot.imitate.vex"), - ENTITY_PARROT_IMITATE_VINDICATION_ILLAGER("entity.parrot.imitate.vindication_illager"), + ENTITY_PARROT_IMITATE_VINDICATOR("entity.parrot.imitate.vindicator"), ENTITY_PARROT_IMITATE_WITCH("entity.parrot.imitate.witch"), ENTITY_PARROT_IMITATE_WITHER("entity.parrot.imitate.wither"), ENTITY_PARROT_IMITATE_WITHER_SKELETON("entity.parrot.imitate.wither_skeleton"), @@ -361,6 +422,12 @@ public enum CraftSound { ENTITY_PARROT_IMITATE_ZOMBIE_PIGMAN("entity.parrot.imitate.zombie_pigman"), ENTITY_PARROT_IMITATE_ZOMBIE_VILLAGER("entity.parrot.imitate.zombie_villager"), ENTITY_PARROT_STEP("entity.parrot.step"), + ENTITY_PHANTOM_AMBIENT("entity.phantom.ambient"), + ENTITY_PHANTOM_BITE("entity.phantom.bite"), + ENTITY_PHANTOM_DEATH("entity.phantom.death"), + ENTITY_PHANTOM_FLAP("entity.phantom.flap"), + ENTITY_PHANTOM_HURT("entity.phantom.hurt"), + ENTITY_PHANTOM_SWOOP("entity.phantom.swoop"), ENTITY_PIG_AMBIENT("entity.pig.ambient"), ENTITY_PIG_DEATH("entity.pig.death"), ENTITY_PIG_HURT("entity.pig.hurt"), @@ -382,18 +449,30 @@ public enum CraftSound { ENTITY_PLAYER_LEVELUP("entity.player.levelup"), ENTITY_PLAYER_SMALL_FALL("entity.player.small_fall"), ENTITY_PLAYER_SPLASH("entity.player.splash"), + ENTITY_PLAYER_SPLASH_HIGH_SPEED("entity.player.splash.high_speed"), ENTITY_PLAYER_SWIM("entity.player.swim"), ENTITY_POLAR_BEAR_AMBIENT("entity.polar_bear.ambient"), - ENTITY_POLAR_BEAR_BABY_AMBIENT("entity.polar_bear.baby_ambient"), + ENTITY_POLAR_BEAR_AMBIENT_BABY("entity.polar_bear.ambient_baby"), ENTITY_POLAR_BEAR_DEATH("entity.polar_bear.death"), ENTITY_POLAR_BEAR_HURT("entity.polar_bear.hurt"), ENTITY_POLAR_BEAR_STEP("entity.polar_bear.step"), ENTITY_POLAR_BEAR_WARNING("entity.polar_bear.warning"), + ENTITY_PUFFER_FISH_AMBIENT("entity.puffer_fish.ambient"), + ENTITY_PUFFER_FISH_BLOW_OUT("entity.puffer_fish.blow_out"), + ENTITY_PUFFER_FISH_BLOW_UP("entity.puffer_fish.blow_up"), + ENTITY_PUFFER_FISH_DEATH("entity.puffer_fish.death"), + ENTITY_PUFFER_FISH_FLOP("entity.puffer_fish.flop"), + ENTITY_PUFFER_FISH_HURT("entity.puffer_fish.hurt"), + ENTITY_PUFFER_FISH_STING("entity.puffer_fish.sting"), ENTITY_RABBIT_AMBIENT("entity.rabbit.ambient"), ENTITY_RABBIT_ATTACK("entity.rabbit.attack"), ENTITY_RABBIT_DEATH("entity.rabbit.death"), ENTITY_RABBIT_HURT("entity.rabbit.hurt"), ENTITY_RABBIT_JUMP("entity.rabbit.jump"), + ENTITY_SALMON_AMBIENT("entity.salmon.ambient"), + ENTITY_SALMON_DEATH("entity.salmon.death"), + ENTITY_SALMON_FLOP("entity.salmon.flop"), + ENTITY_SALMON_HURT("entity.salmon.hurt"), ENTITY_SHEEP_AMBIENT("entity.sheep.ambient"), ENTITY_SHEEP_DEATH("entity.sheep.death"), ENTITY_SHEEP_HURT("entity.sheep.hurt"), @@ -416,28 +495,30 @@ public enum CraftSound { ENTITY_SKELETON_AMBIENT("entity.skeleton.ambient"), ENTITY_SKELETON_DEATH("entity.skeleton.death"), ENTITY_SKELETON_HORSE_AMBIENT("entity.skeleton_horse.ambient"), + ENTITY_SKELETON_HORSE_AMBIENT_WATER("entity.skeleton_horse.ambient_water"), ENTITY_SKELETON_HORSE_DEATH("entity.skeleton_horse.death"), + ENTITY_SKELETON_HORSE_GALLOP_WATER("entity.skeleton_horse.gallop_water"), ENTITY_SKELETON_HORSE_HURT("entity.skeleton_horse.hurt"), + ENTITY_SKELETON_HORSE_JUMP_WATER("entity.skeleton_horse.jump_water"), + ENTITY_SKELETON_HORSE_STEP_WATER("entity.skeleton_horse.step_water"), + ENTITY_SKELETON_HORSE_SWIM("entity.skeleton_horse.swim"), ENTITY_SKELETON_HURT("entity.skeleton.hurt"), ENTITY_SKELETON_SHOOT("entity.skeleton.shoot"), ENTITY_SKELETON_STEP("entity.skeleton.step"), ENTITY_SLIME_ATTACK("entity.slime.attack"), ENTITY_SLIME_DEATH("entity.slime.death"), + ENTITY_SLIME_DEATH_SMALL("entity.slime.death_small"), ENTITY_SLIME_HURT("entity.slime.hurt"), + ENTITY_SLIME_HURT_SMALL("entity.slime.hurt_small"), ENTITY_SLIME_JUMP("entity.slime.jump"), + ENTITY_SLIME_JUMP_SMALL("entity.slime.jump_small"), ENTITY_SLIME_SQUISH("entity.slime.squish"), - ENTITY_SMALL_MAGMACUBE_DEATH("entity.small_magmacube.death"), - ENTITY_SMALL_MAGMACUBE_HURT("entity.small_magmacube.hurt"), - ENTITY_SMALL_MAGMACUBE_SQUISH("entity.small_magmacube.squish"), - ENTITY_SMALL_SLIME_DEATH("entity.small_slime.death"), - ENTITY_SMALL_SLIME_HURT("entity.small_slime.hurt"), - ENTITY_SMALL_SLIME_JUMP("entity.small_slime.jump"), - ENTITY_SMALL_SLIME_SQUISH("entity.small_slime.squish"), + ENTITY_SLIME_SQUISH_SMALL("entity.slime.squish_small"), ENTITY_SNOWBALL_THROW("entity.snowball.throw"), - ENTITY_SNOWMAN_AMBIENT("entity.snowman.ambient"), - ENTITY_SNOWMAN_DEATH("entity.snowman.death"), - ENTITY_SNOWMAN_HURT("entity.snowman.hurt"), - ENTITY_SNOWMAN_SHOOT("entity.snowman.shoot"), + ENTITY_SNOW_GOLEM_AMBIENT("entity.snow_golem.ambient"), + ENTITY_SNOW_GOLEM_DEATH("entity.snow_golem.death"), + ENTITY_SNOW_GOLEM_HURT("entity.snow_golem.hurt"), + ENTITY_SNOW_GOLEM_SHOOT("entity.snow_golem.shoot"), ENTITY_SPIDER_AMBIENT("entity.spider.ambient"), ENTITY_SPIDER_DEATH("entity.spider.death"), ENTITY_SPIDER_HURT("entity.spider.hurt"), @@ -447,11 +528,28 @@ public enum CraftSound { ENTITY_SQUID_AMBIENT("entity.squid.ambient"), ENTITY_SQUID_DEATH("entity.squid.death"), ENTITY_SQUID_HURT("entity.squid.hurt"), + ENTITY_SQUID_SQUIRT("entity.squid.squirt"), ENTITY_STRAY_AMBIENT("entity.stray.ambient"), ENTITY_STRAY_DEATH("entity.stray.death"), ENTITY_STRAY_HURT("entity.stray.hurt"), ENTITY_STRAY_STEP("entity.stray.step"), ENTITY_TNT_PRIMED("entity.tnt.primed"), + ENTITY_TROPICAL_FISH_AMBIENT("entity.tropical_fish.ambient"), + ENTITY_TROPICAL_FISH_DEATH("entity.tropical_fish.death"), + ENTITY_TROPICAL_FISH_FLOP("entity.tropical_fish.flop"), + ENTITY_TROPICAL_FISH_HURT("entity.tropical_fish.hurt"), + ENTITY_TURTLE_AMBIENT_LAND("entity.turtle.ambient_land"), + ENTITY_TURTLE_DEATH("entity.turtle.death"), + ENTITY_TURTLE_DEATH_BABY("entity.turtle.death_baby"), + ENTITY_TURTLE_EGG_BREAK("entity.turtle.egg_break"), + ENTITY_TURTLE_EGG_CRACK("entity.turtle.egg_crack"), + ENTITY_TURTLE_EGG_HATCH("entity.turtle.egg_hatch"), + ENTITY_TURTLE_HURT("entity.turtle.hurt"), + ENTITY_TURTLE_HURT_BABY("entity.turtle.hurt_baby"), + ENTITY_TURTLE_LAY_EGG("entity.turtle.lay_egg"), + ENTITY_TURTLE_SHAMBLE("entity.turtle.shamble"), + ENTITY_TURTLE_SHAMBLE_BABY("entity.turtle.shamble_baby"), + ENTITY_TURTLE_SWIM("entity.turtle.swim"), ENTITY_VEX_AMBIENT("entity.vex.ambient"), ENTITY_VEX_CHARGE("entity.vex.charge"), ENTITY_VEX_DEATH("entity.vex.death"), @@ -460,11 +558,11 @@ public enum CraftSound { ENTITY_VILLAGER_DEATH("entity.villager.death"), ENTITY_VILLAGER_HURT("entity.villager.hurt"), ENTITY_VILLAGER_NO("entity.villager.no"), - ENTITY_VILLAGER_TRADING("entity.villager.trading"), + ENTITY_VILLAGER_TRADE("entity.villager.trade"), ENTITY_VILLAGER_YES("entity.villager.yes"), - ENTITY_VINDICATION_ILLAGER_AMBIENT("entity.vindication_illager.ambient"), - ENTITY_VINDICATION_ILLAGER_DEATH("entity.vindication_illager.death"), - ENTITY_VINDICATION_ILLAGER_HURT("entity.vindication_illager.hurt"), + ENTITY_VINDICATOR_AMBIENT("entity.vindicator.ambient"), + ENTITY_VINDICATOR_DEATH("entity.vindicator.death"), + ENTITY_VINDICATOR_HURT("entity.vindicator.hurt"), ENTITY_WITCH_AMBIENT("entity.witch.ambient"), ENTITY_WITCH_DEATH("entity.witch.death"), ENTITY_WITCH_DRINK("entity.witch.drink"), @@ -490,19 +588,21 @@ public enum CraftSound { ENTITY_WOLF_STEP("entity.wolf.step"), ENTITY_WOLF_WHINE("entity.wolf.whine"), ENTITY_ZOMBIE_AMBIENT("entity.zombie.ambient"), - ENTITY_ZOMBIE_ATTACK_DOOR_WOOD("entity.zombie.attack_door_wood"), ENTITY_ZOMBIE_ATTACK_IRON_DOOR("entity.zombie.attack_iron_door"), - ENTITY_ZOMBIE_BREAK_DOOR_WOOD("entity.zombie.break_door_wood"), + ENTITY_ZOMBIE_ATTACK_WOODEN_DOOR("entity.zombie.attack_wooden_door"), + ENTITY_ZOMBIE_BREAK_WOODEN_DOOR("entity.zombie.break_wooden_door"), + ENTITY_ZOMBIE_CONVERTED_TO_DROWNED("entity.zombie.converted_to_drowned"), ENTITY_ZOMBIE_DEATH("entity.zombie.death"), + ENTITY_ZOMBIE_DESTROY_EGG("entity.zombie.destroy_egg"), ENTITY_ZOMBIE_HORSE_AMBIENT("entity.zombie_horse.ambient"), ENTITY_ZOMBIE_HORSE_DEATH("entity.zombie_horse.death"), ENTITY_ZOMBIE_HORSE_HURT("entity.zombie_horse.hurt"), ENTITY_ZOMBIE_HURT("entity.zombie.hurt"), ENTITY_ZOMBIE_INFECT("entity.zombie.infect"), - ENTITY_ZOMBIE_PIG_AMBIENT("entity.zombie_pig.ambient"), - ENTITY_ZOMBIE_PIG_ANGRY("entity.zombie_pig.angry"), - ENTITY_ZOMBIE_PIG_DEATH("entity.zombie_pig.death"), - ENTITY_ZOMBIE_PIG_HURT("entity.zombie_pig.hurt"), + ENTITY_ZOMBIE_PIGMAN_AMBIENT("entity.zombie_pigman.ambient"), + ENTITY_ZOMBIE_PIGMAN_ANGRY("entity.zombie_pigman.angry"), + ENTITY_ZOMBIE_PIGMAN_DEATH("entity.zombie_pigman.death"), + ENTITY_ZOMBIE_PIGMAN_HURT("entity.zombie_pigman.hurt"), ENTITY_ZOMBIE_STEP("entity.zombie.step"), ENTITY_ZOMBIE_VILLAGER_AMBIENT("entity.zombie_villager.ambient"), ENTITY_ZOMBIE_VILLAGER_CONVERTED("entity.zombie_villager.converted"), @@ -517,12 +617,16 @@ public enum CraftSound { ITEM_ARMOR_EQUIP_GOLD("item.armor.equip_gold"), ITEM_ARMOR_EQUIP_IRON("item.armor.equip_iron"), ITEM_ARMOR_EQUIP_LEATHER("item.armor.equip_leather"), + ITEM_ARMOR_EQUIP_TURTLE("item.armor.equip_turtle"), + ITEM_AXE_STRIP("item.axe.strip"), ITEM_BOTTLE_EMPTY("item.bottle.empty"), ITEM_BOTTLE_FILL("item.bottle.fill"), ITEM_BOTTLE_FILL_DRAGONBREATH("item.bottle.fill_dragonbreath"), ITEM_BUCKET_EMPTY("item.bucket.empty"), + ITEM_BUCKET_EMPTY_FISH("item.bucket.empty_fish"), ITEM_BUCKET_EMPTY_LAVA("item.bucket.empty_lava"), ITEM_BUCKET_FILL("item.bucket.fill"), + ITEM_BUCKET_FILL_FISH("item.bucket.fill_fish"), ITEM_BUCKET_FILL_LAVA("item.bucket.fill_lava"), ITEM_CHORUS_FRUIT_TELEPORT("item.chorus_fruit.teleport"), ITEM_ELYTRA_FLYING("item.elytra.flying"), @@ -533,25 +637,34 @@ public enum CraftSound { ITEM_SHIELD_BREAK("item.shield.break"), ITEM_SHOVEL_FLATTEN("item.shovel.flatten"), ITEM_TOTEM_USE("item.totem.use"), + ITEM_TRIDENT_HIT("item.trident.hit"), + ITEM_TRIDENT_HIT_GROUND("item.trident.hit_ground"), + ITEM_TRIDENT_RETURN("item.trident.return"), + ITEM_TRIDENT_RIPTIDE_1("item.trident.riptide_1"), + ITEM_TRIDENT_RIPTIDE_2("item.trident.riptide_2"), + ITEM_TRIDENT_RIPTIDE_3("item.trident.riptide_3"), + ITEM_TRIDENT_THROW("item.trident.throw"), + ITEM_TRIDENT_THUNDER("item.trident.thunder"), MUSIC_CREATIVE("music.creative"), MUSIC_CREDITS("music.credits"), + MUSIC_DISC_11("music_disc.11"), + MUSIC_DISC_13("music_disc.13"), + MUSIC_DISC_BLOCKS("music_disc.blocks"), + MUSIC_DISC_CAT("music_disc.cat"), + MUSIC_DISC_CHIRP("music_disc.chirp"), + MUSIC_DISC_FAR("music_disc.far"), + MUSIC_DISC_MALL("music_disc.mall"), + MUSIC_DISC_MELLOHI("music_disc.mellohi"), + MUSIC_DISC_STAL("music_disc.stal"), + MUSIC_DISC_STRAD("music_disc.strad"), + MUSIC_DISC_WAIT("music_disc.wait"), + MUSIC_DISC_WARD("music_disc.ward"), MUSIC_DRAGON("music.dragon"), MUSIC_END("music.end"), MUSIC_GAME("music.game"), MUSIC_MENU("music.menu"), MUSIC_NETHER("music.nether"), - RECORD_11("record.11"), - RECORD_13("record.13"), - RECORD_BLOCKS("record.blocks"), - RECORD_CAT("record.cat"), - RECORD_CHIRP("record.chirp"), - RECORD_FAR("record.far"), - RECORD_MALL("record.mall"), - RECORD_MELLOHI("record.mellohi"), - RECORD_STAL("record.stal"), - RECORD_STRAD("record.strad"), - RECORD_WAIT("record.wait"), - RECORD_WARD("record.ward"), + MUSIC_UNDER_WATER("music.under_water"), UI_BUTTON_CLICK("ui.button.click"), UI_TOAST_CHALLENGE_COMPLETE("ui.toast.challenge_complete"), UI_TOAST_IN("ui.toast.in"), diff --git a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java index 5c069586..b07b3680 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftStatistic.java @@ -1,94 +1,141 @@ package org.bukkit.craftbukkit; -import net.minecraft.server.EntityTypes; -import net.minecraft.server.EntityTypes.MonsterEggInfo; import net.minecraft.server.StatisticList; import org.bukkit.Statistic; import org.bukkit.Material; import org.bukkit.entity.EntityType; -import com.google.common.base.CaseFormat; +import com.google.common.base.Preconditions; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableBiMap; import net.minecraft.server.Block; +import net.minecraft.server.EntityTypes; import net.minecraft.server.Item; import net.minecraft.server.MinecraftKey; +import net.minecraft.server.RegistryMaterials; import org.bukkit.craftbukkit.util.CraftMagicNumbers; -public class CraftStatistic { - private static final BiMap<String, org.bukkit.Statistic> statistics; +public enum CraftStatistic { + DAMAGE_DEALT("damage_dealt"), + DAMAGE_TAKEN("damage_taken"), + DEATHS("deaths"), + MOB_KILLS("mob_kills"), + PLAYER_KILLS("player_kills"), + FISH_CAUGHT("fish_caught"), + ANIMALS_BRED("animals_bred"), + LEAVE_GAME("leave_game"), + JUMP("jump"), + DROP_COUNT("drop"), + DROP("dropped"), + PICKUP("picked_up"), + PLAY_ONE_MINUTE("play_one_minute"), + WALK_ONE_CM("walk_one_cm"), + WALK_ON_WATER_ONE_CM("walk_on_water_one_cm"), + FALL_ONE_CM("fall_one_cm"), + SNEAK_TIME("sneak_time"), + CLIMB_ONE_CM("climb_one_cm"), + FLY_ONE_CM("fly_one_cm"), + WALK_UNDER_WATER_ONE_CM("walk_under_water_one_cm"), + MINECART_ONE_CM("minecart_one_cm"), + BOAT_ONE_CM("boat_one_cm"), + PIG_ONE_CM("pig_one_cm"), + HORSE_ONE_CM("horse_one_cm"), + SPRINT_ONE_CM("sprint_one_cm"), + CROUCH_ONE_CM("crouch_one_cm"), + AVIATE_ONE_CM("aviate_one_cm"), + MINE_BLOCK("mined"), + USE_ITEM("used"), + BREAK_ITEM("broken"), + CRAFT_ITEM("crafted"), + KILL_ENTITY("killed"), + ENTITY_KILLED_BY("killed_by"), + TIME_SINCE_DEATH("time_since_death"), + TALKED_TO_VILLAGER("talked_to_villager"), + TRADED_WITH_VILLAGER("traded_with_villager"), + CAKE_SLICES_EATEN("eat_cake_slice"), + CAULDRON_FILLED("fill_cauldron"), + CAULDRON_USED("use_cauldron"), + ARMOR_CLEANED("clean_armor"), + BANNER_CLEANED("clean_banner"), + BREWINGSTAND_INTERACTION("interact_with_brewingstand"), + BEACON_INTERACTION("interact_with_beacon"), + DROPPER_INSPECTED("inspect_dropper"), + HOPPER_INSPECTED("inspect_hopper"), + DISPENSER_INSPECTED("inspect_dispenser"), + NOTEBLOCK_PLAYED("play_noteblock"), + NOTEBLOCK_TUNED("tune_noteblock"), + FLOWER_POTTED("pot_flower"), + TRAPPED_CHEST_TRIGGERED("trigger_trapped_chest"), + ENDERCHEST_OPENED("open_enderchest"), + ITEM_ENCHANTED("enchant_item"), + RECORD_PLAYED("play_record"), + FURNACE_INTERACTION("interact_with_furnace"), + CRAFTING_TABLE_INTERACTION("interact_with_crafting_table"), + CHEST_OPENED("open_chest"), + SLEEP_IN_BED("sleep_in_bed"), + SHULKER_BOX_OPENED("open_shulker_box"), + TIME_SINCE_REST("time_since_rest"), + SWIM_ONE_CM("swim_one_cm"); + private final MinecraftKey minecraftKey; + private final org.bukkit.Statistic bukkit; + private static final BiMap<MinecraftKey, org.bukkit.Statistic> statistics; static { - ImmutableBiMap.Builder<String, org.bukkit.Statistic> statisticBuilder = ImmutableBiMap.<String, org.bukkit.Statistic>builder(); - for (Statistic statistic : Statistic.values()) { - if (statistic == Statistic.PLAY_ONE_TICK) { - statisticBuilder.put("stat.playOneMinute", statistic); - } else { - statisticBuilder.put("stat." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, statistic.name()), statistic); - } + ImmutableBiMap.Builder<MinecraftKey, org.bukkit.Statistic> statisticBuilder = ImmutableBiMap.builder(); + for (CraftStatistic statistic : CraftStatistic.values()) { + statisticBuilder.put(statistic.minecraftKey, statistic.bukkit); } statistics = statisticBuilder.build(); } - private CraftStatistic() {} + private CraftStatistic(String minecraftKey) { + this.minecraftKey = new MinecraftKey(minecraftKey); - public static org.bukkit.Statistic getBukkitStatistic(net.minecraft.server.Statistic statistic) { - return getBukkitStatisticByName(statistic.name); + this.bukkit = org.bukkit.Statistic.valueOf(this.name()); + Preconditions.checkState(bukkit != null, "Bukkit statistic %s does not exist", this.name()); } - public static org.bukkit.Statistic getBukkitStatisticByName(String name) { - if (name.startsWith("stat.killEntity.")) { - name = "stat.killEntity"; - } - if (name.startsWith("stat.entityKilledBy.")) { - name = "stat.entityKilledBy"; - } - if (name.startsWith("stat.breakItem.")) { - name = "stat.breakItem"; - } - if (name.startsWith("stat.useItem.")) { - name = "stat.useItem"; - } - if (name.startsWith("stat.mineBlock.")) { - name = "stat.mineBlock"; - } - if (name.startsWith("stat.craftItem.")) { - name = "stat.craftItem"; - } - if (name.startsWith("stat.drop.")) { - name = "stat.drop"; - } - if (name.startsWith("stat.pickup.")) { - name = "stat.pickup"; + public static org.bukkit.Statistic getBukkitStatistic(net.minecraft.server.Statistic<?> statistic) { + RegistryMaterials statRegistry = statistic.a().a(); + MinecraftKey nmsKey = StatisticList.REGISTRY.b(statistic.a()); + + if (statRegistry == StatisticList.REGISTRY_CUSTOM) { + nmsKey = (MinecraftKey) statistic.b(); } - return statistics.get(name); + + return statistics.get(nmsKey); } - public static net.minecraft.server.Statistic getNMSStatistic(org.bukkit.Statistic statistic) { - return StatisticList.getStatistic(statistics.inverse().get(statistic)); + public static net.minecraft.server.Statistic getNMSStatistic(org.bukkit.Statistic bukkit) { + Preconditions.checkArgument(bukkit.getType() == Statistic.Type.UNTYPED, "This method only accepts untyped statistics"); + + net.minecraft.server.Statistic<MinecraftKey> nms = StatisticList.CUSTOM.b(statistics.inverse().get(bukkit)); + Preconditions.checkArgument(nms != null, "NMS Statistic %s does not exist", bukkit); + + return nms; } public static net.minecraft.server.Statistic getMaterialStatistic(org.bukkit.Statistic stat, Material material) { try { if (stat == Statistic.MINE_BLOCK) { - return StatisticList.a(CraftMagicNumbers.getBlock(material)); // PAIL: getMineBlockStatistic + return StatisticList.BLOCK_MINED.b(CraftMagicNumbers.getBlock(material)); } if (stat == Statistic.CRAFT_ITEM) { - return StatisticList.a(CraftMagicNumbers.getItem(material)); // PAIL: getCraftItemStatistic + return StatisticList.ITEM_CRAFTED.b(CraftMagicNumbers.getItem(material)); } if (stat == Statistic.USE_ITEM) { - return StatisticList.b(CraftMagicNumbers.getItem(material)); // PAIL: getUseItemStatistic + return StatisticList.ITEM_USED.b(CraftMagicNumbers.getItem(material)); } if (stat == Statistic.BREAK_ITEM) { - return StatisticList.c(CraftMagicNumbers.getItem(material)); // PAIL: getBreakItemStatistic + return StatisticList.ITEM_BROKEN.b(CraftMagicNumbers.getItem(material)); } if (stat == Statistic.PICKUP) { - return StatisticList.d(CraftMagicNumbers.getItem(material)); // PAIL: getPickupStatistic + return StatisticList.ITEM_PICKED_UP.b(CraftMagicNumbers.getItem(material)); } if (stat == Statistic.DROP) { - return StatisticList.e(CraftMagicNumbers.getItem(material)); // PAIL: getDropItemStatistic + return StatisticList.ITEM_DROPPED.b(CraftMagicNumbers.getItem(material)); } } catch (ArrayIndexOutOfBoundsException e) { return null; @@ -97,39 +144,31 @@ public class CraftStatistic { } public static net.minecraft.server.Statistic getEntityStatistic(org.bukkit.Statistic stat, EntityType entity) { - MonsterEggInfo monsteregginfo = (MonsterEggInfo) EntityTypes.eggInfo.get(new MinecraftKey(entity.getName())); + if (entity.getName() != null) { + EntityTypes<?> nmsEntity = EntityTypes.REGISTRY.get(new MinecraftKey(entity.getName())); - if (monsteregginfo != null) { if (stat == org.bukkit.Statistic.KILL_ENTITY) { - return monsteregginfo.killEntityStatistic; + return net.minecraft.server.StatisticList.ENTITY_KILLED.b(nmsEntity); } if (stat == org.bukkit.Statistic.ENTITY_KILLED_BY) { - return monsteregginfo.killedByEntityStatistic; + return net.minecraft.server.StatisticList.ENTITY_KILLED_BY.b(nmsEntity); } } return null; } - public static EntityType getEntityTypeFromStatistic(net.minecraft.server.Statistic statistic) { - String statisticString = statistic.name; - return EntityType.fromName(statisticString.substring(statisticString.lastIndexOf(".") + 1)); + public static EntityType getEntityTypeFromStatistic(net.minecraft.server.Statistic<EntityTypes<?>> statistic) { + MinecraftKey name = EntityTypes.getName(statistic.b()); + return EntityType.fromName(name.getKey()); } - public static Material getMaterialFromStatistic(net.minecraft.server.Statistic statistic) { - String statisticString = statistic.name; - 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)); + public static Material getMaterialFromStatistic(net.minecraft.server.Statistic<?> statistic) { + if (statistic.b() instanceof Item) { + return CraftMagicNumbers.getMaterial((Item) statistic.b()); } - Block block = (Block) Block.REGISTRY.get(new MinecraftKey(val)); - if (block != null) { - return Material.getMaterial(Block.getId(block)); - } - try { - return Material.getMaterial(Integer.parseInt(val)); - } catch (NumberFormatException e) { - return null; + if (statistic.b() instanceof Block) { + return CraftMagicNumbers.getMaterial((Block) statistic.b()); } + return null; } } diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 8f6653f7..162c79e8 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit; import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.Futures; import java.io.File; import java.util.ArrayList; import java.util.Collection; @@ -31,8 +32,10 @@ import org.bukkit.block.Biome; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.block.CraftBlock; import org.bukkit.craftbukkit.block.CraftBlockState; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.entity.*; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.metadata.BlockMetadataStore; @@ -92,11 +95,7 @@ public class CraftWorld implements World { } public Block getBlockAt(int x, int y, int z) { - return getChunkAt(x >> 4, z >> 4).getBlock(x & 0xF, y, z & 0xF); - } - - public int getBlockTypeIdAt(int x, int y, int z) { - return CraftMagicNumbers.getId(world.getType(new BlockPosition(x, y, z)).getBlock()); + return CraftBlock.at(world, new BlockPosition(x, y, z)); } public int getHighestBlockYAt(int x, int z) { @@ -104,7 +103,7 @@ public class CraftWorld implements World { loadChunk(x >> 4, z >> 4); } - return world.getHighestBlockYAt(new BlockPosition(x, 0, z)).getY(); + return world.getHighestBlockYAt(HeightMap.Type.LIGHT_BLOCKING, new BlockPosition(x, 0, z)).getY(); } public Location getSpawnLocation() { @@ -219,7 +218,7 @@ public class CraftWorld implements World { net.minecraft.server.Chunk chunk = null; - chunk = world.getChunkProviderServer().chunkGenerator.getOrCreateChunk(x, z); + chunk = Futures.getUnchecked(world.getChunkProviderServer().generateChunk(x, z)); PlayerChunk playerChunk = world.getPlayerChunkMap().getChunk(x, z); if (playerChunk != null) { playerChunk.chunk = chunk; @@ -229,7 +228,6 @@ public class CraftWorld implements World { world.getChunkProviderServer().chunks.put(chunkKey, chunk); chunk.addEntities(); - chunk.loadNearby(world.getChunkProviderServer(), world.getChunkProviderServer().chunkGenerator, true); refreshChunk(x, z); } @@ -286,7 +284,6 @@ public class CraftWorld implements World { public org.bukkit.entity.Item dropItem(Location loc, ItemStack item) { Validate.notNull(item, "Cannot drop a Null item."); - Validate.isTrue(item.getTypeId() != 0, "Cannot drop AIR."); EntityItem entity = new EntityItem(world, loc.getX(), loc.getY(), loc.getZ(), CraftItemStack.asNMSCopy(item)); entity.pickupDelay = 10; world.addEntity(entity, SpawnReason.CUSTOM); @@ -346,6 +343,8 @@ public class CraftWorld implements World { ((EntityTippedArrow) arrow).setType(CraftPotionUtil.fromBukkit(new PotionData(PotionType.WATER, false, false))); } else if (SpectralArrow.class.isAssignableFrom(clazz)) { arrow = new EntitySpectralArrow(world); + } else if (Trident.class.isAssignableFrom(clazz)){ + arrow = new EntityThrownTrident(world); } else { arrow = new EntityTippedArrow(world); } @@ -390,30 +389,22 @@ public class CraftWorld implements World { gen = new WorldGenTaiga1(); break; case JUNGLE: - IBlockData iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE); - IBlockData iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.JUNGLE).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)); - gen = new WorldGenJungleTree(true, 10, 20, iblockdata1, iblockdata2); // Magic values as in BlockSapling + gen = new WorldGenJungleTree(true, 10, 20, Blocks.JUNGLE_LOG.getBlockData(), Blocks.JUNGLE_LEAVES.getBlockData()); break; case SMALL_JUNGLE: - iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE); - iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.JUNGLE).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)); - gen = new WorldGenTrees(true, 4 + rand.nextInt(7), iblockdata1, iblockdata2, false); + gen = new WorldGenTrees(true, 4 + rand.nextInt(7), Blocks.JUNGLE_LOG.getBlockData(), Blocks.JUNGLE_LEAVES.getBlockData(), false); break; case COCOA_TREE: - iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE); - iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.JUNGLE).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)); - gen = new WorldGenTrees(true, 4 + rand.nextInt(7), iblockdata1, iblockdata2, true); + gen = new WorldGenJungleTree(true, 10, 20, Blocks.JUNGLE_LOG.getBlockData(), Blocks.JUNGLE_LEAVES.getBlockData()); break; case JUNGLE_BUSH: - iblockdata1 = Blocks.LOG.getBlockData().set(BlockLog1.VARIANT, BlockWood.EnumLogVariant.JUNGLE); - iblockdata2 = Blocks.LEAVES.getBlockData().set(BlockLeaves1.VARIANT, BlockWood.EnumLogVariant.OAK).set(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)); - gen = new WorldGenGroundBush(iblockdata1, iblockdata2); + gen = new WorldGenGroundBush(Blocks.JUNGLE_LOG.getBlockData(), Blocks.OAK_LEAVES.getBlockData()); break; case RED_MUSHROOM: - gen = new WorldGenHugeMushroom(Blocks.RED_MUSHROOM_BLOCK); + gen = new WorldGenHugeMushroomRed(); break; case BROWN_MUSHROOM: - gen = new WorldGenHugeMushroom(Blocks.BROWN_MUSHROOM_BLOCK); + gen = new WorldGenHugeMushroomBrown(); break; case SWAMP: gen = new WorldGenSwampTree(); @@ -431,7 +422,7 @@ public class CraftWorld implements World { gen = new WorldGenForest(true, true); break; case CHORUS_PLANT: - BlockChorusFlower.a(world, pos, rand, 8); + ((BlockChorusFlower) Blocks.CHORUS_FLOWER).a(world, pos, rand, 8); return true; case TREE: default: @@ -439,7 +430,7 @@ public class CraftWorld implements World { break; } - return gen.generate(world, rand, pos); + return gen.generate(world, world.worldProvider.getChunkGenerator(), rand, pos, new WorldGenFeatureEmptyConfiguration()); } public boolean generateTree(Location loc, TreeType type, BlockChangeDelegate delegate) { @@ -455,12 +446,10 @@ public class CraftWorld implements World { int z = blockstate.getZ(); BlockPosition position = new BlockPosition(x, y, z); net.minecraft.server.IBlockData oldBlock = world.getType(position); - int typeId = blockstate.getTypeId(); - int data = blockstate.getRawData(); - int flag = ((CraftBlockState)blockstate).getFlag(); - delegate.setTypeIdAndData(x, y, z, typeId, data); + int flag = ((CraftBlockState) blockstate).getFlag(); + delegate.setBlockData(x, y, z, blockstate.getBlockData()); net.minecraft.server.IBlockData newBlock = world.getType(position); - world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, flag); + world.notifyAndUpdatePhysics(position, null, oldBlock, newBlock, newBlock, flag); } world.capturedBlockStates.clear(); return true; @@ -565,10 +554,6 @@ public class CraftWorld implements World { return getBlockAt(location.getBlockX(), location.getBlockY(), location.getBlockZ()); } - public int getBlockTypeIdAt(Location location) { - return getBlockTypeIdAt(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - } - public int getHighestBlockYAt(Location location) { return getHighestBlockYAt(location.getBlockX(), location.getBlockZ()); } @@ -603,8 +588,8 @@ public class CraftWorld implements World { net.minecraft.server.Chunk chunk = this.world.getChunkAtWorldCoords(new BlockPosition(x, 0, z)); if (chunk != null) { - byte[] biomevals = chunk.getBiomeIndex(); - biomevals[((z & 0xF) << 4) | (x & 0xF)] = (byte) BiomeBase.REGISTRY_ID.a(bb); + BiomeBase[] biomevals = chunk.getBiomeIndex(); + biomevals[((z & 0xF) << 4) | (x & 0xF)] = bb; chunk.markDirty(); // SPIGOT-2890 } @@ -881,15 +866,23 @@ public class CraftWorld implements World { Validate.notNull(material, "Material cannot be null"); Validate.isTrue(material.isBlock(), "Material must be a block"); - EntityFallingBlock entity = new EntityFallingBlock(world, location.getX(), location.getY(), location.getZ(), CraftMagicNumbers.getBlock(material).fromLegacyData(data)); + EntityFallingBlock entity = new EntityFallingBlock(world, location.getX(), location.getY(), location.getZ(), CraftMagicNumbers.getBlock(material).getBlockData()); entity.ticksLived = 1; world.addEntity(entity, SpawnReason.CUSTOM); return (FallingBlock) entity.getBukkitEntity(); } - public FallingBlock spawnFallingBlock(Location location, int blockId, byte blockData) throws IllegalArgumentException { - return spawnFallingBlock(location, org.bukkit.Material.getMaterial(blockId), blockData); + @Override + public FallingBlock spawnFallingBlock(Location location, BlockData data) throws IllegalArgumentException { + Validate.notNull(location, "Location cannot be null"); + Validate.notNull(data, "Material cannot be null"); + + EntityFallingBlock entity = new EntityFallingBlock(world, location.getX(), location.getY(), location.getZ(), ((CraftBlockData) data).getState()); + entity.ticksLived = 1; + + world.addEntity(entity, SpawnReason.CUSTOM); + return (FallingBlock) entity.getBukkitEntity(); } @SuppressWarnings("unchecked") @@ -923,6 +916,8 @@ public class CraftWorld implements World { ((EntityTippedArrow) entity).setType(CraftPotionUtil.fromBukkit(new PotionData(PotionType.WATER, false, false))); } else if (SpectralArrow.class.isAssignableFrom(clazz)) { entity = new EntitySpectralArrow(world); + } else if (Trident.class.isAssignableFrom(clazz)) { + entity = new EntityThrownTrident(world); } else { entity = new EntityTippedArrow(world); } @@ -1060,6 +1055,8 @@ public class CraftWorld implements World { entity = new EntityZombieHusk(world); } else if (ZombieVillager.class.isAssignableFrom(clazz)) { entity = new EntityZombieVillager(world); + } else if (Drowned.class.isAssignableFrom(clazz)) { + entity = new EntityDrowned(world); } else { entity = new EntityZombie(world); } @@ -1111,6 +1108,22 @@ public class CraftWorld implements World { } else if (Vindicator.class.isAssignableFrom(clazz)) { entity = new EntityVindicator(world); } + } else if (Turtle.class.isAssignableFrom(clazz)) { + entity = new EntityTurtle(world); + } else if (Phantom.class.isAssignableFrom(clazz)) { + entity = new EntityPhantom(world); + } else if (Fish.class.isAssignableFrom(clazz)) { + if (Cod.class.isAssignableFrom(clazz)) { + entity = new EntityCod(world); + } else if (PufferFish.class.isAssignableFrom(clazz)) { + entity = new EntityPufferFish(world); + } else if (Salmon.class.isAssignableFrom(clazz)) { + entity = new EntitySalmon(world); + } else if (TropicalFish.class.isAssignableFrom(clazz)) { + entity = new EntityTropicalFish(world); + } + } else if (Dolphin.class.isAssignableFrom(clazz)) { + entity = new EntityDolphin(world); } if (entity != null) { @@ -1118,7 +1131,6 @@ public class CraftWorld implements World { entity.setHeadRotation(yaw); // SPIGOT-3587 } } else if (Hanging.class.isAssignableFrom(clazz)) { - Block block = getBlockAt(location); BlockFace face = BlockFace.SELF; int width = 16; // 1 full block, also painting smallest size. @@ -1135,8 +1147,8 @@ public class CraftWorld implements World { BlockFace[] faces = new BlockFace[]{BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH}; final BlockPosition pos = new BlockPosition((int) x, (int) y, (int) z); for (BlockFace dir : faces) { - net.minecraft.server.Block nmsBlock = CraftMagicNumbers.getBlock(block.getRelative(dir)); - if (nmsBlock.getBlockData().getMaterial().isBuildable() || BlockDiodeAbstract.isDiode(nmsBlock.getBlockData())) { + IBlockData nmsBlock = world.getType(pos.shift(CraftBlock.blockFaceToNotch(dir))); + if (nmsBlock.getMaterial().isBuildable() || BlockDiodeAbstract.isDiode(nmsBlock)) { boolean taken = false; AxisAlignedBB bb = EntityHanging.calculateBoundingBox(null, pos, CraftBlock.blockFaceToNotch(dir).opposite(), width, height); List<net.minecraft.server.Entity> list = (List<net.minecraft.server.Entity>) world.getEntities(null, bb); @@ -1207,7 +1219,7 @@ public class CraftWorld implements World { Preconditions.checkArgument(entity != null, "Cannot spawn null entity"); if (entity instanceof EntityInsentient) { - ((EntityInsentient) entity).prepare(getHandle().D(new BlockPosition(entity)), (GroupDataEntity) null); + ((EntityInsentient) entity).prepare(getHandle().getDamageScaler(new BlockPosition(entity)), (GroupDataEntity) null, null); } if (function != null) { @@ -1428,12 +1440,18 @@ public class CraftWorld implements World { double y = loc.getY(); double z = loc.getZ(); - PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(sound, SoundCategory.valueOf(category.name()), x, y, z, volume, pitch); + PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(new MinecraftKey(sound), SoundCategory.valueOf(category.name()), new Vec3D(x, y, z), volume, pitch); world.getMinecraftServer().getPlayerList().sendPacketNearby(null, x, y, z, volume > 1.0F ? 16.0F * volume : 16.0D, this.world.dimension, packet); } public String getGameRuleValue(String rule) { - return getHandle().getGameRules().get(rule); + // In method contract for some reason + if (rule == null) { + return null; + } + + GameRules.GameRuleValue value = getHandle().getGameRules().get(rule); + return value != null ? value.a() : ""; } public boolean setGameRuleValue(String rule, String value) { @@ -1442,16 +1460,16 @@ public class CraftWorld implements World { if (!isGameRule(rule)) return false; - getHandle().getGameRules().set(rule, value); + getHandle().getGameRules().set(rule, value, getHandle().getMinecraftServer()); return true; } public String[] getGameRules() { - return getHandle().getGameRules().getGameRules(); + return GameRules.getGameRules().keySet().toArray(new String[GameRules.getGameRules().size()]); } public boolean isGameRule(String rule) { - return getHandle().getGameRules().contains(rule); + return GameRules.getGameRules().containsKey(rule); } @Override @@ -1525,14 +1543,11 @@ public class CraftWorld implements World { } getHandle().sendParticles( null, // Sender - CraftParticle.toNMS(particle), // Particle - true, // Extended range + CraftParticle.toNMS(particle, data), // Particle x, y, z, // Position count, // Count offsetX, offsetY, offsetZ, // Random offset - extra, // Speed? - CraftParticle.toData(particle, data) - + extra // Speed? ); } diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java index f4e1ca79..e8bf55e8 100644 --- a/src/main/java/org/bukkit/craftbukkit/Main.java +++ b/src/main/java/org/bukkit/craftbukkit/Main.java @@ -145,6 +145,12 @@ public class Main { return; } + float javaVersion = Float.parseFloat(System.getProperty("java.class.version")); + if (javaVersion > 55.0) { + System.err.println("Unsupported Java detected (" + javaVersion + "). Only up to Java 11 is supported."); + return; + } + try { // This trick bypasses Maven Shade's clever rewriting of our getProperty call when using String literals String jline_UnsupportedTerminal = new String(new char[] {'j','l','i','n','e','.','U','n','s','u','p','p','o','r','t','e','d','T','e','r','m','i','n','a','l'}); @@ -169,11 +175,11 @@ public class Main { useConsole = false; } - if (false && Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { + if (Main.class.getPackage().getImplementationVendor() != null && System.getProperty("IReallyKnowWhatIAmDoingISwear") == null) { Date buildDate = new SimpleDateFormat("yyyyMMdd-HHmm").parse(Main.class.getPackage().getImplementationVendor()); Calendar deadline = Calendar.getInstance(); - deadline.add(Calendar.DAY_OF_YEAR, -14); + deadline.add(Calendar.DAY_OF_YEAR, -3); if (buildDate.before(deadline.getTime())) { System.err.println("*** Error, this build is outdated ***"); System.err.println("*** Please download a new build as per instructions from https://www.spigotmc.org/ ***"); @@ -182,6 +188,8 @@ public class Main { } } + System.err.println("*** WARNING: This is a development build. It is not meant for production server usage! Please keep backups and update frequently."); + System.out.println("Loading libraries, please wait..."); MinecraftServer.main(options); } catch (Throwable t) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java index e2c9a9b7..6672e804 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java @@ -30,7 +30,7 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme public void load(TileEntityBanner banner) { super.load(banner); - base = DyeColor.getByDyeData((byte) banner.color.getInvColorIndex()); + base = DyeColor.getByWoolData((byte) banner.color.getColorIndex()); patterns = new ArrayList<Pattern>(); if (banner.patterns != null) { @@ -90,7 +90,7 @@ public class CraftBanner extends CraftBlockEntityState<TileEntityBanner> impleme public void applyTo(TileEntityBanner banner) { super.applyTo(banner); - banner.color = EnumColor.fromInvColorIndex(base.getDyeData()); + banner.color = EnumColor.fromColorIndex(base.getWoolData()); NBTTagList newPatterns = new NBTTagList(); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java index afec900c..5b908d3b 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java @@ -10,6 +10,7 @@ import org.bukkit.Material; import org.bukkit.block.Beacon; import org.bukkit.block.Block; import org.bukkit.craftbukkit.inventory.CraftInventoryBeacon; +import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.entity.LivingEntity; import org.bukkit.inventory.BeaconInventory; import org.bukkit.potion.PotionEffect; @@ -87,11 +88,11 @@ public class CraftBeacon extends CraftContainer<TileEntityBeacon> implements Bea @Override public String getCustomName() { TileEntityBeacon beacon = this.getSnapshot(); - return beacon.hasCustomName() ? beacon.getName() : null; + return beacon.hasCustomName() ? CraftChatMessage.fromComponent(beacon.getCustomName()) : null; } @Override public void setCustomName(String name) { - this.getSnapshot().setCustomName(name); + this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name)); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java index 27756d85..e91497d8 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java @@ -10,8 +10,6 @@ import org.bukkit.block.Block; public class CraftBed extends CraftBlockEntityState<TileEntityBed> implements Bed { - private DyeColor color; - public CraftBed(Block block) { super(block, TileEntityBed.class); } @@ -21,28 +19,47 @@ public class CraftBed extends CraftBlockEntityState<TileEntityBed> implements Be } @Override - public void load(TileEntityBed bed) { - super.load(bed); - - color = DyeColor.getByWoolData((byte) bed.a().getColorIndex()); - } - - @Override public DyeColor getColor() { - return color; + switch (getType()) { + case BLACK_BED: + return DyeColor.BLACK; + case BLUE_BED: + return DyeColor.BLUE; + case BROWN_BED: + return DyeColor.BROWN; + case CYAN_BED: + return DyeColor.CYAN; + case GRAY_BED: + return DyeColor.GRAY; + case GREEN_BED: + return DyeColor.GREEN; + case LIGHT_BLUE_BED: + return DyeColor.LIGHT_BLUE; + case LIGHT_GRAY_BED: + return DyeColor.SILVER; + case LIME_BED: + return DyeColor.LIME; + case MAGENTA_BED: + return DyeColor.MAGENTA; + case ORANGE_BED: + return DyeColor.ORANGE; + case PINK_BED: + return DyeColor.PINK; + case PURPLE_BED: + return DyeColor.PURPLE; + case RED_BED: + return DyeColor.RED; + case WHITE_BED: + return DyeColor.WHITE; + case YELLOW_BED: + return DyeColor.YELLOW; + default: + throw new IllegalArgumentException("Unknown DyeColor for " + getType()); + } } @Override public void setColor(DyeColor color) { - Preconditions.checkArgument(color != null, "color"); - - this.color = color; - } - - @Override - public void applyTo(TileEntityBed bed) { - super.applyTo(bed); - - bed.a(EnumColor.fromColorIndex(color.getWoolData())); + throw new UnsupportedOperationException("Must set block type to appropriate bed colour"); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index 46670c34..bfed2d98 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.block; +import com.google.common.base.Preconditions; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -16,7 +17,10 @@ import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.BlockState; import org.bukkit.block.PistonMoveReaction; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftChunk; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.inventory.ItemStack; @@ -25,40 +29,44 @@ import org.bukkit.plugin.Plugin; import org.bukkit.util.BlockVector; public class CraftBlock implements Block { - private final CraftChunk chunk; - private final int x; - private final int y; - private final int z; + private final net.minecraft.server.GeneratorAccess world; + private final BlockPosition position; - public CraftBlock(CraftChunk chunk, int x, int y, int z) { - this.x = x; - this.y = y; - this.z = z; - this.chunk = chunk; + public CraftBlock(GeneratorAccess world, BlockPosition position) { + this.world = world; + this.position = position; + } + + public static CraftBlock at(GeneratorAccess world, BlockPosition position) { + return new CraftBlock(world, position); } private net.minecraft.server.Block getNMSBlock() { - return CraftMagicNumbers.getBlock(this); // TODO: UPDATE THIS + return getNMS().getBlock(); } - private static net.minecraft.server.Block getNMSBlock(int type) { - return CraftMagicNumbers.getBlock(type); + protected net.minecraft.server.IBlockData getNMS() { + return world.getType(position); } public World getWorld() { - return chunk.getWorld(); + return world.getMinecraftWorld().getWorld(); + } + + public CraftWorld getCraftWorld() { + return (CraftWorld) getWorld(); } public Location getLocation() { - return new Location(getWorld(), x, y, z); + return new Location(getWorld(), position.getX(), position.getY(), position.getZ()); } public Location getLocation(Location loc) { if (loc != null) { loc.setWorld(getWorld()); - loc.setX(x); - loc.setY(y); - loc.setZ(z); + loc.setX(position.getX()); + loc.setY(position.getY()); + loc.setZ(position.getZ()); loc.setYaw(0); loc.setPitch(0); } @@ -67,23 +75,23 @@ public class CraftBlock implements Block { } public BlockVector getVector() { - return new BlockVector(x, y, z); + return new BlockVector(getX(), getY(), getZ()); } public int getX() { - return x; + return position.getX(); } public int getY() { - return y; + return position.getY(); } public int getZ() { - return z; + return position.getZ(); } public Chunk getChunk() { - return chunk; + return getWorld().getChunkAt(this); } public void setData(final byte data) { @@ -99,19 +107,21 @@ public class CraftBlock implements Block { } 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); + world.setTypeAndData(position, CraftMagicNumbers.getBlock(getType(), data), flag); } private IBlockData getData0() { - return chunk.getHandle().getBlockData(new BlockPosition(x, y, z)); + return world.getType(position); } public byte getData() { - IBlockData blockData = chunk.getHandle().getBlockData(new BlockPosition(x, y, z)); - return (byte) blockData.getBlock().toLegacyData(blockData); + IBlockData blockData = world.getType(position); + return CraftMagicNumbers.toLegacyData(blockData); + } + + @Override + public BlockData getBlockData() { + return CraftBlockData.fromData(getData0()); } public void setType(final Material type) { @@ -120,34 +130,36 @@ public class CraftBlock implements Block { @Override public void setType(Material type, boolean applyPhysics) { - setTypeId(type.getId(), applyPhysics); + setTypeAndData(type, (byte) 0, applyPhysics); } - public boolean setTypeId(final int type) { - return setTypeId(type, true); + @Override + public void setBlockData(BlockData data) { + setBlockData(data, true); } - public boolean setTypeId(final int type, final boolean applyPhysics) { - net.minecraft.server.Block block = getNMSBlock(type); - return setTypeIdAndData(type, (byte) block.toLegacyData(block.getBlockData()), applyPhysics); + @Override + public void setBlockData(BlockData data, boolean applyPhysics) { + setTypeAndData(((CraftBlockData) data).getState(), applyPhysics); } - 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); + public boolean setTypeAndData(final Material type, final byte data, final boolean applyPhysics) { + return setTypeAndData(CraftMagicNumbers.getBlock(type, data), applyPhysics); + } + public boolean setTypeAndData(final IBlockData blockData, final boolean applyPhysics) { // SPIGOT-611: need to do this to prevent glitchiness. Easier to handle this here (like /setblock) than to fix weirdness in tile entity cleanup - if (type != 0 && blockData.getBlock() instanceof BlockTileEntity && type != getTypeId()) { - chunk.getHandle().getWorld().setTypeAndData(position, Blocks.AIR.getBlockData(), 0); + if (!blockData.isAir() && blockData.getBlock() instanceof BlockTileEntity && blockData.getBlock() != getNMSBlock()) { + world.setTypeAndData(position, Blocks.AIR.getBlockData(), 0); } if (applyPhysics) { - return chunk.getHandle().getWorld().setTypeAndData(position, blockData, 3); + return world.setTypeAndData(position, blockData, 3); } else { - IBlockData old = chunk.getHandle().getBlockData(position); - boolean success = chunk.getHandle().getWorld().setTypeAndData(position, blockData, 18); // NOTIFY | NO_OBSERVER + IBlockData old = world.getType(position); + boolean success = world.setTypeAndData(position, blockData, 18); // NOTIFY | NO_OBSERVER if (success) { - chunk.getHandle().getWorld().notify( + world.getMinecraftWorld().notify( position, old, blockData, @@ -159,25 +171,19 @@ public class CraftBlock implements Block { } public Material getType() { - return Material.getMaterial(getTypeId()); - } - - @Deprecated - @Override - public int getTypeId() { - return CraftMagicNumbers.getId(chunk.getHandle().getBlockData(new BlockPosition(this.x, this.y, this.z)).getBlock()); + return CraftMagicNumbers.getMaterial(world.getType(position).getBlock()); } public byte getLightLevel() { - return (byte) chunk.getHandle().getWorld().getLightLevel(new BlockPosition(this.x, this.y, this.z)); + return (byte) world.getMinecraftWorld().getLightLevel(position); } public byte getLightFromSky() { - return (byte) chunk.getHandle().getWorld().getBrightness(EnumSkyBlock.SKY, new BlockPosition(this.x, this.y, this.z)); + return (byte) world.getBrightness(EnumSkyBlock.SKY, position); } public byte getLightFromBlocks() { - return (byte) chunk.getHandle().getWorld().getBrightness(EnumSkyBlock.BLOCK, new BlockPosition(this.x, this.y, this.z)); + return (byte) world.getBrightness(EnumSkyBlock.BLOCK, position); } @@ -218,7 +224,7 @@ public class CraftBlock implements Block { @Override public String toString() { - return "CraftBlock{" + "chunk=" + chunk + ",x=" + x + ",y=" + y + ",z=" + z + ",type=" + getType() + ",data=" + getData() + '}'; + return "CraftBlock{pos=" + position + ",type=" + getType() + ",data=" + getData() + '}'; } public static BlockFace notchToBlockFace(EnumDirection notch) { @@ -265,13 +271,11 @@ public class CraftBlock implements Block { switch (material) { case SIGN: - case SIGN_POST: case WALL_SIGN: return new CraftSign(this); case CHEST: case TRAPPED_CHEST: return new CraftChest(this); - case BURNING_FURNACE: case FURNACE: return new CraftFurnace(this); case DISPENSER: @@ -282,28 +286,65 @@ public class CraftBlock implements Block { return new CraftEndGateway(this); case HOPPER: return new CraftHopper(this); - case MOB_SPAWNER: + case SPAWNER: return new CraftCreatureSpawner(this); - case NOTE_BLOCK: - return new CraftNoteBlock(this); case JUKEBOX: return new CraftJukebox(this); case BREWING_STAND: return new CraftBrewingStand(this); - case SKULL: + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case PISTON_HEAD: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: return new CraftSkull(this); - case COMMAND: - case COMMAND_CHAIN: - case COMMAND_REPEATING: + case COMMAND_BLOCK: + case CHAIN_COMMAND_BLOCK: + case REPEATING_COMMAND_BLOCK: return new CraftCommandBlock(this); case BEACON: return new CraftBeacon(this); - case BANNER: - case WALL_BANNER: - case STANDING_BANNER: + case BLACK_BANNER: + case BLACK_WALL_BANNER: + case BLUE_BANNER: + case BLUE_WALL_BANNER: + case BROWN_BANNER: + case BROWN_WALL_BANNER: + case CYAN_BANNER: + case CYAN_WALL_BANNER: + case GRAY_BANNER: + case GRAY_WALL_BANNER: + case GREEN_BANNER: + case GREEN_WALL_BANNER: + case LIGHT_BLUE_BANNER: + case LIGHT_BLUE_WALL_BANNER: + case LIGHT_GRAY_BANNER: + case LIGHT_GRAY_WALL_BANNER: + case LIME_BANNER: + case LIME_WALL_BANNER: + case MAGENTA_BANNER: + case MAGENTA_WALL_BANNER: + case ORANGE_BANNER: + case ORANGE_WALL_BANNER: + case PINK_BANNER: + case PINK_WALL_BANNER: + case PURPLE_BANNER: + case PURPLE_WALL_BANNER: + case RED_BANNER: + case RED_WALL_BANNER: + case WHITE_BANNER: + case WHITE_WALL_BANNER: + case YELLOW_BANNER: + case YELLOW_WALL_BANNER: return new CraftBanner(this); - case FLOWER_POT: - return new CraftFlowerPot(this); case STRUCTURE_BLOCK: return new CraftStructureBlock(this); case WHITE_SHULKER_BOX: @@ -314,7 +355,7 @@ public class CraftBlock implements Block { case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -323,20 +364,35 @@ public class CraftBlock implements Block { case RED_SHULKER_BOX: case BLACK_SHULKER_BOX: return new CraftShulkerBox(this); - case ENCHANTMENT_TABLE: + case ENCHANTING_TABLE: return new CraftEnchantingTable(this); case ENDER_CHEST: return new CraftEnderChest(this); case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: return new CraftDaylightDetector(this); - case REDSTONE_COMPARATOR_OFF: - case REDSTONE_COMPARATOR_ON: + case COMPARATOR: return new CraftComparator(this); - case BED_BLOCK: + case BLACK_BED: + case BLUE_BED: + case BROWN_BED: + case CYAN_BED: + case GRAY_BED: + case GREEN_BED: + case LIGHT_BLUE_BED: + case LIGHT_GRAY_BED: + case LIME_BED: + case MAGENTA_BED: + case ORANGE_BED: + case PINK_BED: + case PURPLE_BED: + case RED_BED: + case WHITE_BED: + case YELLOW_BED: return new CraftBed(this); + case CONDUIT: + return new CraftConduit(this); default: - TileEntity tileEntity = chunk.getCraftWorld().getTileEntityAt(x, y, z); + TileEntity tileEntity = world.getTileEntity(position); if (tileEntity != null) { // block with unhandled TileEntity: return new CraftBlockEntityState<TileEntity>(this, (Class<TileEntity>) tileEntity.getClass()); @@ -348,11 +404,11 @@ public class CraftBlock implements Block { } public Biome getBiome() { - return getWorld().getBiome(x, z); + return getWorld().getBiome(getX(), getZ()); } public void setBiome(Biome bio) { - getWorld().setBiome(x, z, bio); + getWorld().setBiome(getX(), getZ(), bio); } public static Biome biomeBaseToBiome(BiomeBase base) { @@ -372,19 +428,19 @@ public class CraftBlock implements Block { } public double getTemperature() { - return getWorld().getTemperature(x, z); + return getWorld().getTemperature(getX(), getZ()); } public double getHumidity() { - return getWorld().getHumidity(x, z); + return getWorld().getHumidity(getX(), getZ()); } public boolean isBlockPowered() { - return chunk.getHandle().getWorld().getBlockPower(new BlockPosition(x, y, z)) > 0; + return world.getMinecraftWorld().getBlockPower(position) > 0; } public boolean isBlockIndirectlyPowered() { - return chunk.getHandle().getWorld().isBlockIndirectlyPowered(new BlockPosition(x, y, z)); + return world.getMinecraftWorld().isBlockIndirectlyPowered(position); } @Override @@ -393,20 +449,20 @@ public class CraftBlock implements Block { if (!(o instanceof CraftBlock)) return false; CraftBlock other = (CraftBlock) o; - return this.x == other.x && this.y == other.y && this.z == other.z && this.getWorld().equals(other.getWorld()); + return this.position.equals(other.position) && this.getWorld().equals(other.getWorld()); } @Override public int hashCode() { - return this.y << 24 ^ this.x ^ this.z ^ this.getWorld().hashCode(); + return this.position.hashCode() ^ this.getWorld().hashCode(); } public boolean isBlockFacePowered(BlockFace face) { - return chunk.getHandle().getWorld().isBlockFacePowered(new BlockPosition(x, y, z), blockFaceToNotch(face)); + return world.getMinecraftWorld().isBlockFacePowered(position, blockFaceToNotch(face)); } public boolean isBlockFaceIndirectlyPowered(BlockFace face) { - int power = chunk.getHandle().getWorld().getBlockFacePower(new BlockPosition(x, y, z), blockFaceToNotch(face)); + int power = world.getMinecraftWorld().getBlockFacePower(position, blockFaceToNotch(face)); Block relative = getRelative(face); if (relative.getType() == Material.REDSTONE_WIRE) { @@ -418,8 +474,11 @@ 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().getWorld(); + BlockRedstoneWire wire = (BlockRedstoneWire) Blocks.REDSTONE_WIRE; + net.minecraft.server.World world = this.world.getMinecraftWorld(); + int x = getX(); + int y = getY(); + int z = getZ(); 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); @@ -438,31 +497,30 @@ public class CraftBlock implements Block { } public boolean isLiquid() { - return (getType() == Material.WATER) || (getType() == Material.STATIONARY_WATER) || (getType() == Material.LAVA) || (getType() == Material.STATIONARY_LAVA); + return (getType() == Material.WATER) || (getType() == Material.LAVA); } public PistonMoveReaction getPistonMoveReaction() { - return PistonMoveReaction.getById(getNMSBlock().h(getNMSBlock().fromLegacyData(getData())).ordinal()); + return PistonMoveReaction.getById(getNMS().getPushReaction().ordinal()); } private boolean itemCausesDrops(ItemStack item) { net.minecraft.server.Block block = this.getNMSBlock(); - net.minecraft.server.Item itemType = item != null ? net.minecraft.server.Item.getById(item.getTypeId()) : null; + net.minecraft.server.Item itemType = CraftMagicNumbers.getItem(item.getType()); return block != null && (block.getBlockData().getMaterial().isAlwaysDestroyable() || (itemType != null && itemType.canDestroySpecialBlock(block.getBlockData()))); } public boolean breakNaturally() { // Order matters here, need to drop before setting to air so skulls can get their data net.minecraft.server.Block block = this.getNMSBlock(); - byte data = getData(); boolean result = false; if (block != null && block != Blocks.AIR) { - block.dropNaturally(chunk.getHandle().getWorld(), new BlockPosition(x, y, z), block.fromLegacyData(data), 1.0F, 0); + block.dropNaturally(getNMS(), world.getMinecraftWorld(), position, 1.0F, 0); result = true; } - setTypeId(Material.AIR.getId()); + setType(Material.AIR); return result; } @@ -470,7 +528,7 @@ public class CraftBlock implements Block { if (itemCausesDrops(item)) { return breakNaturally(); } else { - return setTypeId(Material.AIR.getId()); + return setTypeAndData(Material.AIR, (byte) 0, true); } } @@ -481,21 +539,20 @@ public class CraftBlock implements Block { if (block != Blocks.AIR) { IBlockData data = getData0(); // based on nms.Block.dropNaturally - int count = block.getDropCount(0, chunk.getHandle().getWorld().random); + int count = block.getDropCount(data, 0, world.getMinecraftWorld(), position, world.getMinecraftWorld().random); for (int i = 0; i < count; ++i) { - Item item = block.getDropType(data, chunk.getHandle().getWorld().random, 0); - if (item != Items.a) { + Item item = block.getDropType(data, world.getMinecraftWorld(), position, 0).getItem(); + if (item != Items.AIR) { // 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(data)); - TileEntitySkull tileentityskull = (TileEntitySkull) chunk.getHandle().getWorld().getTileEntity(new BlockPosition(x, y, z)); + if (block instanceof BlockSkullAbstract) { + net.minecraft.server.ItemStack nmsStack = block.a((IBlockAccess) world, position, data); + TileEntitySkull tileentityskull = (TileEntitySkull) world.getTileEntity(position); - if (tileentityskull.getSkullType() == 3 && tileentityskull.getGameProfile() != null) { - nmsStack.setTag(new NBTTagCompound()); + if ((block == Blocks.PLAYER_HEAD || block == Blocks.PLAYER_WALL_HEAD) && tileentityskull.getGameProfile() != null) { NBTTagCompound nbttagcompound = new NBTTagCompound(); GameProfileSerializer.serialize(nbttagcompound, tileentityskull.getGameProfile()); - nmsStack.getTag().set("SkullOwner", nbttagcompound); + nmsStack.getOrCreateTag().set("SkullOwner", nbttagcompound); } drops.add(CraftItemStack.asBukkitCopy(nmsStack)); @@ -504,10 +561,10 @@ public class CraftBlock implements Block { int age = (Integer) 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)); + drops.add(new ItemStack(Material.COCOA_BEANS, 1)); } } 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)); } } } @@ -524,18 +581,18 @@ public class CraftBlock implements Block { } public void setMetadata(String metadataKey, MetadataValue newMetadataValue) { - chunk.getCraftWorld().getBlockMetadata().setMetadata(this, metadataKey, newMetadataValue); + getCraftWorld().getBlockMetadata().setMetadata(this, metadataKey, newMetadataValue); } public List<MetadataValue> getMetadata(String metadataKey) { - return chunk.getCraftWorld().getBlockMetadata().getMetadata(this, metadataKey); + return getCraftWorld().getBlockMetadata().getMetadata(this, metadataKey); } public boolean hasMetadata(String metadataKey) { - return chunk.getCraftWorld().getBlockMetadata().hasMetadata(this, metadataKey); + return getCraftWorld().getBlockMetadata().hasMetadata(this, metadataKey); } public void removeMetadata(String metadataKey, Plugin owningPlugin) { - chunk.getCraftWorld().getBlockMetadata().removeMetadata(this, metadataKey, owningPlugin); + getCraftWorld().getBlockMetadata().removeMetadata(this, metadataKey, owningPlugin); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java index 8328ed00..ac9b4297 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java @@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.block; import net.minecraft.server.BlockPosition; import net.minecraft.server.NBTTagCompound; import net.minecraft.server.TileEntity; +import net.minecraft.server.World; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.craftbukkit.CraftWorld; @@ -23,7 +24,7 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState this.tileEntity = tileEntityClass.cast(world.getTileEntityAt(this.getX(), this.getY(), this.getZ())); // copy tile entity data: - this.snapshot = this.createSnapshot(tileEntity); + this.snapshot = this.createSnapshot(tileEntity, world.getHandle()); this.load(snapshot); } @@ -34,17 +35,17 @@ public class CraftBlockEntityState<T extends TileEntity> extends CraftBlockState this.tileEntity = tileEntity; // copy tile entity data: - this.snapshot = this.createSnapshot(tileEntity); + this.snapshot = this.createSnapshot(tileEntity, null); this.load(snapshot); } - private T createSnapshot(T tileEntity) { + private T createSnapshot(T tileEntity, World world) { if (tileEntity == null) { return null; } NBTTagCompound nbtTagCompound = tileEntity.save(new NBTTagCompound()); - T snapshot = (T) TileEntity.create(null, nbtTagCompound); + T snapshot = (T) TileEntity.create(nbtTagCompound, world); return snapshot; } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index 2a1b731c..08f73c8f 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -7,8 +7,10 @@ import org.bukkit.Chunk; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftChunk; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.material.Attachable; import org.bukkit.material.MaterialData; @@ -16,6 +18,7 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; import java.util.List; +import net.minecraft.server.GeneratorAccess; import net.minecraft.server.IBlockData; public class CraftBlockState implements BlockState { @@ -24,8 +27,7 @@ public class CraftBlockState implements BlockState { private final int x; private final int y; private final int z; - protected int type; - protected MaterialData data; + protected IBlockData data; protected int flag; public CraftBlockState(final Block block) { @@ -33,11 +35,9 @@ public class CraftBlockState implements BlockState { this.x = block.getX(); this.y = block.getY(); this.z = block.getZ(); - this.type = block.getTypeId(); + this.data = ((CraftBlock) block).getNMS(); this.chunk = (CraftChunk) block.getChunk(); this.flag = 3; - - createData(block.getData()); } public CraftBlockState(final Block block, int flag) { @@ -47,17 +47,17 @@ public class CraftBlockState implements BlockState { public CraftBlockState(Material material) { world = null; - type = material.getId(); + data = CraftMagicNumbers.getBlock(material).getBlockData(); chunk = null; x = y = z = 0; } - public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z) { - return new CraftBlockState(world.getWorld().getBlockAt(x, y, z)); + public static CraftBlockState getBlockState(GeneratorAccess world, net.minecraft.server.BlockPosition pos) { + return new CraftBlockState(CraftBlock.at(world, pos)); } - public static CraftBlockState getBlockState(net.minecraft.server.World world, int x, int y, int z, int flag) { - return new CraftBlockState(world.getWorld().getBlockAt(x, y, z), flag); + public static CraftBlockState getBlockState(net.minecraft.server.World world, net.minecraft.server.BlockPosition pos, int flag) { + return new CraftBlockState(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), flag); } public World getWorld() { @@ -82,14 +82,32 @@ public class CraftBlockState implements BlockState { return chunk; } + public void setData(IBlockData data) { + this.data = data; + } + + public IBlockData getHandle() { + return this.data; + } + + @Override + public BlockData getBlockData() { + return CraftBlockData.fromData(data); + } + + @Override + public void setBlockData(BlockData data) { + this.data = ((CraftBlockData) data).getState(); + } + public void setData(final MaterialData data) { Material mat = getType(); if ((mat == null) || (mat.getData() == null)) { - this.data = data; + this.data = CraftMagicNumbers.getBlock(data); } else { if ((data.getClass() == mat.getData()) || (data.getClass() == MaterialData.class)) { - this.data = data; + this.data = CraftMagicNumbers.getBlock(data); } else { throw new IllegalArgumentException("Provided data is not of type " + mat.getData().getName() + ", found " + data.getClass().getName()); @@ -98,24 +116,17 @@ public class CraftBlockState implements BlockState { } public MaterialData getData() { - return data; + return CraftMagicNumbers.getMaterial(data); } public void setType(final Material type) { - setTypeId(type.getId()); - } - - public boolean setTypeId(final int type) { - if (this.type != type) { - this.type = type; - - createData((byte) 0); + if (this.getType() != type) { + this.data = CraftMagicNumbers.getBlock(type).getBlockData(); } - return true; } public Material getType() { - return Material.getMaterial(getTypeId()); + return CraftMagicNumbers.getMaterial(data.getBlock()); } public void setFlag(int flag) { @@ -126,17 +137,13 @@ public class CraftBlockState implements BlockState { return flag; } - public int getTypeId() { - return type; - } - public byte getLightLevel() { return getBlock().getLightLevel(); } - public Block getBlock() { + public CraftBlock getBlock() { requirePlaced(); - return world.getBlockAt(x, y, z); + return (CraftBlock) world.getBlockAt(x, y, z); } public boolean update() { @@ -151,7 +158,7 @@ public class CraftBlockState implements BlockState { if (!isPlaced()) { return true; } - Block block = getBlock(); + CraftBlock block = getBlock(); if (block.getType() != getType()) { if (!force) { @@ -160,34 +167,25 @@ public class CraftBlockState implements BlockState { } BlockPosition pos = new BlockPosition(x, y, z); - IBlockData newBlock = CraftMagicNumbers.getBlock(getType()).fromLegacyData(getRawData()); - block.setTypeIdAndData(getTypeId(), getRawData(), applyPhysics); + IBlockData newBlock = this.data; + block.setTypeAndData(newBlock, applyPhysics); world.getHandle().notify( pos, - CraftMagicNumbers.getBlock(block).fromLegacyData(block.getData()), + block.getNMS(), newBlock, 3 ); // Update levers etc if (applyPhysics && getData() instanceof Attachable) { - world.getHandle().applyPhysics(pos.shift(CraftBlock.blockFaceToNotch(((Attachable) getData()).getAttachedFace())), newBlock.getBlock(), false); + world.getHandle().applyPhysics(pos.shift(CraftBlock.blockFaceToNotch(((Attachable) getData()).getAttachedFace())), newBlock.getBlock()); } return true; } - private void createData(final byte data) { - Material mat = getType(); - if (mat == null || mat.getData() == null) { - this.data = new MaterialData(type, data); - } else { - this.data = mat.getNewData(data); - } - } - public byte getRawData() { - return data.getData(); + return CraftMagicNumbers.toLegacyData(data); } public Location getLocation() { @@ -208,7 +206,7 @@ public class CraftBlockState implements BlockState { } public void setRawData(byte data) { - this.data.setData(data); + this.data = CraftMagicNumbers.getBlock(getType(), data); } @Override @@ -232,9 +230,6 @@ public class CraftBlockState implements BlockState { if (this.z != other.z) { return false; } - if (this.type != other.type) { - return false; - } if (this.data != other.data && (this.data == null || !this.data.equals(other.data))) { return false; } @@ -248,7 +243,6 @@ public class CraftBlockState implements BlockState { hash = 73 * hash + this.x; hash = 73 * hash + this.y; hash = 73 * hash + this.z; - hash = 73 * hash + this.type; hash = 73 * hash + (this.data != null ? this.data.hashCode() : 0); return hash; } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java index 9c336e64..dafaa6fb 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java @@ -5,6 +5,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BrewingStand; import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; +import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.inventory.BrewerInventory; public class CraftBrewingStand extends CraftContainer<TileEntityBrewingStand> implements BrewingStand { @@ -54,12 +55,12 @@ public class CraftBrewingStand extends CraftContainer<TileEntityBrewingStand> im @Override public String getCustomName() { TileEntityBrewingStand brewingStand = this.getSnapshot(); - return brewingStand.hasCustomName() ? brewingStand.getName() : null; + return brewingStand.hasCustomName() ? CraftChatMessage.fromComponent(brewingStand.getCustomName()) : null; } @Override public void setCustomName(String name) { - this.getSnapshot().setCustomName(name); + this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name)); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java index 85f3bb27..6a54f2a1 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java @@ -1,6 +1,10 @@ package org.bukkit.craftbukkit.block; +import net.minecraft.server.BlockChest; import net.minecraft.server.BlockPosition; +import net.minecraft.server.Blocks; +import net.minecraft.server.ITileInventory; +import net.minecraft.server.InventoryLargeChest; import net.minecraft.server.TileEntityChest; import org.bukkit.Material; @@ -48,30 +52,10 @@ public class CraftChest extends CraftLootable<TileEntityChest> implements Chest int z = this.getZ(); CraftWorld world = (CraftWorld) this.getWorld(); - int id; - if (world.getBlockTypeIdAt(x, y, z) == Material.CHEST.getId()) { - id = Material.CHEST.getId(); - } else if (world.getBlockTypeIdAt(x, y, z) == Material.TRAPPED_CHEST.getId()) { - id = Material.TRAPPED_CHEST.getId(); - } else { - throw new IllegalStateException("CraftChest is not a chest but is instead " + world.getBlockAt(x, y, z)); - } + ITileInventory nms = ((BlockChest) Blocks.CHEST).getInventory(data, world.getHandle(), new BlockPosition(x, y, z), true); - if (world.getBlockTypeIdAt(x - 1, y, z) == id) { - 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(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(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(new BlockPosition(x, y, z + 1))); - inventory = new CraftInventoryDoubleChest(inventory, right); + if (nms instanceof InventoryLargeChest) { + inventory = new CraftInventoryDoubleChest((InventoryLargeChest) nms); } return inventory; } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java index dd5b83cf..5c9bfe95 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java @@ -4,6 +4,7 @@ import net.minecraft.server.TileEntityCommand; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.CommandBlock; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand> implements CommandBlock { @@ -23,7 +24,7 @@ public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand> super.load(commandBlock); command = commandBlock.getCommandBlock().getCommand(); - name = commandBlock.getCommandBlock().getName(); + name = CraftChatMessage.fromComponent(commandBlock.getCommandBlock().getName()); } @Override @@ -51,6 +52,6 @@ public class CraftCommandBlock extends CraftBlockEntityState<TileEntityCommand> super.applyTo(commandBlock); commandBlock.getCommandBlock().setCommand(command); - commandBlock.getCommandBlock().setName(name); + commandBlock.getCommandBlock().setName(CraftChatMessage.fromStringOrNull(name)); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java new file mode 100644 index 00000000..5116a376 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java @@ -0,0 +1,17 @@ +package org.bukkit.craftbukkit.block; + +import net.minecraft.server.TileEntityConduit; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Conduit; + +public class CraftConduit extends CraftBlockEntityState<TileEntityConduit> implements Conduit { + + public CraftConduit(Block block) { + super(block, TileEntityConduit.class); + } + + public CraftConduit(Material material, TileEntityConduit te) { + super(material, te); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java index 2ec70843..aa63b854 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java @@ -1,6 +1,7 @@ package org.bukkit.craftbukkit.block; import com.google.common.base.Preconditions; +import net.minecraft.server.EntityTypes; import net.minecraft.server.MinecraftKey; import net.minecraft.server.TileEntityMobSpawner; import org.bukkit.Material; @@ -31,7 +32,7 @@ public class CraftCreatureSpawner extends CraftBlockEntityState<TileEntityMobSpa throw new IllegalArgumentException("Can't spawn EntityType " + entityType + " from mobspawners!"); } - this.getSnapshot().getSpawner().setMobName(new MinecraftKey(entityType.getName())); + this.getSnapshot().getSpawner().setMobName(EntityTypes.a(entityType.getName())); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java index f9239e55..3a782294 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java @@ -4,6 +4,7 @@ import net.minecraft.server.TileEntityEnchantTable; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.EnchantingTable; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftEnchantingTable extends CraftBlockEntityState<TileEntityEnchantTable> implements EnchantingTable { @@ -18,12 +19,12 @@ public class CraftEnchantingTable extends CraftBlockEntityState<TileEntityEnchan @Override public String getCustomName() { TileEntityEnchantTable enchant = this.getSnapshot(); - return enchant.hasCustomName() ? enchant.getName() : null; + return enchant.hasCustomName() ? CraftChatMessage.fromComponent(enchant.getCustomName()) : null; } @Override public void setCustomName(String name) { - this.getSnapshot().setCustomName(name); + this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name)); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java deleted file mode 100644 index c9097ac8..00000000 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftFlowerPot.java +++ /dev/null @@ -1,46 +0,0 @@ -package org.bukkit.craftbukkit.block; - -import net.minecraft.server.ItemStack; -import net.minecraft.server.TileEntityFlowerPot; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.FlowerPot; -import org.bukkit.craftbukkit.inventory.CraftItemStack; -import org.bukkit.material.MaterialData; - -public class CraftFlowerPot extends CraftBlockEntityState<TileEntityFlowerPot> implements FlowerPot { - - private MaterialData contents; - - public CraftFlowerPot(Block block) { - super(block, TileEntityFlowerPot.class); - } - - public CraftFlowerPot(Material material, TileEntityFlowerPot te) { - super(material, te); - } - - @Override - public void load(TileEntityFlowerPot pot) { - super.load(pot); - - contents = (pot.getItem() == null) ? null : CraftItemStack.asBukkitCopy(pot.getContents()).getData(); - } - - @Override - public MaterialData getContents() { - return contents; - } - - @Override - public void setContents(MaterialData item) { - contents = item; - } - - @Override - public void applyTo(TileEntityFlowerPot pot) { - super.applyTo(pot); - - pot.setContents(contents == null ? ItemStack.a : CraftItemStack.asNMSCopy(contents.toItemStack(1))); - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java index 047dbe2e..469dc4ff 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java @@ -5,6 +5,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Furnace; import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; +import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.inventory.FurnaceInventory; public class CraftFurnace extends CraftContainer<TileEntityFurnace> implements Furnace { @@ -54,12 +55,12 @@ public class CraftFurnace extends CraftContainer<TileEntityFurnace> implements F @Override public String getCustomName() { TileEntityFurnace furnace = this.getSnapshot(); - return furnace.hasCustomName() ? furnace.getName() : null; + return furnace.hasCustomName() ? CraftChatMessage.fromComponent(furnace.getCustomName()) : null; } @Override public void setCustomName(String name) { - this.getSnapshot().setCustomName(name); + this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name)); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java index d259cfb8..57160a94 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java @@ -1,11 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.server.BlockJukeBox; -import net.minecraft.server.BlockJukeBox.TileEntityRecordPlayer; import net.minecraft.server.BlockPosition; import net.minecraft.server.Blocks; +import net.minecraft.server.Item; import net.minecraft.server.ItemStack; import net.minecraft.server.TileEntity; +import net.minecraft.server.TileEntityJukeBox; import org.bukkit.Effect; import org.bukkit.Material; import org.bukkit.block.Block; @@ -13,13 +14,13 @@ import org.bukkit.block.Jukebox; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.util.CraftMagicNumbers; -public class CraftJukebox extends CraftBlockEntityState<TileEntityRecordPlayer> implements Jukebox { +public class CraftJukebox extends CraftBlockEntityState<TileEntityJukeBox> implements Jukebox { public CraftJukebox(final Block block) { - super(block, TileEntityRecordPlayer.class); + super(block, TileEntityJukeBox.class); } - public CraftJukebox(final Material material, TileEntityRecordPlayer te) { + public CraftJukebox(final Material material, TileEntityJukeBox te) { super(material, te); } @@ -39,7 +40,7 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityRecordPlayer> Blocks.JUKEBOX.getBlockData() .set(BlockJukeBox.HAS_RECORD, true), 3); } - world.playEffect(this.getLocation(), Effect.RECORD_PLAY, record.getId()); + world.playEffect(this.getLocation(), Effect.RECORD_PLAY, Item.getId(CraftMagicNumbers.getItem((Material) record))); } return result; @@ -77,12 +78,12 @@ public class CraftJukebox extends CraftBlockEntityState<TileEntityRecordPlayer> public boolean eject() { requirePlaced(); TileEntity tileEntity = this.getTileEntityFromWorld(); - if (!(tileEntity instanceof TileEntityRecordPlayer)) return false; + if (!(tileEntity instanceof TileEntityJukeBox)) return false; - TileEntityRecordPlayer jukebox = (TileEntityRecordPlayer) tileEntity; + TileEntityJukeBox jukebox = (TileEntityJukeBox) tileEntity; boolean result = !jukebox.getRecord().isEmpty(); CraftWorld world = (CraftWorld) this.getWorld(); - ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), new BlockPosition(getX(), getY(), getZ()), null); + ((BlockJukeBox) Blocks.JUKEBOX).dropRecord(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); return result; } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java index e2af111d..d7677192 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java @@ -4,6 +4,7 @@ import net.minecraft.server.TileEntityLootable; import org.bukkit.Material; import org.bukkit.Nameable; import org.bukkit.block.Block; +import org.bukkit.craftbukkit.util.CraftChatMessage; public abstract class CraftLootable<T extends TileEntityLootable> extends CraftContainer<T> implements Nameable { @@ -18,12 +19,12 @@ public abstract class CraftLootable<T extends TileEntityLootable> extends CraftC @Override public String getCustomName() { T lootable = this.getSnapshot(); - return lootable.hasCustomName() ? lootable.getName() : null; + return lootable.hasCustomName() ? CraftChatMessage.fromComponent(lootable.getCustomName()) : null; } @Override public void setCustomName(String name) { - this.getSnapshot().setCustomName(name); + this.getSnapshot().setCustomName(CraftChatMessage.fromStringOrNull(name)); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java deleted file mode 100644 index 880831d4..00000000 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftNoteBlock.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.bukkit.craftbukkit.block; - -import net.minecraft.server.BlockPosition; -import net.minecraft.server.TileEntityNote; - -import org.bukkit.Instrument; -import org.bukkit.Material; -import org.bukkit.Note; -import org.bukkit.block.Block; -import org.bukkit.block.NoteBlock; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.util.CraftMagicNumbers; - -public class CraftNoteBlock extends CraftBlockEntityState<TileEntityNote> implements NoteBlock { - - public CraftNoteBlock(final Block block) { - super(block, TileEntityNote.class); - } - - public CraftNoteBlock(final Material material, final TileEntityNote te) { - super(material, te); - } - - @Override - public Note getNote() { - return new Note(this.getSnapshot().note); - } - - @Override - public byte getRawNote() { - return this.getSnapshot().note; - } - - @Override - public void setNote(Note note) { - this.getSnapshot().note = note.getId(); - } - - @Override - public void setRawNote(byte note) { - this.getSnapshot().note = note; - } - - @Override - public boolean play() { - Block block = getBlock(); - - if (block.getType() == Material.NOTE_BLOCK) { - TileEntityNote note = (TileEntityNote) this.getTileEntityFromWorld(); - CraftWorld world = (CraftWorld) this.getWorld(); - note.play(world.getHandle(), new BlockPosition(getX(), getY(), getZ())); - return true; - } else { - return false; - } - } - - @Override - public boolean play(byte instrument, byte note) { - Block block = getBlock(); - - if (block.getType() == Material.NOTE_BLOCK) { - CraftWorld world = (CraftWorld) this.getWorld(); - world.getHandle().playBlockAction(new BlockPosition(getX(), getY(), getZ()), CraftMagicNumbers.getBlock(block), instrument, note); - return true; - } else { - return false; - } - } - - @Override - public boolean play(Instrument instrument, Note note) { - Block block = getBlock(); - - if (block.getType() == Material.NOTE_BLOCK) { - CraftWorld world = (CraftWorld) this.getWorld(); - 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/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java index f2865688..f113da71 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java @@ -12,13 +12,12 @@ import org.bukkit.SkullType; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.Skull; +import org.bukkit.block.data.Rotatable; public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implements Skull { private static final int MAX_OWNER_LENGTH = 16; private GameProfile profile; - private SkullType skullType; - private byte rotation; public CraftSkull(final Block block) { super(block, TileEntitySkull.class); @@ -33,26 +32,6 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement super.load(skull); profile = skull.getGameProfile(); - skullType = getSkullType(skull.getSkullType()); - rotation = (byte) skull.rotation; - } - - static SkullType getSkullType(int id) { - switch (id) { - default: - case 0: - return SkullType.SKELETON; - case 1: - return SkullType.WITHER; - case 2: - return SkullType.ZOMBIE; - case 3: - return SkullType.PLAYER; - case 4: - return SkullType.CREEPER; - case 5: - return SkullType.DRAGON; - } } static int getSkullType(SkullType type) { @@ -73,84 +52,6 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement } } - static byte getBlockFace(BlockFace rotation) { - switch (rotation) { - case NORTH: - return 0; - case NORTH_NORTH_EAST: - return 1; - case NORTH_EAST: - return 2; - case EAST_NORTH_EAST: - return 3; - case EAST: - return 4; - case EAST_SOUTH_EAST: - return 5; - case SOUTH_EAST: - return 6; - case SOUTH_SOUTH_EAST: - return 7; - case SOUTH: - return 8; - case SOUTH_SOUTH_WEST: - return 9; - case SOUTH_WEST: - return 10; - case WEST_SOUTH_WEST: - return 11; - case WEST: - return 12; - case WEST_NORTH_WEST: - return 13; - case NORTH_WEST: - return 14; - case NORTH_NORTH_WEST: - return 15; - default: - throw new IllegalArgumentException("Invalid BlockFace rotation: " + rotation); - } - } - - static BlockFace getBlockFace(byte rotation) { - switch (rotation) { - case 0: - return BlockFace.NORTH; - case 1: - return BlockFace.NORTH_NORTH_EAST; - case 2: - return BlockFace.NORTH_EAST; - case 3: - return BlockFace.EAST_NORTH_EAST; - case 4: - return BlockFace.EAST; - case 5: - return BlockFace.EAST_SOUTH_EAST; - case 6: - return BlockFace.SOUTH_EAST; - case 7: - return BlockFace.SOUTH_SOUTH_EAST; - case 8: - return BlockFace.SOUTH; - case 9: - return BlockFace.SOUTH_SOUTH_WEST; - case 10: - return BlockFace.SOUTH_WEST; - case 11: - return BlockFace.WEST_SOUTH_WEST; - case 12: - return BlockFace.WEST; - case 13: - return BlockFace.WEST_NORTH_WEST; - case 14: - return BlockFace.NORTH_WEST; - case 15: - return BlockFace.NORTH_NORTH_WEST; - default: - throw new AssertionError(rotation); - } - } - @Override public boolean hasOwner() { return profile != null; @@ -172,10 +73,6 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement return false; } - if (skullType != SkullType.PLAYER) { - skullType = SkullType.PLAYER; - } - this.profile = profile; return true; } @@ -199,47 +96,58 @@ public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implement public void setOwningPlayer(OfflinePlayer player) { Preconditions.checkNotNull(player, "player"); - if (skullType != SkullType.PLAYER) { - skullType = SkullType.PLAYER; - } - this.profile = new GameProfile(player.getUniqueId(), player.getName()); } @Override public BlockFace getRotation() { - return getBlockFace(rotation); + return ((Rotatable) getBlockData()).getRotation(); } @Override public void setRotation(BlockFace rotation) { - this.rotation = getBlockFace(rotation); + Rotatable blockData = (Rotatable) getBlockData(); + blockData.setRotation(rotation); + setBlockData(blockData); } @Override public SkullType getSkullType() { - return skullType; + switch (getType()) { + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + return SkullType.SKELETON; + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + return SkullType.WITHER; + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: + return SkullType.ZOMBIE; + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + return SkullType.PLAYER; + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + return SkullType.CREEPER; + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + return SkullType.DRAGON; + default: + throw new IllegalArgumentException("Unknown SkullType for " + getType()); + } } @Override public void setSkullType(SkullType skullType) { - this.skullType = skullType; - - if (skullType != SkullType.PLAYER) { - profile = null; - } + throw new UnsupportedOperationException("Must change block type"); } @Override public void applyTo(TileEntitySkull skull) { super.applyTo(skull); - if (skullType == SkullType.PLAYER) { + if (getSkullType() == SkullType.PLAYER) { skull.setGameProfile(profile); - } else { - skull.setSkullType(getSkullType(skullType)); } - - skull.setRotation(rotation); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java index 2fadc703..86095fbe 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java @@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.block; import com.google.common.base.Preconditions; import net.minecraft.server.BlockPosition; +import net.minecraft.server.BlockPropertyStructureMode; import net.minecraft.server.EnumBlockMirror; import net.minecraft.server.EnumBlockRotation; import net.minecraft.server.TileEntityStructure; @@ -30,35 +31,35 @@ public class CraftStructureBlock extends CraftBlockEntityState<TileEntityStructu @Override public String getStructureName() { - return getSnapshot().a(); // PAIL: rename getStructureName + return getSnapshot().getStructureName(); } @Override public void setStructureName(String name) { Preconditions.checkArgument(name != null, "Structure Name cannot be null"); - getSnapshot().a(name); // PAIL: rename setStructureName + getSnapshot().setStructureName(name); } @Override public String getAuthor() { - return getSnapshot().f; + return getSnapshot().author; } @Override public void setAuthor(String author) { Preconditions.checkArgument(author != null && !author.isEmpty(), "Author name cannot be null nor empty"); - getSnapshot().f = author; // PAIL: rename author + getSnapshot().author = author; } @Override public void setAuthor(LivingEntity entity) { Preconditions.checkArgument(entity != null, "Structure Block author entity cannot be null"); - getSnapshot().a(((CraftLivingEntity) entity).getHandle()); // PAIL: rename setAuthor + getSnapshot().setAuthor(((CraftLivingEntity) entity).getHandle()); } @Override public BlockVector getRelativePosition() { - return new BlockVector(getSnapshot().h.getX(), getSnapshot().h.getY(), getSnapshot().h.getZ()); // PAIL: rename relativePosition + return new BlockVector(getSnapshot().relativePosition.getX(), getSnapshot().relativePosition.getY(), getSnapshot().relativePosition.getZ()); } @Override @@ -66,12 +67,12 @@ public class CraftStructureBlock extends CraftBlockEntityState<TileEntityStructu Validate.isTrue(isBetween(vector.getBlockX(), -MAX_SIZE, MAX_SIZE), "Structure Size (X) must be between -" + MAX_SIZE + " and " + MAX_SIZE); Validate.isTrue(isBetween(vector.getBlockY(), -MAX_SIZE, MAX_SIZE), "Structure Size (Y) must be between -" + MAX_SIZE + " and " + MAX_SIZE); Validate.isTrue(isBetween(vector.getBlockZ(), -MAX_SIZE, MAX_SIZE), "Structure Size (Z) must be between -" + MAX_SIZE + " and " + MAX_SIZE); - getSnapshot().h = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); // PAIL: rename relativePosition + getSnapshot().relativePosition = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); } @Override public BlockVector getStructureSize() { - return new BlockVector(getSnapshot().i.getX(), getSnapshot().i.getY(), getSnapshot().i.getZ()); // PAIL: rename size + return new BlockVector(getSnapshot().size.getX(), getSnapshot().size.getY(), getSnapshot().size.getZ()); } @Override @@ -79,101 +80,101 @@ public class CraftStructureBlock extends CraftBlockEntityState<TileEntityStructu Validate.isTrue(isBetween(vector.getBlockX(), 0, MAX_SIZE), "Structure Size (X) must be between 0 and " + MAX_SIZE); Validate.isTrue(isBetween(vector.getBlockY(), 0, MAX_SIZE), "Structure Size (Y) must be between 0 and " + MAX_SIZE); Validate.isTrue(isBetween(vector.getBlockZ(), 0, MAX_SIZE), "Structure Size (Z) must be between 0 and " + MAX_SIZE); - getSnapshot().i = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); // PAIL: rename size + getSnapshot().size = new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ()); } @Override public void setMirror(Mirror mirror) { - getSnapshot().j = EnumBlockMirror.valueOf(mirror.name()); // PAIL: rename mirror + getSnapshot().mirror = EnumBlockMirror.valueOf(mirror.name()); } @Override public Mirror getMirror() { - return Mirror.valueOf(getSnapshot().j.name()); // PAIL: rename mirror + return Mirror.valueOf(getSnapshot().mirror.name()); } @Override public void setRotation(StructureRotation rotation) { - getSnapshot().k = EnumBlockRotation.valueOf(rotation.name()); // PAIL: rename rotation + getSnapshot().rotation = EnumBlockRotation.valueOf(rotation.name()); } @Override public StructureRotation getRotation() { - return StructureRotation.valueOf(getSnapshot().k.name()); // PAIL: rename rotation + return StructureRotation.valueOf(getSnapshot().rotation.name()); } @Override public void setUsageMode(UsageMode mode) { - getSnapshot().a(TileEntityStructure.UsageMode.valueOf(mode.name())); // PAIL: rename setUsageMode + getSnapshot().setUsageMode(BlockPropertyStructureMode.valueOf(mode.name())); } @Override public UsageMode getUsageMode() { - return UsageMode.valueOf(getSnapshot().k().name()); // PAIL rename getUsageMode + return UsageMode.valueOf(getSnapshot().getUsageMode().name()); } @Override public void setIgnoreEntities(boolean flag) { - getSnapshot().m = flag; // PAIL: rename ignoreEntities + getSnapshot().ignoreEntities = flag; } @Override public boolean isIgnoreEntities() { - return getSnapshot().m; // PAIL: rename ignoreEntities + return getSnapshot().ignoreEntities; } @Override public void setShowAir(boolean showAir) { - getSnapshot().o = showAir; // PAIL rename showAir + getSnapshot().showAir = showAir; } @Override public boolean isShowAir() { - return getSnapshot().o; // PAIL: rename showAir + return getSnapshot().showAir; } @Override public void setBoundingBoxVisible(boolean showBoundingBox) { - getSnapshot().p = showBoundingBox; // PAIL: rename boundingBoxVisible + getSnapshot().showBoundingBox = showBoundingBox; } @Override public boolean isBoundingBoxVisible() { - return getSnapshot().p; // PAIL: rename boundingBoxVisible + return getSnapshot().showBoundingBox; } @Override public void setIntegrity(float integrity) { Validate.isTrue(isBetween(integrity, 0.0f, 1.0f), "Integrity must be between 0.0f and 1.0f"); - getSnapshot().q = integrity; // PAIL: rename integrity + getSnapshot().integrity = integrity; } @Override public float getIntegrity() { - return getSnapshot().q; // PAIL: rename integrity + return getSnapshot().integrity; } @Override public void setSeed(long seed) { - getSnapshot().r = seed; // PAIL: rename seed + getSnapshot().seed = seed; } @Override public long getSeed() { - return getSnapshot().r; // PAIL: rename seed + return getSnapshot().seed; } @Override public void setMetadata(String metadata) { Validate.notNull(metadata, "Structure metadata cannot be null"); if (getUsageMode() == UsageMode.DATA) { - getSnapshot().g = metadata; // PAIL: rename metadata + getSnapshot().metadata = metadata; } } @Override public String getMetadata() { - return getSnapshot().g; // PAIL: rename metadata + return getSnapshot().metadata; } private static boolean isBetween(int num, int min, int max) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java new file mode 100644 index 00000000..e311e66b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAgeable.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Ageable; + +public abstract class CraftAgeable extends CraftBlockData implements Ageable { + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger("age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java new file mode 100644 index 00000000..60a247ce --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAnaloguePowerable.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.AnaloguePowerable; + +public abstract class CraftAnaloguePowerable extends CraftBlockData implements AnaloguePowerable { + + private static final net.minecraft.server.BlockStateInteger POWER = getInteger("power"); + + @Override + public int getPower() { + return get(POWER); + } + + @Override + public void setPower(int power) { + set(POWER, power); + } + + @Override + public int getMaximumPower() { + return getMax(POWER); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java new file mode 100644 index 00000000..657cf073 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftAttachable.java @@ -0,0 +1,18 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Attachable; + +public abstract class CraftAttachable extends CraftBlockData implements Attachable { + + private static final net.minecraft.server.BlockStateBoolean ATTACHED = getBoolean("attached"); + + @Override + public boolean isAttached() { + return get(ATTACHED); + } + + @Override + public void setAttached(boolean attached) { + set(ATTACHED, attached); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java new file mode 100644 index 00000000..969b670e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBisected.java @@ -0,0 +1,18 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Bisected; + +public class CraftBisected extends CraftBlockData implements Bisected { + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum("half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java new file mode 100644 index 00000000..78cec61b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftBlockData.java @@ -0,0 +1,356 @@ +package org.bukkit.craftbukkit.block.data; + +import com.google.common.base.Preconditions; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.ImmutableSet; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import net.minecraft.server.ArgumentBlock; +import net.minecraft.server.Block; +import net.minecraft.server.BlockStateBoolean; +import net.minecraft.server.BlockStateEnum; +import net.minecraft.server.BlockStateInteger; +import net.minecraft.server.EnumDirection; +import net.minecraft.server.IBlockData; +import net.minecraft.server.IBlockState; +import net.minecraft.server.INamable; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; + +public class CraftBlockData implements BlockData { + + private IBlockData state; + + protected CraftBlockData() { + throw new AssertionError("Template Constructor"); + } + + protected CraftBlockData(IBlockData state) { + this.state = state; + } + + @Override + public Material getMaterial() { + return CraftMagicNumbers.getMaterial(state.getBlock()); + } + + public IBlockData getState() { + return state; + } + + protected <B extends Enum<B>> B get(BlockStateEnum<?> nms, Class<B> bukkit) { + return toBukkit(state.get(nms), bukkit); + } + + @SuppressWarnings("unchecked") + protected <B extends Enum<B>> Set<B> getValues(BlockStateEnum<?> nms, Class<B> bukkit) { + ImmutableSet.Builder<B> values = ImmutableSet.builder(); + + for (Enum<?> e : nms.d()) { + values.add(toBukkit(e, bukkit)); + } + + return values.build(); + } + + protected <B extends Enum<B>, N extends Enum<N> & INamable> void set(BlockStateEnum<N> nms, Enum<B> bukkit) { + this.state = this.state.set(nms, toNMS(bukkit, nms.b())); + } + + private static final BiMap<Enum<?>, Enum<?>> nmsToBukkit = HashBiMap.create(); + + @SuppressWarnings("unchecked") + private static <B extends Enum<B>> B toBukkit(Enum<?> nms, Class<B> bukkit) { + Enum<?> converted = nmsToBukkit.get(nms); + if (converted != null) { + return (B) converted; + } + + if (nms instanceof EnumDirection) { + converted = CraftBlock.notchToBlockFace((EnumDirection) nms); + } else { + converted = bukkit.getEnumConstants()[nms.ordinal()]; + } + + Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit); + nmsToBukkit.put(nms, converted); + + return (B) converted; + } + + @SuppressWarnings("unchecked") + private static <N extends Enum<N> & INamable> N toNMS(Enum<?> bukkit, Class<N> nms) { + Enum<?> converted = nmsToBukkit.inverse().get(bukkit); + if (converted != null) { + return (N) converted; + } + + if (bukkit instanceof BlockFace) { + converted = CraftBlock.blockFaceToNotch((BlockFace) bukkit); + } else { + converted = nms.getEnumConstants()[bukkit.ordinal()]; + } + + Preconditions.checkState(converted != null, "Could not convert enum %s->%s", nms, bukkit); + nmsToBukkit.put(converted, bukkit); + + return (N) converted; + } + + protected <T extends Comparable<T>> T get(IBlockState<T> ibs) { + // Straight integer or boolean getter + return this.state.get(ibs); + } + + public <T extends Comparable<T>, V extends T> void set(IBlockState<T> ibs, V v) { + // Straight integer or boolean setter + this.state = this.state.set(ibs, v); + } + + @Override + public String getAsString() { + return state.toString(); + } + + @Override + public BlockData clone() { + try { + return (BlockData) super.clone(); + } catch (CloneNotSupportedException ex) { + throw new AssertionError("Clone not supported", ex); + } + } + + @Override + public String toString() { + return "CraftBlockData{" + state.toString() + "}"; + } + + @Override + public boolean equals(Object obj) { + return obj instanceof CraftBlockData && state.equals(((CraftBlockData) obj).state); + } + + @Override + public int hashCode() { + return state.hashCode(); + } + + protected static BlockStateBoolean getBoolean(String name) { + throw new AssertionError("Template Method"); + } + + protected static BlockStateBoolean getBoolean(String name, boolean optional) { + throw new AssertionError("Template Method"); + } + + protected static BlockStateEnum<?> getEnum(String name) { + throw new AssertionError("Template Method"); + } + + protected static BlockStateInteger getInteger(String name) { + throw new AssertionError("Template Method"); + } + + protected static BlockStateBoolean getBoolean(Class<? extends Block> block, String name) { + return (BlockStateBoolean) getState(block, name, false); + } + + protected static BlockStateBoolean getBoolean(Class<? extends Block> block, String name, boolean optional) { + return (BlockStateBoolean) getState(block, name, optional); + } + + protected static BlockStateEnum<?> getEnum(Class<? extends Block> block, String name) { + return (BlockStateEnum<?>) getState(block, name, false); + } + + protected static BlockStateInteger getInteger(Class<? extends Block> block, String name) { + return (BlockStateInteger) getState(block, name, false); + } + + private static IBlockState<?> getState(Class<? extends Block> block, String name, boolean optional) { + IBlockState<?> state = null; + + for (Block instance : (Iterable<Block>) Block.REGISTRY) { // Eclipse fail + if (instance.getClass() == block) { + if (state == null) { + state = instance.getStates().a(name); + } else { + IBlockState<?> newState = instance.getStates().a(name); + + Preconditions.checkState(state == newState, "State mistmatch %s,%s", state, newState); + } + } + } + + Preconditions.checkState(optional || state != null, "Null state for %s,%s", block, name); + + return state; + } + + protected static int getMin(BlockStateInteger state) { + return state.min; + } + + protected static int getMax(BlockStateInteger state) { + return state.max; + } + + // + private static final Map<Class<? extends Block>, Class<? extends CraftBlockData>> MAP = new HashMap<>(); + + static { + register(net.minecraft.server.BlockAnvil.class, org.bukkit.craftbukkit.block.impl.CraftAnvil.class); + register(net.minecraft.server.BlockBanner.class, org.bukkit.craftbukkit.block.impl.CraftBanner.class); + register(net.minecraft.server.BlockBannerWall.class, org.bukkit.craftbukkit.block.impl.CraftBannerWall.class); + register(net.minecraft.server.BlockBed.class, org.bukkit.craftbukkit.block.impl.CraftBed.class); + register(net.minecraft.server.BlockBeetroot.class, org.bukkit.craftbukkit.block.impl.CraftBeetroot.class); + register(net.minecraft.server.BlockBrewingStand.class, org.bukkit.craftbukkit.block.impl.CraftBrewingStand.class); + register(net.minecraft.server.BlockBubbleColumn.class, org.bukkit.craftbukkit.block.impl.CraftBubbleColumn.class); + register(net.minecraft.server.BlockCactus.class, org.bukkit.craftbukkit.block.impl.CraftCactus.class); + register(net.minecraft.server.BlockCake.class, org.bukkit.craftbukkit.block.impl.CraftCake.class); + register(net.minecraft.server.BlockCarrots.class, org.bukkit.craftbukkit.block.impl.CraftCarrots.class); + register(net.minecraft.server.BlockCauldron.class, org.bukkit.craftbukkit.block.impl.CraftCauldron.class); + register(net.minecraft.server.BlockChest.class, org.bukkit.craftbukkit.block.impl.CraftChest.class); + register(net.minecraft.server.BlockChestTrapped.class, org.bukkit.craftbukkit.block.impl.CraftChestTrapped.class); + register(net.minecraft.server.BlockChorusFlower.class, org.bukkit.craftbukkit.block.impl.CraftChorusFlower.class); + register(net.minecraft.server.BlockChorusFruit.class, org.bukkit.craftbukkit.block.impl.CraftChorusFruit.class); + register(net.minecraft.server.BlockCobbleWall.class, org.bukkit.craftbukkit.block.impl.CraftCobbleWall.class); + register(net.minecraft.server.BlockCocoa.class, org.bukkit.craftbukkit.block.impl.CraftCocoa.class); + register(net.minecraft.server.BlockCommand.class, org.bukkit.craftbukkit.block.impl.CraftCommand.class); + register(net.minecraft.server.BlockCoralFan.class, org.bukkit.craftbukkit.block.impl.CraftCoralFan.class); + register(net.minecraft.server.BlockCrops.class, org.bukkit.craftbukkit.block.impl.CraftCrops.class); + register(net.minecraft.server.BlockDaylightDetector.class, org.bukkit.craftbukkit.block.impl.CraftDaylightDetector.class); + register(net.minecraft.server.BlockDirtSnow.class, org.bukkit.craftbukkit.block.impl.CraftDirtSnow.class); + register(net.minecraft.server.BlockDispenser.class, org.bukkit.craftbukkit.block.impl.CraftDispenser.class); + register(net.minecraft.server.BlockDoor.class, org.bukkit.craftbukkit.block.impl.CraftDoor.class); + register(net.minecraft.server.BlockDropper.class, org.bukkit.craftbukkit.block.impl.CraftDropper.class); + register(net.minecraft.server.BlockEndRod.class, org.bukkit.craftbukkit.block.impl.CraftEndRod.class); + register(net.minecraft.server.BlockEnderChest.class, org.bukkit.craftbukkit.block.impl.CraftEnderChest.class); + register(net.minecraft.server.BlockEnderPortalFrame.class, org.bukkit.craftbukkit.block.impl.CraftEnderPortalFrame.class); + register(net.minecraft.server.BlockFence.class, org.bukkit.craftbukkit.block.impl.CraftFence.class); + register(net.minecraft.server.BlockFenceGate.class, org.bukkit.craftbukkit.block.impl.CraftFenceGate.class); + register(net.minecraft.server.BlockFire.class, org.bukkit.craftbukkit.block.impl.CraftFire.class); + register(net.minecraft.server.BlockFloorSign.class, org.bukkit.craftbukkit.block.impl.CraftFloorSign.class); + register(net.minecraft.server.BlockFluids.class, org.bukkit.craftbukkit.block.impl.CraftFluids.class); + register(net.minecraft.server.BlockFurnace.class, org.bukkit.craftbukkit.block.impl.CraftFurnace.class); + register(net.minecraft.server.BlockGlassPane.class, org.bukkit.craftbukkit.block.impl.CraftGlassPane.class); + register(net.minecraft.server.BlockGlazedTerracotta.class, org.bukkit.craftbukkit.block.impl.CraftGlazedTerracotta.class); + register(net.minecraft.server.BlockGrass.class, org.bukkit.craftbukkit.block.impl.CraftGrass.class); + register(net.minecraft.server.BlockHay.class, org.bukkit.craftbukkit.block.impl.CraftHay.class); + register(net.minecraft.server.BlockHopper.class, org.bukkit.craftbukkit.block.impl.CraftHopper.class); + register(net.minecraft.server.BlockHugeMushroom.class, org.bukkit.craftbukkit.block.impl.CraftHugeMushroom.class); + register(net.minecraft.server.BlockIceFrost.class, org.bukkit.craftbukkit.block.impl.CraftIceFrost.class); + register(net.minecraft.server.BlockIronBars.class, org.bukkit.craftbukkit.block.impl.CraftIronBars.class); + register(net.minecraft.server.BlockJukeBox.class, org.bukkit.craftbukkit.block.impl.CraftJukeBox.class); + register(net.minecraft.server.BlockKelp.class, org.bukkit.craftbukkit.block.impl.CraftKelp.class); + register(net.minecraft.server.BlockLadder.class, org.bukkit.craftbukkit.block.impl.CraftLadder.class); + register(net.minecraft.server.BlockLeaves.class, org.bukkit.craftbukkit.block.impl.CraftLeaves.class); + register(net.minecraft.server.BlockLever.class, org.bukkit.craftbukkit.block.impl.CraftLever.class); + register(net.minecraft.server.BlockLogAbstract.class, org.bukkit.craftbukkit.block.impl.CraftLogAbstract.class); + register(net.minecraft.server.BlockMinecartDetector.class, org.bukkit.craftbukkit.block.impl.CraftMinecartDetector.class); + register(net.minecraft.server.BlockMinecartTrack.class, org.bukkit.craftbukkit.block.impl.CraftMinecartTrack.class); + register(net.minecraft.server.BlockMycel.class, org.bukkit.craftbukkit.block.impl.CraftMycel.class); + register(net.minecraft.server.BlockNetherWart.class, org.bukkit.craftbukkit.block.impl.CraftNetherWart.class); + register(net.minecraft.server.BlockNote.class, org.bukkit.craftbukkit.block.impl.CraftNote.class); + register(net.minecraft.server.BlockObserver.class, org.bukkit.craftbukkit.block.impl.CraftObserver.class); + register(net.minecraft.server.BlockPiston.class, org.bukkit.craftbukkit.block.impl.CraftPiston.class); + register(net.minecraft.server.BlockPistonExtension.class, org.bukkit.craftbukkit.block.impl.CraftPistonExtension.class); + register(net.minecraft.server.BlockPistonMoving.class, org.bukkit.craftbukkit.block.impl.CraftPistonMoving.class); + register(net.minecraft.server.BlockPortal.class, org.bukkit.craftbukkit.block.impl.CraftPortal.class); + register(net.minecraft.server.BlockPotatoes.class, org.bukkit.craftbukkit.block.impl.CraftPotatoes.class); + register(net.minecraft.server.BlockPoweredRail.class, org.bukkit.craftbukkit.block.impl.CraftPoweredRail.class); + register(net.minecraft.server.BlockPressurePlateBinary.class, org.bukkit.craftbukkit.block.impl.CraftPressurePlateBinary.class); + register(net.minecraft.server.BlockPressurePlateWeighted.class, org.bukkit.craftbukkit.block.impl.CraftPressurePlateWeighted.class); + register(net.minecraft.server.BlockPumpkinCarved.class, org.bukkit.craftbukkit.block.impl.CraftPumpkinCarved.class); + register(net.minecraft.server.BlockRedstoneComparator.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneComparator.class); + register(net.minecraft.server.BlockRedstoneLamp.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneLamp.class); + register(net.minecraft.server.BlockRedstoneOre.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneOre.class); + register(net.minecraft.server.BlockRedstoneTorch.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneTorch.class); + register(net.minecraft.server.BlockRedstoneTorchWall.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneTorchWall.class); + register(net.minecraft.server.BlockRedstoneWire.class, org.bukkit.craftbukkit.block.impl.CraftRedstoneWire.class); + register(net.minecraft.server.BlockReed.class, org.bukkit.craftbukkit.block.impl.CraftReed.class); + register(net.minecraft.server.BlockRepeater.class, org.bukkit.craftbukkit.block.impl.CraftRepeater.class); + register(net.minecraft.server.BlockRotatable.class, org.bukkit.craftbukkit.block.impl.CraftRotatable.class); + register(net.minecraft.server.BlockSapling.class, org.bukkit.craftbukkit.block.impl.CraftSapling.class); + register(net.minecraft.server.BlockSeaPickle.class, org.bukkit.craftbukkit.block.impl.CraftSeaPickle.class); + register(net.minecraft.server.BlockShulkerBox.class, org.bukkit.craftbukkit.block.impl.CraftShulkerBox.class); + register(net.minecraft.server.BlockSkull.class, org.bukkit.craftbukkit.block.impl.CraftSkull.class); + register(net.minecraft.server.BlockSkullPlayer.class, org.bukkit.craftbukkit.block.impl.CraftSkullPlayer.class); + register(net.minecraft.server.BlockSkullPlayerWall.class, org.bukkit.craftbukkit.block.impl.CraftSkullPlayerWall.class); + register(net.minecraft.server.BlockSkullWall.class, org.bukkit.craftbukkit.block.impl.CraftSkullWall.class); + register(net.minecraft.server.BlockSnow.class, org.bukkit.craftbukkit.block.impl.CraftSnow.class); + register(net.minecraft.server.BlockSoil.class, org.bukkit.craftbukkit.block.impl.CraftSoil.class); + register(net.minecraft.server.BlockStainedGlassPane.class, org.bukkit.craftbukkit.block.impl.CraftStainedGlassPane.class); + register(net.minecraft.server.BlockStairs.class, org.bukkit.craftbukkit.block.impl.CraftStairs.class); + register(net.minecraft.server.BlockStem.class, org.bukkit.craftbukkit.block.impl.CraftStem.class); + register(net.minecraft.server.BlockStemAttached.class, org.bukkit.craftbukkit.block.impl.CraftStemAttached.class); + register(net.minecraft.server.BlockStepAbstract.class, org.bukkit.craftbukkit.block.impl.CraftStepAbstract.class); + register(net.minecraft.server.BlockStoneButton.class, org.bukkit.craftbukkit.block.impl.CraftStoneButton.class); + register(net.minecraft.server.BlockStructure.class, org.bukkit.craftbukkit.block.impl.CraftStructure.class); + register(net.minecraft.server.BlockTallPlantFlower.class, org.bukkit.craftbukkit.block.impl.CraftTallPlantFlower.class); + register(net.minecraft.server.BlockTallPlantShearable.class, org.bukkit.craftbukkit.block.impl.CraftTallPlantShearable.class); + register(net.minecraft.server.BlockTallSeaGrass.class, org.bukkit.craftbukkit.block.impl.CraftTallSeaGrass.class); + register(net.minecraft.server.BlockTorchWall.class, org.bukkit.craftbukkit.block.impl.CraftTorchWall.class); + register(net.minecraft.server.BlockTrapdoor.class, org.bukkit.craftbukkit.block.impl.CraftTrapdoor.class); + register(net.minecraft.server.BlockTripwire.class, org.bukkit.craftbukkit.block.impl.CraftTripwire.class); + register(net.minecraft.server.BlockTripwireHook.class, org.bukkit.craftbukkit.block.impl.CraftTripwireHook.class); + register(net.minecraft.server.BlockTurtleEgg.class, org.bukkit.craftbukkit.block.impl.CraftTurtleEgg.class); + register(net.minecraft.server.BlockVine.class, org.bukkit.craftbukkit.block.impl.CraftVine.class); + register(net.minecraft.server.BlockWallSign.class, org.bukkit.craftbukkit.block.impl.CraftWallSign.class); + register(net.minecraft.server.BlockWitherSkull.class, org.bukkit.craftbukkit.block.impl.CraftWitherSkull.class); + register(net.minecraft.server.BlockWitherSkullWall.class, org.bukkit.craftbukkit.block.impl.CraftWitherSkullWall.class); + register(net.minecraft.server.BlockWoodButton.class, org.bukkit.craftbukkit.block.impl.CraftWoodButton.class); + } + + private static void register(Class<? extends Block> nms, Class<? extends CraftBlockData> bukkit) { + Preconditions.checkState(MAP.put(nms, bukkit) == null, "Duplicate mapping %s->%s", nms, bukkit); + } + + public static CraftBlockData newData(Material material, String data) { + IBlockData blockData; + Block block = CraftMagicNumbers.getBlock(material); + + // Data provided, use it + if (data != null) { + try { + // Material provided, force that material in + if (block != null) { + data = Block.REGISTRY.b(block) + data; + } + + ArgumentBlock arg = new ArgumentBlock(new StringReader(data), false).a(false); + blockData = arg.b(); + } catch (CommandSyntaxException ex) { + throw new IllegalArgumentException("Could not parse data: " + data, ex); + } + } else { + blockData = block.getBlockData(); + } + + return fromData(blockData); + } + + public static CraftBlockData fromData(IBlockData data) { + Class<? extends CraftBlockData> craft = MAP.get(data.getBlock().getClass()); + if (craft == null) { + craft = CraftBlockData.class; + } + + CraftBlockData ret; + try { + ret = craft.getDeclaredConstructor(IBlockData.class).newInstance(data); + } catch (ReflectiveOperationException ex) { + throw new RuntimeException(ex); + } + + return ret; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java new file mode 100644 index 00000000..7b3ec881 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftDirectional.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Directional; + +public abstract class CraftDirectional extends CraftBlockData implements Directional { + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum("facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java new file mode 100644 index 00000000..3d4afa74 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLevelled.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Levelled; + +public abstract class CraftLevelled extends CraftBlockData implements Levelled { + + private static final net.minecraft.server.BlockStateInteger LEVEL = getInteger("level"); + + @Override + public int getLevel() { + return get(LEVEL); + } + + @Override + public void setLevel(int level) { + set(LEVEL, level); + } + + @Override + public int getMaximumLevel() { + return getMax(LEVEL); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java new file mode 100644 index 00000000..cfe4b26e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftLightable.java @@ -0,0 +1,18 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Lightable; + +public abstract class CraftLightable extends CraftBlockData implements Lightable { + + private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean("lit"); + + @Override + public boolean isLit() { + return get(LIT); + } + + @Override + public void setLit(boolean lit) { + set(LIT, lit); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java new file mode 100644 index 00000000..5d2cc2a9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftMultipleFacing.java @@ -0,0 +1,46 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.MultipleFacing; + +public abstract class CraftMultipleFacing extends CraftBlockData implements MultipleFacing { + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean("north", true), getBoolean("east", true), getBoolean("south", true), getBoolean("west", true), getBoolean("up", true), getBoolean("down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java new file mode 100644 index 00000000..31abd411 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOpenable.java @@ -0,0 +1,18 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Openable; + +public abstract class CraftOpenable extends CraftBlockData implements Openable { + + private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean("open"); + + @Override + public boolean isOpen() { + return get(OPEN); + } + + @Override + public void setOpen(boolean open) { + set(OPEN, open); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java new file mode 100644 index 00000000..72cc0aa9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftOrientable.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Orientable; + +public class CraftOrientable extends CraftBlockData implements Orientable { + + private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum("axis"); + + @Override + public org.bukkit.Axis getAxis() { + return get(AXIS, org.bukkit.Axis.class); + } + + @Override + public void setAxis(org.bukkit.Axis axis) { + set(AXIS, axis); + } + + @Override + public java.util.Set<org.bukkit.Axis> getAxes() { + return getValues(AXIS, org.bukkit.Axis.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java new file mode 100644 index 00000000..f932cf17 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftPowerable.java @@ -0,0 +1,18 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Powerable; + +public abstract class CraftPowerable extends CraftBlockData implements Powerable { + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean("powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java new file mode 100644 index 00000000..5ee64559 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRail.java @@ -0,0 +1,23 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Rail; + +public abstract class CraftRail extends CraftBlockData implements Rail { + + private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum("shape"); + + @Override + public Shape getShape() { + return get(SHAPE, Shape.class); + } + + @Override + public void setShape(Shape shape) { + set(SHAPE, shape); + } + + @Override + public java.util.Set<Shape> getShapes() { + return getValues(SHAPE, Shape.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java new file mode 100644 index 00000000..78668da5 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftRotatable.java @@ -0,0 +1,107 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Rotatable; + +public abstract class CraftRotatable extends CraftBlockData implements Rotatable { + + private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger("rotation"); + + @Override + public org.bukkit.block.BlockFace getRotation() { + int data = get(ROTATION); + switch (data) { + case 0x0: + return org.bukkit.block.BlockFace.SOUTH; + case 0x1: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case 0x2: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case 0x3: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case 0x4: + return org.bukkit.block.BlockFace.WEST; + case 0x5: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case 0x6: + return org.bukkit.block.BlockFace.NORTH_WEST; + case 0x7: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case 0x8: + return org.bukkit.block.BlockFace.NORTH; + case 0x9: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case 0xA: + return org.bukkit.block.BlockFace.NORTH_EAST; + case 0xB: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case 0xC: + return org.bukkit.block.BlockFace.EAST; + case 0xD: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case 0xE: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case 0xF: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + data); + } + } + + @Override + public void setRotation(org.bukkit.block.BlockFace rotation) { + int val; + switch (rotation) { + case SOUTH: + val = 0x0; + break; + case SOUTH_SOUTH_WEST: + val = 0x1; + break; + case SOUTH_WEST: + val = 0x2; + break; + case WEST_SOUTH_WEST: + val = 0x3; + break; + case WEST: + val = 0x4; + break; + case WEST_NORTH_WEST: + val = 0x5; + break; + case NORTH_WEST: + val = 0x6; + break; + case NORTH_NORTH_WEST: + val = 0x7; + break; + case NORTH: + val = 0x8; + break; + case NORTH_NORTH_EAST: + val = 0x9; + break; + case NORTH_EAST: + val = 0xA; + break; + case EAST_NORTH_EAST: + val = 0xB; + break; + case EAST: + val = 0xC; + break; + case EAST_SOUTH_EAST: + val = 0xD; + break; + case SOUTH_EAST: + val = 0xE; + break; + case SOUTH_SOUTH_EAST: + val = 0xF; + break; + default: + throw new IllegalArgumentException("Illegal rotation " + rotation); + } + set(ROTATION, val); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java new file mode 100644 index 00000000..e59c3d23 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftSnowable.java @@ -0,0 +1,18 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Snowable; + +public abstract class CraftSnowable extends CraftBlockData implements Snowable { + + private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean("snowy"); + + @Override + public boolean isSnowy() { + return get(SNOWY); + } + + @Override + public void setSnowy(boolean snowy) { + set(SNOWY, snowy); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java b/src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java new file mode 100644 index 00000000..011c9aea --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/CraftWaterlogged.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data; + +import org.bukkit.block.data.Waterlogged; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftWaterlogged extends CraftBlockData implements Waterlogged { + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean("waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java new file mode 100644 index 00000000..f86ed259 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBed.java @@ -0,0 +1,25 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Bed; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftBed extends CraftBlockData implements Bed { + + private static final net.minecraft.server.BlockStateEnum<?> PART = getEnum("part"); + private static final net.minecraft.server.BlockStateBoolean OCCUPIED = getBoolean("occupied"); + + @Override + public Part getPart() { + return get(PART, Part.class); + } + + @Override + public void setPart(Part part) { + set(PART, part); + } + + @Override + public boolean isOccupied() { + return get(OCCUPIED); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java new file mode 100644 index 00000000..9349e02f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBrewingStand.java @@ -0,0 +1,39 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.BrewingStand; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftBrewingStand extends CraftBlockData implements BrewingStand { + + private static final net.minecraft.server.BlockStateBoolean[] HAS_BOTTLE = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean("has_bottle_0"), getBoolean("has_bottle_1"), getBoolean("has_bottle_2") + }; + + @Override + public boolean hasBottle(int bottle) { + return get(HAS_BOTTLE[bottle]); + } + + @Override + public void setBottle(int bottle, boolean has) { + set(HAS_BOTTLE[bottle], has); + } + + @Override + public java.util.Set<Integer> getBottles() { + com.google.common.collect.ImmutableSet.Builder<Integer> bottles = com.google.common.collect.ImmutableSet.builder(); + + for (int index = 0; index < getMaximumBottles(); index++) { + if (hasBottle(index)) { + bottles.add(index); + } + } + + return bottles.build(); + } + + @Override + public int getMaximumBottles() { + return HAS_BOTTLE.length; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java new file mode 100644 index 00000000..eedb5102 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftBubbleColumn.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.BubbleColumn; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftBubbleColumn extends CraftBlockData implements BubbleColumn { + + private static final net.minecraft.server.BlockStateBoolean DRAG = getBoolean("drag"); + + @Override + public boolean isDrag() { + return get(DRAG); + } + + @Override + public void setDrag(boolean drag) { + set(DRAG, drag); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java new file mode 100644 index 00000000..aae60937 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCake.java @@ -0,0 +1,24 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Cake; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftCake extends CraftBlockData implements Cake { + + private static final net.minecraft.server.BlockStateInteger BITES = getInteger("bites"); + + @Override + public int getBites() { + return get(BITES); + } + + @Override + public void setBites(int bites) { + set(BITES, bites); + } + + @Override + public int getMaximumBites() { + return getMax(BITES); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java new file mode 100644 index 00000000..70473ef4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftChest.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Chest; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftChest extends CraftBlockData implements Chest { + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum("type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java new file mode 100644 index 00000000..ddb9ac5e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftCommandBlock.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.CommandBlock; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftCommandBlock extends CraftBlockData implements CommandBlock { + + private static final net.minecraft.server.BlockStateBoolean CONDITIONAL = getBoolean("conditional"); + + @Override + public boolean isConditional() { + return get(CONDITIONAL); + } + + @Override + public void setConditional(boolean conditional) { + set(CONDITIONAL, conditional); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java new file mode 100644 index 00000000..4f3130a5 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftComparator.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Comparator; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftComparator extends CraftBlockData implements Comparator { + + private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum("mode"); + + @Override + public Mode getMode() { + return get(MODE, Mode.class); + } + + @Override + public void setMode(Mode mode) { + set(MODE, mode); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java new file mode 100644 index 00000000..842fe51f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDaylightDetector.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.DaylightDetector; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftDaylightDetector extends CraftBlockData implements DaylightDetector { + + private static final net.minecraft.server.BlockStateBoolean INVERTED = getBoolean("inverted"); + + @Override + public boolean isInverted() { + return get(INVERTED); + } + + @Override + public void setInverted(boolean inverted) { + set(INVERTED, inverted); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java new file mode 100644 index 00000000..5d43240e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDispenser.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Dispenser; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftDispenser extends CraftBlockData implements Dispenser { + + private static final net.minecraft.server.BlockStateBoolean TRIGGERED = getBoolean("triggered"); + + @Override + public boolean isTriggered() { + return get(TRIGGERED); + } + + @Override + public void setTriggered(boolean triggered) { + set(TRIGGERED, triggered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java new file mode 100644 index 00000000..3fc75dd2 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftDoor.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Door; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftDoor extends CraftBlockData implements Door { + + private static final net.minecraft.server.BlockStateEnum<?> HINGE = getEnum("hinge"); + + @Override + public Hinge getHinge() { + return get(HINGE, Hinge.class); + } + + @Override + public void setHinge(Hinge hinge) { + set(HINGE, hinge); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java new file mode 100644 index 00000000..84cd1d03 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftEndPortalFrame.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.EndPortalFrame; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftEndPortalFrame extends CraftBlockData implements EndPortalFrame { + + private static final net.minecraft.server.BlockStateBoolean EYE = getBoolean("eye"); + + @Override + public boolean hasEye() { + return get(EYE); + } + + @Override + public void setEye(boolean eye) { + set(EYE, eye); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java new file mode 100644 index 00000000..515ee588 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftFarmland.java @@ -0,0 +1,24 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Farmland; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftFarmland extends CraftBlockData implements Farmland { + + private static final net.minecraft.server.BlockStateInteger MOISTURE = getInteger("moisture"); + + @Override + public int getMoisture() { + return get(MOISTURE); + } + + @Override + public void setMoisture(int moisture) { + set(MOISTURE, moisture); + } + + @Override + public int getMaximumMoisture() { + return getMax(MOISTURE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java new file mode 100644 index 00000000..1f6ad5d9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftGate.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Gate; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftGate extends CraftBlockData implements Gate { + + private static final net.minecraft.server.BlockStateBoolean IN_WALL = getBoolean("in_wall"); + + @Override + public boolean isInWall() { + return get(IN_WALL); + } + + @Override + public void setInWall(boolean inWall) { + set(IN_WALL, inWall); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java new file mode 100644 index 00000000..055629fd --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftHopper.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Hopper; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftHopper extends CraftBlockData implements Hopper { + + private static final net.minecraft.server.BlockStateBoolean ENABLED = getBoolean("enabled"); + + @Override + public boolean isEnabled() { + return get(ENABLED); + } + + @Override + public void setEnabled(boolean enabled) { + set(ENABLED, enabled); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java new file mode 100644 index 00000000..32eab86d --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftJukebox.java @@ -0,0 +1,14 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.block.data.type.Jukebox; + +public abstract class CraftJukebox extends CraftBlockData implements Jukebox { + + private static final net.minecraft.server.BlockStateBoolean HAS_RECORD = getBoolean("has_record"); + + @Override + public boolean hasRecord() { + return get(HAS_RECORD); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java new file mode 100644 index 00000000..a233f555 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftLeaves.java @@ -0,0 +1,30 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Leaves; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public class CraftLeaves extends CraftBlockData implements Leaves { + + private static final net.minecraft.server.BlockStateInteger DISTANCE = getInteger("distance"); + private static final net.minecraft.server.BlockStateBoolean PERSISTENT = getBoolean("persistent"); + + @Override + public boolean isPersistent() { + return get(PERSISTENT); + } + + @Override + public void setPersistent(boolean persistent) { + set(PERSISTENT, persistent); + } + + @Override + public int getDistance() { + return get(DISTANCE); + } + + @Override + public void setDistance(int distance) { + set(DISTANCE, distance); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java new file mode 100644 index 00000000..51814a49 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftNoteBlock.java @@ -0,0 +1,30 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftNoteBlock extends CraftBlockData implements NoteBlock { + + private static final net.minecraft.server.BlockStateEnum<?> INSTRUMENT = getEnum("instrument"); + private static final net.minecraft.server.BlockStateInteger NOTE = getInteger("note"); + + @Override + public org.bukkit.Instrument getInstrument() { + return get(INSTRUMENT, org.bukkit.Instrument.class); + } + + @Override + public void setInstrument(org.bukkit.Instrument instrument) { + set(INSTRUMENT, instrument); + } + + @Override + public org.bukkit.Note getNote() { + return new org.bukkit.Note(get(NOTE)); + } + + @Override + public void setNote(org.bukkit.Note note) { + set(NOTE, (int) note.getId()); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java new file mode 100644 index 00000000..8cebb751 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPiston.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Piston; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftPiston extends CraftBlockData implements Piston { + + private static final net.minecraft.server.BlockStateBoolean EXTENDED = getBoolean("extended"); + + @Override + public boolean isExtended() { + return get(EXTENDED); + } + + @Override + public void setExtended(boolean extended) { + set(EXTENDED, extended); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java new file mode 100644 index 00000000..3fb24d4b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftPistonHead.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.PistonHead; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftPistonHead extends CraftBlockData implements PistonHead { + + private static final net.minecraft.server.BlockStateBoolean SHORT = getBoolean("short"); + + @Override + public boolean isShort() { + return get(SHORT); + } + + @Override + public void setShort(boolean _short) { + set(SHORT, _short); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java new file mode 100644 index 00000000..34923dad --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRedstoneWire.java @@ -0,0 +1,49 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.RedstoneWire; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftRedstoneWire extends CraftBlockData implements RedstoneWire { + + private static final net.minecraft.server.BlockStateEnum<?> NORTH = getEnum("north"); + private static final net.minecraft.server.BlockStateEnum<?> EAST = getEnum("east"); + private static final net.minecraft.server.BlockStateEnum<?> SOUTH = getEnum("south"); + private static final net.minecraft.server.BlockStateEnum<?> WEST = getEnum("west"); + + @Override + public Connection getFace(org.bukkit.block.BlockFace face) { + switch (face) { + case NORTH: + return get(NORTH, Connection.class); + case EAST: + return get(EAST, Connection.class); + case SOUTH: + return get(SOUTH, Connection.class); + case WEST: + return get(WEST, Connection.class); + default: + throw new IllegalArgumentException("Cannot have face " + face); + } + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, Connection connection) { + switch (face) { + case NORTH: + set(NORTH, connection); + case EAST: + set(EAST, connection); + case SOUTH: + set(SOUTH, connection); + case WEST: + set(WEST, connection); + default: + throw new IllegalArgumentException("Cannot have face " + face); + } + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + return com.google.common.collect.ImmutableSet.of(org.bukkit.block.BlockFace.NORTH, org.bukkit.block.BlockFace.EAST, org.bukkit.block.BlockFace.SOUTH, org.bukkit.block.BlockFace.WEST); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java new file mode 100644 index 00000000..482a4ed7 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftRepeater.java @@ -0,0 +1,40 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Repeater; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftRepeater extends CraftBlockData implements Repeater { + + private static final net.minecraft.server.BlockStateInteger DELAY = getInteger("delay"); + private static final net.minecraft.server.BlockStateBoolean LOCKED = getBoolean("locked"); + + @Override + public int getDelay() { + return get(DELAY); + } + + @Override + public void setDelay(int delay) { + set(DELAY, delay); + } + + @Override + public int getMinimumDelay() { + return getMin(DELAY); + } + + @Override + public int getMaximumDelay() { + return getMax(DELAY); + } + + @Override + public boolean isLocked() { + return get(LOCKED); + } + + @Override + public void setLocked(boolean locked) { + set(LOCKED, locked); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java new file mode 100644 index 00000000..dd96acff --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSapling.java @@ -0,0 +1,24 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Sapling; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftSapling extends CraftBlockData implements Sapling { + + private static final net.minecraft.server.BlockStateInteger STAGE = getInteger("stage"); + + @Override + public int getStage() { + return get(STAGE); + } + + @Override + public void setStage(int stage) { + set(STAGE, stage); + } + + @Override + public int getMaximumStage() { + return getMax(STAGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java new file mode 100644 index 00000000..dc138d9c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSeaPickle.java @@ -0,0 +1,29 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.SeaPickle; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftSeaPickle extends CraftBlockData implements SeaPickle { + + private static final net.minecraft.server.BlockStateInteger PICKLES = getInteger("pickles"); + + @Override + public int getPickles() { + return get(PICKLES); + } + + @Override + public void setPickles(int pickles) { + set(PICKLES, pickles); + } + + @Override + public int getMinimumPickles() { + return getMin(PICKLES); + } + + @Override + public int getMaximumPickles() { + return getMax(PICKLES); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java new file mode 100644 index 00000000..1fde489e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSlab.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Slab; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftSlab extends CraftBlockData implements Slab { + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum("type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java new file mode 100644 index 00000000..879a5d67 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSnow.java @@ -0,0 +1,29 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Snow; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public class CraftSnow extends CraftBlockData implements Snow { + + private static final net.minecraft.server.BlockStateInteger LAYERS = getInteger("layers"); + + @Override + public int getLayers() { + return get(LAYERS); + } + + @Override + public void setLayers(int layers) { + set(LAYERS, layers); + } + + @Override + public int getMinimumLayers() { + return getMin(LAYERS); + } + + @Override + public int getMaximumLayers() { + return getMax(LAYERS); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java new file mode 100644 index 00000000..c6ccd382 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStairs.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Stairs; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftStairs extends CraftBlockData implements Stairs { + + private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum("shape"); + + @Override + public Shape getShape() { + return get(SHAPE, Shape.class); + } + + @Override + public void setShape(Shape shape) { + set(SHAPE, shape); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java new file mode 100644 index 00000000..8b8a82bd --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftStructureBlock.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.StructureBlock; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftStructureBlock extends CraftBlockData implements StructureBlock { + + private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum("mode"); + + @Override + public Mode getMode() { + return get(MODE, Mode.class); + } + + @Override + public void setMode(Mode mode) { + set(MODE, mode); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java new file mode 100644 index 00000000..2761b371 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftSwitch.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Switch; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftSwitch extends CraftBlockData implements Switch { + + private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum("face"); + + @Override + public Face getFace() { + return get(FACE, Face.class); + } + + @Override + public void setFace(Face face) { + set(FACE, face); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java new file mode 100644 index 00000000..e42fe0d6 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTechnicalPiston.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.TechnicalPiston; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftTechnicalPiston extends CraftBlockData implements TechnicalPiston { + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum("type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java new file mode 100644 index 00000000..55bacd2e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTripwire.java @@ -0,0 +1,19 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.Tripwire; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftTripwire extends CraftBlockData implements Tripwire { + + private static final net.minecraft.server.BlockStateBoolean DISARMED = getBoolean("disarmed"); + + @Override + public boolean isDisarmed() { + return get(DISARMED); + } + + @Override + public void setDisarmed(boolean disarmed) { + set(DISARMED, disarmed); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java new file mode 100644 index 00000000..dca37886 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/data/type/CraftTurtleEgg.java @@ -0,0 +1,45 @@ +package org.bukkit.craftbukkit.block.data.type; + +import org.bukkit.block.data.type.TurtleEgg; +import org.bukkit.craftbukkit.block.data.CraftBlockData; + +public abstract class CraftTurtleEgg extends CraftBlockData implements TurtleEgg { + + private static final net.minecraft.server.BlockStateInteger EGGS = getInteger("eggs"); + private static final net.minecraft.server.BlockStateInteger HATCH = getInteger("hatch"); + + @Override + public int getEggs() { + return get(EGGS); + } + + @Override + public void setEggs(int eggs) { + set(EGGS, eggs); + } + + @Override + public int getMinimumEggs() { + return getMin(EGGS); + } + + @Override + public int getMaximumEggs() { + return getMax(EGGS); + } + + @Override + public int getHatch() { + return get(HATCH); + } + + @Override + public void setHatch(int hatch) { + set(HATCH, hatch); + } + + @Override + public int getMaximumHatch() { + return getMax(HATCH); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java new file mode 100644 index 00000000..3010e8fe --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftAnvil.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftAnvil extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftAnvil() { + super(); + } + + public CraftAnvil(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockAnvil.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java new file mode 100644 index 00000000..d95c548b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBanner.java @@ -0,0 +1,118 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftBanner extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable { + + public CraftBanner() { + super(); + } + + public CraftBanner(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftRotatable + + private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockBanner.class, "rotation"); + + @Override + public org.bukkit.block.BlockFace getRotation() { + int data = get(ROTATION); + switch (data) { + case 0x0: + return org.bukkit.block.BlockFace.SOUTH; + case 0x1: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case 0x2: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case 0x3: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case 0x4: + return org.bukkit.block.BlockFace.WEST; + case 0x5: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case 0x6: + return org.bukkit.block.BlockFace.NORTH_WEST; + case 0x7: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case 0x8: + return org.bukkit.block.BlockFace.NORTH; + case 0x9: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case 0xA: + return org.bukkit.block.BlockFace.NORTH_EAST; + case 0xB: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case 0xC: + return org.bukkit.block.BlockFace.EAST; + case 0xD: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case 0xE: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case 0xF: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + data); + } + } + + @Override + public void setRotation(org.bukkit.block.BlockFace rotation) { + int val; + switch (rotation) { + case SOUTH: + val = 0x0; + break; + case SOUTH_SOUTH_WEST: + val = 0x1; + break; + case SOUTH_WEST: + val = 0x2; + break; + case WEST_SOUTH_WEST: + val = 0x3; + break; + case WEST: + val = 0x4; + break; + case WEST_NORTH_WEST: + val = 0x5; + break; + case NORTH_WEST: + val = 0x6; + break; + case NORTH_NORTH_WEST: + val = 0x7; + break; + case NORTH: + val = 0x8; + break; + case NORTH_NORTH_EAST: + val = 0x9; + break; + case NORTH_EAST: + val = 0xA; + break; + case EAST_NORTH_EAST: + val = 0xB; + break; + case EAST: + val = 0xC; + break; + case EAST_SOUTH_EAST: + val = 0xD; + break; + case SOUTH_EAST: + val = 0xE; + break; + case SOUTH_SOUTH_EAST: + val = 0xF; + break; + default: + throw new IllegalArgumentException("Illegal rotation " + rotation); + } + set(ROTATION, val); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java new file mode 100644 index 00000000..48215035 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBannerWall.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftBannerWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftBannerWall() { + super(); + } + + public CraftBannerWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockBannerWall.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java new file mode 100644 index 00000000..c625c964 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBed.java @@ -0,0 +1,54 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftBed extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Bed, org.bukkit.block.data.Directional { + + public CraftBed() { + super(); + } + + public CraftBed(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftBed + + private static final net.minecraft.server.BlockStateEnum<?> PART = getEnum(net.minecraft.server.BlockBed.class, "part"); + private static final net.minecraft.server.BlockStateBoolean OCCUPIED = getBoolean(net.minecraft.server.BlockBed.class, "occupied"); + + @Override + public Part getPart() { + return get(PART, Part.class); + } + + @Override + public void setPart(Part part) { + set(PART, part); + } + + @Override + public boolean isOccupied() { + return get(OCCUPIED); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockBed.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java new file mode 100644 index 00000000..4e9a27f4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBeetroot.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftBeetroot extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftBeetroot() { + super(); + } + + public CraftBeetroot(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockBeetroot.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java new file mode 100644 index 00000000..fe0e7dec --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBrewingStand.java @@ -0,0 +1,49 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftBrewingStand extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.BrewingStand { + + public CraftBrewingStand() { + super(); + } + + public CraftBrewingStand(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftBrewingStand + + private static final net.minecraft.server.BlockStateBoolean[] HAS_BOTTLE = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockBrewingStand.class, "has_bottle_0"), getBoolean(net.minecraft.server.BlockBrewingStand.class, "has_bottle_1"), getBoolean(net.minecraft.server.BlockBrewingStand.class, "has_bottle_2") + }; + + @Override + public boolean hasBottle(int bottle) { + return get(HAS_BOTTLE[bottle]); + } + + @Override + public void setBottle(int bottle, boolean has) { + set(HAS_BOTTLE[bottle], has); + } + + @Override + public java.util.Set<Integer> getBottles() { + com.google.common.collect.ImmutableSet.Builder<Integer> bottles = com.google.common.collect.ImmutableSet.builder(); + + for (int index = 0; index < getMaximumBottles(); index++) { + if (hasBottle(index)) { + bottles.add(index); + } + } + + return bottles.build(); + } + + @Override + public int getMaximumBottles() { + return HAS_BOTTLE.length; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java new file mode 100644 index 00000000..574a5b9a --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftBubbleColumn.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftBubbleColumn extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.BubbleColumn { + + public CraftBubbleColumn() { + super(); + } + + public CraftBubbleColumn(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftBubbleColumn + + private static final net.minecraft.server.BlockStateBoolean DRAG = getBoolean(net.minecraft.server.BlockBubbleColumn.class, "drag"); + + @Override + public boolean isDrag() { + return get(DRAG); + } + + @Override + public void setDrag(boolean drag) { + set(DRAG, drag); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java new file mode 100644 index 00000000..e62f4dd1 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCactus.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCactus extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftCactus() { + super(); + } + + public CraftCactus(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCactus.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java new file mode 100644 index 00000000..fee523ab --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCake.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCake extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Cake { + + public CraftCake() { + super(); + } + + public CraftCake(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftCake + + private static final net.minecraft.server.BlockStateInteger BITES = getInteger(net.minecraft.server.BlockCake.class, "bites"); + + @Override + public int getBites() { + return get(BITES); + } + + @Override + public void setBites(int bites) { + set(BITES, bites); + } + + @Override + public int getMaximumBites() { + return getMax(BITES); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java new file mode 100644 index 00000000..9ab29636 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCarrots.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCarrots extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftCarrots() { + super(); + } + + public CraftCarrots(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCarrots.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java new file mode 100644 index 00000000..5ddeb715 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCauldron.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCauldron extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Levelled { + + public CraftCauldron() { + super(); + } + + public CraftCauldron(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftLevelled + + private static final net.minecraft.server.BlockStateInteger LEVEL = getInteger(net.minecraft.server.BlockCauldron.class, "level"); + + @Override + public int getLevel() { + return get(LEVEL); + } + + @Override + public void setLevel(int level) { + set(LEVEL, level); + } + + @Override + public int getMaximumLevel() { + return getMax(LEVEL); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java new file mode 100644 index 00000000..44f3a532 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChest.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftChest extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Chest, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged { + + public CraftChest() { + super(); + } + + public CraftChest(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftChest + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockChest.class, "type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockChest.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockChest.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java new file mode 100644 index 00000000..cc8f88ba --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChestTrapped.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftChestTrapped extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Chest, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged { + + public CraftChestTrapped() { + super(); + } + + public CraftChestTrapped(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftChest + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockChestTrapped.class, "type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockChestTrapped.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockChestTrapped.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java new file mode 100644 index 00000000..af1e85bc --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFlower.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftChorusFlower extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftChorusFlower() { + super(); + } + + public CraftChorusFlower(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockChorusFlower.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java new file mode 100644 index 00000000..27ae41a9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftChorusFruit.java @@ -0,0 +1,57 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftChorusFruit extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.MultipleFacing { + + public CraftChorusFruit() { + super(); + } + + public CraftChorusFruit(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockChorusFruit.class, "north", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "east", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "south", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "west", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "up", true), getBoolean(net.minecraft.server.BlockChorusFruit.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java new file mode 100644 index 00000000..b1acc7c4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCobbleWall.java @@ -0,0 +1,71 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCobbleWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fence, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged { + + public CraftCobbleWall() { + super(); + } + + public CraftCobbleWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockCobbleWall.class, "north", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "east", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "south", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "west", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "up", true), getBoolean(net.minecraft.server.BlockCobbleWall.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockCobbleWall.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java new file mode 100644 index 00000000..79b2b52c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCocoa.java @@ -0,0 +1,53 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCocoa extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Cocoa, org.bukkit.block.data.Ageable, org.bukkit.block.data.Directional { + + public CraftCocoa() { + super(); + } + + public CraftCocoa(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCocoa.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockCocoa.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java new file mode 100644 index 00000000..ed1684a6 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCommand.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCommand extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.CommandBlock, org.bukkit.block.data.Directional { + + public CraftCommand() { + super(); + } + + public CraftCommand(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftCommandBlock + + private static final net.minecraft.server.BlockStateBoolean CONDITIONAL = getBoolean(net.minecraft.server.BlockCommand.class, "conditional"); + + @Override + public boolean isConditional() { + return get(CONDITIONAL); + } + + @Override + public void setConditional(boolean conditional) { + set(CONDITIONAL, conditional); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockCommand.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java new file mode 100644 index 00000000..3385af14 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCoralFan.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCoralFan extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftCoralFan() { + super(); + } + + public CraftCoralFan(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockCoralFan.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java new file mode 100644 index 00000000..61921a2a --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftCrops.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftCrops extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftCrops() { + super(); + } + + public CraftCrops(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockCrops.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java new file mode 100644 index 00000000..ffed5c9a --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDaylightDetector.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftDaylightDetector extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.DaylightDetector, org.bukkit.block.data.AnaloguePowerable { + + public CraftDaylightDetector() { + super(); + } + + public CraftDaylightDetector(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftDaylightDetector + + private static final net.minecraft.server.BlockStateBoolean INVERTED = getBoolean(net.minecraft.server.BlockDaylightDetector.class, "inverted"); + + @Override + public boolean isInverted() { + return get(INVERTED); + } + + @Override + public void setInverted(boolean inverted) { + set(INVERTED, inverted); + } + + // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable + + private static final net.minecraft.server.BlockStateInteger POWER = getInteger(net.minecraft.server.BlockDaylightDetector.class, "power"); + + @Override + public int getPower() { + return get(POWER); + } + + @Override + public void setPower(int power) { + set(POWER, power); + } + + @Override + public int getMaximumPower() { + return getMax(POWER); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java new file mode 100644 index 00000000..7c3857e9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDirtSnow.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftDirtSnow extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Snowable { + + public CraftDirtSnow() { + super(); + } + + public CraftDirtSnow(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftSnowable + + private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean(net.minecraft.server.BlockDirtSnow.class, "snowy"); + + @Override + public boolean isSnowy() { + return get(SNOWY); + } + + @Override + public void setSnowy(boolean snowy) { + set(SNOWY, snowy); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java new file mode 100644 index 00000000..cea8f941 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDispenser.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftDispenser extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Dispenser, org.bukkit.block.data.Directional { + + public CraftDispenser() { + super(); + } + + public CraftDispenser(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftDispenser + + private static final net.minecraft.server.BlockStateBoolean TRIGGERED = getBoolean(net.minecraft.server.BlockDispenser.class, "triggered"); + + @Override + public boolean isTriggered() { + return get(TRIGGERED); + } + + @Override + public void setTriggered(boolean triggered) { + set(TRIGGERED, triggered); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockDispenser.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java new file mode 100644 index 00000000..ec8639bf --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDoor.java @@ -0,0 +1,90 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftDoor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Door, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable { + + public CraftDoor() { + super(); + } + + public CraftDoor(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftDoor + + private static final net.minecraft.server.BlockStateEnum<?> HINGE = getEnum(net.minecraft.server.BlockDoor.class, "hinge"); + + @Override + public Hinge getHinge() { + return get(HINGE, Hinge.class); + } + + @Override + public void setHinge(Hinge hinge) { + set(HINGE, hinge); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockDoor.class, "half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockDoor.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftOpenable + + private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean(net.minecraft.server.BlockDoor.class, "open"); + + @Override + public boolean isOpen() { + return get(OPEN); + } + + @Override + public void setOpen(boolean open) { + set(OPEN, open); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockDoor.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java new file mode 100644 index 00000000..82486f1b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftDropper.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftDropper extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Dispenser, org.bukkit.block.data.Directional { + + public CraftDropper() { + super(); + } + + public CraftDropper(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftDispenser + + private static final net.minecraft.server.BlockStateBoolean TRIGGERED = getBoolean(net.minecraft.server.BlockDropper.class, "triggered"); + + @Override + public boolean isTriggered() { + return get(TRIGGERED); + } + + @Override + public void setTriggered(boolean triggered) { + set(TRIGGERED, triggered); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockDropper.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java new file mode 100644 index 00000000..d72c9d05 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEndRod.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftEndRod extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftEndRod() { + super(); + } + + public CraftEndRod(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockEndRod.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java new file mode 100644 index 00000000..2f838080 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderChest.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftEnderChest extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.EnderChest, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged { + + public CraftEnderChest() { + super(); + } + + public CraftEnderChest(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockEnderChest.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockEnderChest.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java new file mode 100644 index 00000000..f57cbbec --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftEnderPortalFrame.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftEnderPortalFrame extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.EndPortalFrame, org.bukkit.block.data.Directional { + + public CraftEnderPortalFrame() { + super(); + } + + public CraftEnderPortalFrame(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftEndPortalFrame + + private static final net.minecraft.server.BlockStateBoolean EYE = getBoolean(net.minecraft.server.BlockEnderPortalFrame.class, "eye"); + + @Override + public boolean hasEye() { + return get(EYE); + } + + @Override + public void setEye(boolean eye) { + set(EYE, eye); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockEnderPortalFrame.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java new file mode 100644 index 00000000..1333b997 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFence.java @@ -0,0 +1,71 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftFence extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fence, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged { + + public CraftFence() { + super(); + } + + public CraftFence(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockFence.class, "north", true), getBoolean(net.minecraft.server.BlockFence.class, "east", true), getBoolean(net.minecraft.server.BlockFence.class, "south", true), getBoolean(net.minecraft.server.BlockFence.class, "west", true), getBoolean(net.minecraft.server.BlockFence.class, "up", true), getBoolean(net.minecraft.server.BlockFence.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockFence.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java new file mode 100644 index 00000000..4fc29445 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFenceGate.java @@ -0,0 +1,76 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftFenceGate extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Gate, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable { + + public CraftFenceGate() { + super(); + } + + public CraftFenceGate(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftGate + + private static final net.minecraft.server.BlockStateBoolean IN_WALL = getBoolean(net.minecraft.server.BlockFenceGate.class, "in_wall"); + + @Override + public boolean isInWall() { + return get(IN_WALL); + } + + @Override + public void setInWall(boolean inWall) { + set(IN_WALL, inWall); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockFenceGate.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftOpenable + + private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean(net.minecraft.server.BlockFenceGate.class, "open"); + + @Override + public boolean isOpen() { + return get(OPEN); + } + + @Override + public void setOpen(boolean open) { + set(OPEN, open); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockFenceGate.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java new file mode 100644 index 00000000..a5809355 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFire.java @@ -0,0 +1,76 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftFire extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fire, org.bukkit.block.data.Ageable, org.bukkit.block.data.MultipleFacing { + + public CraftFire() { + super(); + } + + public CraftFire(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockFire.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockFire.class, "north", true), getBoolean(net.minecraft.server.BlockFire.class, "east", true), getBoolean(net.minecraft.server.BlockFire.class, "south", true), getBoolean(net.minecraft.server.BlockFire.class, "west", true), getBoolean(net.minecraft.server.BlockFire.class, "up", true), getBoolean(net.minecraft.server.BlockFire.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java new file mode 100644 index 00000000..aa52ec77 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFloorSign.java @@ -0,0 +1,132 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftFloorSign extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Sign, org.bukkit.block.data.Rotatable, org.bukkit.block.data.Waterlogged { + + public CraftFloorSign() { + super(); + } + + public CraftFloorSign(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftRotatable + + private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockFloorSign.class, "rotation"); + + @Override + public org.bukkit.block.BlockFace getRotation() { + int data = get(ROTATION); + switch (data) { + case 0x0: + return org.bukkit.block.BlockFace.SOUTH; + case 0x1: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case 0x2: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case 0x3: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case 0x4: + return org.bukkit.block.BlockFace.WEST; + case 0x5: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case 0x6: + return org.bukkit.block.BlockFace.NORTH_WEST; + case 0x7: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case 0x8: + return org.bukkit.block.BlockFace.NORTH; + case 0x9: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case 0xA: + return org.bukkit.block.BlockFace.NORTH_EAST; + case 0xB: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case 0xC: + return org.bukkit.block.BlockFace.EAST; + case 0xD: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case 0xE: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case 0xF: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + data); + } + } + + @Override + public void setRotation(org.bukkit.block.BlockFace rotation) { + int val; + switch (rotation) { + case SOUTH: + val = 0x0; + break; + case SOUTH_SOUTH_WEST: + val = 0x1; + break; + case SOUTH_WEST: + val = 0x2; + break; + case WEST_SOUTH_WEST: + val = 0x3; + break; + case WEST: + val = 0x4; + break; + case WEST_NORTH_WEST: + val = 0x5; + break; + case NORTH_WEST: + val = 0x6; + break; + case NORTH_NORTH_WEST: + val = 0x7; + break; + case NORTH: + val = 0x8; + break; + case NORTH_NORTH_EAST: + val = 0x9; + break; + case NORTH_EAST: + val = 0xA; + break; + case EAST_NORTH_EAST: + val = 0xB; + break; + case EAST: + val = 0xC; + break; + case EAST_SOUTH_EAST: + val = 0xD; + break; + case SOUTH_EAST: + val = 0xE; + break; + case SOUTH_SOUTH_EAST: + val = 0xF; + break; + default: + throw new IllegalArgumentException("Illegal rotation " + rotation); + } + set(ROTATION, val); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockFloorSign.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java new file mode 100644 index 00000000..21c30c7c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFluids.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftFluids extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Levelled { + + public CraftFluids() { + super(); + } + + public CraftFluids(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftLevelled + + private static final net.minecraft.server.BlockStateInteger LEVEL = getInteger(net.minecraft.server.BlockFluids.class, "level"); + + @Override + public int getLevel() { + return get(LEVEL); + } + + @Override + public void setLevel(int level) { + set(LEVEL, level); + } + + @Override + public int getMaximumLevel() { + return getMax(LEVEL); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java new file mode 100644 index 00000000..1ca1a9c7 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftFurnace.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftFurnace extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Furnace, org.bukkit.block.data.Directional, org.bukkit.block.data.Lightable { + + public CraftFurnace() { + super(); + } + + public CraftFurnace(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockFurnace.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftLightable + + private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockFurnace.class, "lit"); + + @Override + public boolean isLit() { + return get(LIT); + } + + @Override + public void setLit(boolean lit) { + set(LIT, lit); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java new file mode 100644 index 00000000..4c8bfcb7 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlassPane.java @@ -0,0 +1,71 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftGlassPane extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.GlassPane, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged { + + public CraftGlassPane() { + super(); + } + + public CraftGlassPane(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockGlassPane.class, "north", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "east", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "south", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "west", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "up", true), getBoolean(net.minecraft.server.BlockGlassPane.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockGlassPane.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java new file mode 100644 index 00000000..89cc7f95 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGlazedTerracotta.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftGlazedTerracotta extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftGlazedTerracotta() { + super(); + } + + public CraftGlazedTerracotta(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockGlazedTerracotta.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java new file mode 100644 index 00000000..08fcfb0b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftGrass.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftGrass extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Snowable { + + public CraftGrass() { + super(); + } + + public CraftGrass(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftSnowable + + private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean(net.minecraft.server.BlockGrass.class, "snowy"); + + @Override + public boolean isSnowy() { + return get(SNOWY); + } + + @Override + public void setSnowy(boolean snowy) { + set(SNOWY, snowy); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java new file mode 100644 index 00000000..db7d61ad --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHay.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftHay extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable { + + public CraftHay() { + super(); + } + + public CraftHay(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftOrientable + + private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockHay.class, "axis"); + + @Override + public org.bukkit.Axis getAxis() { + return get(AXIS, org.bukkit.Axis.class); + } + + @Override + public void setAxis(org.bukkit.Axis axis) { + set(AXIS, axis); + } + + @Override + public java.util.Set<org.bukkit.Axis> getAxes() { + return getValues(AXIS, org.bukkit.Axis.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java new file mode 100644 index 00000000..f1311517 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHopper.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftHopper extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Hopper, org.bukkit.block.data.Directional { + + public CraftHopper() { + super(); + } + + public CraftHopper(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftHopper + + private static final net.minecraft.server.BlockStateBoolean ENABLED = getBoolean(net.minecraft.server.BlockHopper.class, "enabled"); + + @Override + public boolean isEnabled() { + return get(ENABLED); + } + + @Override + public void setEnabled(boolean enabled) { + set(ENABLED, enabled); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockHopper.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java new file mode 100644 index 00000000..fb6e2050 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftHugeMushroom.java @@ -0,0 +1,57 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftHugeMushroom extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.MultipleFacing { + + public CraftHugeMushroom() { + super(); + } + + public CraftHugeMushroom(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockHugeMushroom.class, "north", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "east", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "south", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "west", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "up", true), getBoolean(net.minecraft.server.BlockHugeMushroom.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java new file mode 100644 index 00000000..7b297dc2 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIceFrost.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftIceFrost extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftIceFrost() { + super(); + } + + public CraftIceFrost(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockIceFrost.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java new file mode 100644 index 00000000..cf6da2df --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftIronBars.java @@ -0,0 +1,71 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftIronBars extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Fence, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged { + + public CraftIronBars() { + super(); + } + + public CraftIronBars(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockIronBars.class, "north", true), getBoolean(net.minecraft.server.BlockIronBars.class, "east", true), getBoolean(net.minecraft.server.BlockIronBars.class, "south", true), getBoolean(net.minecraft.server.BlockIronBars.class, "west", true), getBoolean(net.minecraft.server.BlockIronBars.class, "up", true), getBoolean(net.minecraft.server.BlockIronBars.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockIronBars.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java new file mode 100644 index 00000000..b87801f3 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftJukeBox.java @@ -0,0 +1,24 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftJukeBox extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Jukebox { + + public CraftJukeBox() { + super(); + } + + public CraftJukeBox(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftJukebox + + private static final net.minecraft.server.BlockStateBoolean HAS_RECORD = getBoolean(net.minecraft.server.BlockJukeBox.class, "has_record"); + + @Override + public boolean hasRecord() { + return get(HAS_RECORD); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java new file mode 100644 index 00000000..e9ba8ade --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftKelp.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftKelp extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftKelp() { + super(); + } + + public CraftKelp(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockKelp.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java new file mode 100644 index 00000000..2c7f396f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLadder.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftLadder extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Ladder, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged { + + public CraftLadder() { + super(); + } + + public CraftLadder(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockLadder.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockLadder.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java new file mode 100644 index 00000000..2e2f091b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLeaves.java @@ -0,0 +1,40 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftLeaves extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Leaves { + + public CraftLeaves() { + super(); + } + + public CraftLeaves(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftLeaves + + private static final net.minecraft.server.BlockStateInteger DISTANCE = getInteger(net.minecraft.server.BlockLeaves.class, "distance"); + private static final net.minecraft.server.BlockStateBoolean PERSISTENT = getBoolean(net.minecraft.server.BlockLeaves.class, "persistent"); + + @Override + public boolean isPersistent() { + return get(PERSISTENT); + } + + @Override + public void setPersistent(boolean persistent) { + set(PERSISTENT, persistent); + } + + @Override + public int getDistance() { + return get(DISTANCE); + } + + @Override + public void setDistance(int distance) { + set(DISTANCE, distance); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java new file mode 100644 index 00000000..a8b030f2 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLever.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftLever extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Switch, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftLever() { + super(); + } + + public CraftLever(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSwitch + + private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum(net.minecraft.server.BlockLever.class, "face"); + + @Override + public Face getFace() { + return get(FACE, Face.class); + } + + @Override + public void setFace(Face face) { + set(FACE, face); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockLever.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockLever.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java new file mode 100644 index 00000000..efa40490 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftLogAbstract.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftLogAbstract extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable { + + public CraftLogAbstract() { + super(); + } + + public CraftLogAbstract(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftOrientable + + private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockLogAbstract.class, "axis"); + + @Override + public org.bukkit.Axis getAxis() { + return get(AXIS, org.bukkit.Axis.class); + } + + @Override + public void setAxis(org.bukkit.Axis axis) { + set(AXIS, axis); + } + + @Override + public java.util.Set<org.bukkit.Axis> getAxes() { + return getValues(AXIS, org.bukkit.Axis.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java new file mode 100644 index 00000000..9ad25f9f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartDetector.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftMinecartDetector extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneRail, org.bukkit.block.data.Powerable, org.bukkit.block.data.Rail { + + public CraftMinecartDetector() { + super(); + } + + public CraftMinecartDetector(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockMinecartDetector.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } + + // org.bukkit.craftbukkit.block.data.CraftRail + + private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockMinecartDetector.class, "shape"); + + @Override + public Shape getShape() { + return get(SHAPE, Shape.class); + } + + @Override + public void setShape(Shape shape) { + set(SHAPE, shape); + } + + @Override + public java.util.Set<Shape> getShapes() { + return getValues(SHAPE, Shape.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java new file mode 100644 index 00000000..127681a6 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMinecartTrack.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftMinecartTrack extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rail { + + public CraftMinecartTrack() { + super(); + } + + public CraftMinecartTrack(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftRail + + private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockMinecartTrack.class, "shape"); + + @Override + public Shape getShape() { + return get(SHAPE, Shape.class); + } + + @Override + public void setShape(Shape shape) { + set(SHAPE, shape); + } + + @Override + public java.util.Set<Shape> getShapes() { + return getValues(SHAPE, Shape.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java new file mode 100644 index 00000000..ca9d60f3 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftMycel.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftMycel extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Snowable { + + public CraftMycel() { + super(); + } + + public CraftMycel(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftSnowable + + private static final net.minecraft.server.BlockStateBoolean SNOWY = getBoolean(net.minecraft.server.BlockMycel.class, "snowy"); + + @Override + public boolean isSnowy() { + return get(SNOWY); + } + + @Override + public void setSnowy(boolean snowy) { + set(SNOWY, snowy); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java new file mode 100644 index 00000000..449d0f6f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNetherWart.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftNetherWart extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftNetherWart() { + super(); + } + + public CraftNetherWart(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockNetherWart.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java new file mode 100644 index 00000000..03a736bd --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftNote.java @@ -0,0 +1,54 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftNote extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.NoteBlock, org.bukkit.block.data.Powerable { + + public CraftNote() { + super(); + } + + public CraftNote(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftNoteBlock + + private static final net.minecraft.server.BlockStateEnum<?> INSTRUMENT = getEnum(net.minecraft.server.BlockNote.class, "instrument"); + private static final net.minecraft.server.BlockStateInteger NOTE = getInteger(net.minecraft.server.BlockNote.class, "note"); + + @Override + public org.bukkit.Instrument getInstrument() { + return get(INSTRUMENT, org.bukkit.Instrument.class); + } + + @Override + public void setInstrument(org.bukkit.Instrument instrument) { + set(INSTRUMENT, instrument); + } + + @Override + public org.bukkit.Note getNote() { + return new org.bukkit.Note(get(NOTE)); + } + + @Override + public void setNote(org.bukkit.Note note) { + set(NOTE, (int) note.getId()); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockNote.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java new file mode 100644 index 00000000..ba3a4f07 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftObserver.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftObserver extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Observer, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftObserver() { + super(); + } + + public CraftObserver(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockObserver.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockObserver.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java new file mode 100644 index 00000000..f16404f4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPiston.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPiston extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Piston, org.bukkit.block.data.Directional { + + public CraftPiston() { + super(); + } + + public CraftPiston(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftPiston + + private static final net.minecraft.server.BlockStateBoolean EXTENDED = getBoolean(net.minecraft.server.BlockPiston.class, "extended"); + + @Override + public boolean isExtended() { + return get(EXTENDED); + } + + @Override + public void setExtended(boolean extended) { + set(EXTENDED, extended); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPiston.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java new file mode 100644 index 00000000..038e5843 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonExtension.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPistonExtension extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.PistonHead, org.bukkit.block.data.type.TechnicalPiston, org.bukkit.block.data.Directional { + + public CraftPistonExtension() { + super(); + } + + public CraftPistonExtension(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftPistonHead + + private static final net.minecraft.server.BlockStateBoolean SHORT = getBoolean(net.minecraft.server.BlockPistonExtension.class, "short"); + + @Override + public boolean isShort() { + return get(SHORT); + } + + @Override + public void setShort(boolean _short) { + set(SHORT, _short); + } + + // org.bukkit.craftbukkit.block.data.type.CraftTechnicalPiston + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockPistonExtension.class, "type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPistonExtension.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java new file mode 100644 index 00000000..38b098e0 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPistonMoving.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPistonMoving extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TechnicalPiston, org.bukkit.block.data.Directional { + + public CraftPistonMoving() { + super(); + } + + public CraftPistonMoving(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftTechnicalPiston + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockPistonMoving.class, "type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPistonMoving.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java new file mode 100644 index 00000000..7701ca85 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPortal.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPortal extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable { + + public CraftPortal() { + super(); + } + + public CraftPortal(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftOrientable + + private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockPortal.class, "axis"); + + @Override + public org.bukkit.Axis getAxis() { + return get(AXIS, org.bukkit.Axis.class); + } + + @Override + public void setAxis(org.bukkit.Axis axis) { + set(AXIS, axis); + } + + @Override + public java.util.Set<org.bukkit.Axis> getAxes() { + return getValues(AXIS, org.bukkit.Axis.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java new file mode 100644 index 00000000..c09a9c78 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPotatoes.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPotatoes extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftPotatoes() { + super(); + } + + public CraftPotatoes(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockPotatoes.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java new file mode 100644 index 00000000..ea904ef0 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPoweredRail.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPoweredRail extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneRail, org.bukkit.block.data.Powerable, org.bukkit.block.data.Rail { + + public CraftPoweredRail() { + super(); + } + + public CraftPoweredRail(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockPoweredRail.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } + + // org.bukkit.craftbukkit.block.data.CraftRail + + private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockPoweredRail.class, "shape"); + + @Override + public Shape getShape() { + return get(SHAPE, Shape.class); + } + + @Override + public void setShape(Shape shape) { + set(SHAPE, shape); + } + + @Override + public java.util.Set<Shape> getShapes() { + return getValues(SHAPE, Shape.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java new file mode 100644 index 00000000..806ad256 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateBinary.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPressurePlateBinary extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Powerable { + + public CraftPressurePlateBinary() { + super(); + } + + public CraftPressurePlateBinary(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockPressurePlateBinary.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java new file mode 100644 index 00000000..84050664 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPressurePlateWeighted.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPressurePlateWeighted extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.AnaloguePowerable { + + public CraftPressurePlateWeighted() { + super(); + } + + public CraftPressurePlateWeighted(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable + + private static final net.minecraft.server.BlockStateInteger POWER = getInteger(net.minecraft.server.BlockPressurePlateWeighted.class, "power"); + + @Override + public int getPower() { + return get(POWER); + } + + @Override + public void setPower(int power) { + set(POWER, power); + } + + @Override + public int getMaximumPower() { + return getMax(POWER); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java new file mode 100644 index 00000000..b258e744 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftPumpkinCarved.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftPumpkinCarved extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftPumpkinCarved() { + super(); + } + + public CraftPumpkinCarved(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockPumpkinCarved.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java new file mode 100644 index 00000000..2456e307 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneComparator.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRedstoneComparator extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Comparator, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftRedstoneComparator() { + super(); + } + + public CraftRedstoneComparator(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftComparator + + private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum(net.minecraft.server.BlockRedstoneComparator.class, "mode"); + + @Override + public Mode getMode() { + return get(MODE, Mode.class); + } + + @Override + public void setMode(Mode mode) { + set(MODE, mode); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockRedstoneComparator.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockRedstoneComparator.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java new file mode 100644 index 00000000..7769c93c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneLamp.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRedstoneLamp extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Lightable { + + public CraftRedstoneLamp() { + super(); + } + + public CraftRedstoneLamp(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftLightable + + private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneLamp.class, "lit"); + + @Override + public boolean isLit() { + return get(LIT); + } + + @Override + public void setLit(boolean lit) { + set(LIT, lit); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java new file mode 100644 index 00000000..effe08ea --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneOre.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRedstoneOre extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Lightable { + + public CraftRedstoneOre() { + super(); + } + + public CraftRedstoneOre(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftLightable + + private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneOre.class, "lit"); + + @Override + public boolean isLit() { + return get(LIT); + } + + @Override + public void setLit(boolean lit) { + set(LIT, lit); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java new file mode 100644 index 00000000..d9d14201 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorch.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRedstoneTorch extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Lightable { + + public CraftRedstoneTorch() { + super(); + } + + public CraftRedstoneTorch(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftLightable + + private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneTorch.class, "lit"); + + @Override + public boolean isLit() { + return get(LIT); + } + + @Override + public void setLit(boolean lit) { + set(LIT, lit); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java new file mode 100644 index 00000000..8125b400 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneTorchWall.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRedstoneTorchWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneWallTorch, org.bukkit.block.data.Directional, org.bukkit.block.data.Lightable { + + public CraftRedstoneTorchWall() { + super(); + } + + public CraftRedstoneTorchWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockRedstoneTorchWall.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftLightable + + private static final net.minecraft.server.BlockStateBoolean LIT = getBoolean(net.minecraft.server.BlockRedstoneTorchWall.class, "lit"); + + @Override + public boolean isLit() { + return get(LIT); + } + + @Override + public void setLit(boolean lit) { + set(LIT, lit); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java new file mode 100644 index 00000000..f5b0e84d --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRedstoneWire.java @@ -0,0 +1,78 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRedstoneWire extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.RedstoneWire, org.bukkit.block.data.AnaloguePowerable { + + public CraftRedstoneWire() { + super(); + } + + public CraftRedstoneWire(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftRedstoneWire + + private static final net.minecraft.server.BlockStateEnum<?> NORTH = getEnum(net.minecraft.server.BlockRedstoneWire.class, "north"); + private static final net.minecraft.server.BlockStateEnum<?> EAST = getEnum(net.minecraft.server.BlockRedstoneWire.class, "east"); + private static final net.minecraft.server.BlockStateEnum<?> SOUTH = getEnum(net.minecraft.server.BlockRedstoneWire.class, "south"); + private static final net.minecraft.server.BlockStateEnum<?> WEST = getEnum(net.minecraft.server.BlockRedstoneWire.class, "west"); + + @Override + public Connection getFace(org.bukkit.block.BlockFace face) { + switch (face) { + case NORTH: + return get(NORTH, Connection.class); + case EAST: + return get(EAST, Connection.class); + case SOUTH: + return get(SOUTH, Connection.class); + case WEST: + return get(WEST, Connection.class); + default: + throw new IllegalArgumentException("Cannot have face " + face); + } + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, Connection connection) { + switch (face) { + case NORTH: + set(NORTH, connection); + case EAST: + set(EAST, connection); + case SOUTH: + set(SOUTH, connection); + case WEST: + set(WEST, connection); + default: + throw new IllegalArgumentException("Cannot have face " + face); + } + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + return com.google.common.collect.ImmutableSet.of(org.bukkit.block.BlockFace.NORTH, org.bukkit.block.BlockFace.EAST, org.bukkit.block.BlockFace.SOUTH, org.bukkit.block.BlockFace.WEST); + } + + // org.bukkit.craftbukkit.block.data.CraftAnaloguePowerable + + private static final net.minecraft.server.BlockStateInteger POWER = getInteger(net.minecraft.server.BlockRedstoneWire.class, "power"); + + @Override + public int getPower() { + return get(POWER); + } + + @Override + public void setPower(int power) { + set(POWER, power); + } + + @Override + public int getMaximumPower() { + return getMax(POWER); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java new file mode 100644 index 00000000..138b8701 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftReed.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftReed extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftReed() { + super(); + } + + public CraftReed(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockReed.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java new file mode 100644 index 00000000..97724f68 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRepeater.java @@ -0,0 +1,83 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRepeater extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Repeater, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftRepeater() { + super(); + } + + public CraftRepeater(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftRepeater + + private static final net.minecraft.server.BlockStateInteger DELAY = getInteger(net.minecraft.server.BlockRepeater.class, "delay"); + private static final net.minecraft.server.BlockStateBoolean LOCKED = getBoolean(net.minecraft.server.BlockRepeater.class, "locked"); + + @Override + public int getDelay() { + return get(DELAY); + } + + @Override + public void setDelay(int delay) { + set(DELAY, delay); + } + + @Override + public int getMinimumDelay() { + return getMin(DELAY); + } + + @Override + public int getMaximumDelay() { + return getMax(DELAY); + } + + @Override + public boolean isLocked() { + return get(LOCKED); + } + + @Override + public void setLocked(boolean locked) { + set(LOCKED, locked); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockRepeater.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockRepeater.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java new file mode 100644 index 00000000..c44f23e6 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftRotatable.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftRotatable extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Orientable { + + public CraftRotatable() { + super(); + } + + public CraftRotatable(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftOrientable + + private static final net.minecraft.server.BlockStateEnum<?> AXIS = getEnum(net.minecraft.server.BlockRotatable.class, "axis"); + + @Override + public org.bukkit.Axis getAxis() { + return get(AXIS, org.bukkit.Axis.class); + } + + @Override + public void setAxis(org.bukkit.Axis axis) { + set(AXIS, axis); + } + + @Override + public java.util.Set<org.bukkit.Axis> getAxes() { + return getValues(AXIS, org.bukkit.Axis.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java new file mode 100644 index 00000000..0654c9e7 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSapling.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSapling extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Sapling { + + public CraftSapling() { + super(); + } + + public CraftSapling(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSapling + + private static final net.minecraft.server.BlockStateInteger STAGE = getInteger(net.minecraft.server.BlockSapling.class, "stage"); + + @Override + public int getStage() { + return get(STAGE); + } + + @Override + public void setStage(int stage) { + set(STAGE, stage); + } + + @Override + public int getMaximumStage() { + return getMax(STAGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java new file mode 100644 index 00000000..a0078bd8 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSeaPickle.java @@ -0,0 +1,53 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSeaPickle extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.SeaPickle, org.bukkit.block.data.Waterlogged { + + public CraftSeaPickle() { + super(); + } + + public CraftSeaPickle(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSeaPickle + + private static final net.minecraft.server.BlockStateInteger PICKLES = getInteger(net.minecraft.server.BlockSeaPickle.class, "pickles"); + + @Override + public int getPickles() { + return get(PICKLES); + } + + @Override + public void setPickles(int pickles) { + set(PICKLES, pickles); + } + + @Override + public int getMinimumPickles() { + return getMin(PICKLES); + } + + @Override + public int getMaximumPickles() { + return getMax(PICKLES); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockSeaPickle.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java new file mode 100644 index 00000000..631f5cff --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftShulkerBox.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftShulkerBox extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftShulkerBox() { + super(); + } + + public CraftShulkerBox(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockShulkerBox.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java new file mode 100644 index 00000000..5677a9f0 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkull.java @@ -0,0 +1,118 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSkull extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable { + + public CraftSkull() { + super(); + } + + public CraftSkull(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftRotatable + + private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockSkull.class, "rotation"); + + @Override + public org.bukkit.block.BlockFace getRotation() { + int data = get(ROTATION); + switch (data) { + case 0x0: + return org.bukkit.block.BlockFace.SOUTH; + case 0x1: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case 0x2: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case 0x3: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case 0x4: + return org.bukkit.block.BlockFace.WEST; + case 0x5: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case 0x6: + return org.bukkit.block.BlockFace.NORTH_WEST; + case 0x7: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case 0x8: + return org.bukkit.block.BlockFace.NORTH; + case 0x9: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case 0xA: + return org.bukkit.block.BlockFace.NORTH_EAST; + case 0xB: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case 0xC: + return org.bukkit.block.BlockFace.EAST; + case 0xD: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case 0xE: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case 0xF: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + data); + } + } + + @Override + public void setRotation(org.bukkit.block.BlockFace rotation) { + int val; + switch (rotation) { + case SOUTH: + val = 0x0; + break; + case SOUTH_SOUTH_WEST: + val = 0x1; + break; + case SOUTH_WEST: + val = 0x2; + break; + case WEST_SOUTH_WEST: + val = 0x3; + break; + case WEST: + val = 0x4; + break; + case WEST_NORTH_WEST: + val = 0x5; + break; + case NORTH_WEST: + val = 0x6; + break; + case NORTH_NORTH_WEST: + val = 0x7; + break; + case NORTH: + val = 0x8; + break; + case NORTH_NORTH_EAST: + val = 0x9; + break; + case NORTH_EAST: + val = 0xA; + break; + case EAST_NORTH_EAST: + val = 0xB; + break; + case EAST: + val = 0xC; + break; + case EAST_SOUTH_EAST: + val = 0xD; + break; + case SOUTH_EAST: + val = 0xE; + break; + case SOUTH_SOUTH_EAST: + val = 0xF; + break; + default: + throw new IllegalArgumentException("Illegal rotation " + rotation); + } + set(ROTATION, val); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java new file mode 100644 index 00000000..6e6e0033 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayer.java @@ -0,0 +1,118 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSkullPlayer extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable { + + public CraftSkullPlayer() { + super(); + } + + public CraftSkullPlayer(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftRotatable + + private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockSkullPlayer.class, "rotation"); + + @Override + public org.bukkit.block.BlockFace getRotation() { + int data = get(ROTATION); + switch (data) { + case 0x0: + return org.bukkit.block.BlockFace.SOUTH; + case 0x1: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case 0x2: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case 0x3: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case 0x4: + return org.bukkit.block.BlockFace.WEST; + case 0x5: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case 0x6: + return org.bukkit.block.BlockFace.NORTH_WEST; + case 0x7: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case 0x8: + return org.bukkit.block.BlockFace.NORTH; + case 0x9: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case 0xA: + return org.bukkit.block.BlockFace.NORTH_EAST; + case 0xB: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case 0xC: + return org.bukkit.block.BlockFace.EAST; + case 0xD: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case 0xE: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case 0xF: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + data); + } + } + + @Override + public void setRotation(org.bukkit.block.BlockFace rotation) { + int val; + switch (rotation) { + case SOUTH: + val = 0x0; + break; + case SOUTH_SOUTH_WEST: + val = 0x1; + break; + case SOUTH_WEST: + val = 0x2; + break; + case WEST_SOUTH_WEST: + val = 0x3; + break; + case WEST: + val = 0x4; + break; + case WEST_NORTH_WEST: + val = 0x5; + break; + case NORTH_WEST: + val = 0x6; + break; + case NORTH_NORTH_WEST: + val = 0x7; + break; + case NORTH: + val = 0x8; + break; + case NORTH_NORTH_EAST: + val = 0x9; + break; + case NORTH_EAST: + val = 0xA; + break; + case EAST_NORTH_EAST: + val = 0xB; + break; + case EAST: + val = 0xC; + break; + case EAST_SOUTH_EAST: + val = 0xD; + break; + case SOUTH_EAST: + val = 0xE; + break; + case SOUTH_SOUTH_EAST: + val = 0xF; + break; + default: + throw new IllegalArgumentException("Illegal rotation " + rotation); + } + set(ROTATION, val); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java new file mode 100644 index 00000000..d2b3ce93 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullPlayerWall.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSkullPlayerWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftSkullPlayerWall() { + super(); + } + + public CraftSkullPlayerWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockSkullPlayerWall.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java new file mode 100644 index 00000000..020e5b71 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSkullWall.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSkullWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftSkullWall() { + super(); + } + + public CraftSkullWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockSkullWall.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java new file mode 100644 index 00000000..d4f0bfa8 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSnow.java @@ -0,0 +1,39 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSnow extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Snow { + + public CraftSnow() { + super(); + } + + public CraftSnow(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSnow + + private static final net.minecraft.server.BlockStateInteger LAYERS = getInteger(net.minecraft.server.BlockSnow.class, "layers"); + + @Override + public int getLayers() { + return get(LAYERS); + } + + @Override + public void setLayers(int layers) { + set(LAYERS, layers); + } + + @Override + public int getMinimumLayers() { + return getMin(LAYERS); + } + + @Override + public int getMaximumLayers() { + return getMax(LAYERS); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java new file mode 100644 index 00000000..09cfa467 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftSoil.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftSoil extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Farmland { + + public CraftSoil() { + super(); + } + + public CraftSoil(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftFarmland + + private static final net.minecraft.server.BlockStateInteger MOISTURE = getInteger(net.minecraft.server.BlockSoil.class, "moisture"); + + @Override + public int getMoisture() { + return get(MOISTURE); + } + + @Override + public void setMoisture(int moisture) { + set(MOISTURE, moisture); + } + + @Override + public int getMaximumMoisture() { + return getMax(MOISTURE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java new file mode 100644 index 00000000..0eb5c660 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStainedGlassPane.java @@ -0,0 +1,71 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStainedGlassPane extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.GlassPane, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Waterlogged { + + public CraftStainedGlassPane() { + super(); + } + + public CraftStainedGlassPane(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "north", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "east", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "south", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "west", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "up", true), getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockStainedGlassPane.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java new file mode 100644 index 00000000..804a90f2 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStairs.java @@ -0,0 +1,76 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStairs extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Stairs, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged { + + public CraftStairs() { + super(); + } + + public CraftStairs(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftStairs + + private static final net.minecraft.server.BlockStateEnum<?> SHAPE = getEnum(net.minecraft.server.BlockStairs.class, "shape"); + + @Override + public Shape getShape() { + return get(SHAPE, Shape.class); + } + + @Override + public void setShape(Shape shape) { + set(SHAPE, shape); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockStairs.class, "half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockStairs.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockStairs.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java new file mode 100644 index 00000000..2a91e958 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStem.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStem extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Ageable { + + public CraftStem() { + super(); + } + + public CraftStem(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAgeable + + private static final net.minecraft.server.BlockStateInteger AGE = getInteger(net.minecraft.server.BlockStem.class, "age"); + + @Override + public int getAge() { + return get(AGE); + } + + @Override + public void setAge(int age) { + set(AGE, age); + } + + @Override + public int getMaximumAge() { + return getMax(AGE); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java new file mode 100644 index 00000000..c6d9223d --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStemAttached.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStemAttached extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftStemAttached() { + super(); + } + + public CraftStemAttached(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockStemAttached.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java new file mode 100644 index 00000000..922d41b1 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStepAbstract.java @@ -0,0 +1,43 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStepAbstract extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Slab, org.bukkit.block.data.Waterlogged { + + public CraftStepAbstract() { + super(); + } + + public CraftStepAbstract(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSlab + + private static final net.minecraft.server.BlockStateEnum<?> TYPE = getEnum(net.minecraft.server.BlockStepAbstract.class, "type"); + + @Override + public Type getType() { + return get(TYPE, Type.class); + } + + @Override + public void setType(Type type) { + set(TYPE, type); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockStepAbstract.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java new file mode 100644 index 00000000..84097d5e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStoneButton.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStoneButton extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Switch, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftStoneButton() { + super(); + } + + public CraftStoneButton(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSwitch + + private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum(net.minecraft.server.BlockStoneButton.class, "face"); + + @Override + public Face getFace() { + return get(FACE, Face.class); + } + + @Override + public void setFace(Face face) { + set(FACE, face); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockStoneButton.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockStoneButton.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java new file mode 100644 index 00000000..f2435d34 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftStructure.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftStructure extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.StructureBlock { + + public CraftStructure() { + super(); + } + + public CraftStructure(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftStructureBlock + + private static final net.minecraft.server.BlockStateEnum<?> MODE = getEnum(net.minecraft.server.BlockStructure.class, "mode"); + + @Override + public Mode getMode() { + return get(MODE, Mode.class); + } + + @Override + public void setMode(Mode mode) { + set(MODE, mode); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java new file mode 100644 index 00000000..3ae8201c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantFlower.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTallPlantFlower extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Bisected { + + public CraftTallPlantFlower() { + super(); + } + + public CraftTallPlantFlower(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTallPlantFlower.class, "half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java new file mode 100644 index 00000000..c98414b3 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallPlantShearable.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTallPlantShearable extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Bisected { + + public CraftTallPlantShearable() { + super(); + } + + public CraftTallPlantShearable(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTallPlantShearable.class, "half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java new file mode 100644 index 00000000..d51e3ec4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTallSeaGrass.java @@ -0,0 +1,29 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTallSeaGrass extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Bisected { + + public CraftTallSeaGrass() { + super(); + } + + public CraftTallSeaGrass(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTallSeaGrass.class, "half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java new file mode 100644 index 00000000..d98f21aa --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTorchWall.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTorchWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftTorchWall() { + super(); + } + + public CraftTorchWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockTorchWall.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java new file mode 100644 index 00000000..2ec18b29 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTrapdoor.java @@ -0,0 +1,90 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTrapdoor extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TrapDoor, org.bukkit.block.data.Bisected, org.bukkit.block.data.Directional, org.bukkit.block.data.Openable, org.bukkit.block.data.Powerable, org.bukkit.block.data.Waterlogged { + + public CraftTrapdoor() { + super(); + } + + public CraftTrapdoor(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftBisected + + private static final net.minecraft.server.BlockStateEnum<?> HALF = getEnum(net.minecraft.server.BlockTrapdoor.class, "half"); + + @Override + public Half getHalf() { + return get(HALF, Half.class); + } + + @Override + public void setHalf(Half half) { + set(HALF, half); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockTrapdoor.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftOpenable + + private static final net.minecraft.server.BlockStateBoolean OPEN = getBoolean(net.minecraft.server.BlockTrapdoor.class, "open"); + + @Override + public boolean isOpen() { + return get(OPEN); + } + + @Override + public void setOpen(boolean open) { + set(OPEN, open); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockTrapdoor.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockTrapdoor.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java new file mode 100644 index 00000000..e39e79c4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwire.java @@ -0,0 +1,99 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTripwire extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Tripwire, org.bukkit.block.data.Attachable, org.bukkit.block.data.MultipleFacing, org.bukkit.block.data.Powerable { + + public CraftTripwire() { + super(); + } + + public CraftTripwire(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftTripwire + + private static final net.minecraft.server.BlockStateBoolean DISARMED = getBoolean(net.minecraft.server.BlockTripwire.class, "disarmed"); + + @Override + public boolean isDisarmed() { + return get(DISARMED); + } + + @Override + public void setDisarmed(boolean disarmed) { + set(DISARMED, disarmed); + } + + // org.bukkit.craftbukkit.block.data.CraftAttachable + + private static final net.minecraft.server.BlockStateBoolean ATTACHED = getBoolean(net.minecraft.server.BlockTripwire.class, "attached"); + + @Override + public boolean isAttached() { + return get(ATTACHED); + } + + @Override + public void setAttached(boolean attached) { + set(ATTACHED, attached); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockTripwire.class, "north", true), getBoolean(net.minecraft.server.BlockTripwire.class, "east", true), getBoolean(net.minecraft.server.BlockTripwire.class, "south", true), getBoolean(net.minecraft.server.BlockTripwire.class, "west", true), getBoolean(net.minecraft.server.BlockTripwire.class, "up", true), getBoolean(net.minecraft.server.BlockTripwire.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockTripwire.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java new file mode 100644 index 00000000..bd7b43ad --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTripwireHook.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTripwireHook extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TripwireHook, org.bukkit.block.data.Attachable, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftTripwireHook() { + super(); + } + + public CraftTripwireHook(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftAttachable + + private static final net.minecraft.server.BlockStateBoolean ATTACHED = getBoolean(net.minecraft.server.BlockTripwireHook.class, "attached"); + + @Override + public boolean isAttached() { + return get(ATTACHED); + } + + @Override + public void setAttached(boolean attached) { + set(ATTACHED, attached); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockTripwireHook.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockTripwireHook.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java new file mode 100644 index 00000000..64812ad1 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftTurtleEgg.java @@ -0,0 +1,55 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftTurtleEgg extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.TurtleEgg { + + public CraftTurtleEgg() { + super(); + } + + public CraftTurtleEgg(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftTurtleEgg + + private static final net.minecraft.server.BlockStateInteger EGGS = getInteger(net.minecraft.server.BlockTurtleEgg.class, "eggs"); + private static final net.minecraft.server.BlockStateInteger HATCH = getInteger(net.minecraft.server.BlockTurtleEgg.class, "hatch"); + + @Override + public int getEggs() { + return get(EGGS); + } + + @Override + public void setEggs(int eggs) { + set(EGGS, eggs); + } + + @Override + public int getMinimumEggs() { + return getMin(EGGS); + } + + @Override + public int getMaximumEggs() { + return getMax(EGGS); + } + + @Override + public int getHatch() { + return get(HATCH); + } + + @Override + public void setHatch(int hatch) { + set(HATCH, hatch); + } + + @Override + public int getMaximumHatch() { + return getMax(HATCH); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java new file mode 100644 index 00000000..90e025ce --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftVine.java @@ -0,0 +1,57 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftVine extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.MultipleFacing { + + public CraftVine() { + super(); + } + + public CraftVine(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftMultipleFacing + + private static final net.minecraft.server.BlockStateBoolean[] FACES = new net.minecraft.server.BlockStateBoolean[]{ + getBoolean(net.minecraft.server.BlockVine.class, "north", true), getBoolean(net.minecraft.server.BlockVine.class, "east", true), getBoolean(net.minecraft.server.BlockVine.class, "south", true), getBoolean(net.minecraft.server.BlockVine.class, "west", true), getBoolean(net.minecraft.server.BlockVine.class, "up", true), getBoolean(net.minecraft.server.BlockVine.class, "down", true) + }; + + @Override + public boolean hasFace(org.bukkit.block.BlockFace face) { + return get(FACES[face.ordinal()]); + } + + @Override + public void setFace(org.bukkit.block.BlockFace face, boolean has) { + set(FACES[face.ordinal()], has); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null && get(FACES[i])) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getAllowedFaces() { + com.google.common.collect.ImmutableSet.Builder<org.bukkit.block.BlockFace> faces = com.google.common.collect.ImmutableSet.builder(); + + for (int i = 0; i < FACES.length; i++) { + if (FACES[i] != null) { + faces.add(org.bukkit.block.BlockFace.values()[i]); + } + } + + return faces.build(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java new file mode 100644 index 00000000..ffa7e3c4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWallSign.java @@ -0,0 +1,48 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftWallSign extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.WallSign, org.bukkit.block.data.Directional, org.bukkit.block.data.Waterlogged { + + public CraftWallSign() { + super(); + } + + public CraftWallSign(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockWallSign.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftWaterlogged + + private static final net.minecraft.server.BlockStateBoolean WATERLOGGED = getBoolean(net.minecraft.server.BlockWallSign.class, "waterlogged"); + + @Override + public boolean isWaterlogged() { + return get(WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + set(WATERLOGGED, waterlogged); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java new file mode 100644 index 00000000..0aec1dbe --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkull.java @@ -0,0 +1,118 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftWitherSkull extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Rotatable { + + public CraftWitherSkull() { + super(); + } + + public CraftWitherSkull(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftRotatable + + private static final net.minecraft.server.BlockStateInteger ROTATION = getInteger(net.minecraft.server.BlockWitherSkull.class, "rotation"); + + @Override + public org.bukkit.block.BlockFace getRotation() { + int data = get(ROTATION); + switch (data) { + case 0x0: + return org.bukkit.block.BlockFace.SOUTH; + case 0x1: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case 0x2: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case 0x3: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case 0x4: + return org.bukkit.block.BlockFace.WEST; + case 0x5: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case 0x6: + return org.bukkit.block.BlockFace.NORTH_WEST; + case 0x7: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case 0x8: + return org.bukkit.block.BlockFace.NORTH; + case 0x9: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case 0xA: + return org.bukkit.block.BlockFace.NORTH_EAST; + case 0xB: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case 0xC: + return org.bukkit.block.BlockFace.EAST; + case 0xD: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case 0xE: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case 0xF: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalArgumentException("Unknown rotation " + data); + } + } + + @Override + public void setRotation(org.bukkit.block.BlockFace rotation) { + int val; + switch (rotation) { + case SOUTH: + val = 0x0; + break; + case SOUTH_SOUTH_WEST: + val = 0x1; + break; + case SOUTH_WEST: + val = 0x2; + break; + case WEST_SOUTH_WEST: + val = 0x3; + break; + case WEST: + val = 0x4; + break; + case WEST_NORTH_WEST: + val = 0x5; + break; + case NORTH_WEST: + val = 0x6; + break; + case NORTH_NORTH_WEST: + val = 0x7; + break; + case NORTH: + val = 0x8; + break; + case NORTH_NORTH_EAST: + val = 0x9; + break; + case NORTH_EAST: + val = 0xA; + break; + case EAST_NORTH_EAST: + val = 0xB; + break; + case EAST: + val = 0xC; + break; + case EAST_SOUTH_EAST: + val = 0xD; + break; + case SOUTH_EAST: + val = 0xE; + break; + case SOUTH_SOUTH_EAST: + val = 0xF; + break; + default: + throw new IllegalArgumentException("Illegal rotation " + rotation); + } + set(ROTATION, val); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java new file mode 100644 index 00000000..fa9597da --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWitherSkullWall.java @@ -0,0 +1,34 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftWitherSkullWall extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.Directional { + + public CraftWitherSkullWall() { + super(); + } + + public CraftWitherSkullWall(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockWitherSkullWall.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java new file mode 100644 index 00000000..79971417 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/impl/CraftWoodButton.java @@ -0,0 +1,62 @@ +/** + * Automatically generated file, changes will be lost. + */ +package org.bukkit.craftbukkit.block.impl; + +public final class CraftWoodButton extends org.bukkit.craftbukkit.block.data.CraftBlockData implements org.bukkit.block.data.type.Switch, org.bukkit.block.data.Directional, org.bukkit.block.data.Powerable { + + public CraftWoodButton() { + super(); + } + + public CraftWoodButton(net.minecraft.server.IBlockData state) { + super(state); + } + + // org.bukkit.craftbukkit.block.data.type.CraftSwitch + + private static final net.minecraft.server.BlockStateEnum<?> FACE = getEnum(net.minecraft.server.BlockWoodButton.class, "face"); + + @Override + public Face getFace() { + return get(FACE, Face.class); + } + + @Override + public void setFace(Face face) { + set(FACE, face); + } + + // org.bukkit.craftbukkit.block.data.CraftDirectional + + private static final net.minecraft.server.BlockStateEnum<?> FACING = getEnum(net.minecraft.server.BlockWoodButton.class, "facing"); + + @Override + public org.bukkit.block.BlockFace getFacing() { + return get(FACING, org.bukkit.block.BlockFace.class); + } + + @Override + public void setFacing(org.bukkit.block.BlockFace facing) { + set(FACING, facing); + } + + @Override + public java.util.Set<org.bukkit.block.BlockFace> getFaces() { + return getValues(FACING, org.bukkit.block.BlockFace.class); + } + + // org.bukkit.craftbukkit.block.data.CraftPowerable + + private static final net.minecraft.server.BlockStateBoolean POWERED = getBoolean(net.minecraft.server.BlockWoodButton.class, "powered"); + + @Override + public boolean isPowered() { + return get(POWERED); + } + + @Override + public void setPowered(boolean powered) { + set(POWERED, powered); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java b/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java index 9696fe5d..d9e54331 100644 --- a/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java +++ b/src/main/java/org/bukkit/craftbukkit/boss/CraftBossBar.java @@ -68,7 +68,7 @@ public class CraftBossBar implements BossBar { @Override public String getTitle() { - return CraftChatMessage.fromComponent(handle.e()); + return CraftChatMessage.fromComponent(handle.title); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java index f1c1dc49..413dd35f 100644 --- a/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java +++ b/src/main/java/org/bukkit/craftbukkit/chunkio/ChunkIOProvider.java @@ -18,7 +18,7 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu public Chunk callStage1(QueuedChunk queuedChunk) throws RuntimeException { try { ChunkRegionLoader loader = queuedChunk.loader; - Object[] data = loader.loadChunk(queuedChunk.world, queuedChunk.x, queuedChunk.z); + Object[] data = loader.loadChunk(queuedChunk.world, queuedChunk.x, queuedChunk.z, (chunk) -> {}); if (data != null) { queuedChunk.compound = (NBTTagCompound) data[1]; @@ -35,20 +35,14 @@ class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChu public void callStage2(QueuedChunk queuedChunk, Chunk chunk) throws RuntimeException { if (chunk == null) { // If the chunk loading failed just do it synchronously (may generate) - queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z); + // queuedChunk.provider.originalGetChunkAt(queuedChunk.x, queuedChunk.z); return; } - queuedChunk.loader.loadEntities(chunk, queuedChunk.compound.getCompound("Level"), queuedChunk.world); + queuedChunk.loader.loadEntities(queuedChunk.compound.getCompound("Level"), chunk); chunk.setLastSaved(queuedChunk.provider.world.getTime()); queuedChunk.provider.chunks.put(ChunkCoordIntPair.a(queuedChunk.x, queuedChunk.z), chunk); chunk.addEntities(); - - if (queuedChunk.provider.chunkGenerator != null) { - queuedChunk.provider.chunkGenerator.recreateStructures(chunk, queuedChunk.x, queuedChunk.z); - } - - chunk.loadNearby(queuedChunk.provider, queuedChunk.provider.chunkGenerator, false); } public void callStage3(QueuedChunk queuedChunk, Chunk chunk, Runnable runnable) throws RuntimeException { diff --git a/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java new file mode 100644 index 00000000..d69855ed --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/command/BukkitCommandWrapper.java @@ -0,0 +1,56 @@ +package org.bukkit.craftbukkit.command; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.builder.RequiredArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.suggestion.SuggestionProvider; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; +import com.mojang.brigadier.tree.LiteralCommandNode; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import net.minecraft.server.CommandListenerWrapper; +import org.bukkit.command.Command; +import org.bukkit.craftbukkit.CraftServer; + +public class BukkitCommandWrapper implements com.mojang.brigadier.Command<CommandListenerWrapper>, Predicate<CommandListenerWrapper>, SuggestionProvider<CommandListenerWrapper> { + + private final CraftServer server; + private final Command command; + + public BukkitCommandWrapper(CraftServer server, Command command) { + this.server = server; + this.command = command; + } + + public LiteralCommandNode<CommandListenerWrapper> register(CommandDispatcher<CommandListenerWrapper> dispatcher, String label) { + return dispatcher.register( + LiteralArgumentBuilder.<CommandListenerWrapper>literal(label).requires(this).executes(this) + .then(RequiredArgumentBuilder.<CommandListenerWrapper, String>argument("args", StringArgumentType.greedyString()).suggests(this).executes(this)) + ); + } + + @Override + public boolean test(CommandListenerWrapper wrapper) { + return command.testPermissionSilent(wrapper.getBukkitSender()); + } + + @Override + public int run(CommandContext<CommandListenerWrapper> context) throws CommandSyntaxException { + return server.dispatchCommand(context.getSource().getBukkitSender(), context.getInput()) ? 1 : 0; + } + + @Override + public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandListenerWrapper> context, SuggestionsBuilder builder) throws CommandSyntaxException { + List<String> results = server.tabComplete(context.getSource().getBukkitSender(), builder.getInput(), context.getSource().getWorld(), context.getSource().getPosition(), true); + for (String s : results) { + builder.suggest(s); + } + + return builder.buildFuture(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java index 251ea5e0..3ad7dfdb 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java +++ b/src/main/java/org/bukkit/craftbukkit/command/CraftBlockCommandSender.java @@ -1,7 +1,10 @@ package org.bukkit.craftbukkit.command; +import net.minecraft.server.CommandBlockListenerAbstract; +import net.minecraft.server.CommandListenerWrapper; import net.minecraft.server.ICommandListener; import net.minecraft.server.IChatBaseComponent; +import net.minecraft.server.Vec3D; import org.bukkit.block.Block; import org.bukkit.command.BlockCommandSender; @@ -11,20 +14,21 @@ import org.bukkit.craftbukkit.util.CraftChatMessage; * Represents input from a command block */ public class CraftBlockCommandSender extends ServerCommandSender implements BlockCommandSender { - private final ICommandListener block; + private final CommandListenerWrapper block; - public CraftBlockCommandSender(ICommandListener commandBlockListenerAbstract) { + public CraftBlockCommandSender(CommandListenerWrapper commandBlockListenerAbstract) { super(); this.block = commandBlockListenerAbstract; } public Block getBlock() { - return block.getWorld().getWorld().getBlockAt(block.getChunkCoordinates().getX(), block.getChunkCoordinates().getY(), block.getChunkCoordinates().getZ()); + Vec3D pos = block.getPosition(); + return block.getWorld().getWorld().getBlockAt((int) pos.x, (int) pos.y, (int) pos.z); } public void sendMessage(String message) { for (IChatBaseComponent component : CraftChatMessage.fromString(message)) { - block.sendMessage(component); + block.base.sendMessage(component); } } @@ -46,7 +50,7 @@ public class CraftBlockCommandSender extends ServerCommandSender implements Bloc throw new UnsupportedOperationException("Cannot change operator status of a block"); } - public ICommandListener getTileEntity() { + public CommandListenerWrapper getWrapper() { return block; } } diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java b/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java new file mode 100644 index 00000000..2fd69c0f --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/command/CraftCommandMap.java @@ -0,0 +1,17 @@ +package org.bukkit.craftbukkit.command; + +import java.util.Map; +import org.bukkit.Server; +import org.bukkit.command.Command; +import org.bukkit.command.SimpleCommandMap; + +public class CraftCommandMap extends SimpleCommandMap { + + public CraftCommandMap(Server server) { + super(server); + } + + public Map<String, Command> getKnownCommands() { + return knownCommands; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java deleted file mode 100644 index 6bb69bb4..00000000 --- a/src/main/java/org/bukkit/craftbukkit/command/CraftFunctionCommandSender.java +++ /dev/null @@ -1,47 +0,0 @@ -package org.bukkit.craftbukkit.command; - -import net.minecraft.server.IChatBaseComponent; -import net.minecraft.server.ICommandListener; -import org.bukkit.craftbukkit.util.CraftChatMessage; - -public class CraftFunctionCommandSender extends ServerCommandSender { - - private final ICommandListener handle; - - public CraftFunctionCommandSender(ICommandListener handle) { - this.handle = handle; - } - - @Override - public void sendMessage(String message) { - for (IChatBaseComponent component : CraftChatMessage.fromString(message)) { - handle.sendMessage(component); - } - } - - @Override - public void sendMessage(String[] messages) { - for (String message : messages) { - sendMessage(message); - } - } - - @Override - public String getName() { - return handle.getName(); - } - - @Override - public boolean isOp() { - return true; - } - - @Override - public void setOp(boolean value) { - throw new UnsupportedOperationException("Cannot change operator status of server function sender"); - } - - public ICommandListener getHandle() { - return handle; - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java b/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java index 9acd92c3..07c34cb2 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java +++ b/src/main/java/org/bukkit/craftbukkit/command/ProxiedNativeCommandSender.java @@ -2,7 +2,7 @@ package org.bukkit.craftbukkit.command; import java.util.Set; -import net.minecraft.server.ICommandListener; +import net.minecraft.server.CommandListenerWrapper; import org.bukkit.Server; import org.bukkit.command.CommandSender; @@ -14,17 +14,17 @@ import org.bukkit.plugin.Plugin; public class ProxiedNativeCommandSender implements ProxiedCommandSender { - private final ICommandListener orig; + private final CommandListenerWrapper orig; private final CommandSender caller; private final CommandSender callee; - public ProxiedNativeCommandSender(ICommandListener orig, CommandSender caller, CommandSender callee) { + public ProxiedNativeCommandSender(CommandListenerWrapper orig, CommandSender caller, CommandSender callee) { this.orig = orig; this.caller = caller; this.callee = callee; } - public ICommandListener getHandle() { + public CommandListenerWrapper getHandle() { return orig; } diff --git a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java index 6247bbda..5de49fe0 100644 --- a/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java +++ b/src/main/java/org/bukkit/craftbukkit/command/VanillaCommandWrapper.java @@ -1,12 +1,18 @@ package org.bukkit.craftbukkit.command; -import java.util.Iterator; +import com.google.common.base.Joiner; +import com.mojang.brigadier.ParseResults; +import com.mojang.brigadier.suggestion.Suggestion; +import com.mojang.brigadier.tree.CommandNode; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; - -import net.minecraft.server.*; - +import net.minecraft.server.CommandDispatcher; +import net.minecraft.server.CommandListenerWrapper; +import net.minecraft.server.DedicatedServer; +import net.minecraft.server.EntityMinecartCommandBlock; +import net.minecraft.server.MinecraftServer; import org.apache.commons.lang.Validate; -import org.apache.logging.log4j.Level; import org.bukkit.Location; import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; @@ -21,27 +27,23 @@ import org.bukkit.entity.Player; import org.bukkit.entity.minecart.CommandMinecart; public final class VanillaCommandWrapper extends BukkitCommand { - protected final CommandAbstract vanillaCommand; - public VanillaCommandWrapper(CommandAbstract vanillaCommand, String usage) { - super(vanillaCommand.getCommand(), "A Mojang provided command.", usage, vanillaCommand.getAliases()); + private final CommandDispatcher dispatcher; + public final CommandNode<CommandListenerWrapper> vanillaCommand; + + public VanillaCommandWrapper(CommandDispatcher dispatcher, CommandNode<CommandListenerWrapper> vanillaCommand) { + super(vanillaCommand.getName(), "A Mojang provided command.", vanillaCommand.getUsageText(), Collections.EMPTY_LIST); + this.dispatcher = dispatcher; this.vanillaCommand = vanillaCommand; - this.setPermission("minecraft.command." + vanillaCommand.getCommand()); + this.setPermission(getPermission(vanillaCommand)); } @Override public boolean execute(CommandSender sender, String commandLabel, String[] args) { if (!testPermission(sender)) return true; - ICommandListener icommandlistener = getListener(sender); - try { - dispatchVanillaCommand(sender, icommandlistener, args); - } catch (CommandException commandexception) { - // Taken from CommandHandler - ChatMessage chatmessage = new ChatMessage(commandexception.getMessage(), commandexception.getArgs()); - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - icommandlistener.sendMessage(chatmessage); - } + CommandListenerWrapper icommandlistener = getListener(sender); + dispatcher.a(icommandlistener, toDispatcher(args)); return true; } @@ -50,135 +52,46 @@ public final class VanillaCommandWrapper extends BukkitCommand { Validate.notNull(sender, "Sender cannot be null"); Validate.notNull(args, "Arguments cannot be null"); Validate.notNull(alias, "Alias cannot be null"); - return (List<String>) vanillaCommand.tabComplete(MinecraftServer.getServer(), getListener(sender), args, (location) == null ? null : new BlockPosition(location.getX(), location.getY(), location.getZ())); - } - - public static CommandSender lastSender = null; // Nasty :( - - public final int dispatchVanillaCommand(CommandSender bSender, ICommandListener icommandlistener, String[] as) throws CommandException { - // Copied from net.minecraft.server.CommandHandler - int i = getPlayerListSize(as); - int j = 0; - // Some commands use the worldserver variable but we leave it full of null values, - // so we must temporarily populate it with the world of the commandsender - WorldServer[] prev = MinecraftServer.getServer().worldServer; - MinecraftServer server = MinecraftServer.getServer(); - server.worldServer = new WorldServer[server.worlds.size()]; - server.worldServer[0] = (WorldServer) icommandlistener.getWorld(); - int bpos = 0; - for (int pos = 1; pos < server.worldServer.length; pos++) { - WorldServer world = server.worlds.get(bpos++); - if (server.worldServer[0] == world) { - pos--; - continue; - } - server.worldServer[pos] = world; - } - try { - if (vanillaCommand.canUse(server, icommandlistener)) { - if (i > -1) { - List<Entity> list = ((List<Entity>)PlayerSelector.getPlayers(icommandlistener, as[i], Entity.class)); - String s2 = as[i]; + CommandListenerWrapper icommandlistener = getListener(sender); + ParseResults<CommandListenerWrapper> parsed = dispatcher.a().parse(toDispatcher(args), icommandlistener); - icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.AFFECTED_ENTITIES, list.size()); - Iterator<Entity> iterator = list.iterator(); + List<String> results = new ArrayList<>(); + dispatcher.a().getCompletionSuggestions(parsed).thenAccept((suggestions) -> { + suggestions.getList().forEach((s) -> results.add(s.getText())); + }); - while (iterator.hasNext()) { - Entity entity = iterator.next(); - - CommandSender oldSender = lastSender; - lastSender = bSender; - try { - as[i] = entity.getUniqueID().toString(); - vanillaCommand.execute(server, icommandlistener, as); - j++; - } 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) { - CommandAbstract.a(icommandlistener, vanillaCommand, 0, commandexception.getMessage(), commandexception.getArgs()); - } finally { - lastSender = oldSender; - } - } - as[i] = s2; - } else { - icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.AFFECTED_ENTITIES, 1); - vanillaCommand.execute(server, icommandlistener, as); - j++; - } - } else { - ChatMessage chatmessage = new ChatMessage("commands.generic.permission", new Object[0]); - chatmessage.getChatModifier().setColor(EnumChatFormat.RED); - icommandlistener.sendMessage(chatmessage); - } - } catch (ExceptionUsage exceptionusage) { - ChatMessage chatmessage1 = new ChatMessage("commands.generic.usage", new Object[] { new ChatMessage(exceptionusage.getMessage(), exceptionusage.getArgs()) }); - chatmessage1.getChatModifier().setColor(EnumChatFormat.RED); - icommandlistener.sendMessage(chatmessage1); - } catch (CommandException commandexception) { - CommandAbstract.a(icommandlistener, vanillaCommand, 0, commandexception.getMessage(), commandexception.getArgs()); - } catch (Throwable throwable) { - ChatMessage chatmessage3 = new ChatMessage("commands.generic.exception", new Object[0]); - chatmessage3.getChatModifier().setColor(EnumChatFormat.RED); - icommandlistener.sendMessage(chatmessage3); - if (icommandlistener.f() instanceof EntityMinecartCommandBlock) { - MinecraftServer.LOGGER.log(Level.WARN, String.format("MinecartCommandBlock at (%d,%d,%d) failed to handle command", icommandlistener.getChunkCoordinates().getX(), icommandlistener.getChunkCoordinates().getY(), icommandlistener.getChunkCoordinates().getZ()), throwable); - } else if(icommandlistener instanceof CommandBlockListenerAbstract) { - CommandBlockListenerAbstract listener = (CommandBlockListenerAbstract) icommandlistener; - MinecraftServer.LOGGER.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 { - MinecraftServer.LOGGER.log(Level.WARN, String.format("Unknown CommandBlock failed to handle command"), throwable); - } - } finally { - icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.SUCCESS_COUNT, j); - MinecraftServer.getServer().worldServer = prev; - } - return j; + return results; } - private ICommandListener getListener(CommandSender sender) { + private CommandListenerWrapper getListener(CommandSender sender) { if (sender instanceof Player) { - return ((CraftPlayer) sender).getHandle(); + return ((CraftPlayer) sender).getHandle().getCommandListener(); } if (sender instanceof BlockCommandSender) { - return ((CraftBlockCommandSender) sender).getTileEntity(); + return ((CraftBlockCommandSender) sender).getWrapper(); } if (sender instanceof CommandMinecart) { - return ((EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).getCommandBlock(); + return ((EntityMinecartCommandBlock) ((CraftMinecartCommand) sender).getHandle()).getCommandBlock().getWrapper(); } if (sender instanceof RemoteConsoleCommandSender) { - return ((DedicatedServer)MinecraftServer.getServer()).remoteControlCommandListener; + return ((DedicatedServer) MinecraftServer.getServer()).remoteControlCommandListener.f(); } if (sender instanceof ConsoleCommandSender) { - return ((CraftServer) sender.getServer()).getServer(); + return ((CraftServer) sender.getServer()).getServer().getServerCommandListener(); } if (sender instanceof ProxiedCommandSender) { return ((ProxiedNativeCommandSender) sender).getHandle(); } - if (sender instanceof CraftFunctionCommandSender) { - return ((CraftFunctionCommandSender) sender).getHandle(); - } + throw new IllegalArgumentException("Cannot make " + sender + " a vanilla command listener"); } - private int getPlayerListSize(String as[]) throws CommandException { - for (int i = 0; i < as.length; i++) { - if (vanillaCommand.isListStart(as, i) && PlayerSelector.isList(as[i])) { - return i; - } - } - return -1; + public static String getPermission(CommandNode<CommandListenerWrapper> vanillaCommand) { + return "minecraft.command." + ((vanillaCommand.getRedirect() == null) ? vanillaCommand.getName() : vanillaCommand.getRedirect().getName()); } - public static String[] dropFirstArgument(String as[]) { - String as1[] = new String[as.length - 1]; - for (int i = 1; i < as.length; i++) { - as1[i - 1] = as[i]; - } - - return as1; + private String toDispatcher(String[] args) { + return getName() + ((args.length > 0) ? " " + Joiner.on(' ').join(args) : ""); } } diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java index f98e3e9a..4ce44495 100644 --- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java @@ -1,6 +1,9 @@ package org.bukkit.craftbukkit.enchantments; +import net.minecraft.server.EnchantmentBinding; +import net.minecraft.server.EnchantmentVanishing; import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.enchantments.EnchantmentTarget; import org.bukkit.enchantments.EnchantmentWrapper; @@ -10,7 +13,7 @@ public class CraftEnchantment extends Enchantment { private final net.minecraft.server.Enchantment target; public CraftEnchantment(net.minecraft.server.Enchantment target) { - super(net.minecraft.server.Enchantment.getId(target)); + super(CraftNamespacedKey.fromMinecraft(net.minecraft.server.Enchantment.enchantments.b(target))); this.target = target; } @@ -51,6 +54,8 @@ public class CraftEnchantment extends Enchantment { return EnchantmentTarget.BREAKABLE; case WEARABLE: return EnchantmentTarget.WEARABLE; + case TRIDENT: + return EnchantmentTarget.TRIDENT; default: return null; } @@ -63,7 +68,7 @@ public class CraftEnchantment extends Enchantment { @Override public boolean isCursed() { - return target.isCursed(); + return target instanceof EnchantmentBinding || target instanceof EnchantmentVanishing; } @Override @@ -73,7 +78,8 @@ public class CraftEnchantment extends Enchantment { @Override public String getName() { - switch (getId()) { + // PAIL: migration paths + switch (net.minecraft.server.Enchantment.enchantments.a(target)) { case 0: return "PROTECTION_ENVIRONMENTAL"; case 1: @@ -96,46 +102,54 @@ public class CraftEnchantment extends Enchantment { return "FROST_WALKER"; case 10: return "BINDING_CURSE"; - case 16: + case 11: return "DAMAGE_ALL"; - case 17: + case 12: return "DAMAGE_UNDEAD"; - case 18: + case 13: return "DAMAGE_ARTHROPODS"; - case 19: + case 14: return "KNOCKBACK"; - case 20: + case 15: return "FIRE_ASPECT"; - case 21: + case 16: return "LOOT_BONUS_MOBS"; - case 22: + case 17: return "SWEEPING_EDGE"; - case 32: + case 18: return "DIG_SPEED"; - case 33: + case 19: return "SILK_TOUCH"; - case 34: + case 20: return "DURABILITY"; - case 35: + case 21: return "LOOT_BONUS_BLOCKS"; - case 48: + case 22: return "ARROW_DAMAGE"; - case 49: + case 23: return "ARROW_KNOCKBACK"; - case 50: + case 24: return "ARROW_FIRE"; - case 51: + case 25: return "ARROW_INFINITE"; - case 61: + case 26: return "LUCK"; - case 62: + case 27: return "LURE"; - case 70: + case 28: + return "LOYALTY"; + case 29: + return "IMPALING"; + case 30: + return "RIPTIDE"; + case 31: + return "CHANNELING"; + case 32: return "MENDING"; - case 71: + case 33: return "VANISHING_CURSE"; default: - return "UNKNOWN_ENCHANT_" + getId(); + return "UNKNOWN_ENCHANT_" + getName(); } } @@ -160,7 +174,7 @@ public class CraftEnchantment extends Enchantment { return false; } CraftEnchantment ench = (CraftEnchantment) other; - return !target.c(ench.target); + return !target.b(ench.target); } public net.minecraft.server.Enchantment getHandle() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java index 99425767..e47080db 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftArrow.java @@ -59,7 +59,7 @@ public class CraftArrow extends AbstractProjectile implements Arrow { } EntityArrow handle = getHandle(); - return getWorld().getBlockAt(handle.h, handle.at, handle.au); // PAIL: rename tileX, tileY, tileZ + return getWorld().getBlockAt(handle.tileX, handle.tileY, handle.tileZ); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java new file mode 100644 index 00000000..9cda680c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftCod.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityCod; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Cod; +import org.bukkit.entity.EntityType; + +public class CraftCod extends CraftFish implements Cod { + + public CraftCod(CraftServer server, EntityCod entity) { + super(server, entity); + } + + @Override + public EntityCod getHandle() { + return (EntityCod) super.getHandle(); + } + + @Override + public String toString() { + return "CraftCod"; + } + + @Override + public EntityType getType() { + return EntityType.COD; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java new file mode 100644 index 00000000..7a838f38 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDolphin.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityDolphin; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Dolphin; +import org.bukkit.entity.EntityType; + +public class CraftDolphin extends CraftCreature implements Dolphin { + + public CraftDolphin(CraftServer server, EntityDolphin entity) { + super(server, entity); + } + + @Override + public EntityDolphin getHandle() { + return (EntityDolphin) super.getHandle(); + } + + @Override + public String toString() { + return "CraftDolphin"; + } + + @Override + public EntityType getType() { + return EntityType.DOLPHIN; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java new file mode 100644 index 00000000..6e41dfd9 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftDrowned.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityDrowned; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Drowned; +import org.bukkit.entity.EntityType; + +public class CraftDrowned extends CraftZombie implements Drowned { + + public CraftDrowned(CraftServer server, EntityDrowned entity) { + super(server, entity); + } + + @Override + public EntityDrowned getHandle() { + return (EntityDrowned) entity; + } + + @Override + public String toString() { + return "CraftDrowned"; + } + + @Override + public EntityType getType() { + return EntityType.DROWNED; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java index aaa624ae..d771fdc6 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderSignal.java @@ -30,7 +30,7 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { @Override public Location getTargetLocation() { - return new Location(getWorld(), getHandle().a, getHandle().b, getHandle().c, getHandle().yaw, getHandle().pitch); // PAIL rename targetX, targetY, targetZ + return new Location(getWorld(), getHandle().targetX, getHandle().targetY, getHandle().targetZ, getHandle().yaw, getHandle().pitch); } @Override @@ -41,21 +41,21 @@ public class CraftEnderSignal extends CraftEntity implements EnderSignal { @Override public boolean getDropItem() { - return getHandle().e; // PAIL rename getDropItem + return getHandle().shouldDropItem; } @Override public void setDropItem(boolean shouldDropItem) { - getHandle().e = shouldDropItem; // PAIL rename getDropItem + getHandle().shouldDropItem = shouldDropItem; } @Override public int getDespawnTimer() { - return getHandle().d; // PAIL rename despawnTimer + return getHandle().despawnTimer; } @Override public void setDespawnTimer(int time) { - getHandle().d = time; // PAIL rename despawnTimer + getHandle().despawnTimer = time; } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java index f602c231..5998530a 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEnderman.java @@ -3,8 +3,9 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityEnderman; import net.minecraft.server.IBlockData; -import org.bukkit.Material; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.Enderman; import org.bukkit.entity.EntityType; @@ -17,11 +18,22 @@ public class CraftEnderman extends CraftMonster implements Enderman { public MaterialData getCarriedMaterial() { IBlockData blockData = getHandle().getCarried(); - return (blockData == null) ? Material.AIR.getNewData((byte) 0) : CraftMagicNumbers.getMaterial(blockData.getBlock()).getNewData((byte) blockData.getBlock().toLegacyData(blockData)); + return CraftMagicNumbers.getMaterial(blockData); + } + + @Override + public BlockData getCarriedBlock() { + IBlockData blockData = getHandle().getCarried(); + return CraftBlockData.fromData(blockData); } public void setCarriedMaterial(MaterialData data) { - getHandle().setCarried(CraftMagicNumbers.getBlock(data.getItemTypeId()).fromLegacyData(data.getData())); + getHandle().setCarried(CraftMagicNumbers.getBlock(data)); + } + + @Override + public void setCarriedBlock(BlockData blockData) { + getHandle().setCarried(((CraftBlockData) blockData).getState()); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java index 961cf24c..f0a52de5 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftEntity.java @@ -16,6 +16,7 @@ import org.bukkit.World; import org.bukkit.block.PistonMoveReaction; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.metadata.MetadataValue; @@ -52,6 +53,14 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { // Water Animals else if (entity instanceof EntityWaterAnimal) { if (entity instanceof EntitySquid) { return new CraftSquid(server, (EntitySquid) entity); } + else if (entity instanceof EntityFish) { + if (entity instanceof EntityCod) { return new CraftCod(server, (EntityCod) entity); } + else if (entity instanceof EntityPufferFish) { return new CraftPufferFish(server, (EntityPufferFish) entity); } + else if (entity instanceof EntitySalmon) { return new CraftSalmon(server, (EntitySalmon) entity); } + else if (entity instanceof EntityTropicalFish) { return new CraftTropicalFish(server, (EntityTropicalFish) entity); } + else { return new CraftFish(server, (EntityFish) entity); } + } + else if (entity instanceof EntityDolphin) { return new CraftDolphin(server, (EntityDolphin) entity); } else { return new CraftWaterMob(server, (EntityWaterAnimal) entity); } } else if (entity instanceof EntityCreature) { @@ -80,6 +89,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } else if (entity instanceof EntityRabbit) { return new CraftRabbit(server, (EntityRabbit) entity); } else if (entity instanceof EntityPolarBear) { return new CraftPolarBear(server, (EntityPolarBear) entity); } + else if (entity instanceof EntityTurtle) { return new CraftTurtle(server, (EntityTurtle) entity); } else { return new CraftAnimals(server, (EntityAnimal) entity); } } // Monsters @@ -88,6 +98,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { if (entity instanceof EntityPigZombie) { return new CraftPigZombie(server, (EntityPigZombie) entity); } else if (entity instanceof EntityZombieHusk) { return new CraftHusk(server, (EntityZombieHusk) entity); } else if (entity instanceof EntityZombieVillager) { return new CraftVillagerZombie(server, (EntityZombieVillager) entity); } + else if (entity instanceof EntityDrowned) { return new CraftDrowned(server, (EntityDrowned) entity); } else { return new CraftZombie(server, (EntityZombie) entity); } } else if (entity instanceof EntityCreeper) { return new CraftCreeper(server, (EntityCreeper) entity); } @@ -140,6 +151,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { // Flying else if (entity instanceof EntityFlying) { if (entity instanceof EntityGhast) { return new CraftGhast(server, (EntityGhast) entity); } + else if (entity instanceof EntityPhantom) { return new CraftPhantom(server, (EntityPhantom) entity); } else { return new CraftFlying(server, (EntityFlying) entity); } } else if (entity instanceof EntityEnderDragon) { @@ -164,7 +176,10 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { else { return new CraftArrow(server, (EntityArrow) entity); } } else if (entity instanceof EntitySpectralArrow) { return new CraftSpectralArrow(server, (EntitySpectralArrow) entity); } - else if (entity instanceof EntityArrow) { return new CraftArrow(server, (EntityArrow) entity); } + else if (entity instanceof EntityArrow) { + if (entity instanceof EntityThrownTrident) { return new CraftTrident(server, (EntityThrownTrident) entity); } + else { return new CraftArrow(server, (EntityArrow) entity); } + } else if (entity instanceof EntityBoat) { return new CraftBoat(server, (EntityBoat) entity); } else if (entity instanceof EntityProjectile) { if (entity instanceof EntityEgg) { return new CraftEgg(server, (EntityEgg) entity); } @@ -186,7 +201,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { } else if (entity instanceof EntityEnderSignal) { return new CraftEnderSignal(server, (EntityEnderSignal) entity); } else if (entity instanceof EntityEnderCrystal) { return new CraftEnderCrystal(server, (EntityEnderCrystal) entity); } - else if (entity instanceof EntityFishingHook) { return new CraftFish(server, (EntityFishingHook) entity); } + else if (entity instanceof EntityFishingHook) { return new CraftFishHook(server, (EntityFishingHook) entity); } else if (entity instanceof EntityItem) { return new CraftItem(server, (EntityItem) entity); } else if (entity instanceof EntityWeather) { if (entity instanceof EntityLightning) { return new CraftLightningStrike(server, (EntityLightning) entity); } @@ -507,7 +522,7 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { return null; } - return getHandle().bJ().getBukkitEntity(); // PAIL: rename getVehicle() -> getRootVehicle(), bJ() -> getVehicle() + return getHandle().getVehicle().getBukkitEntity(); } @Override @@ -516,18 +531,23 @@ public abstract class CraftEntity implements org.bukkit.entity.Entity { name = ""; } - getHandle().setCustomName(name); + // sane limit for name length + if (name.length() > 256) { + name = name.substring(0, 256); + } + + getHandle().setCustomName(CraftChatMessage.fromStringOrNull(name)); } @Override public String getCustomName() { - String name = getHandle().getCustomName(); + IChatBaseComponent name = getHandle().getCustomName(); - if (name == null || name.length() == 0) { + if (name == null) { return null; } - return name; + return CraftChatMessage.fromComponent(name); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java index b0a7f639..b4322dff 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java @@ -3,7 +3,9 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityFallingBlock; import org.bukkit.Material; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.EntityType; import org.bukkit.entity.FallingBlock; @@ -29,15 +31,11 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { } public Material getMaterial() { - return Material.getMaterial(getBlockId()); + return CraftMagicNumbers.getMaterial(getHandle().getBlock()).getItemType(); } - public int getBlockId() { - return CraftMagicNumbers.getId(getHandle().getBlock().getBlock()); - } - - public byte getBlockData() { - return (byte) getHandle().getBlock().getBlock().toLegacyData(getHandle().getBlock()); + public BlockData getBlockData() { + return CraftBlockData.fromData(getHandle().getBlock()); } public boolean getDropItem() { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java index 99746b3c..7b3b2068 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFirework.java @@ -24,15 +24,15 @@ public class CraftFirework extends CraftEntity implements Firework { ItemStack item = getHandle().getDataWatcher().get(EntityFireworks.FIREWORK_ITEM); if (item.isEmpty()) { - item = new ItemStack(Items.FIREWORKS); + item = new ItemStack(Items.FIREWORK_ROCKET); getHandle().getDataWatcher().set(EntityFireworks.FIREWORK_ITEM, item); } this.item = CraftItemStack.asCraftMirror(item); // Ensure the item is a firework... - if (this.item.getType() != Material.FIREWORK) { - this.item.setType(Material.FIREWORK); + if (this.item.getType() != Material.FIREWORK_ROCKET) { + this.item.setType(Material.FIREWORK_ROCKET); } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java index d555597d..aaa6bed3 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFish.java @@ -1,65 +1,22 @@ 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; - -import org.apache.commons.lang.Validate; +import net.minecraft.server.EntityFish; import org.bukkit.craftbukkit.CraftServer; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Fish; -import org.bukkit.projectiles.ProjectileSource; -public class CraftFish extends AbstractProjectile implements Fish { - private double biteChance = -1; +public class CraftFish extends CraftCreature implements Fish { - public CraftFish(CraftServer server, EntityFishingHook entity) { + public CraftFish(CraftServer server, EntityFish entity) { super(server, entity); } - public ProjectileSource getShooter() { - if (getHandle().owner != null) { - return getHandle().owner.getBukkitEntity(); - } - - return null; - } - - public void setShooter(ProjectileSource shooter) { - if (shooter instanceof CraftHumanEntity) { - getHandle().owner = (EntityHuman) ((CraftHumanEntity) shooter).entity; - } - } - @Override - public EntityFishingHook getHandle() { - return (EntityFishingHook) entity; + public EntityFish getHandle() { + return (EntityFish) entity; } @Override public String toString() { return "CraftFish"; } - - public EntityType getType() { - return EntityType.FISHING_HOOK; - } - - public double getBiteChance() { - EntityFishingHook hook = getHandle(); - - if (this.biteChance == -1) { - 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; - } - return this.biteChance; - } - - public void setBiteChance(double chance) { - Validate.isTrue(chance >= 0 && chance <= 1, "The bite chance must be between 0 and 1."); - this.biteChance = chance; - } } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java new file mode 100644 index 00000000..8392b16b --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftFishHook.java @@ -0,0 +1,65 @@ +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; + +import org.apache.commons.lang.Validate; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.FishHook; +import org.bukkit.projectiles.ProjectileSource; + +public class CraftFishHook extends AbstractProjectile implements FishHook { + private double biteChance = -1; + + public CraftFishHook(CraftServer server, EntityFishingHook entity) { + super(server, entity); + } + + public ProjectileSource getShooter() { + if (getHandle().owner != null) { + return getHandle().owner.getBukkitEntity(); + } + + return null; + } + + public void setShooter(ProjectileSource shooter) { + if (shooter instanceof CraftHumanEntity) { + getHandle().owner = (EntityHuman) ((CraftHumanEntity) shooter).entity; + } + } + + @Override + public EntityFishingHook getHandle() { + return (EntityFishingHook) entity; + } + + @Override + public String toString() { + return "CraftFishingHook"; + } + + public EntityType getType() { + return EntityType.FISHING_HOOK; + } + + public double getBiteChance() { + EntityFishingHook hook = getHandle(); + + if (this.biteChance == -1) { + 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; + } + return this.biteChance; + } + + public void setBiteChance(double chance) { + Validate.isTrue(chance >= 0 && chance <= 1, "The bite chance must be between 0 and 1."); + this.biteChance = chance; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java index a54548f0..269bbd8e 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftHumanEntity.java @@ -48,10 +48,6 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { enderChest = new CraftInventory(entity.getEnderChest()); } - public String getName() { - return getHandle().getName(); - } - public PlayerInventory getInventory() { return inventory; } @@ -295,7 +291,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { public InventoryView openWorkbench(Location location, boolean force) { if (!force) { Block block = location.getBlock(); - if (block.getType() != Material.WORKBENCH) { + if (block.getType() != Material.CRAFTING_TABLE) { return null; } } @@ -312,7 +308,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { public InventoryView openEnchanting(Location location, boolean force) { if (!force) { Block block = location.getBlock(); - if (block.getType() != Material.ENCHANTMENT_TABLE) { + if (block.getType() != Material.ENCHANTING_TABLE) { return null; } } @@ -325,7 +321,7 @@ public class CraftHumanEntity extends CraftLivingEntity implements HumanEntity { TileEntity container = getHandle().world.getTileEntity(pos); if (container == null && force) { container = new TileEntityEnchantTable(); - container.a(getHandle().world); + container.setWorld(getHandle().world); container.setPosition(pos); } getHandle().openTileEntity((ITileEntityContainer) container); diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index bf4428e1..0b12ed81 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -27,6 +27,7 @@ import net.minecraft.server.EntitySnowball; import net.minecraft.server.EntityThrownExpBottle; import net.minecraft.server.EntityTippedArrow; import net.minecraft.server.EntitySpectralArrow; +import net.minecraft.server.EntityThrownTrident; import net.minecraft.server.EntityWither; import net.minecraft.server.EntityWitherSkull; import net.minecraft.server.GenericAttributes; @@ -65,6 +66,7 @@ import org.bukkit.entity.SpectralArrow; import org.bukkit.entity.ThrownExpBottle; import org.bukkit.entity.ThrownPotion; import org.bukkit.entity.TippedArrow; +import org.bukkit.entity.Trident; import org.bukkit.entity.WitherSkull; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.EntityEquipment; @@ -318,6 +320,8 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { ((EntityTippedArrow) launch).setType(CraftPotionUtil.fromBukkit(new PotionData(PotionType.WATER, false, false))); } else if (SpectralArrow.class.isAssignableFrom(projectile)) { launch = new EntitySpectralArrow(world, getHandle()); + } else if (Trident.class.isAssignableFrom(projectile)) { + launch = new EntityThrownTrident(world, getHandle(), net.minecraft.server.ItemStack.a); } else { launch = new EntityTippedArrow(world, getHandle()); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java index 48599877..7d319812 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecart.java @@ -4,7 +4,9 @@ import net.minecraft.server.Blocks; import net.minecraft.server.EntityMinecartAbstract; import net.minecraft.server.IBlockData; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.Minecart; import org.bukkit.material.MaterialData; @@ -64,7 +66,19 @@ public abstract class CraftMinecart extends CraftVehicle implements Minecart { public void setDisplayBlock(MaterialData material) { if(material != null) { - IBlockData block = CraftMagicNumbers.getBlock(material.getItemTypeId()).fromLegacyData(material.getData()); + IBlockData block = CraftMagicNumbers.getBlock(material); + this.getHandle().setDisplayBlock(block); + } else { + // Set block to air (default) and set the flag to not have a display block. + this.getHandle().setDisplayBlock(Blocks.AIR.getBlockData()); + this.getHandle().a(false); + } + } + + @Override + public void setDisplayBlockData(BlockData blockData) { + if (blockData != null) { + IBlockData block = ((CraftBlockData) blockData).getState(); this.getHandle().setDisplayBlock(block); } else { // Set block to air (default) and set the flag to not have a display block. @@ -75,7 +89,13 @@ public abstract class CraftMinecart extends CraftVehicle implements Minecart { public MaterialData getDisplayBlock() { IBlockData blockData = getHandle().getDisplayBlock(); - return CraftMagicNumbers.getMaterial(blockData.getBlock()).getNewData((byte) blockData.getBlock().toLegacyData(blockData)); + return CraftMagicNumbers.getMaterial(blockData); + } + + @Override + public BlockData getDisplayBlockData() { + IBlockData blockData = getHandle().getDisplayBlock(); + return CraftBlockData.fromData(blockData); } public void setDisplayBlockOffset(int offset) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java index 58f3cf78..b178acd4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftMinecartCommand.java @@ -7,6 +7,7 @@ import net.minecraft.server.EntityMinecartCommandBlock; import org.bukkit.Bukkit; import org.bukkit.Server; import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.entity.EntityType; import org.bukkit.entity.minecart.CommandMinecart; import org.bukkit.permissions.PermissibleBase; @@ -40,7 +41,7 @@ public class CraftMinecartCommand extends CraftMinecart implements CommandMineca @Override public void setName(String name) { - getHandle().getCommandBlock().setName(name != null ? name : "@"); + getHandle().getCommandBlock().setName(CraftChatMessage.fromStringOrNull(name)); } @Override @@ -63,7 +64,7 @@ public class CraftMinecartCommand extends CraftMinecart implements CommandMineca @Override public String getName() { - return getHandle().getCommandBlock().getName(); + return CraftChatMessage.fromComponent(getHandle().getCommandBlock().getName()); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java index 3e9448a9..9c29a56d 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPainting.java @@ -1,7 +1,7 @@ package org.bukkit.craftbukkit.entity; import net.minecraft.server.EntityPainting; -import net.minecraft.server.EntityPainting.EnumArt; +import net.minecraft.server.Paintings; import net.minecraft.server.WorldServer; import org.bukkit.Art; @@ -19,7 +19,7 @@ public class CraftPainting extends CraftHanging implements Painting { } public Art getArt() { - EnumArt art = getHandle().art; + Paintings art = getHandle().art; return CraftArt.NotchToBukkit(art); } @@ -29,7 +29,7 @@ public class CraftPainting extends CraftHanging implements Painting { public boolean setArt(Art art, boolean force) { EntityPainting painting = this.getHandle(); - EnumArt oldArt = painting.art; + Paintings oldArt = painting.art; painting.art = CraftArt.BukkitToNotch(art); painting.setDirection(painting.direction); if (!force && !painting.survives()) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java new file mode 100644 index 00000000..9f9ee923 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPhantom.java @@ -0,0 +1,38 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityPhantom; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Phantom; + +public class CraftPhantom extends CraftFlying implements Phantom { + + public CraftPhantom(CraftServer server, EntityPhantom entity) { + super(server, entity); + } + + @Override + public EntityPhantom getHandle() { + return (EntityPhantom) super.getHandle(); + } + + @Override + public int getSize() { + return getHandle().getSize(); + } + + @Override + public void setSize(int sz) { + getHandle().setSize(sz); + } + + @Override + public String toString() { + return "CraftPhantom"; + } + + @Override + public EntityType getType() { + return EntityType.PHANTOM; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java index 4c44a198..042287e4 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java @@ -24,8 +24,46 @@ import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; -import net.minecraft.server.*; -import net.minecraft.server.PacketPlayOutTitle.EnumTitleAction; +import net.minecraft.server.AdvancementDataPlayer; +import net.minecraft.server.AdvancementProgress; +import net.minecraft.server.AttributeInstance; +import net.minecraft.server.AttributeMapServer; +import net.minecraft.server.AttributeModifiable; +import net.minecraft.server.AttributeRanged; +import net.minecraft.server.BlockPosition; +import net.minecraft.server.Container; +import net.minecraft.server.Entity; +import net.minecraft.server.EntityHuman; +import net.minecraft.server.EntityLiving; +import net.minecraft.server.EntityPlayer; +import net.minecraft.server.EntityTracker; +import net.minecraft.server.EntityTrackerEntry; +import net.minecraft.server.EnumChatFormat; +import net.minecraft.server.EnumGamemode; +import net.minecraft.server.IChatBaseComponent; +import net.minecraft.server.MapIcon; +import net.minecraft.server.MinecraftKey; +import net.minecraft.server.NBTTagCompound; +import net.minecraft.server.PacketDataSerializer; +import net.minecraft.server.PacketPlayOutBlockChange; +import net.minecraft.server.PacketPlayOutChat; +import net.minecraft.server.PacketPlayOutCustomPayload; +import net.minecraft.server.PacketPlayOutCustomSoundEffect; +import net.minecraft.server.PacketPlayOutMap; +import net.minecraft.server.PacketPlayOutNamedSoundEffect; +import net.minecraft.server.PacketPlayOutPlayerInfo; +import net.minecraft.server.PacketPlayOutSpawnPosition; +import net.minecraft.server.PacketPlayOutStopSound; +import net.minecraft.server.PacketPlayOutTitle; +import net.minecraft.server.PacketPlayOutUpdateAttributes; +import net.minecraft.server.PacketPlayOutUpdateHealth; +import net.minecraft.server.PacketPlayOutWorldEvent; +import net.minecraft.server.PacketPlayOutWorldParticles; +import net.minecraft.server.PlayerConnection; +import net.minecraft.server.TileEntitySign; +import net.minecraft.server.Vec3D; +import net.minecraft.server.WhiteListEntry; +import net.minecraft.server.WorldServer; import org.apache.commons.lang.Validate; import org.apache.commons.lang.NotImplementedException; @@ -36,12 +74,14 @@ import org.bukkit.Statistic; import org.bukkit.Material; import org.bukkit.Statistic.Type; import org.bukkit.World; +import org.bukkit.block.data.BlockData; import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.conversations.Conversation; import org.bukkit.conversations.ConversationAbandonedEvent; import org.bukkit.conversations.ManuallyAbandonedConversationCanceller; import org.bukkit.craftbukkit.CraftParticle; import org.bukkit.craftbukkit.block.CraftSign; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.conversations.ConversationTracker; import org.bukkit.craftbukkit.CraftEffect; import org.bukkit.craftbukkit.CraftOfflinePlayer; @@ -58,7 +98,6 @@ import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerRegisterChannelEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerUnregisterChannelEvent; @@ -66,7 +105,6 @@ 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.IllegalPluginAccessException; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.messaging.StandardMessenger; import org.bukkit.scoreboard.Scoreboard; @@ -182,7 +220,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (name == null) { name = getName(); } - getHandle().listName = name.equals(getName()) ? null : CraftChatMessage.fromString(name)[0]; + getHandle().listName = name.equals(getName()) ? null : CraftChatMessage.fromStringOrNull(name); for (EntityPlayer player : (List<EntityPlayer>)server.getHandle().players) { if (player.getBukkitEntity().canSee(this)) { player.playerConnection.sendPacket(new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_DISPLAY_NAME, getHandle())); @@ -347,7 +385,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { public void playSound(Location loc, String sound, org.bukkit.SoundCategory category, float volume, float pitch) { if (loc == null || sound == null || category == null || getHandle().playerConnection == null) return; - PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(sound, net.minecraft.server.SoundCategory.valueOf(category.name()), loc.getX(), loc.getY(), loc.getZ(), volume, pitch); + PacketPlayOutCustomSoundEffect packet = new PacketPlayOutCustomSoundEffect(new MinecraftKey(sound), net.minecraft.server.SoundCategory.valueOf(category.name()), new Vec3D(loc.getX(), loc.getY(), loc.getZ()), volume, pitch); getHandle().playerConnection.sendPacket(packet); } @@ -369,11 +407,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void stopSound(String sound, org.bukkit.SoundCategory category) { if (getHandle().playerConnection == null) return; - PacketDataSerializer packetdataserializer = new PacketDataSerializer(Unpooled.buffer()); - packetdataserializer.a(category == null ? "" : net.minecraft.server.SoundCategory.valueOf(category.name()).a()); - packetdataserializer.a(sound); - getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("MC|StopSound", packetdataserializer)); + getHandle().playerConnection.sendPacket(new PacketPlayOutStopSound(new MinecraftKey(sound), category == null ? net.minecraft.server.SoundCategory.MASTER : net.minecraft.server.SoundCategory.valueOf(category.name()))); } @Override @@ -399,16 +434,21 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void sendBlockChange(Location loc, Material material, byte data) { - sendBlockChange(loc, material.getId(), data); + if (getHandle().playerConnection == null) return; + + PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld) loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); + + packet.block = CraftMagicNumbers.getBlock(material, data); + getHandle().playerConnection.sendPacket(packet); } @Override - public void sendBlockChange(Location loc, int material, byte data) { + public void sendBlockChange(Location loc, BlockData block) { if (getHandle().playerConnection == null) return; PacketPlayOutBlockChange packet = new PacketPlayOutBlockChange(((CraftWorld) loc.getWorld()).getHandle(), new BlockPosition(loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())); - packet.block = CraftMagicNumbers.getBlock(material).fromLegacyData(data); + packet.block = ((CraftBlockData) block).getState(); getHandle().playerConnection.sendPacket(packet); } @@ -477,7 +517,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { Collection<MapIcon> icons = new ArrayList<MapIcon>(); for (MapCursor cursor : data.cursors) { if (cursor.isVisible()) { - icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection())); + icons.add(new MapIcon(MapIcon.Type.a(cursor.getRawType()), cursor.getX(), cursor.getY(), cursor.getDirection(), CraftChatMessage.fromStringOrNull(cursor.getCaption()))); } } @@ -783,9 +823,9 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public void setWhitelisted(boolean value) { if (value) { - server.getHandle().addWhitelist(getProfile()); + server.getHandle().getWhitelist().add(new WhiteListEntry(getProfile())); } else { - server.getHandle().removeWhitelist(getProfile()); + server.getHandle().getWhitelist().remove(getProfile()); } } @@ -1129,7 +1169,8 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (getHandle().playerConnection == null) return; if (channels.contains(channel)) { - PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(channel, new PacketDataSerializer(Unpooled.wrappedBuffer(message))); + channel = StandardMessenger.validateAndCorrectChannel(channel); + PacketPlayOutCustomPayload packet = new PacketPlayOutCustomPayload(new MinecraftKey(channel), new PacketDataSerializer(Unpooled.wrappedBuffer(message))); getHandle().playerConnection.sendPacket(packet); } } @@ -1156,12 +1197,14 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } public void addChannel(String channel) { + channel = StandardMessenger.validateAndCorrectChannel(channel); if (channels.add(channel)) { server.getPluginManager().callEvent(new PlayerRegisterChannelEvent(this, channel)); } } public void removeChannel(String channel) { + channel = StandardMessenger.validateAndCorrectChannel(channel); if (channels.remove(channel)) { server.getPluginManager().callEvent(new PlayerUnregisterChannelEvent(this, channel)); } @@ -1188,7 +1231,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { } } - getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload("REGISTER", new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray())))); + getHandle().playerConnection.sendPacket(new PacketPlayOutCustomPayload(new MinecraftKey("register"), new PacketDataSerializer(Unpooled.wrappedBuffer(stream.toByteArray())))); } } @@ -1290,7 +1333,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { @Override public float getFlySpeed() { - return getHandle().abilities.flySpeed * 2f; + return (float) getHandle().abilities.flySpeed * 2f; } @Override @@ -1436,19 +1479,19 @@ public class CraftPlayer extends CraftHumanEntity implements Player { getHandle().playerConnection.sendPacket(times); if (title != null) { - PacketPlayOutTitle packetTitle = new PacketPlayOutTitle(EnumTitleAction.TITLE, CraftChatMessage.fromString(title)[0]); + PacketPlayOutTitle packetTitle = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.TITLE, CraftChatMessage.fromStringOrNull(title)); getHandle().playerConnection.sendPacket(packetTitle); } if (subtitle != null) { - PacketPlayOutTitle packetSubtitle = new PacketPlayOutTitle(EnumTitleAction.SUBTITLE, CraftChatMessage.fromString(subtitle)[0]); + PacketPlayOutTitle packetSubtitle = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.SUBTITLE, CraftChatMessage.fromStringOrNull(subtitle)); getHandle().playerConnection.sendPacket(packetSubtitle); } } @Override public void resetTitle() { - PacketPlayOutTitle packetReset = new PacketPlayOutTitle(EnumTitleAction.RESET, null); + PacketPlayOutTitle packetReset = new PacketPlayOutTitle(PacketPlayOutTitle.EnumTitleAction.RESET, null); getHandle().playerConnection.sendPacket(packetReset); } @@ -1512,7 +1555,7 @@ public class CraftPlayer extends CraftHumanEntity implements Player { if (data != null && !particle.getDataType().isInstance(data)) { throw new IllegalArgumentException("data should be " + particle.getDataType() + " got " + data.getClass()); } - PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(CraftParticle.toNMS(particle), true, (float) x, (float) y, (float) z, (float) offsetX, (float) offsetY, (float) offsetZ, (float) extra, count, CraftParticle.toData(particle, data)); + PacketPlayOutWorldParticles packetplayoutworldparticles = new PacketPlayOutWorldParticles(CraftParticle.toNMS(particle, data), true, (float) x, (float) y, (float) z, (float) offsetX, (float) offsetY, (float) offsetZ, (float) extra, count); getHandle().playerConnection.sendPacket(packetplayoutworldparticles); } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java index 6cf74ce8..335acc24 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftProjectile.java @@ -19,12 +19,10 @@ public abstract class CraftProjectile extends AbstractProjectile implements Proj public void setShooter(ProjectileSource shooter) { if (shooter instanceof CraftLivingEntity) { getHandle().shooter = (EntityLiving) ((CraftLivingEntity) shooter).entity; - if (shooter instanceof CraftHumanEntity) { - getHandle().shooterName = ((CraftHumanEntity) shooter).getName(); - } + getHandle().shooterId = ((CraftLivingEntity) shooter).getUniqueId(); } else { getHandle().shooter = null; - getHandle().shooterName = null; + getHandle().shooterId = null; } getHandle().projectileSource = shooter; } diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java new file mode 100644 index 00000000..2701de75 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPufferFish.java @@ -0,0 +1,38 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityPufferFish; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.PufferFish; +import org.bukkit.entity.EntityType; + +public class CraftPufferFish extends CraftFish implements PufferFish { + + public CraftPufferFish(CraftServer server, EntityPufferFish entity) { + super(server, entity); + } + + @Override + public EntityPufferFish getHandle() { + return (EntityPufferFish) super.getHandle(); + } + + @Override + public int getPuffState() { + return getHandle().getPuffState(); + } + + @Override + public void setPuffState(int state) { + getHandle().setPuffState(state); + } + + @Override + public String toString() { + return "CraftPufferFish"; + } + + @Override + public EntityType getType() { + return EntityType.PUFFERFISH; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java new file mode 100644 index 00000000..4d91f576 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftSalmon.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntitySalmon; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.Salmon; +import org.bukkit.entity.EntityType; + +public class CraftSalmon extends CraftFish implements Salmon { + + public CraftSalmon(CraftServer server, EntitySalmon entity) { + super(server, entity); + } + + @Override + public EntitySalmon getHandle() { + return (EntitySalmon) super.getHandle(); + } + + @Override + public String toString() { + return "CraftSalmon"; + } + + @Override + public EntityType getType() { + return EntityType.SALMON; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java new file mode 100644 index 00000000..0518e6c6 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTrident.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityThrownTrident; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Trident; + +public class CraftTrident extends CraftArrow implements Trident { + + public CraftTrident(CraftServer server, EntityThrownTrident entity) { + super(server, entity); + } + + @Override + public EntityThrownTrident getHandle() { + return (EntityThrownTrident) super.getHandle(); + } + + @Override + public String toString() { + return "CraftTrident"; + } + + @Override + public EntityType getType() { + return EntityType.TRIDENT; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java new file mode 100644 index 00000000..42d1d4de --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTropicalFish.java @@ -0,0 +1,111 @@ +package org.bukkit.craftbukkit.entity; + +import java.util.HashMap; +import java.util.Map; +import net.minecraft.server.EntityTropicalFish; +import org.bukkit.DyeColor; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.TropicalFish; + +public class CraftTropicalFish extends CraftFish implements TropicalFish { + + public CraftTropicalFish(CraftServer server, EntityTropicalFish entity) { + super(server, entity); + } + + @Override + public EntityTropicalFish getHandle() { + return (EntityTropicalFish) entity; + } + + @Override + public String toString() { + return "CraftTropicalFish"; + } + + @Override + public DyeColor getPatternColor() { + return getPatternColor(getHandle().getVariant()); + } + + @Override + public void setPatternColor(DyeColor color) { + getHandle().setVariant(getData(color, getBodyColor(), getPattern())); + } + + @Override + public DyeColor getBodyColor() { + return getBodyColor(getHandle().getVariant()); + } + + @Override + public void setBodyColor(DyeColor color) { + getHandle().setVariant(getData(getPatternColor(), color, getPattern())); + } + + @Override + public Pattern getPattern() { + return getPattern(getHandle().getVariant()); + } + + @Override + public void setPattern(Pattern pattern) { + getHandle().setVariant(getData(getPatternColor(), getBodyColor(), pattern)); + } + + public static enum CraftPattern { + KOB(0, false), + SUNSTREAK(1, false), + SNOOPER(2, false), + DASHER(3, false), + BRINELY(4, false), + SPOTTY(5, false), + FLOPPER(0, true), + STRIPEY(1, true), + GLITTER(2, true), + BLOCKFISH(3, true), + BETTY(4, true), + CLAYFISH(5, true); + + private final int variant; + private final boolean large; + + // + private static final Map<Integer, Pattern> BY_DATA = new HashMap<>(); + + static { + for (CraftPattern type : values()) { + BY_DATA.put(type.getDataValue(), Pattern.values()[type.ordinal()]); + } + } + + public static Pattern fromData(int data) { + return BY_DATA.get(data); + } + + private CraftPattern(int variant, boolean large) { + this.variant = variant; + this.large = large; + } + + public int getDataValue() { + return variant << 8 | ((large) ? 1 : 0); + } + } + + public static int getData(DyeColor patternColor, DyeColor bodyColor, Pattern type) { + return patternColor.getWoolData() << 24 | bodyColor.getWoolData() << 16 | CraftPattern.values()[type.ordinal()].getDataValue(); + } + + public static DyeColor getPatternColor(int data) { + return DyeColor.getByWoolData((byte) ((data >> 24) & 0xFF)); + } + + public static DyeColor getBodyColor(int data) { + return DyeColor.getByWoolData((byte) ((data >> 16) & 0xFF)); + } + + public static Pattern getPattern(int data) { + return CraftPattern.fromData(data & 0xFFFF); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java new file mode 100644 index 00000000..123a2c75 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftTurtle.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.entity; + +import net.minecraft.server.EntityTurtle; +import org.bukkit.craftbukkit.CraftServer; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Turtle; + +public class CraftTurtle extends CraftAnimals implements Turtle { + + public CraftTurtle(CraftServer server, EntityTurtle entity) { + super(server, entity); + } + + @Override + public EntityTurtle getHandle() { + return (EntityTurtle) super.getHandle(); + } + + @Override + public String toString() { + return "CraftTurtle"; + } + + @Override + public EntityType getType() { + return EntityType.TURTLE; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java index 503bd066..a6ee01ca 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftVillager.java @@ -51,7 +51,7 @@ public class CraftVillager extends CraftAgeable implements Villager, InventoryHo @Override public Career getCareer() { - return getCareer(getProfession(), getHandle().bK); + return getCareer(getProfession(), getHandle().careerId); } @Override @@ -62,15 +62,15 @@ public class CraftVillager extends CraftAgeable implements Villager, InventoryHo @Override public void setCareer(Career career, boolean resetTrades) { if (career == null) { - getHandle().bK = 0; // reset career + getHandle().careerId = 0; // reset career } else { Validate.isTrue(career.getProfession() == getProfession(), "Career assignment mismatch. Found (" + getProfession() + ") Required (" + career.getProfession() + ")"); - getHandle().bK = getCareerID(career); + getHandle().careerId = getCareerID(career); } if (resetTrades) { getHandle().trades = null; - getHandle().dx(); + getHandle().populateTrades(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index c4bc628b..527af08c 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -361,21 +361,24 @@ public class CraftEventFactory { /** * BlockFadeEvent */ - public static BlockFadeEvent callBlockFadeEvent(Block block, net.minecraft.server.Block type) { - BlockState state = block.getState(); - state.setTypeId(net.minecraft.server.Block.getId(type)); + public static BlockFadeEvent callBlockFadeEvent(GeneratorAccess world, BlockPosition pos, IBlockData newBlock) { + CraftBlockState state = CraftBlockState.getBlockState(world, pos); + state.setData(newBlock); - BlockFadeEvent event = new BlockFadeEvent(block, state); + BlockFadeEvent event = new BlockFadeEvent(state.getBlock(), state); Bukkit.getPluginManager().callEvent(event); return event; } - public static boolean handleBlockSpreadEvent(Block block, Block source, net.minecraft.server.Block type, int data) { - BlockState state = block.getState(); - state.setTypeId(net.minecraft.server.Block.getId(type)); - state.setRawData((byte) data); + public static boolean handleBlockSpreadEvent(World world, BlockPosition source, BlockPosition target, IBlockData block) { + return handleBlockSpreadEvent(world, source, target, block, 2); + } + + public static boolean handleBlockSpreadEvent(World world, BlockPosition source, BlockPosition target, IBlockData block, int flag) { + CraftBlockState state = CraftBlockState.getBlockState(world, target, flag); + state.setData(block); - BlockSpreadEvent event = new BlockSpreadEvent(block, source, state); + BlockSpreadEvent event = new BlockSpreadEvent(world.getWorld().getBlockAt(target.getX(), target.getY(), target.getZ()), world.getWorld().getBlockAt(source.getX(), source.getY(), source.getZ()), state); Bukkit.getPluginManager().callEvent(event); if (!event.isCancelled()) { @@ -558,6 +561,8 @@ public class CraftEventFactory { cause = DamageCause.FLY_INTO_WALL; } else if (source == DamageSource.CRAMMING) { cause = DamageCause.CRAMMING; + } else if (source == DamageSource.DRYOUT) { + cause = DamageCause.DRYOUT; } else if (source == DamageSource.GENERIC) { cause = DamageCause.CUSTOM; } @@ -656,11 +661,14 @@ public class CraftEventFactory { return event; } - public static boolean handleBlockGrowEvent(World world, int x, int y, int z, net.minecraft.server.Block type, int data) { - Block block = world.getWorld().getBlockAt(x, y, z); + public static boolean handleBlockGrowEvent(World world, BlockPosition pos, IBlockData block) { + return handleBlockGrowEvent(world, pos, block, 3); + } + + public static boolean handleBlockGrowEvent(World world, BlockPosition pos, IBlockData newData, int flag) { + Block block = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()); CraftBlockState state = (CraftBlockState) block.getState(); - state.setTypeId(net.minecraft.server.Block.getId(type)); - state.setRawData((byte) data); + state.setData(newData); BlockGrowEvent event = new BlockGrowEvent(block, state); Bukkit.getPluginManager().callEvent(event); @@ -690,33 +698,17 @@ public class CraftEventFactory { return event; } - public static EntityChangeBlockEvent callEntityChangeBlockEvent(org.bukkit.entity.Entity entity, Block block, Material material) { - return callEntityChangeBlockEvent(entity, block, material, 0); - } - - public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, Block block, Material material) { - return callEntityChangeBlockEvent(entity.getBukkitEntity(), block, material, 0); - } - - public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, Block block, Material material, boolean cancelled) { - return callEntityChangeBlockEvent(entity.getBukkitEntity(), block, material, 0, cancelled); + public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, IBlockData newBlock) { + return callEntityChangeBlockEvent(entity, position, newBlock, false); } - public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, net.minecraft.server.Block type, int data) { + public static EntityChangeBlockEvent callEntityChangeBlockEvent(Entity entity, BlockPosition position, IBlockData newBlock, boolean cancelled) { Block block = entity.world.getWorld().getBlockAt(position.getX(), position.getY(), position.getZ()); - Material material = CraftMagicNumbers.getMaterial(type); - - return callEntityChangeBlockEvent(entity.getBukkitEntity(), block, material, data); - } + Material material = CraftMagicNumbers.getMaterial(newBlock).getItemType(); - public static EntityChangeBlockEvent callEntityChangeBlockEvent(org.bukkit.entity.Entity entity, Block block, Material material, int data) { - return callEntityChangeBlockEvent(entity, block, material, data, false); - } - - public static EntityChangeBlockEvent callEntityChangeBlockEvent(org.bukkit.entity.Entity entity, Block block, Material material, int data, boolean cancelled) { - EntityChangeBlockEvent event = new EntityChangeBlockEvent(entity, block, material, (byte) data); + EntityChangeBlockEvent event = new EntityChangeBlockEvent(entity.getBukkitEntity(), block, material, (byte) 0); event.setCancelled(cancelled); - entity.getServer().getPluginManager().callEvent(event); + event.getEntity().getServer().getPluginManager().callEvent(event); return event; } @@ -773,8 +765,8 @@ public class CraftEventFactory { return container; } - public static ItemStack callPreCraftEvent(InventoryCrafting matrix, ItemStack result, InventoryView lastCraftView, boolean isRepair) { - CraftInventoryCrafting inventory = new CraftInventoryCrafting(matrix, matrix.resultInventory); + public static ItemStack callPreCraftEvent(IInventory matrix, IInventory resultInventory, ItemStack result, InventoryView lastCraftView, boolean isRepair) { + CraftInventoryCrafting inventory = new CraftInventoryCrafting(matrix, resultInventory); inventory.setResult(CraftItemStack.asCraftMirror(result)); PrepareItemCraftEvent event = new PrepareItemCraftEvent(inventory, lastCraftView, isRepair); @@ -811,14 +803,14 @@ public class CraftEventFactory { return event; } - public static BlockRedstoneEvent callRedstoneChange(World world, int x, int y, int z, int oldCurrent, int newCurrent) { - BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(x, y, z), oldCurrent, newCurrent); + public static BlockRedstoneEvent callRedstoneChange(World world, BlockPosition pos, int oldCurrent, int newCurrent) { + BlockRedstoneEvent event = new BlockRedstoneEvent(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), oldCurrent, newCurrent); world.getServer().getPluginManager().callEvent(event); return event; } - public static NotePlayEvent callNotePlayEvent(World world, int x, int y, int z, byte instrument, byte note) { - NotePlayEvent event = new NotePlayEvent(world.getWorld().getBlockAt(x, y, z), org.bukkit.Instrument.getByType(instrument), new org.bukkit.Note(note)); + public static NotePlayEvent callNotePlayEvent(World world, BlockPosition pos, BlockPropertyInstrument instrument, int note) { + NotePlayEvent event = new NotePlayEvent(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), org.bukkit.Instrument.getByType((byte) instrument.ordinal()), new org.bukkit.Note(note)); world.getServer().getPluginManager().callEvent(event); return event; } @@ -829,13 +821,12 @@ public class CraftEventFactory { Bukkit.getPluginManager().callEvent(event); } - public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, int igniterX, int igniterY, int igniterZ) { + public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition block, BlockPosition source) { org.bukkit.World bukkitWorld = world.getWorld(); - Block igniter = bukkitWorld.getBlockAt(igniterX, igniterY, igniterZ); + Block igniter = bukkitWorld.getBlockAt(source.getX(), source.getY(), source.getZ()); IgniteCause cause; switch (igniter.getType()) { case LAVA: - case STATIONARY_LAVA: cause = IgniteCause.LAVA; break; case DISPENSER: @@ -846,12 +837,12 @@ public class CraftEventFactory { cause = IgniteCause.SPREAD; } - BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(x, y, z), cause, igniter); + BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(block.getX(), block.getY(), block.getZ()), cause, igniter); world.getServer().getPluginManager().callEvent(event); return event; } - public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, Entity igniter) { + public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition pos, Entity igniter) { org.bukkit.World bukkitWorld = world.getWorld(); org.bukkit.entity.Entity bukkitIgniter = igniter.getBukkitEntity(); IgniteCause cause; @@ -870,7 +861,7 @@ public class CraftEventFactory { cause = IgniteCause.FLINT_AND_STEEL; } - BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(x, y, z), cause, bukkitIgniter); + BlockIgniteEvent event = new BlockIgniteEvent(bukkitWorld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), cause, bukkitIgniter); world.getServer().getPluginManager().callEvent(event); return event; } @@ -884,8 +875,8 @@ public class CraftEventFactory { return event; } - public static BlockIgniteEvent callBlockIgniteEvent(World world, int x, int y, int z, IgniteCause cause, Entity igniter) { - BlockIgniteEvent event = new BlockIgniteEvent(world.getWorld().getBlockAt(x, y, z), cause, igniter.getBukkitEntity()); + public static BlockIgniteEvent callBlockIgniteEvent(World world, BlockPosition pos, IgniteCause cause, Entity igniter) { + BlockIgniteEvent event = new BlockIgniteEvent(world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()), cause, igniter.getBukkitEntity()); world.getServer().getPluginManager().callEvent(event); return event; } @@ -932,7 +923,7 @@ public class CraftEventFactory { c.setChatModifier(modi); if (c instanceof ChatMessage) { ChatMessage cm = (ChatMessage) c; - Object[] oo = cm.j(); + Object[] oo = cm.i(); for (int i = 0; i < oo.length; i++) { Object o = oo[i]; if (o instanceof IChatBaseComponent) { @@ -961,7 +952,7 @@ public class CraftEventFactory { return event; } - public static Cancellable handleStatisticsIncrease(EntityHuman entityHuman, net.minecraft.server.Statistic statistic, int current, int incrementation) { + public static Cancellable handleStatisticsIncrease(EntityHuman entityHuman, net.minecraft.server.Statistic<?> statistic, int current, int incrementation) { Player player = ((EntityPlayer) entityHuman).getBukkitEntity(); Event event; if (true) { @@ -974,12 +965,13 @@ public class CraftEventFactory { case FALL_ONE_CM: case BOAT_ONE_CM: case CLIMB_ONE_CM: - case DIVE_ONE_CM: + case WALK_ON_WATER_ONE_CM: + case WALK_UNDER_WATER_ONE_CM: case FLY_ONE_CM: case HORSE_ONE_CM: case MINECART_ONE_CM: case PIG_ONE_CM: - case PLAY_ONE_TICK: + case PLAY_ONE_MINUTE: case SWIM_ONE_CM: case WALK_ONE_CM: case SPRINT_ONE_CM: @@ -993,7 +985,7 @@ public class CraftEventFactory { if (stat.getType() == Type.UNTYPED) { event = new PlayerStatisticIncrementEvent(player, stat, current, current + incrementation); } else if (stat.getType() == Type.ENTITY) { - EntityType entityType = CraftStatistic.getEntityTypeFromStatistic(statistic); + EntityType entityType = CraftStatistic.getEntityTypeFromStatistic((net.minecraft.server.Statistic<EntityTypes<?>>) statistic); event = new PlayerStatisticIncrementEvent(player, stat, current, current + incrementation, entityType); } else { Material material = CraftStatistic.getMaterialFromStatistic(statistic); @@ -1045,17 +1037,28 @@ public class CraftEventFactory { return event; } - public static BlockPhysicsEvent callBlockPhysicsEvent(World world, BlockPosition blockposition) { - org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); - BlockPhysicsEvent event = new BlockPhysicsEvent(block, block.getTypeId()); - world.getServer().getPluginManager().callEvent(event); + public static BlockPhysicsEvent callBlockPhysicsEvent(GeneratorAccess world, BlockPosition blockposition) { + org.bukkit.block.Block block = CraftBlock.at(world, blockposition); + BlockPhysicsEvent event = new BlockPhysicsEvent(block, block.getBlockData()); + world.getMinecraftWorld().getMinecraftServer().server.getPluginManager().callEvent(event); return event; } + public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block) { + return handleBlockFormEvent(world, pos, block, 3); + } + public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block, @Nullable Entity entity) { - BlockState blockState = world.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ()).getState(); - blockState.setType(CraftMagicNumbers.getMaterial(block.getBlock())); - blockState.setRawData((byte) block.getBlock().toLegacyData(block)); + return handleBlockFormEvent(world, pos, block, 3, entity); + } + + public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block, int flag) { + return handleBlockFormEvent(world, pos, block, flag, null); + } + + public static boolean handleBlockFormEvent(World world, BlockPosition pos, IBlockData block, int flag, @Nullable Entity entity) { + CraftBlockState blockState = CraftBlockState.getBlockState(world, pos, flag); + blockState.setData(block); BlockFormEvent event = (entity == null) ? new BlockFormEvent(blockState.getBlock(), blockState) : new EntityBlockFormEvent(entity.getBukkitEntity(), blockState.getBlock(), blockState); world.getServer().getPluginManager().callEvent(event); diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java b/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java index 01264a7e..a0fda929 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CraftChunkData.java @@ -1,12 +1,13 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ package org.bukkit.craftbukkit.generator; -import java.util.Arrays; +import net.minecraft.server.Blocks; +import net.minecraft.server.ChunkSection; +import net.minecraft.server.IBlockData; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.generator.ChunkGenerator; import org.bukkit.material.MaterialData; @@ -15,7 +16,7 @@ import org.bukkit.material.MaterialData; */ public final class CraftChunkData implements ChunkGenerator.ChunkData { private final int maxHeight; - private final char[][] sections; + private final ChunkSection[] sections; public CraftChunkData(World world) { this(world.getMaxHeight()); @@ -26,8 +27,7 @@ public final class CraftChunkData implements ChunkGenerator.ChunkData { throw new IllegalArgumentException("World height exceeded max chunk height"); } this.maxHeight = maxHeight; - // Minecraft hardcodes this to 16 chunk sections. - sections = new char[16][]; + sections = new ChunkSection[maxHeight >> 4]; } @Override @@ -37,41 +37,50 @@ public final class CraftChunkData implements ChunkGenerator.ChunkData { @Override public void setBlock(int x, int y, int z, Material material) { - setBlock(x, y, z, material.getId()); + setBlock(x, y, z, CraftMagicNumbers.getBlock(material, (byte) 0)); } @Override public void setBlock(int x, int y, int z, MaterialData material) { - setBlock(x, y, z, material.getItemTypeId(), material.getData()); + setBlock(x, y, z, CraftMagicNumbers.getBlock(material)); + } + + @Override + public void setBlock(int x, int y, int z, BlockData blockData) { + setBlock(x, y, z, ((CraftBlockData) blockData).getState()); } @Override public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, Material material) { - setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material.getId()); + setRegion(xMin, yMin, zMin, xMax, yMax, zMax, CraftMagicNumbers.getBlock(material, (byte) 0)); } @Override public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, MaterialData material) { - setRegion(xMin, yMin, zMin, xMax, yMax, zMax, material.getItemTypeId(), material.getData()); + setRegion(xMin, yMin, zMin, xMax, yMax, zMax, CraftMagicNumbers.getBlock(material)); + } + + @Override + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, BlockData blockData) { + setRegion(xMin, yMin, zMin, xMax, yMax, zMax, ((CraftBlockData) blockData).getState()); } @Override public Material getType(int x, int y, int z) { - return Material.getMaterial(getTypeId(x, y, z)); + return getTypeAndData(x, y, z).getItemType(); } @Override public MaterialData getTypeAndData(int x, int y, int z) { - return getType(x, y, z).getNewData(getData(x, y, z)); + return CraftMagicNumbers.getMaterial(getTypeId(x, y, z)); } @Override - public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, int blockId) { - setRegion(xMin, yMin, zMin, xMax, yMax, zMax, blockId, (byte) 0); + public BlockData getBlockData(int x, int y, int z) { + return CraftBlockData.fromData(getTypeId(x, y, z)); } - @Override - public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, int blockId, int data) { + public void setRegion(int xMin, int yMin, int zMin, int xMax, int yMax, int zMax, IBlockData type) { // Clamp to sane values. if (xMin > 0xf || yMin >= maxHeight || zMin > 0xf) { return; @@ -97,103 +106,51 @@ public final class CraftChunkData implements ChunkGenerator.ChunkData { if (xMin >= xMax || yMin >= yMax || zMin >= zMax) { return; } - char typeChar = (char) ((blockId << 4) | data); - if (xMin == 0 && xMax == 0x10) { - if (zMin == 0 && zMax == 0x10) { - for (int y = yMin & 0xf0; y < yMax; y += 0x10) { - char[] section = getChunkSection(y, true); - if (y <= yMin) { - if (y + 0x10 > yMax) { - // First and last chunk section - Arrays.fill(section, (yMin & 0xf) << 8, (yMax & 0xf) << 8, typeChar); - } else { - // First chunk section - Arrays.fill(section, (yMin & 0xf) << 8, 0x1000, typeChar); - } - } else if (y + 0x10 > yMax) { - // Last chunk section - Arrays.fill(section, 0, (yMax & 0xf) << 8, typeChar); - } else { - // Full chunk section - Arrays.fill(section, 0, 0x1000, typeChar); - } - } - } else { - for (int y = yMin; y < yMax; y++) { - char[] section = getChunkSection(y, true); - int offsetBase = (y & 0xf) << 8; - int min = offsetBase | (zMin << 4); - // Need to add zMax as it can be 16, which overlaps the y coordinate bits - int max = offsetBase + (zMax << 4); - Arrays.fill(section, min, max, typeChar); - } - } - } else { - for (int y = yMin; y < yMax; y++) { - char[] section = getChunkSection(y, true); - int offsetBase = (y & 0xf) << 8; + for (int y = yMin; y < yMax; y++) { + ChunkSection section = getChunkSection(y, true); + int offsetBase = y & 0xf; + for (int x = xMin; x < xMax; x++) { for (int z = zMin; z < zMax; z++) { - int offset = offsetBase | (z << 4); - // Need to add xMax as it can be 16, which overlaps the z coordinate bits - Arrays.fill(section, offset | xMin, offset + xMax, typeChar); + section.setType(x, offsetBase, z, type); } } } } - @Override - public void setBlock(int x, int y, int z, int blockId) { - setBlock(x, y, z, blockId, (byte) 0); - } - - @Override - public void setBlock(int x, int y, int z, int blockId, byte data) { - setBlock(x, y, z, (char) (blockId << 4 | data)); - } - - @Override - public int getTypeId(int x, int y, int z) { + public IBlockData getTypeId(int x, int y, int z) { if (x != (x & 0xf) || y < 0 || y >= maxHeight || z != (z & 0xf)) { - return 0; + return Blocks.AIR.getBlockData(); } - char[] section = getChunkSection(y, false); + ChunkSection section = getChunkSection(y, false); if (section == null) { - return 0; + return Blocks.AIR.getBlockData(); } else { - return section[(y & 0xf) << 8 | z << 4 | x] >> 4; + return section.getType(x, y & 0xf, z); } } @Override public byte getData(int x, int y, int z) { - if (x != (x & 0xf) || y < 0 || y >= maxHeight || z != (z & 0xf)) { - return (byte) 0; - } - char[] section = getChunkSection(y, false); - if (section == null) { - return (byte) 0; - } else { - return (byte) (section[(y & 0xf) << 8 | z << 4 | x] & 0xf); - } + return CraftMagicNumbers.toLegacyData(getTypeId(x, y, z)); } - private void setBlock(int x, int y, int z, char type) { + private void setBlock(int x, int y, int z, IBlockData type) { if (x != (x & 0xf) || y < 0 || y >= maxHeight || z != (z & 0xf)) { return; } - char[] section = getChunkSection(y, true); - section[(y & 0xf) << 8 | z << 4 | x] = type; + ChunkSection section = getChunkSection(y, true); + section.setType(x, y & 0xf, z, type); } - private char[] getChunkSection(int y, boolean create) { - char[] section = sections[y >> 4]; + private ChunkSection getChunkSection(int y, boolean create) { + ChunkSection section = sections[y >> 4]; if (create && section == null) { - sections[y >> 4] = section = new char[0x1000]; + sections[y >> 4] = section = new ChunkSection(y, create); } return section; } - char[][] getRawChunkData() { + ChunkSection[] getRawChunkData() { return sections; } } diff --git a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java index 9942f0c7..4280be5a 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/CustomChunkGenerator.java @@ -1,6 +1,11 @@ package org.bukkit.craftbukkit.generator; +import com.google.common.collect.Maps; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import it.unimi.dsi.fastutil.longs.LongSet; import java.util.List; +import java.util.Map; import java.util.Random; import net.minecraft.server.*; @@ -10,11 +15,14 @@ import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; import org.bukkit.craftbukkit.block.CraftBlock; -public class CustomChunkGenerator extends InternalChunkGenerator { +public class CustomChunkGenerator extends InternalChunkGenerator<GeneratorSettingsDefault> { private final ChunkGenerator generator; private final WorldServer world; + private final long seed; private final Random random; + private final WorldChunkManager chunkManager; private final WorldGenStronghold strongholdGen = new WorldGenStronghold(); + private final GeneratorSettingsDefault settings = new GeneratorSettingsDefault(); private static class CustomBiomeGrid implements BiomeGrid { BiomeBase[] biome; @@ -26,215 +34,145 @@ public class CustomChunkGenerator extends InternalChunkGenerator { @Override public void setBiome(int x, int z, Biome bio) { - biome[(z << 4) | x] = CraftBlock.biomeToBiomeBase(bio); + biome[(z << 4) | x] = CraftBlock.biomeToBiomeBase(bio); } } public CustomChunkGenerator(World world, long seed, ChunkGenerator generator) { this.world = (WorldServer) world; this.generator = generator; + this.seed = seed; this.random = new Random(seed); + this.chunkManager = world.worldProvider.getChunkGenerator().getWorldChunkManager(); } @Override - public Chunk getOrCreateChunk(int x, int z) { + public void createChunk(IChunkAccess ichunkaccess) { + int x = ichunkaccess.getPos().x; + int z = ichunkaccess.getPos().z; random.setSeed((long) x * 341873128712L + (long) z * 132897987541L); - Chunk chunk; - // Get default biome data for chunk CustomBiomeGrid biomegrid = new CustomBiomeGrid(); - biomegrid.biome = new BiomeBase[256]; - world.getWorldChunkManager().getBiomeBlock(biomegrid.biome, x << 4, z << 4, 16, 16); + biomegrid.biome = chunkManager.getBiomeBlock(x << 4, z << 4, 16, 16); - // Try ChunkData method (1.8+) CraftChunkData data = (CraftChunkData) generator.generateChunkData(this.world.getWorld(), random, x, z, biomegrid); - if (data != null) { - char[][] sections = data.getRawChunkData(); - chunk = new Chunk(this.world, x, z); - - ChunkSection[] csect = chunk.getSections(); - int scnt = Math.min(csect.length, sections.length); - - // Loop through returned sections - for (int sec = 0; sec < scnt; sec++) { - if(sections[sec] == null) { - continue; - } - char[] section = sections[sec]; - char emptyTest = 0; - for (int i = 0; i < 4096; i++) { - // Filter invalid block id & data values. - if (Block.REGISTRY_ID.fromId(section[i]) == null) { - section[i] = 0; - } - emptyTest |= section[i]; - } - // Build chunk section - if (emptyTest != 0) { - csect[sec] = new ChunkSection(sec << 4, true, section); - } - } - } - else { - // Try extended block method (1.2+) - short[][] xbtypes = generator.generateExtBlockSections(this.world.getWorld(), this.random, x, z, biomegrid); - if (xbtypes != null) { - chunk = new Chunk(this.world, x, z); - - ChunkSection[] csect = chunk.getSections(); - int scnt = Math.min(csect.length, xbtypes.length); - - // Loop through returned sections - for (int sec = 0; sec < scnt; sec++) { - if (xbtypes[sec] == null) { - continue; - } - char[] secBlkID = new char[4096]; // Allocate blk ID bytes - short[] bdata = xbtypes[sec]; - for (int i = 0; i < bdata.length; i++) { - Block b = Block.getById(bdata[i]); - secBlkID[i] = (char) Block.REGISTRY_ID.getId(b.getBlockData()); - } - // Build chunk section - csect[sec] = new ChunkSection(sec << 4, true, secBlkID); - } - } - else { // Else check for byte-per-block section data - byte[][] btypes = generator.generateBlockSections(this.world.getWorld(), this.random, x, z, biomegrid); - - if (btypes != null) { - chunk = new Chunk(this.world, x, z); - - ChunkSection[] csect = chunk.getSections(); - int scnt = Math.min(csect.length, btypes.length); - - for (int sec = 0; sec < scnt; sec++) { - if (btypes[sec] == null) { - continue; - } - - char[] secBlkID = new char[4096]; // Allocate block ID bytes - for (int i = 0; i < secBlkID.length; i++) { - Block b = Block.getById(btypes[sec][i] & 0xFF); - secBlkID[i] = (char) Block.REGISTRY_ID.getId(b.getBlockData()); - } - csect[sec] = new ChunkSection(sec << 4, true, secBlkID); - } - } - else { // Else, fall back to pre 1.2 method - @SuppressWarnings("deprecation") - byte[] types = generator.generate(this.world.getWorld(), this.random, x, z); - int ydim = types.length / 256; - int scnt = ydim / 16; - - chunk = new Chunk(this.world, x, z); // Create empty chunk - - ChunkSection[] csect = chunk.getSections(); - - scnt = Math.min(scnt, csect.length); - // Loop through sections - for (int sec = 0; sec < scnt; sec++) { - char[] csbytes = null; // Add sections when needed - - for (int cy = 0; cy < 16; cy++) { - int cyoff = cy | (sec << 4); - - for (int cx = 0; cx < 16; cx++) { - int cxyoff = (cx * ydim * 16) + cyoff; - - for (int cz = 0; cz < 16; cz++) { - byte blk = types[cxyoff + (cz * ydim)]; - - if (blk != 0) { // If non-empty - if (csbytes == null) { // If no section yet, get one - csbytes = new char[16*16*16]; - } - - Block b = Block.getById(blk & 0xFF); - csbytes[(cy << 8) | (cz << 4) | cx] = (char) Block.REGISTRY_ID.getId(b.getBlockData()); - } - } - } - } - // If section built, finish prepping its state - if (csbytes != null) { - ChunkSection cs = csect[sec] = new ChunkSection(sec << 4, true, csbytes); - cs.recalcBlockCounts(); - } - } - } + ChunkSection[] sections = data.getRawChunkData(); + + ChunkSection[] csect = ichunkaccess.getSections(); + int scnt = Math.min(csect.length, sections.length); + + // Loop through returned sections + for (int sec = 0; sec < scnt; sec++) { + if (sections[sec] == null) { + continue; } + ChunkSection section = sections[sec]; + + csect[sec] = section; } + // Set biome grid - byte[] biomeIndex = chunk.getBiomeIndex(); - for (int i = 0; i < biomeIndex.length; i++) { - biomeIndex[i] = (byte) (BiomeBase.REGISTRY_ID.a(biomegrid.biome[i]) & 0xFF); // PAIL : rename - } - // Initialize lighting - chunk.initLighting(); + ichunkaccess.a(biomegrid.biome); + } - return chunk; + @Override + public ChunkData generateChunkData(org.bukkit.World world, Random random, int x, int z, BiomeGrid biome) { + return generator.generateChunkData(world, random, x, z, biome); } @Override - public boolean a(Chunk chunk, int i, int i1) { - return false; + public boolean canSpawn(org.bukkit.World world, int x, int z) { + return generator.canSpawn(world, x, z); } - @SuppressWarnings("deprecation") @Override - public byte[] generate(org.bukkit.World world, Random random, int x, int z) { - return generator.generate(world, random, x, z); + public List<BlockPopulator> getDefaultPopulators(org.bukkit.World world) { + return generator.getDefaultPopulators(world); } @Override - public byte[][] generateBlockSections(org.bukkit.World world, Random random, int x, int z, BiomeGrid biomes) { - return generator.generateBlockSections(world, random, x, z, biomes); + public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType type, BlockPosition position) { + BiomeBase biomebase = world.getBiome(position); + + return biomebase == null ? null : biomebase.getMobs(type); } @Override - public short[][] generateExtBlockSections(org.bukkit.World world, Random random, int x, int z, BiomeGrid biomes) { - return generator.generateExtBlockSections(world, random, x, z, biomes); + public void addFeatures(RegionLimitedWorldAccess regionlimitedworldaccess, WorldGenStage.Features worldgenstage_features) { } - public Chunk getChunkAt(int x, int z) { - return getOrCreateChunk(x, z); + @Override + public void addDecorations(RegionLimitedWorldAccess regionlimitedworldaccess) { } @Override - public boolean canSpawn(org.bukkit.World world, int x, int z) { - return generator.canSpawn(world, x, z); + public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) { } @Override - public List<BlockPopulator> getDefaultPopulators(org.bukkit.World world) { - return generator.getDefaultPopulators(world); + public BlockPosition findNearestMapFeature(World world, String type, BlockPosition position, int i) { + return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, this, position, i) : null; } @Override - public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType type, BlockPosition position) { - BiomeBase biomebase = world.getBiome(position); + public GeneratorSettingsDefault getSettings() { + return settings; + } - return biomebase == null ? null : biomebase.getMobs(type); + @Override + public int a(World world, boolean flag, boolean flag1) { + return 0; + } + + @Override + public boolean canSpawnStructure(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return biomebase.a(structuregenerator); + } + + @Override + public WorldGenFeatureConfiguration getFeatureConfiguration(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return biomebase.b(structuregenerator); } + // Taken from ChunkGeneratorAbstract + private final Map<StructureGenerator<? extends WorldGenFeatureConfiguration>, Long2ObjectMap<StructureStart>> structureStartCache = Maps.newHashMap(); + @Override - public boolean a(World world, String type, BlockPosition position) { - return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.b(position) : false; + public Long2ObjectMap<StructureStart> getStructureStartCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return (Long2ObjectMap) this.structureStartCache.computeIfAbsent(structuregenerator, (s) -> { + return Long2ObjectMaps.synchronize(new ExpiringMap(8192, 10000)); + }); } + // Taken from ChunkGeneratorAbstract + private final Map<StructureGenerator<? extends WorldGenFeatureConfiguration>, Long2ObjectMap<LongSet>> structureCache = Maps.newHashMap(); + @Override - public BlockPosition findNearestMapFeature(World world, String type, BlockPosition position, boolean flag) { - return "Stronghold".equals(type) && this.strongholdGen != null ? this.strongholdGen.getNearestGeneratedFeature(world, position, flag) : null; + public Long2ObjectMap<LongSet> getStructureCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return (Long2ObjectMap) this.structureCache.computeIfAbsent(structuregenerator, (s) -> { + return Long2ObjectMaps.synchronize(new ExpiringMap(8192, 10000)); + }); } @Override - public void recreateStructures(int i, int j) {} + public WorldChunkManager getWorldChunkManager() { + return chunkManager; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getSpawnHeight() { + return world.getSeaLevel() + 1; + } @Override - public void recreateStructures(Chunk chunk, int i, int j) { - strongholdGen.a(this.world, i, j, (ChunkSnapshot) null); + public int e() { + return world.getHeight(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java index d2e71b87..b0710cd8 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/InternalChunkGenerator.java @@ -1,8 +1,8 @@ package org.bukkit.craftbukkit.generator; -import net.minecraft.server.IChunkProvider; +import net.minecraft.server.GeneratorSettings; import org.bukkit.generator.ChunkGenerator; // Do not implement functions to this class, add to NormalChunkGenerator -public abstract class InternalChunkGenerator extends ChunkGenerator implements net.minecraft.server.ChunkGenerator { +public abstract class InternalChunkGenerator<C extends GeneratorSettings> extends ChunkGenerator implements net.minecraft.server.ChunkGenerator<C> { } diff --git a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java index be07fb8e..4356d2bf 100644 --- a/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java +++ b/src/main/java/org/bukkit/craftbukkit/generator/NormalChunkGenerator.java @@ -1,29 +1,30 @@ package org.bukkit.craftbukkit.generator; +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.LongSet; import java.util.ArrayList; import java.util.List; import java.util.Random; import net.minecraft.server.*; -import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.generator.BlockPopulator; -public class NormalChunkGenerator extends InternalChunkGenerator { - private final ChunkGenerator generator; +public class NormalChunkGenerator<C extends GeneratorSettings> extends InternalChunkGenerator<C> { + private final ChunkGenerator<?> generator; public NormalChunkGenerator(World world, long seed) { generator = world.worldProvider.getChunkGenerator(); } @Override - public byte[] generate(org.bukkit.World world, Random random, int x, int z) { + public ChunkData generateChunkData(org.bukkit.World world, Random random, int x, int z, BiomeGrid biome) { 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); + return true; // PAIL } @Override @@ -32,37 +33,82 @@ public class NormalChunkGenerator extends InternalChunkGenerator { } @Override - public Chunk getOrCreateChunk(int i, int i1) { - return generator.getOrCreateChunk(i, i1); + public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType enumCreatureType, BlockPosition blockPosition) { + return generator.getMobsFor(enumCreatureType, blockPosition); } @Override - public void recreateStructures(int i, int i1) { - generator.recreateStructures(i, i1); + public BlockPosition findNearestMapFeature(World world, String s, BlockPosition blockPosition, int i) { + return generator.findNearestMapFeature(world, s, blockPosition, i); } @Override - public boolean a(Chunk chunk, int i, int i1) { - return generator.a(chunk, i, i1); + public void createChunk(IChunkAccess ichunkaccess) { + generator.createChunk(ichunkaccess); } @Override - public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType enumCreatureType, BlockPosition blockPosition) { - return generator.getMobsFor(enumCreatureType, blockPosition); + public void addFeatures(RegionLimitedWorldAccess regionlimitedworldaccess, WorldGenStage.Features worldgenstage_features) { + generator.addFeatures(regionlimitedworldaccess, worldgenstage_features); + } + + @Override + public void addDecorations(RegionLimitedWorldAccess regionlimitedworldaccess) { + generator.addDecorations(regionlimitedworldaccess); + } + + @Override + public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) { + generator.addMobs(regionlimitedworldaccess); + } + + @Override + public C getSettings() { + return (C) generator.getSettings(); + } + + @Override + public int a(World world, boolean flag, boolean flag1) { + return generator.a(world, flag, flag1); + } + + @Override + public boolean canSpawnStructure(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return generator.canSpawnStructure(biomebase, structuregenerator); + } + + @Override + public WorldGenFeatureConfiguration getFeatureConfiguration(BiomeBase biomebase, StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return generator.getFeatureConfiguration(biomebase, structuregenerator); + } + + @Override + public Long2ObjectMap<StructureStart> getStructureStartCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return generator.getStructureStartCache(structuregenerator); + } + + @Override + public Long2ObjectMap<LongSet> getStructureCache(StructureGenerator<? extends WorldGenFeatureConfiguration> structuregenerator) { + return generator.getStructureCache(structuregenerator); + } + + @Override + public WorldChunkManager getWorldChunkManager() { + return generator.getWorldChunkManager(); } @Override - public BlockPosition findNearestMapFeature(World world, String s, BlockPosition blockPosition, boolean flag) { - return generator.findNearestMapFeature(world, s, blockPosition, flag); + public long getSeed() { + return generator.getSeed(); } @Override - public void recreateStructures(Chunk chunk, int i, int i1) { - generator.recreateStructures(chunk, i, i1); + public int getSpawnHeight() { + return generator.getSpawnHeight(); } @Override - public boolean a(World world, String string, BlockPosition bp) { - return generator.a(world, string, bp); + public int e() { + return generator.e(); // PAIL: Gen depth } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java index ef3b8045..b513f8d2 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftFurnaceRecipe.java @@ -1,26 +1,31 @@ package org.bukkit.craftbukkit.inventory; -import net.minecraft.server.RecipesFurnace; +import java.util.stream.Stream; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.RecipeItemStack; +import org.bukkit.NamespacedKey; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.inventory.FurnaceRecipe; import org.bukkit.inventory.ItemStack; public class CraftFurnaceRecipe extends FurnaceRecipe implements CraftRecipe { - public CraftFurnaceRecipe(ItemStack result, ItemStack source) { - super(result, source.getType(), source.getDurability()); + public CraftFurnaceRecipe(NamespacedKey key, ItemStack result, ItemStack source, float experience, int cookingTime) { + super(key, result, source.getType(), source.getDurability(), experience, cookingTime); } public static CraftFurnaceRecipe fromBukkitRecipe(FurnaceRecipe recipe) { if (recipe instanceof CraftFurnaceRecipe) { return (CraftFurnaceRecipe) recipe; } - return new CraftFurnaceRecipe(recipe.getResult(), recipe.getInput()); + return new CraftFurnaceRecipe(recipe.getKey(), recipe.getResult(), recipe.getInput(), recipe.getExperience(), recipe.getCookingTime()); } @Override public void addToCraftingManager() { ItemStack result = this.getResult(); - ItemStack input = this.getInput(); - RecipesFurnace.getInstance().registerRecipe(CraftItemStack.asNMSCopy(input), CraftItemStack.asNMSCopy(result), getExperience()); + RecipeItemStack input = new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(CraftItemStack.asNMSCopy(this.getInput())))); + + MinecraftServer.getServer().getCraftingManager().a(new net.minecraft.server.FurnaceRecipe(CraftNamespacedKey.toMinecraft(this.getKey()), "", input, CraftItemStack.asNMSCopy(result), getExperience(), getCookingTime())); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java index 4866d1ae..94afb704 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventory.java @@ -25,6 +25,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.Material; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftInventory implements Inventory { protected final IInventory inventory; @@ -42,7 +43,7 @@ public class CraftInventory implements Inventory { } public String getName() { - return getInventory().getName(); + return CraftChatMessage.fromComponent(getInventory().getDisplayName()); } public ItemStack getItem(int index) { @@ -96,20 +97,16 @@ public class CraftInventory implements Inventory { getInventory().setItem(index, CraftItemStack.asNMSCopy(item)); } - public boolean contains(int materialId) { + public boolean contains(Material material) { + Validate.notNull(material, "Material cannot be null"); for (ItemStack item : getStorageContents()) { - if (item != null && item.getTypeId() == materialId) { + if (item != null && item.getType() == material) { return true; } } return false; } - public boolean contains(Material material) { - Validate.notNull(material, "Material cannot be null"); - return contains(material.getId()); - } - public boolean contains(ItemStack item) { if (item == null) { return false; @@ -122,12 +119,13 @@ public class CraftInventory implements Inventory { return false; } - public boolean contains(int materialId, int amount) { + public boolean contains(Material material, int amount) { + Validate.notNull(material, "Material cannot be null"); if (amount <= 0) { return true; } for (ItemStack item : getStorageContents()) { - if (item != null && item.getTypeId() == materialId) { + if (item != null && item.getType()== material) { if ((amount -= item.getAmount()) <= 0) { return true; } @@ -136,11 +134,6 @@ public class CraftInventory implements Inventory { return false; } - public boolean contains(Material material, int amount) { - Validate.notNull(material, "Material cannot be null"); - return contains(material.getId(), amount); - } - public boolean contains(ItemStack item, int amount) { if (item == null) { return false; @@ -171,24 +164,20 @@ public class CraftInventory implements Inventory { return false; } - public HashMap<Integer, ItemStack> all(int materialId) { + public HashMap<Integer, ItemStack> all(Material material) { + Validate.notNull(material, "Material cannot be null"); HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>(); ItemStack[] inventory = getStorageContents(); for (int i = 0; i < inventory.length; i++) { ItemStack item = inventory[i]; - if (item != null && item.getTypeId() == materialId) { + if (item != null && item.getType()== material) { slots.put(i, item); } } return slots; } - public HashMap<Integer, ItemStack> all(Material material) { - Validate.notNull(material, "Material cannot be null"); - return all(material.getId()); - } - public HashMap<Integer, ItemStack> all(ItemStack item) { HashMap<Integer, ItemStack> slots = new HashMap<Integer, ItemStack>(); if (item != null) { @@ -202,22 +191,18 @@ public class CraftInventory implements Inventory { return slots; } - public int first(int materialId) { - ItemStack[] inventory = getStorageContents(); + public int first(Material material) { + Validate.notNull(material, "Material cannot be null"); + ItemStack[] inventory = getStorageContents(); for (int i = 0; i < inventory.length; i++) { ItemStack item = inventory[i]; - if (item != null && item.getTypeId() == materialId) { + if (item != null && item.getType()== material) { return i; } } return -1; } - public int first(Material material) { - Validate.notNull(material, "Material cannot be null"); - return first(material.getId()); - } - public int first(ItemStack item) { return first(item, true); } @@ -247,22 +232,18 @@ public class CraftInventory implements Inventory { return -1; } - public int firstPartial(int materialId) { + public int firstPartial(Material material) { + Validate.notNull(material, "Material cannot be null"); ItemStack[] inventory = getStorageContents(); for (int i = 0; i < inventory.length; i++) { ItemStack item = inventory[i]; - if (item != null && item.getTypeId() == materialId && item.getAmount() < item.getMaxStackSize()) { + if (item != null && item.getType()== material && item.getAmount() < item.getMaxStackSize()) { return i; } } return -1; } - public int firstPartial(Material material) { - Validate.notNull(material, "Material cannot be null"); - return firstPartial(material.getId()); - } - private int firstPartial(ItemStack item) { ItemStack[] inventory = getStorageContents(); ItemStack filteredItem = CraftItemStack.asCraftCopy(item); @@ -390,20 +371,16 @@ public class CraftInventory implements Inventory { return getInventory().getMaxStackSize(); } - public void remove(int materialId) { + public void remove(Material material) { + Validate.notNull(material, "Material cannot be null"); ItemStack[] items = getStorageContents(); for (int i = 0; i < items.length; i++) { - if (items[i] != null && items[i].getTypeId() == materialId) { + if (items[i] != null && items[i].getType()== material) { clear(i); } } } - public void remove(Material material) { - Validate.notNull(material, "Material cannot be null"); - remove(material.getId()); - } - public void remove(ItemStack item) { ItemStack[] items = getStorageContents(); for (int i = 0; i < items.length; i++) { @@ -439,7 +416,7 @@ public class CraftInventory implements Inventory { } public String getTitle() { - return inventory.getName(); + return getName(); } public InventoryType getType() { diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java index 0f0dd199..3a375e77 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCrafting.java @@ -5,7 +5,6 @@ import java.util.List; import net.minecraft.server.IRecipe; import net.minecraft.server.IInventory; -import net.minecraft.server.InventoryCrafting; import org.bukkit.inventory.CraftingInventory; import org.bukkit.inventory.ItemStack; @@ -14,7 +13,7 @@ import org.bukkit.inventory.Recipe; public class CraftInventoryCrafting extends CraftInventory implements CraftingInventory { private final IInventory resultInventory; - public CraftInventoryCrafting(InventoryCrafting inventory, IInventory resultInventory) { + public CraftInventoryCrafting(IInventory inventory, IInventory resultInventory) { super(inventory); this.resultInventory = resultInventory; } @@ -116,7 +115,7 @@ public class CraftInventoryCrafting extends CraftInventory implements CraftingIn } public Recipe getRecipe() { - IRecipe recipe = ((InventoryCrafting)getInventory()).currentRecipe; + IRecipe recipe = getInventory().getCurrentRecipe(); return recipe == null ? null : recipe.toBukkitRecipe(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java index a1a0ab7d..2212e09c 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryCustom.java @@ -17,6 +17,7 @@ import net.minecraft.server.EntityHuman; import net.minecraft.server.IInventory; import net.minecraft.server.ItemStack; import net.minecraft.server.NonNullList; +import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftInventoryCustom extends CraftInventory { public CraftInventoryCustom(InventoryHolder owner, InventoryType type) { @@ -39,7 +40,7 @@ public class CraftInventoryCustom extends CraftInventory { private final NonNullList<ItemStack> items; private int maxStack = MAX_STACK; private final List<HumanEntity> viewers; - private final String title; + private final IChatBaseComponent title; private InventoryType type; private final InventoryHolder owner; @@ -60,7 +61,7 @@ public class CraftInventoryCustom extends CraftInventory { public MinecraftInventory(InventoryHolder owner, int size, String title) { Validate.notNull(title, "Title cannot be null"); this.items = NonNullList.a(size, ItemStack.a); - this.title = title; + this.title = CraftChatMessage.fromStringOrNull(title); this.viewers = new ArrayList<HumanEntity>(); this.owner = owner; this.type = InventoryType.CHEST; @@ -182,7 +183,12 @@ public class CraftInventoryCustom extends CraftInventory { } @Override - public String getName() { + public IChatBaseComponent getDisplayName() { + return title; + } + + @Override + public IChatBaseComponent getCustomName() { return title; } @@ -193,7 +199,7 @@ public class CraftInventoryCustom extends CraftInventory { @Override public IChatBaseComponent getScoreboardDisplayName() { - return new ChatComponentText(title); + return title; } @Override @@ -202,7 +208,7 @@ public class CraftInventoryCustom extends CraftInventory { } @Override - public boolean x_() { + public boolean P_() { Iterator iterator = this.items.iterator(); ItemStack itemstack; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java index f028b339..799f8ea5 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryDoubleChest.java @@ -1,5 +1,6 @@ package org.bukkit.craftbukkit.inventory; +import net.minecraft.server.ChatMessage; import net.minecraft.server.ITileInventory; import org.bukkit.block.DoubleChest; import org.bukkit.inventory.DoubleChestInventory; @@ -14,7 +15,7 @@ public class CraftInventoryDoubleChest extends CraftInventory implements DoubleC private final CraftInventory right; public CraftInventoryDoubleChest(CraftInventory left, CraftInventory right) { - super(new InventoryLargeChest("Large chest", (ITileInventory) left.getInventory(), (ITileInventory) right.getInventory())); + super(new InventoryLargeChest(new ChatMessage("container.chestDouble"), (ITileInventory) left.getInventory(), (ITileInventory) right.getInventory())); this.left = left; this.right = right; } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java index 67c54899..6cbe0695 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftInventoryPlayer.java @@ -184,23 +184,6 @@ public class CraftInventoryPlayer extends CraftInventory implements org.bukkit.i setSlots(items, getInventory().items.size() + getInventory().armor.size(), getInventory().extraSlots.size()); } - public int clear(int id, int data) { - int count = 0; - ItemStack[] items = getContents(); - - for (int i = 0; i < items.length; i++) { - ItemStack item = items[i]; - if (item == null) continue; - if (id > -1 && item.getTypeId() != id) continue; - if (data > -1 && item.getData().getData() != data) continue; - - count += item.getAmount(); - setItem(i, null); - } - - return count; - } - @Override public HumanEntity getHolder() { return (HumanEntity) inventory.getOwner(); diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java index 49ebad22..e305d663 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java @@ -6,6 +6,7 @@ import org.apache.commons.lang.Validate; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.configuration.serialization.ConfigurationSerialization; +import org.bukkit.craftbukkit.util.CraftLegacy; import org.bukkit.inventory.ItemFactory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -47,6 +48,7 @@ public final class CraftItemFactory implements ItemFactory { } public boolean isApplicable(ItemMeta meta, Material type) { + type = CraftLegacy.fromLegacy(type); // This may be called from legacy item stacks, try to get the right material if (type == null || meta == null) { return false; } @@ -63,14 +65,27 @@ public final class CraftItemFactory implements ItemFactory { } private ItemMeta getItemMeta(Material material, CraftMetaItem meta) { + material = CraftLegacy.fromLegacy(material); // This may be called from legacy item stacks, try to get the right material switch (material) { case AIR: return null; case WRITTEN_BOOK: return meta instanceof CraftMetaBookSigned ? meta : new CraftMetaBookSigned(meta); - case BOOK_AND_QUILL: + case WRITABLE_BOOK: return meta != null && meta.getClass().equals(CraftMetaBook.class) ? meta : new CraftMetaBook(meta); - case SKULL_ITEM: + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case PISTON_HEAD: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: return meta instanceof CraftMetaSkull ? meta : new CraftMetaSkull(meta); case LEATHER_HELMET: case LEATHER_CHESTPLATE: @@ -82,17 +97,90 @@ public final class CraftItemFactory implements ItemFactory { case LINGERING_POTION: case TIPPED_ARROW: return meta instanceof CraftMetaPotion ? meta : new CraftMetaPotion(meta); - case MAP: + case FILLED_MAP: return meta instanceof CraftMetaMap ? meta : new CraftMetaMap(meta); - case FIREWORK: + case FIREWORK_ROCKET: return meta instanceof CraftMetaFirework ? meta : new CraftMetaFirework(meta); - case FIREWORK_CHARGE: + case FIREWORK_STAR: return meta instanceof CraftMetaCharge ? meta : new CraftMetaCharge(meta); case ENCHANTED_BOOK: return meta instanceof CraftMetaEnchantedBook ? meta : new CraftMetaEnchantedBook(meta); - case BANNER: + case BLACK_BANNER: + case BLACK_WALL_BANNER: + case BLUE_BANNER: + case BLUE_WALL_BANNER: + case BROWN_BANNER: + case BROWN_WALL_BANNER: + case CYAN_BANNER: + case CYAN_WALL_BANNER: + case GRAY_BANNER: + case GRAY_WALL_BANNER: + case GREEN_BANNER: + case GREEN_WALL_BANNER: + case LIGHT_BLUE_BANNER: + case LIGHT_BLUE_WALL_BANNER: + case LIGHT_GRAY_BANNER: + case LIGHT_GRAY_WALL_BANNER: + case LIME_BANNER: + case LIME_WALL_BANNER: + case MAGENTA_BANNER: + case MAGENTA_WALL_BANNER: + case ORANGE_BANNER: + case ORANGE_WALL_BANNER: + case PINK_BANNER: + case PINK_WALL_BANNER: + case PURPLE_BANNER: + case PURPLE_WALL_BANNER: + case RED_BANNER: + case RED_WALL_BANNER: + case WHITE_BANNER: + case WHITE_WALL_BANNER: + case YELLOW_BANNER: + case YELLOW_WALL_BANNER: return meta instanceof CraftMetaBanner ? meta : new CraftMetaBanner(meta); - case MONSTER_EGG: + case BAT_SPAWN_EGG: + case BLAZE_SPAWN_EGG: + case CAVE_SPIDER_SPAWN_EGG: + case CHICKEN_SPAWN_EGG: + case COW_SPAWN_EGG: + case CREEPER_SPAWN_EGG: + case DONKEY_SPAWN_EGG: + case ELDER_GUARDIAN_SPAWN_EGG: + case ENDERMAN_SPAWN_EGG: + case ENDERMITE_SPAWN_EGG: + case EVOKER_SPAWN_EGG: + case GHAST_SPAWN_EGG: + case GUARDIAN_SPAWN_EGG: + case HORSE_SPAWN_EGG: + case HUSK_SPAWN_EGG: + case LLAMA_SPAWN_EGG: + case MAGMA_CUBE_SPAWN_EGG: + case MOOSHROOM_SPAWN_EGG: + case MULE_SPAWN_EGG: + case OCELOT_SPAWN_EGG: + case PARROT_SPAWN_EGG: + case PIG_SPAWN_EGG: + case POLAR_BEAR_SPAWN_EGG: + case RABBIT_SPAWN_EGG: + case SHEEP_SPAWN_EGG: + case SHULKER_SPAWN_EGG: + case SILVERFISH_SPAWN_EGG: + case SKELETON_HORSE_SPAWN_EGG: + case SKELETON_SPAWN_EGG: + case SLIME_SPAWN_EGG: + case SPIDER_SPAWN_EGG: + case SQUID_SPAWN_EGG: + case STRAY_SPAWN_EGG: + case VEX_SPAWN_EGG: + case VILLAGER_SPAWN_EGG: + case VINDICATOR_SPAWN_EGG: + case WITCH_SPAWN_EGG: + case WITHER_SKELETON_SPAWN_EGG: + case WOLF_SPAWN_EGG: + case ZOMBIE_HORSE_SPAWN_EGG: + case ZOMBIE_PIGMAN_SPAWN_EGG: + case ZOMBIE_SPAWN_EGG: + case ZOMBIE_VILLAGER_SPAWN_EGG: return meta instanceof CraftMetaSpawnEgg ? meta : new CraftMetaSpawnEgg(meta); case KNOWLEDGE_BOOK: return meta instanceof CraftMetaKnowledgeBook ? meta : new CraftMetaKnowledgeBook(meta); @@ -103,19 +191,17 @@ public final class CraftItemFactory implements ItemFactory { case DISPENSER: case DROPPER: case SIGN: - case MOB_SPAWNER: + case SPAWNER: case NOTE_BLOCK: - case BREWING_STAND_ITEM: - case ENCHANTMENT_TABLE: - case COMMAND: - case COMMAND_REPEATING: - case COMMAND_CHAIN: + case BREWING_STAND: + case ENCHANTING_TABLE: + case COMMAND_BLOCK: + case REPEATING_COMMAND_BLOCK: + case CHAIN_COMMAND_BLOCK: case BEACON: case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: case HOPPER: - case REDSTONE_COMPARATOR: - case FLOWER_POT_ITEM: + case COMPARATOR: case SHIELD: case STRUCTURE_BLOCK: case WHITE_SHULKER_BOX: @@ -126,7 +212,7 @@ public final class CraftItemFactory implements ItemFactory { case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -136,6 +222,8 @@ public final class CraftItemFactory implements ItemFactory { case BLACK_SHULKER_BOX: case ENDER_CHEST: return new CraftMetaBlockState(meta, material); + case TROPICAL_FISH_BUCKET: + return meta instanceof CraftMetaTropicalFishBucket ? meta : new CraftMetaTropicalFishBucket(meta); default: return new CraftMetaItem(meta); } @@ -194,4 +282,9 @@ public final class CraftItemFactory implements ItemFactory { public Color getDefaultLeatherColor() { return DEFAULT_LEATHER_COLOR; } + + @Override + public Material updateMaterial(ItemMeta meta, Material material) throws IllegalArgumentException { + return ((CraftMetaItem) meta).updateMaterial(material); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java index fb1dc542..4c4f0455 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemStack.java @@ -18,9 +18,11 @@ import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.material.MaterialData; import com.google.common.collect.ImmutableMap; import org.bukkit.craftbukkit.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; @DelegateDeserialization(ItemStack.class) public final class CraftItemStack extends ItemStack { @@ -30,17 +32,17 @@ public final class CraftItemStack extends ItemStack { CraftItemStack stack = (CraftItemStack) original; return stack.handle == null ? net.minecraft.server.ItemStack.a : stack.handle.cloneItemStack(); } - if (original == null || original.getTypeId() <= 0) { + if (original == null || original.getType() == Material.AIR) { return net.minecraft.server.ItemStack.a; } - Item item = CraftMagicNumbers.getItem(original.getType()); + Item item = CraftMagicNumbers.getItem(original.getType(), original.getDurability()); if (item == null) { return net.minecraft.server.ItemStack.a; } - net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item, original.getAmount(), original.getDurability(), false); + net.minecraft.server.ItemStack stack = new net.minecraft.server.ItemStack(item, original.getAmount()); if (original.hasItemMeta()) { setItemMeta(stack, original.getItemMeta()); } else { @@ -63,7 +65,7 @@ public final class CraftItemStack extends ItemStack { if (original.isEmpty()) { return new ItemStack(Material.AIR); } - ItemStack stack = new ItemStack(CraftMagicNumbers.getMaterial(original.getItem()), original.getCount(), (short) original.getData()); + ItemStack stack = new ItemStack(CraftMagicNumbers.getMaterial(original.getItem()), original.getCount()); if (hasItemMeta(original)) { stack.setItemMeta(getItemMeta(original)); } @@ -100,7 +102,7 @@ public final class CraftItemStack extends ItemStack { } private CraftItemStack(ItemStack item) { - this(item.getTypeId(), item.getAmount(), item.getDurability(), item.hasItemMeta() ? item.getItemMeta() : null); + this(item.getType(), item.getAmount(), item.getDurability(), item.hasItemMeta() ? item.getItemMeta() : null); } private CraftItemStack(Material type, int amount, short durability, ItemMeta itemMeta) { @@ -110,26 +112,26 @@ public final class CraftItemStack extends ItemStack { setItemMeta(itemMeta); } - private CraftItemStack(int typeId, int amount, short durability, ItemMeta itemMeta) { - this(Material.getMaterial(typeId), amount, durability, itemMeta); - + @Override + public MaterialData getData() { + return handle != null ? CraftMagicNumbers.getMaterialData(handle.getItem()) : super.getData(); } @Override - public int getTypeId() { - return handle != null ? CraftMagicNumbers.getId(handle.getItem()) : 0; + public Material getType() { + return handle != null ? CraftMagicNumbers.getMaterial(handle.getItem()) : Material.AIR; } @Override - public void setTypeId(int type) { - if (getTypeId() == type) { + public void setType(Material type) { + if (getType() == type) { return; - } else if (type == 0) { + } else if (type == Material.AIR) { handle = null; } else if (CraftMagicNumbers.getItem(type) == null) { // :( handle = null; } else if (handle == null) { - handle = new net.minecraft.server.ItemStack(CraftMagicNumbers.getItem(type), 1, 0); + handle = new net.minecraft.server.ItemStack(CraftMagicNumbers.getItem(type), 1); } else { handle.setItem(CraftMagicNumbers.getItem(type)); if (hasItemMeta()) { @@ -161,14 +163,14 @@ public final class CraftItemStack extends ItemStack { public void setDurability(final short durability) { // Ignore damage if item is null if (handle != null) { - handle.setData(durability); + handle.setDamage(durability); } } @Override public short getDurability() { if (handle != null) { - return (short) handle.getData(); + return (short) handle.getDamage(); } else { return -1; } @@ -195,14 +197,14 @@ public final class CraftItemStack extends ItemStack { for (int i = 0; i < size; i++) { NBTTagCompound tag = (NBTTagCompound) list.get(i); - short id = tag.getShort(ENCHANTMENTS_ID.NBT); - if (id == ench.getId()) { + String id = tag.getString(ENCHANTMENTS_ID.NBT); + if (id.equals(ench.getKey().toString())) { tag.setShort(ENCHANTMENTS_LVL.NBT, (short) level); return; } } NBTTagCompound tag = new NBTTagCompound(); - tag.setShort(ENCHANTMENTS_ID.NBT, (short) ench.getId()); + tag.setString(ENCHANTMENTS_ID.NBT, ench.getKey().toString()); tag.setShort(ENCHANTMENTS_LVL.NBT, (short) level); list.add(tag); } @@ -247,8 +249,8 @@ public final class CraftItemStack extends ItemStack { for (int i = 0; i < size; i++) { NBTTagCompound enchantment = (NBTTagCompound) list.get(i); - int id = 0xffff & enchantment.getShort(ENCHANTMENTS_ID.NBT); - if (id == ench.getId()) { + String id = enchantment.getString(ENCHANTMENTS_ID.NBT); + if (id.equals(ench.getKey().toString())) { index = i; level = 0xffff & enchantment.getShort(ENCHANTMENTS_LVL.NBT); break; @@ -293,10 +295,10 @@ public final class CraftItemStack extends ItemStack { ImmutableMap.Builder<Enchantment, Integer> result = ImmutableMap.builder(); for (int i = 0; i < list.size(); i++) { - int id = 0xffff & ((NBTTagCompound) list.get(i)).getShort(ENCHANTMENTS_ID.NBT); + String id = ((NBTTagCompound) list.get(i)).getString(ENCHANTMENTS_ID.NBT); int level = 0xffff & ((NBTTagCompound) list.get(i)).getShort(ENCHANTMENTS_LVL.NBT); - result.put(Enchantment.getById(id), level); + result.put(Enchantment.getByKey(CraftNamespacedKey.fromString(id)), level); } return result.build(); @@ -327,9 +329,21 @@ public final class CraftItemStack extends ItemStack { switch (getType(item)) { case WRITTEN_BOOK: return new CraftMetaBookSigned(item.getTag()); - case BOOK_AND_QUILL: + case WRITABLE_BOOK: return new CraftMetaBook(item.getTag()); - case SKULL_ITEM: + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case PISTON_HEAD: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: return new CraftMetaSkull(item.getTag()); case LEATHER_HELMET: case LEATHER_CHESTPLATE: @@ -341,17 +355,90 @@ public final class CraftItemStack extends ItemStack { case LINGERING_POTION: case TIPPED_ARROW: return new CraftMetaPotion(item.getTag()); - case MAP: + case FILLED_MAP: return new CraftMetaMap(item.getTag()); - case FIREWORK: + case FIREWORK_ROCKET: return new CraftMetaFirework(item.getTag()); - case FIREWORK_CHARGE: + case FIREWORK_STAR: return new CraftMetaCharge(item.getTag()); case ENCHANTED_BOOK: return new CraftMetaEnchantedBook(item.getTag()); - case BANNER: + case BLACK_BANNER: + case BLACK_WALL_BANNER: + case BLUE_BANNER: + case BLUE_WALL_BANNER: + case BROWN_BANNER: + case BROWN_WALL_BANNER: + case CYAN_BANNER: + case CYAN_WALL_BANNER: + case GRAY_BANNER: + case GRAY_WALL_BANNER: + case GREEN_BANNER: + case GREEN_WALL_BANNER: + case LIGHT_BLUE_BANNER: + case LIGHT_BLUE_WALL_BANNER: + case LIGHT_GRAY_BANNER: + case LIGHT_GRAY_WALL_BANNER: + case LIME_BANNER: + case LIME_WALL_BANNER: + case MAGENTA_BANNER: + case MAGENTA_WALL_BANNER: + case ORANGE_BANNER: + case ORANGE_WALL_BANNER: + case PINK_BANNER: + case PINK_WALL_BANNER: + case PURPLE_BANNER: + case PURPLE_WALL_BANNER: + case RED_BANNER: + case RED_WALL_BANNER: + case WHITE_BANNER: + case WHITE_WALL_BANNER: + case YELLOW_BANNER: + case YELLOW_WALL_BANNER: return new CraftMetaBanner(item.getTag()); - case MONSTER_EGG: + case BAT_SPAWN_EGG: + case BLAZE_SPAWN_EGG: + case CAVE_SPIDER_SPAWN_EGG: + case CHICKEN_SPAWN_EGG: + case COW_SPAWN_EGG: + case CREEPER_SPAWN_EGG: + case DONKEY_SPAWN_EGG: + case ELDER_GUARDIAN_SPAWN_EGG: + case ENDERMAN_SPAWN_EGG: + case ENDERMITE_SPAWN_EGG: + case EVOKER_SPAWN_EGG: + case GHAST_SPAWN_EGG: + case GUARDIAN_SPAWN_EGG: + case HORSE_SPAWN_EGG: + case HUSK_SPAWN_EGG: + case LLAMA_SPAWN_EGG: + case MAGMA_CUBE_SPAWN_EGG: + case MOOSHROOM_SPAWN_EGG: + case MULE_SPAWN_EGG: + case OCELOT_SPAWN_EGG: + case PARROT_SPAWN_EGG: + case PIG_SPAWN_EGG: + case POLAR_BEAR_SPAWN_EGG: + case RABBIT_SPAWN_EGG: + case SHEEP_SPAWN_EGG: + case SHULKER_SPAWN_EGG: + case SILVERFISH_SPAWN_EGG: + case SKELETON_HORSE_SPAWN_EGG: + case SKELETON_SPAWN_EGG: + case SLIME_SPAWN_EGG: + case SPIDER_SPAWN_EGG: + case SQUID_SPAWN_EGG: + case STRAY_SPAWN_EGG: + case VEX_SPAWN_EGG: + case VILLAGER_SPAWN_EGG: + case VINDICATOR_SPAWN_EGG: + case WITCH_SPAWN_EGG: + case WITHER_SKELETON_SPAWN_EGG: + case WOLF_SPAWN_EGG: + case ZOMBIE_HORSE_SPAWN_EGG: + case ZOMBIE_PIGMAN_SPAWN_EGG: + case ZOMBIE_SPAWN_EGG: + case ZOMBIE_VILLAGER_SPAWN_EGG: return new CraftMetaSpawnEgg(item.getTag()); case KNOWLEDGE_BOOK: return new CraftMetaKnowledgeBook(item.getTag()); @@ -362,19 +449,17 @@ public final class CraftItemStack extends ItemStack { case DISPENSER: case DROPPER: case SIGN: - case MOB_SPAWNER: + case SPAWNER: case NOTE_BLOCK: - case BREWING_STAND_ITEM: - case ENCHANTMENT_TABLE: - case COMMAND: - case COMMAND_REPEATING: - case COMMAND_CHAIN: + case BREWING_STAND: + case ENCHANTING_TABLE: + case COMMAND_BLOCK: + case REPEATING_COMMAND_BLOCK: + case CHAIN_COMMAND_BLOCK: case BEACON: case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: case HOPPER: - case REDSTONE_COMPARATOR: - case FLOWER_POT_ITEM: + case COMPARATOR: case SHIELD: case STRUCTURE_BLOCK: case WHITE_SHULKER_BOX: @@ -385,7 +470,7 @@ public final class CraftItemStack extends ItemStack { case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -395,14 +480,15 @@ public final class CraftItemStack extends ItemStack { case BLACK_SHULKER_BOX: case ENDER_CHEST: return new CraftMetaBlockState(item.getTag(), CraftMagicNumbers.getMaterial(item.getItem())); + case TROPICAL_FISH_BUCKET: + return new CraftMetaTropicalFishBucket(item.getTag()); default: return new CraftMetaItem(item.getTag()); } } static Material getType(net.minecraft.server.ItemStack item) { - Material material = Material.getMaterial(item == null ? 0 : CraftMagicNumbers.getId(item.getItem())); - return material == null ? Material.AIR : material; + return item == null ? Material.AIR : CraftMagicNumbers.getMaterial(item.getItem()); } @Override @@ -425,6 +511,12 @@ public final class CraftItemStack extends ItemStack { itemMeta = CraftItemFactory.instance().asMetaFor(itemMeta, getType(item)); if (itemMeta == null) return true; + Item oldItem = item.getItem(); + Item newItem = CraftMagicNumbers.getItem(CraftItemFactory.instance().updateMaterial(itemMeta, CraftMagicNumbers.getMaterial(oldItem))); + if (oldItem != newItem) { + item.setItem(newItem); + } + NBTTagCompound tag = new NBTTagCompound(); item.setTag(tag); @@ -453,7 +545,7 @@ public final class CraftItemStack extends ItemStack { if (handle == null || that.handle == null) { return false; } - if (!(that.getTypeId() == getTypeId() && getDurability() == that.getDurability())) { + if (!(that.getType() == getType() && getDurability() == that.getDurability())) { return false; } return hasItemMeta() ? that.hasItemMeta() && handle.getTag().equals(that.handle.getTag()) : !that.hasItemMeta(); diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java index 527e7ba9..bc898d69 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMerchantCustom.java @@ -62,12 +62,12 @@ public class CraftMerchantCustom extends CraftMerchant { } @Override - public World u_() { + public World getWorld() { return null; } @Override - public BlockPosition v_() { + public BlockPosition getPosition() { return null; } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java index 7b356789..4d1cc88a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBanner.java @@ -52,7 +52,7 @@ public class CraftMetaBanner extends CraftMetaItem implements BannerMeta { if (entityTag.hasKey(PATTERNS.NBT)) { NBTTagList patterns = entityTag.getList(PATTERNS.NBT, CraftMagicNumbers.NBT.TAG_COMPOUND); for (int i = 0; i < Math.min(patterns.size(), 20); i++) { - NBTTagCompound p = patterns.get(i); + NBTTagCompound p = patterns.getCompound(i); this.patterns.add(new Pattern(DyeColor.getByDyeData((byte) p.getInt(COLOR.NBT)), PatternType.getByIdentifier(p.getString(PATTERN.NBT)))); } } @@ -198,7 +198,43 @@ public class CraftMetaBanner extends CraftMetaItem implements BannerMeta { @Override boolean applicableTo(Material type) { - return type == Material.BANNER; + switch (type) { + case BLACK_BANNER: + case BLACK_WALL_BANNER: + case BLUE_BANNER: + case BLUE_WALL_BANNER: + case BROWN_BANNER: + case BROWN_WALL_BANNER: + case CYAN_BANNER: + case CYAN_WALL_BANNER: + case GRAY_BANNER: + case GRAY_WALL_BANNER: + case GREEN_BANNER: + case GREEN_WALL_BANNER: + case LIGHT_BLUE_BANNER: + case LIGHT_BLUE_WALL_BANNER: + case LIGHT_GRAY_BANNER: + case LIGHT_GRAY_WALL_BANNER: + case LIME_BANNER: + case LIME_WALL_BANNER: + case MAGENTA_BANNER: + case MAGENTA_WALL_BANNER: + case ORANGE_BANNER: + case ORANGE_WALL_BANNER: + case PINK_BANNER: + case PINK_WALL_BANNER: + case PURPLE_BANNER: + case PURPLE_WALL_BANNER: + case RED_BANNER: + case RED_WALL_BANNER: + case WHITE_BANNER: + case WHITE_WALL_BANNER: + case YELLOW_BANNER: + case YELLOW_WALL_BANNER: + return true; + default: + return false; + } } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java index 3bd9ee47..2e44d133 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBlockState.java @@ -18,12 +18,11 @@ import net.minecraft.server.TileEntityDropper; import net.minecraft.server.TileEntityEnchantTable; import net.minecraft.server.TileEntityEndGateway; import net.minecraft.server.TileEntityEnderChest; -import net.minecraft.server.TileEntityFlowerPot; import net.minecraft.server.TileEntityFurnace; import net.minecraft.server.TileEntityHopper; +import net.minecraft.server.TileEntityJukeBox; import net.minecraft.server.TileEntityLightDetector; import net.minecraft.server.TileEntityMobSpawner; -import net.minecraft.server.TileEntityNote; import net.minecraft.server.TileEntityShulkerBox; import net.minecraft.server.TileEntitySign; import net.minecraft.server.TileEntitySkull; @@ -46,11 +45,9 @@ import org.bukkit.craftbukkit.block.CraftDropper; import org.bukkit.craftbukkit.block.CraftEnchantingTable; import org.bukkit.craftbukkit.block.CraftEndGateway; import org.bukkit.craftbukkit.block.CraftEnderChest; -import org.bukkit.craftbukkit.block.CraftFlowerPot; import org.bukkit.craftbukkit.block.CraftFurnace; import org.bukkit.craftbukkit.block.CraftHopper; import org.bukkit.craftbukkit.block.CraftJukebox; -import org.bukkit.craftbukkit.block.CraftNoteBlock; import org.bukkit.craftbukkit.block.CraftShulkerBox; import org.bukkit.craftbukkit.block.CraftSign; import org.bukkit.craftbukkit.block.CraftSkull; @@ -176,19 +173,17 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case DISPENSER: case DROPPER: case SIGN: - case MOB_SPAWNER: + case SPAWNER: case NOTE_BLOCK: - case BREWING_STAND_ITEM: - case ENCHANTMENT_TABLE: - case COMMAND: - case COMMAND_REPEATING: - case COMMAND_CHAIN: + case BREWING_STAND: + case ENCHANTING_TABLE: + case COMMAND_BLOCK: + case REPEATING_COMMAND_BLOCK: + case CHAIN_COMMAND_BLOCK: case BEACON: case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: case HOPPER: - case REDSTONE_COMPARATOR: - case FLOWER_POT_ITEM: + case COMPARATOR: case SHIELD: case STRUCTURE_BLOCK: case WHITE_SHULKER_BOX: @@ -199,7 +194,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -217,7 +212,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta public CraftMetaBlockState clone() { CraftMetaBlockState meta = (CraftMetaBlockState) super.clone(); if (blockEntityTag != null) { - meta.blockEntityTag = blockEntityTag.g(); + meta.blockEntityTag = blockEntityTag.clone(); } return meta; } @@ -242,7 +237,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -254,11 +249,10 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta break; } } - TileEntity te = (blockEntityTag == null) ? null : TileEntity.create(null, blockEntityTag); + TileEntity te = (blockEntityTag == null) ? null : TileEntity.create(blockEntityTag); switch (material) { case SIGN: - case SIGN_POST: case WALL_SIGN: if (te == null) { te = new TileEntitySign(); @@ -270,7 +264,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta te = new TileEntityChest(); } return new CraftChest(material, (TileEntityChest) te); - case BURNING_FURNACE: case FURNACE: if (te == null) { te = new TileEntityFurnace(); @@ -296,34 +289,41 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta te = new TileEntityHopper(); } return new CraftHopper(material, (TileEntityHopper) te); - case MOB_SPAWNER: + case SPAWNER: if (te == null) { te = new TileEntityMobSpawner(); } return new CraftCreatureSpawner(material, (TileEntityMobSpawner) te); - case NOTE_BLOCK: - if (te == null) { - te = new TileEntityNote(); - } - return new CraftNoteBlock(material, (TileEntityNote) te); case JUKEBOX: if (te == null) { - te = new BlockJukeBox.TileEntityRecordPlayer(); + te = new TileEntityJukeBox(); } - return new CraftJukebox(material, (BlockJukeBox.TileEntityRecordPlayer) te); - case BREWING_STAND_ITEM: + return new CraftJukebox(material, (TileEntityJukeBox) te); + case BREWING_STAND: if (te == null) { te = new TileEntityBrewingStand(); } return new CraftBrewingStand(material, (TileEntityBrewingStand) te); - case SKULL: + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case PISTON_HEAD: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: if (te == null) { te = new TileEntitySkull(); } return new CraftSkull(material, (TileEntitySkull) te); - case COMMAND: - case COMMAND_REPEATING: - case COMMAND_CHAIN: + case COMMAND_BLOCK: + case REPEATING_COMMAND_BLOCK: + case CHAIN_COMMAND_BLOCK: if (te == null) { te = new TileEntityCommand(); } @@ -334,18 +334,42 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta } return new CraftBeacon(material, (TileEntityBeacon) te); case SHIELD: - case BANNER: - case WALL_BANNER: - case STANDING_BANNER: + case BLACK_BANNER: + case BLACK_WALL_BANNER: + case BLUE_BANNER: + case BLUE_WALL_BANNER: + case BROWN_BANNER: + case BROWN_WALL_BANNER: + case CYAN_BANNER: + case CYAN_WALL_BANNER: + case GRAY_BANNER: + case GRAY_WALL_BANNER: + case GREEN_BANNER: + case GREEN_WALL_BANNER: + case LIGHT_BLUE_BANNER: + case LIGHT_BLUE_WALL_BANNER: + case LIGHT_GRAY_BANNER: + case LIGHT_GRAY_WALL_BANNER: + case LIME_BANNER: + case LIME_WALL_BANNER: + case MAGENTA_BANNER: + case MAGENTA_WALL_BANNER: + case ORANGE_BANNER: + case ORANGE_WALL_BANNER: + case PINK_BANNER: + case PINK_WALL_BANNER: + case PURPLE_BANNER: + case PURPLE_WALL_BANNER: + case RED_BANNER: + case RED_WALL_BANNER: + case WHITE_BANNER: + case WHITE_WALL_BANNER: + case YELLOW_BANNER: + case YELLOW_WALL_BANNER: if (te == null) { te = new TileEntityBanner(); } return new CraftBanner(material, (TileEntityBanner) te); - case FLOWER_POT_ITEM: - if (te == null) { - te = new TileEntityFlowerPot(); - } - return new CraftFlowerPot(material, (TileEntityFlowerPot) te); case STRUCTURE_BLOCK: if (te == null) { te = new TileEntityStructure(); @@ -359,7 +383,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -371,7 +395,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta te = new TileEntityShulkerBox(); } return new CraftShulkerBox(material, (TileEntityShulkerBox) te); - case ENCHANTMENT_TABLE: + case ENCHANTING_TABLE: if (te == null) { te = new TileEntityEnchantTable(); } @@ -382,17 +406,15 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta } return new CraftEnderChest(material, (TileEntityEnderChest) te); case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: if (te == null){ te = new TileEntityLightDetector(); } return new CraftDaylightDetector(material, (TileEntityLightDetector) te); - case REDSTONE_COMPARATOR: + case COMPARATOR: if (te == null){ te = new TileEntityComparator(); } return new CraftComparator(material, (TileEntityComparator) te); - case PISTON_BASE: default: throw new IllegalStateException("Missing blockState for " + material); } @@ -405,7 +427,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta boolean valid; switch (material) { case SIGN: - case SIGN_POST: case WALL_SIGN: valid = blockState instanceof CraftSign; break; @@ -413,7 +434,6 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case TRAPPED_CHEST: valid = blockState instanceof CraftChest; break; - case BURNING_FURNACE: case FURNACE: valid = blockState instanceof CraftFurnace; break; @@ -429,38 +449,73 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case HOPPER: valid = blockState instanceof CraftHopper; break; - case MOB_SPAWNER: + case SPAWNER: valid = blockState instanceof CraftCreatureSpawner; break; - case NOTE_BLOCK: - valid = blockState instanceof CraftNoteBlock; - break; case JUKEBOX: valid = blockState instanceof CraftJukebox; break; - case BREWING_STAND_ITEM: + case BREWING_STAND: valid = blockState instanceof CraftBrewingStand; break; - case SKULL: + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case PISTON_HEAD: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: valid = blockState instanceof CraftSkull; break; - case COMMAND: - case COMMAND_REPEATING: - case COMMAND_CHAIN: + case COMMAND_BLOCK: + case REPEATING_COMMAND_BLOCK: + case CHAIN_COMMAND_BLOCK: valid = blockState instanceof CraftCommandBlock; break; case BEACON: valid = blockState instanceof CraftBeacon; break; case SHIELD: - case BANNER: - case WALL_BANNER: - case STANDING_BANNER: + case BLACK_BANNER: + case BLACK_WALL_BANNER: + case BLUE_BANNER: + case BLUE_WALL_BANNER: + case BROWN_BANNER: + case BROWN_WALL_BANNER: + case CYAN_BANNER: + case CYAN_WALL_BANNER: + case GRAY_BANNER: + case GRAY_WALL_BANNER: + case GREEN_BANNER: + case GREEN_WALL_BANNER: + case LIGHT_BLUE_BANNER: + case LIGHT_BLUE_WALL_BANNER: + case LIGHT_GRAY_BANNER: + case LIGHT_GRAY_WALL_BANNER: + case LIME_BANNER: + case LIME_WALL_BANNER: + case MAGENTA_BANNER: + case MAGENTA_WALL_BANNER: + case ORANGE_BANNER: + case ORANGE_WALL_BANNER: + case PINK_BANNER: + case PINK_WALL_BANNER: + case PURPLE_BANNER: + case PURPLE_WALL_BANNER: + case RED_BANNER: + case RED_WALL_BANNER: + case WHITE_BANNER: + case WHITE_WALL_BANNER: + case YELLOW_BANNER: + case YELLOW_WALL_BANNER: valid = blockState instanceof CraftBanner; break; - case FLOWER_POT_ITEM: - valid = blockState instanceof CraftFlowerPot; - break; case STRUCTURE_BLOCK: valid = blockState instanceof CraftStructureBlock; break; @@ -472,7 +527,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case LIME_SHULKER_BOX: case PINK_SHULKER_BOX: case GRAY_SHULKER_BOX: - case SILVER_SHULKER_BOX: + case LIGHT_GRAY_SHULKER_BOX: case CYAN_SHULKER_BOX: case PURPLE_SHULKER_BOX: case BLUE_SHULKER_BOX: @@ -482,17 +537,16 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta case BLACK_SHULKER_BOX: valid = blockState instanceof CraftShulkerBox; break; - case ENCHANTMENT_TABLE: + case ENCHANTING_TABLE: valid = blockState instanceof CraftEnchantingTable; break; case ENDER_CHEST: valid = blockState instanceof CraftEnderChest; break; case DAYLIGHT_DETECTOR: - case DAYLIGHT_DETECTOR_INVERTED: valid = blockState instanceof CraftDaylightDetector; break; - case REDSTONE_COMPARATOR: + case COMPARATOR: valid = blockState instanceof CraftComparator; break; default: diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java index 9c9ef295..c8654c68 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBook.java @@ -158,7 +158,7 @@ public class CraftMetaBook extends CraftMetaItem implements BookMeta { boolean applicableTo(Material type) { switch (type) { case WRITTEN_BOOK: - case BOOK_AND_QUILL: + case WRITABLE_BOOK: return true; default: return false; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java index bffbe901..5050b609 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaBookSigned.java @@ -96,7 +96,7 @@ class CraftMetaBookSigned extends CraftMetaBook implements BookMeta { boolean applicableTo(Material type) { switch (type) { case WRITTEN_BOOK: - case BOOK_AND_QUILL: + case WRITABLE_BOOK: return true; default: return false; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java index 6c6fde73..267581ec 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaCharge.java @@ -67,7 +67,7 @@ class CraftMetaCharge extends CraftMetaItem implements FireworkEffectMeta { @Override boolean applicableTo(Material type) { switch (type) { - case FIREWORK_CHARGE: + case FIREWORK_STAR: return true; default: return false; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java index 682c2287..b82e2fdf 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaFirework.java @@ -253,7 +253,7 @@ class CraftMetaFirework extends CraftMetaItem implements FireworkMeta { @Override boolean applicableTo(Material type) { switch(type) { - case FIREWORK: + case FIREWORK_ROCKET: return true; default: return false; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java index 8d82c4dc..dfd6e66b 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaItem.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; +import net.minecraft.server.IChatBaseComponent; import net.minecraft.server.NBTBase; import net.minecraft.server.NBTTagCompound; import net.minecraft.server.NBTTagList; @@ -25,9 +26,12 @@ import org.bukkit.configuration.serialization.DelegateDeserialization; import org.bukkit.configuration.serialization.SerializableAs; import org.bukkit.craftbukkit.Overridden; import org.bukkit.craftbukkit.inventory.CraftMetaItem.ItemMetaKey.Specific; +import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.Repairable; @@ -70,7 +74,7 @@ import org.apache.commons.codec.binary.Base64; * <li> SerializableMeta.Deserializers deserializer() */ @DelegateDeserialization(CraftMetaItem.SerializableMeta.class) -class CraftMetaItem implements ItemMeta, Repairable { +class CraftMetaItem implements ItemMeta, Damageable, Repairable { static class ItemMetaKey { @@ -120,6 +124,7 @@ class CraftMetaItem implements ItemMeta, Repairable { .put(CraftMetaFirework.class, "FIREWORK") .put(CraftMetaCharge.class, "FIREWORK_EFFECT") .put(CraftMetaKnowledgeBook.class, "KNOWLEDGE_BOOK") + .put(CraftMetaTropicalFishBucket.class, "TROPICAL_FISH_BUCKET") .put(CraftMetaItem.class, "UNSPECIFIC") .build(); @@ -192,7 +197,7 @@ class CraftMetaItem implements ItemMeta, Repairable { @Specific(Specific.To.NBT) static final ItemMetaKey DISPLAY = new ItemMetaKey("display"); static final ItemMetaKey LORE = new ItemMetaKey("Lore", "lore"); - static final ItemMetaKey ENCHANTMENTS = new ItemMetaKey("ench", "enchants"); + static final ItemMetaKey ENCHANTMENTS = new ItemMetaKey("Enchantments", "enchants"); @Specific(Specific.To.NBT) static final ItemMetaKey ENCHANTMENTS_ID = new ItemMetaKey("id"); @Specific(Specific.To.NBT) @@ -216,14 +221,17 @@ class CraftMetaItem implements ItemMeta, Repairable { static final ItemMetaKey HIDEFLAGS = new ItemMetaKey("HideFlags", "ItemFlags"); @Specific(Specific.To.NBT) static final ItemMetaKey UNBREAKABLE = new ItemMetaKey("Unbreakable"); + @Specific(Specific.To.NBT) + static final ItemMetaKey DAMAGE = new ItemMetaKey("Damage"); - private String displayName; - private String locName; + private IChatBaseComponent displayName; + private IChatBaseComponent locName; private List<String> lore; private Map<Enchantment, Integer> enchantments; private int repairCost; private int hideFlag; private boolean unbreakable; + private int damage; private static final Set<String> HANDLED_TAGS = Sets.newHashSet(); @@ -249,6 +257,7 @@ class CraftMetaItem implements ItemMeta, Repairable { this.repairCost = meta.repairCost; this.hideFlag = meta.hideFlag; this.unbreakable = meta.unbreakable; + this.damage = meta.damage; this.unhandledTags.putAll(meta.unhandledTags); this.internalTag = meta.internalTag; @@ -262,11 +271,11 @@ class CraftMetaItem implements ItemMeta, Repairable { NBTTagCompound display = tag.getCompound(DISPLAY.NBT); if (display.hasKey(NAME.NBT)) { - displayName = display.getString(NAME.NBT); + displayName = IChatBaseComponent.ChatSerializer.a(display.getString(NAME.NBT)); } if (display.hasKey(LOCNAME.NBT)) { - locName = display.getString(LOCNAME.NBT); + locName = IChatBaseComponent.ChatSerializer.a(display.getString(LOCNAME.NBT)); } if (display.hasKey(LORE.NBT)) { @@ -292,6 +301,9 @@ class CraftMetaItem implements ItemMeta, Repairable { if (tag.hasKey(UNBREAKABLE.NBT)) { unbreakable = tag.getBoolean(UNBREAKABLE.NBT); } + if (tag.hasKey(DAMAGE.NBT)) { + damage = tag.getInt(DAMAGE.NBT); + } if (tag.get(ATTRIBUTES.NBT) instanceof NBTTagList) { NBTTagList save = null; @@ -339,7 +351,7 @@ class CraftMetaItem implements ItemMeta, Repairable { unhandledTags.put(ATTRIBUTES.NBT, save); } - Set<String> keys = tag.c(); + Set<String> keys = tag.getKeys(); for (String key : keys) { if (!getHandledTags().contains(key)) { unhandledTags.put(key, tag.get(key)); @@ -356,10 +368,10 @@ class CraftMetaItem implements ItemMeta, Repairable { Map<Enchantment, Integer> enchantments = new HashMap<Enchantment, Integer>(ench.size()); for (int i = 0; i < ench.size(); i++) { - int id = 0xffff & ((NBTTagCompound) ench.get(i)).getShort(ENCHANTMENTS_ID.NBT); + String id = ((NBTTagCompound) ench.get(i)).getString(ENCHANTMENTS_ID.NBT); int level = 0xffff & ((NBTTagCompound) ench.get(i)).getShort(ENCHANTMENTS_LVL.NBT); - Enchantment enchant = Enchantment.getById(id); + Enchantment enchant = Enchantment.getByKey(CraftNamespacedKey.fromString(id)); if (enchant != null) { enchantments.put(enchant, level); } @@ -402,13 +414,18 @@ class CraftMetaItem implements ItemMeta, Repairable { setUnbreakable(unbreakable); } + Integer damage = SerializableMeta.getObject(Integer.class, map, DAMAGE.BUKKIT, true); + if (damage != null) { + setDamage(damage); + } + String internal = SerializableMeta.getString(map, "internal", true); if (internal != null) { ByteArrayInputStream buf = new ByteArrayInputStream(Base64.decodeBase64(internal)); try { internalTag = NBTCompressedStreamTools.a(buf); deserializeInternal(internalTag); - Set<String> keys = internalTag.c(); + Set<String> keys = internalTag.getKeys(); for (String key : keys) { if (!getHandledTags().contains(key)) { unhandledTags.put(key, internalTag.get(key)); @@ -449,10 +466,10 @@ class CraftMetaItem implements ItemMeta, Repairable { @Overridden void applyToItem(NBTTagCompound itemTag) { if (hasDisplayName()) { - setDisplayTag(itemTag, NAME.NBT, new NBTTagString(displayName)); + setDisplayTag(itemTag, NAME.NBT, new NBTTagString(CraftChatMessage.toJSON(displayName))); } if (hasLocalizedName()){ - setDisplayTag(itemTag, LOCNAME.NBT, new NBTTagString(locName)); + setDisplayTag(itemTag, LOCNAME.NBT, new NBTTagString(CraftChatMessage.toJSON(locName))); } if (hasLore()) { @@ -473,6 +490,10 @@ class CraftMetaItem implements ItemMeta, Repairable { itemTag.setBoolean(UNBREAKABLE.NBT, unbreakable); } + if (hasDamage()) { + itemTag.setInt(DAMAGE.NBT, damage); + } + for (Map.Entry<String, NBTBase> e : unhandledTags.entrySet()) { itemTag.set(e.getKey(), e.getValue()); } @@ -501,7 +522,7 @@ class CraftMetaItem implements ItemMeta, Repairable { for (Map.Entry<Enchantment, Integer> entry : enchantments.entrySet()) { NBTTagCompound subtag = new NBTTagCompound(); - subtag.setShort(ENCHANTMENTS_ID.NBT, (short) entry.getKey().getId()); + subtag.setString(ENCHANTMENTS_ID.NBT, entry.getKey().getKey().toString()); subtag.setShort(ENCHANTMENTS_LVL.NBT, entry.getValue().shortValue()); list.add(subtag); @@ -527,34 +548,34 @@ class CraftMetaItem implements ItemMeta, Repairable { @Overridden boolean isEmpty() { - return !(hasDisplayName() || hasLocalizedName() || hasEnchants() || hasLore() || hasRepairCost() || !unhandledTags.isEmpty() || hideFlag != 0 || isUnbreakable()); + return !(hasDisplayName() || hasLocalizedName() || hasEnchants() || hasLore() || hasRepairCost() || !unhandledTags.isEmpty() || hideFlag != 0 || isUnbreakable() || hasDamage()); } public String getDisplayName() { - return displayName; + return CraftChatMessage.fromComponent(displayName); } public final void setDisplayName(String name) { - this.displayName = name; + this.displayName = CraftChatMessage.fromStringOrNull(name); } public boolean hasDisplayName() { - return !Strings.isNullOrEmpty(displayName); + return displayName != null; } @Override public String getLocalizedName() { - return locName; + return CraftChatMessage.fromComponent(locName); } @Override public void setLocalizedName(String name) { - this.locName = name; + this.locName = CraftChatMessage.fromStringOrNull(name); } @Override public boolean hasLocalizedName() { - return !Strings.isNullOrEmpty(locName); + return locName != null; } public boolean hasLore() { @@ -682,6 +703,21 @@ class CraftMetaItem implements ItemMeta, Repairable { } @Override + public boolean hasDamage() { + return damage > 0; + } + + @Override + public int getDamage() { + return damage; + } + + @Override + public void setDamage(int damage) { + this.damage = damage; + } + + @Override public final boolean equals(Object object) { if (object == null) { return false; @@ -709,7 +745,8 @@ class CraftMetaItem implements ItemMeta, Repairable { && (this.hasRepairCost() ? that.hasRepairCost() && this.repairCost == that.repairCost : !that.hasRepairCost()) && (this.unhandledTags.equals(that.unhandledTags)) && (this.hideFlag == that.hideFlag) - && (this.isUnbreakable() == that.isUnbreakable()); + && (this.isUnbreakable() == that.isUnbreakable()) + && (this.hasDamage() ? that.hasDamage() && this.damage == that.damage : !that.hasDamage()); } /** @@ -738,6 +775,7 @@ class CraftMetaItem implements ItemMeta, Repairable { hash = 61 * hash + unhandledTags.hashCode(); hash = 61 * hash + hideFlag; hash = 61 * hash + (isUnbreakable() ? 1231 : 1237); + hash = 61 * hash + (hasDamage() ? this.damage : 0); return hash; } @@ -754,6 +792,7 @@ class CraftMetaItem implements ItemMeta, Repairable { } clone.hideFlag = this.hideFlag; clone.unbreakable = this.unbreakable; + clone.damage = this.damage; return clone; } catch (CloneNotSupportedException e) { throw new Error(e); @@ -770,10 +809,10 @@ class CraftMetaItem implements ItemMeta, Repairable { @Overridden ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) { if (hasDisplayName()) { - builder.put(NAME.BUKKIT, displayName); + builder.put(NAME.BUKKIT, CraftChatMessage.fromComponent(displayName)); } if (hasLocalizedName()) { - builder.put(LOCNAME.BUKKIT, locName); + builder.put(LOCNAME.BUKKIT, CraftChatMessage.fromComponent(locName)); } if (hasLore()) { @@ -798,6 +837,10 @@ class CraftMetaItem implements ItemMeta, Repairable { builder.put(UNBREAKABLE.BUKKIT, unbreakable); } + if (hasDamage()) { + builder.put(DAMAGE.BUKKIT, damage); + } + final Map<String, NBTBase> internalTags = new HashMap<String, NBTBase>(unhandledTags); serializeInternal(internalTags); if (!internalTags.isEmpty()) { @@ -820,6 +863,10 @@ class CraftMetaItem implements ItemMeta, Repairable { void serializeInternal(final Map<String, NBTBase> unhandledTags) { } + Material updateMaterial(Material material) { + return material; + } + static void serializeEnchantments(Map<Enchantment, Integer> enchantments, ImmutableMap.Builder<String, Object> builder, ItemMetaKey key) { if (enchantments == null || enchantments.isEmpty()) { return; @@ -885,6 +932,7 @@ class CraftMetaItem implements ItemMeta, Repairable { ENCHANTMENTS.NBT, HIDEFLAGS.NBT, UNBREAKABLE.NBT, + DAMAGE.NBT, CraftMetaMap.MAP_SCALING.NBT, CraftMetaPotion.POTION_EFFECTS.NBT, CraftMetaPotion.DEFAULT_POTION.NBT, @@ -901,7 +949,8 @@ class CraftMetaItem implements ItemMeta, Repairable { CraftMetaEnchantedBook.STORED_ENCHANTMENTS.NBT, CraftMetaCharge.EXPLOSION.NBT, CraftMetaBlockState.BLOCK_ENTITY_TAG.NBT, - CraftMetaKnowledgeBook.BOOK_RECIPES.NBT + CraftMetaKnowledgeBook.BOOK_RECIPES.NBT, + CraftMetaTropicalFishBucket.VARIANT.NBT )); } return HANDLED_TAGS; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java index de695e4e..d35c5b03 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaMap.java @@ -99,7 +99,7 @@ class CraftMetaMap extends CraftMetaItem implements MapMeta { @Override boolean applicableTo(Material type) { switch (type) { - case MAP: + case FILLED_MAP: return true; default: return false; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java index 4fec1676..6a58ab56 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaPotion.java @@ -69,7 +69,7 @@ class CraftMetaPotion extends CraftMetaItem implements PotionMeta { customEffects = new ArrayList<PotionEffect>(length); for (int i = 0; i < length; i++) { - NBTTagCompound effect = list.get(i); + NBTTagCompound effect = list.getCompound(i); PotionEffectType type = PotionEffectType.getById(effect.getByte(ID.NBT)); int amp = effect.getByte(AMPLIFIER.NBT); int duration = effect.getInt(DURATION.NBT); diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java index 8c5d3eff..e3951103 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSkull.java @@ -96,8 +96,20 @@ class CraftMetaSkull extends CraftMetaItem implements SkullMeta { @Override boolean applicableTo(Material type) { - switch(type) { - case SKULL_ITEM: + switch (type) { + case CREEPER_HEAD: + case CREEPER_WALL_HEAD: + case DRAGON_HEAD: + case DRAGON_WALL_HEAD: + case PISTON_HEAD: + case PLAYER_HEAD: + case PLAYER_WALL_HEAD: + case SKELETON_SKULL: + case SKELETON_WALL_SKULL: + case WITHER_SKELETON_SKULL: + case WITHER_SKELETON_WALL_SKULL: + case ZOMBIE_HEAD: + case ZOMBIE_WALL_HEAD: return true; default: return false; diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java index 70616a2f..892cc10a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaSpawnEgg.java @@ -1,17 +1,21 @@ package org.bukkit.craftbukkit.inventory; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap.Builder; +import com.mojang.datafixers.Dynamic; import java.util.Map; import net.minecraft.server.DataConverterTypes; +import net.minecraft.server.DynamicOpsNBT; import net.minecraft.server.MinecraftKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.NBTBase; import net.minecraft.server.NBTTagCompound; import org.bukkit.Material; import org.bukkit.configuration.serialization.DelegateDeserialization; +import org.bukkit.craftbukkit.util.CraftLegacy; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; import org.bukkit.entity.EntityType; import org.bukkit.inventory.meta.SpawnEggMeta; +import org.bukkit.material.MaterialData; @DelegateDeserialization(CraftMetaItem.SerializableMeta.class) public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { @@ -32,6 +36,8 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { CraftMetaSpawnEgg egg = (CraftMetaSpawnEgg) meta; this.spawnedType = egg.spawnedType; + + updateMaterial(null); // Trigger type population } CraftMetaSpawnEgg(NBTTagCompound tag) { @@ -39,10 +45,6 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { if (tag.hasKey(ENTITY_TAG.NBT)) { entityTag = tag.getCompound(ENTITY_TAG.NBT); - - if (entityTag.hasKey(ENTITY_ID.NBT)) { - this.spawnedType = EntityType.fromName(new MinecraftKey(entityTag.getString(ENTITY_ID.NBT)).getKey()); - } } } @@ -50,7 +52,9 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { super(map); String entityType = SerializableMeta.getString(map, ENTITY_ID.BUKKIT, true); - setSpawnedType(EntityType.fromName(entityType)); + if (entityType != null) { + this.spawnedType = EntityType.fromName(entityType); + } } @Override @@ -59,7 +63,7 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { if (tag.hasKey(ENTITY_TAG.NBT)) { entityTag = tag.getCompound(ENTITY_TAG.NBT); - MinecraftServer.getServer().dataConverterManager.a(DataConverterTypes.ENTITY, entityTag); // PAIL: convert + MinecraftServer.getServer().dataConverterManager.update(DataConverterTypes.ENTITY, new Dynamic(DynamicOpsNBT.a, entityTag), -1, CraftMagicNumbers.DATA_VERSION); if (entityTag.hasKey(ENTITY_ID.NBT)) { this.spawnedType = EntityType.fromName(new MinecraftKey(entityTag.getString(ENTITY_ID.NBT)).getKey()); @@ -82,10 +86,6 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { entityTag = new NBTTagCompound(); } - if (hasSpawnedType()) { - entityTag.setString(ENTITY_ID.NBT, new MinecraftKey(spawnedType.getName()).toString()); - } - if (entityTag != null) { tag.set(ENTITY_TAG.NBT, entityTag); } @@ -94,7 +94,49 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { @Override boolean applicableTo(Material type) { switch (type) { - case MONSTER_EGG: + case BAT_SPAWN_EGG: + case BLAZE_SPAWN_EGG: + case CAVE_SPIDER_SPAWN_EGG: + case CHICKEN_SPAWN_EGG: + case COW_SPAWN_EGG: + case CREEPER_SPAWN_EGG: + case DONKEY_SPAWN_EGG: + case ELDER_GUARDIAN_SPAWN_EGG: + case ENDERMAN_SPAWN_EGG: + case ENDERMITE_SPAWN_EGG: + case EVOKER_SPAWN_EGG: + case GHAST_SPAWN_EGG: + case GUARDIAN_SPAWN_EGG: + case HORSE_SPAWN_EGG: + case HUSK_SPAWN_EGG: + case LLAMA_SPAWN_EGG: + case MAGMA_CUBE_SPAWN_EGG: + case MOOSHROOM_SPAWN_EGG: + case MULE_SPAWN_EGG: + case OCELOT_SPAWN_EGG: + case PARROT_SPAWN_EGG: + case PIG_SPAWN_EGG: + case POLAR_BEAR_SPAWN_EGG: + case RABBIT_SPAWN_EGG: + case SHEEP_SPAWN_EGG: + case SHULKER_SPAWN_EGG: + case SILVERFISH_SPAWN_EGG: + case SKELETON_HORSE_SPAWN_EGG: + case SKELETON_SPAWN_EGG: + case SLIME_SPAWN_EGG: + case SPIDER_SPAWN_EGG: + case SQUID_SPAWN_EGG: + case STRAY_SPAWN_EGG: + case VEX_SPAWN_EGG: + case VILLAGER_SPAWN_EGG: + case VINDICATOR_SPAWN_EGG: + case WITCH_SPAWN_EGG: + case WITHER_SKELETON_SPAWN_EGG: + case WOLF_SPAWN_EGG: + case ZOMBIE_HORSE_SPAWN_EGG: + case ZOMBIE_PIGMAN_SPAWN_EGG: + case ZOMBIE_SPAWN_EGG: + case ZOMBIE_VILLAGER_SPAWN_EGG: return true; default: return false; @@ -116,14 +158,12 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { @Override public EntityType getSpawnedType() { - return spawnedType; + throw new UnsupportedOperationException("Must check item type to get spawned type"); } @Override public void setSpawnedType(EntityType type) { - Preconditions.checkArgument(type == null || type.getName() != null, "Spawn egg type must have name (%s)", type); - - this.spawnedType = type; + throw new UnsupportedOperationException("Must change item type to set spawned type"); } @Override @@ -164,10 +204,6 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { Builder<String, Object> serialize(Builder<String, Object> builder) { super.serialize(builder); - if (hasSpawnedType()) { - builder.put(ENTITY_ID.BUKKIT, spawnedType.getName()); - } - return builder; } @@ -177,9 +213,23 @@ public class CraftMetaSpawnEgg extends CraftMetaItem implements SpawnEggMeta { clone.spawnedType = spawnedType; if (entityTag != null) { - clone.entityTag = entityTag.g(); + clone.entityTag = entityTag.clone(); } return clone; } + + @Override + final Material updateMaterial(Material material) { + if (spawnedType == null) { + spawnedType = EntityType.fromId(getDamage()); + setDamage(0); + } + + if (spawnedType != null) { + return CraftLegacy.fromLegacy(new MaterialData(Material.LEGACY_MONSTER_EGG, (byte) spawnedType.getTypeId())); + } + + return super.updateMaterial(material); + } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java new file mode 100644 index 00000000..f27df320 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftMetaTropicalFishBucket.java @@ -0,0 +1,168 @@ +package org.bukkit.craftbukkit.inventory; + +import java.util.Map; + +import net.minecraft.server.NBTTagCompound; +import org.bukkit.Material; +import org.bukkit.configuration.serialization.DelegateDeserialization; +import org.bukkit.craftbukkit.inventory.CraftMetaItem.SerializableMeta; + +import com.google.common.collect.ImmutableMap; +import org.bukkit.DyeColor; +import org.bukkit.craftbukkit.entity.CraftTropicalFish; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.entity.TropicalFish; +import org.bukkit.inventory.meta.TropicalFishBucketMeta; + +@DelegateDeserialization(SerializableMeta.class) +class CraftMetaTropicalFishBucket extends CraftMetaItem implements TropicalFishBucketMeta { + static final ItemMetaKey VARIANT = new ItemMetaKey("BucketVariantTag", "fish-variant"); + + private Integer variant; + + CraftMetaTropicalFishBucket(CraftMetaItem meta) { + super(meta); + + if (!(meta instanceof CraftMetaTropicalFishBucket)) { + return; + } + + CraftMetaTropicalFishBucket bucket = (CraftMetaTropicalFishBucket) meta; + this.variant = bucket.variant; + } + + CraftMetaTropicalFishBucket(NBTTagCompound tag) { + super(tag); + + if (tag.hasKeyOfType(VARIANT.NBT, CraftMagicNumbers.NBT.TAG_INT)) { + this.variant = tag.getInt(VARIANT.NBT); + } + } + + CraftMetaTropicalFishBucket(Map<String, Object> map) { + super(map); + + Integer variant = SerializableMeta.getObject(Integer.class, map, VARIANT.BUKKIT, true); + if (variant != null) { + this.variant = variant; + } + } + + @Override + void applyToItem(NBTTagCompound tag) { + super.applyToItem(tag); + + if (hasVariant()) { + tag.setInt(VARIANT.NBT, variant); + } + } + + @Override + boolean applicableTo(Material type) { + switch (type) { + case TROPICAL_FISH_BUCKET: + return true; + default: + return false; + } + } + + @Override + boolean isEmpty() { + return super.isEmpty() && isBucketEmpty(); + } + + boolean isBucketEmpty() { + return !(hasVariant()); + } + + @Override + public DyeColor getPatternColor() { + return CraftTropicalFish.getPatternColor(variant); + } + + @Override + public void setPatternColor(DyeColor color) { + if (variant == null) { + variant = 0; + } + variant = CraftTropicalFish.getData(color, getPatternColor(), getPattern()); + } + + @Override + public DyeColor getBodyColor() { + return CraftTropicalFish.getBodyColor(variant); + } + + @Override + public void setBodyColor(DyeColor color) { + if (variant == null) { + variant = 0; + } + variant = CraftTropicalFish.getData(getPatternColor(), color, getPattern()); + } + + @Override + public TropicalFish.Pattern getPattern() { + return CraftTropicalFish.getPattern(variant); + } + + @Override + public void setPattern(TropicalFish.Pattern pattern) { + if (variant == null) { + variant = 0; + } + variant = CraftTropicalFish.getData(getPatternColor(), getBodyColor(), pattern); + } + + @Override + public boolean hasVariant() { + return variant != null; + } + + @Override + boolean equalsCommon(CraftMetaItem meta) { + if (!super.equalsCommon(meta)) { + return false; + } + if (meta instanceof CraftMetaTropicalFishBucket) { + CraftMetaTropicalFishBucket that = (CraftMetaTropicalFishBucket) meta; + + return (hasVariant() ? that.hasVariant() && this.variant.equals(that.variant) : !that.hasVariant()); + } + return true; + } + + @Override + boolean notUncommon(CraftMetaItem meta) { + return super.notUncommon(meta) && (meta instanceof CraftMetaTropicalFishBucket || isBucketEmpty()); + } + + @Override + int applyHash() { + final int original; + int hash = original = super.applyHash(); + + if (hasVariant()) { + hash = 61 * hash + variant; + } + + return original != hash ? CraftMetaTropicalFishBucket.class.hashCode() ^ hash : hash; + } + + + public CraftMetaTropicalFishBucket clone() { + return (CraftMetaTropicalFishBucket) super.clone(); + } + + @Override + ImmutableMap.Builder<String, Object> serialize(ImmutableMap.Builder<String, Object> builder) { + super.serialize(builder); + + if (hasVariant()) { + builder.put(VARIANT.BUKKIT, variant); + } + + return builder; + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java index 44df9301..efd0e76a 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapedRecipe.java @@ -1,8 +1,9 @@ package org.bukkit.craftbukkit.inventory; import java.util.Map; +import java.util.stream.Stream; -import net.minecraft.server.CraftingManager; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.NonNullList; import net.minecraft.server.RecipeItemStack; import net.minecraft.server.ShapedRecipes; @@ -21,7 +22,7 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe { } public CraftShapedRecipe(ItemStack result, ShapedRecipes recipe) { - this(CraftNamespacedKey.fromMinecraft(recipe.key), result); + this(CraftNamespacedKey.fromMinecraft(recipe.getKey()), result); this.recipe = recipe; } @@ -51,10 +52,10 @@ public class CraftShapedRecipe extends ShapedRecipe implements CraftRecipe { for (int i = 0; i < shape.length; i++) { String row = shape[i]; for (int j = 0; j < row.length(); j++) { - data.set(i * width + j, RecipeItemStack.a(new net.minecraft.server.ItemStack[]{CraftItemStack.asNMSCopy(ingred.get(row.charAt(j)))})); + data.set(i * width + j, new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(CraftItemStack.asNMSCopy(ingred.get(row.charAt(j))))))); } } - CraftingManager.a(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapedRecipes("", width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult()))); + MinecraftServer.getServer().getCraftingManager().a(new ShapedRecipes(CraftNamespacedKey.toMinecraft(this.getKey()), "", width, shape.length, data, CraftItemStack.asNMSCopy(this.getResult()))); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java index 211898c5..dbbcb679 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftShapelessRecipe.java @@ -1,8 +1,9 @@ package org.bukkit.craftbukkit.inventory; import java.util.List; +import java.util.stream.Stream; -import net.minecraft.server.CraftingManager; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.NonNullList; import net.minecraft.server.RecipeItemStack; import net.minecraft.server.ShapelessRecipes; @@ -21,7 +22,7 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe } public CraftShapelessRecipe(ItemStack result, ShapelessRecipes recipe) { - this(CraftNamespacedKey.fromMinecraft(recipe.key), result); + this(CraftNamespacedKey.fromMinecraft(recipe.getKey()), result); this.recipe = recipe; } @@ -40,9 +41,9 @@ public class CraftShapelessRecipe extends ShapelessRecipe implements CraftRecipe List<ItemStack> ingred = this.getIngredientList(); NonNullList<RecipeItemStack> data = NonNullList.a(ingred.size(), RecipeItemStack.a); for (int i = 0; i < ingred.size(); i++) { - data.set(i, RecipeItemStack.a(new net.minecraft.server.ItemStack[]{CraftItemStack.asNMSCopy(ingred.get(i))})); + data.set(i, new RecipeItemStack(Stream.of(new RecipeItemStack.StackProvider(CraftItemStack.asNMSCopy(ingred.get(i)))))); } - CraftingManager.a(CraftNamespacedKey.toMinecraft(this.getKey()), new ShapelessRecipes("", CraftItemStack.asNMSCopy(this.getResult()), data)); + MinecraftServer.getServer().getCraftingManager().a(new ShapelessRecipes(CraftNamespacedKey.toMinecraft(this.getKey()), "", CraftItemStack.asNMSCopy(this.getResult()), data)); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java b/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java index 6cbcc9d3..9c5ec924 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/InventoryWrapper.java @@ -160,18 +160,23 @@ public class InventoryWrapper implements IInventory { } @Override - public String getName() { - return inventory.getName(); + public IChatBaseComponent getDisplayName() { + return CraftChatMessage.fromStringOrNull(inventory.getName()); + } + + @Override + public IChatBaseComponent getCustomName() { + return getDisplayName(); } @Override public boolean hasCustomName() { - return getName() != null; + return inventory.getName() != null; } @Override public IChatBaseComponent getScoreboardDisplayName() { - return CraftChatMessage.fromString(getName())[0]; + return getDisplayName(); } @Override @@ -180,7 +185,7 @@ public class InventoryWrapper implements IInventory { } @Override - public boolean x_() { + public boolean P_() { return Iterables.any(inventory, Predicates.notNull()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java index f03f8baa..165225e7 100644 --- a/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java +++ b/src/main/java/org/bukkit/craftbukkit/inventory/RecipeIterator.java @@ -4,50 +4,25 @@ import java.util.Iterator; import org.bukkit.inventory.Recipe; -import net.minecraft.server.CraftingManager; import net.minecraft.server.IRecipe; -import net.minecraft.server.RecipesFurnace; +import net.minecraft.server.MinecraftServer; public class RecipeIterator implements Iterator<Recipe> { private final Iterator<IRecipe> recipes; - private final Iterator<net.minecraft.server.ItemStack> smeltingCustom; - private final Iterator<net.minecraft.server.ItemStack> smeltingVanilla; - private Iterator<?> removeFrom = null; public RecipeIterator() { - this.recipes = CraftingManager.recipes.iterator(); - this.smeltingCustom = RecipesFurnace.getInstance().customRecipes.keySet().iterator(); - this.smeltingVanilla = RecipesFurnace.getInstance().recipes.keySet().iterator(); + this.recipes = MinecraftServer.getServer().getCraftingManager().recipes.values().iterator(); } public boolean hasNext() { - return recipes.hasNext() || smeltingCustom.hasNext() || smeltingVanilla.hasNext(); + return recipes.hasNext(); } public Recipe next() { - if (recipes.hasNext()) { - removeFrom = recipes; - return recipes.next().toBukkitRecipe(); - } else { - net.minecraft.server.ItemStack item; - if (smeltingCustom.hasNext()) { - removeFrom = smeltingCustom; - item = smeltingCustom.next(); - } else { - removeFrom = smeltingVanilla; - item = smeltingVanilla.next(); - } - - CraftItemStack stack = CraftItemStack.asCraftMirror(RecipesFurnace.getInstance().getResult(item)); - - return new CraftFurnaceRecipe(stack, CraftItemStack.asCraftMirror(item)); - } + return recipes.next().toBukkitRecipe(); } public void remove() { - if (removeFrom == null) { - throw new IllegalStateException(); - } - removeFrom.remove(); + recipes.remove(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java index a55915a4..0a3eb3b5 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapRenderer.java @@ -42,7 +42,7 @@ public class CraftMapRenderer extends MapRenderer { } MapIcon decoration = (MapIcon) worldMap.decorations.get(key); - cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRotation() & 15), decoration.getType()); + cursors.addCursor(decoration.getX(), decoration.getY(), (byte) (decoration.getRotation() & 15), decoration.b().a()); } } diff --git a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java index b951bfda..4d5eb2c1 100644 --- a/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java +++ b/src/main/java/org/bukkit/craftbukkit/map/CraftMapView.java @@ -29,7 +29,7 @@ public final class CraftMapView implements MapView { } public short getId() { - String text = worldMap.id; + String text = worldMap.getId(); if (text.startsWith("map_")) { try { return Short.parseShort(text.substring("map_".length())); diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java index b06fddf7..09f44ed6 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionEffectType.java @@ -79,6 +79,10 @@ public class CraftPotionEffectType extends PotionEffectType { return "LUCK"; case 27: return "UNLUCK"; + case 28: + return "SLOW_FALLING"; + case 29: + return "CONDUIT_POWER"; default: return "UNKNOWN_EFFECT_TYPE_" + getId(); } diff --git a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java index 8483cd85..2392b457 100644 --- a/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java +++ b/src/main/java/org/bukkit/craftbukkit/potion/CraftPotionUtil.java @@ -34,6 +34,8 @@ public class CraftPotionUtil { .put(PotionType.STRENGTH, "strength") .put(PotionType.WEAKNESS, "weakness") .put(PotionType.LUCK, "luck") + .put(PotionType.TURTLE_MASTER, "turtle_master") + .put(PotionType.SLOW_FALLING, "slow_falling") .build(); private static final BiMap<PotionType, String> upgradeable = ImmutableBiMap.<PotionType, String>builder() .put(PotionType.JUMP, "strong_leaping") @@ -43,6 +45,8 @@ public class CraftPotionUtil { .put(PotionType.POISON, "strong_poison") .put(PotionType.REGEN, "strong_regeneration") .put(PotionType.STRENGTH, "strong_strength") + .put(PotionType.SLOWNESS, "strong_slowness") + .put(PotionType.TURTLE_MASTER, "strong_turtle_master") .build(); private static final BiMap<PotionType, String> extendable = ImmutableBiMap.<PotionType, String>builder() .put(PotionType.NIGHT_VISION, "long_night_vision") @@ -56,6 +60,8 @@ public class CraftPotionUtil { .put(PotionType.REGEN, "long_regeneration") .put(PotionType.STRENGTH, "long_strength") .put(PotionType.WEAKNESS, "long_weakness") + .put(PotionType.TURTLE_MASTER, "long_turtle_master") + .put(PotionType.SLOW_FALLING, "long_slow_falling") .build(); public static String fromBukkit(PotionData data) { diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java index 239ceca0..822600fe 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftObjective.java @@ -2,6 +2,7 @@ package org.bukkit.craftbukkit.scoreboard; import net.minecraft.server.Scoreboard; import net.minecraft.server.ScoreboardObjective; +import net.minecraft.server.ScoreboardServer; import org.apache.commons.lang.Validate; import org.bukkit.OfflinePlayer; @@ -40,7 +41,8 @@ final class CraftObjective extends CraftScoreboardComponent implements Objective Validate.isTrue(displayName.length() <= 32, "Display name '" + displayName + "' is longer than the limit of 32 characters"); CraftScoreboard scoreboard = checkState(); - objective.setDisplayName(displayName); + objective.displayName = displayName; + ((ScoreboardServer) scoreboard.board).handleObjectiveChanged(objective); } public String getCriteria() throws IllegalStateException { diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java index 00b30f8c..573b9cd1 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboard.java @@ -24,14 +24,22 @@ public final class CraftScoreboard implements org.bukkit.scoreboard.Scoreboard { this.board = board; } + @Override public CraftObjective registerNewObjective(String name, String criteria) throws IllegalArgumentException { + return registerNewObjective(name, criteria, name); + } + + @Override + public CraftObjective registerNewObjective(String name, String criteria, String displayName) throws IllegalArgumentException { Validate.notNull(name, "Objective name cannot be null"); Validate.notNull(criteria, "Criteria cannot be null"); + Validate.notNull(displayName, "Display name cannot be null"); Validate.isTrue(name.length() <= 16, "The name '" + name + "' is longer than the limit of 16 characters"); + Validate.isTrue(displayName.length() <= 32, "The display name '" + displayName + "' is longer than the limit of 32 characters"); Validate.isTrue(board.getObjective(name) == null, "An objective of name '" + name + "' already exists"); CraftCriteria craftCriteria = CraftCriteria.getFromBukkit(criteria); - ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria); + ScoreboardObjective objective = board.registerObjective(name, craftCriteria.criteria, displayName); return new CraftObjective(this, objective); } diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java index 69fcb108..cac87d30 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftScoreboardManager.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Consumer; import net.minecraft.server.EntityPlayer; import net.minecraft.server.IScoreboardCriteria; @@ -99,13 +100,10 @@ public final class CraftScoreboardManager implements ScoreboardManager { } // CraftBukkit method - public Collection<ScoreboardScore> getScoreboardScores(IScoreboardCriteria criteria, String name, Collection<ScoreboardScore> collection) { + public void getScoreboardScores(IScoreboardCriteria criteria, String name, Consumer<ScoreboardScore> consumer) { for (CraftScoreboard scoreboard : scoreboards) { Scoreboard board = scoreboard.board; - for (ScoreboardObjective objective : (Iterable<ScoreboardObjective>) board.getObjectivesForCriteria(criteria)) { - collection.add(board.getPlayerScoreForObjective(name, objective)); - } + board.getObjectivesForCriteria(criteria, name, (score) -> consumer.accept(score)); } - return collection; } } diff --git a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java index 18616fc8..17865e65 100644 --- a/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java +++ b/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java @@ -160,7 +160,7 @@ final class CraftTeam extends CraftScoreboardComponent implements Team { Validate.notNull(entry, "Entry cannot be null"); CraftScoreboard scoreboard = checkState(); - scoreboard.board.addPlayerToTeam(entry, team.getName()); + scoreboard.board.addPlayerToTeam(entry, team); } public boolean removePlayer(OfflinePlayer player) throws IllegalStateException, IllegalArgumentException { diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java new file mode 100644 index 00000000..4b3ac51a --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftBlockTag.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.tag; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; +import net.minecraft.server.Block; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; + +public class CraftBlockTag implements Tag<Material> { + + private final net.minecraft.server.Tag<Block> handle; + + public CraftBlockTag(net.minecraft.server.Tag<Block> handle) { + this.handle = handle; + } + + @Override + public boolean isTagged(Material item) { + return handle.isTagged(CraftMagicNumbers.getBlock(item)); + } + + @Override + public Set<Material> getValues() { + return Collections.unmodifiableSet(handle.a().stream().map((block) -> CraftMagicNumbers.getMaterial(block)).collect(Collectors.toSet())); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java b/src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java new file mode 100644 index 00000000..b6b90e3e --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/tag/CraftItemTag.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.tag; + +import java.util.Collections; +import java.util.Set; +import java.util.stream.Collectors; +import net.minecraft.server.Item; +import org.bukkit.Material; +import org.bukkit.Tag; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; + +public class CraftItemTag implements Tag<Material> { + + private final net.minecraft.server.Tag<Item> handle; + + public CraftItemTag(net.minecraft.server.Tag<Item> handle) { + this.handle = handle; + } + + @Override + public boolean isTagged(Material item) { + return handle.isTagged(CraftMagicNumbers.getItem(item)); + } + + @Override + public Set<Material> getValues() { + return Collections.unmodifiableSet(handle.a().stream().map((item) -> CraftMagicNumbers.getMaterial(item)).collect(Collectors.toSet())); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java index 2dbedd2d..3db85a3b 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java +++ b/src/main/java/org/bukkit/craftbukkit/util/BlockStateListPopulator.java @@ -3,50 +3,35 @@ package org.bukkit.craftbukkit.util; import java.util.ArrayList; import java.util.List; -import net.minecraft.server.Block; import net.minecraft.server.BlockPosition; import net.minecraft.server.IBlockData; +import net.minecraft.server.World; -import org.bukkit.World; import org.bukkit.block.BlockState; +import org.bukkit.craftbukkit.block.CraftBlockState; public class BlockStateListPopulator { private final World world; - private final List<BlockState> list; + private final List<CraftBlockState> list; public BlockStateListPopulator(World world) { - this(world, new ArrayList<BlockState>()); + this(world, new ArrayList<CraftBlockState>()); } - public BlockStateListPopulator(World world, List<BlockState> list) { + public BlockStateListPopulator(World world, List<CraftBlockState> list) { this.world = world; this.list = list; } - public void setTypeAndData(int x, int y, int z, Block block, int data, int light) { - BlockState state = world.getBlockAt(x, y, z).getState(); - state.setTypeId(Block.getId(block)); - state.setRawData((byte) data); + public void setTypeUpdate(BlockPosition position, IBlockData data) { + CraftBlockState state = CraftBlockState.getBlockState(world, position); + state.setData(data); list.add(state); } - public void setTypeId(int x, int y, int z, int type) { - BlockState state = world.getBlockAt(x, y, z).getState(); - state.setTypeId(type); - list.add(state); - } - - 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) { - BlockState state = world.getBlockAt(x, y, z).getState(); - state.setTypeId(Block.getId(block)); + public void setTypeAndData(BlockPosition position, IBlockData data, int flag) { + CraftBlockState state = CraftBlockState.getBlockState(world, position, flag); + state.setData(data); list.add(state); } @@ -56,7 +41,7 @@ public class BlockStateListPopulator { } } - public List<BlockState> getList() { + public List<CraftBlockState> getList() { return list; } diff --git a/src/main/java/org/bukkit/craftbukkit/util/Commodore.java b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java new file mode 100644 index 00000000..aefba149 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/util/Commodore.java @@ -0,0 +1,268 @@ +package org.bukkit.craftbukkit.util; + +import com.google.common.io.ByteStreams; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.zip.ZipEntry; +import joptsimple.OptionParser; +import joptsimple.OptionSet; +import joptsimple.OptionSpec; +import org.bukkit.Material; +import org.bukkit.plugin.AuthorNagException; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; + +/** + * This file is imported from Commodore. + * + * @author md_5 + */ +public class Commodore +{ + + private static final Set<String> EVIL = new HashSet<>( Arrays.asList( + "org/bukkit/World (III)I getBlockTypeIdAt", + "org/bukkit/World (Lorg/bukkit/Location;)I getBlockTypeIdAt", + "org/bukkit/block/Block ()I getTypeId", + "org/bukkit/block/Block (I)Z setTypeId", + "org/bukkit/block/Block (IZ)Z setTypeId", + "org/bukkit/block/Block (IBZ)Z setTypeIdAndData", + "org/bukkit/inventory/ItemStack ()I getTypeId", + "org/bukkit/inventory/ItemStack (I)V setTypeId" + ) ); + + public static void main(String[] args) + { + OptionParser parser = new OptionParser(); + OptionSpec<File> inputFlag = parser.acceptsAll( Arrays.asList( "i", "input" ) ).withRequiredArg().ofType( File.class ).required(); + OptionSpec<File> outputFlag = parser.acceptsAll( Arrays.asList( "o", "output" ) ).withRequiredArg().ofType( File.class ).required(); + + OptionSet options = parser.parse( args ); + + File input = options.valueOf( inputFlag ); + File output = options.valueOf( outputFlag ); + + if ( input.isDirectory() ) + { + if ( !output.isDirectory() ) + { + System.err.println( "If input directory specified, output directory required too" ); + return; + } + + for ( File in : input.listFiles() ) + { + if ( in.getName().endsWith( ".jar" ) ) + { + convert( in, new File( output, in.getName() ) ); + } + } + } else + { + convert( input, output ); + } + } + + private static void convert(File in, File out) + { + System.out.println( "Attempting to convert " + in + " to " + out ); + + try + { + try ( JarFile inJar = new JarFile( in, false ) ) + { + JarEntry entry = inJar.getJarEntry( ".commodore" ); + if ( entry != null ) + { + return; + } + + try ( JarOutputStream outJar = new JarOutputStream( new FileOutputStream( out ) ) ) + { + for ( Enumeration<JarEntry> entries = inJar.entries(); entries.hasMoreElements(); ) + { + entry = entries.nextElement(); + + try ( InputStream is = inJar.getInputStream( entry ) ) + { + byte[] b = ByteStreams.toByteArray( is ); + + if ( entry.getName().endsWith( ".class" ) ) + { + b = convert( b, false ); + entry = new JarEntry( entry.getName() ); + } + + outJar.putNextEntry( entry ); + outJar.write( b ); + } + } + + outJar.putNextEntry( new ZipEntry( ".commodore" ) ); + } + } + } catch ( Exception ex ) + { + System.err.println( "Fatal error trying to convert " + in ); + ex.printStackTrace(); + } + } + + public static byte[] convert(byte[] b, final boolean modern) + { + ClassReader cr = new ClassReader( b ); + ClassWriter cw = new ClassWriter( cr, 0 ); + + cr.accept( new ClassVisitor( Opcodes.ASM6, cw ) + { + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) + { + return new MethodVisitor( api, super.visitMethod( access, name, desc, signature, exceptions ) ) + { + + @Override + public void visitFieldInsn(int opcode, String owner, String name, String desc) + { + if ( modern ) + { + super.visitFieldInsn( opcode, owner, name, desc ); + return; + } + + if ( owner.equals( "org/bukkit/Material" ) ) + { + try + { + Material.valueOf( "LEGACY_" + name ); + } catch ( IllegalArgumentException ex ) + { + throw new AuthorNagException( "No legacy enum constant for " + name + ". Did you forget to define api-version: 1.13 in your plugin.yml?" ); + } + + super.visitFieldInsn( opcode, owner, "LEGACY_" + name, desc ); + return; + } + + if ( owner.equals( "org/bukkit/Art" ) ) + { + switch ( name ) + { + case "BURNINGSKULL": + super.visitFieldInsn( opcode, owner, "BURNING_SKULL", desc ); + return; + case "DONKEYKONG": + super.visitFieldInsn( opcode, owner, "DONKEY_KONG", desc ); + return; + } + } + + if ( owner.equals( "org/bukkit/Particle" ) ) + { + switch ( name ) + { + case "BLOCK_CRACK": + case "BLOCK_DUST": + case "FALLING_DUST": + super.visitFieldInsn( opcode, owner, "LEGACY_" + name, desc ); + return; + } + } + + super.visitFieldInsn( opcode, owner, name, desc ); + } + + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) + { + if ( modern ) + { + if ( owner.equals( "org/bukkit/Material" ) ) + { + switch ( name ) + { + case "values": + super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftLegacy", "modern_" + name, desc, itf ); + return; + } + } + + super.visitMethodInsn( opcode, owner, name, desc, itf ); + return; + } + + if ( owner.equals( "org/bukkit/ChunkSnapshot" ) && name.equals( "getBlockData" ) && desc.equals( "(III)I" ) ) + { + super.visitMethodInsn( opcode, owner, "getData", desc, itf ); + return; + } + + Type retType = Type.getReturnType( desc ); + + if ( EVIL.contains( owner + " " + desc + " " + name ) + || ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "()I getTypeId" ) ) + || ( owner.startsWith( "org/bukkit/block/" ) && ( desc + " " + name ).equals( "(I)Z setTypeId" ) ) ) + { + Type[] args = Type.getArgumentTypes( desc ); + Type[] newArgs = new Type[ args.length + 1 ]; + newArgs[0] = Type.getObjectType( owner ); + System.arraycopy( args, 0, newArgs, 1, args.length ); + + super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftEvil", name, Type.getMethodDescriptor( retType, newArgs ), false ); + return; + } + + if ( owner.equals( "org/bukkit/Material" ) ) + { + if ( name.equals( "getMaterial" ) && desc.equals( "(I)Lorg/bukkit/Material;" ) ) + { + super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftEvil", name, desc, itf ); + return; + } + + switch ( name ) + { + case "values": + case "valueOf": + case "getMaterial": + case "matchMaterial": + super.visitMethodInsn( opcode, "org/bukkit/craftbukkit/util/CraftLegacy", name, desc, itf ); + return; + case "ordinal": + super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", "ordinal", "(Lorg/bukkit/Material;)I", false ); + return; + case "name": + case "toString": + super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", name, "(Lorg/bukkit/Material;)Ljava/lang/String;", false ); + return; + } + } + + if ( retType.getSort() == Type.OBJECT && retType.getInternalName().equals( "org/bukkit/Material" ) && owner.startsWith( "org/bukkit" ) ) + { + super.visitMethodInsn( opcode, owner, name, desc, itf ); + super.visitMethodInsn( Opcodes.INVOKESTATIC, "org/bukkit/craftbukkit/util/CraftLegacy", "toLegacy", "(Lorg/bukkit/Material;)Lorg/bukkit/Material;", false ); + return; + } + + super.visitMethodInsn( opcode, owner, name, desc, itf ); + } + }; + } + }, 0 ); + + return cw.toByteArray(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java index dbbed1be..da2d070e 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftChatMessage.java @@ -138,22 +138,30 @@ public final class CraftChatMessage { } } + public static IChatBaseComponent fromStringOrNull(String message) { + return (message == null) ? null : fromString(message)[0]; + } + public static IChatBaseComponent[] fromString(String message) { return fromString(message, false); } - + public static IChatBaseComponent[] fromString(String message, boolean keepNewlines) { return new StringMessage(message, keepNewlines).getOutput(); } - + public static String fromComponent(IChatBaseComponent component) { return fromComponent(component, EnumChatFormat.BLACK); } + public static String toJSON(IChatBaseComponent component) { + return IChatBaseComponent.ChatSerializer.a(component); + } + public static String fromComponent(IChatBaseComponent component, EnumChatFormat defaultColor) { if (component == null) return ""; StringBuilder out = new StringBuilder(); - + for (IChatBaseComponent c : (Iterable<IChatBaseComponent>) component) { ChatModifier modi = c.getChatModifier(); out.append(modi.getColor() == null ? defaultColor : modi.getColor()); @@ -185,7 +193,7 @@ public final class CraftChatMessage { private static IChatBaseComponent fixComponent(IChatBaseComponent component, Matcher matcher) { if (component instanceof ChatComponentText) { ChatComponentText text = ((ChatComponentText) component); - String msg = text.g(); + String msg = text.f(); if (matcher.reset(msg).find()) { matcher.reset(); @@ -236,7 +244,7 @@ public final class CraftChatMessage { } if (component instanceof ChatMessage) { - Object[] subs = ((ChatMessage) component).j(); + Object[] subs = ((ChatMessage) component).i(); for (int i = 0; i < subs.length; i++) { Object comp = subs[i]; if (comp instanceof IChatBaseComponent) { diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java b/src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java new file mode 100644 index 00000000..14fef6f4 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftEvil.java @@ -0,0 +1,80 @@ +package org.bukkit.craftbukkit.util; + +import com.google.common.base.Preconditions; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.inventory.ItemStack; + +/** + * @deprecated do not use for any reason + */ +@Deprecated +public class CraftEvil { + + private static final Int2ObjectMap<Material> byId = new Int2ObjectLinkedOpenHashMap<>(); + + static { + for (Material material : Material.values()) { + Preconditions.checkState(!byId.containsKey(material.getId()), "Duplicate material ID for", material); + byId.put(material.getId(), material); + } + } + + public static int getBlockTypeIdAt(World world, int x, int y, int z) { + return getId(world.getBlockAt(x, y, z).getType()); + } + + public static int getBlockTypeIdAt(World world, Location location) { + return getId(world.getBlockAt(location).getType()); + } + + public static int getTypeId(Block block) { + return getId(block.getType()); + } + + public static boolean setTypeId(Block block, int type) { + block.setType(getMaterial(type)); + return true; + } + + public static boolean setTypeId(Block block, int type, boolean applyPhysics) { + block.setType(getMaterial(type), applyPhysics); + return true; + } + + public static boolean setTypeIdAndData(Block block, int type, byte data, boolean applyPhysics) { + block.setType(getMaterial(type), applyPhysics); + block.setData(data); + return true; + } + + public static int getTypeId(BlockState state) { + return getId(state.getType()); + } + + public static boolean setTypeId(BlockState state, int type) { + state.setType(getMaterial(type)); + return true; + } + + public static int getTypeId(ItemStack stack) { + return getId(stack.getType()); + } + + public static void setTypeId(ItemStack stack, int type) { + stack.setType(getMaterial(type)); + } + + public static Material getMaterial(int id) { + return byId.get(id); + } + + public static int getId(Material material) { + return CraftLegacy.toLegacy(material).getId(); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java b/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java new file mode 100644 index 00000000..5965e82c --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftLegacy.java @@ -0,0 +1,366 @@ +package org.bukkit.craftbukkit.util; + +import com.google.common.base.Preconditions; +import com.mojang.datafixers.Dynamic; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import net.minecraft.server.Block; +import net.minecraft.server.BlockStateList; +import net.minecraft.server.Blocks; +import net.minecraft.server.DataConverterFlattenData; +import net.minecraft.server.DataConverterMaterialId; +import net.minecraft.server.DataConverterRegistry; +import net.minecraft.server.DataConverterTypes; +import net.minecraft.server.DispenserRegistry; +import net.minecraft.server.DynamicOpsNBT; +import net.minecraft.server.IBlockData; +import net.minecraft.server.IBlockState; +import net.minecraft.server.Item; +import net.minecraft.server.MinecraftKey; +import net.minecraft.server.NBTBase; +import net.minecraft.server.NBTTagCompound; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.material.MaterialData; + +/** + * This class may seem unnecessarily slow and complicated/repetitive however it + * is able to handle a lot more edge cases and invertible transformations (many + * of which are not immediately obvious) than any other alternative. If you do + * make changes to this class please make sure to contribute them back + * https://hub.spigotmc.org/stash/projects/SPIGOT/repos/craftbukkit/browse so + * that all may benefit. + * + * @deprecated legacy use only + */ +@Deprecated +public class CraftLegacy { + + private static final Map<EntityType, Material> SPAWN_EGGS = new HashMap<>(); + private static final Set<String> whitelistedStates = new HashSet<>(Arrays.asList("explode", "check_decay", "decayable")); + private static final Map<MaterialData, Item> materialToItem = new HashMap<>(); + private static final Map<Item, MaterialData> itemToMaterial = new HashMap<>(); + private static final Map<MaterialData, IBlockData> materialToData = new HashMap<>(); + private static final Map<IBlockData, MaterialData> dataToMaterial = new HashMap<>(); + private static final Map<MaterialData, Block> materialToBlock = new HashMap<>(); + private static final Map<Block, MaterialData> blockToMaterial = new HashMap<>(); + + public static Material toLegacy(Material material) { + if (material == null || material.isLegacy()) { + return material; + } + + return toLegacyData(material).getItemType(); + } + + public static MaterialData toLegacyData(Material material) { + Preconditions.checkArgument(!material.isLegacy(), "toLegacy on legacy Material"); + MaterialData mappedData; + + if (material.isBlock()) { + Block block = CraftMagicNumbers.getBlock(material); + IBlockData blockData = block.getBlockData(); + + // Try exact match first + mappedData = dataToMaterial.get(blockData); + // Fallback to any block + if (mappedData == null) { + mappedData = blockToMaterial.get(block); + // Fallback to matching item + if (mappedData == null) { + mappedData = itemToMaterial.get(block.getItem()); + } + } + } else { + Item item = CraftMagicNumbers.getItem(material); + mappedData = itemToMaterial.get(item); + } + + return (mappedData == null) ? new MaterialData(Material.LEGACY_AIR) : mappedData; + } + + public static IBlockData fromLegacyData(Material material, Block block, byte data) { + Preconditions.checkArgument(material.isLegacy(), "fromLegacyData on modern Material"); + + MaterialData materialData = new MaterialData(material, data); + + // Try exact match first + IBlockData converted = materialToData.get(materialData); + if (converted != null) { + return converted; + } + + // Fallback to any block + Block convertedBlock = materialToBlock.get(materialData); + if (convertedBlock != null) { + return convertedBlock.getBlockData(); + } + + // Return existing block + return block.getBlockData(); + } + + public static Item fromLegacyData(Material material, Item item, short data) { + Preconditions.checkArgument(material.isLegacy(), "fromLegacyData on modern Material. Did you forget to define api-version: 1.13 in your plugin.yml?"); + + MaterialData materialData = new MaterialData(material, (byte) data); + + if (material.isBlock()) { + // Try exact match first + IBlockData converted = materialToData.get(materialData); + if (converted != null) { + return converted.getBlock().getItem(); + } + + // Fallback to any block + Block convertedBlock = materialToBlock.get(materialData); + if (convertedBlock != null) { + return convertedBlock.getItem(); + } + } + + // Fallback to matching item + Item convertedItem = materialToItem.get(materialData); + if (convertedItem != null) { + return convertedItem; + } + + // Return existing item + return item; + } + + public static byte toLegacyData(IBlockData blockData) { + MaterialData mappedData; + + // Try exact match first + mappedData = dataToMaterial.get(blockData); + // Fallback to any block + if (mappedData == null) { + mappedData = blockToMaterial.get(blockData.getBlock()); + } + + return (mappedData == null) ? 0 : mappedData.getData(); + } + + public static Material fromLegacy(Material material) { + return fromLegacy(new MaterialData(material)); + } + + public static Material fromLegacy(MaterialData materialData) { + Material material = materialData.getItemType(); + if (material == null || !material.isLegacy()) { + return material; + } + + Material mappedData = null; + + if (material.isBlock()) { + // Try exact match first + IBlockData iblock = materialToData.get(materialData); + if (iblock != null) { + mappedData = CraftMagicNumbers.getMaterial(iblock.getBlock()); + } + + // Fallback to any block + if (mappedData == null) { + Block block = materialToBlock.get(materialData); + if (block != null) { + mappedData = CraftMagicNumbers.getMaterial(block); + } + } + } + + // Fallback to matching item + if (mappedData == null) { + Item item = materialToItem.get(materialData); + if (item != null) { + mappedData = CraftMagicNumbers.getMaterial(item); + } + } + + return (mappedData == null) ? Material.AIR : mappedData; + } + + public static Material[] values() { + Material[] values = Material.values(); + return Arrays.copyOfRange(values, Material.LEGACY_AIR.ordinal(), values.length); + } + + public static Material valueOf(String name) { + return (name.startsWith(Material.LEGACY_PREFIX)) ? Material.valueOf(name) : Material.valueOf(Material.LEGACY_PREFIX + name); + } + + public static Material getMaterial(String name) { + return (name.startsWith(Material.LEGACY_PREFIX)) ? Material.getMaterial(name) : Material.getMaterial(Material.LEGACY_PREFIX + name); + } + + public static Material matchMaterial(String name) { + return (name.startsWith(Material.LEGACY_PREFIX)) ? Material.matchMaterial(name) : Material.matchMaterial(Material.LEGACY_PREFIX + name); + } + + public static int ordinal(Material material) { + Preconditions.checkArgument(material.isLegacy(), "ordinal on modern Material"); + + return material.ordinal() - Material.LEGACY_AIR.ordinal(); + } + + public static String name(Material material) { + return material.name().substring(Material.LEGACY_PREFIX.length()); + } + + public static String toString(Material material) { + return name(material); + } + + public static Material[] modern_values() { + Material[] values = Material.values(); + return Arrays.copyOfRange(values, 0, Material.LEGACY_AIR.ordinal()); + } + + static { + SPAWN_EGGS.put(EntityType.BAT, Material.BAT_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.BLAZE, Material.BLAZE_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.CAVE_SPIDER, Material.CAVE_SPIDER_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.CHICKEN, Material.CHICKEN_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.COW, Material.COW_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.CREEPER, Material.CREEPER_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.ENDERMAN, Material.ENDERMAN_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.ENDERMITE, Material.ENDERMITE_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.GHAST, Material.GHAST_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.GUARDIAN, Material.GUARDIAN_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.HORSE, Material.HORSE_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.MAGMA_CUBE, Material.MAGMA_CUBE_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.MUSHROOM_COW, Material.MOOSHROOM_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.OCELOT, Material.OCELOT_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.PIG, Material.PIG_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.RABBIT, Material.RABBIT_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SHEEP, Material.SHEEP_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SHULKER, Material.SHULKER_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SILVERFISH, Material.SILVERFISH_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SKELETON, Material.SKELETON_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SLIME, Material.SLIME_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SPIDER, Material.SPIDER_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.SQUID, Material.SQUID_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.VILLAGER, Material.VILLAGER_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.WITCH, Material.WITCH_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.WOLF, Material.WOLF_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.PIG_ZOMBIE, Material.ZOMBIE_PIGMAN_SPAWN_EGG); + SPAWN_EGGS.put(EntityType.ZOMBIE, Material.ZOMBIE_SPAWN_EGG); + + DispenserRegistry.c(); + + for (Material material : Material.values()) { + if (!material.isLegacy()) { + continue; + } + + // Handle blocks + if (material.isBlock()) { + for (byte data = 0; data < 16; data++) { + MaterialData matData = new MaterialData(material, data); + Dynamic blockTag = DataConverterFlattenData.b(material.getId() << 4 | data); + // TODO: better skull conversion, chests + if (blockTag.getString("Name").contains("%%FILTER_ME%%")) { + continue; + } + + String name = blockTag.getString("Name"); + // TODO: need to fix + if (name.equals("minecraft:portal")) { + name = "minecraft:nether_portal"; + } + + Block block = Block.REGISTRY.get(new MinecraftKey(name)); + IBlockData blockData = block.getBlockData(); + BlockStateList states = block.getStates(); + + Optional<Dynamic> propMap = blockTag.get("Properties"); + if (propMap.isPresent()) { + NBTTagCompound properties = (NBTTagCompound) propMap.get().getValue(); + for (String dataKey : properties.getKeys()) { + IBlockState state = states.a(dataKey); + + if (state == null) { + if (whitelistedStates.contains(dataKey)) { + continue; + } + throw new IllegalStateException("No state for " + dataKey); + } + + Preconditions.checkState(!properties.getString(dataKey).isEmpty(), "Empty data string"); + Optional opt = state.b(properties.getString(dataKey)); + + blockData = blockData.set(state, (Comparable) opt.get()); + } + } + + if (block == Blocks.AIR) { + continue; + } + + materialToData.put(matData, blockData); + if (!dataToMaterial.containsKey(blockData)) { + dataToMaterial.put(blockData, matData); + } + + materialToBlock.put(matData, block); + if (!blockToMaterial.containsKey(block)) { + blockToMaterial.put(block, matData); + } + } + } + + // Handle items (and second fallback for blocks) + int maxData = material.getMaxDurability() == 0 ? 16 : 1; + // Manually do oldold spawn eggs + if (material == Material.LEGACY_MONSTER_EGG) { + maxData = 121; // Vilager + 1 + } + + for (byte data = 0; data < maxData; data++) { + // Manually skip invalid oldold spawn + if (material == Material.LEGACY_MONSTER_EGG /*&& data != 0 && EntityType.fromId(data) == null*/) { // Mojang broke 18w19b + continue; + } + // Skip non item stacks for now (18w19b) + if (DataConverterMaterialId.a(material.getId()) == null) { + continue; + } + + MaterialData matData = new MaterialData(material, data); + + NBTTagCompound stack = new NBTTagCompound(); + stack.setInt("id", material.getId()); + stack.setShort("Damage", data); + + Dynamic<NBTBase> converted = DataConverterRegistry.a().update(DataConverterTypes.ITEM_STACK, new Dynamic<NBTBase>(DynamicOpsNBT.a, stack), -1, CraftMagicNumbers.DATA_VERSION); + + String newId = converted.getString("id"); + // Recover spawn eggs with invalid data + if (newId.equals("minecraft:spawn_egg")) { + newId = "minecraft:pig_spawn_egg"; + } + + // Preconditions.checkState(newId.contains("minecraft:"), "Unknown new material for " + matData); + Item newMaterial = Item.REGISTRY.get(new MinecraftKey(newId)); + + materialToItem.put(matData, newMaterial); + if (!itemToMaterial.containsKey(newMaterial)) { + itemToMaterial.put(newMaterial, matData); + } + } + + for (Map.Entry<EntityType, Material> entry : SPAWN_EGGS.entrySet()) { + MaterialData matData = new MaterialData(Material.LEGACY_MONSTER_EGG, (byte) entry.getKey().getTypeId()); + Item newMaterial = CraftMagicNumbers.getItem(entry.getValue()); + + materialToItem.put(matData, newMaterial); + itemToMaterial.put(newMaterial, matData); + } + } + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java index a1be7ec4..fbdfdc47 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java +++ b/src/main/java/org/bukkit/craftbukkit/util/CraftMagicNumbers.java @@ -1,43 +1,41 @@ package org.bukkit.craftbukkit.util; import com.google.common.base.Charsets; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.io.Files; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import java.io.File; import java.io.IOException; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.util.Locale; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import net.minecraft.server.AdvancementDataWorld; +import net.minecraft.server.AdvancementDataWorld; import net.minecraft.server.Block; -import net.minecraft.server.Blocks; import net.minecraft.server.ChatDeserializer; +import net.minecraft.server.IBlockData; import net.minecraft.server.Item; import net.minecraft.server.MinecraftKey; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.MojangsonParseException; import net.minecraft.server.MojangsonParser; import net.minecraft.server.NBTTagCompound; -import net.minecraft.server.StatisticList; -import org.bukkit.Achievement; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.NamespacedKey; -import org.bukkit.Statistic; import org.bukkit.UnsafeValues; import org.bukkit.advancement.Advancement; -import org.bukkit.craftbukkit.CraftStatistic; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.block.data.CraftBlockData; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; -import org.bukkit.util.StringUtil; +import org.bukkit.material.MaterialData; +import org.bukkit.plugin.PluginAwareness; +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.UnknownDependencyException; @SuppressWarnings("deprecation") public final class CraftMagicNumbers implements UnsafeValues { @@ -45,81 +43,106 @@ public final class CraftMagicNumbers implements UnsafeValues { private CraftMagicNumbers() {} - public static Block getBlock(org.bukkit.block.Block block) { - return getBlock(block.getType()); + public static IBlockData getBlock(MaterialData material) { + return getBlock(material.getItemType(), material.getData()); } - @Deprecated - // A bad method for bad magic. - public static Block getBlock(int id) { - return getBlock(Material.getMaterial(id)); + public static IBlockData getBlock(Material material, byte data) { + return CraftLegacy.fromLegacyData(CraftLegacy.toLegacy(material), getBlock(material), data); } - @Deprecated - // A bad method for bad magic. - public static int getId(Block block) { - return Block.getId(block); + public static MaterialData getMaterial(IBlockData data) { + return CraftLegacy.toLegacy(getMaterial(data.getBlock())).getNewData(toLegacyData(data)); } - public static Material getMaterial(Block block) { - return Material.getMaterial(Block.getId(block)); + public static Item getItem(Material material, short data) { + if (material.isLegacy()) { + return CraftLegacy.fromLegacyData(CraftLegacy.toLegacy(material), getItem(material), data); + } + + return getItem(material); } - public static Item getItem(Material material) { - // TODO: Don't use ID - Item item = Item.getById(material.getId()); - return item; + public static MaterialData getMaterialData(Item item) { + return CraftLegacy.toLegacyData(getMaterial(item)); } - @Deprecated - // A bad method for bad magic. - public static Item getItem(int id) { - return Item.getById(id); + // ======================================================================== + private static final Map<Block, Material> BLOCK_MATERIAL = new HashMap<>(); + private static final Map<Item, Material> ITEM_MATERIAL = new HashMap<>(); + private static final Map<Material, Item> MATERIAL_ITEM = new HashMap<>(); + private static final Map<Material, Block> MATERIAL_BLOCK = new HashMap<>(); + + static { + for (Block block : (Iterable<Block>) Block.REGISTRY) { // Eclipse fail + BLOCK_MATERIAL.put(block, Material.getMaterial(Block.REGISTRY.b(block).getKey().toUpperCase(Locale.ROOT))); + } + + for (Item item : (Iterable<Item>) Item.REGISTRY) { // Eclipse fail + ITEM_MATERIAL.put(item, Material.getMaterial(Item.REGISTRY.b(item).getKey().toUpperCase(Locale.ROOT))); + } + + for (Material material : Material.values()) { + MinecraftKey key = key(material); + MATERIAL_ITEM.put(material, Item.REGISTRY.get(key)); + MATERIAL_BLOCK.put(material, Block.REGISTRY.get(key)); + } } - @Deprecated - // A bad method for bad magic. - public static int getId(Item item) { - return Item.getId(item); + public static Material getMaterial(Block block) { + return BLOCK_MATERIAL.get(block); } public static Material getMaterial(Item item) { - // TODO: Don't use ID - Material material = Material.getMaterial(Item.getId(item)); - - if (material == null) { - return Material.AIR; - } + return ITEM_MATERIAL.getOrDefault(item, Material.AIR); + } - return material; + public static Item getItem(Material material) { + return MATERIAL_ITEM.get(material); } public static Block getBlock(Material material) { - if (material == null) { - return null; - } - // TODO: Don't use ID - Block block = Block.getById(material.getId()); + return MATERIAL_BLOCK.get(material); + } - if (block == null) { - return Blocks.AIR; + public static MinecraftKey key(Material mat) { + if (mat.isLegacy()) { + mat = CraftLegacy.fromLegacy(mat); } - return block; + return CraftNamespacedKey.toMinecraft(mat.getKey()); + } + // ======================================================================== + + public static byte toLegacyData(IBlockData data) { + return CraftLegacy.toLegacyData(data); } @Override - public Material getMaterialFromInternalName(String name) { - return getMaterial((Item) Item.REGISTRY.get(new MinecraftKey(name))); + public Material toLegacy(Material material) { + return CraftLegacy.toLegacy(material); } @Override - public List<String> tabCompleteInternalMaterialName(String token, List<String> completions) { - ArrayList<String> results = Lists.newArrayList(); - for (MinecraftKey key : (Set<MinecraftKey>)Item.REGISTRY.keySet()) { - results.add(key.toString()); - } - return StringUtil.copyPartialMatches(token, results, completions); + public Material fromLegacy(Material material) { + return CraftLegacy.fromLegacy(material); + } + + @Override + public Material fromLegacy(MaterialData material) { + return CraftLegacy.fromLegacy(material); + } + + @Override + public BlockData fromLegacy(Material material, byte data) { + return CraftBlockData.fromData(getBlock(material, data)); + } + + public static final int DATA_VERSION = 1513; + + @Override + public int getDataVersion() { + return DATA_VERSION; } @Override @@ -128,7 +151,7 @@ public final class CraftMagicNumbers implements UnsafeValues { try { nmsStack.setTag((NBTTagCompound) MojangsonParser.parse(arguments)); - } catch (MojangsonParseException ex) { + } catch (CommandSyntaxException ex) { Logger.getLogger(CraftMagicNumbers.class.getName()).log(Level.SEVERE, null, ex); } @@ -138,29 +161,6 @@ public final class CraftMagicNumbers implements UnsafeValues { } @Override - public Statistic getStatisticFromInternalName(String name) { - return CraftStatistic.getBukkitStatisticByName(name); - } - - @Override - public Achievement getAchievementFromInternalName(String name) { - throw new UnsupportedOperationException("Not supported in this Minecraft version."); - } - - @Override - public List<String> tabCompleteInternalStatisticOrAchievementName(String token, List<String> completions) { - List<String> matches = new ArrayList<String>(); - Iterator iterator = StatisticList.stats.iterator(); - while (iterator.hasNext()) { - String statistic = ((net.minecraft.server.Statistic) iterator.next()).name; - if (statistic.startsWith(token)) { - matches.add(statistic); - } - } - return matches; - } - - @Override public Advancement loadAdvancement(NamespacedKey key, String advancement) { if (Bukkit.getAdvancement(key) != null) { throw new IllegalArgumentException("Advancement " + key + " already exists."); @@ -172,7 +172,7 @@ public final class CraftMagicNumbers implements UnsafeValues { Advancement bukkit = Bukkit.getAdvancement(key); if (bukkit != null) { - File file = new File(MinecraftServer.getServer().getAdvancementData().folder, key.getNamespace() + File.separator + key.getKey() + ".json"); + File file = new File(MinecraftServer.getServer().bukkitDataPackFolder, "data" + File.separator + key.getNamespace() + File.separator + "advancements" + File.separator + key.getKey() + ".json"); file.getParentFile().mkdirs(); try { @@ -192,10 +192,34 @@ public final class CraftMagicNumbers implements UnsafeValues { @Override public boolean removeAdvancement(NamespacedKey key) { - File file = new File(MinecraftServer.getServer().getAdvancementData().folder, key.getNamespace() + File.separator + key.getKey() + ".json"); + File file = new File(MinecraftServer.getServer().bukkitDataPackFolder, "data" + File.separator + key.getNamespace() + File.separator + "advancements" + File.separator + key.getKey() + ".json"); return file.delete(); } + @Override + public void checkSupported(PluginDescriptionFile pdf) { + if (pdf.getAPIVersion() != null) { + if (!pdf.getAPIVersion().equals("1.13")) { + throw new UnknownDependencyException("Unsupported API version " + pdf.getAPIVersion()); + } + } + } + + public static boolean isLegacy(PluginDescriptionFile pdf) { + return pdf.getAPIVersion() == null; + } + + @Override + public byte[] processClass(PluginDescriptionFile pdf, byte[] clazz) { + try { + clazz = Commodore.convert(clazz, !isLegacy(pdf)); + } catch (Exception ex) { + Bukkit.getLogger().log(Level.SEVERE, "Fatal error trying to convert " + pdf.getFullName(), ex); + } + + return clazz; + } + /** * This helper class represents the different NBT Tags. * <p> diff --git a/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java new file mode 100644 index 00000000..1833ee72 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/util/DummyGeneratorAccess.java @@ -0,0 +1,254 @@ +package org.bukkit.craftbukkit.util; + +import java.util.List; +import java.util.Random; +import java.util.function.Function; +import java.util.function.Predicate; +import net.minecraft.server.AxisAlignedBB; +import net.minecraft.server.BiomeBase; +import net.minecraft.server.Block; +import net.minecraft.server.BlockPosition; +import net.minecraft.server.DifficultyDamageScaler; +import net.minecraft.server.Entity; +import net.minecraft.server.EntityHuman; +import net.minecraft.server.EnumDirection; +import net.minecraft.server.EnumSkyBlock; +import net.minecraft.server.Fluid; +import net.minecraft.server.FluidType; +import net.minecraft.server.GeneratorAccess; +import net.minecraft.server.HeightMap; +import net.minecraft.server.IBlockData; +import net.minecraft.server.IChunkAccess; +import net.minecraft.server.IChunkProvider; +import net.minecraft.server.IDataManager; +import net.minecraft.server.ParticleParam; +import net.minecraft.server.PersistentBase; +import net.minecraft.server.PersistentCollection; +import net.minecraft.server.SoundCategory; +import net.minecraft.server.SoundEffect; +import net.minecraft.server.TickList; +import net.minecraft.server.TileEntity; +import net.minecraft.server.VoxelShape; +import net.minecraft.server.World; +import net.minecraft.server.WorldBorder; +import net.minecraft.server.WorldData; +import net.minecraft.server.WorldProvider; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class DummyGeneratorAccess implements GeneratorAccess { + + public static final GeneratorAccess INSTANCE = new DummyGeneratorAccess(); + + private DummyGeneratorAccess() { + } + + @Override + public long getSeed() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public TickList<Block> I() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public TickList<FluidType> H() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public IChunkAccess c(int i, int i1) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public World getMinecraftWorld() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public WorldData getWorldData() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public DifficultyDamageScaler getDamageScaler(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public <T extends PersistentBase> T a(Function<String, T> fnctn, String string) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public PersistentCollection s_() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void a(String string, PersistentBase pb) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public IChunkProvider getChunkProvider() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public IDataManager getDataManager() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Random m() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void update(BlockPosition bp, Block block) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public BlockPosition getSpawn() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void a(EntityHuman eh, BlockPosition bp, SoundEffect se, SoundCategory sc, float f, float f1) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void addParticle(ParticleParam pp, double d, double d1, double d2, double d3, double d4, double d5) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isEmpty(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public BiomeBase getBiome(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getBrightness(EnumSkyBlock esb, BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getLightLevel(BlockPosition bp, int i) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean isChunkLoaded(int i, int i1, boolean bln) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean e(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int a(HeightMap.Type type, int i, int i1) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public EntityHuman a(double d, double d1, double d2, double d3, Predicate<Entity> prdct) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int c() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public WorldBorder getWorldBorder() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean a(Entity entity, VoxelShape vs) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public List<Entity> getEntities(Entity entity, AxisAlignedBB aabb) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int a(BlockPosition bp, EnumDirection ed) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean e() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public int getSeaLevel() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public WorldProvider o() { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public TileEntity getTileEntity(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public IBlockData getType(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public Fluid b(BlockPosition bp) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean setTypeAndData(BlockPosition blockposition, IBlockData iblockdata, int i) { + return false; + } + + @Override + public boolean addEntity(Entity entity) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean addEntity(Entity entity, CreatureSpawnEvent.SpawnReason reason) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean setAir(BlockPosition blockposition) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void a(EnumSkyBlock enumskyblock, BlockPosition blockposition, int i) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public boolean setAir(BlockPosition blockposition, boolean flag) { + throw new UnsupportedOperationException("Not supported yet."); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java b/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java deleted file mode 100644 index f9cc7d6f..00000000 --- a/src/main/java/org/bukkit/craftbukkit/util/StructureGrowDelegate.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.bukkit.craftbukkit.util; - -import java.util.ArrayList; -import java.util.List; - -import net.minecraft.server.Block; -import net.minecraft.server.Blocks; -import net.minecraft.server.World; - -import org.bukkit.BlockChangeDelegate; -import org.bukkit.block.BlockState; -import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.material.MaterialData; - -public class StructureGrowDelegate implements BlockChangeDelegate { - private final CraftWorld world; - private final List<BlockState> blocks = new ArrayList<BlockState>(); - - public StructureGrowDelegate(World world) { - this.world = world.getWorld(); - } - - public boolean setRawTypeId(int x, int y, int z, int type) { - return setRawTypeIdAndData(x, y, z, type, 0); - } - - public boolean setRawTypeIdAndData(int x, int y, int z, int type, int data) { - BlockState state = world.getBlockAt(x, y, z).getState(); - state.setTypeId(type); - state.setData(new MaterialData(type, (byte) data)); - blocks.add(state); - return true; - } - - public boolean setTypeId(int x, int y, int z, int typeId) { - return setRawTypeId(x, y, z, typeId); - } - - public boolean setTypeIdAndData(int x, int y, int z, int typeId, int data) { - return setRawTypeIdAndData(x, y, z, typeId, data); - } - - public int getTypeId(int x, int y, int z) { - for (BlockState state : blocks) { - if (state.getX() == x && state.getY() == y && state.getZ() == z) { - return state.getTypeId(); - } - } - - return world.getBlockTypeIdAt(x, y, z); - } - - public int getHeight() { - return world.getMaxHeight(); - } - - public List<BlockState> getBlocks() { - return blocks; - } - - public boolean isEmpty(int x, int y, int z) { - for (BlockState state : blocks) { - if (state.getX() == x && state.getY() == y && state.getZ() == z) { - return Block.getById(state.getTypeId()) == Blocks.AIR; - } - } - - return world.getBlockAt(x, y, z).isEmpty(); - } -} diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java index 39ef2ef9..c928c2b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java +++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CommandPermissions.java @@ -15,7 +15,7 @@ public final class CommandPermissions { DefaultPermissions.registerPermission(PREFIX + "kill", "Allows the user to commit suicide", PermissionDefault.OP, commands);
DefaultPermissions.registerPermission(PREFIX + "me", "Allows the user to perform a chat action", PermissionDefault.TRUE, commands);
- DefaultPermissions.registerPermission(PREFIX + "tell", "Allows the user to privately message another player", PermissionDefault.TRUE, commands);
+ DefaultPermissions.registerPermission(PREFIX + "msg", "Allows the user to privately message another player", PermissionDefault.TRUE, commands);
DefaultPermissions.registerPermission(PREFIX + "say", "Allows the user to talk as the console", PermissionDefault.OP, commands);
DefaultPermissions.registerPermission(PREFIX + "give", "Allows the user to give items to players", PermissionDefault.OP, commands);
DefaultPermissions.registerPermission(PREFIX + "teleport", "Allows the user to teleport players", PermissionDefault.OP, commands);
diff --git a/src/test/java/org/bukkit/ArtTest.java b/src/test/java/org/bukkit/ArtTest.java index 7f402889..29d14d4b 100644 --- a/src/test/java/org/bukkit/ArtTest.java +++ b/src/test/java/org/bukkit/ArtTest.java @@ -5,10 +5,12 @@ import static org.hamcrest.Matchers.*; import java.util.Collections; import java.util.EnumMap; +import java.util.HashMap; import java.util.List; import java.util.Map; -import net.minecraft.server.EntityPainting.EnumArt; +import net.minecraft.server.MinecraftKey; +import net.minecraft.server.Paintings; import org.bukkit.craftbukkit.CraftArt; import org.junit.Test; @@ -22,15 +24,15 @@ public class ArtTest { public void verifyMapping() { List<Art> arts = Lists.newArrayList(Art.values()); - for (EnumArt enumArt : EnumArt.values()) { - int id = enumArt.ordinal(); - String name = enumArt.B; - int width = enumArt.C / UNIT_MULTIPLIER; - int height = enumArt.D / UNIT_MULTIPLIER; + for (MinecraftKey key : Paintings.a.keySet()) { + Paintings enumArt = Paintings.a.get(key); + String name = key.getKey(); + int width = enumArt.b() / UNIT_MULTIPLIER; + int height = enumArt.c() / UNIT_MULTIPLIER; - Art subject = Art.getById(id); + Art subject = CraftArt.NotchToBukkit(enumArt); - String message = String.format("org.bukkit.Art is missing id: %d named: '%s'", id, name); + String message = String.format("org.bukkit.Art is missing '%s'", name); assertNotNull(message, subject); assertThat(Art.getByName(name), is(subject)); @@ -45,9 +47,9 @@ public class ArtTest { @Test public void testCraftArtToNotch() { - Map<EnumArt, Art> cache = new EnumMap(EnumArt.class); + Map<Paintings, Art> cache = new HashMap<>(); for (Art art : Art.values()) { - EnumArt enumArt = CraftArt.BukkitToNotch(art); + Paintings enumArt = CraftArt.BukkitToNotch(art); assertNotNull(art.name(), enumArt); assertThat(art.name(), cache.put(enumArt, art), is(nullValue())); } @@ -55,11 +57,11 @@ public class ArtTest { @Test public void testCraftArtToBukkit() { - Map<Art, EnumArt> cache = new EnumMap(Art.class); - for (EnumArt enumArt : EnumArt.values()) { + Map<Art, Paintings> cache = new EnumMap(Art.class); + for (Paintings enumArt : (Iterable<Paintings>) Paintings.a) { // Eclipse fail Art art = CraftArt.NotchToBukkit(enumArt); - assertNotNull(enumArt.name(), art); - assertThat(enumArt.name(), cache.put(art, enumArt), is(nullValue())); + assertNotNull("Could not CraftArt.NotchToBukkit " + enumArt, art); + assertThat("Duplicate artwork " + enumArt, cache.put(art, enumArt), is(nullValue())); } } } diff --git a/src/test/java/org/bukkit/BlockDataTest.java b/src/test/java/org/bukkit/BlockDataTest.java new file mode 100644 index 00000000..a5cea50b --- /dev/null +++ b/src/test/java/org/bukkit/BlockDataTest.java @@ -0,0 +1,58 @@ +package org.bukkit; + +import net.minecraft.server.BlockCake; +import net.minecraft.server.Blocks; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Cake; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.support.AbstractTestingBase; +import static org.hamcrest.Matchers.*; +import org.junit.Assert; +import org.junit.Test; + +public class BlockDataTest extends AbstractTestingBase { + + @Test + public void testParsing() { + BlockData cakeTest = CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3)); + + BlockData materialString = CraftBlockData.newData(Material.CAKE, "[bites=3]"); + Assert.assertThat(materialString, is(cakeTest)); + + BlockData combined = CraftBlockData.newData(null, "cake[bites=3]"); + Assert.assertThat(combined, is(cakeTest)); + + BlockData combinedMinecraft = CraftBlockData.newData(null, "minecraft:cake[bites=3]"); + Assert.assertThat(combinedMinecraft, is(cakeTest)); + + BlockData inverted = CraftBlockData.newData(null, cakeTest.getAsString()); + Assert.assertThat(inverted, is(cakeTest)); + } + + @Test(expected = IllegalArgumentException.class) + public void testBadMaterial() { + CraftBlockData.newData(null, "invalid"); + } + + @Test(expected = IllegalArgumentException.class) + public void testBadSyntax() { + CraftBlockData.newData(null, "minecraft:cake[bites=3"); + } + + @Test(expected = IllegalArgumentException.class) + public void testDoubleMaterial() { + CraftBlockData.newData(Material.CAKE, "minecraft:cake[bites=3]"); + } + + @Test + public void testClone() { + Cake cakeTest = (Cake) CraftBlockData.fromData(Blocks.CAKE.getBlockData().set(BlockCake.BITES, 3)); + Cake clone = (Cake) cakeTest.clone(); + + Assert.assertFalse("Clone did not return new object", cakeTest == clone); + Assert.assertThat("Clone is not equal", clone, is(cakeTest)); + + clone.setBites(1); + Assert.assertThat("Clone is not actually clone", clone, is(not(cakeTest))); + } +} diff --git a/src/test/java/org/bukkit/DyeColorsTest.java b/src/test/java/org/bukkit/DyeColorsTest.java index 020714da..45a5caed 100644 --- a/src/test/java/org/bukkit/DyeColorsTest.java +++ b/src/test/java/org/bukkit/DyeColorsTest.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.server.EnumColor; -import net.minecraft.server.ItemDye; import org.bukkit.support.AbstractTestingBase; import org.junit.Test; @@ -33,7 +32,7 @@ public class DyeColorsTest extends AbstractTestingBase { @Test public void checkColor() { Color color = dye.getColor(); - float[] nmsColorArray = EnumColor.fromColorIndex(dye.getWoolData()).f(); + float[] nmsColorArray = EnumColor.fromColorIndex(dye.getWoolData()).d(); Color nmsColor = Color.fromRGB((int) (nmsColorArray[0] * 255), (int) (nmsColorArray[1] * 255), (int) (nmsColorArray[2] * 255)); assertThat(color, is(nmsColor)); } @@ -41,7 +40,7 @@ public class DyeColorsTest extends AbstractTestingBase { @Test public void checkFireworkColor() { Color color = dye.getFireworkColor(); - int nmsColor = ItemDye.a[dye.getDyeData()]; + int nmsColor = EnumColor.fromColorIndex(dye.getWoolData()).f(); assertThat(color, is(Color.fromRGB(nmsColor))); } } diff --git a/src/test/java/org/bukkit/EnchantmentTest.java b/src/test/java/org/bukkit/EnchantmentTest.java new file mode 100644 index 00000000..86bfbb45 --- /dev/null +++ b/src/test/java/org/bukkit/EnchantmentTest.java @@ -0,0 +1,24 @@ +package org.bukkit; + +import net.minecraft.server.MinecraftKey; +import org.bukkit.craftbukkit.util.CraftNamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.support.AbstractTestingBase; +import org.junit.Assert; +import org.junit.Test; + +public class EnchantmentTest extends AbstractTestingBase { + + @Test + public void verifyMapping() { + for (MinecraftKey key : net.minecraft.server.Enchantment.enchantments.keySet()) { + net.minecraft.server.Enchantment nms = net.minecraft.server.Enchantment.enchantments.get(key); + + Enchantment bukkitById = Enchantment.getByKey(CraftNamespacedKey.fromMinecraft(key)); + + Assert.assertFalse("Unknown enchant name for " + key, bukkitById.getName().startsWith("UNKNOWN")); + + Assert.assertNotNull("Unknown target for " + key, bukkitById.getItemTarget()); + } + } +} diff --git a/src/test/java/org/bukkit/LegacyTest.java b/src/test/java/org/bukkit/LegacyTest.java new file mode 100644 index 00000000..543e7581 --- /dev/null +++ b/src/test/java/org/bukkit/LegacyTest.java @@ -0,0 +1,89 @@ +package org.bukkit; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import org.bukkit.craftbukkit.util.CraftLegacy; +import org.bukkit.material.MaterialData; +import org.bukkit.support.AbstractTestingBase; +import org.junit.Assert; +import org.junit.Test; + +public class LegacyTest extends AbstractTestingBase { + + private final Set<Material> INVALIDATED_MATERIALS = new HashSet<>(Arrays.asList(Material.ACACIA_BUTTON, Material.ACACIA_PRESSURE_PLATE, Material.ACACIA_TRAPDOOR, Material.AIR, Material.ATTACHED_MELON_STEM, Material.ATTACHED_PUMPKIN_STEM, + Material.BIRCH_BUTTON, Material.BIRCH_PRESSURE_PLATE, Material.BIRCH_TRAPDOOR, Material.BLACK_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.BUBBLE_COLUMN, Material.CAVE_AIR, Material.CREEPER_WALL_HEAD, + Material.CYAN_WALL_BANNER, Material.DARK_OAK_BUTTON, Material.DARK_OAK_PRESSURE_PLATE, Material.DARK_OAK_TRAPDOOR, Material.DARK_PRISMARINE_SLAB, Material.DARK_PRISMARINE_STAIRS, Material.DEBUG_STICK, Material.DONKEY_SPAWN_EGG, + Material.DRAGON_WALL_HEAD, Material.DRIED_KELP, Material.DRIED_KELP_BLOCK, Material.ELDER_GUARDIAN_SPAWN_EGG, Material.EVOKER_SPAWN_EGG, Material.GRAY_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.HUSK_SPAWN_EGG, + Material.JUNGLE_BUTTON, Material.JUNGLE_PRESSURE_PLATE, Material.JUNGLE_TRAPDOOR, Material.KELP, Material.KELP_PLANT, Material.LIGHT_BLUE_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.LIME_WALL_BANNER, Material.LLAMA_SPAWN_EGG, + Material.MAGENTA_WALL_BANNER, Material.MULE_SPAWN_EGG, Material.ORANGE_WALL_BANNER, Material.PARROT_SPAWN_EGG, Material.PHANTOM_SPAWN_EGG, Material.PINK_WALL_BANNER, Material.PLAYER_WALL_HEAD, Material.POLAR_BEAR_SPAWN_EGG, + Material.POTTED_ACACIA_SAPLING, Material.POTTED_ALLIUM, Material.POTTED_AZURE_BLUET, Material.POTTED_BIRCH_SAPLING, Material.POTTED_BLUE_ORCHID, Material.POTTED_BROWN_MUSHROOM, Material.POTTED_DANDELION, Material.POTTED_DARK_OAK_SAPLING, + Material.POTTED_DEAD_BUSH, Material.POTTED_FERN, Material.POTTED_JUNGLE_SAPLING, Material.POTTED_OAK_SAPLING, Material.POTTED_ORANGE_TULIP, Material.POTTED_OXEYE_DAISY, Material.POTTED_PINK_TULIP, Material.POTTED_POPPY, + Material.POTTED_RED_MUSHROOM, Material.POTTED_RED_TULIP, Material.POTTED_SPRUCE_SAPLING, Material.POTTED_WHITE_TULIP, Material.PRISMARINE_BRICK_SLAB, Material.PRISMARINE_BRICK_STAIRS, Material.PRISMARINE_SLAB, Material.PRISMARINE_STAIRS, + Material.PUMPKIN, Material.PURPLE_WALL_BANNER, Material.RED_WALL_BANNER, Material.SEAGRASS, Material.SKELETON_HORSE_SPAWN_EGG, Material.SKELETON_WALL_SKULL, Material.SPRUCE_BUTTON, Material.SPRUCE_PRESSURE_PLATE, Material.SPRUCE_TRAPDOOR, + Material.STRAY_SPAWN_EGG, Material.STRIPPED_ACACIA_LOG, Material.STRIPPED_BIRCH_LOG, Material.STRIPPED_DARK_OAK_LOG, Material.STRIPPED_JUNGLE_LOG, Material.STRIPPED_OAK_LOG, Material.STRIPPED_SPRUCE_LOG, Material.TALL_SEAGRASS, + Material.TRIDENT, Material.TURTLE_EGG, Material.TURTLE_HELMET, Material.SCUTE, Material.TURTLE_SPAWN_EGG, Material.VEX_SPAWN_EGG, Material.VINDICATOR_SPAWN_EGG, Material.VOID_AIR, Material.WHITE_BED, + Material.WITHER_SKELETON_SPAWN_EGG, Material.WITHER_SKELETON_WALL_SKULL, Material.YELLOW_WALL_BANNER, Material.ZOMBIE_HORSE_SPAWN_EGG, Material.ZOMBIE_VILLAGER_SPAWN_EGG, Material.ZOMBIE_WALL_HEAD, + Material.COD_BUCKET, Material.COD_SPAWN_EGG, Material.PUFFERFISH_BUCKET, Material.PUFFERFISH_SPAWN_EGG, Material.SALMON_BUCKET, Material.SALMON_SPAWN_EGG, + Material.TROPICAL_FISH_BUCKET, Material.DROWNED_SPAWN_EGG, Material.SHULKER_BOX, Material.TROPICAL_FISH_SPAWN_EGG, + Material.BLUE_ICE, Material.BRAIN_CORAL, Material.BRAIN_CORAL_BLOCK, Material.BRAIN_CORAL_FAN, Material.BUBBLE_CORAL, Material.BUBBLE_CORAL_BLOCK, Material.BUBBLE_CORAL_FAN, Material.CONDUIT, Material.DEAD_BRAIN_CORAL_BLOCK, + Material.DEAD_BUBBLE_CORAL_BLOCK, Material.DEAD_FIRE_CORAL_BLOCK, Material.DEAD_HORN_CORAL_BLOCK, Material.DEAD_TUBE_CORAL_BLOCK, Material.DOLPHIN_SPAWN_EGG, Material.FIRE_CORAL, Material.FIRE_CORAL_BLOCK, Material.FIRE_CORAL_FAN, + Material.HEART_OF_THE_SEA, Material.HORN_CORAL, Material.HORN_CORAL_BLOCK, Material.HORN_CORAL_FAN, Material.NAUTILUS_SHELL, Material.PHANTOM_MEMBRANE, Material.SEA_PICKLE, Material.TUBE_CORAL, Material.TUBE_CORAL_BLOCK, + Material.TUBE_CORAL_FAN, Material.STRIPPED_ACACIA_WOOD, Material.STRIPPED_BIRCH_WOOD, Material.STRIPPED_DARK_OAK_WOOD, Material.STRIPPED_JUNGLE_WOOD, Material.STRIPPED_OAK_WOOD, Material.STRIPPED_SPRUCE_WOOD, + Material.ACACIA_WOOD, Material.BIRCH_WOOD, Material.DARK_OAK_WOOD, Material.JUNGLE_WOOD, Material.OAK_WOOD, Material.SPRUCE_WOOD, + // + Material.LEGACY_AIR, Material.LEGACY_DEAD_BUSH, Material.LEGACY_BURNING_FURNACE, Material.LEGACY_WALL_SIGN, Material.LEGACY_REDSTONE_TORCH_OFF, Material.LEGACY_SKULL, Material.LEGACY_REDSTONE_COMPARATOR_ON, Material.LEGACY_WALL_BANNER, Material.LEGACY_MONSTER_EGG)); + + private final Set<Material> INVERSION_FAILS = new HashSet<>(Arrays.asList(Material.LEGACY_DOUBLE_STEP, Material.LEGACY_GLOWING_REDSTONE_ORE, Material.LEGACY_DIODE_BLOCK_ON, Material.LEGACY_REDSTONE_LAMP_ON, Material.LEGACY_WOOD_DOUBLE_STEP, + Material.LEGACY_DAYLIGHT_DETECTOR_INVERTED, Material.LEGACY_DOUBLE_STONE_SLAB2, Material.LEGACY_PURPUR_DOUBLE_SLAB, Material.LEGACY_WHEAT, Material.LEGACY_SIGN, Material.LEGACY_WOOD_DOOR, Material.LEGACY_IRON_DOOR, Material.LEGACY_SUGAR_CANE, + Material.LEGACY_CAKE, Material.LEGACY_BED, Material.LEGACY_DIODE, Material.LEGACY_NETHER_STALK, Material.LEGACY_BREWING_STAND_ITEM, Material.LEGACY_CAULDRON_ITEM, Material.LEGACY_REDSTONE_COMPARATOR, Material.LEGACY_SPRUCE_DOOR_ITEM, + Material.LEGACY_BIRCH_DOOR_ITEM, Material.LEGACY_JUNGLE_DOOR_ITEM, Material.LEGACY_ACACIA_DOOR_ITEM, Material.LEGACY_DARK_OAK_DOOR_ITEM, Material.LEGACY_STATIONARY_LAVA, Material.LEGACY_STATIONARY_WATER)); + + @Test + public void toLegacyMaterial() { + for (Material material : Material.values()) { + if (!INVALIDATED_MATERIALS.contains(material) && !material.isLegacy()) { + MaterialData converted = CraftLegacy.toLegacyData(material); + + Assert.assertNotEquals("Could not toLegacy " + material, Material.LEGACY_AIR, converted.getItemType()); + + if (!INVALIDATED_MATERIALS.contains(converted.getItemType())) { + Assert.assertNotEquals("Could not fromLegacy(toLegacy) " + converted + "(" + material + ")", Material.AIR, CraftLegacy.fromLegacy(converted)); + } + if (!INVERSION_FAILS.contains(material)) { + Assert.assertEquals("Could not fromLegacy(toLegacy) " + converted + "(" + material + ")", material, CraftLegacy.fromLegacy(converted)); + } + } + } + + Assert.assertEquals("Could not toLegacy Air", Material.LEGACY_AIR, CraftLegacy.toLegacy(Material.AIR)); + } + + @Test + public void fromLegacyMaterial() { + for (Material material : Material.values()) { + if (!INVALIDATED_MATERIALS.contains(material) && material.isLegacy()) { + Material converted = CraftLegacy.fromLegacy(material); + Assert.assertNotEquals("Could not fromLegacy " + material, Material.AIR, converted); + + Assert.assertNotEquals("Could not toLegacy(fromLegacy) " + converted + "(" + material + ")", Material.AIR, CraftLegacy.toLegacy(converted)); + if (!INVERSION_FAILS.contains(material)) { + Assert.assertEquals("Could not toLegacy(fromLegacy) " + converted + "(" + material + ")", material, CraftLegacy.toLegacy(converted)); + } + } + } + + Assert.assertEquals("Could not fromLegacy Air", Material.AIR, CraftLegacy.fromLegacy(Material.LEGACY_AIR)); + } + + @Test + public void testRestricted() { + for (Material material : CraftLegacy.values()) { + Assert.assertTrue("Must iterate only legacy materials", material.isLegacy()); + } + + for (Material material : CraftLegacy.modern_values()) { + Assert.assertFalse("Must iterate only modern materials", material.isLegacy()); + } + } +} diff --git a/src/test/java/org/bukkit/MaterialTest.java b/src/test/java/org/bukkit/MaterialTest.java index a9b4e525..be0690f3 100644 --- a/src/test/java/org/bukkit/MaterialTest.java +++ b/src/test/java/org/bukkit/MaterialTest.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.Map; import net.minecraft.server.Item; +import net.minecraft.server.MinecraftKey; import org.bukkit.support.AbstractTestingBase; import org.junit.Test; @@ -19,13 +20,13 @@ public class MaterialTest extends AbstractTestingBase { @Test public void verifyMapping() { - Map<Integer, Material> materials = Maps.newHashMap(); + Map<MinecraftKey, Material> materials = Maps.newHashMap(); for (Material material : Material.values()) { if (INVALIDATED_MATERIALS.contains(material)) { continue; } - materials.put(material.getId(), material); + materials.put(CraftMagicNumbers.key(material), material); } Iterator<Item> items = Item.REGISTRY.iterator(); @@ -34,12 +35,13 @@ public class MaterialTest extends AbstractTestingBase { Item item = items.next(); if (item == null) continue; - int id = CraftMagicNumbers.getId(item); + MinecraftKey id = Item.REGISTRY.b(item); String name = item.getName(); Material material = materials.remove(id); assertThat("Missing " + name + "(" + id + ")", material, is(not(nullValue()))); + assertNotNull("No item mapping for " + name, CraftMagicNumbers.getMaterial(item)); } assertThat(materials, is(Collections.EMPTY_MAP)); diff --git a/src/test/java/org/bukkit/ParticleTest.java b/src/test/java/org/bukkit/ParticleTest.java index c00869ba..c0cb4a1e 100644 --- a/src/test/java/org/bukkit/ParticleTest.java +++ b/src/test/java/org/bukkit/ParticleTest.java @@ -1,19 +1,34 @@ package org.bukkit; -import net.minecraft.server.EnumParticle; +import org.bukkit.block.data.BlockData; import org.bukkit.craftbukkit.CraftParticle; +import org.bukkit.craftbukkit.block.data.CraftBlockData; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.MaterialData; +import org.bukkit.support.AbstractTestingBase; import org.junit.Assert; import org.junit.Test; -public class ParticleTest { +public class ParticleTest extends AbstractTestingBase { @Test public void verifyMapping() { for (Particle bukkit : Particle.values()) { - Assert.assertNotNull("Missing Bukkit->NMS particle mapping", CraftParticle.toNMS(bukkit)); + Object data = null; + if (bukkit.getDataType().equals(ItemStack.class)) { + data = new ItemStack(Material.STONE); + } else if (bukkit.getDataType() == MaterialData.class) { + data = new MaterialData(Material.LEGACY_STONE); + } else if (bukkit.getDataType() == Particle.DustOptions.class) { + data = new Particle.DustOptions(Color.BLACK, 0); + } else if (bukkit.getDataType() == BlockData.class) { + data = CraftBlockData.newData(Material.STONE, ""); + } + + Assert.assertNotNull("Missing Bukkit->NMS particle mapping for " + bukkit, CraftParticle.toNMS(bukkit, data)); } - for (EnumParticle nms : EnumParticle.values()) { - Assert.assertNotNull("Missing NMS->Bukkit particle mapping", CraftParticle.toBukkit(nms)); + for (net.minecraft.server.Particle nms : (Iterable<net.minecraft.server.Particle<?>>) net.minecraft.server.Particle.REGISTRY) { // Eclipse fail + Assert.assertNotNull("Missing NMS->Bukkit particle mapping for " + nms, CraftParticle.toBukkit(nms)); } } } diff --git a/src/test/java/org/bukkit/PerMaterialTest.java b/src/test/java/org/bukkit/PerMaterialTest.java index ed5242a9..dfa24769 100644 --- a/src/test/java/org/bukkit/PerMaterialTest.java +++ b/src/test/java/org/bukkit/PerMaterialTest.java @@ -43,7 +43,9 @@ public class PerMaterialTest extends AbstractTestingBase { public static List<Object[]> data() { List<Object[]> list = Lists.newArrayList(); for (Material material : Material.values()) { - list.add(new Object[] {material}); + if (!material.isLegacy()) { + list.add(new Object[] {material}); + } } return list; } @@ -51,6 +53,13 @@ public class PerMaterialTest extends AbstractTestingBase { @Parameter public Material material; @Test + public void isBlock() { + if (material != Material.AIR && material != Material.CAVE_AIR && material != Material.VOID_AIR) { + assertThat(material.isBlock(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().isAir()))); + } + } + + @Test public void isSolid() { if (material == Material.AIR) { assertFalse(material.isSolid()); @@ -106,7 +115,7 @@ public class PerMaterialTest extends AbstractTestingBase { if (material == Material.AIR) { assertTrue(material.isTransparent()); } else if (material.isBlock()) { - assertThat(material.isTransparent(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().blocksLight()))); + // assertThat(material.isTransparent(), is(not(CraftMagicNumbers.getBlock(material).getBlockData().getMaterial().blocksLight()))); // PAIL: not unit testable anymore (17w50a) } else { assertFalse(material.isTransparent()); } @@ -164,6 +173,15 @@ public class PerMaterialTest extends AbstractTestingBase { } @Test + public void testDurability() { + if (!material.isBlock()) { + assertThat(material.getMaxDurability(), is((short) CraftMagicNumbers.getItem(material).getMaxDurability())); + } else { + assertThat(material.getMaxDurability(), is((short) 0)); + } + } + + @Test public void testBlock() { if (material == Material.AIR) { assertTrue(material.isBlock()); diff --git a/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java b/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java index e05e7330..055bc426 100644 --- a/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java +++ b/src/test/java/org/bukkit/StatisticsAndAchievementsTest.java @@ -3,10 +3,13 @@ package org.bukkit; import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; -import java.util.List; - +import net.minecraft.server.Block; +import net.minecraft.server.EntityTypes; +import net.minecraft.server.Item; import net.minecraft.server.StatisticList; +import net.minecraft.server.StatisticWrapper; +import org.bukkit.entity.EntityType; import org.bukkit.craftbukkit.CraftStatistic; import org.bukkit.support.AbstractTestingBase; import org.junit.Test; @@ -17,17 +20,38 @@ public class StatisticsAndAchievementsTest extends AbstractTestingBase { @Test @SuppressWarnings("unchecked") + public void verifyEntityMapping() throws Throwable { + for (Statistic statistic : Statistic.values()) { + if (statistic.getType() == Statistic.Type.ENTITY) { + for (EntityType entity : EntityType.values()) { + if (entity.getName() != null) { + assertNotNull(statistic + " missing for " + entity, CraftStatistic.getEntityStatistic(statistic, entity)); + } + } + } + } + } + + @Test + @SuppressWarnings("unchecked") public void verifyStatisticMapping() throws Throwable { HashMultiset<Statistic> statistics = HashMultiset.create(); - for (net.minecraft.server.Statistic statistic : (List<net.minecraft.server.Statistic>) StatisticList.stats) { - String name = statistic.name; - - String message = String.format("org.bukkit.Statistic is missing: '%s'", name); - - Statistic subject = CraftStatistic.getBukkitStatistic(statistic); - assertThat(message, subject, is(not(nullValue()))); - - statistics.add(subject); + for (StatisticWrapper wrapper : (Iterable<StatisticWrapper<?>>) StatisticList.REGISTRY) { // Eclipse fail + for (Object child : wrapper.a()) { + net.minecraft.server.Statistic<?> statistic = wrapper.b(child); + String message = String.format("org.bukkit.Statistic is missing: '%s'", statistic); + + Statistic subject = CraftStatistic.getBukkitStatistic(statistic); + assertThat(message, subject, is(not(nullValue()))); + + if (wrapper.a() == Block.REGISTRY || wrapper.a() == Item.REGISTRY) { + assertNotNull("Material type map missing for " + child, CraftStatistic.getMaterialFromStatistic(statistic)); + } else if (wrapper.a() == EntityTypes.REGISTRY) { + assertNotNull("Entity type map missing for " + EntityTypes.getName((EntityTypes<?>) child), CraftStatistic.getEntityTypeFromStatistic((net.minecraft.server.Statistic<EntityTypes<?>>) statistic)); + } + + statistics.add(subject); + } } for (Statistic statistic : Statistic.values()) { diff --git a/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java b/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java index 225df40a..792e1fc6 100644 --- a/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java +++ b/src/test/java/org/bukkit/craftbukkit/generator/ChunkDataTest.java @@ -1,32 +1,31 @@ package org.bukkit.craftbukkit.generator; -import org.bukkit.DyeColor; import org.bukkit.Material; -import org.bukkit.material.MaterialData; -import org.bukkit.material.Wool; +import org.bukkit.block.data.BlockData; +import org.bukkit.support.AbstractTestingBase; import org.junit.Test; import static org.junit.Assert.*; -public class ChunkDataTest { +public class ChunkDataTest extends AbstractTestingBase { - private static final MaterialData RED_WOOL = new Wool(DyeColor.RED); - private static final MaterialData AIR = new MaterialData(Material.AIR); + private static final BlockData RED_WOOL = Material.RED_WOOL.createBlockData(); + private static final BlockData AIR = Material.AIR.createBlockData(); - private boolean testSetBlock(CraftChunkData data, int x, int y, int z, MaterialData type, MaterialData expected) { + private boolean testSetBlock(CraftChunkData data, int x, int y, int z, BlockData type, BlockData expected) { data.setBlock(x, y, z, type); - return expected.equals(data.getTypeAndData(x, y, z)); + return expected.equals(data.getBlockData(x, y, z)); } - private void testSetRegion(CraftChunkData data, int minx, int miny, int minz, int maxx, int maxy, int maxz, MaterialData type) { + private void testSetRegion(CraftChunkData data, int minx, int miny, int minz, int maxx, int maxy, int maxz, BlockData type) { data.setRegion(minx, miny, minz, maxx, maxy, maxz, type); for (int y = 0; y < data.getMaxHeight(); y++) { for (int z = 0; z < 16; z++) { for (int x = 0; x < 16; x++) { boolean inRegion = miny <= y && y < maxy && minx <= x && x < maxx && minz <= z && z < maxz; - if (inRegion != type.equals(data.getTypeAndData(x, y, z))) { + if (inRegion != type.equals(data.getBlockData(x, y, z))) { throw new IllegalStateException( "setRegion(" + minx + ", " + miny + ", " + minz + ", " + maxx + ", " + maxy + ", " + maxz + ", " + type + ")" - + "-> block at " + x + ", " + y + ", " + z + " is " + data.getTypeAndData(x, y, z)); + + "-> block at " + x + ", " + y + ", " + z + " is " + data.getBlockData(x, y, z)); } } } diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java b/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java index 1349a7f1..2a0791bb 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/CompositeSerialization.java @@ -6,6 +6,7 @@ import static org.hamcrest.Matchers.*; import java.util.ArrayList; import java.util.List; +import org.bukkit.Material; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; @@ -25,23 +26,23 @@ public class CompositeSerialization extends AbstractTestingBase { YamlConfiguration out = getConfig(); List<ItemStack> stacks = new ArrayList<ItemStack>(); - stacks.add(new ItemStack(1)); - stacks.add(new ItemStack(2)); - stacks.add(new ItemStack(3)); - stacks.add(new ItemStack(4, 17)); - stacks.add(new ItemStack(5, 63)); - stacks.add(new ItemStack(6, 1, (short) 1)); - stacks.add(new ItemStack(18, 32, (short) 2)); - - ItemStack item7 = new ItemStack(256); - item7.addUnsafeEnchantment(Enchantment.getById(1), 1); + stacks.add(new ItemStack(Material.STONE)); + stacks.add(new ItemStack(Material.GRASS)); + stacks.add(new ItemStack(Material.DIRT)); + stacks.add(new ItemStack(Material.COBBLESTONE, 17)); + stacks.add(new ItemStack(Material.OAK_PLANKS, 63)); + stacks.add(new ItemStack(Material.OAK_SAPLING, 1, (short) 1)); + stacks.add(new ItemStack(Material.OAK_LEAVES, 32, (short) 2)); + + ItemStack item7 = new ItemStack(Material.IRON_SHOVEL); + item7.addUnsafeEnchantment(Enchantment.PROTECTION_FIRE, 1); stacks.add(item7); - ItemStack item8 = new ItemStack(257); - item8.addUnsafeEnchantment(Enchantment.getById(2), 2); - item8.addUnsafeEnchantment(Enchantment.getById(3), 1); - item8.addUnsafeEnchantment(Enchantment.getById(4), 5); - item8.addUnsafeEnchantment(Enchantment.getById(5), 4); + ItemStack item8 = new ItemStack(Material.IRON_PICKAXE); + item8.addUnsafeEnchantment(Enchantment.PROTECTION_FALL, 2); + item8.addUnsafeEnchantment(Enchantment.PROTECTION_EXPLOSIONS, 1); + item8.addUnsafeEnchantment(Enchantment.PROTECTION_PROJECTILE, 5); + item8.addUnsafeEnchantment(Enchantment.OXYGEN, 4); stacks.add(item8); out.set("composite-list.abc.def", stacks); diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java index f5bcbdbe..18f3e1ff 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemFactoryTest.java @@ -10,7 +10,7 @@ import java.util.HashSet; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import net.minecraft.server.CommandAbstract; +import net.minecraft.server.IAnimal; import net.minecraft.server.IAttribute; import org.bukkit.support.AbstractTestingBase; @@ -20,7 +20,7 @@ public class ItemFactoryTest extends AbstractTestingBase { @Test public void testKnownAttributes() throws Throwable { - final ZipInputStream nmsZipStream = new ZipInputStream(CommandAbstract.class/* Magic class that isn't imported! */.getProtectionDomain().getCodeSource().getLocation().openStream()); + final ZipInputStream nmsZipStream = new ZipInputStream(IAnimal.class/* Magic class that isn't imported! */.getProtectionDomain().getCodeSource().getLocation().openStream()); final Collection<String> names = new HashSet<String>(); for (ZipEntry clazzEntry; (clazzEntry = nmsZipStream.getNextEntry()) != null; ) { final String entryName = clazzEntry.getName(); diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java index 1f537d58..74e37cd9 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemMetaTest.java @@ -3,13 +3,14 @@ package org.bukkit.craftbukkit.inventory; import static org.junit.Assert.*; import static org.hamcrest.Matchers.*; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import net.minecraft.server.Block; import net.minecraft.server.ITileEntity; import net.minecraft.server.Item; import net.minecraft.server.ItemBlock; -import net.minecraft.server.ItemReed; +import net.minecraft.server.ItemBlockWallable; import org.bukkit.Bukkit; import org.bukkit.Color; @@ -26,6 +27,7 @@ import org.bukkit.craftbukkit.inventory.ItemStackTest.BukkitWrapper; import org.bukkit.craftbukkit.inventory.ItemStackTest.CraftWrapper; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.EntityType; +import org.bukkit.entity.TropicalFish; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BannerMeta; import org.bukkit.inventory.meta.BlockStateMeta; @@ -39,6 +41,7 @@ import org.bukkit.inventory.meta.LeatherArmorMeta; import org.bukkit.inventory.meta.MapMeta; import org.bukkit.inventory.meta.PotionMeta; import org.bukkit.inventory.meta.SpawnEggMeta; +import org.bukkit.inventory.meta.TropicalFishBucketMeta; import org.bukkit.potion.PotionEffectType; import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionType; @@ -125,12 +128,12 @@ public class ItemMetaTest extends AbstractTestingBase { } private static FireworkMeta newFireworkMeta() { - return ((FireworkMeta) Bukkit.getItemFactory().getItemMeta(Material.FIREWORK)); + return ((FireworkMeta) Bukkit.getItemFactory().getItemMeta(Material.FIREWORK_ROCKET)); } @Test public void testCrazyEquality() { - CraftItemStack craft = CraftItemStack.asCraftCopy(new ItemStack(1)); + CraftItemStack craft = CraftItemStack.asCraftCopy(new ItemStack(Material.STONE)); craft.setItemMeta(craft.getItemMeta()); ItemStack bukkit = new ItemStack(craft); assertThat(craft, is(bukkit)); @@ -139,21 +142,24 @@ public class ItemMetaTest extends AbstractTestingBase { @Test public void testBlockStateMeta() { - for (Item item : (Iterable<Item>) Item.REGISTRY) { - Block block = null; + List<Block> queue = new ArrayList<>(); + for (Item item : (Iterable<Item>) Item.REGISTRY) { // Eclipse fail if (item instanceof ItemBlock) { - block = ((ItemBlock) item).getBlock(); - } else if (item instanceof ItemReed) { - block = ((ItemReed) item).a; + queue.add(((ItemBlock) item).getBlock()); } + if (item instanceof ItemBlockWallable) { + queue.add(((ItemBlockWallable) item).wallBlock); + } + } + for (Block block : queue) { if (block != null) { if (block instanceof ITileEntity) { ItemStack stack = CraftItemStack.asNewCraftStack(Item.getItemOf(block)); // Command blocks aren't unit testable atm - if (stack.getType() == Material.AIR || stack.getType() == Material.COMMAND || stack.getType() == Material.COMMAND_CHAIN || stack.getType() == Material.COMMAND_REPEATING) { + if (stack.getType() == Material.COMMAND_BLOCK || stack.getType() == Material.CHAIN_COMMAND_BLOCK || stack.getType() == Material.REPEATING_COMMAND_BLOCK) { return; } @@ -172,7 +178,7 @@ public class ItemMetaTest extends AbstractTestingBase { @Test public void testEachExtraData() { final List<StackProvider> providers = Arrays.asList( - new StackProvider(Material.BOOK_AND_QUILL) { + new StackProvider(Material.WRITABLE_BOOK) { @Override ItemStack operate(final ItemStack cleanStack) { final BookMeta meta = (BookMeta) cleanStack.getItemMeta(); meta.setAuthor("Some author"); @@ -202,7 +208,7 @@ public class ItemMetaTest extends AbstractTestingBase { } }, */ - new StackProvider(Material.MAP) { + new StackProvider(Material.FILLED_MAP) { @Override ItemStack operate(final ItemStack cleanStack) { final MapMeta meta = (MapMeta) cleanStack.getItemMeta(); meta.setScaling(true); @@ -227,7 +233,7 @@ public class ItemMetaTest extends AbstractTestingBase { return cleanStack; } }, - new StackProvider(Material.FIREWORK) { + new StackProvider(Material.FIREWORK_ROCKET) { @Override ItemStack operate(final ItemStack cleanStack) { final FireworkMeta meta = (FireworkMeta) cleanStack.getItemMeta(); meta.addEffect(FireworkEffect.builder().withColor(Color.GREEN).withFade(Color.OLIVE).with(Type.BALL_LARGE).build()); @@ -243,7 +249,7 @@ public class ItemMetaTest extends AbstractTestingBase { return cleanStack; } }, - new StackProvider(Material.FIREWORK_CHARGE) { + new StackProvider(Material.FIREWORK_STAR) { @Override ItemStack operate(final ItemStack cleanStack) { final FireworkEffectMeta meta = (FireworkEffectMeta) cleanStack.getItemMeta(); meta.setEffect(FireworkEffect.builder().withColor(Color.MAROON, Color.BLACK).with(Type.CREEPER).withFlicker().build()); @@ -251,7 +257,7 @@ public class ItemMetaTest extends AbstractTestingBase { return cleanStack; } }, - new StackProvider(Material.BANNER) { + new StackProvider(Material.WHITE_BANNER) { @Override ItemStack operate(ItemStack cleanStack) { final BannerMeta meta = (BannerMeta) cleanStack.getItemMeta(); meta.setBaseColor(DyeColor.CYAN); @@ -259,26 +265,38 @@ public class ItemMetaTest extends AbstractTestingBase { cleanStack.setItemMeta(meta); return cleanStack; } - }, - new StackProvider(Material.MONSTER_EGG) { + }, + /* No distinguishing features, add back with virtual entity API + new StackProvider(Material.ZOMBIE_SPAWN_EGG) { @Override ItemStack operate(ItemStack cleanStack) { final SpawnEggMeta meta = (SpawnEggMeta) cleanStack.getItemMeta(); meta.setSpawnedType(EntityType.ZOMBIE); cleanStack.setItemMeta(meta); return cleanStack; - } - }, - new StackProvider(Material.KNOWLEDGE_BOOK) { + } + }, + */ + new StackProvider(Material.KNOWLEDGE_BOOK) { @Override ItemStack operate(ItemStack cleanStack) { final KnowledgeBookMeta meta = (KnowledgeBookMeta) cleanStack.getItemMeta(); meta.addRecipe(new NamespacedKey("minecraft", "test"), new NamespacedKey("plugin", "test")); cleanStack.setItemMeta(meta); return cleanStack; } + }, + new StackProvider(Material.TROPICAL_FISH_BUCKET) { + @Override ItemStack operate(ItemStack cleanStack) { + final TropicalFishBucketMeta meta = (TropicalFishBucketMeta) cleanStack.getItemMeta(); + meta.setBodyColor(DyeColor.ORANGE); + meta.setPatternColor(DyeColor.BLACK); + meta.setPattern(TropicalFish.Pattern.DASHER); + cleanStack.setItemMeta(meta); + return cleanStack; + } } ); - assertThat("Forgotten test?", providers, hasSize(ItemStackTest.COMPOUND_MATERIALS.length - 3/* Normal item meta, skulls and tile entities */)); + assertThat("Forgotten test?", providers, hasSize(ItemStackTest.COMPOUND_MATERIALS.length - 4/* Normal item meta, skulls, eggs and tile entities */)); for (final StackProvider provider : providers) { downCastTest(new BukkitWrapper(provider)); @@ -288,7 +306,7 @@ public class ItemMetaTest extends AbstractTestingBase { private void downCastTest(final StackWrapper provider) { final String name = provider.toString(); - final ItemStack blank = new ItemStack(1); + final ItemStack blank = new ItemStack(Material.STONE); final ItemStack craftBlank = CraftItemStack.asCraftCopy(blank); downCastTest(name, provider.stack(), blank); @@ -304,7 +322,7 @@ public class ItemMetaTest extends AbstractTestingBase { assertThat(name, stack, is(not(blank))); assertThat(name, stack.getItemMeta(), is(not(blank.getItemMeta()))); - stack.setTypeId(1); + stack.setType(Material.STONE); assertThat(name, stack, is(blank)); } diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java index a7edc048..c16c5611 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackBookTest.java @@ -17,7 +17,7 @@ public class ItemStackBookTest extends ItemStackTest { @Parameters(name="[{index}]:{" + NAME_PARAMETER + "}") public static List<Object[]> data() { - return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.WRITTEN_BOOK, Material.BOOK_AND_QUILL); + return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.WRITTEN_BOOK, Material.WRITABLE_BOOK); } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java index cb38cd27..fbfce58c 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkChargeTest.java @@ -20,7 +20,7 @@ public class ItemStackFireworkChargeTest extends ItemStackTest { @Parameters(name="[{index}]:{" + NAME_PARAMETER + "}") public static List<Object[]> data() { - return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_CHARGE); + return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_STAR); } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java index 40b1d19d..55e6629b 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackFireworkTest.java @@ -20,7 +20,7 @@ public class ItemStackFireworkTest extends ItemStackTest { @Parameters(name="[{index}]:{" + NAME_PARAMETER + "}") public static List<Object[]> data() { - return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK); + return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FIREWORK_ROCKET); } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java index 9c499858..c13f6d57 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackMapTest.java @@ -17,7 +17,7 @@ public class ItemStackMapTest extends ItemStackTest { @Parameters(name="[{index}]:{" + NAME_PARAMETER + "}") public static List<Object[]> data() { - return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.MAP); + return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.FILLED_MAP); } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java index a79d443e..1561bf88 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/ItemStackSkullTest.java @@ -17,7 +17,7 @@ public class ItemStackSkullTest extends ItemStackTest { @Parameters(name="[{index}]:{" + NAME_PARAMETER + "}") public static List<Object[]> data() { - return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.SKULL_ITEM); + return StackProvider.compound(operators(), "%s %s", NAME_PARAMETER, Material.PLAYER_HEAD); } @SuppressWarnings("unchecked") diff --git a/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java b/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java index 1f5a6a32..5a43fd86 100644 --- a/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java +++ b/src/test/java/org/bukkit/craftbukkit/inventory/NMSCraftItemStackTest.java @@ -21,7 +21,6 @@ public class NMSCraftItemStackTest extends AbstractTestingBase { assertThat(clone.getAmount(), is(itemStack.getAmount())); assertThat(clone.getDurability(), is(itemStack.getDurability())); assertThat(clone.getEnchantments(), is(itemStack.getEnchantments())); - assertThat(clone.getTypeId(), is(itemStack.getTypeId())); assertThat(clone.getData(), is(itemStack.getData())); assertThat(clone, is(itemStack)); } diff --git a/src/test/java/org/bukkit/entity/EntityTypesTest.java b/src/test/java/org/bukkit/entity/EntityTypesTest.java new file mode 100644 index 00000000..d8c3b013 --- /dev/null +++ b/src/test/java/org/bukkit/entity/EntityTypesTest.java @@ -0,0 +1,29 @@ +package org.bukkit.entity; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; +import net.minecraft.server.EntityTypes; +import net.minecraft.server.MinecraftKey; +import org.junit.Assert; +import org.junit.Test; + +public class EntityTypesTest { + + @Test + public void testMaps() { + Set<EntityType> allBukkit = Arrays.stream(EntityType.values()).filter((b) -> b.getName() != null).collect(Collectors.toSet()); + + for (Object o : EntityTypes.REGISTRY) { + EntityTypes<?> nms = (EntityTypes<?>) o; // Eclipse fail + MinecraftKey key = EntityTypes.getName(nms); + + EntityType bukkit = EntityType.fromName(key.getKey()); + Assert.assertNotNull("Missing nms->bukkit " + key, bukkit); + + Assert.assertTrue("Duplicate entity nms->" + bukkit, allBukkit.remove(bukkit)); + } + + Assert.assertTrue("Unmapped bukkit entities " + allBukkit, allBukkit.isEmpty()); + } +} diff --git a/src/test/java/org/bukkit/entity/TropicalFishTest.java b/src/test/java/org/bukkit/entity/TropicalFishTest.java new file mode 100644 index 00000000..63ddb467 --- /dev/null +++ b/src/test/java/org/bukkit/entity/TropicalFishTest.java @@ -0,0 +1,45 @@ +package org.bukkit.entity; + +import static org.junit.Assert.*; +import static org.hamcrest.Matchers.*; +import org.bukkit.DyeColor; +import org.bukkit.craftbukkit.entity.CraftTropicalFish; +import org.bukkit.entity.TropicalFish.Pattern; + +import org.junit.Test; + +public class TropicalFishTest { + + @Test + public void testVariants() { + testVariant(65536, DyeColor.ORANGE, DyeColor.WHITE, Pattern.KOB); + testVariant(917504, DyeColor.RED, DyeColor.WHITE, Pattern.KOB); + testVariant(918273, DyeColor.RED, DyeColor.WHITE, Pattern.BLOCKFISH); + testVariant(918529, DyeColor.RED, DyeColor.WHITE, Pattern.BETTY); + testVariant(16778497, DyeColor.WHITE, DyeColor.ORANGE, Pattern.CLAYFISH); + testVariant(50660352, DyeColor.LIME, DyeColor.LIGHT_BLUE, Pattern.BRINELY); + testVariant(50726144, DyeColor.PINK, DyeColor.LIGHT_BLUE, Pattern.SPOTTY); + testVariant(50790656, DyeColor.GRAY, DyeColor.LIGHT_BLUE, Pattern.SUNSTREAK); + testVariant(67108865, DyeColor.WHITE, DyeColor.YELLOW, Pattern.FLOPPER); + testVariant(67110144, DyeColor.WHITE, DyeColor.YELLOW, Pattern.SPOTTY); + testVariant(67371265, DyeColor.YELLOW, DyeColor.YELLOW, Pattern.STRIPEY); + testVariant(67764993, DyeColor.PURPLE, DyeColor.YELLOW, Pattern.BLOCKFISH); + testVariant(101253888, DyeColor.CYAN, DyeColor.PINK, Pattern.DASHER); + testVariant(117441025, DyeColor.WHITE, DyeColor.GRAY, Pattern.GLITTER); + testVariant(117441280, DyeColor.WHITE, DyeColor.GRAY, Pattern.DASHER); + testVariant(117441536, DyeColor.WHITE, DyeColor.GRAY, Pattern.BRINELY); + testVariant(117506305, DyeColor.ORANGE, DyeColor.GRAY, Pattern.STRIPEY); + testVariant(117899265, DyeColor.GRAY, DyeColor.GRAY, Pattern.FLOPPER); + testVariant(118161664, DyeColor.BLUE, DyeColor.GRAY, Pattern.SUNSTREAK); + testVariant(134217984, DyeColor.WHITE, DyeColor.SILVER, Pattern.SUNSTREAK); + testVariant(234882305, DyeColor.WHITE, DyeColor.RED, Pattern.CLAYFISH); + testVariant(235340288, DyeColor.GRAY, DyeColor.RED, Pattern.SNOOPER); + } + + private void testVariant(int variant, DyeColor bodyColor, DyeColor patternColor, Pattern pattern) { + assertThat("variant write", CraftTropicalFish.getData(patternColor, bodyColor, pattern), is(variant)); + assertThat("pattern colour read", CraftTropicalFish.getPatternColor(variant), is(patternColor)); + assertThat("body colour read", CraftTropicalFish.getBodyColor(variant), is(bodyColor)); + assertThat("pattern read", CraftTropicalFish.getPattern(variant), is(pattern)); + } +} diff --git a/src/test/java/org/bukkit/map/MapTest.java b/src/test/java/org/bukkit/map/MapTest.java index f4788a18..2dde26d3 100644 --- a/src/test/java/org/bukkit/map/MapTest.java +++ b/src/test/java/org/bukkit/map/MapTest.java @@ -24,7 +24,7 @@ public class MapTest { if (nmsColors[i] == null) { break; } - int rgb = nmsColors[i].ac; + int rgb = nmsColors[i].rgb; int r = (rgb >> 16) & 0xFF; int g = (rgb >> 8) & 0xFF; diff --git a/src/test/java/org/bukkit/potion/PotionTest.java b/src/test/java/org/bukkit/potion/PotionTest.java index e46429a5..74ed926f 100644 --- a/src/test/java/org/bukkit/potion/PotionTest.java +++ b/src/test/java/org/bukkit/potion/PotionTest.java @@ -30,6 +30,6 @@ public class PotionTest extends AbstractTestingBase { effects.put(enumType, enumType.name()); } - assertEquals(effects.entrySet().size(), PotionType.values().length - /* PotionTypes with no Effects */ 5); + assertEquals(effects.entrySet().size(), PotionType.values().length - /* PotionTypes with no/shared Effects */ 6); } } diff --git a/src/test/java/org/bukkit/support/AbstractTestingBase.java b/src/test/java/org/bukkit/support/AbstractTestingBase.java index 86c2b971..6266dc32 100644 --- a/src/test/java/org/bukkit/support/AbstractTestingBase.java +++ b/src/test/java/org/bukkit/support/AbstractTestingBase.java @@ -1,10 +1,16 @@ package org.bukkit.support; import com.google.common.collect.ImmutableList; +import java.util.Collections; import java.util.List; import net.minecraft.server.DispenserRegistry; +import net.minecraft.server.EnumResourcePackType; +import net.minecraft.server.ResourceManager; +import net.minecraft.server.ResourcePackVanilla; +import net.minecraft.server.TagRegistry; import org.bukkit.Material; -import org.junit.BeforeClass; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.junit.Assert; /** * If you are getting: java.lang.ExceptionInInitializerError @@ -15,67 +21,28 @@ import org.junit.BeforeClass; * extend this class to solve it. */ public abstract class AbstractTestingBase { - public static final List<Material> INVALIDATED_MATERIALS = ImmutableList.<Material>builder() - .add( - Material.BREWING_STAND, - Material.BED_BLOCK, - Material.NETHER_WARTS, - Material.CAULDRON, - Material.FLOWER_POT, - Material.CROPS, - Material.SUGAR_CANE_BLOCK, - Material.CAKE_BLOCK, - Material.SKULL, - Material.PISTON_EXTENSION, - Material.PISTON_MOVING_PIECE, - Material.GLOWING_REDSTONE_ORE, - Material.DIODE_BLOCK_ON, - Material.PUMPKIN_STEM, - Material.SIGN_POST, - Material.REDSTONE_COMPARATOR_ON, - Material.TRIPWIRE, - Material.REDSTONE_LAMP_ON, - Material.MELON_STEM, - Material.REDSTONE_TORCH_OFF, - Material.REDSTONE_COMPARATOR_OFF, - Material.REDSTONE_WIRE, - Material.WALL_SIGN, - Material.DIODE_BLOCK_OFF, - Material.IRON_DOOR_BLOCK, - Material.WOODEN_DOOR, - Material.WATER, - Material.STATIONARY_WATER, - Material.LAVA, - Material.STATIONARY_LAVA, - Material.DOUBLE_STEP, - Material.DOUBLE_STEP, - Material.FIRE, - Material.PORTAL, - Material.ENDER_PORTAL, - Material.WOOD_DOUBLE_STEP, - Material.COCOA, - Material.CARROT, - Material.POTATO, - Material.STANDING_BANNER, - Material.WALL_BANNER, - Material.DAYLIGHT_DETECTOR_INVERTED, - Material.DOUBLE_STONE_SLAB2, - Material.SPRUCE_DOOR, - Material.BIRCH_DOOR, - Material.JUNGLE_DOOR, - Material.ACACIA_DOOR, - Material.DARK_OAK_DOOR, - Material.PURPUR_DOUBLE_SLAB, - Material.BEETROOT_BLOCK, - Material.END_GATEWAY, - Material.BURNING_FURNACE, - Material.FROSTED_ICE - ).build(); + // Materials that only exist in block form (or are legacy) + public static final List<Material> INVALIDATED_MATERIALS; - @BeforeClass - public static void setup() { + static { DispenserRegistry.c(); + // Set up resource manager + ResourceManager resourceManager = new ResourceManager(EnumResourcePackType.SERVER_DATA); + // add tags for unit tests + resourceManager.a(new TagRegistry()); + // Register vanilla pack + resourceManager.a(Collections.singletonList(new ResourcePackVanilla("minecraft"))); + DummyServer.setup(); DummyEnchantments.setup(); + + ImmutableList.Builder<Material> builder = ImmutableList.builder(); + for (Material m : Material.values()) { + if (m.isLegacy() || CraftMagicNumbers.getItem(m) == null) { + builder.add(m); + } + } + INVALIDATED_MATERIALS = builder.build(); + Assert.assertTrue("Expected 533 invalidated materials (got " + INVALIDATED_MATERIALS.size() + ")", INVALIDATED_MATERIALS.size() == 533); } -}
\ No newline at end of file +} diff --git a/src/test/java/org/bukkit/support/DummyServer.java b/src/test/java/org/bukkit/support/DummyServer.java index e5215bb4..a6e7651a 100644 --- a/src/test/java/org/bukkit/support/DummyServer.java +++ b/src/test/java/org/bukkit/support/DummyServer.java @@ -7,8 +7,11 @@ import java.util.HashMap; import java.util.logging.Logger;
import org.bukkit.Bukkit;
+import org.bukkit.Material;
import org.bukkit.Server;
+import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.craftbukkit.inventory.CraftItemFactory;
+import org.bukkit.craftbukkit.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.util.Versioning;
public class DummyServer implements InvocationHandler {
@@ -59,6 +62,23 @@ public class DummyServer implements InvocationHandler { }
}
);
+ methods.put(
+ Server.class.getMethod("getUnsafe"),
+ new MethodHandler() {
+ public Object handle(DummyServer server, Object[] args) {
+ return CraftMagicNumbers.INSTANCE;
+ }
+ }
+ );
+ methods.put(
+ Server.class.getMethod("createBlockData", Material.class),
+ new MethodHandler() {
+ final Logger logger = Logger.getLogger(DummyServer.class.getCanonicalName());
+ public Object handle(DummyServer server, Object[] args) {
+ return CraftBlockData.newData((Material) args[0], null);
+ }
+ }
+ );
Bukkit.setServer(Proxy.getProxyClass(Server.class.getClassLoader(), Server.class).asSubclass(Server.class).getConstructor(InvocationHandler.class).newInstance(new DummyServer()));
} catch (Throwable t) {
throw new Error(t);
|