From 9adef4b2abcd53add68c4d478e170d0d873754e7 Mon Sep 17 00:00:00 2001 From: Jeremy Wood Date: Thu, 8 Nov 2012 12:58:10 -0500 Subject: [PATCH] Added import command. --- .../core/command/ImportCommand.java | 187 ++++++++++++++++++ .../core/minecraft/WorldEnvironment.java | 8 +- 2 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 base/src/main/java/com/onarandombox/multiverse/core/command/ImportCommand.java diff --git a/base/src/main/java/com/onarandombox/multiverse/core/command/ImportCommand.java b/base/src/main/java/com/onarandombox/multiverse/core/command/ImportCommand.java new file mode 100644 index 00000000..2ba10aad --- /dev/null +++ b/base/src/main/java/com/onarandombox/multiverse/core/command/ImportCommand.java @@ -0,0 +1,187 @@ +package com.onarandombox.multiverse.core.command; + +import com.dumptruckman.minecraft.pluginbase.entity.BasePlayer; +import com.dumptruckman.minecraft.pluginbase.locale.ChatColor; +import com.dumptruckman.minecraft.pluginbase.locale.Message; +import com.dumptruckman.minecraft.pluginbase.permission.Perm; +import com.dumptruckman.minecraft.pluginbase.plugin.command.CommandInfo; +import com.onarandombox.multiverse.core.api.Core; +import com.onarandombox.multiverse.core.api.MVPerms; +import com.onarandombox.multiverse.core.api.MultiverseWorld; +import com.onarandombox.multiverse.core.minecraft.WorldEnvironment; +import com.sk89q.minecraft.util.commands.CommandContext; + +import java.io.File; +import java.io.FilenameFilter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@CommandInfo( + primaryAlias = "import", + desc = "Import a world.", + usage = "{NAME} {ENVIRONMENT}", + prefixedAliases = "im", + directlyPrefixedAliases = "import", + flags = "g:n", + min = 1, + max = 2 +) +public class ImportCommand extends MultiverseCommand { + + public static final Message IMPORT = new Message("command.import.help", + "Imports a world into the server from a folder with the given name.", + "The folder must exist in the location where worlds are normally located and must contain Minecraft world data.", + "You must specify a world environment such as NORMAL or NETHER.", + "You may also specify a generator to use along with an optional generator ID.", + "The generator name is case sensitive!", + "Flags:", + " -g {GENERATOR[:ID]} Specify a generator.", + " -n Do not adjust spawn", + "Examples:", + " /mv import &6gargamel&a normal", + " /mv import &6hell_world&a nether", + " /mv import &6Cleanroom&a normal -g &3CleanroomGenerator"); + + public static final Message POTENTIAL_WORLD_LIST = new Message("command.import.potential_world_list", + "&b====[ These look like worlds ]====", "%s"); + + public static final Message NO_POTENTIAL_WORLDS = new Message("command.import.no_potential_worlds", + "&cNo potential worlds found. Sorry!"); + + public static final Message ALREADY_MV_WORLD = new Message("command.import.already_mv_world", + "&aMultiverse&f already knows about '&b%s&f'!"); + + public static final Message INVALID_ENVIRONMENT = new Message("command.import.invalid_environment", + "&cThat is not a valid environment."); + + public static final Message STARTING_IMPORT = new Message("command.import.starting_import", + "Starting import of world '%s'..."); + + public static final Message IMPORT_COMPLETE = new Message("command.import.import_complete", + "&aImport complete!"); + + public static final Message IMPORT_FAILED = new Message("command.import.import_failed", + "&cImport failed!"); + + @Override + public Perm getPerm() { + return MVPerms.CMD_IMPORT; + } + + @Override + public Message getHelp() { + return IMPORT; + } + + @Override + public boolean runCommand(Core core, BasePlayer sender, CommandContext context) { + final String worldName = context.getString(0); + + if (worldName.toLowerCase().equals("--list") || worldName.toLowerCase().equals("-l")) { + final String worldList = this.getPotentialWorlds(core); + if (worldList.length() > 2) { + core.getMessager().message(sender, POTENTIAL_WORLD_LIST, worldList); + } else { + core.getMessager().message(sender, NO_POTENTIAL_WORLDS); + } + return true; + } + // Since we made an exception for the list, we have to make sure they have at least 2 params: + // Note the exception is --list, which is covered above. + if (context.argsLength() == 1) { + return false; + } + + // Make sure we don't already know about this world. + if (core.getMVWorldManager().isMVWorld(worldName)) { + core.getMessager().message(sender, ALREADY_MV_WORLD, worldName); + return true; + } + + File worldFile = new File(core.getServerInterface().getWorldContainer(), worldName); + + String generator = context.getFlag('g'); + boolean useSpawnAdjust = !context.hasFlag('n'); + + String env = context.getString(1); + WorldEnvironment environment = WorldEnvironment.getFromString(env); + if (environment == null) { + core.getMessager().message(sender, INVALID_ENVIRONMENT); + // TODO EnvironmentCommand.showEnvironments(sender); + return true; + } + + if (worldFile.exists() && env != null) { + core.getMessager().messageAndLog(sender, STARTING_IMPORT, worldName); + if (core.getMVWorldManager().addWorld(worldName, environment, null, null, null, generator, useSpawnAdjust)) { + core.getMessager().messageAndLog(sender, IMPORT_COMPLETE); + } else { + core.getMessager().messageAndLog(sender, IMPORT_FAILED); + } + } else if (env == null) { + core.getMessager().message(sender, IMPORT_FAILED); + // TODO locale + sender.sendMessage("That world environment did not exist."); + sender.sendMessage("For a list of available world types, type: " + ChatColor.AQUA + "/mvenv"); + } else { + core.getMessager().message(sender, IMPORT_FAILED); + String worldList = this.getPotentialWorlds(core); + // TODO locale + sender.sendMessage("That world folder does not exist. These look like worlds to me:"); + sender.sendMessage(worldList); + } + return true; + } + + /** + * A very basic check to see if a folder has a level.dat file. + * If it does, we can safely assume it's a world folder. + * + * @param worldFolder The File that may be a world. + * @return True if it looks like a world, false if not. + */ + private static boolean checkIfIsWorld(File worldFolder) { + if (worldFolder.isDirectory()) { + File[] files = worldFolder.listFiles(new FilenameFilter() { + @Override + public boolean accept(File file, String name) { + return name.equalsIgnoreCase("level.dat"); + } + }); + if (files != null && files.length > 0) { + return true; + } + } + return false; + } + + private String getPotentialWorlds(final Core core) { + final File worldFolder = core.getServerInterface().getWorldContainer(); + if (worldFolder == null) { + return ""; + } + File[] files = worldFolder.listFiles(); + String worldList = ""; + Collection worlds = core.getMVWorldManager().getMVWorlds(); + List worldStrings = new ArrayList(); + for (MultiverseWorld world : worlds) { + worldStrings.add(world.getName()); + } + for (String world : core.getMVWorldManager().getUnloadedWorlds()) { + worldStrings.add(world); + } + ChatColor currColor = ChatColor.WHITE; + for (File file : files) { + if (file.isDirectory() && checkIfIsWorld(file) && !worldStrings.contains(file.getName())) { + worldList += currColor + file.getName() + " "; + if (currColor == ChatColor.WHITE) { + currColor = ChatColor.YELLOW; + } else { + currColor = ChatColor.WHITE; + } + } + } + return worldList; + } +} diff --git a/base/src/main/java/com/onarandombox/multiverse/core/minecraft/WorldEnvironment.java b/base/src/main/java/com/onarandombox/multiverse/core/minecraft/WorldEnvironment.java index 0a51f3d7..94291456 100644 --- a/base/src/main/java/com/onarandombox/multiverse/core/minecraft/WorldEnvironment.java +++ b/base/src/main/java/com/onarandombox/multiverse/core/minecraft/WorldEnvironment.java @@ -1,4 +1,10 @@ package com.onarandombox.multiverse.core.minecraft; -public class WorldEnvironment { +public enum WorldEnvironment { + + ; + + public static WorldEnvironment getFromString(String name) { + return null; + } }