2022-04-17 12:43:07 +00:00
|
|
|
package emu.grasscutter;
|
|
|
|
|
|
|
|
import java.io.BufferedReader;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.FileReader;
|
|
|
|
import java.io.FileWriter;
|
|
|
|
import java.io.InputStreamReader;
|
|
|
|
import java.net.InetSocketAddress;
|
|
|
|
|
2022-04-20 12:21:38 +00:00
|
|
|
import emu.grasscutter.command.CommandMap;
|
2022-04-23 05:17:35 +00:00
|
|
|
import emu.grasscutter.plugin.PluginManager;
|
2022-04-18 05:11:27 +00:00
|
|
|
import emu.grasscutter.utils.Utils;
|
2022-04-19 04:35:01 +00:00
|
|
|
import org.reflections.Reflections;
|
2022-04-17 12:43:07 +00:00
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
import com.google.gson.Gson;
|
|
|
|
import com.google.gson.GsonBuilder;
|
|
|
|
|
|
|
|
import ch.qos.logback.classic.Logger;
|
|
|
|
import emu.grasscutter.data.ResourceLoader;
|
|
|
|
import emu.grasscutter.database.DatabaseManager;
|
|
|
|
import emu.grasscutter.server.dispatch.DispatchServer;
|
|
|
|
import emu.grasscutter.server.game.GameServer;
|
|
|
|
import emu.grasscutter.tools.Tools;
|
|
|
|
import emu.grasscutter.utils.Crypto;
|
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
public final class Grasscutter {
|
|
|
|
private static final Logger log = (Logger) LoggerFactory.getLogger(Grasscutter.class);
|
2022-04-17 12:43:07 +00:00
|
|
|
private static Config config;
|
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
private static final Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
|
|
|
private static final File configFile = new File("./config.json");
|
2022-04-17 12:43:07 +00:00
|
|
|
|
|
|
|
public static RunMode MODE = RunMode.BOTH;
|
|
|
|
private static DispatchServer dispatchServer;
|
|
|
|
private static GameServer gameServer;
|
2022-04-23 05:17:35 +00:00
|
|
|
private static PluginManager pluginManager;
|
2022-04-17 12:43:07 +00:00
|
|
|
|
2022-04-19 04:35:01 +00:00
|
|
|
public static final Reflections reflector = new Reflections();
|
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
static {
|
2022-04-19 04:35:01 +00:00
|
|
|
// Declare logback configuration.
|
|
|
|
System.setProperty("logback.configurationFile", "src/main/resources/logback.xml");
|
|
|
|
|
|
|
|
// Load server configuration.
|
2022-04-18 05:11:27 +00:00
|
|
|
Grasscutter.loadConfig();
|
2022-04-19 09:22:21 +00:00
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
// Check server structure.
|
|
|
|
Utils.startupCheck();
|
|
|
|
}
|
|
|
|
|
2022-04-17 12:43:07 +00:00
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
Crypto.loadKeys();
|
|
|
|
|
|
|
|
for (String arg : args) {
|
|
|
|
switch (arg.toLowerCase()) {
|
2022-04-23 05:17:35 +00:00
|
|
|
case "-auth" -> MODE = RunMode.AUTH;
|
|
|
|
case "-game" -> MODE = RunMode.GAME;
|
|
|
|
case "-handbook" -> {
|
|
|
|
Tools.createGmHandbook(); return;
|
|
|
|
}
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
// Initialize server.
|
|
|
|
Grasscutter.getLogger().info("Starting Grasscutter...");
|
2022-04-17 12:43:07 +00:00
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
// Load all resources.
|
2022-04-17 12:43:07 +00:00
|
|
|
ResourceLoader.loadAll();
|
|
|
|
// Database
|
|
|
|
DatabaseManager.initialize();
|
2022-04-23 05:17:35 +00:00
|
|
|
|
|
|
|
// Create server instances.
|
|
|
|
dispatchServer = new DispatchServer();
|
|
|
|
gameServer = new GameServer(new InetSocketAddress(getConfig().getGameServerOptions().Ip, getConfig().getGameServerOptions().Port));
|
|
|
|
|
|
|
|
// Create plugin manager instance.
|
|
|
|
pluginManager = new PluginManager();
|
2022-04-17 12:43:07 +00:00
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
// Start servers.
|
2022-04-21 10:04:00 +00:00
|
|
|
if(getConfig().RunMode.equalsIgnoreCase("HYBRID")) {
|
|
|
|
dispatchServer.start();
|
|
|
|
gameServer.start();
|
2022-04-23 05:17:35 +00:00
|
|
|
} else if (getConfig().RunMode.equalsIgnoreCase("DISPATCH_ONLY")) {
|
2022-04-21 10:04:00 +00:00
|
|
|
dispatchServer.start();
|
2022-04-23 05:17:35 +00:00
|
|
|
} else if (getConfig().RunMode.equalsIgnoreCase("GAME_ONLY")) {
|
2022-04-21 10:04:00 +00:00
|
|
|
gameServer.start();
|
|
|
|
} else {
|
|
|
|
getLogger().error("Invalid server run mode. " + getConfig().RunMode);
|
|
|
|
getLogger().error("Server run mode must be 'HYBRID', 'DISPATCH_ONLY', or 'GAME_ONLY'. Unable to start Grasscutter...");
|
|
|
|
getLogger().error("Shutting down...");
|
|
|
|
System.exit(1);
|
|
|
|
}
|
2022-04-23 05:17:35 +00:00
|
|
|
|
|
|
|
// Enable all plugins.
|
|
|
|
pluginManager.enablePlugins();
|
2022-04-17 12:43:07 +00:00
|
|
|
|
2022-04-18 05:11:27 +00:00
|
|
|
// Open console.
|
2022-04-17 12:43:07 +00:00
|
|
|
startConsole();
|
2022-04-23 05:17:35 +00:00
|
|
|
// Hook into shutdown event.
|
|
|
|
Runtime.getRuntime().addShutdownHook(new Thread(Grasscutter::onShutdown));
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|
2022-04-23 05:17:35 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Server shutdown event.
|
|
|
|
*/
|
|
|
|
private static void onShutdown() {
|
|
|
|
// Disable all plugins.
|
|
|
|
pluginManager.disablePlugins();
|
|
|
|
}
|
2022-04-17 12:43:07 +00:00
|
|
|
|
|
|
|
public static void loadConfig() {
|
|
|
|
try (FileReader file = new FileReader(configFile)) {
|
|
|
|
config = gson.fromJson(file, Config.class);
|
2022-04-21 21:44:55 +00:00
|
|
|
saveConfig();
|
2022-04-17 12:43:07 +00:00
|
|
|
} catch (Exception e) {
|
2022-04-21 21:44:55 +00:00
|
|
|
Grasscutter.config = new Config();
|
|
|
|
saveConfig();
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void saveConfig() {
|
|
|
|
try (FileWriter file = new FileWriter(configFile)) {
|
|
|
|
file.write(gson.toJson(config));
|
|
|
|
} catch (Exception e) {
|
2022-04-23 05:17:35 +00:00
|
|
|
Grasscutter.getLogger().error("Unable to save config file.");
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void startConsole() {
|
|
|
|
String input;
|
2022-04-23 08:47:13 +00:00
|
|
|
getLogger().info("Done! For help, type \"help\"");
|
2022-04-17 12:43:07 +00:00
|
|
|
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
|
|
|
|
while ((input = br.readLine()) != null) {
|
2022-04-19 04:35:01 +00:00
|
|
|
try {
|
2022-04-21 10:04:00 +00:00
|
|
|
if(getConfig().RunMode.equalsIgnoreCase("DISPATCH_ONLY")) {
|
2022-04-23 05:17:35 +00:00
|
|
|
getLogger().error("Commands are not supported in dispatch only mode.");
|
2022-04-21 10:04:00 +00:00
|
|
|
return;
|
|
|
|
}
|
2022-04-23 05:17:35 +00:00
|
|
|
|
2022-04-19 04:35:01 +00:00
|
|
|
CommandMap.getInstance().invoke(null, input);
|
|
|
|
} catch (Exception e) {
|
2022-04-23 05:17:35 +00:00
|
|
|
Grasscutter.getLogger().error("Command error:", e);
|
2022-04-19 04:35:01 +00:00
|
|
|
}
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|
|
|
|
} catch (Exception e) {
|
2022-04-18 05:11:27 +00:00
|
|
|
Grasscutter.getLogger().error("An error occurred.", e);
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public enum RunMode {
|
|
|
|
BOTH,
|
|
|
|
AUTH,
|
|
|
|
GAME
|
|
|
|
}
|
2022-04-18 05:11:27 +00:00
|
|
|
|
|
|
|
public static Config getConfig() {
|
|
|
|
return config;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Logger getLogger() {
|
|
|
|
return log;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Gson getGsonFactory() {
|
|
|
|
return gson;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static DispatchServer getDispatchServer() {
|
|
|
|
return dispatchServer;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static GameServer getGameServer() {
|
|
|
|
return gameServer;
|
|
|
|
}
|
2022-04-23 05:17:35 +00:00
|
|
|
|
|
|
|
public static PluginManager getPluginManager() {
|
|
|
|
return pluginManager;
|
|
|
|
}
|
2022-04-17 12:43:07 +00:00
|
|
|
}
|