/[projects]/miscJava/minecraft-plugins/hoeruputils/src/HoerupUtils.java
ViewVC logotype

Contents of /miscJava/minecraft-plugins/hoeruputils/src/HoerupUtils.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1204 - (show annotations) (download)
Mon Dec 6 15:13:46 2010 UTC (13 years, 5 months ago) by torben
File size: 13735 byte(s)
Use 'Minecraft' logger so log output is similar to the other log output
1
2 import java.util.logging.*;
3 import java.util.*;
4
5 public class HoerupUtils extends Plugin {
6
7 final static Logger log = Logger.getLogger("Minecraft");
8
9
10 private void registerCommands() {
11 etc e = etc.getInstance();
12 e.addCommand("/setpos", "[x] [z] <height> - Teleports you to the given coordinates");
13 e.addCommand("/whereis", "[player] - Tells you the position of another player");
14 e.addCommand("/fillarea", "");
15 e.addCommand("/levelarea", "");
16 e.addCommand("/setsurface", "");
17 e.addCommand("/slopearea", "");
18 e.addCommand("/admindestroy","");
19 }
20
21 @Override
22 public void enable() {
23 registerCommands();
24 }
25
26 @Override
27 public void disable() {
28 etc e = etc.getInstance();
29 e.removeCommand("/setpos");
30 e.removeCommand("/whereis");
31 e.removeCommand("/fillarea");
32 e.removeCommand("/levelarea");
33 e.removeCommand("/setsurface");
34 e.removeCommand("/slopearea");
35 e.removeCommand("/admindestroy");
36 }
37
38
39 @Override
40 public void initialize() {
41 PluginLoader loader = etc.getLoader();
42 loader.addListener( PluginLoader.Hook.COMMAND, new HoerupUtilsPlugin(), this, PluginListener.Priority.MEDIUM );
43 loader.addListener( PluginLoader.Hook.LOGIN, new ConnectedUsers(), this, PluginListener.Priority.MEDIUM );
44
45 Jail j = new Jail();
46 loader.addListener( PluginLoader.Hook.TELEPORT, j, this, PluginListener.Priority.MEDIUM);
47 loader.addListener( PluginLoader.Hook.COMMAND, j, this, PluginListener.Priority.MEDIUM );
48 loader.addListener( PluginLoader.Hook.PLAYER_MOVE, j, this, PluginListener.Priority.MEDIUM );
49
50 AdminDestroy adm = new AdminDestroy();
51 loader.addListener( PluginLoader.Hook.COMMAND, adm, this, PluginListener.Priority.MEDIUM);
52 loader.addListener( PluginLoader.Hook.BLOCK_DESTROYED, adm, this, PluginListener.Priority.MEDIUM );
53 loader.addListener( PluginLoader.Hook.DISCONNECT, adm, this, PluginListener.Priority.MEDIUM );
54
55
56 registerCommands();
57 }
58
59
60
61 class ConnectedUsers extends PluginListener {
62 public void onLogin(Player player) {
63 List<Player> players = etc.getServer().getPlayerList();
64 int count = players.size();
65
66 StringBuilder sb = new StringBuilder();
67 for (int i=0; i<count; i++) {
68 if (i>0)
69 sb.append(" ");
70 sb.append( players.get(i).getName() );
71 }
72
73 player.sendMessage(Colors.Red + "Connected users " + count + ": " + Colors.White + sb.toString() );
74 }
75 }
76
77
78 public static String getBearingStr(int angle) {
79 if (angle < 22) {
80 return "N";
81 } else if (angle < 67) {
82 return "NE";
83 } else if (angle < 112) {
84 return "E";
85 } else if (angle < 157) {
86 return "SE";
87 } else if (angle < 202) {
88 return "S";
89 } else if (angle < 257) {
90 return "SW";
91 } else if (angle < 292) {
92 return "W";
93 } else if (angle < 337) {
94 return "NW";
95 } else {
96 return "N";
97 }
98 }
99
100 public static int calcDistance(Location loc1, Location loc2) {
101 double distX = loc1.x - loc2.x ;
102 double distZ = loc1.z - loc2.z ;
103
104 int dist = (int) Math.round( Math.sqrt( (distX*distX) + (distZ*distZ)) );
105
106 return dist;
107 }
108
109 public static int calcBearing(Location loc1, Location loc2) {
110 double distX = loc1.x - loc2.x ;
111 double distZ = loc1.z - loc2.z ;
112
113 double angle = Math.toDegrees( Math.atan( distZ / distX ) );
114 if (angle < 0.0)
115 angle += 90.0;
116
117
118 if (distX >= 0.0 && distZ >= 0.0) { //both positive, 0-90 degrees
119 //do nothing
120 } else if (distX < 0.0 && distZ >= 0.0) { // 90-180 degrees
121 angle += 90.0;
122 } else if (distX < 0.0 && distZ < 0.0) {//Both negative 180-270 degrees
123 angle += 180.0;
124 } else {
125 angle += 270.0;
126 }
127
128 return (int) angle;
129 }
130
131 public class HoerupUtilsPlugin extends PluginListener {
132 final static String USAGE = "Usage: /setpos [x] [z] <height>";
133 final static int BLOCK_AIR = 0; //block id = 0 is air
134 final static int BLOCK_GRASS = 2;
135 final static int BLOCK_DIRT = 3;
136
137 private HashMap<String, String[]> commands = new HashMap<String,String[]>();
138
139
140
141 //http://www.minecraftforum.net/viewtopic.php?f=35&t=14739
142 //Y is height
143
144 // air == blockID:0
145
146 private int getGroundLevel(int x, int z) {
147 Server srv = etc.getServer();
148
149 int level = srv.getHighestBlockY(x,z);
150
151 if (level == -1)
152 level = 128;
153 return level;
154
155 /*
156 int y;
157
158 for (y=128; y>=0 && srv.getBlockIdAt(x,y-1,z) == AIRBLOCK; y--)
159 ;
160
161 System.out.println("Groundlevel: " + y);
162 System.out.println("getHighestBlockY: " + srv.getHighestBlockY(x,z) );
163
164 return y;
165 */
166 }
167
168
169 private boolean isFree(int x, int y, int z) {
170 Server srv = etc.getServer();
171
172 return (srv.getBlockIdAt(x,y,z) == BLOCK_AIR && srv.getBlockIdAt(x,y+1,z) == BLOCK_AIR);
173 }
174
175 public void slopeArea(Player player, java.lang.String[] split) {
176 int radius = Integer.parseInt(split[1]);
177
178 System.out.println("Player " + player.getName() + " used slopearea with radius=" + radius);
179
180
181 int playerX = roundPos( player.getX() );
182 int playerY = (int) player.getY();
183 int playerZ = roundPos( player.getZ() );
184
185 Server srv = etc.getServer();
186
187 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
188 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
189
190
191 int xdist = Math.abs(playerX-x);
192 int zdist = Math.abs(playerZ-z);
193
194 int dist = Math.max(xdist,zdist);
195
196 //for (int y=playerY; y<=playerY+radius; y++) {
197 for (int y=(playerY+dist); y<=128; y++) {
198 srv.setBlockAt(BLOCK_AIR, x, y, z);
199 }
200
201 }
202
203 }
204 }
205
206 @Override
207 public boolean onCommand(Player player, java.lang.String[] split) {
208 if (! player.canUseCommand(split[0]) ) {
209 return false;
210 }
211
212 if ( split[0].equals("/levelarea") || split[0].equals("/la") || split[0].equals("/slopearea") || split[0].equals("/fillarea") || split[0].equals("/setsurface") ) {
213 commands.put(player.getName(), split);
214 }
215
216 if ( split[0].equals("//") ) {
217 String cmd[] = commands.get(player.getName() );
218 if (cmd != null) {
219 onCommand(player, commands.get(player.getName() ) );
220 } else {
221 player.sendMessage("//: no recorded command found");
222 }
223 return true;
224 } else if( split[0].equals("/setpos") && player.canUseCommand("/setpos") ) {
225 setPos(player, split);
226 return true;
227 } else if ( split[0].equals("/whereis" ) && player.canUseCommand("/whereis")) {
228 whereIs(player, split);
229 return true;
230 } else if ( (split[0].equals("/levelarea") || split[0].equals("/la")) && player.canUseCommand("/levelarea")) {
231 if (validateLevelOrFill(player,split)) {
232 levelArea(player, split);
233 }
234 return true;
235 } else if (split[0].equals("/slopearea") ) {
236 if (validateLevelOrFill(player,split)) {
237 slopeArea(player,split);
238 }
239 return true;
240 } else if (split[0].equals("/fillarea") && player.canUseCommand("/fillarea")) {
241 if (validateLevelOrFill(player,split)) {
242 fillArea(player, split);
243 }
244 return true;
245 } else if (split[0].equals("/setsurface") && player.canUseCommand("/setsurface")) {
246 setSurface(player,split);
247 return true;
248 } else {
249 return false;
250 }
251
252 }
253
254 int roundPos(double input) {
255 int result = (int) input;
256 if (input < 0.0) {
257 result--;
258 }
259
260 return result;
261 }
262
263 private void setSurface(Player player, String[] split) {
264 int valid_block_array[] = {1, 2, 3, 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} ;
265
266 final int BLOCK_MAX = 86;
267
268 if (split.length != 3) {
269 player.sendMessage("Usage /setsurface [radius] [blockID]");
270 return;
271 }
272
273
274 int radius;
275 try {
276 radius = Integer.parseInt(split[1]);
277 } catch (Exception e) {
278 player.sendMessage("setsurface: radius must be an integer");
279 return;
280 }
281
282 if (radius > 20) {
283 player.sendMessage("setsurface: radius may not exceed 20");
284 return;
285 }
286
287
288 int blockid;
289 try {
290 blockid = Integer.parseInt(split[2]);
291 } catch (Exception e) {
292 player.sendMessage("setsurface: blockid must be an integer");
293 return;
294 }
295
296 boolean validblock = false;
297 for (int i=0; i<valid_block_array.length; i++) {
298 if (valid_block_array[i] == blockid) {
299 validblock = true;
300 break;
301 }
302 }
303
304 if ( !validblock ) {
305 player.sendMessage("setsurface: block now allowed");
306 return;
307 }
308
309 int playerX = roundPos( player.getX() );
310 int playerY = (int) player.getY();
311 int playerZ = roundPos( player.getZ() );
312
313 if(playerY <= 2 && blockid != 7) {
314 player.sendMessage("setsurface: at this level you may only use bedrock(id=7)");
315 return;
316 }
317
318 Server srv = etc.getServer();
319
320 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
321 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
322 int y = getGroundLevel(x,z) - 1;
323 srv.setBlockAt(blockid, x, y, z);
324 }
325 }
326 }
327
328 private boolean validateLevelOrFill(Player player, String[] split) {
329 if (split.length < 2 || split.length > 3) {
330 player.sendMessage("Usage: " + split[0] + " [radius]");
331 return false;
332 }
333
334 int radius;
335 try {
336 radius = Integer.parseInt(split[1]);
337 } catch (Exception e) {
338 player.sendMessage(split[0] + ": radius must be an integer");
339 return false;
340 }
341
342 if (radius > 20) {
343 player.sendMessage(split[0] + ": radius may not exceed 20");
344 return false;
345 }
346
347 if (split.length == 3) {
348 int id;
349 try {
350 id = Integer.parseInt( split[2] );
351 } catch (Exception e) {
352 player.sendMessage(split[0] + ": id must be an integer");
353 return false;
354 }
355 if ( id == 46) {
356 player.sendMessage("Sorry dave, i can't do that");
357 return false;
358 }
359
360 }
361
362 return true;
363 }
364
365 private void fillArea(Player player, String[] split) {
366 int radius = Integer.parseInt(split[1]);
367
368 int material = BLOCK_DIRT;
369 if (split.length == 3) {
370 material = Integer.parseInt( split[2] );
371 }
372
373 System.out.println("Player " + player.getName() + " used fillarea with radius=" + radius);
374
375
376 int playerX = roundPos( player.getX() );
377 int playerY = (int) player.getY();
378 int playerZ = roundPos( player.getZ() );
379
380 Server srv = etc.getServer();
381
382 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
383 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
384
385 for (int y=getGroundLevel(x,z); y<playerY; y++) {
386 srv.setBlockAt(material, x, y, z);
387 }
388
389 }
390
391 }
392 }
393
394 private void levelArea(Player player, String[] split) {
395
396 int radius = Integer.parseInt(split[1]);
397
398 System.out.println("Player " + player.getName() + " used levelarea with radius=" + radius);
399
400
401 int playerX = roundPos( player.getX() );
402 int playerY = (int) player.getY();
403 int playerZ = roundPos( player.getZ() );
404
405 Server srv = etc.getServer();
406
407 int count = 0;
408 for (int x=(playerX-radius); x<=(playerX+radius); x++) {
409 for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
410
411 //for (int y=playerY; y<=playerY+radius; y++) {
412 for (int y=playerY; y<=128; y++) {
413 count++;
414 srv.setBlockAt(BLOCK_AIR, x, y, z);
415 }
416
417 }
418
419 }
420 }
421
422
423
424 double roundToPlaces(double value, int places) {
425 double pow = Math.pow(10, places);
426 double temp = Math.round( value*pow );
427
428 return temp / pow;
429 }
430
431
432 public void whereIs(Player p1, java.lang.String[] split) {
433 if (split.length < 2 || split.length >3) {
434 p1.sendMessage( Colors.Rose + "usage: /whereis (playername|home|warp) <warpname>" );
435 return;
436 }
437
438 Location loc1 = p1.getLocation();
439 Location loc2;
440 String name2;
441
442 if (split[1].equals("home") ) {
443
444 Warp home = etc.getDataSource().getHome( p1.getName() );
445 if (home == null) {
446 p1.sendMessage(Colors.Rose + "you haven't set a home.");
447 return;
448 }
449 loc2 = home.Location;
450 name2 = "Your home";
451 } else if (split[1].equals("warp")) {
452 if (split.length != 3) {
453 p1.sendMessage("you have to enter the name of the warp point");
454 return;
455 }
456 Warp warp = etc.getDataSource().getWarp( split[2] );
457 if (warp == null) {
458 p1.sendMessage("Found now warp with name " + split[2]);
459 return;
460 }
461 loc2 = warp.Location;
462 name2 = "Warppoint " + split[2];
463
464
465 } else {
466
467 Player p2 = etc.getServer().getPlayer(split[1]);
468
469 if (p2 == null) {
470 p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] );
471 return;
472 }
473
474 loc2 = p2.getLocation();
475 name2 = p2.getName();
476 }
477
478 int dist = calcDistance(loc1, loc2);
479 int angle = calcBearing(loc1, loc2);
480
481
482
483 p1.sendMessage( Colors.Yellow + name2 + " is at x:" + roundToPlaces(loc2.x, 2) + " y:" + roundToPlaces(loc2.y, 2) + " z: " + roundToPlaces(loc2.z, 2) );
484 p1.sendMessage( Colors.Yellow + "Distance is " + dist + " blocks" );
485 p1.sendMessage( Colors.Yellow + "Bearing: " + angle + " (" + getBearingStr( angle) + ")" );
486
487
488
489 }
490
491
492 public void setPos(Player player, java.lang.String[] split) {
493 int x;
494 int z;
495 int y;
496
497 int userY = 0;
498 boolean hasY = false;
499
500 if (split.length <3 || split.length > 4) {
501 player.sendMessage(USAGE);
502 return;
503 }
504
505 try {
506 x = Integer.parseInt( split[1] );
507 z = Integer.parseInt( split[2] );
508 if (split.length == 4) {
509 hasY = true;
510 userY = Integer.parseInt( split[3] );
511 }
512 } catch (Exception e) {
513 player.sendMessage("/setpos error: non numeric argument");
514 return;
515 }
516
517
518
519 if (hasY) {
520 if (isFree(x,userY,z)) {
521 y = userY;
522 } else {
523 player.sendMessage("/setpos: that position is not free");
524 return;
525 }
526 } else {
527 y = getGroundLevel(x,z);
528 }
529
530 log.info("Transporting " + player.getName() + " to " + x + " " + z + "(" + y + ")" );
531
532
533 Location newLocation = new Location();
534 newLocation.rotY = player.getPitch();
535 newLocation.rotX = player.getRotation();
536 newLocation.x = x + 0.5;
537 newLocation.z = z + 0.5;
538 newLocation.y = y;
539
540 player.teleportTo(newLocation);
541 player.sendMessage("Whooooooosh");
542 }
543 }
544 }

  ViewVC Help
Powered by ViewVC 1.1.20