diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index 77f03dab6e..967d371261 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -81,6 +81,8 @@ public class NetServer extends Module{ return; } + Log.info("Recieved connect packet for player '{0}' / UUID {1} / IP {2}", packet.name, uuid, trace.ip); + String ip = Net.getConnection(id).address; admins.updatePlayerJoined(uuid, ip, packet.name); @@ -94,8 +96,6 @@ public class NetServer extends Module{ trace.modclient = true; } - Log.info("Sending data to player '{0}' / {1}", packet.name, id); - Player player = new Player(); player.isAdmin = admins.isAdmin(uuid, ip); player.clientid = id; @@ -165,12 +165,12 @@ public class NetServer extends Module{ TraceInfo info = admins.getTrace(Net.getConnection(id).address); Weapon weapon = Upgrade.getByID((byte)packet.data); - float wtrc = 60; + float wtrc = 80; if(!Timers.get("fastshoot-" + id + "-" + weapon.id, wtrc)){ info.fastShots.getAndIncrement(weapon.id, 0, 1); - if(info.fastShots.get(weapon.id, 0) > (int)(wtrc / (weapon.getReload() / 2f)) + 2){ + if(info.fastShots.get(weapon.id, 0) > (int)(wtrc / (weapon.getReload() / 2f)) + 6){ kick(id, KickReason.kick); } }else{ diff --git a/core/src/io/anuke/mindustry/net/Administration.java b/core/src/io/anuke/mindustry/net/Administration.java index 59aa64fb75..00355d78f9 100644 --- a/core/src/io/anuke/mindustry/net/Administration.java +++ b/core/src/io/anuke/mindustry/net/Administration.java @@ -184,6 +184,18 @@ public class Administration { return result; } + public Array findByIPs(String ip){ + Array result = new Array<>(); + + for(PlayerInfo info : playerInfo.values()){ + if(info.ips.contains(ip, false)){ + result.add(info); + } + } + + return result; + } + public PlayerInfo getInfo(String id){ return getCreateInfo(id); } diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index f1743f2fd3..8d7d5e8336 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -330,7 +330,11 @@ public class ServerControl extends Module { Log.info("&lmBanned players [IP]:"); for(String string : ipbans){ PlayerInfo info = netServer.admins.findByIP(string); - Log.info(" &lm '{0}' / Last known name: '{1}' / ID: '{2}'", string, info.lastName, info.id); + if(info != null) { + Log.info(" &lm '{0}' / Last known name: '{1}' / ID: '{2}'", string, info.lastName, info.id); + }else{ + Log.info(" &lm '{0}' (No known name or info)", string); + } } } }); @@ -340,7 +344,9 @@ public class ServerControl extends Module { info("Banned player by IP: {0}.", arg[0]); for(Player player : playerGroup.all()){ - if(Net.getConnection(player.clientid).address.equals(arg[0])){ + if(Net.getConnection(player.clientid) != null && + Net.getConnection(player.clientid).address != null && + Net.getConnection(player.clientid).address.equals(arg[0])){ netServer.kick(player.clientid, KickReason.banned); break; } @@ -493,6 +499,37 @@ public class ServerControl extends Module { info("Saved to slot {0}.", slot); }); + handler.register("griefers", "[min-break:place-ratio] [min-breakage]", "Find possible griefers currently online.", arg -> { + if(!state.is(State.playing)) { + err("Open the server first."); + return; + } + + try { + + float ratio = arg.length > 0 ? Float.parseFloat(arg[0]) : 0.5f; + int minbreak = arg.length > 1 ? Integer.parseInt(arg[1]) : 100; + + boolean found = false; + + for (Player player : playerGroup.all()) { + TraceInfo info = netServer.admins.getTrace(Net.getConnection(player.clientid).address); + if(info.totalBlocksBroken >= minbreak && info.totalBlocksBroken / Math.max(info.totalBlocksPlaced, 1f) >= ratio){ + info("&ly - Player '{0}' / UUID &lm{1}&ly found: &lc{2}&ly broken and &lc{3}&ly placed.", + player.name, info.uuid, info.totalBlocksBroken, info.totalBlocksPlaced); + found = true; + } + } + + if (!found) { + info("No griefers matching the criteria have been found."); + } + + }catch (NumberFormatException e){ + err("Invalid number format."); + } + }); + handler.register("gameover", "Force a game over.", arg -> { if(state.is(State.menu)){ info("Not playing a map."); @@ -535,8 +572,8 @@ public class ServerControl extends Module { } }); - handler.register("find", " [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"); + handler.register("find", "", "Find player info(s) by name. Can optionally check for all names a player has had.", arg -> { + boolean checkAll = true; Array infos = netServer.admins.findByName(arg[0], checkAll); @@ -562,6 +599,33 @@ public class ServerControl extends Module { } }); + handler.register("findip", "", "Find player info(s) by IP.", arg -> { + + Array infos = netServer.admins.findByIPs(arg[0]); + + 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 IP:"); + 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 IP could be found."); + } + }); + + handler.register("info", "", "Get global info for a player's UUID.", arg -> { PlayerInfo info = netServer.admins.getInfoOptional(arg[0]);