Fixed a few more errors, and added legacy support to the item parser.

This commit is contained in:
Matthew Miller 2018-07-24 17:12:50 +10:00
parent bc2279f2f6
commit 965e977411
13 changed files with 56 additions and 101 deletions

View File

@ -78,7 +78,7 @@ public class LazyBlock extends BaseBlock {
public CompoundTag getNbtData() { public CompoundTag getNbtData() {
if (!loaded) { if (!loaded) {
BaseBlock loadedBlock = extent.getFullBlock(position); BaseBlock loadedBlock = extent.getFullBlock(position);
super.setNbtData(loadedBlock.getNbtData()); this.nbtData = loadedBlock.getNbtData();
loaded = true; loaded = true;
} }
return super.getNbtData(); return super.getNbtData();

View File

@ -52,8 +52,7 @@ import javax.annotation.Nullable;
public class BaseBlock implements BlockStateHolder<BaseBlock>, TileEntityBlock { public class BaseBlock implements BlockStateHolder<BaseBlock>, TileEntityBlock {
private BlockState blockState; private BlockState blockState;
@Nullable @Nullable CompoundTag nbtData;
private CompoundTag nbtData;
/** /**
* Construct a block with a state. * Construct a block with a state.

View File

@ -20,10 +20,8 @@
package com.sk89q.worldedit.blocks; package com.sk89q.worldedit.blocks;
import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes;
import com.sk89q.worldedit.world.NbtValued; import com.sk89q.worldedit.world.NbtValued;
import com.sk89q.worldedit.world.registry.LegacyMapper; import com.sk89q.worldedit.world.item.ItemType;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -39,20 +37,6 @@ public class BaseItem implements NbtValued {
@Nullable @Nullable
private CompoundTag nbtData; private CompoundTag nbtData;
/**
* Construct the object.
*
* @param id ID of the item
*/
@Deprecated
public BaseItem(int id) {
ItemType type = LegacyMapper.getInstance().getItemFromLegacy(id);
if (type == null) {
type = ItemTypes.AIR;
}
this.itemType = type;
}
/** /**
* Construct the object. * Construct the object.
* *
@ -73,16 +57,6 @@ public class BaseItem implements NbtValued {
this.nbtData = tag; this.nbtData = tag;
} }
/**
* Get the type of item.
*
* @return the id
*/
@Deprecated
public int getLegacyId() {
return this.itemType.getLegacyId();
}
/** /**
* Get the type of item. * Get the type of item.
* *

View File

@ -31,16 +31,6 @@ public class BaseItemStack extends BaseItem {
private int amount = 1; private int amount = 1;
/**
* Construct the object with default stack size of one, with data value of 0.
*
* @param id with data value of 0.
*/
@Deprecated
public BaseItemStack(int id) {
super(id);
}
/** /**
* Construct the object with default stack size of one, with damage value of 0. * Construct the object with default stack size of one, with damage value of 0.
* *
@ -50,18 +40,6 @@ public class BaseItemStack extends BaseItem {
super(itemType); super(itemType);
} }
/**
* Construct the object.
*
* @param id type ID
* @param amount amount in the stack
*/
@Deprecated
public BaseItemStack(int id, int amount) {
super(id);
this.amount = amount;
}
/** /**
* Construct the object. * Construct the object.
* *
@ -73,19 +51,6 @@ public class BaseItemStack extends BaseItem {
this.amount = amount; this.amount = amount;
} }
/**
* Construct the object.
*
* @param id type ID
* @param amount amount in the stack
* @param data data value
*/
@Deprecated
public BaseItemStack(int id, int amount, short data) {
super(id);
this.amount = amount;
}
/** /**
* Construct the object. * Construct the object.
* *

View File

@ -25,6 +25,8 @@ import com.sk89q.worldedit.extension.input.InputParseException;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
import com.sk89q.worldedit.extension.platform.Capability; import com.sk89q.worldedit.extension.platform.Capability;
import com.sk89q.worldedit.internal.registry.InputParser; import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.registry.LegacyMapper;
public class DefaultItemParser extends InputParser<BaseItem> { public class DefaultItemParser extends InputParser<BaseItem> {
@ -34,8 +36,26 @@ public class DefaultItemParser extends InputParser<BaseItem> {
@Override @Override
public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException { public BaseItem parseFromInput(String input, ParserContext context) throws InputParseException {
BaseItem item = WorldEdit.getInstance().getPlatformManager() BaseItem item = null;
.queryCapability(Capability.GAME_HOOKS).getRegistries().getItemRegistry().createFromId(input); // Legacy matcher
if (context.isTryingLegacy()) {
try {
String[] split = input.split(":");
ItemType type;
if (split.length == 1) {
type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]));
} else {
type = LegacyMapper.getInstance().getItemFromLegacy(Integer.parseInt(split[0]), Integer.parseInt(split[1]));
}
item = new BaseItem(type);
} catch (NumberFormatException e) {
}
}
if (item == null) {
item = WorldEdit.getInstance().getPlatformManager()
.queryCapability(Capability.GAME_HOOKS).getRegistries().getItemRegistry().createFromId(input);
}
if (item == null) { if (item == null) {
throw new InputParseException("'" + input + "' did not match any item"); throw new InputParseException("'" + input + "' did not match any item");

View File

@ -42,7 +42,9 @@ import com.sk89q.worldedit.extent.clipboard.io.legacycompat.SignCompatibilityHan
import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.Location;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.entity.EntityTypes; import com.sk89q.worldedit.world.entity.EntityTypes;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import com.sk89q.worldedit.world.storage.NBTConversions; import com.sk89q.worldedit.world.storage.NBTConversions;
import java.io.IOException; import java.io.IOException;
@ -196,7 +198,7 @@ public class SchematicReader implements ClipboardReader {
} }
int index = y * width * length + z * width + x; int index = y * width * length + z * width + x;
BaseBlock block = new BaseBlock(blocks[index], blockData[index]); BlockState block = LegacyMapper.getInstance().getBlockFromLegacy(blocks[index], blockData[index]);
for (NBTCompatibilityHandler handler : COMPATIBILITY_HANDLERS) { for (NBTCompatibilityHandler handler : COMPATIBILITY_HANDLERS) {
if (handler.isAffectedBlock(block)) { if (handler.isAffectedBlock(block)) {
handler.updateNBT(block, values); handler.updateNBT(block, values);
@ -218,14 +220,14 @@ public class SchematicReader implements ClipboardReader {
for (int z = 0; z < length; ++z) { for (int z = 0; z < length; ++z) {
int index = y * width * length + z * width + x; int index = y * width * length + z * width + x;
BlockVector pt = new BlockVector(x, y, z); BlockVector pt = new BlockVector(x, y, z);
BaseBlock block = new BaseBlock(blocks[index], blockData[index]); BlockState state = LegacyMapper.getInstance().getBlockFromLegacy(blocks[index], blockData[index]);
if (tileEntitiesMap.containsKey(pt)) {
block.setNbtData(new CompoundTag(tileEntitiesMap.get(pt)));
}
try { try {
clipboard.setBlock(region.getMinimumPoint().add(pt), block); if (tileEntitiesMap.containsKey(pt)) {
clipboard.setBlock(region.getMinimumPoint().add(pt), new BaseBlock(state, new CompoundTag(tileEntitiesMap.get(pt))));
} else {
clipboard.setBlock(region.getMinimumPoint().add(pt), state);
}
} catch (WorldEditException e) { } catch (WorldEditException e) {
switch (failedBlockSets) { switch (failedBlockSets) {
case 0: case 0:

View File

@ -21,10 +21,11 @@ package com.sk89q.worldedit.extent.clipboard.io.legacycompat;
import com.sk89q.jnbt.Tag; import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import java.util.Map; import java.util.Map;
public interface NBTCompatibilityHandler { public interface NBTCompatibilityHandler {
boolean isAffectedBlock(BaseBlock block); boolean isAffectedBlock(BlockStateHolder block);
void updateNBT(BaseBlock block, Map<String, Tag> values); void updateNBT(BlockStateHolder block, Map<String, Tag> values);
} }

View File

@ -27,18 +27,19 @@ import com.google.gson.JsonSyntaxException;
import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.StringTag;
import com.sk89q.jnbt.Tag; import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.world.block.BlockStateHolder;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import java.util.Map; import java.util.Map;
public class SignCompatibilityHandler implements NBTCompatibilityHandler { public class SignCompatibilityHandler implements NBTCompatibilityHandler {
@Override @Override
public boolean isAffectedBlock(BaseBlock block) { public boolean isAffectedBlock(BlockStateHolder block) {
return block.getBlockType() == BlockTypes.SIGN || block.getBlockType() == BlockTypes.WALL_SIGN; return block.getBlockType() == BlockTypes.SIGN || block.getBlockType() == BlockTypes.WALL_SIGN;
} }
@Override @Override
public void updateNBT(BaseBlock block, Map<String, Tag> values) { public void updateNBT(BlockStateHolder block, Map<String, Tag> values) {
for (int i = 0; i < 4; ++i) { for (int i = 0; i < 4; ++i) {
String key = "Text" + (i + 1); String key = "Text" + (i + 1);
Tag value = values.get(key); Tag value = values.get(key);

View File

@ -36,7 +36,7 @@ public interface NbtValued {
* *
* @return true if there is NBT data * @return true if there is NBT data
*/ */
public boolean hasNbtData(); boolean hasNbtData();
/** /**
* Get the object's NBT data (tile entity data). The returned tag, if * Get the object's NBT data (tile entity data). The returned tag, if

View File

@ -29,16 +29,18 @@ import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.blocks.TileEntityBlock;
import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.DataException;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import com.sk89q.worldedit.world.storage.InvalidFormatException; import com.sk89q.worldedit.world.storage.InvalidFormatException;
import javax.annotation.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
public class AnvilChunk implements Chunk { public class AnvilChunk implements Chunk {
private CompoundTag rootTag; private CompoundTag rootTag;
@ -256,16 +258,11 @@ public class AnvilChunk implements Chunk {
public BaseBlock getBlock(Vector position) throws DataException { public BaseBlock getBlock(Vector position) throws DataException {
int id = getBlockID(position); int id = getBlockID(position);
int data = getBlockData(position); int data = getBlockData(position);
BaseBlock block;
block = new BaseBlock(id, data);
BlockState state = LegacyMapper.getInstance().getBlockFromLegacy(id, data);
CompoundTag tileEntity = getBlockTileEntity(position); CompoundTag tileEntity = getBlockTileEntity(position);
if (tileEntity != null) {
((TileEntityBlock) block).setNbtData(tileEntity);
}
return block; return new BaseBlock(state, tileEntity);
} }
} }

View File

@ -28,9 +28,11 @@ import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector; import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.world.block.BlockState;
import com.sk89q.worldedit.world.block.BlockTypes; import com.sk89q.worldedit.world.block.BlockTypes;
import com.sk89q.worldedit.world.DataException; import com.sk89q.worldedit.world.DataException;
import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.registry.LegacyMapper;
import com.sk89q.worldedit.world.storage.InvalidFormatException; import com.sk89q.worldedit.world.storage.InvalidFormatException;
import java.util.HashMap; import java.util.HashMap;
@ -178,14 +180,10 @@ public class OldChunk implements Chunk {
throw new DataException("Chunk does not contain position " + position); throw new DataException("Chunk does not contain position " + position);
} }
BaseBlock block = new BaseBlock(id, dataVal); BlockState state = LegacyMapper.getInstance().getBlockFromLegacy(id, dataVal);
CompoundTag tileEntity = getBlockTileEntity(position); CompoundTag tileEntity = getBlockTileEntity(position);
if (tileEntity != null) {
block.setNbtData(tileEntity);
}
return block; return new BaseBlock(state, tileEntity);
} }
} }

View File

@ -20,6 +20,7 @@
package com.sk89q.worldedit.world.registry; package com.sk89q.worldedit.world.registry;
import com.sk89q.worldedit.blocks.BaseItem; import com.sk89q.worldedit.blocks.BaseItem;
import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.item.ItemTypes;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -33,6 +34,7 @@ public class BundledItemRegistry implements ItemRegistry {
@Nullable @Nullable
@Override @Override
public BaseItem createFromId(String id) { public BaseItem createFromId(String id) {
return new BaseItem(ItemTypes.get(id)); ItemType itemType = ItemTypes.get(id);
return itemType == null ? null : new BaseItem(itemType);
} }
} }

View File

@ -30,13 +30,14 @@ import com.sk89q.worldedit.world.chunk.AnvilChunk;
import com.sk89q.worldedit.world.chunk.Chunk; import com.sk89q.worldedit.world.chunk.Chunk;
import com.sk89q.worldedit.world.chunk.OldChunk; import com.sk89q.worldedit.world.chunk.OldChunk;
import java.io.Closeable;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
/** /**
* Represents chunk storage mechanisms. * Represents chunk storage mechanisms.
*/ */
public abstract class ChunkStore { public abstract class ChunkStore implements Closeable {
/** /**
* >> to chunk * >> to chunk
@ -86,11 +87,6 @@ public abstract class ChunkStore {
return new OldChunk(world, tag); return new OldChunk(world, tag);
} }
/**
* Close resources.
*
* @throws IOException on I/O error
*/
public void close() throws IOException { public void close() throws IOException {
} }