mirror of
https://github.com/plexusorg/Plex-FAWE.git
synced 2025-07-04 03:56:41 +00:00
Feature/1.17 (#1120)
* start v6 * Update classes to v6 method signatures * change rootVersion to signify p2v6 compat * Use 16 as toolchain version but target 11 for build output * add minimessage as api * Require v6 and don't attempt to "setup" hook from FAWE * Address comments * *address /all/ comments * FAWE classes should only act as a delegate * Uppercase logger * Settings for v6-hook have moved to P2-v6, remove unneeded if statements * Rename classes to Delegate * add whenDone task to setCuboids * Remove bad spaces * Fix plot swap * Initial work on 1.17 support * Remove data versions from the Bukkit adapters (#1507) * Remove data versions from the Bukkit adapters * Don't allow saving schematics without an adapter in place on Bukkit. * Removed confusing line (cherry picked from commit 2056218b4a8644836b1d127105dfa289e9cdbc1c) * More progress * Fix chunk sending * Repackage from com.boydti to com.fastasyncworldedit.<module> (#1119) * Preliminary work on repackaging * Rename build artifacts matching our pattern * Finish up repackaging * Fix a few field accesses and old imports * Dirty fix for chunks container ChunkSections outside of 0-15 * Correctly read from NibbleArrays for lighting * Fix getSections and BlockMaterial for 1.17 * Fix writing blocks to the world. - The issue isn't the presence of a "-1" chunk, it's the constructor for ChunkSection requiring the layer (0 to 15) rather than the y chord * Fix more field accesses * More work towards 1.17 * Update Upstream a57f66f Fix watchdog, add negative y support. (1782) * Add azalea tree to `/tool tree` * Don't define toolchain twice * Repackage GriefDefender * Relocate under new namespace * Bye bye ecma left overs * Add 1.17 to issue templates and instructions * Move to adventure-nbt (#918) * Initial work for adventure-nbt * Some more FAWE specific stuff * Fix erroneous deprecation check * Workflow change * Continued merging all adventure NBT related changes * Continued merging all adventure NBT related changes * Made a constructor public again This needs to be public for BlockTransformExtent.java * Finished converting all NBT data to adventure. * Make this compile * Fix conflicts Co-authored-by: Matt <4009945+MattBDev@users.noreply.github.com> * Update adapters to 1.17 * Change build prefix to 1.17 * Move more nms classes to adapters * Move left over nms classes * Move Spigot 1.17 class * Remove unneeded adapter loader code The loader will find the appropriate class now itself * Update adapters * Update adapters * Lazy fix tests * Update adapters * Update Upstream 43da91a Remove method reflection for getMinHeight in BukkitWorld. (1796) * Relocate adventure-nbt under proper namespace * Add LazyCompoundTag as a non-version-specific class to be used by adapters * Better integration between old NBT and Adventure NBT - begin fixing the issues seen recently * Correctly NBT conversion method * LazyCompoundTags should actually be overriding and correctly returning a CompoundBinaryTag. * Update worldedit-adapters Fixes #1141 * Remove unnecessary massive lag machine * Refactor apply to applyBlock in subclasses * applyBlock should be overriden by all subclasses. Default apply to applyBlock * Closes #1130 Closes #1132 * Squashed commit of the following: commit a9bfa1a07c77083c844a0c3ba62f4bd94bed107c Author: NotMyFault <mc.cache@web.de> Date: Sun Jun 27 21:53:21 2021 +0200 [ci skip] Update gradle wrapper validation commit aa7471f95317d28a16f62e4b200de8d0fea2fa95 Author: Matthew Miller <mnmiller1@me.com> Date: Sat Oct 10 15:49:13 2020 +1000 Add ^x,y,z relative offset support to the offset parser (#1545) * Add ^x,y,z relative offset support to the offset parser * Wrap in a try-catch (cherry picked from commit 28bdf7ff9254bbc85bb4f5f792b303943a3930a8) * Add `fawe.error.schematic.not.found` translation key * Update Upstream 728a152 Skip notify if chunk section doesn't exist (1794) * Fixed #1157 * Add a null check to prevent NPE in nbt code * Update adapters * Update Upstream fbb047a Optimize legacy schematic loading (1808) * Hurr durr I don't want to update Java * Update Upstream 0790e6e Fix CLI Mess (1811) * Fixes #1160 * Expose minimessage transitively thru PlotSquared Touches #32 * [ci skip] Remove unneeded maven repository * Steal tab completion from PlotSquared for P2 related commands * Don't error on startup when building locally Co-Authored-By: goldfishapp <8278196+goldfishapp@users.noreply.github.com> * [ci skip] Update gh actions to Java 16 * Update textures to grab 1.17 jar Co-authored-by: NotMyFault <mc.cache@web.de> Co-authored-by: SirYwell <hannesgreule@outlook.de> Co-authored-by: Matthew Miller <mnmiller1@me.com> Co-authored-by: Matt <4009945+MattBDev@users.noreply.github.com> Co-authored-by: goldfishapp <8278196+goldfishapp@users.noreply.github.com>
This commit is contained in:
@ -19,15 +19,15 @@
|
||||
|
||||
package com.sk89q.worldedit.world.chunk;
|
||||
|
||||
import com.sk89q.jnbt.ByteArrayTag;
|
||||
import com.sk89q.jnbt.ByteTag;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.IntTag;
|
||||
import com.sk89q.jnbt.ListTag;
|
||||
import com.sk89q.jnbt.NBTUtils;
|
||||
import com.sk89q.jnbt.Tag;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.util.nbt.BinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.BinaryTagTypes;
|
||||
import com.sk89q.worldedit.util.nbt.CompoundBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.IntBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.ListBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.NbtUtils;
|
||||
import com.sk89q.worldedit.world.DataException;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
@ -36,20 +36,31 @@ import com.sk89q.worldedit.world.registry.LegacyMapper;
|
||||
import com.sk89q.worldedit.world.storage.InvalidFormatException;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public class AnvilChunk implements Chunk {
|
||||
|
||||
private final CompoundTag rootTag;
|
||||
private final CompoundBinaryTag rootTag;
|
||||
private final byte[][] blocks;
|
||||
private final byte[][] blocksAdd;
|
||||
private final byte[][] data;
|
||||
private final int rootX;
|
||||
private final int rootZ;
|
||||
|
||||
private Map<BlockVector3, Map<String, Tag>> tileEntities;
|
||||
private Map<BlockVector3, CompoundBinaryTag> tileEntities;
|
||||
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
*
|
||||
* @param tag the tag to read
|
||||
* @throws DataException on a data error
|
||||
* @deprecated Use {@link #AnvilChunk(CompoundBinaryTag)}
|
||||
*/
|
||||
public AnvilChunk(CompoundTag tag) throws DataException {
|
||||
this(tag.asBinaryTag());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
@ -57,42 +68,42 @@ public class AnvilChunk implements Chunk {
|
||||
* @param tag the tag to read
|
||||
* @throws DataException on a data error
|
||||
*/
|
||||
public AnvilChunk(CompoundTag tag) throws DataException {
|
||||
public AnvilChunk(CompoundBinaryTag tag) throws DataException {
|
||||
rootTag = tag;
|
||||
|
||||
rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue();
|
||||
rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue();
|
||||
rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value();
|
||||
rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value();
|
||||
|
||||
blocks = new byte[16][16 * 16 * 16];
|
||||
blocksAdd = new byte[16][16 * 16 * 8];
|
||||
data = new byte[16][16 * 16 * 8];
|
||||
|
||||
List<Tag> sections = NBTUtils.getChildTag(rootTag.getValue(), "Sections", ListTag.class).getValue();
|
||||
ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST);
|
||||
|
||||
for (Tag rawSectionTag : sections) {
|
||||
if (!(rawSectionTag instanceof CompoundTag)) {
|
||||
for (BinaryTag rawSectionTag : sections) {
|
||||
if (!(rawSectionTag instanceof CompoundBinaryTag)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CompoundTag sectionTag = (CompoundTag) rawSectionTag;
|
||||
if (!sectionTag.getValue().containsKey("Y")) {
|
||||
CompoundBinaryTag sectionTag = (CompoundBinaryTag) rawSectionTag;
|
||||
if (sectionTag.get("Y") == null) {
|
||||
continue; // Empty section.
|
||||
}
|
||||
|
||||
int y = NBTUtils.getChildTag(sectionTag.getValue(), "Y", ByteTag.class).getValue();
|
||||
int y = NbtUtils.getChildTag(sectionTag, "Y", BinaryTagTypes.BYTE).value();
|
||||
if (y < 0 || y >= 16) {
|
||||
continue;
|
||||
}
|
||||
|
||||
blocks[y] = NBTUtils.getChildTag(sectionTag.getValue(),
|
||||
"Blocks", ByteArrayTag.class).getValue();
|
||||
data[y] = NBTUtils.getChildTag(sectionTag.getValue(), "Data",
|
||||
ByteArrayTag.class).getValue();
|
||||
blocks[y] = NbtUtils.getChildTag(sectionTag,
|
||||
"Blocks", BinaryTagTypes.BYTE_ARRAY).value();
|
||||
data[y] = NbtUtils.getChildTag(sectionTag, "Data",
|
||||
BinaryTagTypes.BYTE_ARRAY).value();
|
||||
|
||||
// 4096 ID block support
|
||||
if (sectionTag.getValue().containsKey("Add")) {
|
||||
blocksAdd[y] = NBTUtils.getChildTag(sectionTag.getValue(),
|
||||
"Add", ByteArrayTag.class).getValue();
|
||||
if (sectionTag.get("Add") != null) {
|
||||
blocksAdd[y] = NbtUtils.getChildTag(sectionTag,
|
||||
"Add", BinaryTagTypes.BYTE_ARRAY).value();
|
||||
}
|
||||
}
|
||||
|
||||
@ -179,50 +190,50 @@ public class AnvilChunk implements Chunk {
|
||||
* Used to load the tile entities.
|
||||
*/
|
||||
private void populateTileEntities() throws DataException {
|
||||
List<Tag> tags = NBTUtils.getChildTag(rootTag.getValue(),
|
||||
"TileEntities", ListTag.class).getValue();
|
||||
ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST);
|
||||
|
||||
tileEntities = new HashMap<>();
|
||||
|
||||
for (Tag tag : tags) {
|
||||
if (!(tag instanceof CompoundTag)) {
|
||||
for (BinaryTag tag : tags) {
|
||||
if (!(tag instanceof CompoundBinaryTag)) {
|
||||
throw new InvalidFormatException("CompoundTag expected in TileEntities");
|
||||
}
|
||||
|
||||
CompoundTag t = (CompoundTag) tag;
|
||||
CompoundBinaryTag t = (CompoundBinaryTag) tag;
|
||||
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int z = 0;
|
||||
|
||||
Map<String, Tag> values = new HashMap<>();
|
||||
CompoundBinaryTag.Builder values = CompoundBinaryTag.builder();
|
||||
|
||||
for (Map.Entry<String, Tag> entry : t.getValue().entrySet()) {
|
||||
switch (entry.getKey()) {
|
||||
for (String key : t.keySet()) {
|
||||
BinaryTag value = t.get(key);
|
||||
switch (key) {
|
||||
case "x":
|
||||
if (entry.getValue() instanceof IntTag) {
|
||||
x = ((IntTag) entry.getValue()).getValue();
|
||||
if (value instanceof IntBinaryTag) {
|
||||
x = ((IntBinaryTag) value).value();
|
||||
}
|
||||
break;
|
||||
case "y":
|
||||
if (entry.getValue() instanceof IntTag) {
|
||||
y = ((IntTag) entry.getValue()).getValue();
|
||||
if (value instanceof IntBinaryTag) {
|
||||
y = ((IntBinaryTag) value).value();
|
||||
}
|
||||
break;
|
||||
case "z":
|
||||
if (entry.getValue() instanceof IntTag) {
|
||||
z = ((IntTag) entry.getValue()).getValue();
|
||||
if (value instanceof IntBinaryTag) {
|
||||
z = ((IntBinaryTag) value).value();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
values.put(entry.getKey(), entry.getValue());
|
||||
values.put(key, value);
|
||||
}
|
||||
|
||||
BlockVector3 vec = BlockVector3.at(x, y, z);
|
||||
tileEntities.put(vec, values);
|
||||
tileEntities.put(vec, values.build());
|
||||
}
|
||||
}
|
||||
|
||||
@ -236,17 +247,17 @@ public class AnvilChunk implements Chunk {
|
||||
* @throws DataException thrown if there is a data error
|
||||
*/
|
||||
@Nullable
|
||||
private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException {
|
||||
private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException {
|
||||
if (tileEntities == null) {
|
||||
populateTileEntities();
|
||||
}
|
||||
|
||||
Map<String, Tag> values = tileEntities.get(position);
|
||||
CompoundBinaryTag values = tileEntities.get(position);
|
||||
if (values == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new CompoundTag(values);
|
||||
return values;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -259,7 +270,7 @@ public class AnvilChunk implements Chunk {
|
||||
WorldEdit.logger.warn("Unknown legacy block " + id + ":" + data + " found when loading legacy anvil chunk.");
|
||||
return BlockTypes.AIR.getDefaultState().toBaseBlock();
|
||||
}
|
||||
CompoundTag tileEntity = getBlockTileEntity(position);
|
||||
CompoundBinaryTag tileEntity = getBlockTileEntity(position);
|
||||
|
||||
if (tileEntity != null) {
|
||||
return state.toBaseBlock(tileEntity);
|
||||
|
@ -19,15 +19,15 @@
|
||||
|
||||
package com.sk89q.worldedit.world.chunk;
|
||||
|
||||
import com.sk89q.jnbt.ByteTag;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.IntTag;
|
||||
import com.sk89q.jnbt.ListTag;
|
||||
import com.sk89q.jnbt.LongArrayTag;
|
||||
import com.sk89q.jnbt.NBTUtils;
|
||||
import com.sk89q.jnbt.Tag;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.registry.state.Property;
|
||||
import com.sk89q.worldedit.util.nbt.BinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.BinaryTagTypes;
|
||||
import com.sk89q.worldedit.util.nbt.CompoundBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.IntBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.ListBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.NbtUtils;
|
||||
import com.sk89q.worldedit.world.DataException;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
@ -36,7 +36,6 @@ import com.sk89q.worldedit.world.block.BlockTypes;
|
||||
import com.sk89q.worldedit.world.storage.InvalidFormatException;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
@ -45,12 +44,25 @@ import javax.annotation.Nullable;
|
||||
*/
|
||||
public class AnvilChunk13 implements Chunk {
|
||||
|
||||
private CompoundTag rootTag;
|
||||
private final CompoundBinaryTag rootTag;
|
||||
private BlockState[][] blocks;
|
||||
private int rootX;
|
||||
private int rootZ;
|
||||
|
||||
private Map<BlockVector3, Map<String, Tag>> tileEntities;
|
||||
private Map<BlockVector3, CompoundBinaryTag> tileEntities;
|
||||
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
*
|
||||
* @param tag the tag to read
|
||||
* @throws DataException on a data error
|
||||
* @deprecated Use {@link #AnvilChunk13(CompoundBinaryTag)}
|
||||
*/
|
||||
@Deprecated
|
||||
public AnvilChunk13(CompoundTag tag) throws DataException {
|
||||
this(tag.asBinaryTag());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
@ -58,49 +70,49 @@ public class AnvilChunk13 implements Chunk {
|
||||
* @param tag the tag to read
|
||||
* @throws DataException on a data error
|
||||
*/
|
||||
public AnvilChunk13(CompoundTag tag) throws DataException {
|
||||
public AnvilChunk13(CompoundBinaryTag tag) throws DataException {
|
||||
rootTag = tag;
|
||||
|
||||
rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue();
|
||||
rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue();
|
||||
rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value();
|
||||
rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value();
|
||||
|
||||
blocks = new BlockState[16][];
|
||||
|
||||
List<Tag> sections = NBTUtils.getChildTag(rootTag.getValue(), "Sections", ListTag.class).getValue();
|
||||
ListBinaryTag sections = NbtUtils.getChildTag(rootTag, "Sections", BinaryTagTypes.LIST);
|
||||
|
||||
for (Tag rawSectionTag : sections) {
|
||||
if (!(rawSectionTag instanceof CompoundTag)) {
|
||||
for (BinaryTag rawSectionTag : sections) {
|
||||
if (!(rawSectionTag instanceof CompoundBinaryTag)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
CompoundTag sectionTag = (CompoundTag) rawSectionTag;
|
||||
if (!sectionTag.getValue().containsKey("Y")) {
|
||||
CompoundBinaryTag sectionTag = (CompoundBinaryTag) rawSectionTag;
|
||||
if (sectionTag.get("Y") == null) {
|
||||
continue; // Empty section.
|
||||
}
|
||||
|
||||
int y = NBTUtils.getChildTag(sectionTag.getValue(), "Y", ByteTag.class).getValue();
|
||||
int y = NbtUtils.getChildTag(sectionTag, "Y", BinaryTagTypes.BYTE).value();
|
||||
if (y < 0 || y >= 16) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// parse palette
|
||||
List<CompoundTag> paletteEntries = sectionTag.getList("Palette", CompoundTag.class);
|
||||
ListBinaryTag paletteEntries = sectionTag.getList("Palette", BinaryTagTypes.COMPOUND);
|
||||
int paletteSize = paletteEntries.size();
|
||||
if (paletteSize == 0) {
|
||||
continue;
|
||||
}
|
||||
BlockState[] palette = new BlockState[paletteSize];
|
||||
for (int paletteEntryId = 0; paletteEntryId < paletteSize; paletteEntryId++) {
|
||||
CompoundTag paletteEntry = paletteEntries.get(paletteEntryId);
|
||||
CompoundBinaryTag paletteEntry = (CompoundBinaryTag) paletteEntries.get(paletteEntryId);
|
||||
BlockType type = BlockTypes.get(paletteEntry.getString("Name"));
|
||||
if (type == null) {
|
||||
throw new InvalidFormatException("Invalid block type: " + paletteEntry.getString("Name"));
|
||||
}
|
||||
BlockState blockState = type.getDefaultState();
|
||||
if (paletteEntry.containsKey("Properties")) {
|
||||
CompoundTag properties = NBTUtils.getChildTag(paletteEntry.getValue(), "Properties", CompoundTag.class);
|
||||
if (paletteEntry.get("Properties") != null) {
|
||||
CompoundBinaryTag properties = NbtUtils.getChildTag(paletteEntry, "Properties", BinaryTagTypes.COMPOUND);
|
||||
for (Property<?> property : blockState.getStates().keySet()) {
|
||||
if (properties.containsKey(property.getName())) {
|
||||
if (properties.get(property.getName()) != null) {
|
||||
String value = properties.getString(property.getName());
|
||||
try {
|
||||
blockState = getBlockStateWith(blockState, property, value);
|
||||
@ -114,7 +126,7 @@ public class AnvilChunk13 implements Chunk {
|
||||
}
|
||||
|
||||
// parse block states
|
||||
long[] blockStatesSerialized = NBTUtils.getChildTag(sectionTag.getValue(), "BlockStates", LongArrayTag.class).getValue();
|
||||
long[] blockStatesSerialized = NbtUtils.getChildTag(sectionTag, "BlockStates", BinaryTagTypes.LONG_ARRAY).value();
|
||||
|
||||
BlockState[] chunkSectionBlocks = new BlockState[16 * 16 * 16];
|
||||
blocks[y] = chunkSectionBlocks;
|
||||
@ -166,26 +178,24 @@ public class AnvilChunk13 implements Chunk {
|
||||
*/
|
||||
private void populateTileEntities() throws DataException {
|
||||
tileEntities = new HashMap<>();
|
||||
if (!rootTag.getValue().containsKey("TileEntities")) {
|
||||
if (rootTag.get("TileEntities") == null) {
|
||||
return;
|
||||
}
|
||||
List<Tag> tags = NBTUtils.getChildTag(rootTag.getValue(),
|
||||
"TileEntities", ListTag.class).getValue();
|
||||
ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST);
|
||||
|
||||
for (Tag tag : tags) {
|
||||
if (!(tag instanceof CompoundTag)) {
|
||||
for (BinaryTag tag : tags) {
|
||||
if (!(tag instanceof CompoundBinaryTag)) {
|
||||
throw new InvalidFormatException("CompoundTag expected in TileEntities");
|
||||
}
|
||||
|
||||
CompoundTag t = (CompoundTag) tag;
|
||||
CompoundBinaryTag t = (CompoundBinaryTag) tag;
|
||||
|
||||
Map<String, Tag> values = new HashMap<>(t.getValue());
|
||||
int x = ((IntTag) values.get("x")).getValue();
|
||||
int y = ((IntTag) values.get("y")).getValue();
|
||||
int z = ((IntTag) values.get("z")).getValue();
|
||||
int x = ((IntBinaryTag) t.get("x")).value();
|
||||
int y = ((IntBinaryTag) t.get("y")).value();
|
||||
int z = ((IntBinaryTag) t.get("z")).value();
|
||||
|
||||
BlockVector3 vec = BlockVector3.at(x, y, z);
|
||||
tileEntities.put(vec, values);
|
||||
tileEntities.put(vec, t);
|
||||
}
|
||||
}
|
||||
|
||||
@ -199,17 +209,17 @@ public class AnvilChunk13 implements Chunk {
|
||||
* @throws DataException thrown if there is a data error
|
||||
*/
|
||||
@Nullable
|
||||
private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException {
|
||||
private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException {
|
||||
if (tileEntities == null) {
|
||||
populateTileEntities();
|
||||
}
|
||||
|
||||
Map<String, Tag> values = tileEntities.get(position);
|
||||
CompoundBinaryTag values = tileEntities.get(position);
|
||||
if (values == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new CompoundTag(values);
|
||||
return values;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -228,7 +238,7 @@ public class AnvilChunk13 implements Chunk {
|
||||
BlockState[] sectionBlocks = blocks[section];
|
||||
BlockState state = sectionBlocks != null ? sectionBlocks[(yIndex << 8) | (z << 4) | x] : BlockTypes.AIR.getDefaultState();
|
||||
|
||||
CompoundTag tileEntity = getBlockTileEntity(position);
|
||||
CompoundBinaryTag tileEntity = getBlockTileEntity(position);
|
||||
|
||||
if (tileEntity != null) {
|
||||
return state.toBaseBlock(tileEntity);
|
||||
|
@ -20,6 +20,7 @@
|
||||
package com.sk89q.worldedit.world.chunk;
|
||||
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.worldedit.util.nbt.CompoundBinaryTag;
|
||||
import com.sk89q.worldedit.world.DataException;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
import com.sk89q.worldedit.world.storage.InvalidFormatException;
|
||||
@ -34,11 +35,23 @@ public class AnvilChunk16 extends AnvilChunk13 {
|
||||
*
|
||||
* @param tag the tag to read
|
||||
* @throws DataException on a data error
|
||||
* @deprecated Use {@link #AnvilChunk16(CompoundBinaryTag)}
|
||||
*/
|
||||
@Deprecated
|
||||
public AnvilChunk16(CompoundTag tag) throws DataException {
|
||||
super(tag);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
*
|
||||
* @param tag the tag to read
|
||||
* @throws DataException on a data error
|
||||
*/
|
||||
public AnvilChunk16(CompoundBinaryTag tag) throws DataException {
|
||||
super(tag);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void readBlockStates(BlockState[] palette, long[] blockStatesSerialized, BlockState[] chunkSectionBlocks) throws InvalidFormatException {
|
||||
PackedIntArrayReader reader = new PackedIntArrayReader(blockStatesSerialized);
|
||||
|
@ -19,14 +19,15 @@
|
||||
|
||||
package com.sk89q.worldedit.world.chunk;
|
||||
|
||||
import com.sk89q.jnbt.ByteArrayTag;
|
||||
import com.sk89q.jnbt.CompoundTag;
|
||||
import com.sk89q.jnbt.IntTag;
|
||||
import com.sk89q.jnbt.ListTag;
|
||||
import com.sk89q.jnbt.NBTUtils;
|
||||
import com.sk89q.jnbt.Tag;
|
||||
import com.sk89q.worldedit.WorldEdit;
|
||||
import com.sk89q.worldedit.math.BlockVector3;
|
||||
import com.sk89q.worldedit.util.nbt.BinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.BinaryTagTypes;
|
||||
import com.sk89q.worldedit.util.nbt.CompoundBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.IntBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.ListBinaryTag;
|
||||
import com.sk89q.worldedit.util.nbt.NbtUtils;
|
||||
import com.sk89q.worldedit.world.DataException;
|
||||
import com.sk89q.worldedit.world.block.BaseBlock;
|
||||
import com.sk89q.worldedit.world.block.BlockState;
|
||||
@ -35,7 +36,6 @@ import com.sk89q.worldedit.world.registry.LegacyMapper;
|
||||
import com.sk89q.worldedit.world.storage.InvalidFormatException;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
@ -43,13 +43,26 @@ import java.util.Map;
|
||||
*/
|
||||
public class OldChunk implements Chunk {
|
||||
|
||||
private final CompoundTag rootTag;
|
||||
private final CompoundBinaryTag rootTag;
|
||||
private final byte[] blocks;
|
||||
private final byte[] data;
|
||||
private final int rootX;
|
||||
private final int rootZ;
|
||||
|
||||
private Map<BlockVector3, Map<String, Tag>> tileEntities;
|
||||
private Map<BlockVector3, CompoundBinaryTag> tileEntities;
|
||||
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
*
|
||||
* @param tag the tag
|
||||
* @throws DataException if there is an error getting the chunk data
|
||||
* @deprecated Use {@link #OldChunk(CompoundBinaryTag)}
|
||||
*/
|
||||
@Deprecated
|
||||
public OldChunk(CompoundTag tag) throws DataException {
|
||||
this(tag.asBinaryTag());
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct the chunk with a compound tag.
|
||||
@ -57,13 +70,13 @@ public class OldChunk implements Chunk {
|
||||
* @param tag the tag
|
||||
* @throws DataException if there is an error getting the chunk data
|
||||
*/
|
||||
public OldChunk(CompoundTag tag) throws DataException {
|
||||
public OldChunk(CompoundBinaryTag tag) throws DataException {
|
||||
rootTag = tag;
|
||||
|
||||
blocks = NBTUtils.getChildTag(rootTag.getValue(), "Blocks", ByteArrayTag.class).getValue();
|
||||
data = NBTUtils.getChildTag(rootTag.getValue(), "Data", ByteArrayTag.class).getValue();
|
||||
rootX = NBTUtils.getChildTag(rootTag.getValue(), "xPos", IntTag.class).getValue();
|
||||
rootZ = NBTUtils.getChildTag(rootTag.getValue(), "zPos", IntTag.class).getValue();
|
||||
blocks = NbtUtils.getChildTag(rootTag, "Blocks", BinaryTagTypes.BYTE_ARRAY).value();
|
||||
data = NbtUtils.getChildTag(rootTag, "Data", BinaryTagTypes.BYTE_ARRAY).value();
|
||||
rootX = NbtUtils.getChildTag(rootTag, "xPos", BinaryTagTypes.INT).value();
|
||||
rootZ = NbtUtils.getChildTag(rootTag, "zPos", BinaryTagTypes.INT).value();
|
||||
|
||||
int size = 16 * 16 * 128;
|
||||
if (blocks.length != size) {
|
||||
@ -83,51 +96,50 @@ public class OldChunk implements Chunk {
|
||||
* @throws DataException if there is an error getting the chunk data
|
||||
*/
|
||||
private void populateTileEntities() throws DataException {
|
||||
List<Tag> tags = NBTUtils.getChildTag(
|
||||
rootTag.getValue(), "TileEntities", ListTag.class)
|
||||
.getValue();
|
||||
ListBinaryTag tags = NbtUtils.getChildTag(rootTag, "TileEntities", BinaryTagTypes.LIST);
|
||||
|
||||
tileEntities = new HashMap<>();
|
||||
|
||||
for (Tag tag : tags) {
|
||||
if (!(tag instanceof CompoundTag)) {
|
||||
for (BinaryTag tag : tags) {
|
||||
if (!(tag instanceof CompoundBinaryTag)) {
|
||||
throw new InvalidFormatException("CompoundTag expected in TileEntities");
|
||||
}
|
||||
|
||||
CompoundTag t = (CompoundTag) tag;
|
||||
CompoundBinaryTag t = (CompoundBinaryTag) tag;
|
||||
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
int z = 0;
|
||||
|
||||
Map<String, Tag> values = new HashMap<>();
|
||||
CompoundBinaryTag.Builder values = CompoundBinaryTag.builder();
|
||||
|
||||
for (Map.Entry<String, Tag> entry : t.getValue().entrySet()) {
|
||||
switch (entry.getKey()) {
|
||||
for (String key : t.keySet()) {
|
||||
BinaryTag value = t.get(key);
|
||||
switch (key) {
|
||||
case "x":
|
||||
if (entry.getValue() instanceof IntTag) {
|
||||
x = ((IntTag) entry.getValue()).getValue();
|
||||
if (value instanceof IntBinaryTag) {
|
||||
x = ((IntBinaryTag) value).value();
|
||||
}
|
||||
break;
|
||||
case "y":
|
||||
if (entry.getValue() instanceof IntTag) {
|
||||
y = ((IntTag) entry.getValue()).getValue();
|
||||
if (value instanceof IntBinaryTag) {
|
||||
y = ((IntBinaryTag) value).value();
|
||||
}
|
||||
break;
|
||||
case "z":
|
||||
if (entry.getValue() instanceof IntTag) {
|
||||
z = ((IntTag) entry.getValue()).getValue();
|
||||
if (value instanceof IntBinaryTag) {
|
||||
z = ((IntBinaryTag) value).value();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
values.put(entry.getKey(), entry.getValue());
|
||||
values.put(key, value);
|
||||
}
|
||||
|
||||
BlockVector3 vec = BlockVector3.at(x, y, z);
|
||||
tileEntities.put(vec, values);
|
||||
tileEntities.put(vec, values.build());
|
||||
}
|
||||
}
|
||||
|
||||
@ -140,16 +152,16 @@ public class OldChunk implements Chunk {
|
||||
* @return a tag
|
||||
* @throws DataException if there is an error getting the chunk data
|
||||
*/
|
||||
private CompoundTag getBlockTileEntity(BlockVector3 position) throws DataException {
|
||||
private CompoundBinaryTag getBlockTileEntity(BlockVector3 position) throws DataException {
|
||||
if (tileEntities == null) {
|
||||
populateTileEntities();
|
||||
}
|
||||
|
||||
Map<String, Tag> values = tileEntities.get(position);
|
||||
CompoundBinaryTag values = tileEntities.get(position);
|
||||
if (values == null) {
|
||||
return null;
|
||||
}
|
||||
return new CompoundTag(values);
|
||||
return values;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -189,7 +201,7 @@ public class OldChunk implements Chunk {
|
||||
return BlockTypes.AIR.getDefaultState().toBaseBlock();
|
||||
}
|
||||
|
||||
CompoundTag tileEntity = getBlockTileEntity(position);
|
||||
CompoundBinaryTag tileEntity = getBlockTileEntity(position);
|
||||
|
||||
if (tileEntity != null) {
|
||||
return state.toBaseBlock(tileEntity);
|
||||
|
Reference in New Issue
Block a user