add snakeyaml as dependency, config file, os util

This commit is contained in:
bixilon 2020-06-05 16:16:22 +02:00
parent 41b948b354
commit a5ad4ab065
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
12 changed files with 207 additions and 10 deletions

3
.gitignore vendored
View File

@ -1,2 +1 @@
target
src/main/java/de/bixilon/minosoft/Config.java
target

View File

@ -32,6 +32,11 @@
<artifactId>json</artifactId>
<version>20180813</version>
</dependency>
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
</dependencies>
</project>

View File

@ -1,6 +1,5 @@
package de.bixilon.minosoft;
public class Config {
public static String username = ""; // mojang email
public static String password = "";
public static String homeDir;
}

View File

@ -1,12 +1,57 @@
package de.bixilon.minosoft;
import de.bixilon.minosoft.config.Configuration;
import de.bixilon.minosoft.config.GameConfiguration;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.objects.Account;
import de.bixilon.minosoft.objects.Player;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.util.OSUtil;
import java.io.File;
import java.io.IOException;
public class Minosoft {
static Configuration config;
public static void main(String[] args) {
Log.info("Starting...");
Connection c = new Connection("127.0.0.1", 25565);
setConfigFolder();
Log.info("Reading config file...");
try {
config = new Configuration("game.yml");
} catch (IOException e) {
Log.fatal("Failed to load config file!");
e.printStackTrace();
return;
}
Log.info(String.format("Loaded config file (version=%s)", config.getInteger(GameConfiguration.CONFIG_VERSION)));
Connection c = new Connection(config.getString("debug.host"), config.getInteger("debug.port"));
c.setPlayer(new Player(new Account(config.getString("debug.username"), config.getString("debug.password"))));
c.connect();
}
/**
* Sets Config.homeDir to the correct folder per OS
*/
public static void setConfigFolder() {
String folder = System.getProperty("user.home");
if (!folder.endsWith(File.separator)) {
folder += "/";
}
switch (OSUtil.getOS()) {
case LINUX:
folder += ".local/share/minosoft/";
break;
case WINDOWS:
Config.homeDir = "AppData/Roaming/Minosoft/";
break;
//ToDo: Mac, Other
}
Config.homeDir = folder;
}
public static Configuration getConfig() {
return config;
}
}

View File

@ -0,0 +1,5 @@
package de.bixilon.minosoft.config;
public interface ConfigEnum {
public String getPath();
}

View File

@ -0,0 +1,72 @@
package de.bixilon.minosoft.config;
import de.bixilon.minosoft.Config;
import org.yaml.snakeyaml.Yaml;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.LinkedHashMap;
public class Configuration {
LinkedHashMap<String, Object> config;
public Configuration(String filename) throws IOException {
File file = new File(Config.homeDir + "config/" + filename);
if (!file.exists()) {
// no configuration file
InputStream input = getClass().getResourceAsStream("/config/" + filename);
if (input == null) {
throw new FileNotFoundException(String.format("[Config] Missing default config: %s!", filename));
}
File c_folder = new File(Config.homeDir + "config/");
if (!c_folder.exists() && !c_folder.mkdirs()) {
throw new IOException("[Config] Could not create config folder!");
}
Files.copy(input, Paths.get(file.getAbsolutePath()));
file = new File(Config.homeDir + "config/" + filename);
}
Yaml yml = new Yaml();
config = yml.load(new FileInputStream(file));
}
public boolean getBoolean(String path) {
return (boolean) get(path);
}
public boolean getBoolean(ConfigEnum config) {
return getBoolean(config.getPath());
}
public int getInteger(String path) {
return (int) get(path);
}
public int getInteger(ConfigEnum config) {
return getInteger(config.getPath());
}
public String getString(String path) {
return (String) get(path);
}
public String getString(ConfigEnum config) {
return getString(config.getPath());
}
public Object get(String path) {
if (path.contains(".")) {
// split
String[] spilt = path.split("\\.");
LinkedHashMap<String, Object> temp = config;
for (int i = 0; i < spilt.length - 1; i++) {
temp = (LinkedHashMap<String, Object>) temp.get(spilt[i]);
}
return temp.get(spilt[spilt.length - 1]);
}
return config.get(path);
}
}

View File

@ -0,0 +1,19 @@
package de.bixilon.minosoft.config;
public enum GameConfiguration implements ConfigEnum {
CONFIG_VERSION("version"),
GAME_RENDER_DISTANCE("game.render-distance"),
NETWORK_FAKE_CLIENT_BRAND("network.fake-client-brand");
String path;
GameConfiguration(String path) {
this.path = path;
}
@Override
public String getPath() {
return path;
}
}

View File

@ -1,8 +1,6 @@
package de.bixilon.minosoft.protocol.network;
import de.bixilon.minosoft.Config;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.objects.Account;
import de.bixilon.minosoft.objects.Player;
import de.bixilon.minosoft.protocol.packets.ClientboundPacket;
import de.bixilon.minosoft.protocol.packets.ServerboundPacket;
@ -23,7 +21,7 @@ public class Connection {
private final Network network;
private final PacketHandler handler;
private final ArrayList<ClientboundPacket> handlingQueue;
private Player player = new Player(new Account(Config.username, Config.password));
private Player player;
private ConnectionState state = ConnectionState.DISCONNECTED;
private boolean onlyPing;
@ -133,4 +131,8 @@ public class Connection {
});
handleThread.start();
}
public void setPlayer(Player player) {
this.player = player;
}
}

View File

@ -16,6 +16,11 @@ public class PacketPluginMessageSending implements ServerboundPacket {
this.data = data;
}
public PacketPluginMessageSending(String channel, String data) {
this.channel = channel;
this.data = data.getBytes();
}
@Override
public OutPacketBuffer write(ProtocolVersion v) {

View File

@ -1,5 +1,7 @@
package de.bixilon.minosoft.protocol.protocol;
import de.bixilon.minosoft.Minosoft;
import de.bixilon.minosoft.config.GameConfiguration;
import de.bixilon.minosoft.logging.Log;
import de.bixilon.minosoft.protocol.network.Connection;
import de.bixilon.minosoft.protocol.packets.clientbound.login.PacketEncryptionKeyRequest;
@ -87,8 +89,7 @@ public class PacketHandler {
Log.info(String.format("Server is running %s on version %s", new String(pkg.getData()), connection.getVersion().getName()));
// send back own brand
// ToDo option to toggle for minosoft or original minecraft
connection.sendPacket(new PacketPluginMessageSending("MC|Brand", "Minosoft".getBytes()));
connection.sendPacket(new PacketPluginMessageSending("MC|Brand", (Minosoft.getConfig().getBoolean(GameConfiguration.NETWORK_FAKE_CLIENT_BRAND) ? "vanilla" : "Minosoft")));
}
}

View File

@ -0,0 +1,29 @@
package de.bixilon.minosoft.util;
public final class OSUtil {
private static OS os;
public static OS getOS() {
if (os == null) {
String name = System.getProperty("os.name");
if (name.startsWith("Windows")) {
os = OS.WINDOWS;
} else if (name.startsWith("Linux")) {
os = OS.LINUX;
} else if (name.startsWith("Mac")) {
os = OS.MAC;
} else {
os = OS.OTHER;
}
}
return os;
}
public enum OS {
WINDOWS,
LINUX,
MAC,
OTHER
}
}

View File

@ -0,0 +1,16 @@
# Settings of the game
version: 1 # do not edit this, used for migration between versions of config
# game
game:
render-distance: 12
network:
fake-client-brand: false # if true, minosoft will tell the server that this is unmodified vanilla. if false, it will tell "minosoft".
# this will be removed soon
debug:
host: "127.0.0.1"
port: 25565
username: "Player"
password: "secret123"