package net.CyanWool; import java.awt.image.BufferedImage; import java.io.File; import java.util.List; import javax.imageio.ImageIO; import net.CyanWool.api.CyanWool; import net.CyanWool.api.Server; import net.CyanWool.api.command.CommandManager; import net.CyanWool.api.command.ConsoleCommandSender; import net.CyanWool.api.command.ICommandSender; import net.CyanWool.api.entity.EntityManager; import net.CyanWool.api.entity.player.Player; import net.CyanWool.api.inventory.recipes.RecipeManager; import net.CyanWool.api.inventory.recipes.SimpleRecipeManager; import net.CyanWool.api.network.NetworkServer; import net.CyanWool.api.packs.ServerPack; import net.CyanWool.api.plugin.PluginManager; import net.CyanWool.api.scheduler.Scheduler; import net.CyanWool.api.utils.ServerConfiguration; import net.CyanWool.api.world.WorldManager; import net.CyanWool.io.CyanWorldIOService; import net.CyanWool.management.PlayerManager; import net.CyanWool.network.CyanNetworkServer; import net.CyanWool.scheduler.CyanScheduler; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class CyanServer implements Server { private static final String MC_VERSION = "1.8"; private static final String MOD_NAME = "CyanWool"; private static final String MOD_VERSION = "0.0.1-Dev"; private final Logger logger = LogManager.getLogger(CyanServer.class); private ServerConfiguration config; private NetworkServer network; private WorldManager worlds; private ICommandSender consoleSender; private CommandManager cmdManager; private PluginManager pluginManager; private ConsoleThread console; private PlayerManager playerManager; private EntityManager entityManager; private RecipeManager recipeManager; private Scheduler scheduler; private static BufferedImage icon; private ServerPack pack; public static void main(String[] args) { CyanServer mc = new CyanServer(); CyanWool.setServer(mc); mc.init(); } private void init() { // init long timeStart = System.currentTimeMillis(); if (Runtime.getRuntime().maxMemory() / 1024L / 1024L < 512L) { getLogger().warn("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar <server_name>.jar\""); return; } File configFile = new File("server.yml"); getLogger().info("Loading server.yml"); this.config = new ServerConfiguration(configFile); this.config.init(); this.pack = new MinecraftServerPack(this); // Loading assets getServerPack().registerItems(); getServerPack().registerBlocks(); this.scheduler = new CyanScheduler(this); this.playerManager = new PlayerManager(this); this.entityManager = new EntityManager(this); this.recipeManager = new SimpleRecipeManager(); this.console = new ConsoleThread(this); this.console.start(); this.consoleSender = new ConsoleCommandSender(); CyanNetworkServer network = new CyanNetworkServer(this); this.network = network; network.init(); try { icon = ImageIO.read(new File("server-icon.png")); } catch (Exception ignored) { } this.worlds = new WorldManager(this, new CyanWorldIOService()); this.cmdManager = new CommandManager(); this.pluginManager = new PluginManager(); this.pluginManager.loadPlugins(); // load worlds... getServerPack().registerWorlds(); getServerPack().reigsterRecipes(); getServerPack().registerEnchants(); this.pluginManager.enablePlugins(); long timeEnd = System.currentTimeMillis(); long time = (timeEnd - timeStart); double seconds = ((double) time / 1000); getLogger().info("Done! ( " + seconds + " sec)"); } /** * @return the logger */ @Override public Logger getLogger() { return logger; } public ServerConfiguration getConfiguration() { return config; } @Override public String getMCVersion() { return MC_VERSION; } @Override public String getModName() { return MOD_NAME; } @Override public String getModVersion() { return MOD_VERSION; } @Override public int getMaxPlayers() { return getServerConfiguration().getMaxPlayers(); } @Override public ServerConfiguration getServerConfiguration() { return config; } @Override public void shutdown() { getLogger().info("Shutdown!"); scheduler.shutdown(); getLogger().info("Scheduler's shutdown!"); pluginManager.unloadPlugins(); getLogger().info("Plugins unloaded!"); network.getProtocolServer().close(); getLogger().info("NetworkServer is closed!"); console.shutdown(); config.save(); getLogger().info("Config is saved!"); worlds.saveAllWorlds(); System.exit(1); // TODO } @Override public List<Player> getPlayers() { return getPlayerManager().getPlayers(); } @Override public ICommandSender getConsoleCommandSender() { return consoleSender; } @Override public CommandManager getCommandManager() { return cmdManager; } @Override public void broadcastMessage(String message) { for (Player player : getPlayers()) { player.sendMessage(message); } getConsoleCommandSender().sendMessage(message); } @Override public Player getPlayer(String name) { for (Player player : getPlayers()) { if (player.getName().equals(name)) { return player; } } return null; } @Override public PluginManager getPluginManager() { return pluginManager; } @Override public WorldManager getWorldManager() { return worlds; } @Override public BufferedImage getIcon() { return icon; } @Override public Scheduler getScheduler() { return scheduler; } @Override public RecipeManager getRecipeManager() { return recipeManager; } @Override public NetworkServer getNetworkServer() { return network; } @Override public EntityManager getEntityManager() { return entityManager; } // NOT API public PlayerManager getPlayerManager() { return playerManager; } @Override public ServerPack getServerPack() { return pack; } @Override public void setServerPack(ServerPack pack) { this.pack = pack; getLogger().info("ServerPack has been changed: " + pack.getName()); } }