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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1199 - (hide annotations) (download)
Wed Dec 1 08:37:08 2010 UTC (13 years, 6 months ago) by torben
File size: 13057 byte(s)
add slopearea and admindestroy to list of commands
1 torben 1166
2     import java.util.logging.*;
3 torben 1184 import java.util.*;
4 torben 1166
5 torben 1174 public class HoerupUtils extends Plugin {
6 torben 1166
7 torben 1174 final static Logger log = Logger.getLogger("HoerupUtils");
8 torben 1166
9 torben 1183
10 torben 1178 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 torben 1199 e.addCommand("/slopearea", "");
18     e.addCommand("/admindestroy","");
19 torben 1178 }
20 torben 1166
21     @Override
22 torben 1195 public void enable() {
23 torben 1178 registerCommands();
24     }
25 torben 1166
26     @Override
27 torben 1195 public void disable() {
28 torben 1178 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 torben 1199 e.removeCommand("/slopearea");
35     e.removeCommand("/admindestroy");
36 torben 1178 }
37 torben 1193
38 torben 1166
39     @Override
40     public void initialize() {
41     PluginLoader loader = etc.getLoader();
42 torben 1174 loader.addListener( PluginLoader.Hook.COMMAND, new HoerupUtilsPlugin(), this, PluginListener.Priority.MEDIUM );
43 torben 1193 loader.addListener( PluginLoader.Hook.LOGIN, new ConnectedUsers(), this, PluginListener.Priority.MEDIUM );
44 torben 1178
45 torben 1193 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 torben 1183
50 torben 1196 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 torben 1193
55    
56 torben 1178 registerCommands();
57 torben 1166 }
58    
59    
60 torben 1184
61 torben 1193 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 torben 1183 public class HoerupUtilsPlugin extends PluginListener {
132 torben 1178 final static String USAGE = "Usage: /setpos [x] [z] <height>";
133 torben 1176 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 torben 1166
137    
138    
139     //http://www.minecraftforum.net/viewtopic.php?f=35&t=14739
140     //Y is height
141    
142     // air == blockID:0
143    
144     private int getGroundLevel(int x, int z) {
145     Server srv = etc.getServer();
146    
147     int level = srv.getHighestBlockY(x,z);
148    
149     if (level == -1)
150     level = 128;
151     return level;
152    
153     /*
154     int y;
155    
156     for (y=128; y>=0 && srv.getBlockIdAt(x,y-1,z) == AIRBLOCK; y--)
157     ;
158    
159     System.out.println("Groundlevel: " + y);
160     System.out.println("getHighestBlockY: " + srv.getHighestBlockY(x,z) );
161    
162     return y;
163     */
164     }
165    
166    
167     private boolean isFree(int x, int y, int z) {
168     Server srv = etc.getServer();
169    
170 torben 1176 return (srv.getBlockIdAt(x,y,z) == BLOCK_AIR && srv.getBlockIdAt(x,y+1,z) == BLOCK_AIR);
171 torben 1166 }
172    
173 torben 1198 public void slopeArea(Player player, java.lang.String[] split) {
174     int radius = Integer.parseInt(split[1]);
175 torben 1166
176 torben 1198 System.out.println("Player " + player.getName() + " used slopearea with radius=" + radius);
177    
178    
179     int playerX = roundPos( player.getX() );
180     int playerY = (int) player.getY();
181     int playerZ = roundPos( player.getZ() );
182    
183     Server srv = etc.getServer();
184    
185     for (int x=(playerX-radius); x<=(playerX+radius); x++) {
186     for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
187    
188    
189     int xdist = Math.abs(playerX-x);
190     int zdist = Math.abs(playerZ-z);
191    
192     int dist = Math.max(xdist,zdist);
193    
194     //for (int y=playerY; y<=playerY+radius; y++) {
195     for (int y=(playerY+dist); y<=128; y++) {
196     srv.setBlockAt(BLOCK_AIR, x, y, z);
197     }
198    
199     }
200    
201     }
202     }
203    
204 torben 1166 @Override
205     public boolean onCommand(Player player, java.lang.String[] split) {
206 torben 1198 if (! player.canUseCommand(split[0]) ) {
207     return false;
208     }
209    
210 torben 1196 if( split[0].equals("/setpos") && player.canUseCommand("/setpos") ) {
211 torben 1166 setPos(player, split);
212     return true;
213 torben 1170 } else if ( split[0].equals("/whereis" ) && player.canUseCommand("/whereis")) {
214 torben 1166 whereIs(player, split);
215     return true;
216 torben 1197 } else if ( (split[0].equals("/levelarea") || split[0].equals("/la")) && player.canUseCommand("/levelarea")) {
217 torben 1176 if (validateLevelOrFill(player,split)) {
218     levelArea(player, split);
219     }
220 torben 1169 return true;
221 torben 1198 } else if (split[0].equals("/slopearea") ) {
222     if (validateLevelOrFill(player,split)) {
223     slopeArea(player,split);
224     }
225     return true;
226 torben 1176 } else if (split[0].equals("/fillarea") && player.canUseCommand("/fillarea")) {
227     if (validateLevelOrFill(player,split)) {
228     fillArea(player, split);
229     }
230     return true;
231 torben 1175 } else if (split[0].equals("/setsurface") && player.canUseCommand("/setsurface")) {
232     setSurface(player,split);
233     return true;
234 torben 1166 } else {
235     return false;
236     }
237    
238     }
239    
240 torben 1177 int roundPos(double input) {
241     int result = (int) input;
242     if (input < 0.0) {
243     result--;
244     }
245    
246     return result;
247     }
248    
249 torben 1175 private void setSurface(Player player, String[] split) {
250     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, 46, 48, 49, 56, 57, 73, 74, 79, 80, 82} ;
251    
252     final int BLOCK_MAX = 86;
253    
254     if (split.length != 3) {
255 torben 1178 player.sendMessage("Usage /setsurface [radius] [blockID]");
256 torben 1175 return;
257     }
258    
259    
260     int radius;
261     try {
262     radius = Integer.parseInt(split[1]);
263     } catch (Exception e) {
264     player.sendMessage("setsurface: radius must be an integer");
265     return;
266     }
267    
268     if (radius > 20) {
269     player.sendMessage("setsurface: radius may not exceed 20");
270     return;
271     }
272    
273    
274     int blockid;
275     try {
276     blockid = Integer.parseInt(split[2]);
277     } catch (Exception e) {
278     player.sendMessage("setsurface: blockid must be an integer");
279     return;
280     }
281    
282     boolean validblock = false;
283     for (int i=0; i<valid_block_array.length; i++) {
284     if (valid_block_array[i] == blockid) {
285     validblock = true;
286     break;
287     }
288     }
289    
290     if ( !validblock ) {
291     player.sendMessage("setsurface: block now allowed");
292     return;
293     }
294    
295 torben 1177 int playerX = roundPos( player.getX() );
296 torben 1175 int playerY = (int) player.getY();
297 torben 1177 int playerZ = roundPos( player.getZ() );
298 torben 1175
299     if(playerY <= 2 && blockid != 7) {
300     player.sendMessage("setsurface: at this level you may only use bedrock(id=7)");
301     return;
302     }
303    
304     Server srv = etc.getServer();
305    
306     for (int x=(playerX-radius); x<=(playerX+radius); x++) {
307     for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
308     int y = getGroundLevel(x,z) - 1;
309     srv.setBlockAt(blockid, x, y, z);
310     }
311     }
312     }
313    
314 torben 1176 private boolean validateLevelOrFill(Player player, String[] split) {
315 torben 1183 if (split.length < 2 || split.length > 3) {
316 torben 1178 player.sendMessage("Usage: " + split[0] + " [radius]");
317 torben 1176 return false;
318 torben 1169 }
319    
320     int radius;
321     try {
322     radius = Integer.parseInt(split[1]);
323     } catch (Exception e) {
324 torben 1176 player.sendMessage(split[0] + ": radius must be an integer");
325     return false;
326 torben 1169 }
327 torben 1166
328 torben 1169 if (radius > 20) {
329 torben 1176 player.sendMessage(split[0] + ": radius may not exceed 20");
330     return false;
331 torben 1169 }
332 torben 1183
333     if (split.length == 3) {
334     try {
335     Integer.parseInt( split[2] );
336     } catch (Exception e) {
337     player.sendMessage(split[0] + ": radius must be an integer");
338     return false;
339     }
340     }
341 torben 1166
342 torben 1176 return true;
343     }
344 torben 1169
345 torben 1176 private void fillArea(Player player, String[] split) {
346     int radius = Integer.parseInt(split[1]);
347 torben 1183
348     int material = BLOCK_DIRT;
349     if (split.length == 3) {
350     material = Integer.parseInt( split[2] );
351     }
352 torben 1175
353 torben 1176 System.out.println("Player " + player.getName() + " used fillarea with radius=" + radius);
354    
355    
356 torben 1177 int playerX = roundPos( player.getX() );
357 torben 1176 int playerY = (int) player.getY();
358 torben 1177 int playerZ = roundPos( player.getZ() );
359 torben 1176
360     Server srv = etc.getServer();
361    
362     for (int x=(playerX-radius); x<=(playerX+radius); x++) {
363     for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
364    
365     for (int y=getGroundLevel(x,z); y<playerY; y++) {
366 torben 1183 srv.setBlockAt(material, x, y, z);
367 torben 1176 }
368    
369     }
370    
371     }
372     }
373    
374     private void levelArea(Player player, String[] split) {
375    
376     int radius = Integer.parseInt(split[1]);
377    
378 torben 1169 System.out.println("Player " + player.getName() + " used levelarea with radius=" + radius);
379    
380    
381 torben 1177 int playerX = roundPos( player.getX() );
382 torben 1169 int playerY = (int) player.getY();
383 torben 1177 int playerZ = roundPos( player.getZ() );
384 torben 1169
385     Server srv = etc.getServer();
386    
387     int count = 0;
388     for (int x=(playerX-radius); x<=(playerX+radius); x++) {
389     for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
390    
391     //for (int y=playerY; y<=playerY+radius; y++) {
392     for (int y=playerY; y<=128; y++) {
393     count++;
394 torben 1176 srv.setBlockAt(BLOCK_AIR, x, y, z);
395 torben 1169 }
396    
397     }
398    
399     }
400     }
401    
402    
403    
404 torben 1166 double roundToPlaces(double value, int places) {
405     double pow = Math.pow(10, places);
406     double temp = Math.round( value*pow );
407    
408     return temp / pow;
409     }
410    
411    
412     public void whereIs(Player p1, java.lang.String[] split) {
413 torben 1167 if (split.length < 2 || split.length >3) {
414 torben 1178 p1.sendMessage( Colors.Rose + "usage: /whereis (playername|home|warp) <warpname>" );
415 torben 1166 return;
416     }
417    
418 torben 1167 Location loc1 = p1.getLocation();
419     Location loc2;
420     String name2;
421    
422     if (split[1].equals("home") ) {
423    
424     Warp home = etc.getDataSource().getHome( p1.getName() );
425     if (home == null) {
426     p1.sendMessage(Colors.Rose + "you haven't set a home.");
427     return;
428     }
429     loc2 = home.Location;
430     name2 = "Your home";
431     } else if (split[1].equals("warp")) {
432     if (split.length != 3) {
433     p1.sendMessage("you have to enter the name of the warp point");
434     return;
435     }
436     Warp warp = etc.getDataSource().getWarp( split[2] );
437     if (warp == null) {
438     p1.sendMessage("Found now warp with name " + split[2]);
439     return;
440     }
441     loc2 = warp.Location;
442     name2 = "Warppoint " + split[2];
443    
444    
445     } else {
446    
447     Player p2 = etc.getServer().getPlayer(split[1]);
448    
449     if (p2 == null) {
450     p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] );
451     return;
452     }
453    
454     loc2 = p2.getLocation();
455     name2 = p2.getName();
456 torben 1166 }
457    
458 torben 1193 int dist = calcDistance(loc1, loc2);
459     int angle = calcBearing(loc1, loc2);
460 torben 1166
461    
462    
463 torben 1167 p1.sendMessage( Colors.Yellow + name2 + " is at x:" + roundToPlaces(loc2.x, 2) + " y:" + roundToPlaces(loc2.y, 2) + " z: " + roundToPlaces(loc2.z, 2) );
464 torben 1166 p1.sendMessage( Colors.Yellow + "Distance is " + dist + " blocks" );
465 torben 1193 p1.sendMessage( Colors.Yellow + "Bearing: " + angle + " (" + getBearingStr( angle) + ")" );
466 torben 1166
467    
468    
469     }
470    
471    
472     public void setPos(Player player, java.lang.String[] split) {
473     int x;
474     int z;
475     int y;
476    
477     int userY = 0;
478     boolean hasY = false;
479    
480     if (split.length <3 || split.length > 4) {
481     player.sendMessage(USAGE);
482     return;
483     }
484    
485     try {
486     x = Integer.parseInt( split[1] );
487     z = Integer.parseInt( split[2] );
488     if (split.length == 4) {
489     hasY = true;
490     userY = Integer.parseInt( split[3] );
491     }
492     } catch (Exception e) {
493     player.sendMessage("/setpos error: non numeric argument");
494     return;
495     }
496    
497    
498    
499     if (hasY) {
500     if (isFree(x,userY,z)) {
501     y = userY;
502     } else {
503     player.sendMessage("/setpos: that position is not free");
504     return;
505     }
506     } else {
507     y = getGroundLevel(x,z);
508     }
509    
510     log.info("Transporting " + player.getName() + " to " + x + " " + z + "(" + y + ")" );
511    
512    
513     Location newLocation = new Location();
514     newLocation.rotY = player.getPitch();
515     newLocation.rotX = player.getRotation();
516     newLocation.x = x + 0.5;
517     newLocation.z = z + 0.5;
518     newLocation.y = y;
519    
520     player.teleportTo(newLocation);
521     player.sendMessage("Whooooooosh");
522     }
523     }
524     }

  ViewVC Help
Powered by ViewVC 1.1.20