001 package org.bukkit.command.defaults;
002
003 import com.google.common.collect.ImmutableList;
004 import java.util.ArrayList;
005 import java.util.List;
006 import org.bukkit.ChatColor;
007 import org.bukkit.command.CommandSender;
008 import org.bukkit.entity.Player;
009 import org.bukkit.potion.PotionEffect;
010 import org.bukkit.potion.PotionEffectType;
011 import org.bukkit.util.StringUtil;
012
013 public class EffectCommand extends VanillaCommand {
014 private static final List<String> effects;
015
016 public EffectCommand() {
017 super("effect");
018 this.description = "Adds/Removes effects on players";
019 this.usageMessage = "/effect <player> <effect|clear> [seconds] [amplifier]";
020 this.setPermission("bukkit.command.effect");
021 }
022
023 static {
024 ImmutableList.Builder<String> builder = ImmutableList.<String>builder();
025
026 for (PotionEffectType type : PotionEffectType.values()) {
027 if (type != null) {
028 builder.add(type.getName());
029 }
030 }
031
032 effects = builder.build();
033 }
034
035 @Override
036 public boolean execute(CommandSender sender, String commandLabel, String[] args) {
037 if (!testPermission(sender)) {
038 return true;
039 }
040
041 if (args.length < 2) {
042 sender.sendMessage(getUsage());
043 return true;
044 }
045
046 final Player player = sender.getServer().getPlayer(args[0]);
047
048 if (player == null) {
049 sender.sendMessage(ChatColor.RED + String.format("Player, %s, not found", args[0]));
050 return true;
051 }
052
053 if ("clear".equalsIgnoreCase(args[1])) {
054 for (PotionEffect effect : player.getActivePotionEffects()) {
055 player.removePotionEffect(effect.getType());
056 }
057 sender.sendMessage(String.format("Took all effects from %s", args[0]));
058 return true;
059 }
060
061 PotionEffectType effect = PotionEffectType.getByName(args[1]);
062
063 if (effect == null) {
064 effect = PotionEffectType.getById(getInteger(sender, args[1], 0));
065 }
066
067 if (effect == null) {
068 sender.sendMessage(ChatColor.RED + String.format("Effect, %s, not found", args[1]));
069 return true;
070 }
071
072 int duration = 600;
073 int duration_temp = 30;
074 int amplification = 0;
075
076 if (args.length >= 3) {
077 duration_temp = getInteger(sender, args[2], 0, 1000000);
078 if (effect.isInstant()) {
079 duration = duration_temp;
080 } else {
081 duration = duration_temp * 20;
082 }
083 } else if (effect.isInstant()) {
084 duration = 1;
085 }
086
087 if (args.length >= 4) {
088 amplification = getInteger(sender, args[3], 0, 255);
089 }
090
091 if (duration_temp == 0) {
092 if (!player.hasPotionEffect(effect)) {
093 sender.sendMessage(String.format("Couldn't take %s from %s as they do not have the effect", effect.getName(), args[0]));
094 return true;
095 }
096
097 player.removePotionEffect(effect);
098 broadcastCommandMessage(sender, String.format("Took %s from %s", effect.getName(), args[0]));
099 } else {
100 final PotionEffect applyEffect = new PotionEffect(effect, duration, amplification);
101
102 player.addPotionEffect(applyEffect, true);
103 broadcastCommandMessage(sender, String.format("Given %s (ID %d) * %d to %s for %d seconds", effect.getName(), effect.getId(), amplification, args[0], duration_temp));
104 }
105
106 return true;
107 }
108
109 @Override
110 public List<String> tabComplete(CommandSender sender, String commandLabel, String[] args) {
111 if (args.length == 1) {
112 return super.tabComplete(sender, commandLabel, args);
113 } else if (args.length == 2) {
114 return StringUtil.copyPartialMatches(args[1], effects, new ArrayList<String>(effects.size()));
115 }
116
117 return ImmutableList.of();
118 }
119 }