Commits
md_5 authored a1cc4b769ca
1 - | package org.bukkit.command.defaults; |
2 - | |
3 - | import java.util.ArrayList; |
4 - | import java.util.Arrays; |
5 - | import java.util.List; |
6 - | |
7 - | import org.apache.commons.lang.Validate; |
8 - | import org.bukkit.Achievement; |
9 - | import org.bukkit.Bukkit; |
10 - | import org.bukkit.ChatColor; |
11 - | import org.bukkit.Statistic; |
12 - | import org.bukkit.Material; |
13 - | import org.bukkit.Statistic.Type; |
14 - | import org.bukkit.command.Command; |
15 - | import org.bukkit.command.CommandSender; |
16 - | import org.bukkit.entity.EntityType; |
17 - | import org.bukkit.entity.Player; |
18 - | import org.bukkit.event.player.PlayerAchievementAwardedEvent; |
19 - | import org.bukkit.event.player.PlayerStatisticIncrementEvent; |
20 - | |
21 - | import com.google.common.collect.ImmutableList; |
22 - | |
23 - | |
24 - | public class AchievementCommand extends VanillaCommand { |
25 - | public AchievementCommand() { |
26 - | super("achievement"); |
27 - | this.description = "Gives the specified player an achievement or changes a statistic value. Use '*' to give all achievements."; |
28 - | this.usageMessage = "/achievement give <stat_name> [player]"; |
29 - | this.setPermission("bukkit.command.achievement"); |
30 - | } |
31 - | |
32 - | |
33 - | public boolean execute(CommandSender sender, String currentAlias, String[] args) { |
34 - | if (!testPermission(sender)) return true; |
35 - | |
36 - | if (args.length < 2) { |
37 - | sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); |
38 - | return false; |
39 - | } |
40 - | |
41 - | if (!args[0].equalsIgnoreCase("give")) { |
42 - | sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); |
43 - | return false; |
44 - | } |
45 - | |
46 - | String statisticString = args[1]; |
47 - | Player player = null; |
48 - | |
49 - | if (args.length > 2) { |
50 - | player = Bukkit.getPlayer(args[1]); |
51 - | } else if (sender instanceof Player) { |
52 - | player = (Player) sender; |
53 - | } |
54 - | |
55 - | if (player == null) { |
56 - | sender.sendMessage("You must specify which player you wish to perform this action on."); |
57 - | return true; |
58 - | } |
59 - | |
60 - | if (statisticString.equals("*")) { |
61 - | for (Achievement achievement : Achievement.values()) { |
62 - | if (player.hasAchievement(achievement)) { |
63 - | continue; |
64 - | } |
65 - | PlayerAchievementAwardedEvent event = new PlayerAchievementAwardedEvent(player, achievement); |
66 - | Bukkit.getServer().getPluginManager().callEvent(event); |
67 - | if (!event.isCancelled()) { |
68 - | player.awardAchievement(achievement); |
69 - | } |
70 - | } |
71 - | Command.broadcastCommandMessage(sender, String.format("Successfully given all achievements to %s", player.getName())); |
72 - | return true; |
73 - | } |
74 - | |
75 - | Achievement achievement = Bukkit.getUnsafe().getAchievementFromInternalName(statisticString); |
76 - | Statistic statistic = Bukkit.getUnsafe().getStatisticFromInternalName(statisticString); |
77 - | |
78 - | if (achievement != null) { |
79 - | if (player.hasAchievement(achievement)) { |
80 - | sender.sendMessage(String.format("%s already has achievement %s", player.getName(), statisticString)); |
81 - | return true; |
82 - | } |
83 - | |
84 - | PlayerAchievementAwardedEvent event = new PlayerAchievementAwardedEvent(player, achievement); |
85 - | Bukkit.getServer().getPluginManager().callEvent(event); |
86 - | if (event.isCancelled()) { |
87 - | sender.sendMessage(String.format("Unable to award %s the achievement %s", player.getName(), statisticString)); |
88 - | return true; |
89 - | } |
90 - | player.awardAchievement(achievement); |
91 - | |
92 - | Command.broadcastCommandMessage(sender, String.format("Successfully given %s the stat %s", player.getName(), statisticString)); |
93 - | return true; |
94 - | } |
95 - | |
96 - | if (statistic == null) { |
97 - | sender.sendMessage(String.format("Unknown achievement or statistic '%s'", statisticString)); |
98 - | return true; |
99 - | } |
100 - | |
101 - | if (statistic.getType() == Type.UNTYPED) { |
102 - | PlayerStatisticIncrementEvent event = new PlayerStatisticIncrementEvent(player, statistic, player.getStatistic(statistic), player.getStatistic(statistic) + 1); |
103 - | Bukkit.getServer().getPluginManager().callEvent(event); |
104 - | if (event.isCancelled()) { |
105 - | sender.sendMessage(String.format("Unable to increment %s for %s", statisticString, player.getName())); |
106 - | return true; |
107 - | } |
108 - | player.incrementStatistic(statistic); |
109 - | Command.broadcastCommandMessage(sender, String.format("Successfully given %s the stat %s", player.getName(), statisticString)); |
110 - | return true; |
111 - | } |
112 - | |
113 - | if (statistic.getType() == Type.ENTITY) { |
114 - | EntityType entityType = EntityType.fromName(statisticString.substring(statisticString.lastIndexOf(".") + 1)); |
115 - | |
116 - | if (entityType == null) { |
117 - | sender.sendMessage(String.format("Unknown achievement or statistic '%s'", statisticString)); |
118 - | return true; |
119 - | } |
120 - | |
121 - | PlayerStatisticIncrementEvent event = new PlayerStatisticIncrementEvent(player, statistic, player.getStatistic(statistic), player.getStatistic(statistic) + 1, entityType); |
122 - | Bukkit.getServer().getPluginManager().callEvent(event); |
123 - | if (event.isCancelled()) { |
124 - | sender.sendMessage(String.format("Unable to increment %s for %s", statisticString, player.getName())); |
125 - | return true; |
126 - | } |
127 - | |
128 - | try { |
129 - | player.incrementStatistic(statistic, entityType); |
130 - | } catch (IllegalArgumentException e) { |
131 - | sender.sendMessage(String.format("Unknown achievement or statistic '%s'", statisticString)); |
132 - | return true; |
133 - | } |
134 - | } else { |
135 - | int id; |
136 - | try { |
137 - | id = getInteger(sender, statisticString.substring(statisticString.lastIndexOf(".") + 1), 0, Integer.MAX_VALUE, true); |
138 - | } catch (NumberFormatException e) { |
139 - | sender.sendMessage(e.getMessage()); |
140 - | return true; |
141 - | } |
142 - | |
143 - | Material material = Material.getMaterial(id); |
144 - | |
145 - | if (material == null) { |
146 - | sender.sendMessage(String.format("Unknown achievement or statistic '%s'", statisticString)); |
147 - | return true; |
148 - | } |
149 - | |
150 - | PlayerStatisticIncrementEvent event = new PlayerStatisticIncrementEvent(player, statistic, player.getStatistic(statistic), player.getStatistic(statistic) + 1, material); |
151 - | Bukkit.getServer().getPluginManager().callEvent(event); |
152 - | if (event.isCancelled()) { |
153 - | sender.sendMessage(String.format("Unable to increment %s for %s", statisticString, player.getName())); |
154 - | return true; |
155 - | } |
156 - | |
157 - | try { |
158 - | player.incrementStatistic(statistic, material); |
159 - | } catch (IllegalArgumentException e) { |
160 - | sender.sendMessage(String.format("Unknown achievement or statistic '%s'", statisticString)); |
161 - | return true; |
162 - | } |
163 - | } |
164 - | |
165 - | Command.broadcastCommandMessage(sender, String.format("Successfully given %s the stat %s", player.getName(), statisticString)); |
166 - | return true; |
167 - | } |
168 - | |
169 - | |
170 - | public List<String> tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { |
171 - | Validate.notNull(sender, "Sender cannot be null"); |
172 - | Validate.notNull(args, "Arguments cannot be null"); |
173 - | Validate.notNull(alias, "Alias cannot be null"); |
174 - | |
175 - | if (args.length == 1) { |
176 - | return Arrays.asList("give"); |
177 - | } |
178 - | |
179 - | if (args.length == 2) { |
180 - | return Bukkit.getUnsafe().tabCompleteInternalStatisticOrAchievementName(args[1], new ArrayList<String>()); |
181 - | } |
182 - | |
183 - | if (args.length == 3) { |
184 - | return super.tabComplete(sender, alias, args); |
185 - | } |
186 - | return ImmutableList.of(); |
187 - | } |
188 - | } |