Files
Mindustry/core/src/mindustry/net/NetworkIO.java
키에르 733713c9a2 Features for Hub/Lobby Servers (#2136)
* Features for Hub/Lobby Servers

* Update NetworkIO.java

* upper
2020-06-04 11:10:03 -04:00

124 lines
3.9 KiB
Java

package mindustry.net;
import arc.Core;
import arc.util.*;
import arc.util.io.*;
import mindustry.core.*;
import mindustry.game.*;
import mindustry.gen.*;
import mindustry.io.*;
import mindustry.maps.Map;
import mindustry.net.Administration.*;
import java.io.*;
import java.nio.*;
import java.util.*;
import static mindustry.Vars.*;
public class NetworkIO{
public static void writeWorld(Playerc player, OutputStream os){
try(DataOutputStream stream = new DataOutputStream(os)){
stream.writeUTF(JsonIO.write(state.rules));
SaveIO.getSaveWriter().writeStringMap(stream, state.map.tags);
stream.writeInt(state.wave);
stream.writeFloat(state.wavetime);
stream.writeInt(player.id());
player.write(Writes.get(stream));
SaveIO.getSaveWriter().writeContentHeader(stream);
SaveIO.getSaveWriter().writeMap(stream);
}catch(IOException e){
throw new RuntimeException(e);
}
}
public static void loadWorld(InputStream is){
try(DataInputStream stream = new DataInputStream(is)){
Time.clear();
state.rules = JsonIO.read(Rules.class, stream.readUTF());
state.map = new Map(SaveIO.getSaveWriter().readStringMap(stream));
state.wave = stream.readInt();
state.wavetime = stream.readFloat();
Groups.all.clear();
int id = stream.readInt();
player.reset();
player.read(Reads.get(stream));
player.id(id);
player.add();
SaveIO.getSaveWriter().readContentHeader(stream);
SaveIO.getSaveWriter().readMap(stream, world.context);
}catch(IOException e){
throw new RuntimeException(e);
}finally{
content.setTemporaryMapper(null);
}
}
public static ByteBuffer writeServerData(){
String name = (headless ? Config.name.string() : player.name());
String description = headless && !Config.desc.string().equals("off") ? Config.desc.string() : "";
String map = state.map.name();
ByteBuffer buffer = ByteBuffer.allocate(512);
writeString(buffer, name, 100);
writeString(buffer, map);
buffer.putInt(Core.settings.getInt("totalPlayers", Groups.player.size()));
buffer.putInt(state.wave);
buffer.putInt(Version.build);
writeString(buffer, Version.type);
buffer.put((byte)state.rules.mode().ordinal());
buffer.putInt(netServer.admins.getPlayerLimit());
writeString(buffer, description, 100);
return buffer;
}
public static Host readServerData(String hostAddress, ByteBuffer buffer){
String host = readString(buffer);
String map = readString(buffer);
int players = buffer.getInt();
int wave = buffer.getInt();
int version = buffer.getInt();
String vertype = readString(buffer);
Gamemode gamemode = Gamemode.all[buffer.get()];
int limit = buffer.getInt();
String description = readString(buffer);
return new Host(host, hostAddress, map, wave, players, version, vertype, gamemode, limit, description);
}
private static void writeString(ByteBuffer buffer, String string, int maxlen){
byte[] bytes = string.getBytes(charset);
//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);
}
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);
}
}