diff --git a/.template/CloudNet-Master/start.sh b/.template/CloudNet-Master/start.sh index 3c7fec14b..1f92debff 100644 --- a/.template/CloudNet-Master/start.sh +++ b/.template/CloudNet-Master/start.sh @@ -1,2 +1,2 @@ #!/bin/sh -screen -S CloudNet java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:CompileThreshold=100 -XX:MaxPermSize=256M -Xmx128m -jar CloudNet-Master.jar \ No newline at end of file +screen -RS CloudNet java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:CompileThreshold=100 -XX:MaxPermSize=256M -Xmx128m -jar CloudNet-Master.jar diff --git a/.template/CloudNet-Wrapper/start.sh b/.template/CloudNet-Wrapper/start.sh index 16fc61d39..4171d98f7 100644 --- a/.template/CloudNet-Wrapper/start.sh +++ b/.template/CloudNet-Wrapper/start.sh @@ -1,2 +1,2 @@ #!/bin/sh -screen -S Wrapper-1 java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:CompileThreshold=100 -XX:MaxPermSize=256M -Xmx64m -jar CloudNet-Wrapper.jar +screen -RS Wrapper-1 java -XX:+UseG1GC -XX:MaxGCPauseMillis=50 -XX:CompileThreshold=100 -XX:MaxPermSize=256M -Xmx64m -jar CloudNet-Wrapper.jar diff --git a/Jenkinsfile b/Jenkinsfile index d970da20a..cbd256d92 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -15,7 +15,7 @@ pipeline { } stage('Version') { steps { - sh 'mvn versions:set -DnewVersion=2.1.14.3' + sh 'mvn versions:set -DnewVersion=2.1.15' } } stage('Compile') { diff --git a/README.md b/README.md index fa494b68b..9ee961af1 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,9 @@ Use of KVM virtualization or dedicated servers is recommended. ### Support - * Spigot-Support » 1.7.10 - 1.13.2 + * Spigot-Support » 1.7.10 - 1.14 * PaperSpigot, TacoSpigot, Hose, Torch - * BungeeCord-Support » 1.7.10 - 1.13.2 + * BungeeCord-Support » 1.7.10 - 1.14 * Flexpipe, HexaCord, Waterfall, TraverTine ### Discord @@ -61,14 +61,14 @@ Maven: de.dytanic.cloudnet cloudnet-api-bridge - 2.1.14 + 2.1.15 provided de.dytanic.cloudnet cloudnet-core - 2.1.14 + 2.1.15 provided diff --git a/cloudnet-api/cloudnet-api-bridge/pom.xml b/cloudnet-api/cloudnet-api-bridge/pom.xml index 2595274bb..13b65c8e0 100644 --- a/cloudnet-api/cloudnet-api-bridge/pom.xml +++ b/cloudnet-api/cloudnet-api-bridge/pom.xml @@ -15,8 +15,8 @@ - vault-repo - http://nexus.hc.to/content/repositories/pub_releases + jitpack.io + https://jitpack.io @@ -28,10 +28,28 @@ compile - net.milkbowl.vault + org.apache.logging.log4j + log4j-api + 2.11.2 + provided + + + org.apache.logging.log4j + log4j-core + 2.11.2 + provided + + + com.github.MilkBowl VaultAPI ${dependency.vaultapi.version} provided + + + org.bukkit + bukkit + + diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/BukkitBootstrap.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/BukkitBootstrap.java index 7f0a9eccd..4fd233d7a 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/BukkitBootstrap.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/BukkitBootstrap.java @@ -1,191 +1,193 @@ -/* - * Copyright (c) Tarek Hosni El Alaoui 2017 - */ - -package de.dytanic.cloudnet.bridge; - -import de.dytanic.cloudnet.api.CloudAPI; -import de.dytanic.cloudnet.api.config.CloudConfigLoader; -import de.dytanic.cloudnet.api.config.ConfigTypeLoader; -import de.dytanic.cloudnet.bridge.event.bukkit.BukkitCloudServerInitEvent; -import de.dytanic.cloudnet.bridge.internal.command.bukkit.CommandCloudServer; -import de.dytanic.cloudnet.bridge.internal.command.bukkit.CommandResource; -import de.dytanic.cloudnet.bridge.internal.listener.bukkit.BukkitListener; -import de.dytanic.cloudnet.bridge.internal.serverselectors.MobSelector; -import de.dytanic.cloudnet.bridge.internal.serverselectors.SignSelector; -import de.dytanic.cloudnet.bridge.internal.serverselectors.packet.in.PacketInMobSelector; -import de.dytanic.cloudnet.bridge.internal.serverselectors.packet.in.PacketInSignSelector; -import de.dytanic.cloudnet.lib.network.protocol.packet.PacketRC; -import de.dytanic.cloudnet.lib.server.ServerGroupMode; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.event.server.ServerListPingEvent; -import org.bukkit.plugin.java.JavaPlugin; - -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.net.InetSocketAddress; -import java.nio.file.Paths; - -/** - * Created by Tareko on 17.08.2017. - */ -public final class BukkitBootstrap extends JavaPlugin implements Runnable { - - @Override - public void onLoad() - { - CloudAPI cloudAPI = new CloudAPI(new CloudConfigLoader(Paths.get("CLOUD/connection.json"), Paths.get("CLOUD/config.json"), ConfigTypeLoader.INTERNAL), this); - cloudAPI.getNetworkConnection().getPacketManager().registerHandler(PacketRC.SERVER_SELECTORS + 1, PacketInSignSelector.class); - cloudAPI.getNetworkConnection().getPacketManager().registerHandler(PacketRC.SERVER_SELECTORS + 2, PacketInMobSelector.class); - } - - @Override - public void onEnable() - { - new CloudServer(this, CloudAPI.getInstance()); - - CloudAPI.getInstance().bootstrap(); - checkRegistryAccess(); - - try - { - Field field = Class.forName("org.spigotmc.AsyncCatcher").getDeclaredField("enabled"); - field.setAccessible(true); - field.set(null, false); - } catch (Exception ex) - { - } - - getServer().getPluginManager().registerEvents(new BukkitListener(), this); - - CloudServer.getInstance().registerCommand(new CommandResource()); - getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); - getServer().getMessenger().registerOutgoingPluginChannel(this, "cloudnet:main"); - - enableTasks(); - loadPlayers(); - } - - @Override - public void onDisable() - { - - getServer().getMessenger().unregisterOutgoingPluginChannel(this); - - if (CloudAPI.getInstance() != null) - { - CloudServer.getInstance().updateDisable(); - CloudAPI.getInstance().shutdown(); - } - - CloudAPI.getInstance().getNetworkHandlerProvider().clear(); - - if (SignSelector.getInstance() != null && SignSelector.getInstance().getWorker() != null) - SignSelector.getInstance().getWorker().stop(); - - if (MobSelector.getInstance() != null) - MobSelector.getInstance().shutdown(); - - Bukkit.getScheduler().cancelTasks(this); - } - - @Deprecated - @Override - public void run() - { - getServer().getPluginManager().disablePlugin(this); - Bukkit.shutdown(); - } - - private void checkRegistryAccess() - { - try - { - Class.forName("net.md_5.bungee.api.chat.BaseComponent"); - Class.forName("de.dytanic.cloudnet.bridge.internal.chat.DocumentRegistry").getMethod("fire").invoke(null); - } catch (Exception ignored) - { - } - } - - private void loadPlayers() - { - for (Player all : getServer().getOnlinePlayers()) - CloudServer.getInstance().getPlayerAndCache(all.getUniqueId()); - } - - private void enableTasks() - { - Bukkit.getScheduler().runTask(this, new Runnable() { - @Override - public void run() - { - if (CloudServer.getInstance().getGroupData() != null) - { - if (CloudAPI.getInstance().getServerGroupData(CloudAPI.getInstance().getGroup()).getMode().equals(ServerGroupMode.LOBBY) || - CloudAPI.getInstance().getServerGroupData(CloudAPI.getInstance().getGroup()).getMode().equals(ServerGroupMode.STATIC_LOBBY)) - { - CommandCloudServer server = new CommandCloudServer(); - - getCommand("cloudserver").setExecutor(server); - getCommand("cloudserver").setPermission("cloudnet.command.cloudserver"); - getCommand("cloudserver").setTabCompleter(server); - } - - Bukkit.getPluginManager().callEvent(new BukkitCloudServerInitEvent(CloudServer.getInstance())); - CloudServer.getInstance().update(); - - if (CloudAPI.getInstance().getServerGroupData(CloudAPI.getInstance().getGroup()).getAdvancedServerConfig().isDisableAutoSavingForWorlds()) - for (World world : Bukkit.getWorlds()) - world.setAutoSave(false); - } - - if (CloudServer.getInstance().getGroupData() != null) - { - getServer().getScheduler().runTaskTimer(BukkitBootstrap.this, new Runnable() { - @Override - public void run() - { - try - { - ServerListPingEvent serverListPingEvent = new ServerListPingEvent( - new InetSocketAddress("127.0.0.1", 53345).getAddress(), - CloudServer.getInstance().getMotd(), Bukkit.getOnlinePlayers().size(), CloudServer.getInstance().getMaxPlayers() - ); - Bukkit.getPluginManager().callEvent(serverListPingEvent); - if (!serverListPingEvent.getMotd().equals(CloudServer.getInstance().getMotd())) - { - CloudServer.getInstance().setMotd(serverListPingEvent.getMotd()); - if (serverListPingEvent.getMotd().toLowerCase().contains("running") || serverListPingEvent.getMotd().toLowerCase().contains("ingame")) - { - CloudServer.getInstance().changeToIngame(); - } - } - - if (serverListPingEvent.getMaxPlayers() != CloudServer.getInstance().getMaxPlayers()) - { - CloudServer.getInstance().setMaxPlayers(serverListPingEvent.getMaxPlayers()); - } - } catch (Exception ex) - { - } - } - }, 0, 5); - } - - if (CloudAPI.getInstance().getPermissionPool() != null && - (getServer().getPluginManager().isPluginEnabled("VaultAPI") || getServer().getPluginManager().isPluginEnabled("Vault"))) - try - { - Class.forName("de.dytanic.cloudnet.bridge.vault.VaultInvoker").getMethod("invoke").invoke(null); - } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) - { - e.printStackTrace(); - } - } - }); - } - -} +/* + * Copyright (c) Tarek Hosni El Alaoui 2017 + */ + +package de.dytanic.cloudnet.bridge; + +import de.dytanic.cloudnet.api.CloudAPI; +import de.dytanic.cloudnet.api.config.CloudConfigLoader; +import de.dytanic.cloudnet.api.config.ConfigTypeLoader; +import de.dytanic.cloudnet.bridge.event.bukkit.BukkitCloudServerInitEvent; +import de.dytanic.cloudnet.bridge.internal.command.bukkit.CommandCloudServer; +import de.dytanic.cloudnet.bridge.internal.command.bukkit.CommandResource; +import de.dytanic.cloudnet.bridge.internal.listener.bukkit.BukkitListener; +import de.dytanic.cloudnet.bridge.internal.serverselectors.MobSelector; +import de.dytanic.cloudnet.bridge.internal.serverselectors.SignSelector; +import de.dytanic.cloudnet.bridge.internal.serverselectors.packet.in.PacketInMobSelector; +import de.dytanic.cloudnet.bridge.internal.serverselectors.packet.in.PacketInSignSelector; +import de.dytanic.cloudnet.lib.network.protocol.packet.PacketRC; +import de.dytanic.cloudnet.lib.server.ServerGroupMode; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.event.server.ServerListPingEvent; +import org.bukkit.plugin.java.JavaPlugin; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.net.InetSocketAddress; +import java.nio.file.Paths; + +/** + * Created by Tareko on 17.08.2017. + */ +public final class BukkitBootstrap extends JavaPlugin implements Runnable { + + @Override + public void onLoad() + { + CloudAPI cloudAPI = new CloudAPI(new CloudConfigLoader(Paths.get("CLOUD/connection.json"), Paths.get("CLOUD/config.json"), ConfigTypeLoader.INTERNAL), this); + cloudAPI.getNetworkConnection().getPacketManager().registerHandler(PacketRC.SERVER_SELECTORS + 1, PacketInSignSelector.class); + cloudAPI.getNetworkConnection().getPacketManager().registerHandler(PacketRC.SERVER_SELECTORS + 2, PacketInMobSelector.class); + + cloudAPI.setLogger(getLogger()); + } + + @Override + public void onEnable() + { + new CloudServer(this, CloudAPI.getInstance()); + + CloudAPI.getInstance().bootstrap(); + checkRegistryAccess(); + + try + { + Field field = Class.forName("org.spigotmc.AsyncCatcher").getDeclaredField("enabled"); + field.setAccessible(true); + field.set(null, false); + } catch (Exception ex) + { + } + + getServer().getPluginManager().registerEvents(new BukkitListener(), this); + + CloudServer.getInstance().registerCommand(new CommandResource()); + getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + getServer().getMessenger().registerOutgoingPluginChannel(this, "cloudnet:main"); + + enableTasks(); + loadPlayers(); + } + + @Override + public void onDisable() + { + + getServer().getMessenger().unregisterOutgoingPluginChannel(this); + + if (CloudAPI.getInstance() != null) + { + CloudServer.getInstance().updateDisable(); + CloudAPI.getInstance().shutdown(); + } + + CloudAPI.getInstance().getNetworkHandlerProvider().clear(); + + if (SignSelector.getInstance() != null && SignSelector.getInstance().getWorker() != null) + SignSelector.getInstance().getWorker().stop(); + + if (MobSelector.getInstance() != null) + MobSelector.getInstance().shutdown(); + + Bukkit.getScheduler().cancelTasks(this); + } + + @Deprecated + @Override + public void run() + { + getServer().getPluginManager().disablePlugin(this); + Bukkit.shutdown(); + } + + private void checkRegistryAccess() + { + try + { + Class.forName("net.md_5.bungee.api.chat.BaseComponent"); + Class.forName("de.dytanic.cloudnet.bridge.internal.chat.DocumentRegistry").getMethod("fire").invoke(null); + } catch (Exception ignored) + { + } + } + + private void loadPlayers() + { + for (Player all : getServer().getOnlinePlayers()) + CloudServer.getInstance().getPlayerAndCache(all.getUniqueId()); + } + + private void enableTasks() + { + Bukkit.getScheduler().runTask(this, new Runnable() { + @Override + public void run() + { + if (CloudServer.getInstance().getGroupData() != null) + { + if (CloudAPI.getInstance().getServerGroupData(CloudAPI.getInstance().getGroup()).getMode().equals(ServerGroupMode.LOBBY) || + CloudAPI.getInstance().getServerGroupData(CloudAPI.getInstance().getGroup()).getMode().equals(ServerGroupMode.STATIC_LOBBY)) + { + CommandCloudServer server = new CommandCloudServer(); + + getCommand("cloudserver").setExecutor(server); + getCommand("cloudserver").setPermission("cloudnet.command.cloudserver"); + getCommand("cloudserver").setTabCompleter(server); + } + + Bukkit.getPluginManager().callEvent(new BukkitCloudServerInitEvent(CloudServer.getInstance())); + CloudServer.getInstance().update(); + + if (CloudAPI.getInstance().getServerGroupData(CloudAPI.getInstance().getGroup()).getAdvancedServerConfig().isDisableAutoSavingForWorlds()) + for (World world : Bukkit.getWorlds()) + world.setAutoSave(false); + } + + if (CloudServer.getInstance().getGroupData() != null) + { + getServer().getScheduler().runTaskTimer(BukkitBootstrap.this, new Runnable() { + @Override + public void run() + { + try + { + ServerListPingEvent serverListPingEvent = new ServerListPingEvent( + new InetSocketAddress("127.0.0.1", 53345).getAddress(), + CloudServer.getInstance().getMotd(), Bukkit.getOnlinePlayers().size(), CloudServer.getInstance().getMaxPlayers() + ); + Bukkit.getPluginManager().callEvent(serverListPingEvent); + if (!serverListPingEvent.getMotd().equals(CloudServer.getInstance().getMotd())) + { + CloudServer.getInstance().setMotd(serverListPingEvent.getMotd()); + if (serverListPingEvent.getMotd().toLowerCase().contains("running") || serverListPingEvent.getMotd().toLowerCase().contains("ingame")) + { + CloudServer.getInstance().changeToIngame(); + } + } + + if (serverListPingEvent.getMaxPlayers() != CloudServer.getInstance().getMaxPlayers()) + { + CloudServer.getInstance().setMaxPlayers(serverListPingEvent.getMaxPlayers()); + } + } catch (Exception ex) + { + } + } + }, 0, 5); + } + + if (CloudAPI.getInstance().getPermissionPool() != null && + (getServer().getPluginManager().isPluginEnabled("VaultAPI") || getServer().getPluginManager().isPluginEnabled("Vault"))) + try + { + Class.forName("de.dytanic.cloudnet.bridge.vault.VaultInvoker").getMethod("invoke").invoke(null); + } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) + { + e.printStackTrace(); + } + } + }); + } + +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/CloudServer.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/CloudServer.java index a11c603b4..53b322e95 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/CloudServer.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/CloudServer.java @@ -40,8 +40,8 @@ import java.io.File; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.net.URL; import java.net.URLConnection; import java.nio.file.Files; @@ -448,11 +448,9 @@ public void updateNameTags(Player player, Function play if (CloudAPI.getInstance().getPermissionPool() == null || !CloudAPI.getInstance().getPermissionPool().isAvailable()) return; - PermissionGroup playerPermissionGroup = playerPermissionGroupFunction != null ? playerPermissionGroupFunction.apply(player) : null; - - if (playerPermissionGroup == null) - playerPermissionGroup = getCloudPlayers().get(player.getUniqueId()) - .getPermissionEntity().getHighestPermissionGroup(CloudAPI.getInstance().getPermissionPool()); + PermissionGroup playerPermissionGroup = playerPermissionGroupFunction != null + ? playerPermissionGroupFunction.apply(player) + : getCloudPlayers().get(player.getUniqueId()).getPermissionEntity().getHighestPermissionGroup(CloudAPI.getInstance().getPermissionPool()); initScoreboard(player); @@ -483,46 +481,49 @@ public Map getClonedCloudPlayers() private void addTeamEntry(Player target, Player all, PermissionGroup permissionGroup) { String teamName = permissionGroup.getTagId() + permissionGroup.getName(); - try - { - if (teamName.length() > 16) - { - teamName = shortenStringTo16Bytes(teamName); - CloudAPI.getInstance().dispatchConsoleMessage("In order to prevent issues, the name (+ tagID) of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!"); - CloudAPI.getInstance().dispatchConsoleMessage("Please fix this issue by changing the name of the group in your perms.yml"); - Bukkit.broadcast("In order to prevent issues, the name (+ tagID) of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!", "cloudnet.notify"); - Bukkit.broadcast("Please fix this issue by changing the name of the group in your perms.yml", "cloudnet.notify"); - } - } catch (UnsupportedEncodingException e) + if (teamName.length() > 16) { - e.printStackTrace(); + teamName = teamName.substring(0, 16); + CloudAPI.getInstance().dispatchConsoleMessage("In order to prevent issues, the name (+ tagID) of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!"); + CloudAPI.getInstance().dispatchConsoleMessage("Please fix this issue by changing the name of the group in your perms.yml"); + Bukkit.broadcast("In order to prevent issues, the name (+ tagID) of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!", "cloudnet.notify"); + Bukkit.broadcast("Please fix this issue by changing the name of the group in your perms.yml", "cloudnet.notify"); } Team team = all.getScoreboard().getTeam(teamName); if (team == null) team = all.getScoreboard().registerNewTeam(teamName); - try + if (permissionGroup.getPrefix().length() > 16) { - if (permissionGroup.getPrefix().length() > 16) - { - permissionGroup.setPrefix(shortenStringTo16Bytes(permissionGroup.getPrefix())); - CloudAPI.getInstance().dispatchConsoleMessage("In order to prevent issues, the prefix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!"); - CloudAPI.getInstance().dispatchConsoleMessage("Please fix this issue by changing the prefix in your perms.yml"); - Bukkit.broadcast("In order to prevent issues, the prefix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!", "cloudnet.notify"); - Bukkit.broadcast("Please fix this issue by changing the prefix in your perms.yml", "cloudnet.notify"); - } - if (permissionGroup.getSuffix().length() > 16) - { - permissionGroup.setSuffix(shortenStringTo16Bytes(permissionGroup.getSuffix())); - CloudAPI.getInstance().dispatchConsoleMessage("In order to prevent issues, the suffix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!"); - CloudAPI.getInstance().dispatchConsoleMessage("Please fix this issue by changing the suffix in your perms.yml"); - Bukkit.broadcast("In order to prevent issues, the suffix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!", "cloudnet.notify"); - Bukkit.broadcast("Please fix this issue by changing the suffix in your perms.yml", "cloudnet.notify"); - } - } catch (UnsupportedEncodingException e) + permissionGroup.setPrefix(permissionGroup.getPrefix().substring(0, 16)); + CloudAPI.getInstance().dispatchConsoleMessage("In order to prevent issues, the prefix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!"); + CloudAPI.getInstance().dispatchConsoleMessage("Please fix this issue by changing the prefix in your perms.yml"); + Bukkit.broadcast("In order to prevent issues, the prefix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!", "cloudnet.notify"); + Bukkit.broadcast("Please fix this issue by changing the prefix in your perms.yml", "cloudnet.notify"); + } + if (permissionGroup.getSuffix().length() > 16) { + permissionGroup.setSuffix(permissionGroup.getSuffix().substring(0, 16)); + CloudAPI.getInstance().dispatchConsoleMessage("In order to prevent issues, the suffix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!"); + CloudAPI.getInstance().dispatchConsoleMessage("Please fix this issue by changing the suffix in your perms.yml"); + Bukkit.broadcast("In order to prevent issues, the suffix of the group " + permissionGroup.getName() + " was temporarily shortened to 16 characters!", "cloudnet.notify"); + Bukkit.broadcast("Please fix this issue by changing the suffix in your perms.yml", "cloudnet.notify"); + } + + try { + Method setColor = team.getClass().getDeclaredMethod("setColor", ChatColor.class); + setColor.setAccessible(true); + if(permissionGroup.getColor().length() != 0) { + setColor.invoke(team, ChatColor.getByChar(permissionGroup.getColor().replaceAll("&","").replaceAll("§",""))); + } else { + setColor.invoke(team, ChatColor.getByChar(ChatColor.getLastColors(permissionGroup.getPrefix().replace('&','§')).replaceAll("&","").replaceAll("§",""))); + } + } catch (NoSuchMethodException ignored) { + } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } + + team.setPrefix(ChatColor.translateAlternateColorCodes('&', permissionGroup.getPrefix())); team.setSuffix(ChatColor.translateAlternateColorCodes('&', permissionGroup.getSuffix())); @@ -531,10 +532,6 @@ private void addTeamEntry(Player target, Player all, PermissionGroup permissionG target.setDisplayName(ChatColor.translateAlternateColorCodes('&', permissionGroup.getDisplay() + target.getName())); } - private String shortenStringTo16Bytes(String input) throws UnsupportedEncodingException - { - return input.substring(0, 16); - } private void initScoreboard(Player all) { @@ -611,9 +608,17 @@ public void onCustomSubChannelMessageReceive(String channel, String message, Doc Files.copy(urlConnection.getInputStream(), Paths.get("plugins/" + document.getString("name") + ".jar")); File file = new File("plugins/" + document.getString("name") + ".jar"); - Plugin plugin = Bukkit.getPluginManager().loadPlugin(file); - Bukkit.getPluginManager().enablePlugin(plugin); - } catch (IOException | InvalidDescriptionException | InvalidPluginException e) + Bukkit.getScheduler().runTask(CloudServer.this.getPlugin(), () -> { + try + { + Plugin plugin = Bukkit.getPluginManager().loadPlugin(file); + Bukkit.getPluginManager().enablePlugin(plugin); + } catch (InvalidPluginException | InvalidDescriptionException e) + { + e.printStackTrace(); + } + }); + } catch (IOException e) { e.printStackTrace(); } diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/ProxiedBootstrap.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/ProxiedBootstrap.java index 0546c2a4d..2c7ed836a 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/ProxiedBootstrap.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/ProxiedBootstrap.java @@ -37,6 +37,7 @@ public void run() getProxy().stop("CloudNet-Stop!"); } }); + CloudAPI.getInstance().setLogger(getLogger()); } @Override @@ -97,4 +98,4 @@ public void onDisable() if (CloudAPI.getInstance() != null) CloudAPI.getInstance().shutdown(); } -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/event/bukkit/BukkitCloudEvent.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/event/bukkit/BukkitCloudEvent.java index b90043caa..fe83f1c23 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/event/bukkit/BukkitCloudEvent.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/event/bukkit/BukkitCloudEvent.java @@ -6,6 +6,7 @@ import de.dytanic.cloudnet.api.CloudAPI; import de.dytanic.cloudnet.bridge.CloudServer; +import org.bukkit.Bukkit; import org.bukkit.event.Event; /** @@ -13,6 +14,13 @@ */ public abstract class BukkitCloudEvent extends Event { + /** + * Marks this BukkitCloudEvent as async or sync based on on which thread it's being called + */ + public BukkitCloudEvent() { + super(!Bukkit.isPrimaryThread()); + } + /** * Returns the CloudAPI instance * diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandCloudServer.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandCloudServer.java index bec70a44c..8a159d6f6 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandCloudServer.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandCloudServer.java @@ -19,6 +19,11 @@ import de.dytanic.cloudnet.lib.utility.CollectionWrapper; import de.dytanic.cloudnet.lib.utility.document.Document; import de.dytanic.cloudnet.lib.utility.threading.Runnabled; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.LoggerConfig; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.command.Command; @@ -28,10 +33,7 @@ import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; /** * Created by Tareko on 23.08.2017. @@ -39,8 +41,12 @@ public final class CommandCloudServer implements CommandExecutor, TabExecutor { @Override - public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) + public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args) { + CloudAPI.getInstance().getLogger().finest( + String.format("%s executed %s (label = %s) with arguments %s", + commandSender, command, label, Arrays.toString(args)) + ); if (!(commandSender instanceof Player)) return false; Player player = (Player) commandSender; @@ -74,12 +80,20 @@ public boolean isAccepted(MobSelector.MobImpl value) if (stringBuilder.length() > 32) { - commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "The display cannot be longe then 32 characters"); + commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "The display cannot be longer then 32 characters"); return false; } + + String material = args[4].toUpperCase(); + + if(Material.getMaterial(material) == null) + { + commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "An item with this itemName does not exist"); + return false; + } + ServerMob serverMob = new ServerMob(UUID.randomUUID(), stringBuilder.substring(0, stringBuilder.length() - 1), args[2], entityType.name(), args[3], - NetworkUtils.checkIsNumber(args[4]) ? (Integer.parseInt(args[4]) != 0 ? Integer.parseInt(args[4]) : 138) : 138 - , args[5].equalsIgnoreCase("true"), + -1, material, args[5].equalsIgnoreCase("true"), MobSelector.getInstance().toPosition(CloudAPI.getInstance().getGroup(), player.getLocation()), "§8#§c%group% &bPlayers online §8|§7 %group_online% of %max_players%", new Document()); CloudAPI.getInstance().getNetworkConnection().sendPacket(new PacketOutAddMob(serverMob)); player.sendMessage(CloudAPI.getInstance().getPrefix() + "The mob will be created, please wait..."); @@ -294,6 +308,22 @@ public void run(MobSelector.MobImpl obj) commandSender.sendMessage("- " + entityType.name()); } } + if (args[0].equalsIgnoreCase("debug")) { + CloudAPI.getInstance().setDebug(!CloudAPI.getInstance().isDebug()); + + final LoggerContext context = (LoggerContext) LogManager.getContext(false); + final Configuration configuration = context.getConfiguration(); + final LoggerConfig rootLoggerConfig = configuration.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); + + if (CloudAPI.getInstance().isDebug()) { + rootLoggerConfig.setLevel(Level.ALL); + commandSender.sendMessage("§aDebug output for server has been enabled."); + } else { + rootLoggerConfig.setLevel(Level.INFO); + commandSender.sendMessage("§cDebug output for server has been disabled."); + } + context.updateLoggers(configuration); + } break; case 3: if (args[0].equalsIgnoreCase("setItem")) @@ -331,7 +361,7 @@ public boolean isAccepted(MobSelector.MobImpl value) } if (MobSelector.getInstance() != null) { - commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs createMob "); + commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs createMob "); commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs removeMob "); commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs listMobs"); commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs moblist"); @@ -339,6 +369,7 @@ public boolean isAccepted(MobSelector.MobImpl value) commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs setItem "); commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs editMobLine "); } + commandSender.sendMessage(CloudAPI.getInstance().getPrefix() + "/cs debug"); break; } @@ -350,4 +381,4 @@ public List onTabComplete(CommandSender commandSender, Command command, { return new LinkedList<>(CloudAPI.getInstance().getServerGroupMap().keySet()); } -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandResource.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandResource.java index eb0e35811..3afeea181 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandResource.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/bukkit/CommandResource.java @@ -11,6 +11,7 @@ import org.bukkit.command.CommandSender; import java.lang.management.ManagementFactory; +import java.util.Arrays; /** * Created by Tareko on 07.07.2017. @@ -25,8 +26,12 @@ public CommandResource() } @Override - public boolean execute(CommandSender sender, String s, String[] args) + public boolean execute(CommandSender sender, String alias, String[] args) { + CloudAPI.getInstance().getLogger().finest( + String.format("%s executed %s with arguments %s", + sender, alias, Arrays.toString(args)) + ); if (!testPermission(sender)) return false; long used = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed() / 1048576L; long max = Runtime.getRuntime().maxMemory() / 1048576L; @@ -40,4 +45,4 @@ public boolean execute(CommandSender sender, String s, String[] args) sender.sendMessage(CloudAPI.getInstance().getPrefix() + NetworkUtils.SPACE_STRING); return false; } -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandCloud.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandCloud.java index 777aa78c6..85fcf6eec 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandCloud.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandCloud.java @@ -49,6 +49,10 @@ public CommandCloud() @Override public void execute(CommandSender commandSender, String[] args) { + CloudAPI.getInstance().getLogger().finest( + String.format("%s executed %s with arguments %s", + commandSender, this, Arrays.toString(args)) + ); if (args.length > 2) { if (args[0].equalsIgnoreCase("cmds") && commandSender.hasPermission("cloudnet.command.cloud.commandserver")) @@ -210,6 +214,14 @@ public void execute(CommandSender commandSender, String[] args) commandSender.sendMessage(builder.substring(0)); return; } + if (args[0].equalsIgnoreCase("debug") && commandSender.hasPermission("cloudnet.command.cloud.debug")) { + CloudAPI.getInstance().setDebug(!CloudAPI.getInstance().isDebug()); + if(CloudAPI.getInstance().isDebug()) { + commandSender.sendMessage(TextComponent.fromLegacyText("§aDebug output for proxy has been enabled.")); + } else { + commandSender.sendMessage(TextComponent.fromLegacyText("§cDebug output for proxy has been disabled.")); + } + } break; case 2: if (args[0].equalsIgnoreCase("toggle")) @@ -570,6 +582,7 @@ public boolean isAccepted(Template value) CloudAPI.getInstance().getPrefix() + "§7/cloud copy ", CloudAPI.getInstance().getPrefix() + "§7/cloud version", CloudAPI.getInstance().getPrefix() + "§7/cloud statistics", + CloudAPI.getInstance().getPrefix() + "§7/cloud debug", NetworkUtils.SPACE_STRING ); break; @@ -601,7 +614,7 @@ public Iterable onTabComplete(CommandSender commandSender, String[] args tabCompletes = ImmutableList .of("toggle", "setMaxPlayers", "whitelist", "start", "startcs", "cmds", "cmdp", "stop", "stopGroup" , "ustopGroup", "listProxys", "listOnline", "listServers", "log", "listGroups", "rl", "list" - , "maintenance", "copy", "version", "statistics"); + , "maintenance", "copy", "version", "statistics", "debug"); break; } case 2: diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandHub.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandHub.java index 5b752a721..ed5021e68 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandHub.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandHub.java @@ -14,6 +14,8 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; +import java.util.Arrays; + /** * Created by Tareko on 20.08.2017. */ @@ -33,6 +35,10 @@ public String[] getAliases() @Override public void execute(CommandSender commandSender, String[] args) { + CloudAPI.getInstance().getLogger().finest( + String.format("%s executed %s with arguments %s", + commandSender, this, Arrays.toString(args)) + ); if (!(commandSender instanceof ProxiedPlayer)) return; ServerInfo serverInfo = CloudProxy.getInstance().getCachedServers().get(((ProxiedPlayer) commandSender).getServer().getInfo().getName()); @@ -61,4 +67,4 @@ public void execute(CommandSender commandSender, String[] args) CloudAPI.getInstance().getCloudNetwork().getMessages().getString("hubCommandNoServerFound"))); else ((ProxiedPlayer) commandSender).connect(ProxyServer.getInstance().getServerInfo(fallback)); } -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandPermissions.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandPermissions.java index b8c804ad0..d9870093b 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandPermissions.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/command/proxied/CommandPermissions.java @@ -35,6 +35,10 @@ public CommandPermissions() @Override public void execute(CommandSender sender, String[] args) { + CloudAPI.getInstance().getLogger().finest( + String.format("%s executed %s with arguments %s", + sender, this, Arrays.toString(args)) + ); PermissionPool permissionPool = CloudAPI.getInstance().getPermissionPool(); if (args.length > 0) { @@ -150,6 +154,19 @@ public void execute(CommandSender sender, String[] args) sender.sendMessage("The specified permission group doesn't exist"); } } + if (args[2].equalsIgnoreCase("setColor")) + { + if (permissionPool.getGroups().containsKey(args[1])) + { + PermissionGroup permissionGroup = permissionPool.getGroups().get(args[1]); + permissionGroup.setColor(args[3]); + CloudAPI.getInstance().updatePermissionGroup(permissionGroup); + sender.sendMessage("You set the needed color of the permission group " + permissionGroup.getName() + " to \"" + permissionGroup.getColor() + "\""); + } else + { + sender.sendMessage("The specified permission group doesn't exist"); + } + } if (args[2].equalsIgnoreCase("setTagId")) { @@ -494,6 +511,7 @@ public void accept(PermissionGroup permissionGroup) CloudAPI.getInstance().getPrefix() + "/cperms GROUP setPrefix ", CloudAPI.getInstance().getPrefix() + "/cperms GROUP setTagId ", CloudAPI.getInstance().getPrefix() + "/cperms GROUP setDefault ", + CloudAPI.getInstance().getPrefix() + "/cperms GROUP setColor ", CloudAPI.getInstance().getPrefix() + "/cperms USER ", CloudAPI.getInstance().getPrefix() + "/cperms USER GROUP SET ", CloudAPI.getInstance().getPrefix() + "/cperms USER GROUP ADD ", @@ -528,4 +546,4 @@ private boolean permissionIsSet(Map permissions, String permiss } return false; } -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/bukkit/BukkitListener.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/bukkit/BukkitListener.java index 74075a7b3..63e07cb56 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/bukkit/BukkitListener.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/bukkit/BukkitListener.java @@ -28,6 +28,7 @@ import java.util.HashSet; import java.util.UUID; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.logging.Level; /** * Created by Tareko on 17.08.2017. @@ -39,6 +40,11 @@ public final class BukkitListener implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void handle0(AsyncPlayerPreLoginEvent e) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handle0", + String.format("Handling async player pre login event: %s", e)); for (Player all : Bukkit.getOnlinePlayers()) if (all.getUniqueId().equals(e.getUniqueId())) { @@ -52,6 +58,11 @@ public void handle0(AsyncPlayerPreLoginEvent e) @EventHandler public void handle(BukkitSubChannelMessageEvent event) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handle", + String.format("Handling bukkit sub channel message event: %s", event)); if (event.getChannel().equalsIgnoreCase("cloudnet_internal") || event.getMessage().equalsIgnoreCase("server_connect_request")) { @@ -73,6 +84,11 @@ public void run() @EventHandler(priority = EventPriority.HIGHEST) public void handleLast(PlayerLoginEvent event) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handleLast", + String.format("Handling player login event: %s", event)); if (this.kicks.contains(event.getPlayer().getUniqueId())) { this.kicks.remove(event.getPlayer().getUniqueId()); @@ -84,6 +100,11 @@ public void handleLast(PlayerLoginEvent event) @EventHandler(priority = EventPriority.LOWEST) public void handleFirst(PlayerLoginEvent event) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handleFirst", + String.format("Handling player login event: %s", event)); if (CloudServer.getInstance().getCloudPlayers().containsKey(event.getPlayer().getUniqueId()) && requests.contains(event.getPlayer().getUniqueId())) { requests.remove(event.getPlayer().getUniqueId()); diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/proxied/ProxiedListener.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/proxied/ProxiedListener.java index 47f1d8196..b72a81907 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/proxied/ProxiedListener.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/listener/proxied/ProxiedListener.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; +import java.util.logging.Level; /** * Created by Tareko on 18.08.2017. @@ -89,6 +90,11 @@ public void handleProxyPing(ProxyPingEvent event) @EventHandler public void handlePluginMessage(PluginMessageEvent e) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handlePluginMessage", + String.format("Handling plugin message event: %s", e)); if (e.getTag().equals("MC|BSign") || e.getTag().equals("MC|BEdit")) if (CloudProxy.getInstance().getProxyGroup() != null && CloudProxy.getInstance().getProxyGroup().getProxyConfig().getCustomPayloadFixer()) e.setCancelled(true); @@ -97,42 +103,53 @@ public void handlePluginMessage(PluginMessageEvent e) @EventHandler(priority = EventPriority.HIGHEST) public void handlePlayerServerSwitch(ServerSwitchEvent e) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handlePlayerServerSwitch", + String.format("Handling server switch event: %s", e)); CloudPlayer cloudPlayer = CloudProxy.getInstance().getCloudPlayers().get(e.getPlayer().getUniqueId()); cloudPlayer.setServer(e.getPlayer().getServer().getInfo().getName()); CloudAPI.getInstance().getNetworkConnection().sendPacket(new PacketOutUpdateOnlinePlayer(cloudPlayer)); CloudAPI.getInstance().sendCustomSubProxyMessage( - "cloudnet_internal", - "player_server_switch", - new Document("player", cloudPlayer) - .append("server", e.getPlayer().getServer().getInfo().getName()) + "cloudnet_internal", + "player_server_switch", + new Document("player", cloudPlayer) + .append("server", e.getPlayer().getServer().getInfo().getName()) ); if (CloudProxy.getInstance().getProxyGroup() != null && CloudProxy.getInstance().getProxyGroup().getProxyConfig().isEnabled() && - CloudProxy.getInstance().getProxyGroup().getProxyConfig().getTabList().isEnabled()) + CloudProxy.getInstance().getProxyGroup().getProxyConfig().getTabList().isEnabled()) initTabHeaderFooter(e.getPlayer()); } @EventHandler(priority = EventPriority.LOWEST) public void handleLogin(LoginEvent e) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handleLogin", + String.format("Handling login event: %s", e)); PlayerConnection playerConnection = new PlayerConnection( - e.getConnection().getUniqueId(), - e.getConnection().getName(), e.getConnection().getVersion(), - e.getConnection().getAddress().getAddress().getHostAddress(), - e.getConnection().getAddress().getPort(), e.getConnection().isOnlineMode(), - e.getConnection().isLegacy() + e.getConnection().getUniqueId(), + e.getConnection().getName(), e.getConnection().getVersion(), + e.getConnection().getAddress().getAddress().getHostAddress(), + e.getConnection().getAddress().getPort(), e.getConnection().isOnlineMode(), + e.getConnection().isLegacy() ); Document result = CloudAPI.getInstance().getNetworkConnection().getPacketManager().sendQuery(new PacketOutPlayerLoginRequest(playerConnection), - CloudAPI.getInstance().getNetworkConnection()).getResult(); + CloudAPI.getInstance().getNetworkConnection()).getResult(); CloudPlayer cloudPlayer = result.getObject("player", new TypeToken() { }.getType()); if (cloudPlayer == null) { + CloudAPI.getInstance().getLogger().finest("cloudPlayer is null!"); e.setCancelReason(TextComponent.fromLegacyText("§cUnverified login. Reason: §e" + (result.contains("reason") ? result.getString("reason") : "no reason defined"))); e.setCancelled(true); return; @@ -148,9 +165,9 @@ public void handleLogin(LoginEvent e) PermissionCheckEvent permissionCheckEvent = new PermissionCheckEvent(cloudCommandSender, "cloudnet.maintenance", false); if (!proxyConfig.getWhitelist().contains(e.getConnection().getName()) && - !proxyConfig.getWhitelist().contains(e.getConnection().getUniqueId().toString()) - && - !ProxyServer.getInstance().getPluginManager().callEvent(permissionCheckEvent).hasPermission()) + !proxyConfig.getWhitelist().contains(e.getConnection().getUniqueId().toString()) + && + !ProxyServer.getInstance().getPluginManager().callEvent(permissionCheckEvent).hasPermission()) { e.setCancelled(true); e.setCancelReason(ChatColor.translateAlternateColorCodes('&', CloudAPI.getInstance().getCloudNetwork().getMessages().getString("kick-maintenance"))); @@ -181,6 +198,12 @@ public void handleLogin(LoginEvent e) @EventHandler public void handlePost(PostLoginEvent e) { + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handlePost", + String.format("Handling post login event: %s", e)); + CloudProxy.getInstance().update(); CloudAPI.getInstance().getNetworkConnection().sendPacket(new PacketOutLoginSuccess(e.getPlayer().getUniqueId())); @@ -252,11 +275,11 @@ public void handlePermissionCheck(PermissionCheckEvent e) { if (CloudProxy.getInstance().getCloudPlayers().containsKey(((ProxiedPlayer) e.getSender()).getUniqueId())) e.setHasPermission(CloudProxy.getInstance().getCloudPlayers().get(((ProxiedPlayer) e.getSender()).getUniqueId()) - .getPermissionEntity().hasPermission(CloudAPI.getInstance().getPermissionPool(), e.getPermission(), CloudAPI.getInstance().getGroup())); + .getPermissionEntity().hasPermission(CloudAPI.getInstance().getPermissionPool(), e.getPermission(), CloudAPI.getInstance().getGroup())); } else if (e.getSender() instanceof CloudPlayerCommandSender) { e.setHasPermission(((CloudPlayerCommandSender) e.getSender()).getCloudPlayer() - .getPermissionEntity().hasPermission(CloudAPI.getInstance().getPermissionPool(), e.getPermission(), CloudAPI.getInstance().getGroup())); + .getPermissionEntity().hasPermission(CloudAPI.getInstance().getPermissionPool(), e.getPermission(), CloudAPI.getInstance().getGroup())); } } @@ -284,15 +307,19 @@ public void run() @EventHandler(priority = EventPriority.HIGHEST) public void handleServerConnect(ServerConnectEvent event) { - + CloudAPI.getInstance().getLogger().logp( + Level.FINEST, + this.getClass().getSimpleName(), + "handleServerConnect", + String.format("Handling server connect event: %s", event)); if (event.getPlayer().getServer() == null) { String fallback = CloudProxy.getInstance().fallback(event.getPlayer()); ProxiedPlayerFallbackEvent proxiedPlayerFallbackEvent = new ProxiedPlayerFallbackEvent( - event.getPlayer(), - CloudAPI.getInstance().getOnlinePlayer(event.getPlayer().getUniqueId()), - ProxiedPlayerFallbackEvent.FallbackType.SERVER_KICK, - fallback + event.getPlayer(), + CloudAPI.getInstance().getOnlinePlayer(event.getPlayer().getUniqueId()), + ProxiedPlayerFallbackEvent.FallbackType.SERVER_KICK, + fallback ); ProxyServer.getInstance().getPluginManager().callEvent(proxiedPlayerFallbackEvent); @@ -303,12 +330,12 @@ public void handleServerConnect(ServerConnectEvent event) event.setTarget(ProxyServer.getInstance().getServerInfo(fallback)); CloudAPI.getInstance().getNetworkConnection().getChannel().writeAndFlush(new PacketOutCustomSubChannelMessage(DefaultType.BUKKIT, event.getTarget().getName(), "cloudnet_internal", "server_connect_request", new Document("uniqueId", event.getPlayer().getUniqueId()))); - NetworkUtils.sleepUninterruptedly(6); + NetworkUtils.sleepUninterruptedly(25); } else event.setCancelled(true); } else { CloudAPI.getInstance().getNetworkConnection().getChannel().writeAndFlush(new PacketOutCustomSubChannelMessage(DefaultType.BUKKIT, event.getTarget().getName(), "cloudnet_internal", "server_connect_request", new Document("uniqueId", event.getPlayer().getUniqueId()))); - NetworkUtils.sleepUninterruptedly(6); + NetworkUtils.sleepUninterruptedly(25); } } @@ -328,10 +355,10 @@ public void handleServerKick(ServerKickEvent e) } ProxiedPlayerFallbackEvent proxiedPlayerFallbackEvent = new ProxiedPlayerFallbackEvent( - e.getPlayer(), - CloudAPI.getInstance().getOnlinePlayer(e.getPlayer().getUniqueId()), - ProxiedPlayerFallbackEvent.FallbackType.SERVER_KICK, - fallback + e.getPlayer(), + CloudAPI.getInstance().getOnlinePlayer(e.getPlayer().getUniqueId()), + ProxiedPlayerFallbackEvent.FallbackType.SERVER_KICK, + fallback ); ProxyServer.getInstance().getPluginManager().callEvent(proxiedPlayerFallbackEvent); @@ -354,7 +381,7 @@ public void handleOnlineCountUpdate(ProxiedOnlineCountUpdateEvent e) public void run() { if (CloudProxy.getInstance().getProxyGroup() != null && CloudProxy.getInstance().getProxyGroup().getProxyConfig().isEnabled() && - CloudProxy.getInstance().getProxyGroup().getProxyConfig().getTabList().isEnabled()) + CloudProxy.getInstance().getProxyGroup().getProxyConfig().getTabList().isEnabled()) { for (ProxiedPlayer proxiedPlayer : ProxyServer.getInstance().getPlayers()) initTabHeaderFooter(proxiedPlayer); @@ -379,8 +406,8 @@ public void handleChannel(PluginMessageEvent pluginMessageEvent) break; case "fallback": ((ProxiedPlayer) pluginMessageEvent.getReceiver()).connect(ProxyServer.getInstance() - .getServerInfo(CloudProxy.getInstance() - .fallback(((ProxiedPlayer) pluginMessageEvent.getReceiver())))); + .getServerInfo(CloudProxy.getInstance() + .fallback(((ProxiedPlayer) pluginMessageEvent.getReceiver())))); break; case "command": ProxyServer.getInstance().getPluginManager().dispatchCommand(((ProxiedPlayer) pluginMessageEvent.getReceiver()), byteArrayDataInput.readUTF()); @@ -393,22 +420,22 @@ private void initTabHeaderFooter(ProxiedPlayer proxiedPlayer) { TabList tabList = CloudProxy.getInstance().getProxyGroup().getProxyConfig().getTabList(); proxiedPlayer.setTabHeader( - new TextComponent(ChatColor.translateAlternateColorCodes('&', tabList.getHeader() - .replace("%proxy%", CloudAPI.getInstance().getServerId()) - .replace("%server%", (proxiedPlayer.getServer() != null ? proxiedPlayer.getServer().getInfo().getName() : CloudProxy.getInstance().getProxyGroup().getName())) - .replace("%online_players%", CloudAPI.getInstance().getOnlineCount() + NetworkUtils.EMPTY_STRING) - .replace("%max_players%", CloudProxy.getInstance().getProxyGroup().getProxyConfig().getMaxPlayers() + NetworkUtils.EMPTY_STRING) - .replace("%group%", (proxiedPlayer.getServer() != null && CloudProxy.getInstance().getCachedServers().containsKey(proxiedPlayer.getServer().getInfo().getName()) ? CloudProxy.getInstance().getCachedServers().get(proxiedPlayer.getServer().getInfo().getName()).getServiceId().getGroup() : "Hub")) - .replace("%proxy_group%", CloudProxy.getInstance().getProxyGroup().getName()) - )), - new TextComponent(ChatColor.translateAlternateColorCodes('&', tabList.getFooter() - .replace("%proxy%", CloudAPI.getInstance().getServerId()) - .replace("%server%", (proxiedPlayer.getServer() != null ? proxiedPlayer.getServer().getInfo().getName() : CloudProxy.getInstance().getProxyGroup().getName())) - .replace("%online_players%", CloudAPI.getInstance().getOnlineCount() + NetworkUtils.EMPTY_STRING) - .replace("%max_players%", CloudProxy.getInstance().getProxyGroup().getProxyConfig().getMaxPlayers() + NetworkUtils.EMPTY_STRING) - .replace("%group%", (proxiedPlayer.getServer() != null && CloudProxy.getInstance().getCachedServers().containsKey(proxiedPlayer.getServer().getInfo().getName()) ? CloudProxy.getInstance().getCachedServers().get(proxiedPlayer.getServer().getInfo().getName()).getServiceId().getGroup() : "Hub")) - .replace("%proxy_group%", CloudProxy.getInstance().getProxyGroup().getName()) - ))); + new TextComponent(ChatColor.translateAlternateColorCodes('&', tabList.getHeader() + .replace("%proxy%", CloudAPI.getInstance().getServerId()) + .replace("%server%", (proxiedPlayer.getServer() != null ? proxiedPlayer.getServer().getInfo().getName() : CloudProxy.getInstance().getProxyGroup().getName())) + .replace("%online_players%", CloudAPI.getInstance().getOnlineCount() + NetworkUtils.EMPTY_STRING) + .replace("%max_players%", CloudProxy.getInstance().getProxyGroup().getProxyConfig().getMaxPlayers() + NetworkUtils.EMPTY_STRING) + .replace("%group%", (proxiedPlayer.getServer() != null && CloudProxy.getInstance().getCachedServers().containsKey(proxiedPlayer.getServer().getInfo().getName()) ? CloudProxy.getInstance().getCachedServers().get(proxiedPlayer.getServer().getInfo().getName()).getServiceId().getGroup() : "Hub")) + .replace("%proxy_group%", CloudProxy.getInstance().getProxyGroup().getName()) + )), + new TextComponent(ChatColor.translateAlternateColorCodes('&', tabList.getFooter() + .replace("%proxy%", CloudAPI.getInstance().getServerId()) + .replace("%server%", (proxiedPlayer.getServer() != null ? proxiedPlayer.getServer().getInfo().getName() : CloudProxy.getInstance().getProxyGroup().getName())) + .replace("%online_players%", CloudAPI.getInstance().getOnlineCount() + NetworkUtils.EMPTY_STRING) + .replace("%max_players%", CloudProxy.getInstance().getProxyGroup().getProxyConfig().getMaxPlayers() + NetworkUtils.EMPTY_STRING) + .replace("%group%", (proxiedPlayer.getServer() != null && CloudProxy.getInstance().getCachedServers().containsKey(proxiedPlayer.getServer().getInfo().getName()) ? CloudProxy.getInstance().getCachedServers().get(proxiedPlayer.getServer().getInfo().getName()).getServiceId().getGroup() : "Hub")) + .replace("%proxy_group%", CloudProxy.getInstance().getProxyGroup().getName()) + ))); } -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/MobSelector.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/MobSelector.java index 5a80dceaf..233cf53f7 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/MobSelector.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/MobSelector.java @@ -156,7 +156,8 @@ public Inventory create(MobConfig mobConfig, ServerMob mob) private ItemStack transform(MobItemLayout mobItemLayout) { - return ItemStackBuilder.builder(mobItemLayout.getItemId(), 1, mobItemLayout.getSubId()) + Material material = ItemStackBuilder.getMaterialIgnoreVersion(mobItemLayout.getItemName(), mobItemLayout.getItemId()); + return material == null ? null : ItemStackBuilder.builder(material, 1, mobItemLayout.getSubId()) .lore(new ArrayList<>(CollectionWrapper.transform(mobItemLayout.getLore(), new Catcher() { @Override public String doCatch(String key) @@ -168,7 +169,8 @@ public String doCatch(String key) private ItemStack transform(MobItemLayout mobItemLayout, ServerInfo serverInfo) { - return ItemStackBuilder.builder(mobItemLayout.getItemId(), 1, mobItemLayout.getSubId()) + Material material = ItemStackBuilder.getMaterialIgnoreVersion(mobItemLayout.getItemName(), mobItemLayout.getItemId()); + return material == null ? null : ItemStackBuilder.builder(material, 1, mobItemLayout.getSubId()) .lore(new ArrayList<>(CollectionWrapper.transform(mobItemLayout.getLore(), new Catcher() { @Override public String doCatch(String key) @@ -457,7 +459,7 @@ public void handleInventoryClick(InventoryClickEvent e) if (inventories().contains(e.getInventory()) && e.getCurrentItem() != null && e.getSlot() == e.getRawSlot()) { e.setCancelled(true); - if (mobConfig.getItemLayout().getItemId() == e.getCurrentItem().getTypeId()) + if (ItemStackBuilder.getMaterialIgnoreVersion(mobConfig.getItemLayout().getItemName(), mobConfig.getItemLayout().getItemId()) == e.getCurrentItem().getType()) { MobImpl mob = find(e.getInventory()); if (mob.getServerPosition().containsKey(e.getSlot())) @@ -517,10 +519,13 @@ public MobImpl doCatch(ServerMob key) Entity armor = (Entity) armorStand; if (armor.getPassenger() == null && key.getItemId() != null) { - Item item = Bukkit.getWorld(key.getPosition().getWorld()).dropItem(armor.getLocation(), new ItemStack(key.getItemId())); - item.setPickupDelay(Integer.MAX_VALUE); - item.setTicksLived(Integer.MAX_VALUE); - armor.setPassenger(item); + Material material = ItemStackBuilder.getMaterialIgnoreVersion(key.getItemName(), key.getItemId()); + if(material != null) { + Item item = Bukkit.getWorld(key.getPosition().getWorld()).dropItem(armor.getLocation(), new ItemStack(material)); + item.setPickupDelay(Integer.MAX_VALUE); + item.setTicksLived(Integer.MAX_VALUE); + armor.setPassenger(item); + } } } diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/SignSelector.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/SignSelector.java index 4a2eb03a3..3a4661c52 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/SignSelector.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/SignSelector.java @@ -9,6 +9,7 @@ import de.dytanic.cloudnet.api.CloudAPI; import de.dytanic.cloudnet.api.handlers.adapter.NetworkHandlerAdapter; import de.dytanic.cloudnet.bridge.CloudServer; +import de.dytanic.cloudnet.bridge.internal.util.ItemStackBuilder; import de.dytanic.cloudnet.lib.NetworkUtils; import de.dytanic.cloudnet.lib.server.ServerState; import de.dytanic.cloudnet.lib.server.info.ServerInfo; @@ -23,12 +24,15 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.material.MaterialData; import org.bukkit.util.Vector; import java.util.*; @@ -87,7 +91,7 @@ public String doCatch(ServerInfo key) @EventHandler public void handleInteract(PlayerInteractEvent e) { - if ((e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) && (e.getClickedBlock().getType().equals(Material.SIGN_POST) || e.getClickedBlock().getType().equals(Material.WALL_SIGN))) + if ((e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) && e.getClickedBlock() != null && e.getClickedBlock().getState() instanceof org.bukkit.block.Sign) if (containsPosition(e.getClickedBlock().getLocation())) { Sign sign = getSignByPosition(e.getClickedBlock().getLocation()); @@ -272,7 +276,7 @@ public void run() @Override public void run() { - if (location.getBlock().getType().equals(Material.SIGN_POST) || location.getBlock().getType().equals(Material.WALL_SIGN)) + if (location.getBlock().getState() instanceof org.bukkit.block.Sign) try { Location entityLocation = entity.getLocation(); @@ -320,7 +324,7 @@ public void run() String[] layout = updateOfflineAndMaintenance(_signLayout.getSignLayout().clone(), sign); sign.setServerInfo(null); sendUpdateSynchronized(toLocation(sign.getPosition()), layout); - changeBlock(toLocation(sign.getPosition()), _signLayout.getBlockId(), _signLayout.getSubId()); + changeBlock(toLocation(sign.getPosition()), _signLayout.getBlockName(), _signLayout.getBlockId(),_signLayout.getSubId()); continue; } @@ -339,7 +343,7 @@ public void run() String[] layout = updateOfflineAndMaintenance(searchLayer.getSignLayout().clone(), sign); layout = updateOfflineAndMaintenance(layout, sign); sendUpdateSynchronized(location, layout); - changeBlock(location, searchLayer.getBlockId(), searchLayer.getSubId()); + changeBlock(location, searchLayer.getBlockName(), searchLayer.getBlockId(), searchLayer.getSubId()); continue; } @@ -361,7 +365,7 @@ public void run() } updateArray(layout, serverInfo); sendUpdateSynchronized(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { sign.setServerInfo(null); @@ -373,7 +377,7 @@ public void run() sign.setServerInfo(null); String[] layout = updateOfflineAndMaintenance(searchLayer.getSignLayout().clone(), sign); sendUpdateSynchronized(location, layout); - changeBlock(location, searchLayer.getBlockId(), searchLayer.getSubId()); + changeBlock(location, searchLayer.getBlockName(), searchLayer.getBlockId(), searchLayer.getSubId()); } continue; @@ -413,7 +417,7 @@ public void run() sign.setServerInfo(serverInfo); updateArray(layout, serverInfo); sendUpdateSynchronized(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { sign.setServerInfo(null); @@ -426,7 +430,7 @@ public void run() SignLayout _signLayout = getLayout(sign.getTargetGroup(), "maintenance"); String[] layout = updateOfflineAndMaintenance(_signLayout.getSignLayout().clone(), sign); sendUpdateSynchronized(location, layout); - changeBlock(location, _signLayout.getBlockId(), _signLayout.getSubId()); + changeBlock(location, _signLayout.getBlockName(), _signLayout.getBlockId(), _signLayout.getSubId()); } } } @@ -459,7 +463,7 @@ public boolean exists(Sign sign) if (Bukkit.getWorld(sign.getPosition().getWorld()) != null) { Location location = toLocation(sign.getPosition()); - return location.getBlock().getType() == Material.SIGN_POST || location.getBlock().getType() == Material.WALL_SIGN; + return location.getBlock().getState() instanceof org.bukkit.block.Sign; } else { return false; @@ -470,16 +474,23 @@ public boolean exists(Sign sign) } } - public void changeBlock(Location location, int id, int subId) - { - Bukkit.getScheduler().runTask(CloudServer.getInstance().getPlugin(), new Runnable() { - @Override - public void run() - { - if (id != -1 && id != 0 && subId != -1) - { - org.bukkit.material.Sign sign = (org.bukkit.material.Sign) location.getBlock().getState().getData(); - location.getBlock().getRelative(sign.getAttachedFace()).setTypeIdAndData(id, (byte) subId, true); + public void changeBlock(Location location, String blockName, int blockId, int subId) { + Bukkit.getScheduler().runTask(CloudServer.getInstance().getPlugin(), () -> { + Material material = ItemStackBuilder.getMaterialIgnoreVersion(blockName, blockId); + BlockState signBlockState = location.getBlock().getState(); + + if (material != null && subId != -1 && signBlockState instanceof org.bukkit.block.Sign) { + MaterialData materialData = signBlockState.getData(); + + if(materialData instanceof org.bukkit.material.Sign) { // this will return false in newer 1.14 spigot versions, even if it's a sign + org.bukkit.material.Sign materialSign = (org.bukkit.material.Sign) materialData; + if(materialSign.isWallSign()) { + Block backBlock = location.getBlock().getRelative(materialSign.getAttachedFace()); + BlockState blockState = backBlock.getState(); + blockState.setType(material); + blockState.setData(new MaterialData(material, (byte) subId)); + blockState.update(true); + } } } }); @@ -597,7 +608,7 @@ public void handleUpdate(Sign sign, ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(toLocation(sign.getPosition()), layout); - changeBlock(location, _signLayout.getBlockId(), _signLayout.getSubId()); + changeBlock(location, _signLayout.getBlockName(), _signLayout.getBlockId(), _signLayout.getSubId()); return; } @@ -634,7 +645,7 @@ public void handleUpdate(Sign sign, ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { sign.setServerInfo(null); @@ -670,7 +681,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(toLocation(sign.getPosition()), layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); return; } String[] layout; @@ -693,7 +704,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { sign.setServerInfo(null); @@ -719,7 +730,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(toLocation(next.getPosition()), layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); return; } String[] layout; @@ -742,7 +753,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { sign.setServerInfo(null); @@ -751,7 +762,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } } else @@ -772,7 +783,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(toLocation(sign.getPosition()), layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); return; } @@ -796,7 +807,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { newSign.setServerInfo(null); @@ -805,7 +816,7 @@ public void onServerAdd(ServerInfo serverInfo) for (Player all : Bukkit.getOnlinePlayers()) sendUpdate(all, location, layout); sendUpdateSynchronizedTask(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } } } @@ -875,14 +886,14 @@ public void run() sign.setServerInfo(serverInfo); updateArray(layout, serverInfo); sendUpdateSynchronized(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } else { sign.setServerInfo(null); SignLayout signLayout = getSearchingLayout(((ThreadImpl) worker).animationTick); String[] layout = updateOfflineAndMaintenance(signLayout.getSignLayout().clone(), sign); sendUpdateSynchronized(location, layout); - changeBlock(location, signLayout.getBlockId(), signLayout.getSubId()); + changeBlock(location, signLayout.getBlockName(), signLayout.getBlockId(), signLayout.getSubId()); } } else diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/packet/in/PacketInMobSelector.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/packet/in/PacketInMobSelector.java index 05fd9544e..584fb2037 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/packet/in/PacketInMobSelector.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/serverselectors/packet/in/PacketInMobSelector.java @@ -10,6 +10,7 @@ import de.dytanic.cloudnet.bridge.CloudServer; import de.dytanic.cloudnet.bridge.event.bukkit.BukkitMobInitEvent; import de.dytanic.cloudnet.bridge.internal.serverselectors.MobSelector; +import de.dytanic.cloudnet.bridge.internal.util.ItemStackBuilder; import de.dytanic.cloudnet.bridge.internal.util.ReflectionUtil; import de.dytanic.cloudnet.lib.NetworkUtils; import de.dytanic.cloudnet.lib.network.protocol.packet.PacketSender; @@ -39,8 +40,7 @@ public class PacketInMobSelector extends PacketInHandlerDefault { @Override - public void handleInput(Document data, PacketSender packetSender) - { + public void handleInput(Document data, PacketSender packetSender) { Map mobMap = data.getObject("mobs", new TypeToken>() { }.getType()); MobConfig mobConfig = data.getObject("mobConfig", new TypeToken() { @@ -48,53 +48,48 @@ public void handleInput(Document data, PacketSender packetSender) Map filteredMobs = MapWrapper.filter(mobMap, new Acceptable() { @Override - public boolean isAccepted(ServerMob value) - { + public boolean isAccepted(ServerMob value) { return value.getPosition().getGroup().equalsIgnoreCase(CloudAPI.getInstance().getGroup()); } }); - if (MobSelector.getInstance() != null) - { + if (MobSelector.getInstance() != null) { Bukkit.getScheduler().runTask(CloudServer.getInstance().getPlugin(), new Runnable() { @Override - public void run() - { + public void run() { MobSelector.getInstance().shutdown(); MobSelector.getInstance().setMobConfig(mobConfig); MobSelector.getInstance().setMobs(new HashMap<>()); MobSelector.getInstance().setMobs(MapWrapper.transform(filteredMobs, new Catcher() { @Override - public UUID doCatch(UUID key) - { + public UUID doCatch(UUID key) { return key; } }, new Catcher() { @Override - public MobSelector.MobImpl doCatch(ServerMob key) - { + public MobSelector.MobImpl doCatch(ServerMob key) { MobSelector.getInstance().toLocation(key.getPosition()).getChunk().load(); Entity entity = MobSelector.getInstance().toLocation(key.getPosition()).getWorld().spawnEntity(MobSelector.getInstance().toLocation(key.getPosition()), EntityType.valueOf(key.getType())); entity.setFireTicks(0); Object armorStand = ReflectionUtil.armorstandCreation(MobSelector.getInstance().toLocation(key.getPosition()), entity, key); - if (armorStand != null) - { + if (armorStand != null) { MobSelector.getInstance().updateCustom(key, armorStand); Entity armor = (Entity) armorStand; - if (armor.getPassenger() == null && key.getItemId() != null) - { - - Item item = Bukkit.getWorld(key.getPosition().getWorld()).dropItem(armor.getLocation(), new ItemStack(Material.getMaterial(key.getItemId()))); - item.setTicksLived(Integer.MAX_VALUE); - item.setPickupDelay(Integer.MAX_VALUE); - armor.setPassenger(item); + if (armor.getPassenger() == null && key.getItemId() != null) { + + Material material = ItemStackBuilder.getMaterialIgnoreVersion(key.getItemName(), key.getItemId()); + if(material != null) { + Item item = Bukkit.getWorld(key.getPosition().getWorld()).dropItem(armor.getLocation(), new ItemStack(material)); + item.setTicksLived(Integer.MAX_VALUE); + item.setPickupDelay(Integer.MAX_VALUE); + armor.setPassenger(item); + } } } - if (entity instanceof Villager) - { + if (entity instanceof Villager) { ((Villager) entity).setProfession(Villager.Profession.FARMER); } @@ -108,10 +103,8 @@ public MobSelector.MobImpl doCatch(ServerMob key) })); Bukkit.getScheduler().runTaskAsynchronously(CloudServer.getInstance().getPlugin(), new Runnable() { @Override - public void run() - { - for (ServerInfo serverInfo : MobSelector.getInstance().getServers().values()) - { + public void run() { + for (ServerInfo serverInfo : MobSelector.getInstance().getServers().values()) { MobSelector.getInstance().handleUpdate(serverInfo); } } @@ -119,43 +112,39 @@ public void run() } }); - } else - { + } else { MobSelector mobSelector = new MobSelector(mobConfig); MobSelector.getInstance().setMobs(new HashMap<>()); Bukkit.getScheduler().runTask(CloudServer.getInstance().getPlugin(), new Runnable() { @Override - public void run() - { + public void run() { MobSelector.getInstance().setMobs(MapWrapper.transform(filteredMobs, new Catcher() { @Override - public UUID doCatch(UUID key) - { + public UUID doCatch(UUID key) { return key; } }, new Catcher() { @Override - public MobSelector.MobImpl doCatch(ServerMob key) - { + public MobSelector.MobImpl doCatch(ServerMob key) { MobSelector.getInstance().toLocation(key.getPosition()).getChunk().load(); Entity entity = MobSelector.getInstance().toLocation(key.getPosition()).getWorld().spawnEntity(MobSelector.getInstance().toLocation(key.getPosition()), EntityType.valueOf(key.getType())); Object armorStand = ReflectionUtil.armorstandCreation(MobSelector.getInstance().toLocation(key.getPosition()), entity, key); - if (armorStand != null) - { + if (armorStand != null) { MobSelector.getInstance().updateCustom(key, armorStand); Entity armor = (Entity) armorStand; - if (armor.getPassenger() == null && key.getItemId() != null) - { - Item item = Bukkit.getWorld(key.getPosition().getWorld()).dropItem(armor.getLocation(), new ItemStack(Material.getMaterial(key.getItemId()))); - item.setTicksLived(Integer.MAX_VALUE); - item.setPickupDelay(Integer.MAX_VALUE); - armor.setPassenger(item); + if (armor.getPassenger() == null && key.getItemId() != null) { + Material material = ItemStackBuilder.getMaterialIgnoreVersion(key.getItemName(), key.getItemId()); + if (material != null) { + Item item = Bukkit.getWorld(key.getPosition().getWorld()).dropItem(armor.getLocation(), new ItemStack(material)); + item.setTicksLived(Integer.MAX_VALUE); + item.setPickupDelay(Integer.MAX_VALUE); + armor.setPassenger(item); + } } } - if (entity instanceof Villager) - { + if (entity instanceof Villager) { ((Villager) entity).setProfession(Villager.Profession.FARMER); } diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/CloudPermissible.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/CloudPermissible.java index 1086291db..c12a3a1fb 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/CloudPermissible.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/CloudPermissible.java @@ -7,15 +7,16 @@ import de.dytanic.cloudnet.api.CloudAPI; import de.dytanic.cloudnet.bridge.CloudServer; import de.dytanic.cloudnet.lib.player.CloudPlayer; +import de.dytanic.cloudnet.lib.player.permission.PermissionEntity; +import de.dytanic.cloudnet.lib.player.permission.PermissionGroup; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissibleBase; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionAttachmentInfo; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; /** * Created by Tareko on 18.08.2017. @@ -24,65 +25,94 @@ public class CloudPermissible extends PermissibleBase { private UUID uniqueId; - public CloudPermissible(Player player) - { + private Map permissions = new ConcurrentHashMap<>(); + + public CloudPermissible(Player player) { super(player); this.uniqueId = player.getUniqueId(); player.setOp(false); + recalculatePermissions(); } @Override - public Set getEffectivePermissions() - { - final Map permissions = CloudServer.getInstance().getCloudPlayers().get(this.uniqueId).getPermissionEntity().getPermissions(); - Set set = new HashSet<>(); - for (Map.Entry entry : permissions.entrySet()) - { - PermissionAttachmentInfo permissionAttachmentInfo = new PermissionAttachmentInfo(this, entry.getKey(), null, entry.getValue()); - set.add(permissionAttachmentInfo); + public Set getEffectivePermissions() { + return new HashSet<>(permissions.values()); + } + + @Override + public void recalculatePermissions() { + if (this.permissions != null) { + this.permissions.clear(); + } else { + this.permissions = new ConcurrentHashMap<>(); } - return set; + + if (this.uniqueId == null) return; + + PermissionEntity permissionEntity = CloudServer.getInstance().getCloudPlayers().get(this.uniqueId).getPermissionEntity(); + final Map playerPermissions = permissionEntity.getPermissions(); + playerPermissions.forEach((key, value) -> { + PermissionAttachmentInfo permissionAttachmentInfo = new PermissionAttachmentInfo(this, key, null, value); + permissions.put(key, permissionAttachmentInfo); + }); + permissionEntity.getGroups().stream() + .filter(g -> g.getTimeout() > System.currentTimeMillis()) + .map(g -> CloudAPI.getInstance().getPermissionGroup(g.getGroup())) + .filter(Objects::nonNull) + .flatMap(g -> { + Stream.Builder builder = Stream.builder().add(g); + g.getImplementGroups().stream() + .map(i -> CloudAPI.getInstance().getPermissionGroup(i)) + .filter(Objects::nonNull) + .forEach(builder); + + return builder.build(); + }) + .forEach(g -> { + g.getPermissions().forEach((key, value) -> { + PermissionAttachmentInfo permissionAttachmentInfo = new PermissionAttachmentInfo(this, key, null, value); + permissions.put(key, permissionAttachmentInfo); + }); + }); } @Override - public boolean isPermissionSet(String name) - { + public boolean isPermissionSet(String name) { return hasPermission(name); } @Override - public boolean isPermissionSet(Permission perm) - { + public boolean isPermissionSet(Permission perm) { return hasPermission(perm.getName()); } @Override - public boolean hasPermission(Permission perm) - { + public boolean hasPermission(Permission perm) { return hasPermission(perm.getName()); } @Override - public boolean hasPermission(String inName) - { + public boolean hasPermission(String inName) { if (inName.equalsIgnoreCase("bukkit.broadcast.user")) return true; CloudPlayer cloudPlayer = CloudServer.getInstance().getCloudPlayers().get(this.uniqueId); - if (cloudPlayer != null) - return cloudPlayer.getPermissionEntity().hasPermission(CloudAPI.getInstance().getPermissionPool(), inName, CloudAPI.getInstance().getGroup()); - else + + if (cloudPlayer != null) { + boolean hasPermission = cloudPlayer.getPermissionEntity().hasPermission(CloudAPI.getInstance().getPermissionPool(), inName, CloudAPI.getInstance().getGroup()); + CloudAPI.getInstance().getLogger().finest(cloudPlayer.getName() + " hasPermission \"" + inName + "\": " + hasPermission); + return hasPermission; + + } else return false; } @Override - public boolean isOp() - { + public boolean isOp() { return false; } - public UUID getUniqueId() - { + public UUID getUniqueId() { return uniqueId; } } diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/ItemStackBuilder.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/ItemStackBuilder.java index 9124e2aa4..d67ee01af 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/ItemStackBuilder.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/internal/util/ItemStackBuilder.java @@ -4,6 +4,7 @@ package de.dytanic.cloudnet.bridge.internal.util; +import de.dytanic.cloudnet.api.CloudAPI; import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; @@ -14,6 +15,7 @@ import java.util.Arrays; import java.util.List; +import java.util.logging.Level; /** * Created by Tareko on 26.08.2017. @@ -29,6 +31,10 @@ public ItemStackBuilder(Material material) this.itemMeta = itemStack.getItemMeta(); } + /** + * @deprecated will only work in versions lower than 1.13 + */ + @Deprecated public ItemStackBuilder(int material) { this.itemStack = new ItemStack(Material.getMaterial(material)); @@ -41,6 +47,10 @@ public ItemStackBuilder(Material material, int amount) this.itemMeta = itemStack.getItemMeta(); } + /** + * @deprecated will only work in versions lower than 1.13 + */ + @Deprecated public ItemStackBuilder(int material, int amount) { this.itemStack = new ItemStack(material, amount); @@ -53,12 +63,39 @@ public ItemStackBuilder(Material material, int amount, int sub) this.itemMeta = itemStack.getItemMeta(); } + /** + * @deprecated will only work in versions lower than 1.13 + */ + @Deprecated public ItemStackBuilder(int material, int amount, int sub) { - this.itemStack = new ItemStack(Material.getMaterial(material), amount, (short) sub); + this.itemStack = new ItemStack(material, amount, (short) sub); this.itemMeta = itemStack.getItemMeta(); } + /** + * Gets a Material whether by name or by id if not used in MC 1.13+ + * + * @param name the materialName of the wanted material or null when the id should be used + * @param id the materialId of the wanted material or any other number when the name should be used + * @return the material or null if not existing + */ + public static Material getMaterialIgnoreVersion(String name, int id) { + if(name == null) { + try { + return Material.getMaterial(id); + } catch (ExceptionInInitializerError | NoSuchMethodError exception) { + CloudAPI.getInstance().getLogger().logp(Level.WARNING, + ItemStackBuilder.class.getSimpleName(), + "getMaterialIgnoreVersion", + String.format("Can't get material by id %d! Beginning with MC 1.13 you HAVE to use material names!", id), + exception); + return null; + } + } + return Material.getMaterial(name); + } + public static ItemStackBuilder builder(Material material) { return new ItemStackBuilder(material); @@ -74,21 +111,34 @@ public static ItemStackBuilder builder(Material material, int amount, int sub) return new ItemStackBuilder(material, amount, sub); } + /** + * @deprecated will only work in versions lower than 1.13 + */ + @Deprecated public static ItemStackBuilder builder(int material) { return new ItemStackBuilder(material); } + /** + * @deprecated will only work in versions lower than 1.13 + */ + @Deprecated public static ItemStackBuilder builder(int material, int amount) { return new ItemStackBuilder(material, amount); } + /** + * @deprecated will only work in versions lower than 1.13 + */ + @Deprecated public static ItemStackBuilder builder(int material, int amount, int sub) { return new ItemStackBuilder(material, amount, sub); } + public ItemStackBuilder enchantment(Enchantment enchantment, int value) { itemMeta.addEnchant(enchantment, value, true); diff --git a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/vault/VaultPermissionImpl.java b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/vault/VaultPermissionImpl.java index 259fe43c8..d58503e74 100644 --- a/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/vault/VaultPermissionImpl.java +++ b/cloudnet-api/cloudnet-api-bridge/src/main/java/de/dytanic/cloudnet/bridge/vault/VaultPermissionImpl.java @@ -6,189 +6,157 @@ import de.dytanic.cloudnet.lib.player.permission.GroupEntityData; import de.dytanic.cloudnet.lib.player.permission.PermissionEntity; import de.dytanic.cloudnet.lib.player.permission.PermissionGroup; -import de.dytanic.cloudnet.lib.utility.Acceptable; -import de.dytanic.cloudnet.lib.utility.CollectionWrapper; +import lombok.val; import net.milkbowl.vault.permission.Permission; +import java.util.Optional; + /** * Created by Tareko on 25.11.2017. */ public class VaultPermissionImpl extends Permission { @Override - public String getName() - { + public String getName() { return "CloudNet-Permission"; } @Override - public boolean isEnabled() - { + public boolean isEnabled() { return CloudAPI.getInstance().getPermissionPool() != null; } @Override - public boolean hasSuperPermsCompat() - { + public boolean hasSuperPermsCompat() { return true; } @Override - public boolean playerHas(String s, String s1, String s2) - { - PermissionEntity permissionEntity = getPlayer(s1).getPermissionEntity(); - return permissionEntity.hasPermission(CloudAPI.getInstance().getPermissionPool(), s2, null); + public boolean playerHas(String world, String player, String permission) { + val offlinePlayer = getPlayer(player); + PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); + val hasPermission = permissionEntity.hasPermission(CloudAPI.getInstance().getPermissionPool(), permission, null); + CloudAPI.getInstance().getLogger().finest(player + " hasPermission \"" + permission + "\": " + hasPermission); + return hasPermission; } @Override - public boolean playerAdd(String s, String s1, String s2) - { - OfflinePlayer offlinePlayer = getPlayer(s1); + public boolean playerAdd(String world, String player, String permission) { + OfflinePlayer offlinePlayer = getPlayer(player); PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); - permissionEntity.getPermissions().put(s2, true); + permissionEntity.getPermissions().put(permission, true); offlinePlayer.setPermissionEntity(permissionEntity); updatePlayer(offlinePlayer); + CloudAPI.getInstance().getLogger().finest(player + " added permission \"" + permission + '"'); return true; } @Override - public boolean playerRemove(String s, String s1, String s2) - { - OfflinePlayer offlinePlayer = getPlayer(s1); + public boolean playerRemove(String world, String player, String permission) { + OfflinePlayer offlinePlayer = getPlayer(player); PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); - permissionEntity.getPermissions().remove(s2); + permissionEntity.getPermissions().remove(permission); offlinePlayer.setPermissionEntity(permissionEntity); updatePlayer(offlinePlayer); + CloudAPI.getInstance().getLogger().finest(player + " removed permission \"" + permission + '"'); return true; } @Override - public boolean groupHas(String s, String s1, String s2) - { - OfflinePlayer offlinePlayer = getPlayer(s1); - PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); - return permissionEntity.isInGroup(s2); + public boolean groupHas(String world, String group, String permission) { + PermissionGroup permissionGroup = CloudAPI.getInstance().getPermissionGroup(group); + return permissionGroup.getPermissions().getOrDefault(permission, false); } @Override - public boolean groupAdd(String s, String s1, String s2) - { - PermissionGroup permissionGroup = CloudAPI.getInstance().getPermissionGroup(s1); - permissionGroup.getPermissions().put(s2, true); + public boolean groupAdd(String world, String group, String permission) { + PermissionGroup permissionGroup = CloudAPI.getInstance().getPermissionGroup(group); + permissionGroup.getPermissions().put(permission, true); CloudAPI.getInstance().updatePermissionGroup(permissionGroup); + CloudAPI.getInstance().getLogger().finest(group + " added permission \"" + permission + '"'); return true; } @Override - public boolean groupRemove(String s, String s1, String s2) - { - PermissionGroup permissionGroup = CloudAPI.getInstance().getPermissionGroup(s1); - permissionGroup.getPermissions().remove(s2); + public boolean groupRemove(String world, String group, String permission) { + PermissionGroup permissionGroup = CloudAPI.getInstance().getPermissionGroup(group); + permissionGroup.getPermissions().remove(permission); CloudAPI.getInstance().updatePermissionGroup(permissionGroup); + CloudAPI.getInstance().getLogger().finest(group + " removed permission \"" + permission + '"'); return true; } @Override - public boolean playerInGroup(String s, String s1, String s2) - { - OfflinePlayer offlinePlayer = getPlayer(s1); + public boolean playerInGroup(String world, String player, String group) { + OfflinePlayer offlinePlayer = getPlayer(player); PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); - return permissionEntity.isInGroup(s2); + return permissionEntity.isInGroup(group); } @Override - public boolean playerAddGroup(String s, String s1, String s2) - { - OfflinePlayer offlinePlayer = getPlayer(s1); + public boolean playerAddGroup(String world, String player, String group) { + OfflinePlayer offlinePlayer = getPlayer(player); PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); - GroupEntityData groupEntityData = CollectionWrapper.filter(permissionEntity.getGroups(), new Acceptable() { - @Override - public boolean isAccepted(GroupEntityData groupEntityData) - { - return groupEntityData.getGroup().equalsIgnoreCase(s2); - } - }); - - if (groupEntityData != null) - { - permissionEntity.getGroups().remove(groupEntityData); - groupEntityData = new GroupEntityData(groupEntityData.getGroup(), 0); - } else - { - groupEntityData = new GroupEntityData(groupEntityData.getGroup(), 0); - } - - permissionEntity.getGroups().add(groupEntityData); + Optional groupEntityData = permissionEntity.getGroups().stream() + .filter(ged -> ged.getGroup().equalsIgnoreCase(group)) + .findFirst(); + groupEntityData.ifPresent(entityData -> permissionEntity.getGroups().remove(entityData)); + + permissionEntity.getGroups().add(new GroupEntityData(group, 0)); offlinePlayer.setPermissionEntity(permissionEntity); updatePlayer(offlinePlayer); + CloudAPI.getInstance().getLogger().finest(player + " added to group \"" + group + '"'); return true; } @Override - public boolean playerRemoveGroup(String s, String s1, String s2) - { - OfflinePlayer offlinePlayer = getPlayer(s1); + public boolean playerRemoveGroup(String world, String player, String group) { + OfflinePlayer offlinePlayer = getPlayer(player); PermissionEntity permissionEntity = offlinePlayer.getPermissionEntity(); + permissionEntity.getGroups().stream() + .filter(ged -> ged.getGroup().equalsIgnoreCase(group)) + .findFirst() + .ifPresent(ged -> { + permissionEntity.getGroups().remove(ged); + }); - GroupEntityData groupEntityData = CollectionWrapper.filter(permissionEntity.getGroups(), new Acceptable() { - @Override - public boolean isAccepted(GroupEntityData groupEntityData) - { - return groupEntityData.getGroup().equalsIgnoreCase(s2); - } - }); - - if (groupEntityData != null) permissionEntity.getGroups().remove(groupEntityData); offlinePlayer.setPermissionEntity(permissionEntity); updatePlayer(offlinePlayer); + CloudAPI.getInstance().getLogger().finest(player + " removed from group \"" + group + '"'); return true; } @Override - public String[] getPlayerGroups(String s, String s1) - { - PermissionEntity permissionEntity = getPlayer(s1).getPermissionEntity(); - String[] data = new String[permissionEntity.getGroups().size()]; - short i = 0; - for (GroupEntityData groupEntityData : permissionEntity.getGroups()) - { - data[i++] = groupEntityData.getGroup(); - } - return data; + public String[] getPlayerGroups(String world, String player) { + PermissionEntity permissionEntity = getPlayer(player).getPermissionEntity(); + return (String[]) permissionEntity.getGroups().stream() + .map(GroupEntityData::getGroup) + .toArray(); } @Override - public String getPrimaryGroup(String s, String s1) - { - return getPlayer(s1).getPermissionEntity().getHighestPermissionGroup( + public String getPrimaryGroup(String world, String player) { + return getPlayer(player).getPermissionEntity().getHighestPermissionGroup( CloudAPI.getInstance().getPermissionPool() ).getName(); } @Override - public String[] getGroups() - { - String[] groups = new String[CloudAPI.getInstance().getPermissionPool().getGroups().size()]; - int i = 0; - for (String group : CloudAPI.getInstance().getPermissionPool().getGroups().keySet()) groups[i++] = group; - - return groups; + public String[] getGroups() { + return CloudAPI.getInstance().getPermissionPool().getGroups().keySet().toArray(new String[0]); } @Override - public boolean hasGroupSupport() - { + public boolean hasGroupSupport() { return true; } - private void updatePlayer(OfflinePlayer offlinePlayer) - { + private void updatePlayer(OfflinePlayer offlinePlayer) { CloudAPI.getInstance().updatePlayer(offlinePlayer); } - private OfflinePlayer getPlayer(String name) - { + private OfflinePlayer getPlayer(String name) { OfflinePlayer offlinePlayer = CloudServer.getInstance().getCachedPlayer(name); if (offlinePlayer == null) @@ -196,5 +164,4 @@ private OfflinePlayer getPlayer(String name) return offlinePlayer; } - -} \ No newline at end of file +} diff --git a/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/CloudAPI.java b/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/CloudAPI.java index 0fe50c499..24a729bf4 100644 --- a/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/CloudAPI.java +++ b/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/CloudAPI.java @@ -40,6 +40,8 @@ import java.util.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.Level; +import java.util.logging.Logger; public final class CloudAPI implements MetaObj { @@ -60,6 +62,12 @@ public final class CloudAPI implements MetaObj { private NetworkHandlerProvider networkHandlerProvider = new NetworkHandlerProvider(); private DatabaseManager databaseManager = new DatabaseManager(); + /** + * Logger instance set by the respective bootstrap. + * Don't use in constructor! + */ + private Logger logger; + public CloudAPI(CloudConfigLoader loader, Runnable cancelTask) { instance = this; @@ -116,6 +124,11 @@ public void shutdown() public CloudAPI update(ServerInfo serverInfo) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "update", + String.format("Updating server info: %s", serverInfo)); if (networkConnection.isConnected()) networkConnection.sendPacket(new PacketOutUpdateServerInfo(serverInfo)); return this; @@ -123,6 +136,11 @@ public CloudAPI update(ServerInfo serverInfo) public CloudAPI update(ProxyInfo proxyInfo) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "update", + String.format("Updating proxy info: %s", proxyInfo)); if (networkConnection.isConnected()) networkConnection.sendPacket(new PacketOutUpdateProxyInfo(proxyInfo)); return this; @@ -431,6 +449,11 @@ public void updateServerGroup(ServerGroup serverGroup) */ public void updatePermissionGroup(PermissionGroup permissionGroup) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "updatePermissionGroup", + String.format("Updating permission group: %s", permissionGroup)); networkConnection.sendPacket(new PacketOutUpdatePermissionGroup(permissionGroup)); } @@ -441,6 +464,11 @@ public void updatePermissionGroup(PermissionGroup permissionGroup) */ public void updateProxyGroup(ProxyGroup proxyGroup) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "updateProxyGroup", + String.format("Updating proxy group: %s", proxyGroup)); networkConnection.sendPacket(new PacketOutUpdateProxyGroup(proxyGroup)); } @@ -449,6 +477,11 @@ public void updateProxyGroup(ProxyGroup proxyGroup) */ public void sendCloudCommand(String commandLine) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "sendCloudCommand", + String.format("Sending cloud command: %s", commandLine)); networkConnection.sendPacket(new PacketOutExecuteCommand(commandLine)); } @@ -459,6 +492,11 @@ public void sendCloudCommand(String commandLine) */ public void dispatchConsoleMessage(String output) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "dispatchConsoleMessage", + String.format("Dispatching console message: %s", output)); networkConnection.sendPacket(new PacketOutDispatchConsoleMessage(output)); } @@ -471,6 +509,11 @@ public void dispatchConsoleMessage(String output) */ public void sendConsoleMessage(DefaultType defaultType, String serverId, String commandLine) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "sendConsoleMessage", + String.format("Sending console message: %s %s %s", defaultType, serverId, commandLine)); networkConnection.sendPacket(new PacketOutServerDispatchCommand(defaultType, serverId, commandLine)); } @@ -487,10 +530,15 @@ public Map getProxyGroupMap() /** * Stop a game server with the parameter of the serverId * - * @param serverId + * @param serverId the server-id to stop */ public void stopServer(String serverId) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "stopServer", + String.format("Stopping server: %s", serverId)); networkConnection.sendPacket(new PacketOutStopServer(serverId)); } @@ -499,6 +547,11 @@ public void stopServer(String serverId) */ public void stopProxy(String proxyId) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "stopProxy", + String.format("Stopping proxy: %s", proxyId)); networkConnection.sendPacket(new PacketOutStopProxy(proxyId)); } @@ -509,6 +562,11 @@ public void stopProxy(String proxyId) */ public String createServerLogUrl(String serverId) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "createServerLogUrl", + String.format("Creating server log url: %s", serverId)); String rnd = NetworkUtils.randomString(10); networkConnection.sendPacket(new PacketOutCreateServerLog(rnd, serverId)); ConnectableAddress connectableAddress = cloudConfigLoader.loadConnnection(); @@ -584,6 +642,11 @@ public void startProxy(WrapperInfo wrapperInfo, ProxyGroup proxyGroup, int memor */ public void startProxy(ProxyGroup proxyGroup, int memory, String[] processParameters, String url, Collection plugins, Document properties) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startProxy", + String.format("Starting proxy: %s, %d, %s, %s, %s, %s", proxyGroup, memory, Arrays.toString(processParameters), url, plugins, properties)); networkConnection.sendPacket(new PacketOutStartProxy(proxyGroup, memory, processParameters, url, plugins, properties)); } @@ -594,6 +657,11 @@ public void startProxy(ProxyGroup proxyGroup, int memory, String[] processParame */ public void startProxy(WrapperInfo wrapperInfo, ProxyGroup proxyGroup, int memory, String[] processParameters, String url, Collection plugins, Document properties) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startProxy", + String.format("Starting proxy: %s, %s, %d, %s, %s, %s, %s", wrapperInfo, proxyGroup, memory, Arrays.toString(processParameters), url, plugins, properties)); networkConnection.sendPacket(new PacketOutStartProxy(wrapperInfo.getServerId(), proxyGroup, memory, processParameters, url, plugins, properties)); } @@ -867,6 +935,11 @@ public void startGameServer(WrapperInfo wrapperInfo, SimpleServerGroup simpleSer */ public void startGameServer(SimpleServerGroup simpleServerGroup, ServerConfig serverConfig, int memory, String[] processParameters, Template template, String customServerName, boolean onlineMode, boolean priorityStop, Properties properties, String url, Collection plugins) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startGameServer", + String.format("Starting game server: %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s", simpleServerGroup, serverConfig, memory, Arrays.toString(processParameters), template, customServerName, onlineMode, priorityStop, properties, url, plugins)); networkConnection.sendPacket(new PacketOutStartServer(simpleServerGroup.getName(), memory, serverConfig, properties, priorityStop, processParameters, template, customServerName, onlineMode, plugins, url)); } @@ -886,6 +959,11 @@ public void startGameServer(SimpleServerGroup simpleServerGroup, ServerConfig se */ public void startGameServer(SimpleServerGroup simpleServerGroup, ServerConfig serverConfig, int memory, String[] processParameters, Template template, String customServerName, boolean onlineMode, boolean priorityStop, Properties properties, String url, Collection plugins, String serverId) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startGameServer", + String.format("Starting game server: %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s", simpleServerGroup, serverConfig, memory, Arrays.toString(processParameters), template, customServerName, onlineMode, priorityStop, properties, url, plugins, serverId)); networkConnection.sendPacket(new PacketOutStartServer(simpleServerGroup.getName(), memory, serverConfig, properties, priorityStop, processParameters, template, customServerName, onlineMode, plugins, url)); } @@ -905,6 +983,11 @@ public void startGameServer(SimpleServerGroup simpleServerGroup, ServerConfig se */ public void startGameServer(WrapperInfo wrapperInfo, SimpleServerGroup simpleServerGroup, ServerConfig serverConfig, int memory, String[] processParameters, Template template, String customServerName, boolean onlineMode, boolean priorityStop, Properties properties, String url, Collection plugins) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startGameServer", + String.format("Starting game server: %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s", wrapperInfo, simpleServerGroup, serverConfig, memory, Arrays.toString(processParameters), template, customServerName, onlineMode, priorityStop, properties, url, plugins)); networkConnection.sendPacket(new PacketOutStartServer(wrapperInfo, simpleServerGroup.getName(), memory, serverConfig, properties, priorityStop, processParameters, template, customServerName, onlineMode, plugins, url)); } @@ -924,6 +1007,11 @@ public void startGameServer(WrapperInfo wrapperInfo, SimpleServerGroup simpleSer */ public void startGameServer(WrapperInfo wrapperInfo, SimpleServerGroup simpleServerGroup, String serverId, ServerConfig serverConfig, int memory, String[] processParameters, Template template, String customServerName, boolean onlineMode, boolean priorityStop, Properties properties, String url, Collection plugins) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startGameServer", + String.format("Starting game server: %s, %s, %s, %s, %d, %s, %s, %s, %s, %s, %s, %s, %s", wrapperInfo, simpleServerGroup, serverId, serverConfig, memory, Arrays.toString(processParameters), template, customServerName, onlineMode, priorityStop, properties, url, plugins)); networkConnection.sendPacket(new PacketOutStartServer(wrapperInfo, simpleServerGroup.getName(), serverId, memory, serverConfig, properties, priorityStop, processParameters, template, customServerName, onlineMode, plugins, url)); } @@ -949,6 +1037,11 @@ public void startCloudServer(WrapperInfo wrapperInfo, String serverName, ServerC public void startCloudServer(WrapperInfo wrapperInfo, String serverName, ServerConfig serverConfig, int memory, boolean priorityStop, String[] processPreParameters, Collection plugins, Properties properties, ServerGroupType serverGroupType) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startCloudServer", + String.format("Starting cloud server: %s, %s, %s, %d, %s, %s, %s, %s, %s", wrapperInfo, serverName, serverConfig, memory, priorityStop, Arrays.toString(processPreParameters), plugins, properties, serverGroupType)); networkConnection.sendPacket(new PacketOutStartCloudServer(wrapperInfo, serverName, serverConfig, memory, priorityStop, processPreParameters, plugins, properties, serverGroupType)); } @@ -974,6 +1067,11 @@ public void startCloudServer(String serverName, ServerConfig serverConfig, int m public void startCloudServer(String serverName, ServerConfig serverConfig, int memory, boolean priorityStop, String[] processPreParameters, Collection plugins, Properties properties, ServerGroupType serverGroupType) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "startCloudServer", + String.format("Starting cloud server: %s, %s, %d, %s, %s, %s, %s, %s", serverName, serverConfig, memory, priorityStop, Arrays.toString(processPreParameters), plugins, properties, serverGroupType)); networkConnection.sendPacket(new PacketOutStartCloudServer(serverName, serverConfig, memory, priorityStop, processPreParameters, plugins, properties, serverGroupType)); } @@ -986,6 +1084,11 @@ public void startCloudServer(String serverName, ServerConfig serverConfig, int m */ public void updatePlayer(CloudPlayer cloudPlayer) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "updatePlayer", + String.format(String.format("Updating cloud player: %s", cloudPlayer))); networkConnection.sendPacket(new PacketOutUpdatePlayer(CloudPlayer.newOfflinePlayer(cloudPlayer))); } @@ -996,6 +1099,11 @@ public void updatePlayer(CloudPlayer cloudPlayer) */ public void updatePlayer(OfflinePlayer offlinePlayer) { + this.logger.logp( + Level.FINEST, + this.getClass().getSimpleName(), + "updatePlayer", + String.format("Updating offline player: %s", offlinePlayer)); networkConnection.sendPacket(new PacketOutUpdatePlayer(offlinePlayer)); } @@ -1225,4 +1333,23 @@ private CloudPlayer checkAndGet(String name) return cloudService != null ? cloudService.getCachedPlayer(name) : null; } + public Logger getLogger() { + return logger; + } + + public void setLogger(Logger logger) { + this.logger = logger; + } + + public boolean isDebug() { + return logger.isLoggable(Level.FINEST); + } + + public void setDebug(boolean debug) { + if (debug) { + logger.setLevel(Level.ALL); + } else { + logger.setLevel(Level.INFO); + } + } } diff --git a/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/player/PermissionProvider.java b/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/player/PermissionProvider.java index f23318cc0..85cc5fbc5 100644 --- a/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/player/PermissionProvider.java +++ b/cloudnet-api/cloudnet-api-core/src/main/java/de/dytanic/cloudnet/api/player/PermissionProvider.java @@ -16,7 +16,7 @@ public final class PermissionProvider { private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy-HH:mm:ss"); /** - * Update the given player in the player database. + * Updates the given player in the player database. * * @param offlinePlayer the player to update */ @@ -36,7 +36,7 @@ public static void updatePermissionGroup(PermissionGroup permissionGroup) } /** - * Calculate the permission group timeout for the given days in future. + * Calculates the permission group timeout for the given days in future. * * @param value the amount of days * @return timeout value for use with {@link PermissionGroup} @@ -244,15 +244,19 @@ public static Collection getImplementedGroups(String groupName) } /** - * Gets the join power of the given player by their highest permission group. + * Gets the highest join power of the given player. * * @param player the player - * @return the join power of the highest permission group of the player + * @return the highest join power * @see PermissionGroup */ public static int getJoinPower(OfflinePlayer player) { - return player.getPermissionEntity().getHighestPermissionGroup(CloudAPI.getInstance().getPermissionPool()).getJoinPower(); + PermissionPool permissionPool = CloudAPI.getInstance().getPermissionPool(); + return player.getPermissionEntity().getGroups().stream() + .mapToInt(groupEntityData -> permissionPool.getGroups().get(groupEntityData.getGroup()).getJoinPower()) + .max() + .orElse(0); } /** diff --git a/cloudnet-api/pom.xml b/cloudnet-api/pom.xml index 005fd99f9..eb66170ae 100644 --- a/cloudnet-api/pom.xml +++ b/cloudnet-api/pom.xml @@ -24,12 +24,11 @@ cloudnet-repo https://cloudnetservice.eu/repositories - spigot-repo https://hub.spigotmc.org/nexus/content/repositories/snapshots/ - --> @@ -41,8 +40,8 @@ org.spigotmc - spigot - ${dependency.spigot.version} + spigot-api + ${dependency.spigot.version} provided diff --git a/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/CloudFlareService.java b/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/CloudFlareService.java index d66666fd5..0fce47a9e 100644 --- a/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/CloudFlareService.java +++ b/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/CloudFlareService.java @@ -105,6 +105,8 @@ public boolean shutdown(CloudFlareDatabase cloudFlareDatabase) for (MultiValue id : cloudFlareDatabase.getAndRemove().values()) { + if (id.getFirst() == null) continue; + this.deleteRecord(id.getFirst()); NetworkUtils.sleepUninterruptedly(500); } @@ -140,35 +142,36 @@ public void addProxy(ProxyProcessMeta proxyServer, CloudFlareDatabase cloudFlare if (cloudFlareProxyGroup.getSub().startsWith("@")) { srvRecord = new SRVRecord( - "_minecraft._tcp." + cloudFlareConfig.getDomainName(), - "SRV 1 1 " + proxyServer.getPort() + " " + proxyServer.getServiceId().getWrapperId() + "." + - cloudFlareConfig.getDomainName(), - "_minecraft", - "_tcp", + "_minecraft._tcp." + cloudFlareConfig.getDomainName(), + "SRV 1 1 " + proxyServer.getPort() + " " + proxyServer.getServiceId().getWrapperId() + "." + cloudFlareConfig.getDomainName(), - 1, - 1, - proxyServer.getPort(), - proxyServer.getServiceId().getWrapperId() + "." + cloudFlareConfig.getDomainName() + "_minecraft", + "_tcp", + cloudFlareConfig.getDomainName(), + 1, + 1, + proxyServer.getPort(), + proxyServer.getServiceId().getWrapperId() + "." + cloudFlareConfig.getDomainName() ); } else { srvRecord = new SRVRecord( - "_minecraft._tcp." + cloudFlareConfig.getDomainName(), - "SRV 1 1 " + proxyServer.getPort() + " " + proxyServer.getServiceId().getWrapperId() + "." + - cloudFlareConfig.getDomainName(), - "_minecraft", - "_tcp", - cloudFlareProxyGroup.getSub(), - 1, - 1, - proxyServer.getPort(), - proxyServer.getServiceId().getWrapperId() + "." + cloudFlareConfig.getDomainName() + "_minecraft._tcp." + cloudFlareConfig.getDomainName(), + "SRV 1 1 " + proxyServer.getPort() + " " + proxyServer.getServiceId().getWrapperId() + "." + + cloudFlareConfig.getDomainName(), + "_minecraft", + "_tcp", + cloudFlareProxyGroup.getSub(), + 1, + 1, + proxyServer.getPort(), + proxyServer.getServiceId().getWrapperId() + "." + cloudFlareConfig.getDomainName() ); } PostResponse postResponse = this.createRecord(cloudFlareConfig, srvRecord); cloudFlareDatabase.add(postResponse); this.bungeeSRVRecords.put(postResponse.getId(), new MultiValue<>(postResponse, proxyServer.getServiceId().getServerId())); + NetworkUtils.sleepUninterruptedly(500); } } } @@ -183,17 +186,15 @@ public void removeProxy(ProxyProcessMeta proxyServer, CloudFlareDatabase cloudFl { //if (!bungeeSRVRecords.containsKey(proxyServer.getServiceId().getServerId())) return; - while (true) - { - Collection> postResponses = CollectionWrapper.filterMany(bungeeSRVRecords.values(), new Acceptable>() { - @Override - public boolean isAccepted(MultiValue postResponseStringMultiValue) - { - return postResponseStringMultiValue.getSecond().equalsIgnoreCase(proxyServer.getServiceId().getServerId()); - } - }); + Collection> postResponses = CollectionWrapper.filterMany(bungeeSRVRecords.values(), new Acceptable>() { + @Override + public boolean isAccepted(MultiValue postResponseStringMultiValue) + { + return postResponseStringMultiValue.getSecond().equalsIgnoreCase(proxyServer.getServiceId().getServerId()); + } + }); - //MultiValue postResponse = bungeeSRVRecords.get(proxyServer.getServiceId().getServerId()); + //MultiValue postResponse = bungeeSRVRecords.get(proxyServer.getServiceId().getServerId()); /* if (postResponse != null) { @@ -202,16 +203,15 @@ public boolean isAccepted(MultiValue postResponseStringMul } else break; */ - for (MultiValue postResponse : postResponses) - if (postResponse != null) - { - bungeeSRVRecords.remove(postResponse.getSecond()); - cloudFlareDatabase.remove(postResponse.getFirst().getId()); - deleteRecord(postResponse.getFirst()); + for (MultiValue postResponse : postResponses) + if (postResponse != null) + { + bungeeSRVRecords.remove(postResponse.getSecond()); + cloudFlareDatabase.remove(postResponse.getFirst().getId()); + deleteRecord(postResponse.getFirst()); - NetworkUtils.sleepUninterruptedly(500); - } - } + NetworkUtils.sleepUninterruptedly(500); + } } /** @@ -241,16 +241,16 @@ public PostResponse createRecord(CloudFlareConfig cloudFlareConfig, DNSRecord dn dataOutputStream.writeBytes(values); dataOutputStream.flush(); } - try (InputStream inputStream = httpPost.getInputStream()) + + try (InputStream inputStream = httpPost.getResponseCode() < 400 ? httpPost.getInputStream() : httpPost.getErrorStream()) { JsonObject jsonObject = toJsonInput(inputStream); if (jsonObject.get("success").getAsBoolean()) { System.out.println(prefix + "DNSRecord [" + dnsRecord.getName() + "/" + dnsRecord.getType() + "] was created"); } else - { throw new CloudFlareDNSRecordException("Failed to create DNSRecord \n " + jsonObject.toString()); - } + httpPost.disconnect(); return new PostResponse(cloudFlareConfig, dnsRecord, jsonObject.get("result").getAsJsonObject().get("id").getAsString()); } @@ -281,13 +281,14 @@ public void deleteRecord(PostResponse postResponse) delete.setRequestProperty("Content-Type", "application/json"); delete.connect(); - try (InputStream inputStream = delete.getInputStream()) + try (InputStream inputStream = delete.getResponseCode() < 400 ? delete.getInputStream() : delete.getErrorStream()) { JsonObject jsonObject = toJsonInput(inputStream); if (jsonObject.get("success").getAsBoolean()) { - System.out.println(prefix + " DNSRecord [" + postResponse.getId() + "] was removed"); - } + System.out.println(prefix + "DNSRecord [" + postResponse.getId() + "] was removed"); + } else + throw new CloudFlareDNSRecordException("Failed to delete DNSRecord \n " + jsonObject.toString()); } delete.disconnect(); @@ -302,12 +303,11 @@ private JsonObject toJsonInput(InputStream inputStream) StringBuilder stringBuilder = new StringBuilder(); String input; BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + try { - while ((input = bufferedReader.readLine()) != null) - { - stringBuilder.append(input); - } + while ((input = bufferedReader.readLine()) != null) stringBuilder.append(input); + } catch (IOException e) { e.printStackTrace(); diff --git a/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/exception/CloudFlareDNSRecordException.java b/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/exception/CloudFlareDNSRecordException.java index d92046abb..8d4d395e7 100644 --- a/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/exception/CloudFlareDNSRecordException.java +++ b/cloudnet-cord/cloudnet-cloudflare/src/main/java/de/dytanic/cloudnet/cloudflare/exception/CloudFlareDNSRecordException.java @@ -18,4 +18,9 @@ public CloudFlareDNSRecordException(String message) { super(message); } + + public CloudFlareDNSRecordException(String message, Throwable cause) + { + super(message, cause); + } } diff --git a/cloudnet-cord/cloudnet-log/src/main/java/de/dytanic/cloudnet/logging/CloudLogger.java b/cloudnet-cord/cloudnet-log/src/main/java/de/dytanic/cloudnet/logging/CloudLogger.java index 2d873eead..fbdb7be3c 100644 --- a/cloudnet-cord/cloudnet-log/src/main/java/de/dytanic/cloudnet/logging/CloudLogger.java +++ b/cloudnet-cord/cloudnet-log/src/main/java/de/dytanic/cloudnet/logging/CloudLogger.java @@ -31,7 +31,7 @@ */ @Getter public class CloudLogger - extends Logger { + extends Logger { private final String separator = System.getProperty("line.separator"); private final LoggingFormatter formatter = new LoggingFormatter(); @@ -155,9 +155,8 @@ public void publish(LogRecord record) reader.print(ConsoleReader.RESET_LINE + getFormatter().format(record)); reader.drawLine(); reader.flush(); - } catch (IOException e) + } catch (Throwable ignored) { - e.printStackTrace(); } } } @@ -175,7 +174,7 @@ public void close() throws SecurityException } private class LoggingFormatter - extends Formatter { + extends Formatter { private final DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); @@ -191,13 +190,13 @@ public String format(LogRecord record) } return ConsoleReader.RESET_LINE + - "[" + - format.format(record.getMillis()) + - "] " + - record.getLevel().getName() + - ": " + - formatMessage(record) + - "\n" + builder.toString(); + "[" + + format.format(record.getMillis()) + + "] " + + record.getLevel().getName() + + ": " + + formatMessage(record) + + "\n" + builder.toString(); } } } diff --git a/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/CloudConfig.java b/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/CloudConfig.java index a511b90f4..9f07fa969 100644 --- a/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/CloudConfig.java +++ b/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/CloudConfig.java @@ -345,6 +345,7 @@ public java.util.Map getServerGroups() groups.put(serverGroup.getName(), serverGroup); } catch (Throwable ex) { + ex.printStackTrace(); System.out.println("Cannot load servergroup file [" + file.getName() + "]"); } } diff --git a/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/network/NetworkManager.java b/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/network/NetworkManager.java index c91ddf269..16f024a47 100644 --- a/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/network/NetworkManager.java +++ b/cloudnet-core/src/main/java/de/dytanic/cloudnetcore/network/NetworkManager.java @@ -85,61 +85,61 @@ public void updateAll0() public void handlePlayerLoginRequest(ProxyServer proxyServer, PlayerConnection cloudPlayerConnection, UUID uniqueId) { - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " onlinePlayers"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " onlinePlayers"); if (this.onlinePlayers.containsKey(cloudPlayerConnection.getUniqueId())) { proxyServer.sendPacketSynchronized(new PacketOutLoginPlayer(uniqueId, null, "Already connected in network")); return; } - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " call LoginRequestEvent"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " call LoginRequestEvent"); LoginRequestEvent loginRequestEvent = new LoginRequestEvent(proxyServer, cloudPlayerConnection); CloudNet.getInstance().getEventManager().callEvent(loginRequestEvent); PlayerDatabase playerDatabase = CloudNet.getInstance().getDbHandlers().getPlayerDatabase(); OfflinePlayer offlinePlayer = null; - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " database contains"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " database contains"); if (!playerDatabase.containsPlayer(cloudPlayerConnection.getUniqueId())) { - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " database register"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " database register"); offlinePlayer = playerDatabase.registerPlayer(cloudPlayerConnection); } if (offlinePlayer == null) { - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " database get"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " database get"); offlinePlayer = playerDatabase.getPlayer(cloudPlayerConnection.getUniqueId()); } - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " create CloudPlayer"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " create CloudPlayer"); CloudPlayer cloudPlayer = new CloudPlayer(offlinePlayer, cloudPlayerConnection, proxyServer.getServerId()); cloudPlayer.setPlayerExecutor(CorePlayerExecutor.INSTANCE); if (cloudPlayer.getFirstLogin() == null) { - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " set firstLogin"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " set firstLogin"); cloudPlayer.setFirstLogin(System.currentTimeMillis()); } - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " call PlayerInitEvent"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " call PlayerInitEvent"); CloudNet.getInstance().getEventManager().callEvent(new PlayerInitEvent(cloudPlayer)); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " NameToUUIDDatabase append"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " NameToUUIDDatabase append"); CloudNet.getInstance().getDbHandlers().getNameToUUIDDatabase().append(new MultiValue<>(cloudPlayerConnection.getName(), cloudPlayerConnection.getUniqueId())); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " NameToUUIDDatabase replace"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " NameToUUIDDatabase replace"); CloudNet.getInstance().getDbHandlers().getNameToUUIDDatabase().replace(new MultiValue<>(cloudPlayerConnection.getUniqueId(), cloudPlayerConnection.getName())); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " setName"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " setName"); cloudPlayer.setName(cloudPlayerConnection.getName()); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " updatePlayer"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " updatePlayer"); CloudNet.getInstance().getDbHandlers().getPlayerDatabase().updatePlayer(CloudPlayer.newOfflinePlayer(cloudPlayer)); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " PacketOutLoginPlayer"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " PacketOutLoginPlayer"); proxyServer.sendPacket(new PacketOutLoginPlayer(uniqueId, cloudPlayer, "successful Login")); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " waitingPlayers"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " waitingPlayers"); this.waitingPlayers.put(cloudPlayer.getUniqueId(), cloudPlayer); - CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + "#" + uniqueId + " handlePlayerLogin"); + CloudNet.getLogger().debug("player login request " + cloudPlayerConnection.getName() + '#' + uniqueId + " handlePlayerLogin"); handlePlayerLogin(cloudPlayer); } @@ -293,7 +293,7 @@ public void handleCommandExecute(PlayerCommandExecution playerCommandExecutor) if (cloudPlayer != null) { CloudNet.getLogger().info("Player [" + playerCommandExecutor.getName() + "] executed command [" + playerCommandExecutor.getCommandLine() + - "] on [" + cloudPlayer.getProxy() + NetworkUtils.SLASH_STRING + cloudPlayer.getServer() + "]"); + "] on [" + cloudPlayer.getProxy() + NetworkUtils.SLASH_STRING + cloudPlayer.getServer() + ']'); CloudNet.getInstance().getEventManager().callEvent(new CommandExecutionEvent(playerCommandExecutor)); StatisticManager.getInstance().playerCommandExecutions(); } @@ -306,7 +306,7 @@ public void handlePlayerUpdate(CloudPlayer cloudPlayer) this.sendAllUpdate(new PacketOutUpdatePlayer(cloudPlayer)); if (cloudPlayer.getServer() != null) - System.out.println("Player [" + cloudPlayer.getName() + NetworkUtils.SLASH_STRING + cloudPlayer.getUniqueId() + "/] update [server=" + cloudPlayer.getServer() + ", proxy=" + cloudPlayer.getProxy() + ", address=" + cloudPlayer.getPlayerConnection().getHost() + "]"); + System.out.println("Player [" + cloudPlayer.getName() + NetworkUtils.SLASH_STRING + cloudPlayer.getUniqueId() + "/] update [server=" + cloudPlayer.getServer() + ", proxy=" + cloudPlayer.getProxy() + ", address=" + cloudPlayer.getPlayerConnection().getHost() + ']'); } public void handleCustomChannelMessage(String channel, String message, Document document, PacketSender packetSender) @@ -414,10 +414,9 @@ public boolean accept(INetworkComponent networkComponent) (packet instanceof PacketOutUpdateServerInfo || packet instanceof PacketOutServerAdd || packet instanceof PacketOutServerRemove)) return true; - if (serverGroup.getAdvancedServerConfig().isNotifyPlayerUpdatesFromNoCurrentPlayer() && + return serverGroup.getAdvancedServerConfig().isNotifyPlayerUpdatesFromNoCurrentPlayer() && (packet instanceof PacketOutUpdatePlayer || packet instanceof PacketOutLoginPlayer || packet instanceof PacketOutLogoutPlayer || - packet instanceof PacketOutUpdateOfflinePlayer)) - return true; + packet instanceof PacketOutUpdateOfflinePlayer); } } @@ -522,4 +521,4 @@ public SimpleServerGroup doCatch(ServerGroup key) return cloudNetwork; } -} \ No newline at end of file +} diff --git a/cloudnet-core/src/main/resources/modules/modules.properties b/cloudnet-core/src/main/resources/modules/modules.properties index 461071822..0b1f3d61b 100644 --- a/cloudnet-core/src/main/resources/modules/modules.properties +++ b/cloudnet-core/src/main/resources/modules/modules.properties @@ -4,5 +4,5 @@ CloudNet-Service-PermissionModule=1.0.0.2 CloudNet-Service-MobModule=1.0.0.2 CloudNet-Service-SignsModule=1.0.0.2 -CloudNet-Service-CloudFlareModule=1.0.0.2 +CloudNet-Service-CloudFlareModule=1.0.0.3 CloudNet-Service-NotifyServiceModule=1.0.0.2 \ No newline at end of file diff --git a/cloudnet-examples/pom.xml b/cloudnet-examples/pom.xml index 67bb46a44..77b15b6e5 100644 --- a/cloudnet-examples/pom.xml +++ b/cloudnet-examples/pom.xml @@ -44,7 +44,7 @@ org.spigotmc - spigot + spigot-api ${dependency.spigot.version} provided diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/network/WrapperInfo.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/network/WrapperInfo.java index 1efde0e74..73696769a 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/network/WrapperInfo.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/network/WrapperInfo.java @@ -2,12 +2,14 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.ToString; /** * Created by Tareko on 29.06.2017. */ @Getter @AllArgsConstructor +@ToString public class WrapperInfo { private String serverId; @@ -18,4 +20,4 @@ public class WrapperInfo { private int process_queue_size; private int memory; -} \ No newline at end of file +} diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/DefaultPermissionGroup.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/DefaultPermissionGroup.java index 0fcfd2ab0..89aef8634 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/DefaultPermissionGroup.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/DefaultPermissionGroup.java @@ -14,6 +14,6 @@ public class DefaultPermissionGroup extends PermissionGroup { public DefaultPermissionGroup(String name) { - super(name, "§e", "§f", "§7", 98, 0, false, new HashMap<>(), new HashMap<>(), new HashMap<>(), new ArrayList<>()); + super(name, "§c","§e", "§f", "§7", 98, 0, false, new HashMap<>(), new HashMap<>(), new HashMap<>(), new ArrayList<>()); } } \ No newline at end of file diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionEntity.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionEntity.java index 49673af0c..8981064e3 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionEntity.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionEntity.java @@ -6,6 +6,7 @@ import lombok.Setter; import java.util.Collection; +import java.util.Comparator; import java.util.Map; import java.util.UUID; @@ -66,21 +67,10 @@ else if (permissions.containsKey("*") && permissions.get("*")) public PermissionGroup getHighestPermissionGroup(PermissionPool permissionPool) { - PermissionGroup permissionGroup = null; - - for (GroupEntityData groupEntityData : getGroups()) - { - if (permissionGroup == null) - permissionGroup = permissionPool.getGroups().get(groupEntityData.getGroup()); - else - { - if (permissionGroup.getJoinPower() < permissionPool.getGroups().get(groupEntityData.getGroup()).getJoinPower()) - { - permissionGroup = permissionPool.getGroups().get(groupEntityData.getGroup()); - } - } - } - return permissionGroup; + return this.getGroups() + .stream() + .map(groupEntityData -> permissionPool.getGroups().get(groupEntityData.getGroup())) + .min(Comparator.comparingInt(PermissionGroup::getTagId)).orElse(null); } public boolean isInGroup(String group) @@ -99,7 +89,7 @@ private boolean hasWildcardPermission(PermissionGroup permissionGroup, String pe { for (Map.Entry entry : permissionGroup.getPermissions().entrySet()) if (entry.getKey().endsWith("*") && entry.getKey().length() > 1 && permission.startsWith(entry.getKey().substring(0, entry.getKey().length() - 1))) - return true; + return entry.getValue(); if (group != null && permissionGroup.getServerGroupPermissions().containsKey(group)) for (String perms : permissionGroup.getServerGroupPermissions().get(group)) @@ -113,7 +103,7 @@ private boolean hasWildcardPermission(String permission) { for (Map.Entry entry : getPermissions().entrySet()) if (entry.getKey().endsWith("*") && entry.getKey().length() > 1 && permission.startsWith(entry.getKey().substring(0, entry.getKey().length() - 1))) - return true; + return entry.getValue(); return false; } diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionGroup.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionGroup.java index d3fba9064..dfd78a234 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionGroup.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/player/permission/PermissionGroup.java @@ -3,8 +3,8 @@ import lombok.AllArgsConstructor; import lombok.Data; -import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Created by Tareko on 01.06.2017. @@ -14,15 +14,16 @@ public class PermissionGroup { protected String name; + protected String color; protected String prefix; protected String suffix; protected String display; protected int tagId; protected int joinPower; protected boolean defaultGroup; - protected HashMap permissions; - protected java.util.Map> serverGroupPermissions; - protected java.util.Map options; - protected java.util.List implementGroups; + protected Map permissions; + protected Map> serverGroupPermissions; + protected Map options; + protected List implementGroups; } \ No newline at end of file diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ProxyGroup.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ProxyGroup.java index 49b9cbd18..e8939123d 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ProxyGroup.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ProxyGroup.java @@ -12,6 +12,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import lombok.ToString; import java.util.Collection; @@ -21,6 +22,7 @@ @Getter @Setter @AllArgsConstructor +@ToString public class ProxyGroup implements Nameable { @@ -37,4 +39,4 @@ public class ProxyGroup protected ProxyGroupMode proxyGroupMode; protected WrappedMap settings; -} \ No newline at end of file +} diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ServerConfig.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ServerConfig.java index e4c0413ce..420d32483 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ServerConfig.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/ServerConfig.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import lombok.ToString; /** * Created by Tareko on 25.07.2017. @@ -11,6 +12,7 @@ @AllArgsConstructor @Getter @Setter +@ToString public class ServerConfig { private boolean hideServer; @@ -21,4 +23,4 @@ public class ServerConfig { private long startup; -} \ No newline at end of file +} diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ProxyInfo.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ProxyInfo.java index 3544a42ba..c3ab5d158 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ProxyInfo.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ProxyInfo.java @@ -4,6 +4,7 @@ import de.dytanic.cloudnet.lib.service.ServiceId; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.ToString; import java.util.List; import java.util.UUID; @@ -13,6 +14,7 @@ */ @AllArgsConstructor @Getter +@ToString public class ProxyInfo { private ServiceId serviceId; @@ -29,4 +31,4 @@ public SimpleProxyInfo toSimple() return new SimpleProxyInfo(serviceId, online, host, port, memory, onlineCount); } -} \ No newline at end of file +} diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ServerInfo.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ServerInfo.java index 03ce01f47..e177ac34e 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ServerInfo.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/info/ServerInfo.java @@ -7,6 +7,7 @@ import de.dytanic.cloudnet.lib.service.ServiceId; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.ToString; import java.lang.reflect.Type; import java.util.List; @@ -16,6 +17,7 @@ */ @Getter @AllArgsConstructor +@ToString public class ServerInfo { public static final Type TYPE = new TypeToken() { @@ -50,4 +52,4 @@ public SimpleServerInfo toSimple() return new SimpleServerInfo(serviceId, host, port, onlineCount, maxPlayers); } -} \ No newline at end of file +} diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/template/Template.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/template/Template.java index fc00716a6..8c2ee1579 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/template/Template.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/server/template/Template.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; +import lombok.ToString; import java.util.Collection; @@ -13,6 +14,7 @@ @Getter @Setter @AllArgsConstructor +@ToString public class Template { private String name; @@ -21,4 +23,4 @@ public class Template { private String[] processPreParameters; private Collection installablePlugins; -} \ No newline at end of file +} diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/MobItemLayout.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/MobItemLayout.java index c0a1c5644..d1469b06b 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/MobItemLayout.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/MobItemLayout.java @@ -12,7 +12,13 @@ @AllArgsConstructor public class MobItemLayout implements Cloneable { + /** + * itemIds are not supported in all versions, use {@link MobItemLayout#itemName} instead + */ + + @Deprecated private int itemId; + private String itemName; private int subId; private String display; private List lore; @@ -20,6 +26,6 @@ public class MobItemLayout implements Cloneable { @Override public MobItemLayout clone() { - return new MobItemLayout(itemId, subId, display, lore); + return new MobItemLayout(itemId, itemName, subId, display, lore); } } \ No newline at end of file diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/ServerMob.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/ServerMob.java index ac541c0a9..c951cfc0f 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/ServerMob.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/mob/ServerMob.java @@ -21,7 +21,12 @@ public class ServerMob implements Nameable { protected String name; protected String type; protected String targetGroup; + /** + * itemIds are not supported in all versions, use {@link ServerMob#itemName} instead + */ + @Deprecated protected Integer itemId; + protected String itemName; protected Boolean autoJoin; protected MobPosition position; protected String displayMessage; diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/sign/SignLayout.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/sign/SignLayout.java index 58efe7e63..bf72de345 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/sign/SignLayout.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/serverselectors/sign/SignLayout.java @@ -14,7 +14,12 @@ public class SignLayout private String name; private String[] signLayout; - private int blockId; + /** + * blockIds are not supported in all versions, use {@link SignLayout#blockName} instead + */ + @Deprecated + int blockId; + private String blockName; private int subId; } \ No newline at end of file diff --git a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/utility/MapWrapper.java b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/utility/MapWrapper.java index 754476280..6ec411fb7 100644 --- a/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/utility/MapWrapper.java +++ b/cloudnet-lib/src/main/java/de/dytanic/cloudnet/lib/utility/MapWrapper.java @@ -8,6 +8,7 @@ import java.util.Collection; import java.util.HashMap; +import java.util.Map; public final class MapWrapper { @@ -16,7 +17,7 @@ private MapWrapper() { } - public static java.util.Map collectionCatcherHashMap(Collection key, Catcher catcher) + public static Map collectionCatcherHashMap(Collection key, Catcher catcher) { HashMap kvHashMap = new HashMap<>(); for (V value : key) @@ -26,10 +27,10 @@ public static java.util.Map collectionCatcherHashMap(Collection key, C return kvHashMap; } - public static java.util.Map filter(java.util.Map map, Acceptable acceptable) + public static Map filter(Map map, Acceptable acceptable) { - java.util.Map filter = NetworkUtils.newConcurrentHashMap(); - for (java.util.Map.Entry value : map.entrySet()) + Map filter = NetworkUtils.newConcurrentHashMap(); + for (Map.Entry value : map.entrySet()) { if (acceptable.isAccepted(value.getValue())) { @@ -40,9 +41,9 @@ public static java.util.Map filter(java.util.Map map, Acceptable } @SafeVarargs - public static java.util.Map valueableHashMap(Return... returns) + public static Map valueableHashMap(Return... returns) { - java.util.HashMap map = new HashMap<>(); + HashMap map = new HashMap<>(); for (Return kvReturn : returns) { map.put(kvReturn.getFirst(), kvReturn.getSecond()); @@ -50,10 +51,10 @@ public static java.util.Map valueableHashMap(Return... returns) return map; } - public static java.util.Map transform(java.util.Map values, Catcher keyCatcher, Catcher valueCatcher) + public static Map transform(Map values, Catcher keyCatcher, Catcher valueCatcher) { - java.util.Map nkvkMap = new HashMap<>(); - for (java.util.Map.Entry entry : values.entrySet()) + Map nkvkMap = new HashMap<>(); + for (Map.Entry entry : values.entrySet()) { nkvkMap.put(keyCatcher.doCatch(entry.getKey()), valueCatcher.doCatch(entry.getValue())); } diff --git a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/CloudFlareModule.java b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/CloudFlareModule.java index fdc4edf3d..356c252d9 100644 --- a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/CloudFlareModule.java +++ b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/CloudFlareModule.java @@ -31,7 +31,7 @@ public class CloudFlareModule extends CoreModule { private ConfigCloudFlare configCloudFlare; - private final ExecutorService executor = Executors.newFixedThreadPool(1); + private final ExecutorService executor = Executors.newSingleThreadExecutor(); private CloudFlareDatabase cloudFlareDatabase; @@ -77,13 +77,12 @@ public SimpledWrapperInfo doCatch(Wrapper key) public void onShutdown() { - executor.shutdown(); + executor.shutdownNow(); try { - executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS); CloudFlareService.getInstance().shutdown(cloudFlareDatabase); - } catch (Exception ex) + } catch (Exception ignored) { } } diff --git a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyAddListener.java b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyAddListener.java index 98aae6698..ab2470fbf 100644 --- a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyAddListener.java +++ b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyAddListener.java @@ -23,7 +23,7 @@ public void onCall(ProxyAddEvent event) public void run() { CloudFlareService.getInstance().addProxy(event.getProxyServer().getProcessMeta(), CloudFlareModule.getInstance().getCloudFlareDatabase()); - NetworkUtils.sleepUninterruptedly(400); + NetworkUtils.sleepUninterruptedly(500); } }); } diff --git a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyRemoveListener.java b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyRemoveListener.java index 0bd68a0fd..fc5ca726a 100644 --- a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyRemoveListener.java +++ b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/java/de/dytanic/cloudnetcore/cloudflare/listener/ProxyRemoveListener.java @@ -23,7 +23,7 @@ public void onCall(ProxyRemoveEvent event) public void run() { CloudFlareService.getInstance().removeProxy(event.getProxyServer().getProcessMeta(), CloudFlareModule.getInstance().getCloudFlareDatabase()); - NetworkUtils.sleepUninterruptedly(400); + NetworkUtils.sleepUninterruptedly(500); } }); } diff --git a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/resources/module.properties b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/resources/module.properties index 78ec14061..82b1b3ca5 100644 --- a/cloudnet-modules/cloudnet-modules-cloudflare/src/main/resources/module.properties +++ b/cloudnet-modules/cloudnet-modules-cloudflare/src/main/resources/module.properties @@ -2,6 +2,6 @@ # Copyright (c) Tarek Hosni El Alaoui 2017 # name=CloudNet-Service-CloudFlareModule -version=1.0.0.2 +version=1.0.0.3 author=Dytanic main=de.dytanic.cloudnetcore.cloudflare.CloudFlareModule \ No newline at end of file diff --git a/cloudnet-modules/cloudnet-modules-mobs/src/main/java/de/dytanic/cloudnetcore/mobs/config/ConfigMobs.java b/cloudnet-modules/cloudnet-modules-mobs/src/main/java/de/dytanic/cloudnetcore/mobs/config/ConfigMobs.java index de7f32ad9..fa5cfc768 100644 --- a/cloudnet-modules/cloudnet-modules-mobs/src/main/java/de/dytanic/cloudnetcore/mobs/config/ConfigMobs.java +++ b/cloudnet-modules/cloudnet-modules-mobs/src/main/java/de/dytanic/cloudnetcore/mobs/config/ConfigMobs.java @@ -17,6 +17,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; +import java.util.Collections; /** * Created by Tareko on 21.08.2017. @@ -25,31 +26,26 @@ public class ConfigMobs implements ILoader { private final Path path = Paths.get("local/servermob_config.json"); - public ConfigMobs() - { - if (!Files.exists(path)) - { + public ConfigMobs() { + if (!Files.exists(path)) { new Document() - .append("mobConfig", new MobConfig(54, 10, new MobItemLayout(388, 0, - "§6%server%", Arrays.asList(NetworkUtils.SPACE_STRING, "§e%state%", "§e%online_players% §8/§e%max_players%", "§e%motd%")), - MapWrapper.valueableHashMap( - new Return<>(1, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(2, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(3, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(4, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(5, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(6, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(7, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(8, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING))), - new Return<>(9, new MobItemLayout(160, 15, NetworkUtils.SPACE_STRING, Arrays.asList(NetworkUtils.SPACE_STRING)))) - ) - ).saveAsConfig(path); + .append("mobConfig", new MobConfig(54, 10, new MobItemLayout(388, "EMERALD", 0, + "§6%server%", Arrays.asList(NetworkUtils.SPACE_STRING, "§e%state%", "§e%online_players% §8/§e%max_players%", "§e%motd%")), + MapWrapper.valueableHashMap( + new Return<>(1, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(2, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(3, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(5, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(6, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(7, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(8, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING))), + new Return<>(9, new MobItemLayout(160, "BLACK_STAINED_GLASS_PANE", 15, NetworkUtils.SPACE_STRING, Collections.singletonList(NetworkUtils.SPACE_STRING)))) + )).saveAsConfig(path); } } @Override - public MobConfig load() - { + public MobConfig load() { return Document.loadDocument(path).getObject("mobConfig", new TypeToken() { }.getType()); } diff --git a/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/command/CommandPermissions.java b/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/command/CommandPermissions.java index 60118ba0c..671d6c66c 100644 --- a/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/command/CommandPermissions.java +++ b/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/command/CommandPermissions.java @@ -136,6 +136,21 @@ public void run(String obj) sender.sendMessage("The specified permission group doesn't exist"); } } + if (args[2].equalsIgnoreCase("setColor")) + { + if (permissionPool.getGroups().containsKey(args[1])) + { + PermissionGroup permissionGroup = permissionPool.getGroups().get(args[1]); + permissionGroup.setColor(args[3].toLowerCase()); + PermissionModule.getInstance().getConfigPermission().updatePermissionGroup(permissionGroup); + CloudNet.getInstance().getNetworkManager().reload(); + CloudNet.getInstance().getNetworkManager().updateAll0(); + sender.sendMessage("You set the color for the permission group " + permissionGroup.getName() + " to \"" + permissionGroup.getColor() + "\""); + } else + { + sender.sendMessage("The specified permission group doesn't exist"); + } + } if (args[2].equalsIgnoreCase("setDefault")) { @@ -482,6 +497,7 @@ public void run(String obj) "perms GROUP setTagId ", "perms GROUP setDefault ", "perms GROUP setJoinPower ", + "perms GROUP setColor ", "perms USER ", "perms USER GROUP SET ", "perms USER GROUP ADD ", diff --git a/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/config/ConfigPermissions.java b/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/config/ConfigPermissions.java index 95755de63..d01fe88d8 100644 --- a/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/config/ConfigPermissions.java +++ b/cloudnet-modules/cloudnet-modules-permission/src/main/java/de/dytanic/cloudnetcore/permissions/config/ConfigPermissions.java @@ -41,14 +41,16 @@ public ConfigPermissions() throws Exception { PermissionGroup member = new PermissionGroup( "default", + "&8", "§eMember §7▎ ", "§f", "§e", - 9999, + 9999 + , 0, true, new HashMap<>(), - MapWrapper.valueableHashMap(new Return("Lobby", Arrays.asList("test.permission.for.group.Lobby"))), + MapWrapper.valueableHashMap(new Return<>("Lobby", Arrays.asList("test.permission.for.group.Lobby"))), new HashMap<>(), new ArrayList<>() ); @@ -56,14 +58,15 @@ public ConfigPermissions() throws Exception PermissionGroup admin = new PermissionGroup( "Admin", + "&c", "§cAdmin §7▎ ", "§f", "§c", 0, 100, false, - (HashMap) MapWrapper.valueableHashMap(new Return<>("*", true)), - MapWrapper.valueableHashMap(new Return("Lobby", Arrays.asList("test.permission.for.group.Lobby"))), + MapWrapper.valueableHashMap(new Return<>("*", true)), + MapWrapper.valueableHashMap(new Return<>("Lobby", Arrays.asList("test.permission.for.group.Lobby"))), new HashMap<>(), new ArrayList<>() ); @@ -156,6 +159,7 @@ public void write(PermissionGroup permissionGroup, Configuration configuration) group.set("prefix", permissionGroup.getPrefix()); group.set("suffix", permissionGroup.getSuffix()); group.set("display", permissionGroup.getDisplay()); + group.set("color", permissionGroup.getColor()); group.set("tagId", permissionGroup.getTagId()); group.set("joinPower", permissionGroup.getJoinPower()); group.set("defaultGroup", permissionGroup.isDefaultGroup()); @@ -211,6 +215,7 @@ public Map read(Configuration configuration) PermissionGroup permissionGroup = new PermissionGroup( key, + group.getString("color"), group.getString("prefix"), group.getString("suffix"), group.getString("display"), diff --git a/cloudnet-modules/cloudnet-modules-signs/src/main/java/de/dytanic/cloudnetcore/signs/config/ConfigSignLayout.java b/cloudnet-modules/cloudnet-modules-signs/src/main/java/de/dytanic/cloudnetcore/signs/config/ConfigSignLayout.java index 40efa4548..f46723076 100644 --- a/cloudnet-modules/cloudnet-modules-signs/src/main/java/de/dytanic/cloudnetcore/signs/config/ConfigSignLayout.java +++ b/cloudnet-modules/cloudnet-modules-signs/src/main/java/de/dytanic/cloudnetcore/signs/config/ConfigSignLayout.java @@ -33,46 +33,46 @@ public ConfigSignLayout() Arrays.asList(new SignGroupLayouts( "default", Arrays.asList( - new SignLayout("empty", new String[]{"%server%", "&e%state%", "%online_players%/%max_players%", "%motd%"}, 159, 0), - new SignLayout("online", new String[]{"%server%", "&e%state%", "%online_players%/%max_players%", "%motd%"}, 159, 0), - new SignLayout("full", new String[]{"%server%", "&ePREMIUM", "%online_players%/%max_players%", "%motd%"}, 159, 0), - new SignLayout("maintenance", new String[]{"§8§m---------", "maintenance", "§cmode", "§8§m---------"}, 159, 0) + new SignLayout("empty", new String[]{"%server%", "&e%state%", "%online_players%/%max_players%", "%motd%"}, 159, "BROWN_TERRACOTTA", 0), + new SignLayout("online", new String[]{"%server%", "&e%state%", "%online_players%/%max_players%", "%motd%"}, 159, "BROWN_TERRACOTTA", 0), + new SignLayout("full", new String[]{"%server%", "&ePREMIUM", "%online_players%/%max_players%", "%motd%"}, 159, "BROWN_TERRACOTTA", 0), + new SignLayout("maintenance", new String[]{"§8§m---------", "maintenance", "§cmode", "§8§m---------"}, 159, "BROWN_TERRACOTTA", 0) ) )) , new SearchingAnimation(33, 11, Arrays.asList( - new SignLayout("loading1", new String[]{"", "server loads...", "o ", ""}, 159, 14), - new SignLayout("loading2", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading3", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading4", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading5", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading6", new String[]{"", "server loads...", "o o ", ""}, 159, 14), - new SignLayout("loading7", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading8", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading9", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading10", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading11", new String[]{"", "server loads...", "o o o ", ""}, 159, 14), - new SignLayout("loading12", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading13", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading14", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading15", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading16", new String[]{"", "server loads...", "o o o o ", ""}, 159, 14), - new SignLayout("loading17", new String[]{"", "server loads...", " o o o o", ""}, 159, 14), - new SignLayout("loading18", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading19", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading20", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading21", new String[]{"", "server loads...", " o o o ", ""}, 159, 14), - new SignLayout("loading22", new String[]{"", "server loads...", " o o o", ""}, 159, 14), - new SignLayout("loading23", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading24", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading25", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading26", new String[]{"", "server loads...", " o o ", ""}, 159, 14), - new SignLayout("loading27", new String[]{"", "server loads...", " o o", ""}, 159, 14), - new SignLayout("loading28", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading29", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading30", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading31", new String[]{"", "server loads...", " o ", ""}, 159, 14), - new SignLayout("loading32", new String[]{"", "server loads...", " o", ""}, 159, 14), - new SignLayout("loading33", new String[]{"", "server loads...", " ", ""}, 159, 14) + new SignLayout("loading1", new String[]{"", "server loads...", "o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading2", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading3", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading4", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading5", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading6", new String[]{"", "server loads...", "o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading7", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading8", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading9", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading10", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading11", new String[]{"", "server loads...", "o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading12", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading13", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading14", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading15", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading16", new String[]{"", "server loads...", "o o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading17", new String[]{"", "server loads...", " o o o o", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading18", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading19", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading20", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading21", new String[]{"", "server loads...", " o o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading22", new String[]{"", "server loads...", " o o o", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading23", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading24", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading25", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading26", new String[]{"", "server loads...", " o o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading27", new String[]{"", "server loads...", " o o", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading28", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading29", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading30", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading31", new String[]{"", "server loads...", " o ", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading32", new String[]{"", "server loads...", " o", ""}, 159, "BROWN_TERRACOTTA", 14), + new SignLayout("loading33", new String[]{"", "server loads...", " ", ""}, 159, "BROWN_TERRACOTTA", 14) )))).saveAsConfig(path); } } @@ -128,7 +128,7 @@ public boolean isAccepted(SignLayout signLayout) }); if (signLayout == null) { - groupLayouts.getLayouts().add(new SignLayout("empty", new String[]{"%server%", "&6%state%", "%online_players%/%max_players%", "%motd%"}, 159, 1)); + groupLayouts.getLayouts().add(new SignLayout("empty", new String[]{"%server%", "&6%state%", "%online_players%/%max_players%", "%motd%"}, 159, "BROWN_TERRACOTTA", 1)); injectable = true; } } diff --git a/cloudnet-tools/pom.xml b/cloudnet-tools/pom.xml index 0c1695244..9205d63e5 100644 --- a/cloudnet-tools/pom.xml +++ b/cloudnet-tools/pom.xml @@ -24,6 +24,11 @@ cloudnet-repo https://cloudnetservice.eu/repositories + + + spigot-repo + https://hub.spigotmc.org/nexus/content/repositories/snapshots/ + @@ -35,7 +40,7 @@ org.spigotmc - spigot + spigot-api ${dependency.spigot.version} provided diff --git a/cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/setup/SetupSpigotVersion.java b/cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/setup/SetupSpigotVersion.java index d06ceaa61..e00933f9f 100644 --- a/cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/setup/SetupSpigotVersion.java +++ b/cloudnet-wrapper/src/main/java/de/dytanic/cloudnetwrapper/setup/SetupSpigotVersion.java @@ -48,7 +48,7 @@ public void run(ConsoleReader reader) { System.out.println("No spigot.jar has been found!"); - System.out.println("Choose a minecraft server version [\"paper\" (coming soon), \"spigot\"]"); + System.out.println("Choose a minecraft server version [" +/*"\"paper\" (coming soon)", */"\"spigot\"]"); String answer = null; @@ -69,9 +69,11 @@ public void run(ConsoleReader reader) case "spigot": answer = "spigot"; break; + /* case "paper": answer = "paper"; break; + */ default: System.out.println("This version is not supported!"); } diff --git a/pom.xml b/pom.xml index 25af653e0..2dff663a3 100644 --- a/pom.xml +++ b/pom.xml @@ -18,25 +18,25 @@ 1.8 UTF-8 UTF-8 - 2.1.14.3 + 2.1.15 RELEASE - 1.18.4 - 4.1.32.Final + 1.18.8 + 4.1.36.Final 2.8.5 2.14.6 5.0.4 - 1.23 + 1.24 1.8-1.12 - 1.8.8 - 1.6 - 0.6.0 + 1.8.8-R0.1-SNAPSHOT + 1.7 + 0.6.1 4.12 3.2.1 3.0.1 - 3.1.1 + 3.1.2 3.1.0 1.8