SPIGOT-2679: Add meta for StructureBlock

This commit is contained in:
md_5 2016-09-18 09:58:54 +10:00
parent 75a8885d1f
commit 6af9f5b84a
5 changed files with 42 additions and 5 deletions

View File

@ -304,6 +304,8 @@ public class CraftBlock implements Block {
return new CraftBanner(this);
case FLOWER_POT:
return new CraftFlowerPot(this);
case STRUCTURE_BLOCK:
return new CraftStructureBlock(this);
default:
return new CraftBlockState(this);
}

View File

@ -0,0 +1,23 @@
package org.bukkit.craftbukkit.block;
import net.minecraft.server.TileEntityStructure;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.CraftWorld;
public class CraftStructureBlock extends CraftBlockState {
private final TileEntityStructure structure;
public CraftStructureBlock(Block block) {
super(block);
this.structure = (TileEntityStructure) ((CraftWorld) block.getWorld()).getTileEntityAt(getX(), getY(), getZ());
}
public CraftStructureBlock(Material material, TileEntityStructure structure) {
super(material);
this.structure = structure;
}
}

View File

@ -113,6 +113,7 @@ public final class CraftItemFactory implements ItemFactory {
case REDSTONE_COMPARATOR:
case FLOWER_POT_ITEM:
case SHIELD:
case STRUCTURE_BLOCK:
return new CraftMetaBlockState(meta, material);
default:
return new CraftMetaItem(meta);

View File

@ -374,6 +374,7 @@ public final class CraftItemStack extends ItemStack {
case REDSTONE_COMPARATOR:
case FLOWER_POT_ITEM:
case SHIELD:
case STRUCTURE_BLOCK:
return new CraftMetaBlockState(item.getTag(), CraftMagicNumbers.getMaterial(item.getItem()));
default:
return new CraftMetaItem(item.getTag());

View File

@ -4,7 +4,6 @@ import com.google.common.base.Objects;
import com.google.common.collect.ImmutableMap;
import java.util.Map;
import net.minecraft.server.BlockJukeBox;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.NBTBase;
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.TileEntity;
@ -23,6 +22,7 @@ import net.minecraft.server.TileEntityMobSpawner;
import net.minecraft.server.TileEntityNote;
import net.minecraft.server.TileEntitySign;
import net.minecraft.server.TileEntitySkull;
import net.minecraft.server.TileEntityStructure;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.bukkit.block.BlockState;
@ -44,14 +44,15 @@ import org.bukkit.craftbukkit.block.CraftJukebox;
import org.bukkit.craftbukkit.block.CraftNoteBlock;
import org.bukkit.craftbukkit.block.CraftSign;
import org.bukkit.craftbukkit.block.CraftSkull;
import org.bukkit.craftbukkit.block.CraftStructureBlock;
import org.bukkit.inventory.meta.BlockStateMeta;
@DelegateDeserialization(CraftMetaItem.SerializableMeta.class)
public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta {
@ItemMetaKey.Specific(ItemMetaKey.Specific.To.NBT)
static final ItemMetaKey BLOCK_ENTITY_TAG = new ItemMetaKey("BlockEntityTag");
final Material material;
NBTTagCompound blockEntityTag;
@ -72,7 +73,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
CraftMetaBlockState(NBTTagCompound tag, Material material) {
super(tag);
this.material = material;
if (tag.hasKeyOfType(BLOCK_ENTITY_TAG.NBT, 10)) {
blockEntityTag = tag.getCompound(BLOCK_ENTITY_TAG.NBT);
} else {
@ -94,7 +95,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
@Override
void applyToItem(NBTTagCompound tag) {
super.applyToItem(tag);
if (blockEntityTag != null) {
tag.set(BLOCK_ENTITY_TAG.NBT, blockEntityTag);
}
@ -179,6 +180,7 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case REDSTONE_COMPARATOR:
case FLOWER_POT_ITEM:
case SHIELD:
case STRUCTURE_BLOCK:
return true;
}
return false;
@ -286,6 +288,11 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
te = new TileEntityFlowerPot();
}
return new CraftFlowerPot(material, (TileEntityFlowerPot) te);
case STRUCTURE_BLOCK:
if (te == null) {
te = new TileEntityStructure();
}
return new CraftStructureBlock(material, (TileEntityStructure) te);
default:
throw new IllegalStateException("Missing blockState for " + material);
}
@ -356,6 +363,9 @@ public class CraftMetaBlockState extends CraftMetaItem implements BlockStateMeta
case FLOWER_POT_ITEM:
valid = te instanceof TileEntityFlowerPot;
break;
case STRUCTURE_BLOCK:
valid = te instanceof TileEntityStructure;
break;
default:
valid = false;
break;