/[projects]/miscJava/bukkit-minecraft-plugins/HoerupUtils/src/main/java/dk/thoerup/bukkit/hoeruputils/creative/GeneralContractorCommands.java
ViewVC logotype

Contents of /miscJava/bukkit-minecraft-plugins/HoerupUtils/src/main/java/dk/thoerup/bukkit/hoeruputils/creative/GeneralContractorCommands.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3140 - (show annotations) (download)
Fri Nov 18 20:53:27 2016 UTC (7 years, 6 months ago) by torben
File size: 11006 byte(s)
fix some bugs in creative tools
1 package dk.thoerup.bukkit.hoeruputils.creative;
2
3 import org.bukkit.ChatColor;
4 import org.bukkit.Location;
5 import org.bukkit.Material;
6 import org.bukkit.World;
7 import org.bukkit.command.Command;
8 import org.bukkit.command.CommandExecutor;
9 import org.bukkit.command.CommandSender;
10 import org.bukkit.entity.Player;
11
12 import java.util.Arrays;
13 import java.util.HashMap;
14 import java.util.HashSet;
15 import java.util.Set;
16
17 public class GeneralContractorCommands implements CommandExecutor{
18
19 class StoredCommand {
20 public StoredCommand(String l, String a[]) {
21 this.label = l;
22 this.args = a;
23 }
24 public String label;
25 public String args[];
26 }
27
28 final static int Y_MAX = 255;
29 final Material valid_block_array[] = {
30 Material.STONE,
31 Material.GRASS,
32 Material.DIRT,
33 Material.COBBLESTONE
34 };
35 //4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 35, 41, 42, 43, 44, 45, 48, 49, 56, 57, 73, 74, 79, 80, 82} ;
36
37 final Set<Material> valid_materials = new HashSet<Material>();
38
39 HashMap<String,StoredCommand> commands = new HashMap<String,StoredCommand>();
40
41
42 public GeneralContractorCommands() {
43 Arrays.sort(valid_block_array);
44
45 for (Material mat : valid_block_array) {
46 valid_materials.add( mat );
47 }
48 }
49
50 //@Override
51 public boolean onCommand(final CommandSender sender, Command command, String label, String[] args) {
52
53 if (! (sender instanceof Player) ) {
54 return false;
55 }
56 Player player = (Player) sender;
57
58 Location loc = player.getLocation();
59
60 if ( ! loc.getWorld().getName().equals("creative")) {
61 player.sendMessage( ChatColor.RED + "This command may only be used in creative world" );
62 return true;
63 }
64
65
66 if ( command.getLabel().equals("replay") ) {
67 StoredCommand cmd = commands.get(player.getName() );
68 if (cmd != null) {
69 label = cmd.label;
70 args = cmd.args;
71 }
72 } else {
73 commands.put(player.getName(), new StoredCommand(label,args) );
74 }
75
76 //System.out.println( ">>" + label); //DEBUG
77
78 if ( label.equals("levelarea") ) {
79 if (validateLevelOrFill(player, label, args) ) {
80 levelArea(player, loc, args);
81 }
82 return true;
83 }
84
85 if ( label.equals("createcave") ) {
86 if (validateLevelOrFill(player, label, args) ) {
87 createCave(player, loc, args);
88 }
89 return true;
90 }
91
92 if ( label.equals("fillarea") ) {
93 if (validateLevelOrFill(player, label, args) ) {
94 fillArea(player, loc, args);
95 }
96 return true;
97 }
98
99 if ( label.equals("slopearea") ) {
100 slopeArea(player, loc, args);
101 return true;
102 }
103
104
105 if ( label.equals("setsurface") ) {
106 setSurface(player, loc, args);
107 return true;
108 }
109
110 if (label.equals("platform") ) {
111 platform(player,loc,args);
112 return true;
113 }
114
115 if (label.equals("cylinder") ) {
116 if (validateLevelOrFill(player, label, args) ) {
117 cylinder(player,loc,args);
118 }
119 return true;
120 }
121
122
123 return false;
124 }
125
126
127 void slopeArea(Player player, Location loc, String[] split) {
128 int radius;
129 try {
130 radius = Integer.parseInt(split[0]);
131 } catch (Exception e) {
132 player.sendMessage("setsurface: radius must be an integer");
133 return;
134 }
135
136 System.out.println("Player " + player.getName() + " used slopearea with radius=" + radius);
137
138
139 int playerX = loc.getBlockX();
140 int playerY = loc.getBlockY();
141 int playerZ = loc.getBlockZ();
142
143 World world = loc.getWorld();
144
145 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
146 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
147
148
149 int xdist = Math.abs(playerX-x);
150 int zdist = Math.abs(playerZ-z);
151
152 int dist = Math.max(xdist,zdist);
153
154 //for (int y=playerY; y<=playerY+radius; y++) {
155 for (int y=(playerY+dist); y<=Y_MAX; y++) {
156 world.getBlockAt(x, y, z).setType(Material.AIR);
157 }
158
159 }
160
161 }
162 }
163
164 private void platform(Player player, Location loc, String[] split) {
165
166 if (split.length != 2) {
167 player.sendMessage("Usage /platform [radius] [material]");
168 return;
169 }
170
171 int radius;
172 try {
173 radius = Integer.parseInt(split[0]);
174 } catch (Exception e) {
175 player.sendMessage("platform: radius must be an integer");
176 return;
177 }
178
179 if (radius > 20) {
180 player.sendMessage("platform: radius may not exceed 20");
181 return;
182 }
183
184 Material material = Material.matchMaterial( split[1] );
185 if (material == null) {
186 player.sendMessage("platform: unknown material: " + split[1] );
187 return;
188 }
189 /*
190 boolean validblock = false;
191 for (int i=0; i<valid_block_array.length; i++) {
192 if (valid_block_array[i] == blockid) {
193 validblock = true;
194 break;
195 }
196 }
197
198 if ( !validblock ) {
199 player.sendMessage("setsurface: block now allowed");
200 return;
201 }*/
202
203 int playerX = loc.getBlockX();
204 int playerY = loc.getBlockY();
205 int playerZ = loc.getBlockZ();
206
207
208 World world = loc.getWorld();
209
210 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
211 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
212 int y = playerY - 1;
213
214 world.getBlockAt(x, y, z).setType( material );
215 }
216 }
217 }
218
219 private void setSurface(Player player, Location loc, String[] split) {
220
221 if (split.length != 2) {
222 player.sendMessage("Usage /setsurface [radius] [blockID]");
223 return;
224 }
225
226 int radius;
227 try {
228 radius = Integer.parseInt(split[0]);
229 } catch (Exception e) {
230 player.sendMessage("setsurface: radius must be an integer");
231 return;
232 }
233
234 if (radius > 20) {
235 player.sendMessage("setsurface: radius may not exceed 20");
236 return;
237 }
238
239 Material material = Material.matchMaterial( split[1] );
240 if (material == null) {
241 player.sendMessage("setsurface: unknown material: " + split[1] );
242 return;
243 }
244
245 //check if the blockid is in the array of valid blocks
246 if ( ! valid_materials.contains(material) ) {
247 player.sendMessage("setsurface: block now allowed");
248 return;
249 }
250
251 int playerX = loc.getBlockX();
252 int playerY = loc.getBlockY();
253 int playerZ = loc.getBlockZ();
254
255 if(playerY <= 2 && material != Material.BEDROCK ) {
256 player.sendMessage("setsurface: at this level you may only use bedrock(id=7)");
257 return;
258 }
259
260 World world = loc.getWorld();
261
262 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
263 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
264 //int y = getGroundLevel(x,z) - 1;
265 int y = world.getHighestBlockYAt(x, z) ;
266 y -= 1;
267
268 world.getBlockAt(x, y, z).setType(material);
269 }
270 }
271 }
272
273 private boolean validateLevelOrFill(Player player, String label, String[] split) {
274 if (split.length < 1 || split.length > 2) {
275 player.sendMessage("Usage: " + label + " [radius]");
276 return false;
277 }
278
279 int radius;
280 try {
281 radius = Integer.parseInt(split[0]);
282 } catch (Exception e) {
283 player.sendMessage(label + ": radius must be an integer");
284 return false;
285 }
286
287 if (radius > 20) {
288 player.sendMessage(label + ": radius may not exceed 20");
289 return false;
290 }
291
292 if (split.length == 2) {
293 Material material = Material.matchMaterial( split[1] );
294 if (material == null) {
295 player.sendMessage(label + ": unknown material: " + split[1] );
296 return false;
297 }
298 if ( material == Material.TNT) {
299 player.sendMessage("Sorry dave, i can't do that");
300 return false;
301 }
302
303 }
304
305 return true;
306 }
307
308 private void fillArea(Player player, Location loc, String[] split) {
309 int radius = Integer.parseInt(split[0]);
310
311 Material material = Material.DIRT;
312
313
314 if (split.length == 2) {
315 material = Material.matchMaterial( split[1] );
316 if (material == null) {
317 player.sendMessage("Unknown material: " + split[1] );
318 return;
319 }
320 }
321
322 System.out.println("Player " + player.getName() + " used fillarea with radius=" + radius);
323
324
325 int playerX = loc.getBlockX();
326 int playerY = loc.getBlockY();
327 int playerZ = loc.getBlockZ();
328
329 World world = loc.getWorld();
330
331 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
332 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
333
334
335
336 for (int y=world.getHighestBlockYAt(x, z); y<playerY; y++) {
337 world.getBlockAt(x, y, z).setType( material );
338 }
339
340 }
341
342 }
343 }
344
345 private void createCave(Player player, Location loc, String[] split) {
346
347 int radius = Integer.parseInt(split[0]);
348
349 System.out.println("Player " + player.getName() + " used levelarea with radius=" + radius);
350
351
352 int playerX = loc.getBlockX();
353 int playerY = loc.getBlockY();
354 int playerZ = loc.getBlockZ();
355
356
357 World world = loc.getWorld();
358
359 int count = 0;
360 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
361 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
362
363 int y_max = playerY+radius;
364 //for (int y=playerY; y<=playerY+radius; y++) {
365 for (int y=playerY; y<=y_max; y++) {
366 count++;
367 world.getBlockAt(x, y, z).setType(Material.AIR);
368
369 }
370
371 }
372
373 }
374 }
375
376 private void levelArea(Player player, Location loc, String[] split) {
377
378 int radius = Integer.parseInt(split[0]);
379
380 System.out.println("Player " + player.getName() + " used levelarea with radius=" + radius);
381
382
383 int playerX = loc.getBlockX();
384 int playerY = loc.getBlockY();
385 int playerZ = loc.getBlockZ();
386
387
388 World world = loc.getWorld();
389
390 int count = 0;
391 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
392 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
393
394 //for (int y=playerY; y<=playerY+radius; y++) {
395 for (int y=playerY; y<=Y_MAX; y++) {
396 count++;
397 world.getBlockAt(x, y, z).setType(Material.AIR);
398
399 }
400
401 }
402
403 }
404 }
405
406
407
408 private void resetMap(boolean[][] map) {
409 for (int x=0; x<map.length; x++) {
410 for (int z=0; z<map[0].length; z++) {
411 map[x][z] = false;
412 }
413 }
414 }
415
416 private void cylinder(Player player, Location loc, String[] split) {
417 if (split.length != 2) {
418 player.sendMessage("Usage: /cylinder [radius] [material] ");
419 return;
420 }
421
422 Material material = Material.matchMaterial( split[1] );
423 if ( material == null) {
424 player.sendMessage("/cylinder: unknown material: " + split[1]);
425 return;
426 }
427
428 int radius = Integer.parseInt(split[0]);
429 int diameter = (radius*2) + 1;
430
431 boolean map[][] = new boolean[diameter][diameter];
432 resetMap( map );
433
434 /* map[0][0] = true;
435 map[0][diameter-1] = true;
436 map[diameter-1][0] = true;
437 map[diameter-1][diameter-1] = true;*/
438
439 for (int r=0; r<360; r++) {
440 double rad = Math.toRadians( r );
441
442 double a = (double) radius * Math.sin( rad);
443 double b = (double) radius * Math.cos( rad);
444
445 int x = radius + (int)Math.round(a);
446 int y = radius + (int)Math.round(b);
447
448 map[x][y] = true;
449 }
450
451
452 drawMap( loc, map, material );
453 }
454
455 private void drawMap(Location loc, boolean[][] map, Material material) {
456 int playerX = loc.getBlockX();
457 int playerY = loc.getBlockY();
458 int playerZ = loc.getBlockZ();
459
460 World world = loc.getWorld();
461
462 for (int i=0; i<map.length; i++) {
463 for (int j=0; j<map[0].length; j++) {
464
465 int x = playerX + i + 1;
466 int z = playerZ + j;
467
468 if (map[i][j] == true) {
469 for (int y=world.getHighestBlockYAt(x, z); y<playerY; y++) {
470 world.getBlockAt(x, y, z).setType(material);
471 }
472 }
473
474 }
475 }
476 }
477
478
479
480 }

  ViewVC Help
Powered by ViewVC 1.1.20