diff --git a/core/pom.xml b/core/pom.xml
index 1fd519b5..538301df 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -47,5 +47,19 @@
jar
compile
+
+ io.github.dre2n
+ dungeonsxl-craftbukkit_1_9_R2
+ ${parent.version}
+ jar
+ compile
+
+
+ io.github.dre2n
+ dungeonsxl-craftbukkit_1_9_R1
+ ${parent.version}
+ jar
+ compile
+
diff --git a/core/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/WorldLoader.java b/core/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/WorldLoader.java
index 973ef8be..36ffcb41 100644
--- a/core/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/WorldLoader.java
+++ b/core/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/WorldLoader.java
@@ -34,6 +34,12 @@ public class WorldLoader {
case v1_10_R1:
internals = new v1_10_R1();
break;
+ case v1_9_R2:
+ internals = new v1_9_R2();
+ break;
+ case v1_9_R1:
+ internals = new v1_9_R1();
+ break;
}
}
diff --git a/craftbukkit_1_9_R1/pom.xml b/craftbukkit_1_9_R1/pom.xml
new file mode 100644
index 00000000..aa94c122
--- /dev/null
+++ b/craftbukkit_1_9_R1/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ io.github.dre2n
+ dungeonsxl-craftbukkit_1_9_R1
+ ${parent.version}
+ jar
+ dungeonsxl-craftbukkit_1_9_R1
+
+ io.github.dre2n
+ dungeonsxl
+ 0.14-SNAPSHOT${buildNo}
+
+
+
+
+ maven-compiler-plugin
+ 2.5.1
+
+
+ 1.7
+
+
+
+
+
+
+ org.bukkit
+ craftbukkit
+ 1.9.2-R0.1-SNAPSHOT
+ provided
+
+
+ io.github.dre2n
+ dungeonsxl-abstract
+ ${parent.version}
+ jar
+ compile
+
+
+
diff --git a/craftbukkit_1_9_R1/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/v1_9_R1.java b/craftbukkit_1_9_R1/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/v1_9_R1.java
new file mode 100644
index 00000000..44f8be31
--- /dev/null
+++ b/craftbukkit_1_9_R1/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/v1_9_R1.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2012-2016 Frank Baumann
+ *
+ * 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 io.github.dre2n.dungeonsxl.util.worldloader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_9_R1.BlockPosition;
+import net.minecraft.server.v1_9_R1.Convertable;
+import net.minecraft.server.v1_9_R1.EntityTracker;
+import net.minecraft.server.v1_9_R1.EnumDifficulty;
+import net.minecraft.server.v1_9_R1.IDataManager;
+import net.minecraft.server.v1_9_R1.IProgressUpdate;
+import net.minecraft.server.v1_9_R1.MinecraftServer;
+import net.minecraft.server.v1_9_R1.ServerNBTManager;
+import net.minecraft.server.v1_9_R1.WorldData;
+import net.minecraft.server.v1_9_R1.WorldLoaderServer;
+import net.minecraft.server.v1_9_R1.WorldManager;
+import net.minecraft.server.v1_9_R1.WorldServer;
+import net.minecraft.server.v1_9_R1.WorldSettings;
+import net.minecraft.server.v1_9_R1.WorldSettings.EnumGamemode;
+import net.minecraft.server.v1_9_R1.WorldType;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.craftbukkit.v1_9_R1.CraftServer;
+import org.bukkit.craftbukkit.v1_9_R1.CraftWorld;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.plugin.PluginManager;
+
+/**
+ * @author Daniel Saukel
+ */
+class v1_9_R1 extends InternalsProvider {
+
+ MinecraftServer console;
+ CraftServer server = ((CraftServer) Bukkit.getServer());
+ Map worlds;
+ PluginManager pluginManager = Bukkit.getPluginManager();
+ File worldContainer = Bukkit.getWorldContainer();
+ Logger logger = Bukkit.getLogger();
+
+ v1_9_R1() {
+ try {
+ Field fConsole = CraftServer.class.getDeclaredField("console");
+ fConsole.setAccessible(true);
+ console = (MinecraftServer) fConsole.get(server);
+
+ Field fWorlds = CraftServer.class.getDeclaredField("worlds");
+ fWorlds.setAccessible(true);
+ worlds = (Map) fWorlds.get(server);
+
+ } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ World createWorld(WorldCreator creator) {
+ String name = creator.name();
+ ChunkGenerator generator = creator.generator();
+ File folder = new File(worldContainer, name);
+ World world = Bukkit.getWorld(name);
+ WorldType type = WorldType.getType(creator.type().getName());
+ boolean generateStructures = creator.generateStructures();
+
+ if (world != null) {
+ return world;
+ }
+
+ if ((folder.exists()) && (!folder.isDirectory())) {
+ throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
+ }
+
+ if (generator == null) {
+ generator = server.getGenerator(name);
+ }
+
+ Convertable converter = new WorldLoaderServer(worldContainer, server.getHandle().getServer().getDataConverterManager());
+ if (converter.isConvertable(name)) {
+ logger.info("Converting world '" + name + "'");
+ converter.convert(name, new IProgressUpdate() {
+ private long b = System.currentTimeMillis();
+
+ @Override
+ public void a(String s) {
+ }
+
+ @Override
+ public void a(int i) {
+ if (System.currentTimeMillis() - this.b >= 1000L) {
+ this.b = System.currentTimeMillis();
+ MinecraftServer.LOGGER.info("Converting... " + i + "%");
+ }
+
+ }
+
+ @Override
+ public void c(String s) {
+ }
+ });
+ }
+
+ int dimension = CraftWorld.CUSTOM_DIMENSION_OFFSET + console.worlds.size();
+ boolean used = false;
+ do {
+ for (WorldServer server : console.worlds) {
+ used = server.dimension == dimension;
+ if (used) {
+ dimension++;
+ break;
+ }
+ }
+ } while (used);
+ boolean hardcore = false;
+
+ IDataManager sdm = new ServerNBTManager(worldContainer, name, true, server.getHandle().getServer().getDataConverterManager());
+ WorldData worlddata = sdm.getWorldData();
+ WorldSettings worldSettings = null;
+ if (worlddata == null) {
+ worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById(server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
+ worldSettings.setGeneratorSettings(creator.generatorSettings());
+ worlddata = new WorldData(worldSettings, name);
+ }
+ worlddata.checkName(name); // CraftBukkit - Migration did not rewrite the level.dat; This forces 1.8 to take the last loaded world as respawn (in this case the end)
+ WorldServer internal = (WorldServer) new WorldServer(console, sdm, worlddata, dimension, console.methodProfiler, creator.environment(), generator).b();
+
+ if (!(worlds.containsKey(name.toLowerCase(java.util.Locale.ENGLISH)))) {
+ return null;
+ }
+
+ if (worldSettings != null) {
+ internal.a(worldSettings);
+ }
+ internal.scoreboard = server.getScoreboardManager().getMainScoreboard().getHandle();
+
+ internal.tracker = new EntityTracker(internal);
+ internal.addIWorldAccess(new WorldManager(console, internal));
+ internal.worldData.setDifficulty(EnumDifficulty.EASY);
+ internal.setSpawnFlags(true, true);
+ console.worlds.add(internal);
+
+ if (generator != null) {
+ internal.getWorld().getPopulators().addAll(generator.getDefaultPopulators(internal.getWorld()));
+ }
+
+ pluginManager.callEvent(new WorldInitEvent(internal.getWorld()));
+ logger.info("Preparing start region for level " + (console.worlds.size() - 1) + " (Seed: " + internal.getSeed() + ")");
+
+ if (internal.getWorld().getKeepSpawnInMemory()) {
+ short short1 = 196;
+ long i = System.currentTimeMillis();
+ for (int j = -short1; j <= short1; j += 16) {
+ for (int k = -short1; k <= short1; k += 16) {
+ long l = System.currentTimeMillis();
+
+ if (l < i) {
+ i = l;
+ }
+
+ if (l > i + 1000L) {
+ int i1 = (short1 * 2 + 1) * (short1 * 2 + 1);
+ int j1 = (j + short1) * (short1 * 2 + 1) + k + 1;
+
+ logger.info("Preparing spawn area for " + name + ", " + (j1 * 100 / i1) + "%");
+ i = l;
+ }
+
+ BlockPosition chunkcoordinates = internal.getSpawn();
+ try {
+ internal.getChunkProviderServer().getChunkAt(chunkcoordinates.getX() + j >> 4, chunkcoordinates.getZ() + k >> 4);
+ } catch (Exception exception) {
+ }
+ }
+ }
+ }
+ pluginManager.callEvent(new WorldLoadEvent(internal.getWorld()));
+ return internal.getWorld();
+ }
+
+}
diff --git a/craftbukkit_1_9_R2/pom.xml b/craftbukkit_1_9_R2/pom.xml
new file mode 100644
index 00000000..4823c2ab
--- /dev/null
+++ b/craftbukkit_1_9_R2/pom.xml
@@ -0,0 +1,40 @@
+
+ 4.0.0
+ io.github.dre2n
+ dungeonsxl-craftbukkit_1_9_R2
+ ${parent.version}
+ jar
+ dungeonsxl-craftbukkit_1_9_R2
+
+ io.github.dre2n
+ dungeonsxl
+ 0.14-SNAPSHOT${buildNo}
+
+
+
+
+ maven-compiler-plugin
+ 2.5.1
+
+
+ 1.7
+
+
+
+
+
+
+ org.bukkit
+ craftbukkit
+ 1.9.4-R0.1-SNAPSHOT
+ provided
+
+
+ io.github.dre2n
+ dungeonsxl-abstract
+ ${parent.version}
+ jar
+ compile
+
+
+
diff --git a/craftbukkit_1_9_R2/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/v1_9_R2.java b/craftbukkit_1_9_R2/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/v1_9_R2.java
new file mode 100644
index 00000000..565fbd49
--- /dev/null
+++ b/craftbukkit_1_9_R2/src/main/java/io/github/dre2n/dungeonsxl/util/worldloader/v1_9_R2.java
@@ -0,0 +1,199 @@
+/*
+ * Copyright (C) 2012-2016 Frank Baumann
+ *
+ * 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 io.github.dre2n.dungeonsxl.util.worldloader;
+
+import java.io.File;
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.logging.Logger;
+import net.minecraft.server.v1_9_R2.BlockPosition;
+import net.minecraft.server.v1_9_R2.Convertable;
+import net.minecraft.server.v1_9_R2.EntityTracker;
+import net.minecraft.server.v1_9_R2.EnumDifficulty;
+import net.minecraft.server.v1_9_R2.IDataManager;
+import net.minecraft.server.v1_9_R2.IProgressUpdate;
+import net.minecraft.server.v1_9_R2.MinecraftServer;
+import net.minecraft.server.v1_9_R2.ServerNBTManager;
+import net.minecraft.server.v1_9_R2.WorldData;
+import net.minecraft.server.v1_9_R2.WorldLoaderServer;
+import net.minecraft.server.v1_9_R2.WorldManager;
+import net.minecraft.server.v1_9_R2.WorldServer;
+import net.minecraft.server.v1_9_R2.WorldSettings;
+import net.minecraft.server.v1_9_R2.WorldSettings.EnumGamemode;
+import net.minecraft.server.v1_9_R2.WorldType;
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.craftbukkit.v1_9_R2.CraftServer;
+import org.bukkit.craftbukkit.v1_9_R2.CraftWorld;
+import org.bukkit.event.world.WorldInitEvent;
+import org.bukkit.event.world.WorldLoadEvent;
+import org.bukkit.generator.ChunkGenerator;
+import org.bukkit.plugin.PluginManager;
+
+/**
+ * @author Daniel Saukel
+ */
+class v1_9_R2 extends InternalsProvider {
+
+ MinecraftServer console;
+ CraftServer server = ((CraftServer) Bukkit.getServer());
+ Map worlds;
+ PluginManager pluginManager = Bukkit.getPluginManager();
+ File worldContainer = Bukkit.getWorldContainer();
+ Logger logger = Bukkit.getLogger();
+
+ v1_9_R2() {
+ try {
+ Field fConsole = CraftServer.class.getDeclaredField("console");
+ fConsole.setAccessible(true);
+ console = (MinecraftServer) fConsole.get(server);
+
+ Field fWorlds = CraftServer.class.getDeclaredField("worlds");
+ fWorlds.setAccessible(true);
+ worlds = (Map) fWorlds.get(server);
+
+ } catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException exception) {
+ exception.printStackTrace();
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ World createWorld(WorldCreator creator) {
+ String name = creator.name();
+ ChunkGenerator generator = creator.generator();
+ File folder = new File(worldContainer, name);
+ World world = Bukkit.getWorld(name);
+ WorldType type = WorldType.getType(creator.type().getName());
+ boolean generateStructures = creator.generateStructures();
+
+ if (world != null) {
+ return world;
+ }
+
+ if ((folder.exists()) && (!folder.isDirectory())) {
+ throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
+ }
+
+ if (generator == null) {
+ generator = server.getGenerator(name);
+ }
+
+ Convertable converter = new WorldLoaderServer(worldContainer, server.getHandle().getServer().getDataConverterManager());
+ if (converter.isConvertable(name)) {
+ logger.info("Converting world '" + name + "'");
+ converter.convert(name, new IProgressUpdate() {
+ private long b = System.currentTimeMillis();
+
+ @Override
+ public void a(String s) {
+ }
+
+ @Override
+ public void a(int i) {
+ if (System.currentTimeMillis() - this.b >= 1000L) {
+ this.b = System.currentTimeMillis();
+ MinecraftServer.LOGGER.info("Converting... " + i + "%");
+ }
+
+ }
+
+ @Override
+ public void c(String s) {
+ }
+ });
+ }
+
+ int dimension = CraftWorld.CUSTOM_DIMENSION_OFFSET + console.worlds.size();
+ boolean used = false;
+ do {
+ for (WorldServer server : console.worlds) {
+ used = server.dimension == dimension;
+ if (used) {
+ dimension++;
+ break;
+ }
+ }
+ } while (used);
+ boolean hardcore = false;
+
+ IDataManager sdm = new ServerNBTManager(worldContainer, name, true, server.getHandle().getServer().getDataConverterManager());
+ WorldData worlddata = sdm.getWorldData();
+ WorldSettings worldSettings = null;
+ if (worlddata == null) {
+ worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById(server.getDefaultGameMode().getValue()), generateStructures, hardcore, type);
+ worldSettings.setGeneratorSettings(creator.generatorSettings());
+ worlddata = new WorldData(worldSettings, name);
+ }
+ worlddata.checkName(name); // CraftBukkit - Migration did not rewrite the level.dat; This forces 1.8 to take the last loaded world as respawn (in this case the end)
+ WorldServer internal = (WorldServer) new WorldServer(console, sdm, worlddata, dimension, console.methodProfiler, creator.environment(), generator).b();
+
+ if (!(worlds.containsKey(name.toLowerCase(java.util.Locale.ENGLISH)))) {
+ return null;
+ }
+
+ if (worldSettings != null) {
+ internal.a(worldSettings);
+ }
+ internal.scoreboard = server.getScoreboardManager().getMainScoreboard().getHandle();
+
+ internal.tracker = new EntityTracker(internal);
+ internal.addIWorldAccess(new WorldManager(console, internal));
+ internal.worldData.setDifficulty(EnumDifficulty.EASY);
+ internal.setSpawnFlags(true, true);
+ console.worlds.add(internal);
+
+ if (generator != null) {
+ internal.getWorld().getPopulators().addAll(generator.getDefaultPopulators(internal.getWorld()));
+ }
+
+ pluginManager.callEvent(new WorldInitEvent(internal.getWorld()));
+ logger.info("Preparing start region for level " + (console.worlds.size() - 1) + " (Seed: " + internal.getSeed() + ")");
+
+ if (internal.getWorld().getKeepSpawnInMemory()) {
+ short short1 = 196;
+ long i = System.currentTimeMillis();
+ for (int j = -short1; j <= short1; j += 16) {
+ for (int k = -short1; k <= short1; k += 16) {
+ long l = System.currentTimeMillis();
+
+ if (l < i) {
+ i = l;
+ }
+
+ if (l > i + 1000L) {
+ int i1 = (short1 * 2 + 1) * (short1 * 2 + 1);
+ int j1 = (j + short1) * (short1 * 2 + 1) + k + 1;
+
+ logger.info("Preparing spawn area for " + name + ", " + (j1 * 100 / i1) + "%");
+ i = l;
+ }
+
+ BlockPosition chunkcoordinates = internal.getSpawn();
+ try {
+ internal.getChunkProviderServer().getChunkAt(chunkcoordinates.getX() + j >> 4, chunkcoordinates.getZ() + k >> 4);
+ } catch (Exception exception) {
+ }
+ }
+ }
+ }
+ pluginManager.callEvent(new WorldLoadEvent(internal.getWorld()));
+ return internal.getWorld();
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 3fe3f66c..5da815ff 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,8 @@
core
abstract
craftbukkit_1_10_R1
+ craftbukkit_1_9_R2
+ craftbukkit_1_9_R1
diff --git a/shade/pom.xml b/shade/pom.xml
index 1f960e92..70592c91 100644
--- a/shade/pom.xml
+++ b/shade/pom.xml
@@ -70,5 +70,19 @@
jar
compile
+
+ io.github.dre2n
+ dungeonsxl-craftbukkit_1_9_R2
+ ${parent.version}
+ jar
+ compile
+
+
+ io.github.dre2n
+ dungeonsxl-craftbukkit_1_9_R1
+ ${parent.version}
+ jar
+ compile
+