Advertisement
Jetp250

Skylands.java

May 12th, 2017
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.92 KB | None | 0 0
  1. package me.jetp250.skylands;
  2.  
  3. import java.io.File;
  4. import java.util.Locale;
  5.  
  6. import org.bukkit.Bukkit;
  7. import org.bukkit.World;
  8. import org.bukkit.World.Environment;
  9. import org.bukkit.command.Command;
  10. import org.bukkit.command.CommandExecutor;
  11. import org.bukkit.command.CommandSender;
  12. import org.bukkit.craftbukkit.v1_11_R1.CraftServer;
  13. import org.bukkit.craftbukkit.v1_11_R1.CraftWorld;
  14. import org.bukkit.entity.Player;
  15. import org.bukkit.event.world.WorldInitEvent;
  16. import org.bukkit.event.world.WorldLoadEvent;
  17. import org.bukkit.generator.ChunkGenerator;
  18. import org.bukkit.plugin.java.JavaPlugin;
  19.  
  20. import co.aikar.timings.TimedChunkGenerator;
  21. import me.jetp250.skylands.utility.FastRandom;
  22. import net.minecraft.server.v1_11_R1.BlockPosition;
  23. import net.minecraft.server.v1_11_R1.ChunkProviderServer;
  24. import net.minecraft.server.v1_11_R1.Convertable;
  25. import net.minecraft.server.v1_11_R1.EntityTracker;
  26. import net.minecraft.server.v1_11_R1.EnumDifficulty;
  27. import net.minecraft.server.v1_11_R1.EnumGamemode;
  28. import net.minecraft.server.v1_11_R1.IChunkLoader;
  29. import net.minecraft.server.v1_11_R1.IChunkProvider;
  30. import net.minecraft.server.v1_11_R1.IDataManager;
  31. import net.minecraft.server.v1_11_R1.IProgressUpdate;
  32. import net.minecraft.server.v1_11_R1.MinecraftServer;
  33. import net.minecraft.server.v1_11_R1.ServerNBTManager;
  34. import net.minecraft.server.v1_11_R1.WorldData;
  35. import net.minecraft.server.v1_11_R1.WorldLoaderServer;
  36. import net.minecraft.server.v1_11_R1.WorldManager;
  37. import net.minecraft.server.v1_11_R1.WorldServer;
  38. import net.minecraft.server.v1_11_R1.WorldSettings;
  39. import net.minecraft.server.v1_11_R1.WorldType;
  40.  
  41. public class Skylands extends JavaPlugin {
  42.  
  43.     public static final FastRandom SHARED_RANDOM;
  44.     protected static final MinecraftServer MC_SERVER;
  45.     protected static final CraftServer CB_SERVER;
  46.  
  47.     @Override
  48.     public void onEnable() {
  49.         this.getCommand("generateworld").setExecutor(new WorldGenCommandExecutor());
  50.     }
  51.  
  52.     @Override
  53.     public ChunkGenerator getDefaultWorldGenerator(final String worldName, final String id) {
  54.         final World world;
  55.         if ((world = Bukkit.getWorld(worldName)) == null) {
  56.             return null;
  57.         }
  58.         return new IslandChunkGenerator(((CraftWorld) world).getHandle(), Skylands.SHARED_RANDOM);
  59.     }
  60.  
  61.     public static MinecraftServer getMinecraftServer() {
  62.         return Skylands.MC_SERVER;
  63.     }
  64.  
  65.     public static CraftServer getCraftServer() {
  66.         return Skylands.CB_SERVER;
  67.     }
  68.  
  69.     static {
  70.         SHARED_RANDOM = new FastRandom();
  71.         CB_SERVER = (CraftServer) Bukkit.getServer();
  72.         MC_SERVER = CB_SERVER.getServer();
  73.     }
  74.  
  75.     class WorldGenCommandExecutor implements CommandExecutor {
  76.         @SuppressWarnings("deprecation")
  77.         @Override
  78.         public boolean onCommand(final CommandSender sender, final Command cmd, final String label,
  79.                 final String[] args) {
  80.             if (!sender.hasPermission("skylands.generate")) {
  81.                 sender.sendMessage("\u00a7cYou don't have permission to do that.");
  82.                 return false;
  83.             }
  84.             if (args.length == 0) {
  85.                 sender.sendMessage("Usage: /" + label + " <name>");
  86.                 return false;
  87.             }
  88.             final String name = args[0];
  89.             sender.sendMessage("Starting generation of the world '" + name + "'...");
  90.             final MinecraftServer console = Skylands.getMinecraftServer();
  91.             final CraftServer craftServer = Skylands.getCraftServer();
  92.             final File folder = new File(craftServer.getWorldContainer(), name);
  93.             final World world = craftServer.getWorld(name);
  94.             if (world != null) {
  95.                 sender.sendMessage("World already exists, loading");
  96.                 if (sender instanceof Player) {
  97.                     ((Player) sender).teleport(world.getSpawnLocation());
  98.                 }
  99.                 return false;
  100.             }
  101.             final WorldType type = WorldType.NORMAL;
  102.             final boolean generateStructures = false; /*!*/
  103.             if (folder.exists() && !folder.isDirectory()) {
  104.                 throw new IllegalArgumentException("File exists with the name '" + name + "' and isn't a folder");
  105.             }
  106.             final Convertable converter = new WorldLoaderServer(craftServer.getWorldContainer(),
  107.                     craftServer.getHandle().getServer().getDataConverterManager());
  108.             if (converter.isConvertable(name)) {
  109.                 craftServer.getLogger().info("Converting world '" + name + "'");
  110.                 converter.convert(name, new IProgressUpdate() {
  111.                     private long b = System.currentTimeMillis();
  112.  
  113.                     @Override
  114.                     public void a(final String s) {
  115.                     }
  116.  
  117.                     @Override
  118.                     public void a(final int i) {
  119.                         if (System.currentTimeMillis() - this.b >= 1000L) {
  120.                             this.b = System.currentTimeMillis();
  121.                             MinecraftServer.LOGGER.info("Converting... " + i + "%");
  122.                         }
  123.                     }
  124.  
  125.                     @Override
  126.                     public void c(final String s) {
  127.                     }
  128.                 });
  129.             }
  130.             int dimension = 10 + console.worlds.size();
  131.             boolean used = false;
  132.             do {
  133.                 for (final WorldServer server : console.worlds) {
  134.                     used = (server.dimension == dimension);
  135.                     if (used) {
  136.                         ++dimension;
  137.                         break;
  138.                     }
  139.                 }
  140.             } while (used);
  141.             final boolean hardcore = false;
  142.             final IDataManager sdm = new ServerNBTManager(craftServer.getWorldContainer(), name, true,
  143.                     craftServer.getHandle().getServer().getDataConverterManager());
  144.             WorldData worlddata = sdm.getWorldData();
  145.             WorldSettings worldSettings = null;
  146.             if (worlddata == null) {
  147.                 worldSettings = new WorldSettings(Skylands.SHARED_RANDOM.nextLong(),
  148.                         EnumGamemode.getById(craftServer.getDefaultGameMode().getValue()), generateStructures, hardcore,
  149.                         type);
  150.                 worlddata = new WorldData(worldSettings, name);
  151.             }
  152.             worlddata.checkName(name);
  153.             final WorldServer internal = new WorldServer(console, sdm, worlddata, dimension, console.methodProfiler,
  154.                     Environment.NORMAL, null) {
  155.                 @Override
  156.                 protected IChunkProvider n() {
  157.                     final IChunkLoader ichunkloader = this.dataManager.createChunkLoader(this.worldProvider);
  158.                     return new ChunkProviderServer(this, ichunkloader,
  159.                             new TimedChunkGenerator(this, new IslandChunkGenerator(this, Skylands.SHARED_RANDOM)));
  160.                 }
  161.             };
  162.             internal.generator = new IslandChunkGenerator(internal, Skylands.SHARED_RANDOM);
  163.             internal.b();
  164.             if (craftServer.getWorld(name.toLowerCase(Locale.ENGLISH)) == null) {
  165.                 sender.sendMessage("Failed to create the world!");
  166.                 return false;
  167.             }
  168.             if (worldSettings != null) {
  169.                 internal.a(worldSettings);
  170.             }
  171.             internal.scoreboard = craftServer.getScoreboardManager().getMainScoreboard().getHandle();
  172.             internal.tracker = new EntityTracker(internal);
  173.             internal.addIWorldAccess(new WorldManager(console, internal));
  174.             internal.worldData.setDifficulty(EnumDifficulty.EASY);
  175.             internal.setSpawnFlags(true, true);
  176.             console.worlds.add(internal);
  177.             craftServer.getPluginManager().callEvent(new WorldInitEvent(internal.getWorld()));
  178.             System.out.print("Preparing start region for level " + (console.worlds.size() - 1) + " (Seed: "
  179.                     + internal.getSeed() + ")");
  180.             if (internal.getWorld().getKeepSpawnInMemory()) {
  181.                 final short short1 = internal.paperConfig.keepLoadedRange;
  182.                 long i = System.currentTimeMillis();
  183.                 for (int j = -short1; j <= short1; j += 16) {
  184.                     for (int k = -short1; k <= short1; k += 16) {
  185.                         final long l = System.currentTimeMillis();
  186.                         if (l < i) {
  187.                             i = l;
  188.                         }
  189.                         if (l > i + 1000L) {
  190.                             final int i2 = (short1 * 2 + 1) * (short1 * 2 + 1);
  191.                             final int j2 = (j + short1) * (short1 * 2 + 1) + k + 1;
  192.                             final String update = "Preparing spawn area for " + name + ", " + j2 * 100 / i2 + "%";
  193.                             sender.sendMessage(update);
  194.                             System.out.println(update);
  195.                             i = l;
  196.                         }
  197.                         final BlockPosition chunkcoordinates = internal.getSpawn();
  198.                         internal.getChunkProviderServer().getChunkAt(chunkcoordinates.getX() + j >> 4,
  199.                                 chunkcoordinates.getZ() + k >> 4);
  200.                     }
  201.                 }
  202.             }
  203.             craftServer.getPluginManager().callEvent(new WorldLoadEvent(internal.getWorld()));
  204.             if (sender instanceof Player) {
  205.                 ((Player) sender).teleport(internal.getWorld().getSpawnLocation());
  206.             }
  207.             sender.sendMessage("Done!");
  208.             return true;
  209.         }
  210.     }
  211.  
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement