many things

This commit is contained in:
Anuken
2019-05-06 14:34:21 -04:00
parent 20fbe2fbbe
commit 51f9ad5a2c
50 changed files with 424 additions and 613 deletions

View File

@@ -14,7 +14,8 @@ public class Administration{
public Administration(){
Core.settings.defaults(
"strict", true
"strict", true,
"servername", "Server"
);
load();

View File

@@ -1,19 +1,17 @@
package io.anuke.mindustry.net;
import io.anuke.arc.collection.ObjectMap;
import io.anuke.arc.collection.ObjectMap.Entry;
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.mindustry.game.*;
import io.anuke.mindustry.game.Teams.TeamData;
import io.anuke.mindustry.game.Version;
import io.anuke.mindustry.gen.Serialization;
import io.anuke.mindustry.io.SaveIO;
import io.anuke.mindustry.maps.Map;
import io.anuke.mindustry.world.Tile;
import java.io.*;
import java.nio.ByteBuffer;
import java.util.Arrays;
import static io.anuke.mindustry.Vars.*;
@@ -22,44 +20,16 @@ public class NetworkIO{
public static void writeWorld(Player player, OutputStream os){
try(DataOutputStream stream = new DataOutputStream(os)){
//--GENERAL STATE--
Serialization.writeRules(stream, state.rules);
stream.writeUTF(world.getMap().name()); //map name
SaveIO.getSaveWriter().writeStringMap(stream, world.getMap().tags);
//write tags
ObjectMap<String, String> tags = world.getMap().tags;
stream.writeByte(tags.size);
for(Entry<String, String> entry : tags.entries()){
stream.writeUTF(entry.key);
stream.writeUTF(entry.value);
}
stream.writeInt(state.wave); //wave
stream.writeFloat(state.wavetime); //wave countdown
stream.writeInt(state.wave);
stream.writeFloat(state.wavetime);
stream.writeInt(player.id);
player.write(stream);
SaveIO.getSaveWriter().writeMap(stream);
stream.write(Team.all.length);
//write team data
for(Team team : Team.all){
TeamData data = state.teams.get(team);
stream.writeByte(team.ordinal());
stream.writeByte(data.enemies.size());
for(Team enemy : data.enemies){
stream.writeByte(enemy.ordinal());
}
stream.writeByte(data.cores.size);
for(Tile tile : data.cores){
stream.writeInt(tile.pos());
}
}
}catch(IOException e){
throw new RuntimeException(e);
}
@@ -69,25 +39,11 @@ public class NetworkIO{
try(DataInputStream stream = new DataInputStream(is)){
Time.clear();
//general state
state.rules = Serialization.readRules(stream);
String map = stream.readUTF();
world.setMap(new Map(SaveIO.getSaveWriter().readStringMap(stream)));
ObjectMap<String, String> tags = new ObjectMap<>();
byte tagSize = stream.readByte();
for(int i = 0; i < tagSize; i++){
String key = stream.readUTF();
String value = stream.readUTF();
tags.put(key, value);
}
int wave = stream.readInt();
float wavetime = stream.readFloat();
state.wave = wave;
state.wavetime = wavetime;
state.wave = stream.readInt();
state.wavetime = stream.readFloat();
Entities.clear();
int id = stream.readInt();
@@ -96,81 +52,60 @@ public class NetworkIO{
player.resetID(id);
player.add();
//map
SaveIO.getSaveWriter().readMap(stream);
world.setMap(new Map(customMapDirectory.child(map), 0, 0, new ObjectMap<>(), true));
state.teams = new Teams();
byte teams = stream.readByte();
for(int i = 0; i < teams; i++){
Team team = Team.all[stream.readByte()];
byte enemies = stream.readByte();
Team[] enemyArr = new Team[enemies];
for(int j = 0; j < enemies; j++){
enemyArr[j] = Team.all[stream.readByte()];
}
state.teams.add(team, enemyArr);
byte cores = stream.readByte();
for(int j = 0; j < cores; j++){
state.teams.get(team).cores.add(world.tile(stream.readInt()));
}
}
}catch(IOException e){
throw new RuntimeException(e);
}
}
public static ByteBuffer writeServerData(){
int maxlen = 32;
String host = (headless ? "Server" : player.name);
String name = (headless ? Core.settings.getString("servername") : player.name);
String map = world.getMap() == null ? "None" : world.getMap().name();
host = host.substring(0, Math.min(host.length(), maxlen));
map = map.substring(0, Math.min(map.length(), maxlen));
ByteBuffer buffer = ByteBuffer.allocate(256);
ByteBuffer buffer = ByteBuffer.allocate(128);
buffer.put((byte)host.getBytes(charset).length);
buffer.put(host.getBytes(charset));
buffer.put((byte)map.getBytes(charset).length);
buffer.put(map.getBytes(charset));
writeString(buffer, name, 100);
writeString(buffer, map);
buffer.putInt(playerGroup.size());
buffer.putInt(state.wave);
buffer.putInt(Version.build);
buffer.put((byte)Version.type.getBytes(charset).length);
buffer.put(Version.type.getBytes(charset));
writeString(buffer, Version.type);
//TODO additional information:
// - gamemode ID/name (just pick the closest one?)
return buffer;
}
public static Host readServerData(String hostAddress, ByteBuffer buffer){
byte hlength = buffer.get();
byte[] hb = new byte[hlength];
buffer.get(hb);
byte mlength = buffer.get();
byte[] mb = new byte[mlength];
buffer.get(mb);
String host = new String(hb, charset);
String map = new String(mb, charset);
String host = readString(buffer);
String map = readString(buffer);
int players = buffer.getInt();
int wave = buffer.getInt();
int version = buffer.getInt();
byte tlength = buffer.get();
byte[] tb = new byte[tlength];
buffer.get(tb);
String vertype = new String(tb, charset);
String vertype = readString(buffer);
return new Host(host, hostAddress, map, wave, players, version, vertype);
}
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...
if(bytes.length > maxlen){
bytes = Arrays.copyOfRange(bytes, 0, maxlen);
}
buffer.put((byte)bytes.length);
buffer.put(bytes);
}
private static void writeString(ByteBuffer buffer, String string){
writeString(buffer, string, 32);
}
private static String readString(ByteBuffer buffer){
short length = (short)(buffer.get() & 0xff);
byte[] bytes = new byte[length];
buffer.get(bytes);
return new String(bytes, charset);
}
}