From 9670aeecbed9de2bdaa5570191bc4f051e376b2c Mon Sep 17 00:00:00 2001 From: Nanit Date: Fri, 28 Jan 2022 16:09:17 +0200 Subject: [PATCH] Temporaly removed schematic-related code --- .../limbo/configuration/LimboConfig.java | 15 -- .../java/ru/nanit/limbo/world/BlockData.java | 51 ------- .../ru/nanit/limbo/world/BlockEntity.java | 45 ------ .../ru/nanit/limbo/world/BlockMappings.java | 68 --------- .../world/schematic/AbstractSchematic.java | 73 --------- .../limbo/world/schematic/Schematic.java | 39 ----- .../world/schematic/SchematicLoader.java | 139 ------------------ .../schematic/versions/LegacySchematic.java | 94 ------------ .../schematic/versions/SpongeSchematic.java | 79 ---------- src/test/java/SchematicTest.java | 35 ----- src/test/resources/spawn.schem | Bin 6609 -> 0 bytes src/test/resources/test.schematic | Bin 6981 -> 0 bytes 12 files changed, 638 deletions(-) delete mode 100644 src/main/java/ru/nanit/limbo/world/BlockData.java delete mode 100644 src/main/java/ru/nanit/limbo/world/BlockEntity.java delete mode 100644 src/main/java/ru/nanit/limbo/world/BlockMappings.java delete mode 100644 src/main/java/ru/nanit/limbo/world/schematic/AbstractSchematic.java delete mode 100644 src/main/java/ru/nanit/limbo/world/schematic/Schematic.java delete mode 100644 src/main/java/ru/nanit/limbo/world/schematic/SchematicLoader.java delete mode 100644 src/main/java/ru/nanit/limbo/world/schematic/versions/LegacySchematic.java delete mode 100644 src/main/java/ru/nanit/limbo/world/schematic/versions/SpongeSchematic.java delete mode 100644 src/test/java/SchematicTest.java delete mode 100644 src/test/resources/spawn.schem delete mode 100644 src/test/resources/test.schematic diff --git a/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java b/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java index 76d717e..c55daed 100644 --- a/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java +++ b/src/main/java/ru/nanit/limbo/configuration/LimboConfig.java @@ -42,9 +42,6 @@ public final class LimboConfig { private int maxPlayers; private PingData pingData; - private boolean useSchematic; - private Path schematicPath; - private String dimensionType; private Location spawnPosition; private int gameMode; @@ -82,7 +79,6 @@ public final class LimboConfig { address = conf.node("bind").get(SocketAddress.class); maxPlayers = conf.node("maxPlayers").getInt(); pingData = conf.node("ping").get(PingData.class); - //useSchematic = conf.node("world", "enable").getBoolean(false); dimensionType = conf.node("dimension").getString(); spawnPosition = conf.node("spawnPosition").get(Location.class); gameMode = conf.node("gameMode").getInt(); @@ -91,9 +87,6 @@ public final class LimboConfig { useBossBar = conf.node("bossBar", "enable").getBoolean(); useTitle = conf.node("title", "enable").getBoolean(); - /*if (useSchematic) - schematicPath = Paths.get(conf.node("world", "path").getString("./spawn.schem"));*/ - if(useBrandName) brandName = conf.node("brandName", "content").getString(); @@ -154,14 +147,6 @@ public final class LimboConfig { return pingData; } - public boolean isUseSchematic() { - return useSchematic; - } - - public Path getSchematicPath() { - return schematicPath; - } - public String getDimensionType() { return dimensionType; } diff --git a/src/main/java/ru/nanit/limbo/world/BlockData.java b/src/main/java/ru/nanit/limbo/world/BlockData.java deleted file mode 100644 index 9e8e03b..0000000 --- a/src/main/java/ru/nanit/limbo/world/BlockData.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world; - -public class BlockData { - - private final String state; - private final int id; - private final byte data; - - public BlockData(String state, int id, byte data) { - this.state = state; - this.id = id; - this.data = data; - } - - public BlockData(String state) { - this(state, 0, (byte) 0); - } - - public BlockData(int id, byte data) { - this(null, id, data); - } - - public String getState() { - return state; - } - - public int getId() { - return id; - } - - public byte getData() { - return data; - } -} diff --git a/src/main/java/ru/nanit/limbo/world/BlockEntity.java b/src/main/java/ru/nanit/limbo/world/BlockEntity.java deleted file mode 100644 index 01eeb4d..0000000 --- a/src/main/java/ru/nanit/limbo/world/BlockEntity.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world; - -import net.kyori.adventure.nbt.CompoundBinaryTag; - -public class BlockEntity { - - private final Location pos; - private final String id; - private final CompoundBinaryTag data; - - public BlockEntity(Location pos, String id, CompoundBinaryTag data) { - this.pos = pos; - this.id = id; - this.data = data; - } - - public Location getPos() { - return pos; - } - - public String getId() { - return id; - } - - public CompoundBinaryTag getData() { - return data; - } -} diff --git a/src/main/java/ru/nanit/limbo/world/BlockMappings.java b/src/main/java/ru/nanit/limbo/world/BlockMappings.java deleted file mode 100644 index 0f5360e..0000000 --- a/src/main/java/ru/nanit/limbo/world/BlockMappings.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world; - -import ru.nanit.limbo.protocol.registry.Version; - -import java.util.HashMap; -import java.util.Map; - -public final class BlockMappings { - - private final Map idToState = new HashMap<>(); - private final Map stateToId = new HashMap<>(); - - public BlockData convert(int id, byte data, Version version) { - if (version.less(Version.V1_13)) - return new BlockData(id, data); - - String state = idToState.get(toId(id, data)); - - return state != null ? new BlockData(state) : null; - } - - public BlockData convert(String state, Version version) { - if (state == null) return null; - - if (version.moreOrEqual(Version.V1_13)) { - return new BlockData(state); - } - - String id = stateToId.get(state); - - if (id != null) { - String[] arr = id.split(":"); - int blockId = Integer.parseInt(arr[0]); - byte data = Byte.parseByte(arr[1]); - - return new BlockData(blockId, data); - } - - return null; - } - - public void register(int id, byte data, String state) { - String strId = toId(id, data); - idToState.put(strId, state); - stateToId.put(state, strId); - } - - private String toId(int id, byte data) { - return id + ":" + data; - } -} diff --git a/src/main/java/ru/nanit/limbo/world/schematic/AbstractSchematic.java b/src/main/java/ru/nanit/limbo/world/schematic/AbstractSchematic.java deleted file mode 100644 index 24ccf1e..0000000 --- a/src/main/java/ru/nanit/limbo/world/schematic/AbstractSchematic.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world.schematic; - -import ru.nanit.limbo.world.BlockEntity; -import ru.nanit.limbo.world.BlockMappings; - -import java.util.List; - -public abstract class AbstractSchematic implements Schematic { - - protected final BlockMappings mappings; - - private int width; - private int height; - private int length; - private List blockEntities; - - public AbstractSchematic(BlockMappings mappings) { - this.mappings = mappings; - } - - @Override - public int getWidth() { - return width; - } - - @Override - public int getHeight() { - return height; - } - - @Override - public int getLength() { - return length; - } - - @Override - public List getBlockEntities() { - return blockEntities; - } - - public void setWidth(int width) { - this.width = width; - } - - public void setHeight(int height) { - this.height = height; - } - - public void setLength(int length) { - this.length = length; - } - - public void setBlockEntities(List blockEntities) { - this.blockEntities = blockEntities; - } -} diff --git a/src/main/java/ru/nanit/limbo/world/schematic/Schematic.java b/src/main/java/ru/nanit/limbo/world/schematic/Schematic.java deleted file mode 100644 index 24d0102..0000000 --- a/src/main/java/ru/nanit/limbo/world/schematic/Schematic.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world.schematic; - -import ru.nanit.limbo.protocol.registry.Version; -import ru.nanit.limbo.world.BlockData; -import ru.nanit.limbo.world.BlockEntity; -import ru.nanit.limbo.world.Location; - -import java.util.List; - -public interface Schematic { - - int getWidth(); - - int getHeight(); - - int getLength(); - - List getBlockEntities(); - - BlockData getBlock(Location loc, Version version); - -} diff --git a/src/main/java/ru/nanit/limbo/world/schematic/SchematicLoader.java b/src/main/java/ru/nanit/limbo/world/schematic/SchematicLoader.java deleted file mode 100644 index 70596a0..0000000 --- a/src/main/java/ru/nanit/limbo/world/schematic/SchematicLoader.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world.schematic; - -import net.kyori.adventure.nbt.BinaryTag; -import net.kyori.adventure.nbt.BinaryTagIO; -import net.kyori.adventure.nbt.CompoundBinaryTag; -import ru.nanit.limbo.world.BlockEntity; -import ru.nanit.limbo.world.BlockMappings; -import ru.nanit.limbo.world.Location; -import ru.nanit.limbo.world.schematic.versions.LegacySchematic; -import ru.nanit.limbo.world.schematic.versions.SpongeSchematic; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public class SchematicLoader { - - private final BlockMappings mappings; - - public SchematicLoader(BlockMappings mappings) { - this.mappings = mappings; - } - - public Schematic load(Path file) throws IOException { - return load(Files.newInputStream(file)); - } - - public Schematic load(InputStream stream) throws IOException { - CompoundBinaryTag nbt = BinaryTagIO.unlimitedReader().read(stream, BinaryTagIO.Compression.GZIP); - - if (nbt.keySet().contains("BlockData")) { - return loadSponge(nbt); - } else { - return loadLegacy(nbt); - } - } - - // Specification: https://github.com/SpongePowered/Schematic-Specification/blob/master/versions/schematic-2.md - private Schematic loadSponge(CompoundBinaryTag nbt) { - SpongeSchematic schematic = new SpongeSchematic(mappings); - - schematic.setDataVersion(nbt.getInt("DataVersion")); - - schematic.setWidth(nbt.getShort("Width")); - schematic.setHeight(nbt.getShort("Height")); - schematic.setLength(nbt.getShort("Length")); - - schematic.setPaletteMax(nbt.getInt("PaletteMax")); - - Map palette = new HashMap<>(); - CompoundBinaryTag paletteNbt = nbt.getCompound("Palette"); - - for (String key : paletteNbt.keySet()) { - palette.put(paletteNbt.getInt(key), key); - } - - schematic.setPalette(palette); - schematic.setBlockData(nbt.getByteArray("BlockData")); - - List blockEntities = new LinkedList<>(); - - for (BinaryTag tag : nbt.getList("BlockEntities")) { - if (tag instanceof CompoundBinaryTag) { - CompoundBinaryTag data = (CompoundBinaryTag) tag; - - int[] posArr = data.getIntArray("Pos"); - Location pos = Location.pos(posArr[0], posArr[1], posArr[2]); - String id = data.getString("Id"); - CompoundBinaryTag extra = data.getCompound("Extra"); - - blockEntities.add(new BlockEntity(pos, id, extra)); - } - } - - schematic.setBlockEntities(blockEntities); - - return schematic; - } - - private Schematic loadLegacy(CompoundBinaryTag nbt) { - LegacySchematic schematic = new LegacySchematic(mappings); - - schematic.setWidth(nbt.getShort("Width")); - schematic.setHeight(nbt.getShort("Height")); - schematic.setLength(nbt.getShort("Length")); - - schematic.setMaterials(LegacySchematic.Materials.from(nbt.getString("Materials"))); - - schematic.setBlocks(nbt.getByteArray("Blocks")); - schematic.setAddBlocks(nbt.getByteArray("AddBlocks")); - schematic.setData(nbt.getByteArray("Data")); - - List blockEntities = new LinkedList<>(); - - for (BinaryTag tag : nbt.getList("TileEntities")) { - if (tag instanceof CompoundBinaryTag) { - CompoundBinaryTag data = (CompoundBinaryTag) tag; - - String id = data.getString("id"); - int x = data.getInt("x"); - int y = data.getInt("y"); - int z = data.getInt("z"); - - data.remove("id"); - data.remove("x"); - data.remove("y"); - data.remove("z"); - - blockEntities.add(new BlockEntity(Location.pos(x, y, z), id, data)); - } - } - - schematic.setBlockEntities(blockEntities); - - return schematic; - } -} diff --git a/src/main/java/ru/nanit/limbo/world/schematic/versions/LegacySchematic.java b/src/main/java/ru/nanit/limbo/world/schematic/versions/LegacySchematic.java deleted file mode 100644 index 70614b6..0000000 --- a/src/main/java/ru/nanit/limbo/world/schematic/versions/LegacySchematic.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world.schematic.versions; - -import ru.nanit.limbo.protocol.registry.Version; -import ru.nanit.limbo.world.BlockData; -import ru.nanit.limbo.world.BlockMappings; -import ru.nanit.limbo.world.Location; -import ru.nanit.limbo.world.schematic.AbstractSchematic; - -/** - * Legacy schematic format (1.12-) - */ -public class LegacySchematic extends AbstractSchematic { - - private Materials materials; - private byte[] blocks; - private byte[] addBlocks; - private byte[] data; - - public LegacySchematic(BlockMappings mappings) { - super(mappings); - } - - @Override - public BlockData getBlock(Location loc, Version version) { - int index = (loc.getBlockY() * getLength() + loc.getBlockZ()) * getWidth() + loc.getBlockX(); - byte id = this.blocks[index]; - byte data = this.data[index]; - - return mappings.convert(id, data, version); - } - - public void setMaterials(Materials materials) { - this.materials = materials; - } - - public void setBlocks(byte[] blocks) { - this.blocks = blocks; - } - - public void setAddBlocks(byte[] addBlocks) { - this.addBlocks = addBlocks; - } - - public void setData(byte[] data) { - this.data = data; - } - - @Override - public String toString() { - return "Schematic{" + - "width=" + getWidth() + - ", height=" + getHeight() + - ", length=" + getLength() + - ", materials=" + materials + - ", blocks length=" + blocks.length + - ", addBlocks length=" + addBlocks.length + - ", data length=" + data.length + - ", blockEntities=" + getBlockEntities() + - '}'; - } - - public enum Materials { - - CLASSIC, - ALPHA, - POCKET; - - public static Materials from(String value) { - switch (value.toLowerCase()) { - case "classic": return CLASSIC; - case "alpha": return ALPHA; - case "pocket": return POCKET; - default: throw new IllegalArgumentException("Invalid materials type"); - } - } - } -} diff --git a/src/main/java/ru/nanit/limbo/world/schematic/versions/SpongeSchematic.java b/src/main/java/ru/nanit/limbo/world/schematic/versions/SpongeSchematic.java deleted file mode 100644 index bc6010c..0000000 --- a/src/main/java/ru/nanit/limbo/world/schematic/versions/SpongeSchematic.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ru.nanit.limbo.world.schematic.versions; - -import ru.nanit.limbo.protocol.registry.Version; -import ru.nanit.limbo.world.BlockData; -import ru.nanit.limbo.world.BlockMappings; -import ru.nanit.limbo.world.Location; -import ru.nanit.limbo.world.schematic.AbstractSchematic; - -import java.util.Map; - -/** - * Modern schematic format (Sponge second specification) - */ -public class SpongeSchematic extends AbstractSchematic { - - private int dataVersion; - private int paletteMax; - private Map palette; - private byte[] blockData; - - public SpongeSchematic(BlockMappings mappings) { - super(mappings); - } - - @Override - public BlockData getBlock(Location loc, Version version) { - int index = loc.getBlockX() + loc.getBlockZ() * getWidth() + loc.getBlockY() * getWidth() * getLength(); - int id = blockData[index]; - String state = palette.get(id); - return mappings.convert(state, version); - } - - public void setDataVersion(int dataVersion) { - this.dataVersion = dataVersion; - } - - public void setPaletteMax(int paletteMax) { - this.paletteMax = paletteMax; - } - - public void setPalette(Map palette) { - this.palette = palette; - } - - public void setBlockData(byte[] blockData) { - this.blockData = blockData; - } - - @Override - public String toString() { - return "SpongeSchematic{" + - "dataVersion=" + dataVersion + - ", width=" + getWidth() + - ", height=" + getHeight() + - ", length=" + getLength() + - ", paletteMax=" + paletteMax + - ", palette=" + palette + - ", blockData bytes=" + blockData.length + - ", blockEntities=" + getBlockEntities() + - '}'; - } -} diff --git a/src/test/java/SchematicTest.java b/src/test/java/SchematicTest.java deleted file mode 100644 index 157e434..0000000 --- a/src/test/java/SchematicTest.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2020 Nan1t - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -import org.junit.jupiter.api.Test; -import ru.nanit.limbo.world.BlockMappings; -import ru.nanit.limbo.world.schematic.SchematicLoader; - -import java.io.IOException; -import java.io.InputStream; - -public class SchematicTest { - - @Test - public void testLoading() throws IOException { - BlockMappings mappings = new BlockMappings(); - SchematicLoader loader = new SchematicLoader(mappings); - InputStream stream = getClass().getResourceAsStream("spawn.schem"); - - System.out.println(loader.load(stream)); - } -} diff --git a/src/test/resources/spawn.schem b/src/test/resources/spawn.schem deleted file mode 100644 index 0a800b50ce1b8fed7f9291330f03d7d4f3c24c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6609 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 diff --git a/src/test/resources/test.schematic b/src/test/resources/test.schematic deleted file mode 100644 index 4119765f9bc9470c60feaa85ba08e6dff8b8df1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6981 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