// $Id$ /* * MapBook * Copyright (C) 2010, 2011 sk89q <http://www.sk89q.com> * Copyright (C) 2011 dested <> * * 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 <http://www.gnu.org/licenses/>. */ package com.sk89q.mapbook; import java.io.*; import java.util.Arrays; import java.util.logging.Logger; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockListener; import org.bukkit.event.map.MapInitializeEvent; import org.bukkit.event.map.MapListener; import org.bukkit.maps.RenderPriority; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.config.Configuration; import com.sk89q.bukkit.migration.PermissionsResolverManager; import com.sk89q.bukkit.migration.PermissionsResolverServerListener; import com.sk89q.minecraft.util.commands.CommandException; import com.sk89q.minecraft.util.commands.CommandPermissionsException; import com.sk89q.minecraft.util.commands.CommandUsageException; import com.sk89q.minecraft.util.commands.CommandsManager; import com.sk89q.minecraft.util.commands.MissingNestedCommandException; import com.sk89q.minecraft.util.commands.WrappedCommandException; import com.sk89q.worldedit.commands.WorldEditCommands; /** * Base plugin class for MapBook. * * @author sk89q */ public class MapBookPlugin extends JavaPlugin { protected static final Logger logger = Logger .getLogger("Minecraft.MapBook"); private PermissionsResolverManager perms; protected CommandsManager<CommandSender> commands; public SubwayBase Railway; /** * Called when the plugin is enabled. This is where configuration is loaded, * and the plugin is setup. */ public void onEnable() { logger.info(getDescription().getName() + " " + getDescription().getVersion() + " enabled."); // Make the data folder for the plugin where configuration files // and other data files will be stored getDataFolder().mkdirs(); createDefaultConfiguration("config.yml"); // Load configuration populateConfiguration(); // Prepare permissions perms = new PermissionsResolverManager(getConfiguration(), getServer(), getDescription().getName(), logger); perms.load(); // Register the commands that we want to use final MapBookPlugin plugin = this; commands = new CommandsManager<CommandSender>() { @Override public boolean hasPermission(CommandSender player, String perm) { return plugin.hasPermission(player, perm); } }; commands.register(RailwayCommands.class); // commands.register(GeneralCommands.class); // Register events registerEvents(); // The permissions resolver has some hooks of its own (new PermissionsResolverServerListener(perms)).register(this); } /** * Register the events that are used. */ protected void registerEvents() { PluginManager pm = getServer().getPluginManager(); final MapBookPlugin plugin = this; pm.registerEvent(Event.Type.MAP_INITIALIZE, new MapListener() { @Override public void onMapInitialize(MapInitializeEvent event) { if (event.getMapView().getId() == 11) { event.getMapView().registerVirtualBase( new BeautifulHouseBase(), plugin); return; } if (event.getMapView().getId() == 4) { event.getMapView().registerVirtualBase(Railway=new SubwayBase(plugin), plugin); return; } if (event.getMapView().getId() == 17) { event.getMapView().registerVirtualBase(new LiquidBase(),plugin); return; } if (event.getMapView().getId() == 8) { event.getMapView().registerOverlay(new RedrawOverlay(),RenderPriority.High, plugin); return; } if (event.getMapView().getId() == 12) { event.getMapView().registerVirtualBase(new NyanCatBase(),plugin); return; } if (event.getMapView().getId() == 15) { event.getMapView().registerVirtualBase(new ChestWatcherBase(plugin), plugin); return; } if (!event.getMapView().isVirtual()) { event.getMapView().registerOverlay(new GlitteringOceanOverlay(), RenderPriority.Low,plugin); } } }, Priority.Normal, this); } /** * Called when the plugin is disabled. Shutdown and clearing of any * temporary data occurs here. */ public void onDisable() { } /** * Called on a command. */ @Override public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { try { commands.execute(cmd.getName(), args, sender, this, sender); } catch (CommandPermissionsException e) { sender.sendMessage(ChatColor.RED + "You don't have permission."); } catch (MissingNestedCommandException e) { sender.sendMessage(ChatColor.RED + e.getUsage()); } catch (CommandUsageException e) { sender.sendMessage(ChatColor.RED + e.getMessage()); sender.sendMessage(ChatColor.RED + e.getUsage()); } catch (WrappedCommandException e) { if (e.getCause() instanceof NumberFormatException) { sender.sendMessage(ChatColor.RED + "Number expected, string received instead."); } else { sender.sendMessage(ChatColor.RED + "An error has occurred. See console."); e.printStackTrace(); } } catch (CommandException e) { sender.sendMessage(ChatColor.RED + e.getMessage()); } return true; } /** * Register an event. * * @param type * @param listener * @param priority */ protected void registerEvent(Event.Type type, Listener listener, Priority priority) { getServer().getPluginManager().registerEvent(type, listener, priority, this); } /** * Register an event at normal priority. * * @param type * @param listener */ protected void registerEvent(Event.Type type, Listener listener) { getServer().getPluginManager().registerEvent(type, listener, Priority.Normal, this); } /** * Loads the configuration. */ public void populateConfiguration() { Configuration config = getConfiguration(); config.load(); } /** * Create a default configuration file from the .jar. * * @param name */ protected void createDefaultConfiguration(String name) { File actual = new File(getDataFolder(), name); if (!actual.exists()) { InputStream input = this.getClass().getResourceAsStream( "/defaults/" + name); if (input != null) { FileOutputStream output = null; try { output = new FileOutputStream(actual); byte[] buf = new byte[8192]; int length = 0; while ((length = input.read(buf)) > 0) { output.write(buf, 0, length); } logger.info(getDescription().getName() + ": Default configuration file written: " + name); } catch (IOException e) { e.printStackTrace(); } finally { try { if (input != null) input.close(); } catch (IOException e) { } try { if (output != null) output.close(); } catch (IOException e) { } } } } } /** * Checks permissions. * * @param sender * @param perm * @return */ public boolean hasPermission(CommandSender sender, String perm) { if (!(sender instanceof Player)) { return true; } if (sender.isOp()) { return true; } // Invoke the permissions resolver if (sender instanceof Player) { return perms.hasPermission(((Player) sender).getName(), perm); } return false; } /** * Checks permissions and throws an exception if permission is not met. * * @param sender * @param perm * @throws CommandPermissionsException */ public void checkPermission(CommandSender sender, String perm) throws CommandPermissionsException { if (!hasPermission(sender, perm)) { throw new CommandPermissionsException(); } } }