Merged with master

This commit is contained in:
Anuken
2018-05-06 01:43:12 -04:00
35 changed files with 1634 additions and 798 deletions

View File

@@ -3,9 +3,13 @@ package io.anuke.mindustry.net;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.ObjectMap;
import com.badlogic.gdx.utils.TimeUtils;
import io.anuke.ucore.core.Settings;
public class Administration {
public static final int defaultMaxBrokenBlocks = 15;
public static final int defaultBreakCooldown = 1000*15;
private Json json = new Json();
/**All player info. Maps UUIDs to info. This persists throughout restarts.*/
private ObjectMap<String, PlayerInfo> playerInfo = new ObjectMap<>();
@@ -14,12 +18,72 @@ public class Administration {
private Array<String> bannedIPs = new Array<>();
public Administration(){
Settings.defaults("playerInfo", "{}");
Settings.defaults("bannedIPs", "{}");
Settings.defaultList(
"playerInfo", "{}",
"bannedIPs", "{}",
"antigrief", false,
"antigrief-max", defaultMaxBrokenBlocks,
"antigrief-cooldown", defaultBreakCooldown
);
load();
}
public boolean isAntiGrief(){
return Settings.getBool("antigrief");
}
public boolean isValidateReplace(){
return false;
}
public void setAntiGrief(boolean antiGrief){
Settings.putBool("antigrief", antiGrief);
Settings.save();
}
public void setAntiGriefParams(int maxBreak, int cooldown){
Settings.putInt("antigrief-max", maxBreak);
Settings.putInt("antigrief-cooldown", cooldown);
Settings.save();
}
public boolean validateBreak(String id, String ip){
if(!isAntiGrief() || isAdmin(id, ip)) return true;
PlayerInfo info = getCreateInfo(id);
if(info.lastBroken == null || info.lastBroken.length != Settings.getInt("antigrief-max")){
info.lastBroken = new long[Settings.getInt("antigrief-max")];
}
long[] breaks = info.lastBroken;
int shiftBy = 0;
for(int i = 0; i < breaks.length && breaks[i] != 0; i ++){
if(TimeUtils.timeSinceMillis(breaks[i]) >= Settings.getInt("antigrief-cooldown")){
shiftBy = i;
}
}
for (int i = 0; i < breaks.length; i++) {
breaks[i] = (i + shiftBy >= breaks.length) ? 0 : breaks[i + shiftBy];
}
int remaining = 0;
for(int i = 0; i < breaks.length; i ++){
if(breaks[i] == 0){
remaining = breaks.length - i;
break;
}
}
if(remaining == 0) return false;
breaks[breaks.length - remaining] = TimeUtils.millis();
return true;
}
/**Call when a player joins to update their information here.*/
public void updatePlayerJoined(String id, String ip, String name){
PlayerInfo info = getCreateInfo(id);
@@ -248,6 +312,8 @@ public class Administration {
public boolean banned, admin;
public long lastKicked; //last kicked timestamp
public long[] lastBroken;
PlayerInfo(String id){
this.id = id;
}

View File

@@ -158,7 +158,7 @@ public class Packets {
}
}
public static class EntityShootPacket implements Packet{
public static class EntityShootPacket implements Packet, UnimportantPacket{
public float x, y, rotation;
public short bulletid;
public byte groupid;
@@ -350,7 +350,7 @@ public class Packets {
}
public enum KickReason{
kick, invalidPassword, clientOutdated, serverOutdated, banned, gameover(true), recentKick, nameInUse, idInUse;
kick, invalidPassword, clientOutdated, serverOutdated, banned, gameover(true), recentKick, nameInUse, idInUse, fastShoot;
public final boolean quiet;
KickReason(){ quiet = false; }