001 package org.bukkit.command.defaults;
002
003 import com.google.common.collect.ImmutableList;
004 import org.apache.commons.lang.Validate;
005 import org.bukkit.ChatColor;
006 import org.bukkit.command.BlockCommandSender;
007 import org.bukkit.command.Command;
008 import org.bukkit.command.CommandSender;
009 import org.bukkit.util.StringUtil;
010
011 import java.util.ArrayList;
012 import java.util.Arrays;
013 import java.util.List;
014 import org.bukkit.Bukkit;
015 import org.bukkit.World;
016 import org.bukkit.entity.HumanEntity;
017
018 public class GameRuleCommand extends VanillaCommand {
019 private static final List<String> GAMERULE_STATES = ImmutableList.of("true", "false");
020
021 public GameRuleCommand() {
022 super("gamerule");
023 this.description = "Sets a server's game rules";
024 this.usageMessage = "/gamerule <rule name> <value> OR /gamerule <rule name>";
025 this.setPermission("bukkit.command.gamerule");
026 }
027
028 @Override
029 public boolean execute(CommandSender sender, String currentAlias, String[] args) {
030 if (!testPermission(sender)) return true;
031
032 if (args.length > 0) {
033 String rule = args[0];
034 World world = getGameWorld(sender);
035
036 if (world.isGameRule(rule)) {
037 if (args.length > 1) {
038 String value = args[1];
039
040 world.setGameRuleValue(rule, value);
041 Command.broadcastCommandMessage(sender, "Game rule " + rule + " has been set to: " + value);
042 } else {
043 String value = world.getGameRuleValue(rule);
044 sender.sendMessage(rule + " = " + value);
045 }
046 } else {
047 sender.sendMessage(ChatColor.RED + "No game rule called " + rule + " is available");
048 }
049
050 return true;
051 } else {
052 sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage);
053 sender.sendMessage("Rules: " + this.createString(getGameWorld(sender).getGameRules(), 0, ", "));
054
055 return true;
056 }
057 }
058
059 private World getGameWorld(CommandSender sender) {
060 if (sender instanceof HumanEntity) {
061 World world = ((HumanEntity) sender).getWorld();
062 if (world != null) {
063 return world;
064 }
065 } else if (sender instanceof BlockCommandSender) {
066 return ((BlockCommandSender) sender).getBlock().getWorld();
067 }
068
069 return Bukkit.getWorlds().get(0);
070 }
071
072 @Override
073 public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException {
074 Validate.notNull(sender, "Sender cannot be null");
075 Validate.notNull(args, "Arguments cannot be null");
076 Validate.notNull(alias, "Alias cannot be null");
077
078 if (args.length == 1) {
079 return StringUtil.copyPartialMatches(args[0], Arrays.asList(getGameWorld(sender).getGameRules()), new ArrayList<String>());
080 }
081
082 if (args.length == 2) {
083 return StringUtil.copyPartialMatches(args[1], GAMERULE_STATES, new ArrayList<String>(GAMERULE_STATES.size()));
084 }
085
086 return ImmutableList.of();
087 }
088 }