Package com.sk89q.commandbook.locations

Source Code of com.sk89q.commandbook.locations.SpawnLocationsComponent$Commands

/*
* CommandBook
* Copyright (C) 2011 sk89q <http://www.sk89q.com>
*
* 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.commandbook.locations;

import com.google.common.collect.Lists;
import com.sk89q.commandbook.CommandBook;
import com.sk89q.commandbook.util.ChatUtil;
import com.sk89q.commandbook.util.InputUtil;
import com.sk89q.commandbook.util.entity.player.PlayerUtil;
import com.sk89q.commandbook.util.entity.player.iterators.PlayerIteratorAction;
import com.sk89q.minecraft.util.commands.Command;
import com.sk89q.minecraft.util.commands.CommandContext;
import com.sk89q.minecraft.util.commands.CommandException;
import com.sk89q.minecraft.util.commands.CommandPermissions;
import com.zachsthings.libcomponents.ComponentInformation;
import com.zachsthings.libcomponents.bukkit.BukkitComponent;
import com.zachsthings.libcomponents.config.ConfigurationBase;
import com.zachsthings.libcomponents.config.Setting;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent;

import java.io.File;

@ComponentInformation(friendlyName = "Spawn Locations", desc = "Allows exact spawn locations for players, " +
        "as well as getting and setting the world's spawn.")
public class SpawnLocationsComponent extends BukkitComponent implements Listener {

    private WrappedSpawnManager spawns;

    private LocalConfiguration config;

    @Override
    public void enable() {
        spawns = new WrappedSpawnManager(new File(CommandBook.inst().getDataFolder(), "spawns.yml"));
        config = configure(new LocalConfiguration());
        registerCommands(Commands.class);
        CommandBook.registerEvents(this);
    }

    @Override
    public void reload() {
        super.reload();
        configure(config);
        spawns.load();
    }

    public WrappedSpawnManager getSpawnManager() {
        return spawns;
    }

    public Location getSpawnPoint(World world) {
        Location target = spawns.getWorldSpawn(world);
        if (config.centeredTeleport) target.add(.5, 0, .5);
        return target;
    }

    private static class LocalConfiguration extends ConfigurationBase {
        @Setting("exact-spawn") public boolean exactSpawn;
        @Setting("centered-teleport") public boolean centeredTeleport;
    }

    @EventHandler
    public void onRespawn(PlayerRespawnEvent event) {
        if (config.exactSpawn && !event.isBedSpawn()) {
            event.setRespawnLocation(getSpawnPoint(event.getPlayer().getWorld()));
        }
    }

    @EventHandler
    public void onTeleport(PlayerTeleportEvent event) {

        Location loc = event.getTo();
        if (event.isCancelled()) {
            return;
        }
        // Work around someone's bug
        if (loc == null || loc.getWorld() == null) {
            return;
        }
        if (loc.equals(loc.getWorld().getSpawnLocation())) {
            event.setTo(getSpawnPoint(loc.getWorld()));
        }
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent event) {
        if (!event.getPlayer().hasPlayedBefore() && config.exactSpawn) {
            event.getPlayer().teleport(getSpawnPoint(event.getPlayer().getWorld()));
        }
    }

    public class Commands {
        @Command(aliases = {"spawn"}, usage = "[player]", desc = "Teleport to spawn", min = 0, max = 1)
        @CommandPermissions({"commandbook.spawn"})
        public void spawn(CommandContext args, CommandSender sender) throws CommandException {
            Iterable<Player> targets;

            // Detect arguments based on the number of arguments provided
            if (args.argsLength() == 1) {
                targets = InputUtil.PlayerParser.matchPlayers(sender, args.getString(0));

                // Check permissions!
                for (Player target : targets) {
                    if (target != sender) {
                        CommandBook.inst().checkPermission(sender, "commandbook.spawn.other");
                        break;
                    }
                }
            } else {
                targets = Lists.newArrayList(PlayerUtil.checkPlayer(sender));
            }

            (new PlayerIteratorAction(sender) {

                @Override
                public boolean perform(Player player) {
                    return PlayerUtil.teleportTo(sender, player, getSpawnPoint(player.getWorld()), true);
                }

                @Override
                public void onCaller(Player player) {
                    player.sendMessage(ChatColor.YELLOW + "Teleported to spawn.");
                }

                @Override
                public void onVictim(CommandSender sender, Player player) {
                    player.sendMessage(ChatColor.YELLOW + "Teleported to spawn by "
                            + ChatUtil.toColoredName(sender, ChatColor.YELLOW) + ".");
                }

                @Override
                public void onInformMany(CommandSender sender, int affected) {
                    sender.sendMessage(ChatColor.YELLOW.toString()
                            + affected + " teleported to spawn.");
                }

            }).iterate(targets);
        }


        @Command(aliases = {"setspawn"},
                usage = "[location]", desc = "Change spawn location",
                flags = "", min = 0, max = 1)
        @CommandPermissions({"commandbook.setspawn"})
        public void setspawn(CommandContext args, CommandSender sender) throws CommandException {

            World world;
            Location loc;

            if (args.argsLength() == 0) {
                Player player = PlayerUtil.checkPlayer(sender);
                world = player.getWorld();
                loc = player.getLocation();
            } else {
                loc = InputUtil.LocationParser.matchLocation(sender, args.getString(0));
                world = loc.getWorld();
            }

            getSpawnManager().setWorldSpawn(loc);

            sender.sendMessage(ChatColor.YELLOW +
                    "Spawn location of '" + world.getName() + "' set!");
        }
    }
}
TOP

Related Classes of com.sk89q.commandbook.locations.SpawnLocationsComponent$Commands

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.