diff --git a/pom.xml b/pom.xml
index 0717194..c037b8e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
ru.simsonic
rscPermissions
- 0.9.8a
+ 0.9.9a
jar
rscPermissions
diff --git a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java
index 24d0ef8..c4a5c6b 100644
--- a/src/main/java/ru/simsonic/rscPermissions/API/Settings.java
+++ b/src/main/java/ru/simsonic/rscPermissions/API/Settings.java
@@ -1,4 +1,5 @@
package ru.simsonic.rscPermissions.API;
+import java.util.Map;
import ru.simsonic.rscUtilityLibrary.ConnectionMySQL.ConnectionParams;
public interface Settings
@@ -8,6 +9,7 @@ public interface Settings
public static final String separatorRegExp = "\\.";
public static final String instantiator = "?";
public static final String textInheriter = "%";
+ public static final boolean decolorizeForConsole = false;
public void onLoad();
public void readSettings();
public String getDefaultGroup();
@@ -21,6 +23,7 @@ public interface Settings
public long getRegionFinderGranularity();
public int getAutoReloadDelayTicks();
public boolean isUseMetrics();
+ public Map getSlotLimits();
public TranslationProvider getTranslationProvider();
public ConnectionParams getConnectionParams();
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java
index 2e3c9d7..290c993 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitEventListener.java
@@ -1,6 +1,7 @@
package ru.simsonic.rscPermissions.Bukkit;
import java.util.ArrayList;
-import org.bukkit.Bukkit;
+import java.util.Collections;
+import java.util.Map;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -20,10 +21,15 @@ import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
public class BukkitEventListener implements Listener
{
private final BukkitPluginMain rscp;
+ private Map slotLimits = Collections.emptyMap();
public BukkitEventListener(BukkitPluginMain plugin)
{
this.rscp = plugin;
}
+ public void onEnable()
+ {
+ slotLimits = rscp.settings.getSlotLimits();
+ }
@EventHandler
public void onPlayerAsyncPreLogin(AsyncPlayerPreLoginEvent event)
{
@@ -41,7 +47,12 @@ public class BukkitEventListener implements Listener
identifiers.add(event.getAddress().getHostAddress());
// Resolution
final ResolutionResult resolution = rscp.internalCache.resolvePlayer(identifiers.toArray(new String[identifiers.size()]));
- processMaintenanceLogin(event, resolution);
+ // Maintenance mode limits
+ if(event.getLoginResult() == AsyncPlayerPreLoginEvent.Result.ALLOWED)
+ processMaintenanceLogin(event, resolution);
+ // Empty slots limits
+ if(event.getLoginResult() == AsyncPlayerPreLoginEvent.Result.ALLOWED)
+ processLimitedSlotsLogin(event, resolution);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerLogin(PlayerLoginEvent event)
@@ -100,6 +111,30 @@ public class BukkitEventListener implements Listener
"{_YL}Server is in maintenance mode\nPlease try to connect later...");
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg);
}
+ private void processLimitedSlotsLogin(AsyncPlayerPreLoginEvent event, ResolutionResult resolution)
+ {
+ boolean allowed = true;
+ int freeSlots = rscp.getServer().getMaxPlayers() - Tools.getOnlinePlayers().size();
+ for(Map.Entry limit : slotLimits.entrySet())
+ {
+ boolean permission = resolution.hasPermission("rscp.limits." + limit.getKey());
+ if(freeSlots > limit.getValue())
+ if(permission)
+ {
+ allowed = true;
+ break;
+ } else
+ allowed = permission;
+ }
+ if(allowed)
+ {
+ event.allow();
+ return;
+ }
+ final String kickMsg = GenericChatCodes.processStringStatic(
+ "{_LR}Server is too full to allow you enter.\n{_YL}Please try to connect later...");
+ event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg);
+ }
public void setMaintenanceMode(String mMode)
{
rscp.settings.setMaintenanceMode(mMode);
@@ -117,7 +152,7 @@ public class BukkitEventListener implements Listener
if(player.hasPermission("rscp.maintenance." + rscp.settings.getMaintenanceMode()))
continue;
final String kick = GenericChatCodes.processStringStatic(
- "{_YL}Server is going into maintenance mode. Please connect later.");
+ "{_LR}Server is going into maintenance mode.\n{_YL}Please try to connect later...");
player.kickPlayer(kick);
}
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
index 8649553..80104e7 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
@@ -26,15 +26,12 @@ public class BukkitPermissionManager extends RestartableThread
{
this.rscp = plugin;
}
- private final Map resolutions = new ConcurrentHashMap<>();
private final LinkedBlockingQueue updateQueue = new LinkedBlockingQueue<>();
+ private final Map resolutions = new ConcurrentHashMap<>();
private final Map attachments = new HashMap<>();
- private final Map> persistentPermissions = new HashMap<>();
- private final Map> transientPermissions = new HashMap<>();
- private final Map> groups = new ConcurrentHashMap<>();
- private final Map prefixes = new ConcurrentHashMap<>();
- private final Map suffixes = new ConcurrentHashMap<>();
- private final Set debug = new HashSet<>();
+ private final Map> persistent = new HashMap<>();
+ private final Map> temporary = new HashMap<>();
+ private final Set debug = new HashSet<>();
public void recalculateOnlinePlayers()
{
updateQueue.addAll(Tools.getOnlinePlayers());
@@ -79,10 +76,8 @@ public class BukkitPermissionManager extends RestartableThread
{
updateQueue.remove(player);
attachments.remove(player);
- prefixes.remove(player);
- suffixes.remove(player);
- persistentPermissions.remove(player);
- transientPermissions.remove(player);
+ persistent.remove(player);
+ temporary.remove(player);
synchronized(debug)
{
debug.remove(player);
@@ -98,10 +93,7 @@ public class BukkitPermissionManager extends RestartableThread
for(Player current = updateQueue.take(); current != null; current = updateQueue.take())
{
final ResolutionResult result = rscp.permissionManager.resolvePlayer(current);
- groups.put(current, result.groups);
- prefixes.put(current, result.prefix);
- suffixes.put(current, result.suffix);
- persistentPermissions.put(current, result.permissions);
+ persistent.put(current, result.permissions);
final Player player = current;
rscp.getServer().getScheduler().runTask(rscp, new Runnable()
{
@@ -114,11 +106,11 @@ public class BukkitPermissionManager extends RestartableThread
// Create new and fill with permissions
final PermissionAttachment attachment = player.addAttachment(rscp);
attachments.put(player, attachment);
- final Map pp = persistentPermissions.get(player);
+ final Map pp = persistent.get(player);
if(pp != null && !pp.isEmpty())
for(Map.Entry row : pp.entrySet())
attachment.setPermission(row.getKey(), row.getValue());
- final Map tp = transientPermissions.get(player);
+ final Map tp = temporary.get(player);
if(tp != null && !tp.isEmpty())
for(Map.Entry row : tp.entrySet())
attachment.setPermission(row.getKey(), row.getValue());
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java
index 88038ff..66f49e7 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java
@@ -1,5 +1,8 @@
package ru.simsonic.rscPermissions.Bukkit;
import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import ru.simsonic.rscPermissions.API.Settings;
@@ -156,4 +159,14 @@ public class BukkitPluginConfiguration implements Settings
result.prefixes = config.getString("settings.connection.prefixes", "rscp_");
return result;
}
+ @Override
+ public Map getSlotLimits()
+ {
+ final FileConfiguration config = plugin.getConfig();
+ final ConfigurationSection limits = config.getConfigurationSection("settings.slot-limits");
+ final Map result = new HashMap<>();
+ for(String limit : limits.getKeys(false))
+ result.put(limit, limits.getInt(limit));
+ return result;
+ }
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
index a5c8f05..24b3889 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
@@ -319,11 +319,6 @@ public class BukkitCommands
for(String group : rscp.bridgeForBukkit.getPermission().getPlayerGroups(player))
list.add("{_LG}" + group);
throw new CommandAnswerException(list);
- /*
- case "ranks":
- list.add("{MAGENTA}Ranks of player {_YL}" + player.getName() + "{MAGENTA}:");
- throw new CommandAnswerException(list);
- */
}
throw new CommandAnswerException(list);
case "prefix":
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java
index a7daf2a..8b66602 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java
@@ -66,12 +66,6 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss
}
@Override
@Deprecated
- public boolean playerInGroup(String world, String player, String group)
- {
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
- }
- @Override
- @Deprecated
public boolean playerAddGroup(String world, String player, String group)
{
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
@@ -194,34 +188,43 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public boolean playerInGroup(String world, OfflinePlayer player, String group)
+ public boolean playerAddGroup(String world, OfflinePlayer player, String group)
{
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public boolean playerInGroup(Player player, String group)
+ public boolean playerAddGroup(Player player, String group)
{
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public boolean playerAddGroup(String world, OfflinePlayer player, String group)
+ public boolean playerRemoveGroup(String world, OfflinePlayer player, String group)
{
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public boolean playerAddGroup(Player player, String group)
+ public boolean playerRemoveGroup(Player player, String group)
{
throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
}
@Override
- public boolean playerRemoveGroup(String world, OfflinePlayer player, String group)
+ @Deprecated
+ public boolean playerInGroup(String world, String player, String group)
{
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
+ final ResolutionResult result = rscp.permissionManager.getResult(player);
+ return result.groups.contains(group);
}
@Override
- public boolean playerRemoveGroup(Player player, String group)
+ public boolean playerInGroup(String world, OfflinePlayer player, String group)
{
- throw new UnsupportedOperationException("This method is unsupported by rscPermissions.");
+ final ResolutionResult result = rscp.permissionManager.getResult(player);
+ return result.groups.contains(group);
+ }
+ @Override
+ public boolean playerInGroup(Player player, String group)
+ {
+ final ResolutionResult result = rscp.permissionManager.getResult(player);
+ return result.groups.contains(group);
}
@Override
@Deprecated
diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
index 10c6a13..1d8db00 100644
--- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
+++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
@@ -5,6 +5,7 @@ import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
+import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.mcstats.MetricsLite;
@@ -48,7 +49,9 @@ public final class BukkitPluginMain extends JavaPlugin
@Override
public void onEnable()
{
+ // Read settings and setup components
settings.readSettings();
+ bukkitListener.onEnable();
internalCache.setDefaultGroup(
settings.getDefaultGroup(),
settings.isDefaultForever());
@@ -121,18 +124,24 @@ public final class BukkitPluginMain extends JavaPlugin
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
- try
- {
- switch(cmd.getName().toLowerCase())
+ if(sender != null)
+ try
{
- case "rscp":
- commandHelper.onCommandHub(sender, args);
- break;
+ switch(cmd.getName().toLowerCase())
+ {
+ case "rscp":
+ commandHelper.onCommandHub(sender, args);
+ break;
+ }
+ } catch(CommandAnswerException ex) {
+ final boolean decolorize = Settings.decolorizeForConsole && sender instanceof ConsoleCommandSender;
+ for(String answer : ex.getMessageArray())
+ {
+ answer = GenericChatCodes.processStringStatic(Settings.chatPrefix + answer);
+ final String textToSend = decolorize ? org.bukkit.ChatColor.stripColor(answer) : answer;
+ sender.sendMessage(textToSend);
+ }
}
- } catch(CommandAnswerException ex) {
- for(String answer : ex.getMessageArray())
- sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer));
- }
return true;
}
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java b/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java
index 622e604..822ab06 100644
--- a/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java
+++ b/src/main/java/ru/simsonic/rscPermissions/SpongePluginMain.java
@@ -6,7 +6,7 @@ import org.spongepowered.api.event.state.ServerStoppedEvent;
import org.spongepowered.api.event.state.ServerStoppingEvent;
import org.spongepowered.api.plugin.Plugin;
-@Plugin(id = "rscPermissions", name = "rscPermissions", version = "0.9.0b")
+@Plugin(id = "rscPermissions", name = "rscPermissions", version = "0.9.9b")
public class SpongePluginMain
{
public void onServerStart(ServerAboutToStartEvent event)
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 2c1b54e..8050344 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -1,19 +1,22 @@
settings:
default-group: Default
- always-inherit-default-group: false
+ always-inherit-default-group: true
treat-asterisk-as-op: true
auto-reload-delay-sec: 900
- use-metrics: true
- language: english
- maintenance-mode: ''
region-finder-thread-granularity-msec: 1000
integration:
worldguard: true
residence: true
+ use-metrics: true
connection:
database: localhost:3306/minecraft
username: user1
password: pass1
prefixes: rscp_
+ slot-limits:
+ administrators: 5
+ premium: 25
+ maintenance-mode: ''
+ language: english
internal:
version: 3