Skip to content

Commit

Permalink
Multithreading crash fixes / Server 'find' command added
Browse files Browse the repository at this point in the history
  • Loading branch information
Anuken committed Apr 1, 2018
1 parent 537e25a commit 0936fc6
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 8 deletions.
4 changes: 2 additions & 2 deletions core/assets/version.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#Autogenerated file. Do not modify.
#Fri Mar 30 19:18:12 EDT 2018
#Sun Apr 01 11:24:59 EDT 2018
version=release
androidBuildCode=482
androidBuildCode=483
name=Mindustry
code=3.5
build=custom build
2 changes: 1 addition & 1 deletion core/src/io/anuke/mindustry/core/World.java
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ public void removeBlock(Tile tile){
Array<Tile> removals = target.getLinkedTiles();
for(Tile toremove : removals){
//note that setting a new block automatically unlinks it
toremove.setBlock(Blocks.air);
if(toremove != null) toremove.setBlock(Blocks.air);
}
}
}
Expand Down
12 changes: 12 additions & 0 deletions core/src/io/anuke/mindustry/net/Administration.java
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,18 @@ public boolean isAdmin(String id, String ip){
return info.admin && ip.equals(info.validAdminIP);
}

public Array<PlayerInfo> findByName(String name, boolean last){
Array<PlayerInfo> result = new Array<>();

for(PlayerInfo info : playerInfo.values()){
if(info.lastName.toLowerCase().equals(name.toLowerCase()) || (last && info.names.contains(name, false))){
result.add(info);
}
}

return result;
}

public PlayerInfo getInfo(String id){
return getCreateInfo(id);
}
Expand Down
15 changes: 10 additions & 5 deletions core/src/io/anuke/mindustry/world/Placement.java
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,18 @@ public static boolean validPlace(int x, int y, Block type){
rect.setCenter(offset.x + x * tilesize, offset.y + y * tilesize);

synchronized (Entities.entityLock) {
for (SolidEntity e : Entities.getNearby(enemyGroup, x * tilesize, y * tilesize, tilesize * 2f)) {
if (e == null) continue; //not sure why this happens?
Rectangle rect = e.hitbox.getRect(e.x, e.y);
//exception sometimes thrown due to multithreading, not sure what else to try at this point
try {
for (SolidEntity e : Entities.getNearby(enemyGroup, x * tilesize, y * tilesize, tilesize * 2f)) {
if (e == null) continue; //not sure why this happens?
Rectangle rect = e.hitbox.getRect(e.x, e.y);

if (Placement.rect.overlaps(rect)) {
return false;
if (Placement.rect.overlaps(rect)) {
return false;
}
}
}catch (Exception e){
return false;
}
}

Expand Down
27 changes: 27 additions & 0 deletions server/src/io/anuke/mindustry/server/ServerControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -537,6 +537,33 @@ private void registerCommands(){
}
});

handler.register("find", "<name> [check-all-names]", "Find player info(s) by name. Can optionally check for all names a player has had.", arg -> {
boolean checkAll = arg.length == 2 && arg[1].equals("true");

Array<PlayerInfo> infos = netServer.admins.findByName(arg[0], checkAll);

if(infos.size == 1) {
PlayerInfo info = infos.peek();
Log.info("&lcTrace info for player '{0}' / UUID {1}:", info.lastName, info.id);
Log.info(" &lyall names used: {0}", info.names);
Log.info(" &lyIP: {0}", info.lastIP);
Log.info(" &lyall IPs used: {0}", info.ips);
Log.info(" &lytimes joined: {0}", info.timesJoined);
Log.info(" &lytimes kicked: {0}", info.timesKicked);
Log.info("");
Log.info(" &lytotal blocks broken: {0}", info.totalBlocksBroken);
Log.info(" &lytotal blocks placed: {0}", info.totalBlockPlaced);
}else if(infos.size > 1){
Log.info("&lcMultiple people have been found with that name:");
for(PlayerInfo info : infos){
Log.info(" &ly{0}", info.id);
}
Log.info("&lcUse the info command to examine each person individually.");
}else{
info("Nobody with that name could be found.");
}
});

handler.register("info", "<UUID>", "Get global info for a player's UUID.", arg -> {
PlayerInfo info = netServer.admins.getInfoOptional(arg[0]);

Expand Down

0 comments on commit 0936fc6

Please sign in to comment.