Added ukranian lang, updated uCore, minor fixes

This commit is contained in:
Anuken
2018-03-19 20:46:40 -04:00
parent 58ed9754a4
commit 5323ef68ca
14 changed files with 738 additions and 152 deletions

View File

@ -92,7 +92,7 @@ public class Vars{
public static final int tilesize = 8;
public static final Locale[] locales = {new Locale("en"), new Locale("fr", "FR"), new Locale("ru"), new Locale("pl", "PL"),
public static final Locale[] locales = {new Locale("en"), new Locale("fr", "FR"), new Locale("ru"), new Locale("uk", "UA"), new Locale("pl", "PL"),
new Locale("de"), new Locale("es", "LA"), new Locale("pt", "BR"), new Locale("ko"), new Locale("in", "ID")};
public static final Color[] playerColors = {

View File

@ -122,6 +122,8 @@ public class Control extends Module{
"lastBuild", 0
);
Log.info("{0}", (int)'ї');
KeyBinds.load();
for(Map map : world.maps().list()){

View File

@ -12,6 +12,7 @@ import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.Net.SendMode;
import io.anuke.mindustry.net.NetworkIO;
import io.anuke.mindustry.net.Packets.*;
import io.anuke.mindustry.net.TraceInfo;
import io.anuke.mindustry.resource.*;
import io.anuke.mindustry.world.Block;
import io.anuke.mindustry.world.Placement;
@ -65,8 +66,7 @@ public class NetServer extends Module{
String ip = Net.getConnection(id).address;
admins.setKnownName(ip, packet.name);
admins.setKnownIP(uuid, ip);
admins.updatePlayerJoined(uuid, ip, packet.name);
admins.getTrace(ip).uuid = uuid;
admins.getTrace(ip).android = packet.android;
@ -150,6 +150,7 @@ public class NetServer extends Module{
Net.send(dc, SendMode.tcp);
Platform.instance.updateRPC();
admins.save();
});
Net.handleServer(PositionPacket.class, (id, packet) -> {
@ -161,6 +162,22 @@ public class NetServer extends Module{
});
Net.handleServer(ShootPacket.class, (id, packet) -> {
TraceInfo info = admins.getTrace(Net.getConnection(id).address);
Weapon weapon = (Weapon)Upgrade.getByID(packet.weaponid);
float wtrc = 45f;
if(!Timers.get(info.ip + "-weapontrace", wtrc)){
info.fastShots ++;
}else{
if(info.fastShots - 2 > (int)(wtrc / (weapon.getReload() / 2f))){
Net.kickConnection(id, KickReason.kick);
}
info.fastShots = 0;
}
packet.playerid = connections.get(id).id;
Net.sendExcept(id, packet, SendMode.udp);
});
@ -182,6 +199,7 @@ public class NetServer extends Module{
admins.getTrace(Net.getConnection(id).address).lastBlockPlaced = block;
admins.getTrace(Net.getConnection(id).address).totalBlocksPlaced ++;
admins.getInfo(admins.getTrace(Net.getConnection(id).address).uuid).totalBlockPlaced ++;
Net.send(packet, SendMode.tcp);
});
@ -196,6 +214,7 @@ public class NetServer extends Module{
if(block != null) {
admins.getTrace(Net.getConnection(id).address).lastBlockBroken = block;
admins.getTrace(Net.getConnection(id).address).totalBlocksBroken++;
admins.getInfo(admins.getTrace(Net.getConnection(id).address).uuid).totalBlocksBroken ++;
if (block.update || block.destructible)
admins.getTrace(Net.getConnection(id).address).structureBlocksBroken++;
}

View File

@ -7,177 +7,224 @@ import io.anuke.ucore.core.Settings;
public class Administration {
private Json json = new Json();
/**All player info. Maps UUIDs to info. This persists throughout restarts.*/
private ObjectMap<String, PlayerInfo> playerInfo = new ObjectMap<>();
/**Maps UUIDs to trace infos. This is wiped when a player logs off.*/
private ObjectMap<String, TraceInfo> traceInfo = new ObjectMap<>();
private Array<String> bannedIPs = new Array<>();
private Array<String> bannedIDs = new Array<>();
private Array<String> admins = new Array<>();
private ObjectMap<String, String> ipNames = new ObjectMap<>();
private ObjectMap<String, String> idIPs = new ObjectMap<>();
private ObjectMap<String, TraceInfo> traces = new ObjectMap<>();
public Administration(){
Settings.defaultList(
"bans", "{}",
"bannedIDs", "{}",
"admins", "{}",
"knownIPs", "{}",
"knownIDs", "{}"
);
Settings.defaults("playerInfo", "{}");
Settings.defaults("bannedIPs", "{}");
load();
}
public TraceInfo getTrace(String ip){
if(!traces.containsKey(ip)) traces.put(ip, new TraceInfo(ip));
/**Call when a player joins to update their information here.*/
public void updatePlayerJoined(String id, String ip, String name){
PlayerInfo info = getCreateInfo(id);
info.lastName = name;
info.lastIP = ip;
info.timesJoined ++;
if(!info.names.contains(name, false)) info.names.add(name);
if(!info.ips.contains(ip, false)) info.ips.add(ip);
}
return traces.get(ip);
/**Returns trace info by IP.*/
public TraceInfo getTrace(String ip){
if(!traceInfo.containsKey(ip)) traceInfo.put(ip, new TraceInfo(ip));
return traceInfo.get(ip);
}
public void clearTraces(){
traces.clear();
traceInfo.clear();
}
/**Sets last known name for an IP.*/
public void setKnownName(String ip, String name){
ipNames.put(ip, name);
saveKnown();
}
/**Sets last known UUID for an IP.*/
public void setKnownIP(String id, String ip){
idIPs.put(id, ip);
saveKnown();
}
/**Returns the last known name for an IP. Returns 'unknown' if this IP has an unknown username.*/
public String getLastName(String ip){
return ipNames.get(ip, "unknown");
}
/**Returns the last known IP for a UUID. Returns 'unknown' if this IP has an unknown IP.*/
public String getLastIP(String id){
return idIPs.get(id, "unknown");
}
/**Return the last known device ID associated with an IP. Returns 'unknown' if this IP has an unknown device.*/
public String getLastID(String ip){
for(String id : idIPs.keys()){
if(idIPs.get(id).equals(ip)){
return id;
}
}
return "unknown";
}
/**Returns list of banned IPs.*/
public Array<String> getBanned(){
return bannedIPs;
}
/**Returns list of banned IDs.*/
public Array<String> getBannedIDs(){
return bannedIDs;
}
/**Bans a player by IP; returns whether this player was already banned.*/
/**Bans a player by IP; returns whether this player was already banned.
* If there are players who at any point had this IP, they will be UUID banned as well.*/
public boolean banPlayerIP(String ip){
if(bannedIPs.contains(ip, false))
return false;
for(PlayerInfo info : playerInfo.values()){
if(info.ips.contains(ip, false)){
info.banned = true;
}
}
bannedIPs.add(ip);
saveBans();
save();
return true;
}
/**Bans a player by UUID.*/
/**Bans a player by UUID; returns whether this player was already banned.*/
public boolean banPlayerID(String id){
if(bannedIDs.contains(id, false))
if(playerInfo.containsKey(id) && playerInfo.get(id).banned)
return false;
bannedIDs.add(id);
saveBans();
getCreateInfo(id).banned = true;
save();
return true;
}
/**Unbans a player by IP; returns whether this player was banned in the first place..*/
/**Unbans a player by IP; returns whether this player was banned in the first place.
* This method also unbans any player that was banned and had this IP.*/
public boolean unbanPlayerIP(String ip){
if(!bannedIPs.contains(ip, false))
return false;
boolean found = bannedIPs.contains(ip, false);
for(PlayerInfo info : playerInfo.values()){
if(info.ips.contains(ip, false)){
info.banned = false;
found = true;
}
}
bannedIPs.removeValue(ip, false);
saveBans();
return true;
if(found) save();
return found;
}
/**Unbans a player by IP; returns whether this player was banned in the first place..*/
public boolean unbanPlayerID(String ip){
if(!bannedIDs.contains(ip, false))
/**Unbans a player by ID; returns whether this player was banned in the first place.
* This also unbans all IPs the player used.*/
public boolean unbanPlayerID(String id){
PlayerInfo info = getCreateInfo(id);
if(!info.banned)
return false;
bannedIDs.removeValue(ip, false);
saveBans();
info.banned = false;
bannedIPs.removeAll(info.ips, false);
save();
return true;
}
/**Returns list of banned IPs.*/
public Array<String> getAdmins(){
return admins;
/**Returns list of all players with admin status*/
public Array<PlayerInfo> getAdmins(){
Array<PlayerInfo> result = new Array<>();
for(PlayerInfo info : playerInfo.values()){
if(info.admin){
result.add(info);
}
}
return result;
}
/**Returns list of all players with admin status*/
public Array<PlayerInfo> getBanned(){
Array<PlayerInfo> result = new Array<>();
for(PlayerInfo info : playerInfo.values()){
if(info.banned){
result.add(info);
}
}
return result;
}
/**Returns all banned IPs. This does not include the IPs of ID-banned players.*/
public Array<String> getBannedIPs(){
return bannedIPs;
}
/**Makes a player an admin. Returns whether this player was already an admin.*/
public boolean adminPlayer(String ip){
if(admins.contains(ip, false))
public boolean adminPlayer(String id){
PlayerInfo info = getCreateInfo(id);
if(info.admin)
return false;
admins.add(ip);
saveAdmins();
info.admin = true;
save();
return true;
}
/**Makes a player no longer an admin. Returns whether this player was an admin in the first place.*/
public boolean unAdminPlayer(String ip){
if(!admins.contains(ip, false))
public boolean unAdminPlayer(String id){
PlayerInfo info = getCreateInfo(id);
if(!info.admin)
return false;
admins.removeValue(ip, false);
saveAdmins();
info.admin = false;
save();
return true;
}
public boolean isIPBanned(String ip){
return bannedIPs.contains(ip, false);
return bannedIPs.contains(ip, false) || (findByIP(ip) != null && findByIP(ip).banned);
}
public boolean isIDBanned(String uuid){
return bannedIDs.contains(uuid, false);
return getCreateInfo(uuid).banned;
}
public boolean isAdmin(String ip){
return admins.contains(ip, false);
public boolean isAdmin(String id){
return getCreateInfo(id).admin;
}
private void saveKnown(){
Settings.putString("knownIPs", json.toJson(ipNames));
Settings.putString("knownIDs", json.toJson(idIPs));
Settings.save();
public PlayerInfo getInfo(String id){
return getCreateInfo(id);
}
private void saveBans(){
Settings.putString("bans", json.toJson(bannedIPs));
Settings.putString("bannedIDs", json.toJson(bannedIDs));
Settings.save();
public PlayerInfo getInfoOptional(String id){
return playerInfo.get(id);
}
private void saveAdmins(){
Settings.putString("admins", json.toJson(admins));
public PlayerInfo findByIP(String ip){
for(PlayerInfo info : playerInfo.values()){
if(info.ips.contains(ip, false)){
return info;
}
}
return null;
}
private PlayerInfo getCreateInfo(String id){
if(playerInfo.containsKey(id)){
return playerInfo.get(id);
}else{
PlayerInfo info = new PlayerInfo(id);
playerInfo.put(id, info);
save();
return info;
}
}
public void save(){
Settings.putString("playerInfo", json.toJson(playerInfo));
Settings.putString("bannedIPs", json.toJson(bannedIPs));
Settings.save();
}
private void load(){
bannedIPs = json.fromJson(Array.class, Settings.getString("bans"));
bannedIDs = json.fromJson(Array.class, Settings.getString("bannedIDs"));
admins = json.fromJson(Array.class, Settings.getString("admins"));
ipNames = json.fromJson(ObjectMap.class, Settings.getString("knownIPs"));
idIPs = json.fromJson(ObjectMap.class, Settings.getString("knownIDs"));
playerInfo = json.fromJson(ObjectMap.class, Settings.getString("playerInfo"));
bannedIPs = json.fromJson(Array.class, Settings.getString("bannedIPs"));
}
public static class PlayerInfo{
public String id;
public String lastName = "<unknown>", lastIP = "<unknown>";
public Array<String> ips = new Array<>();
public Array<String> names = new Array<>();
public int timesKicked; //TODO not implemented!
public int timesJoined;
public int totalBlockPlaced;
public int totalBlocksBroken;
public boolean banned, admin;
PlayerInfo(String id){
this.id = id;
}
private PlayerInfo(){}
}
}

View File

@ -9,6 +9,8 @@ public class TraceInfo {
public boolean modclient;
public boolean android;
public int fastShots;
public int totalBlocksBroken;
public int structureBlocksBroken;
public Block lastBlockBroken = Blocks.air;

View File

@ -117,6 +117,10 @@ public class Weapon extends Upgrade{
Effects.sound(shootsound, x, y);
}
public float getReload(){
return reload;
}
public void shoot(Player p, float x, float y, float angle){
shootInternal(p, x, y, angle);

View File

@ -1,6 +1,7 @@
package io.anuke.mindustry.ui.dialogs;
import io.anuke.mindustry.entities.Player;
import io.anuke.mindustry.net.Administration.PlayerInfo;
import io.anuke.mindustry.net.Net;
import io.anuke.mindustry.net.NetConnection;
import io.anuke.mindustry.net.NetEvents;
@ -36,15 +37,15 @@ public class AdminsDialog extends FloatingDialog {
table.add("$text.server.admins.none");
}
for(String ip : netServer.admins.getAdmins()){
for(PlayerInfo info : netServer.admins.getAdmins()){
Table res = new Table("button");
res.margin(14f);
res.labelWrap("[LIGHT_GRAY]" + netServer.admins.getLastName(ip)).width(w - h - 24f);
res.labelWrap("[LIGHT_GRAY]" + info.lastName).width(w - h - 24f);
res.add().growX();
res.addImageButton("icon-cancel", 14*3, () -> {
ui.showConfirm("$text.confirm", "$text.confirmunadmin", () -> {
netServer.admins.unAdminPlayer(ip);
netServer.admins.unAdminPlayer(info.id);
for(Player player : playerGroup.all()){
NetConnection c = Net.getConnection(player.clientid);
if(c != null){

View File

@ -1,5 +1,6 @@
package io.anuke.mindustry.ui.dialogs;
import io.anuke.mindustry.net.Administration.PlayerInfo;
import io.anuke.ucore.scene.ui.ScrollPane;
import io.anuke.ucore.scene.ui.layout.Table;
@ -33,15 +34,15 @@ public class BansDialog extends FloatingDialog {
table.add("$text.server.bans.none");
}
for(String ip : netServer.admins.getBanned()){
for(PlayerInfo info : netServer.admins.getBanned()){
Table res = new Table("button");
res.margin(14f);
res.labelWrap("IP: [LIGHT_GRAY]" + ip + "\n[]Name: [LIGHT_GRAY]" + netServer.admins.getLastName(ip)).width(w - h - 24f);
res.labelWrap("IP: [LIGHT_GRAY]" + info.lastIP + "\n[]Name: [LIGHT_GRAY]" + info.lastName).width(w - h - 24f);
res.add().growX();
res.addImageButton("icon-cancel", 14*3, () -> {
ui.showConfirm("$text.confirm", "$text.confirmunban", () -> {
netServer.admins.unbanPlayerIP(ip);
netServer.admins.unbanPlayerID(info.id);
setup();
});
}).size(h).pad(-14f);