Schematics für 1.13+ in der 1.12- laden. #36
@ -13,11 +13,11 @@ class Schematic_10 {
|
||||
return Schematic_8.getPlayerClipboard(player);
|
||||
}
|
||||
|
||||
static void setPlayerClipboard(Player player, InputStream is) throws IOException {
|
||||
Schematic_8.setPlayerClipboard(player, is);
|
||||
static void setPlayerClipboard(Player player, InputStream is, boolean schemVersion) throws IOException {
|
||||
Schematic_8.setPlayerClipboard(player, is, schemVersion);
|
||||
}
|
||||
|
||||
static Clipboard getClipboard(InputStream is) throws IOException {
|
||||
return Schematic_8.getClipboard(is);
|
||||
static Clipboard getClipboard(InputStream is, boolean schemVersion) throws IOException {
|
||||
return Schematic_8.getClipboard(is, schemVersion);
|
||||
}
|
||||
}
|
||||
|
@ -32,11 +32,11 @@ class Schematic_12 {
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
|
||||
static void setPlayerClipboard(Player player, InputStream is) throws IOException {
|
||||
Schematic_8.setPlayerClipboard(player, is);
|
||||
static void setPlayerClipboard(Player player, InputStream is, boolean schemVersion) throws IOException {
|
||||
Schematic_8.setPlayerClipboard(player, is, schemVersion);
|
||||
}
|
||||
|
||||
static Clipboard getClipboard(InputStream is) throws IOException {
|
||||
return Schematic_8.getClipboard(is);
|
||||
static Clipboard getClipboard(InputStream is, boolean schemVersion) throws IOException {
|
||||
return Schematic_8.getClipboard(is, schemVersion);
|
||||
}
|
||||
}
|
||||
|
@ -7,7 +7,6 @@ import com.sk89q.worldedit.*;
|
||||
import com.sk89q.worldedit.blocks.BaseBlock;
|
||||
import com.sk89q.worldedit.bukkit.BukkitWorld;
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import com.sk89q.worldedit.extension.input.InputParseException;
|
||||
import com.sk89q.worldedit.extension.input.ParserContext;
|
||||
import com.sk89q.worldedit.extension.platform.Actor;
|
||||
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
|
||||
@ -18,6 +17,7 @@ import com.sk89q.worldedit.regions.CuboidRegion;
|
||||
import com.sk89q.worldedit.session.ClipboardHolder;
|
||||
import com.sk89q.worldedit.world.registry.WorldData;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
@ -29,6 +29,7 @@ import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.GZIPInputStream;
|
||||
|
||||
class Schematic_8 {
|
||||
private Schematic_8(){}
|
||||
@ -50,16 +51,19 @@ class Schematic_8 {
|
||||
return outputStream.toByteArray();
|
||||
}
|
||||
|
||||
static void setPlayerClipboard(Player player, InputStream is) throws IOException {
|
||||
static void setPlayerClipboard(Player player, InputStream is, boolean schemFormat) throws IOException {
|
||||
|
||||
WorldData world = new BukkitWorld(player.getWorld()).getWorldData();
|
||||
Clipboard clipboard = getClipboard(is);
|
||||
Clipboard clipboard = getClipboard(is, schemFormat);
|
||||
|
||||
Actor actor = getWorldEditPlugin().wrapCommandSender(player);
|
||||
getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard, world));
|
||||
}
|
||||
|
||||
static Clipboard getClipboard(InputStream is) throws IOException {
|
||||
return ClipboardFormat.SCHEMATIC.getReader(is).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData());
|
||||
static Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException {
|
||||
Yaruma3341
hat
Wieder das Problem mit "schemFormat". Bitte auch hier dokumentieren oder umbenennen. Wieder das Problem mit "schemFormat". Bitte auch hier dokumentieren oder umbenennen.
|
||||
if(schemFormat)
|
||||
return new SpongeSchematicReader(new NBTInputStream(new GZIPInputStream(is))).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData());
|
||||
else
|
||||
return ClipboardFormat.SCHEMATIC.getReader(is).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData());
|
||||
}
|
||||
|
||||
private static WorldEditPlugin getWorldEditPlugin() {
|
||||
@ -70,7 +74,7 @@ class Schematic_8 {
|
||||
private final NBTInputStream inputStream;
|
||||
private int schematicVersion = -1;
|
||||
|
||||
public SpongeSchematicReader(NBTInputStream inputStream) {
|
||||
SpongeSchematicReader(NBTInputStream inputStream) {
|
||||
Preconditions.checkNotNull(inputStream);
|
||||
this.inputStream = inputStream;
|
||||
}
|
||||
@ -79,9 +83,9 @@ class Schematic_8 {
|
||||
public Clipboard read(WorldData worldData) throws IOException {
|
||||
CompoundTag schematicTag = this.getBaseTag();
|
||||
if (this.schematicVersion == 1) {
|
||||
return this.readVersion1(schematicTag);
|
||||
return this.readSchematic(schematicTag);
|
||||
} else if (this.schematicVersion == 2) {
|
||||
return this.readVersion1(schematicTag);
|
||||
return this.readSchematic(schematicTag);
|
||||
} else {
|
||||
throw new IOException("This schematic version is currently not supported");
|
||||
}
|
||||
@ -99,7 +103,8 @@ class Schematic_8 {
|
||||
}
|
||||
}
|
||||
|
||||
private BlockArrayClipboard readVersion1(CompoundTag schematicTag) throws IOException {
|
||||
@SuppressWarnings("deprecation")
|
||||
private BlockArrayClipboard readSchematic(CompoundTag schematicTag) throws IOException {
|
||||
Map<String, Tag> schematic = schematicTag.getValue();
|
||||
int width = (requireTag(schematic, "Width", ShortTag.class)).getValue();
|
||||
int height = (requireTag(schematic, "Height", ShortTag.class)).getValue();
|
||||
@ -108,9 +113,8 @@ class Schematic_8 {
|
||||
int[] offsetParts;
|
||||
if (offsetTag != null) {
|
||||
offsetParts = offsetTag.getValue();
|
||||
if (offsetParts.length != 3) {
|
||||
if (offsetParts.length != 3)
|
||||
throw new IOException("Invalid offset specified in schematic.");
|
||||
}
|
||||
} else {
|
||||
offsetParts = new int[]{0, 0, 0};
|
||||
}
|
||||
@ -134,98 +138,99 @@ class Schematic_8 {
|
||||
|
||||
IntTag paletteMaxTag = getTag(schematic, "PaletteMax", IntTag.class);
|
||||
Map<String, Tag> paletteObject = requireTag(schematic, "Palette", CompoundTag.class).getValue();
|
||||
if (paletteMaxTag != null && paletteObject.size() != paletteMaxTag.getValue()) {
|
||||
if (paletteMaxTag != null && paletteObject.size() != paletteMaxTag.getValue())
|
||||
throw new IOException("Block palette size does not match expected size.");
|
||||
} else {
|
||||
Map<Integer, BaseBlock> palette = new HashMap<>(); //TODO not base blocks
|
||||
ParserContext parserContext = new ParserContext();
|
||||
parserContext.setRestricted(false);
|
||||
parserContext.setPreferringWildcard(false);
|
||||
|
||||
int id;
|
||||
BaseBlock state;
|
||||
for(Iterator var36 = paletteObject.keySet().iterator(); var36.hasNext(); palette.put(id, state)) {
|
||||
String palettePart = (String)var36.next();
|
||||
id = requireTag(paletteObject, palettePart, IntTag.class).getValue();
|
||||
Map<Integer, BaseBlock> palette = new HashMap<>();
|
||||
ParserContext parserContext = new ParserContext();
|
||||
parserContext.setRestricted(false);
|
||||
parserContext.setPreferringWildcard(false);
|
||||
|
||||
try {
|
||||
//TODO Parse id to base block
|
||||
throw new InputParseException("TODO");
|
||||
} catch (InputParseException var31) {
|
||||
state = new BaseBlock(0); //AIR
|
||||
}
|
||||
int id;
|
||||
BaseBlock state;
|
||||
for(Iterator iterator = paletteObject.keySet().iterator(); iterator.hasNext(); palette.put(id, state)) {
|
||||
String palettePart = (String)iterator.next();
|
||||
id = requireTag(paletteObject, palettePart, IntTag.class).getValue();
|
||||
|
||||
String matName = palettePart.split(":")[1].split("\\[")[0];
|
||||
Material material = Material.getMaterial(matName);
|
||||
if(material == null){
|
||||
state = new BaseBlock(0); //AIR
|
||||
continue;
|
||||
}
|
||||
|
||||
byte[] blocks = requireTag(schematic, "BlockData", ByteArrayTag.class).getValue();
|
||||
Map<BlockVector, Map<String, Tag>> tileEntitiesMap = new HashMap<>();
|
||||
ListTag tileEntities = getTag(schematic, "BlockEntities", ListTag.class);
|
||||
if (tileEntities == null) {
|
||||
tileEntities = getTag(schematic, "TileEntities", ListTag.class);
|
||||
}
|
||||
|
||||
if (tileEntities != null) {
|
||||
List<Map<String, Tag>> tileEntityTags = tileEntities.getValue().stream().map((tag) ->
|
||||
(CompoundTag)tag
|
||||
).map(CompoundTag::getValue).collect(Collectors.toList());
|
||||
|
||||
BlockVector pt;
|
||||
Map<String, Tag> tileEntity;
|
||||
for(Iterator<Map<String, Tag>> var20 = tileEntityTags.iterator(); var20.hasNext(); tileEntitiesMap.put(pt, tileEntity)) {
|
||||
tileEntity = var20.next();
|
||||
int[] pos = requireTag(tileEntity, "Pos", IntArrayTag.class).getValue();
|
||||
pt = new BlockVector(pos[0], pos[1], pos[2]);
|
||||
Map<String, Tag> values = Maps.newHashMap(tileEntity);
|
||||
values.put("x", new IntTag(pt.getBlockX()));
|
||||
values.put("y", new IntTag(pt.getBlockY()));
|
||||
values.put("z", new IntTag(pt.getBlockZ()));
|
||||
values.put("id", values.get("Id"));
|
||||
values.remove("Id");
|
||||
values.remove("Pos");
|
||||
tileEntity = values;
|
||||
}
|
||||
}
|
||||
|
||||
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
|
||||
clipboard.setOrigin(origin);
|
||||
int index = 0;
|
||||
|
||||
for(int i = 0; i < blocks.length; ++index) {
|
||||
int value = 0;
|
||||
int varintLength = 0;
|
||||
|
||||
while(true) {
|
||||
value |= (blocks[i] & 127) << varintLength++ * 7;
|
||||
if (varintLength > 5) {
|
||||
throw new IOException("VarInt too big (probably corrupted data)");
|
||||
}
|
||||
|
||||
if ((blocks[i] & 128) != 128) {
|
||||
++i;
|
||||
int y = index / (width * length);
|
||||
int z = index % (width * length) / width;
|
||||
int x = index % (width * length) % width;
|
||||
BaseBlock block = palette.get(value);
|
||||
BlockVector pt = new BlockVector(x, y, z);
|
||||
|
||||
try {
|
||||
if (tileEntitiesMap.containsKey(pt)) {
|
||||
block.setNbtData(new CompoundTag(tileEntitiesMap.get(pt)));
|
||||
clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block);
|
||||
} else {
|
||||
clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block);
|
||||
}
|
||||
break;
|
||||
} catch (WorldEditException var30) {
|
||||
throw new IOException("Failed to load a block in the schematic");
|
||||
}
|
||||
}
|
||||
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
return clipboard;
|
||||
state = new BaseBlock(material.getId());
|
||||
}
|
||||
|
||||
byte[] blocks = requireTag(schematic, "BlockData", ByteArrayTag.class).getValue();
|
||||
Map<BlockVector, Map<String, Tag>> tileEntitiesMap = new HashMap<>();
|
||||
ListTag tileEntities = getTag(schematic, "BlockEntities", ListTag.class);
|
||||
if (tileEntities == null) {
|
||||
tileEntities = getTag(schematic, "TileEntities", ListTag.class);
|
||||
}
|
||||
|
||||
if (tileEntities != null) {
|
||||
List<Map<String, Tag>> tileEntityTags = tileEntities.getValue().stream().map((tag) ->
|
||||
(CompoundTag)tag
|
||||
).map(CompoundTag::getValue).collect(Collectors.toList());
|
||||
|
||||
BlockVector pt;
|
||||
Map<String, Tag> tileEntity;
|
||||
for(Iterator<Map<String, Tag>> var20 = tileEntityTags.iterator(); var20.hasNext(); tileEntitiesMap.put(pt, tileEntity)) {
|
||||
tileEntity = var20.next();
|
||||
int[] pos = requireTag(tileEntity, "Pos", IntArrayTag.class).getValue();
|
||||
pt = new BlockVector(pos[0], pos[1], pos[2]);
|
||||
Map<String, Tag> values = Maps.newHashMap(tileEntity);
|
||||
values.put("x", new IntTag(pt.getBlockX()));
|
||||
values.put("y", new IntTag(pt.getBlockY()));
|
||||
values.put("z", new IntTag(pt.getBlockZ()));
|
||||
values.put("id", values.get("Id"));
|
||||
values.remove("Id");
|
||||
values.remove("Pos");
|
||||
tileEntity = values;
|
||||
}
|
||||
}
|
||||
|
||||
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
|
||||
clipboard.setOrigin(origin);
|
||||
int index = 0;
|
||||
|
||||
for(int i = 0; i < blocks.length; ++index) {
|
||||
int value = 0;
|
||||
int varintLength = 0;
|
||||
|
||||
while(true) {
|
||||
value |= (blocks[i] & 127) << varintLength++ * 7;
|
||||
if (varintLength > 5) {
|
||||
throw new IOException("VarInt too big (probably corrupted data)");
|
||||
}
|
||||
|
||||
if ((blocks[i] & 128) != 128) {
|
||||
++i;
|
||||
int y = index / (width * length);
|
||||
int z = index % (width * length) / width;
|
||||
int x = index % (width * length) % width;
|
||||
BaseBlock block = palette.get(value);
|
||||
BlockVector pt = new BlockVector(x, y, z);
|
||||
|
||||
try {
|
||||
if (tileEntitiesMap.containsKey(pt)) {
|
||||
block.setNbtData(new CompoundTag(tileEntitiesMap.get(pt)));
|
||||
clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block);
|
||||
} else {
|
||||
clipboard.setBlock(clipboard.getMinimumPoint().add(pt), block);
|
||||
}
|
||||
break;
|
||||
} catch (WorldEditException var30) {
|
||||
throw new IOException("Failed to load a block in the schematic");
|
||||
}
|
||||
}
|
||||
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
return clipboard;
|
||||
}
|
||||
|
||||
private static <T extends Tag> T requireTag(Map<String, Tag> items, String key, Class<T> expected) throws IOException {
|
||||
|
@ -13,11 +13,11 @@ class Schematic_9 {
|
||||
return Schematic_8.getPlayerClipboard(player);
|
||||
}
|
||||
|
||||
static void setPlayerClipboard(Player player, InputStream is) throws IOException {
|
||||
Schematic_8.setPlayerClipboard(player, is);
|
||||
static void setPlayerClipboard(Player player, InputStream is, boolean schemVersion) throws IOException {
|
||||
Yaruma3341
hat
Bitte auch hier Dokumentieren oder Umbenennen. Bitte auch hier Dokumentieren oder Umbenennen.
|
||||
Schematic_8.setPlayerClipboard(player, is, schemVersion);
|
||||
}
|
||||
|
||||
static Clipboard getClipboard(InputStream is) throws IOException {
|
||||
return Schematic_8.getClipboard(is);
|
||||
static Clipboard getClipboard(InputStream is, boolean schemVersion) throws IOException {
|
||||
Yaruma3341
hat
Bitte auch hier Dokumentieren oder Umbenennen. Bitte auch hier Dokumentieren oder Umbenennen.
|
||||
return Schematic_8.getClipboard(is, schemVersion);
|
||||
}
|
||||
}
|
||||
|
@ -152,10 +152,7 @@ public class Schematic {
|
||||
return Core.getVersion() > 12 || !schemFormat;
|
||||
}
|
||||
|
||||
public Clipboard load() throws WrongVersionException, IOException, NoClipboardException {
|
||||
if(Core.getVersion() <= 12 && schemFormat)
|
||||
throw new WrongVersionException();
|
||||
|
||||
public Clipboard load() throws IOException, NoClipboardException {
|
||||
ResultSet rs = SQL.select("SELECT SchemData FROM Schematic WHERE SchemID = " + schemID);
|
||||
try {
|
||||
rs.next();
|
||||
@ -165,26 +162,24 @@ public class Schematic {
|
||||
InputStream is = schemData.getBinaryStream();
|
||||
switch(Core.getVersion()){
|
||||
case 8:
|
||||
return Schematic_8.getClipboard(is);
|
||||
return Schematic_8.getClipboard(is, schemFormat);
|
||||
Yaruma3341
hat
Bitte auch hier Dokumentieren oder Umbenennen. Bitte auch hier Dokumentieren oder Umbenennen.
|
||||
case 9:
|
||||
return Schematic_9.getClipboard(is);
|
||||
return Schematic_9.getClipboard(is, schemFormat);
|
||||
case 10:
|
||||
return Schematic_10.getClipboard(is);
|
||||
return Schematic_10.getClipboard(is, schemFormat);
|
||||
case 14:
|
||||
return Schematic_14.getClipboard(is, schemFormat);
|
||||
case 15:
|
||||
return Schematic_15.getClipboard(is, schemFormat);
|
||||
default:
|
||||
return Schematic_12.getClipboard(is);
|
||||
return Schematic_12.getClipboard(is, schemFormat);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void loadToPlayer(Player player) throws IOException, NoClipboardException, WrongVersionException {
|
||||
if(Core.getVersion() <= 12 && schemFormat)
|
||||
throw new WrongVersionException();
|
||||
public void loadToPlayer(Player player) throws IOException, NoClipboardException {
|
||||
|
||||
ResultSet rs = SQL.select("SELECT SchemData FROM Schematic WHERE SchemID = " + schemID);
|
||||
try {
|
||||
@ -192,13 +187,13 @@ public class Schematic {
|
||||
InputStream is = rs.getBlob("SchemData").getBinaryStream();
|
||||
switch(Core.getVersion()){
|
||||
case 8:
|
||||
Schematic_8.setPlayerClipboard(player, is);
|
||||
Schematic_8.setPlayerClipboard(player, is, schemFormat);
|
||||
Yaruma3341
hat
Bitte auch hier Dokumentieren oder Umbenennen. Bitte auch hier Dokumentieren oder Umbenennen.
|
||||
break;
|
||||
case 9:
|
||||
Schematic_9.setPlayerClipboard(player, is);
|
||||
Schematic_9.setPlayerClipboard(player, is, schemFormat);
|
||||
break;
|
||||
case 10:
|
||||
Schematic_10.setPlayerClipboard(player, is);
|
||||
Schematic_10.setPlayerClipboard(player, is, schemFormat);
|
||||
break;
|
||||
case 14:
|
||||
Schematic_14.setPlayerClipboard(player, is, schemFormat);
|
||||
@ -207,7 +202,7 @@ public class Schematic {
|
||||
Schematic_15.setPlayerClipboard(player, is, schemFormat);
|
||||
break;
|
||||
default:
|
||||
Schematic_12.setPlayerClipboard(player, is);
|
||||
Schematic_12.setPlayerClipboard(player, is, schemFormat);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
throw new IOException(e);
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Eventuell die Parameter dokumentieren, da mir erst nicht klar war was mit schemFormat gemeint ist. Eine Abkürzung für schematicFormat oder die .schem und .schematic Formate? Dokumentieren oder umbennen.