This commit is contained in:
Anuken
2019-09-06 13:58:32 -04:00
77 changed files with 2674 additions and 2256 deletions

View File

@@ -1,7 +1,7 @@
package io.anuke.mindustry.net;
import io.anuke.annotations.Annotations.Serialize;
import io.anuke.arc.Core;
import io.anuke.annotations.Annotations.*;
import io.anuke.arc.*;
import io.anuke.arc.collection.*;
import static io.anuke.mindustry.Vars.headless;
@@ -10,6 +10,7 @@ public class Administration{
/** All player info. Maps UUIDs to info. This persists throughout restarts. */
private ObjectMap<String, PlayerInfo> playerInfo = new ObjectMap<>();
private Array<String> bannedIPs = new Array<>();
private Array<String> whitelist = new Array<>();
public Administration(){
Core.settings.defaults(
@@ -20,9 +21,16 @@ public class Administration{
load();
}
public int getPlayerLimit(){
return Core.settings.getInt("playerlimit", 0);
}
public void setPlayerLimit(int limit){
Core.settings.putSave("playerlimit", limit);
}
public void setStrict(boolean on){
Core.settings.put("strict", on);
Core.settings.save();
Core.settings.putSave("strict", on);
}
public boolean getStrict(){
@@ -186,6 +194,36 @@ public class Administration{
return true;
}
public boolean isWhitelistEnabled(){
return Core.settings.getBool("whitelist", false);
}
public void setWhitelist(boolean enabled){
Core.settings.putSave("whitelist", enabled);
}
public boolean isWhitelisted(String id, String usid){
return !isWhitelistEnabled() || whitelist.contains(usid + id);
}
public boolean whitelist(String id){
PlayerInfo info = getCreateInfo(id);
if(whitelist.contains(info.adminUsid + id)) return false;
whitelist.add(info.adminUsid + id);
save();
return true;
}
public boolean unwhitelist(String id){
PlayerInfo info = getCreateInfo(id);
if(whitelist.contains(info.adminUsid + id)){
whitelist.remove(info.adminUsid + id);
save();
return true;
}
return false;
}
public boolean isIPBanned(String ip){
return bannedIPs.contains(ip, false) || (findByIP(ip) != null && findByIP(ip).banned);
}
@@ -242,6 +280,10 @@ public class Administration{
return null;
}
public Array<PlayerInfo> getWhitelisted(){
return playerInfo.values().toArray().select(p -> isWhitelisted(p.id, p.adminUsid));
}
private PlayerInfo getCreateInfo(String id){
if(playerInfo.containsKey(id)){
return playerInfo.get(id);
@@ -256,6 +298,7 @@ public class Administration{
public void save(){
Core.settings.putObject("player-info", playerInfo);
Core.settings.putObject("banned-ips", bannedIPs);
Core.settings.putObject("whitelisted", whitelist);
Core.settings.save();
}
@@ -263,6 +306,7 @@ public class Administration{
private void load(){
playerInfo = Core.settings.getObject("player-info", ObjectMap.class, ObjectMap::new);
bannedIPs = Core.settings.getObject("banned-ips", Array.class, Array::new);
whitelist = Core.settings.getObject("whitelisted", Array.class, Array::new);
}
@Serialize

View File

@@ -1,15 +1,18 @@
package io.anuke.mindustry.net;
import io.anuke.mindustry.game.*;
public class Host{
public final String name;
public final String address;
public final String mapname;
public final int wave;
public final int players;
public final int players, playerLimit;
public final int version;
public final String versionType;
public final Gamemode mode;
public Host(String name, String address, String mapname, int wave, int players, int version, String versionType){
public Host(String name, String address, String mapname, int wave, int players, int version, String versionType, Gamemode mode, int playerLimit){
this.name = name;
this.address = address;
this.players = players;
@@ -17,5 +20,7 @@ public class Host{
this.wave = wave;
this.version = version;
this.versionType = versionType;
this.playerLimit = playerLimit;
this.mode = mode;
}
}

View File

@@ -1,17 +1,15 @@
package io.anuke.mindustry.net;
import io.anuke.arc.Core;
import io.anuke.arc.util.Time;
import io.anuke.mindustry.entities.Entities;
import io.anuke.mindustry.entities.type.Player;
import io.anuke.arc.*;
import io.anuke.arc.util.*;
import io.anuke.mindustry.entities.type.*;
import io.anuke.mindustry.game.*;
import io.anuke.mindustry.io.JsonIO;
import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.io.*;
import io.anuke.mindustry.maps.Map;
import java.io.*;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.nio.*;
import java.util.*;
import static io.anuke.mindustry.Vars.*;
@@ -71,8 +69,9 @@ public class NetworkIO{
buffer.putInt(state.wave);
buffer.putInt(Version.build);
writeString(buffer, Version.type);
//TODO additional information:
// - gamemode ID/name (just pick the closest one?)
buffer.put((byte)Gamemode.bestFit(state.rules).ordinal());
buffer.putInt(netServer.admins.getPlayerLimit());
return buffer;
}
@@ -83,13 +82,15 @@ public class NetworkIO{
int wave = buffer.getInt();
int version = buffer.getInt();
String vertype = readString(buffer);
Gamemode gamemode = Gamemode.all[buffer.get()];
int limit = buffer.getInt();
return new Host(host, hostAddress, map, wave, players, version, vertype);
return new Host(host, hostAddress, map, wave, players, version, vertype, gamemode, limit);
}
private static void writeString(ByteBuffer buffer, String string, int maxlen){
byte[] bytes = string.getBytes(charset);
//truncating this way may lead to wierd encoding errors at the ends of strings...
//todo truncating this way may lead to wierd encoding errors at the ends of strings...
if(bytes.length > maxlen){
bytes = Arrays.copyOfRange(bytes, 0, maxlen);
}

View File

@@ -14,7 +14,7 @@ public class Packets{
public enum KickReason{
kick, clientOutdated, serverOutdated, banned, gameover(true), recentKick,
nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch;
nameInUse, idInUse, nameEmpty, customClient, serverClose, vote, typeMismatch, whitelist, playerLimit;
public final boolean quiet;
@@ -52,6 +52,7 @@ public class Packets{
public static class Disconnect implements Packet{
public int id;
public String reason;
@Override
public boolean isImportant(){