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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

miscJava/minecraft-plugins/setposplugin/src/Setpos.java revision 1166 by torben, Fri Oct 15 12:34:50 2010 UTC miscJava/minecraft-plugins/hoeruputils/src/HoerupUtils.java revision 1201 by torben, Sat Dec 4 11:38:36 2010 UTC
# Line 1  Line 1 
1    
2  import java.util.logging.*;  import java.util.logging.*;
3    import java.util.*;
4    
5  public class Setpos extends Plugin {  public class HoerupUtils extends Plugin {
6    
7          final static Logger log = Logger.getLogger("SetposPlugin");          final static Logger log = Logger.getLogger("HoerupUtils");
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          @Override
22          public void disable() {}          public void enable() {
23                    registerCommands();
24            }
25    
26          @Override          @Override
27          public void enable() {}          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          @Override
40          public void initialize() {          public void initialize() {
41                  PluginLoader loader = etc.getLoader();                  PluginLoader loader = etc.getLoader();
42                  loader.addListener( PluginLoader.Hook.COMMAND, new RealSetposPlugin(), this, PluginListener.Priority.MEDIUM );                  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          public static class RealSetposPlugin extends PluginListener {          class ConnectedUsers extends PluginListener {
62                  final static String USAGE = "Usage: /setpos <x> <z> [height]";                  public void onLogin(Player player) {
63                  final static int AIRBLOCK = 0; //block id = 0 is air                          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    
# Line 57  public class Setpos extends Plugin { Line 169  public class Setpos extends Plugin {
169                  private boolean isFree(int x, int y, int z) {                  private boolean isFree(int x, int y, int z) {
170                          Server srv = etc.getServer();                          Server srv = etc.getServer();
171    
172                          return  (srv.getBlockIdAt(x,y,z) == AIRBLOCK && srv.getBlockIdAt(x,y+1,z) == AIRBLOCK);                          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                  @Override
207                  public boolean onCommand(Player player, java.lang.String[] split) {                  public boolean onCommand(Player player, java.lang.String[] split) {
208                          if( split[0].equals("/setpos") ) {                          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);                                  setPos(player, split);
226                                  return true;                                  return true;
227                          } else if ( split[0].equals("/whereis" ) ) {                          } else if ( split[0].equals("/whereis" ) && player.canUseCommand("/whereis")) {
228                                  whereIs(player, split);                                  whereIs(player, split);
229                                  return true;                                  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 {                          } else {
249                                  return false;                                  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, 46, 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                                    try {
349                                            Integer.parseInt( split[2] );
350                                    } catch (Exception e) {
351                                            player.sendMessage(split[0] + ": radius must be an integer");
352                                            return false;
353                                    }
354                            }
355    
356                            return true;
357                    }
358    
359                    private void fillArea(Player player, String[] split) {
360                            int radius = Integer.parseInt(split[1]);
361                            
362                            int material = BLOCK_DIRT;
363                            if (split.length == 3) {
364                                    material = Integer.parseInt( split[2] );
365                            }
366    
367                            System.out.println("Player " + player.getName() + " used fillarea with radius=" + radius);
368                            
369    
370                            int playerX = roundPos( player.getX() );
371                            int playerY = (int) player.getY();
372                            int playerZ = roundPos( player.getZ() );
373                            
374                            Server srv = etc.getServer();
375    
376                            for (int x=(playerX-radius); x<=(playerX+radius); x++) {
377                                    for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
378    
379                                            for (int y=getGroundLevel(x,z); y<playerY; y++) {
380                                                    srv.setBlockAt(material, x, y, z);
381                                            }
382    
383                                    }
384    
385                            }
386                    }
387    
388                    private void levelArea(Player player, String[] split) {
389    
390                            int radius = Integer.parseInt(split[1]);
391    
392                            System.out.println("Player " + player.getName() + " used levelarea with radius=" + radius);
393                            
394    
395                            int playerX = roundPos( player.getX() );
396                            int playerY = (int) player.getY();
397                            int playerZ = roundPos( player.getZ() );
398                            
399                            Server srv = etc.getServer();
400    
401                            int count = 0;
402                            for (int x=(playerX-radius); x<=(playerX+radius); x++) {
403                                    for (int z=(playerZ-radius); z<=(playerZ+radius); z++) {
404    
405                                            //for (int y=playerY; y<=playerY+radius; y++) {
406                                            for (int y=playerY; y<=128; y++) {
407                                                    count++;
408                                                    srv.setBlockAt(BLOCK_AIR, x, y, z);
409                                            }
410    
411                                    }
412    
413                            }
414                    }
415    
416    
417    
418           double roundToPlaces(double value, int places) {           double roundToPlaces(double value, int places) {
# Line 86  public class Setpos extends Plugin { Line 423  public class Setpos extends Plugin {
423          }          }
424    
425    
         private String getBearingStr(int angle) {  
                 if (angle < 22) {  
                         return "N";  
                 } else if (angle < 67) {  
                         return "NE";  
                 } else if (angle < 112) {  
                         return "E";  
                 } else if (angle < 157) {  
                         return "SE";  
                 } else if (angle < 202) {  
                         return "S";  
                 } else if (angle < 257) {  
                         return "SW";  
                 } else if (angle < 292) {  
                         return "W";  
                 } else if (angle < 337) {  
                         return "NW";  
                 } else {  
                         return "N";  
                 }  
         }  
   
426          public void whereIs(Player p1, java.lang.String[] split) {          public void whereIs(Player p1, java.lang.String[] split) {
427                  if (split.length != 2) {                  if (split.length < 2 || split.length >3) {
428                          p1.sendMessage( Colors.Rose + "usage: /whereis <playername>");                          p1.sendMessage( Colors.Rose + "usage: /whereis (playername|home|warp) <warpname>" );
429                          return;                          return;
430                  }                  }
                 Player p2 = etc.getServer().getPlayer(split[1]);  
431    
                 if (p2 == null) {  
                         p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] );  
                         return;  
                 }  
432                  Location loc1 = p1.getLocation();                  Location loc1 = p1.getLocation();
433                  Location loc2 = p2.getLocation();                  Location loc2;
434                  //Location loc2 = new Location();                  String name2;
                 //loc2.x = loc2.y = loc2.z = 0;  
435    
436  //System.out.println("p1: " + loc1.x + "," + loc1.z );                  if (split[1].equals("home") ) {
437  //System.out.println("p2: " + loc2.x + "," + loc2.z );                          
438                            Warp home = etc.getDataSource().getHome( p1.getName() );
439                            if (home == null) {
440                                    p1.sendMessage(Colors.Rose + "you haven't set a home.");
441                                    return;
442                            }
443                            loc2 = home.Location;
444                            name2 = "Your home";
445                    } else if (split[1].equals("warp")) {
446                            if (split.length != 3) {
447                                    p1.sendMessage("you have to enter the name of the warp point");
448                                    return;
449                            }
450                            Warp warp = etc.getDataSource().getWarp( split[2] );
451                            if (warp == null) {
452                                    p1.sendMessage("Found now warp with name " + split[2]);
453                                    return;
454                            }
455                            loc2 = warp.Location;
456                            name2 = "Warppoint " + split[2];
457                            
458    
459                  double distX =   loc1.x - loc2.x  ;                  } else {
                 double distZ =   loc1.z - loc2.z  ;  
460    
461                  int dist = (int) Math.round( Math.sqrt( (distX*distX) + (distZ*distZ)) );                          Player p2 = etc.getServer().getPlayer(split[1]);
 /*System.out.println("distX:" + distX );  
 System.out.println("distZ:" + distZ );  
462    
463  System.out.println(">> " + (distZ / distX ) );*/                          if (p2 == null) {
464                                    p1.sendMessage( Colors.Rose + "whereis: no player named " + split[1] );
465                                    return;
466                            }
467                            
468                            loc2 = p2.getLocation();
469                            name2 = p2.getName();
470                    }
471    
472                  double angle = Math.toDegrees( Math.atan( distZ / distX ) );                  int dist = calcDistance(loc1, loc2);
473                  if (angle < 0.0)                  int angle = calcBearing(loc1, loc2);
                         angle += 90.0;  
474    
475    
                 if (distX >= 0.0 && distZ >= 0.0) { //both positive, 0-90 degrees  
                         //do nothing  
                 } else if (distX < 0.0 && distZ >= 0.0) { // 90-180 degrees  
                         angle += 90.0;  
                 } else if (distX < 0.0 && distZ < 0.0) {//Both negative 180-270 degrees  
                         angle += 180.0;  
                 } else {  
                         angle += 270.0;  
                 }  
476    
477                  p1.sendMessage( Colors.Yellow + p2.getName() + " is at x:" + roundToPlaces(p2.getX(),2) + " y:" + roundToPlaces(p2.getY(),2) + " z: " + roundToPlaces(p2.getZ(),2) );                  p1.sendMessage( Colors.Yellow + name2 + " is at x:" + roundToPlaces(loc2.x, 2) + " y:" + roundToPlaces(loc2.y, 2) + " z: " + roundToPlaces(loc2.z, 2) );
478                  p1.sendMessage( Colors.Yellow + "Distance is " + dist + " blocks" );                  p1.sendMessage( Colors.Yellow + "Distance is " + dist + " blocks" );
479                  p1.sendMessage( Colors.Yellow + "Bearing: " + (int) angle  + " (" + getBearingStr( (int) angle) + ")" );                  p1.sendMessage( Colors.Yellow + "Bearing: " + angle  + " (" + getBearingStr( angle) + ")" );
480    
481                                    
482    

Legend:
Removed from v.1166  
changed lines
  Added in v.1201

  ViewVC Help
Powered by ViewVC 1.1.20