diff --git a/.classpath b/.classpath index 82298c2..aa54b47 100644 --- a/.classpath +++ b/.classpath @@ -11,7 +11,6 @@ - diff --git a/lib/JNBT_1.3.jar b/lib/JNBT_1.3.jar deleted file mode 100644 index 8b197e1..0000000 Binary files a/lib/JNBT_1.3.jar and /dev/null differ diff --git a/pom.xml b/pom.xml index 526a5fd..3a87875 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,12 @@ 1.8 1.8 + + + jitpack.io + https://jitpack.io + + commons-io @@ -54,5 +60,10 @@ 3.7.0 + + com.github.piegamesde + nbt + dbe4ea253b + \ No newline at end of file diff --git a/src/main/java/morlok8k/MinecraftLandGenerator/Server.java b/src/main/java/morlok8k/MinecraftLandGenerator/Server.java index 128c7f5..8772764 100644 --- a/src/main/java/morlok8k/MinecraftLandGenerator/Server.java +++ b/src/main/java/morlok8k/MinecraftLandGenerator/Server.java @@ -28,14 +28,16 @@ import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.jnbt.CompoundTag; -import org.jnbt.IntTag; -import org.jnbt.NBTInputStream; -import org.jnbt.NBTOutputStream; -import org.jnbt.Tag; import org.joml.Vector2i; import org.joml.Vector3i; +import com.flowpowered.nbt.CompoundMap; +import com.flowpowered.nbt.CompoundTag; +import com.flowpowered.nbt.IntTag; +import com.flowpowered.nbt.Tag; +import com.flowpowered.nbt.stream.NBTInputStream; +import com.flowpowered.nbt.stream.NBTOutputStream; + /** * * @author morlok8k @@ -93,28 +95,17 @@ public class Server { * @author Corrodias */ protected static Vector3i getSpawn(final File level) throws IOException { - try { - final NBTInputStream input = new NBTInputStream(new FileInputStream(level)); - final CompoundTag originalTopLevelTag = (CompoundTag) input.readTag(); - input.close(); + try (NBTInputStream input = new NBTInputStream(new FileInputStream(level));) { + final CompoundTag levelTag = (CompoundTag) input.readTag(); + final Map> levelData = + ((CompoundTag) levelTag.getValue().get("Data")).getValue(); - final Map originalData = - ((CompoundTag) originalTopLevelTag.getValue().get("Data")).getValue(); - // This is our map of data. It is an unmodifiable map, for some - // reason, so we have to make a copy. - final Map newData = new LinkedHashMap<>(originalData); - // .get() a couple of values, just to make sure we're dealing with a - // valid level file, here. Good for debugging, too. - final IntTag spawnX = (IntTag) newData.get("SpawnX"); - final IntTag spawnY = (IntTag) newData.get("SpawnY"); - final IntTag spawnZ = (IntTag) newData.get("SpawnZ"); + final IntTag spawnX = (IntTag) levelData.get("SpawnX"); + final IntTag spawnY = (IntTag) levelData.get("SpawnY"); + final IntTag spawnZ = (IntTag) levelData.get("SpawnZ"); - final Vector3i ret = - new Vector3i(spawnX.getValue(), spawnY.getValue(), spawnZ.getValue()); - return ret; - } catch (final ClassCastException ex) { - throw new IOException("Invalid level format."); - } catch (final NullPointerException ex) { + return new Vector3i(spawnX.getValue(), spawnY.getValue(), spawnZ.getValue()); + } catch (final ClassCastException | NullPointerException ex) { throw new IOException("Invalid level format."); } } @@ -138,64 +129,25 @@ public class Server { * @author Corrodias */ protected static void setSpawn(final File level, final Vector3i xyz) throws IOException { - - try { - final NBTInputStream input = new NBTInputStream(new FileInputStream(level)); + // TODO clean this up even more + try (NBTInputStream input = new NBTInputStream(new FileInputStream(level));) { final CompoundTag originalTopLevelTag = (CompoundTag) input.readTag(); input.close(); - //@formatter:off - - //Note: The Following Information is Old (from 2010), compared to the Data inside a current "level.dat". - //However, What we look at (SpawnX,Y,Z and RandomSeed) have not changed. - - /* - * Structure: - * - *TAG_Compound("Data"): World data. - * * TAG_Long("Time"): Stores the current "time of day" in ticks. There are 20 ticks per real-life second, and 24000 ticks per Minecraft day, making the day length 20 minutes. 0 appears to be sunrise, 12000 sunset and 24000 sunrise again. - * * TAG_Long("LastPlayed"): Stores the Unix time stamp (in milliseconds) when the player saved the game. - * * TAG_Compound("Player"): Player entity information. See Entity Format and Mob Entity Format for details. Has additional elements: - * o TAG_List("Inventory"): Each TAG_Compound in this list defines an item the player is carrying, holding, or wearing as armor. - * + TAG_Compound: Inventory item data - * # TAG_Short("id"): Item or Block ID. - * # TAG_Short("Damage"): The amount of wear each item has suffered. 0 means undamaged. When the Damage exceeds the item's durability, it breaks and disappears. Only tools and armor accumulate damage normally. - * # TAG_Byte("Count"): Number of items stacked in this inventory slot. Any item can be stacked, including tools, armor, and vehicles. Range is 1-255. Values above 127 are not displayed in-game. - * # TAG_Byte("Slot"): Indicates which inventory slot this item is in. - * o TAG_Int("Score"): Current score, doesn't appear to be implemented yet. Always 0. - * * TAG_Int("SpawnX"): X coordinate of the player's spawn position. Default is 0. - * * TAG_Int("SpawnY"): Y coordinate of the player's spawn position. Default is 64. - * * TAG_Int("SpawnZ"): Z coordinate of the player's spawn position. Default is 0. - * * TAG_Byte("SnowCovered"): 1 enables, 0 disables, see Winter Mode - * * TAG_Long("SizeOnDisk"): Estimated size of the entire world in bytes. - * * TAG_Long("RandomSeed"): Random number providing the Random Seed for the terrain. - * - */ - - //@formatter:on - - final Map originalData = + final Map> originalData = ((CompoundTag) originalTopLevelTag.getValue().get("Data")).getValue(); // This is our map of data. It is an unmodifiable map, for some reason, so we have to make a copy. - final Map newData = new LinkedHashMap<>(originalData); - - // .get() a couple of values, just to make sure we're dealing with a valid level file, here. Good for debugging, too. - @SuppressWarnings("unused") - final IntTag spawnX = (IntTag) newData.get("SpawnX"); // we never use these... Its only here for potential debugging. - @SuppressWarnings("unused") - final IntTag spawnY = (IntTag) newData.get("SpawnY"); // but whatever... so I (Morlok8k) suppressed these warnings. - @SuppressWarnings("unused") - final IntTag spawnZ = (IntTag) newData.get("SpawnZ"); // I don't want to remove existing code, either by myself (Morlok8k) or Corrodias + final Map> newData = new LinkedHashMap<>(originalData); newData.put("SpawnX", new IntTag("SpawnX", xyz.x)); // pulling the data out of the Coordinates, newData.put("SpawnY", new IntTag("SpawnY", xyz.y)); // and putting it into our IntTag's newData.put("SpawnZ", new IntTag("SpawnZ", xyz.z)); // Again, we can't modify the data map in the old Tag, so we have to make a new one. - final CompoundTag newDataTag = new CompoundTag("Data", newData); - final Map newTopLevelMap = new HashMap<>(1); + final CompoundTag newDataTag = new CompoundTag("Data", new CompoundMap(newData)); + final Map> newTopLevelMap = new HashMap<>(1); newTopLevelMap.put("Data", newDataTag); - final CompoundTag newTopLevelTag = new CompoundTag("", newTopLevelMap); + final CompoundTag newTopLevelTag = new CompoundTag("", new CompoundMap(newTopLevelMap)); final NBTOutputStream output = new NBTOutputStream(new FileOutputStream(level)); output.writeTag(newTopLevelTag);