SteamWar/SpigotCore
Archiviert
13
0

Schematics für 1.13+ in der 1.12- laden. #36

Zusammengeführt
Lixfel hat 5 Commits von schemType nach master 2020-02-23 21:44:14 +01:00 zusammengeführt
5 geänderte Dateien mit 124 neuen und 124 gelöschten Zeilen
Nur Änderungen aus Commit 0fedaec64f werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -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);
}
}

Datei anzeigen

@ -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);
}
}

Datei anzeigen

@ -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 {
Veraltet
Review

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.

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.
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 {
Review

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 {

Datei anzeigen

@ -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 {
Review

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 {
Review

Bitte auch hier Dokumentieren oder Umbenennen.

Bitte auch hier Dokumentieren oder Umbenennen.
return Schematic_8.getClipboard(is, schemVersion);
}
}

Datei anzeigen

@ -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);
Veraltet
Review

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);
Veraltet
Review

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);