diff --git a/CHANGELOG.md b/CHANGELOG.md
index d1d93be..9a24b48 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,11 +1,9 @@
-## V1.9.7 RELEASE - Minecraft 1.21.10
+## V1.9.8 RELEASE
---
### Changelog:
-- Compatibility for 1.21.10
-- Potentially fixed permission
-- Fixed compatibility with CraftBukkit
+- Fixed permission issues
Please report any bugs to the [Discord Server](https://discord.gg/VNXV4PDhfK). The sooner the bug is reported, the faster I can release a new fix which patches it.
Thanks for all the support with this plugin ! <3
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 1590e64..b3de23c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
fr.gamecreep
BasicHomes
- 1.9.7-RELEASE-1.21.10
+ 1.9.8-RELEASE
jar
BasicHomes
diff --git a/src/main/java/fr/gamecreep/basichomes/BasicHomes.java b/src/main/java/fr/gamecreep/basichomes/BasicHomes.java
index 1e1a100..c26ba95 100644
--- a/src/main/java/fr/gamecreep/basichomes/BasicHomes.java
+++ b/src/main/java/fr/gamecreep/basichomes/BasicHomes.java
@@ -21,6 +21,7 @@
import org.bstats.bukkit.Metrics;
import org.bstats.charts.SimplePie;
import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
@@ -43,6 +44,7 @@ public final class BasicHomes extends JavaPlugin {
public void onEnable() {
this.migrationsVerifier.verifyMigrations();
this.loadConfig();
+ this.loadPlayerPermissions();
this.loadCommands();
this.loadEvents();
this.loadMetrics();
@@ -56,6 +58,12 @@ public void onDisable() {
LoggerUtils.logInfo("Plugin successfully stopped !");
}
+ private void loadPlayerPermissions() {
+ for (Player player : getServer().getOnlinePlayers()) {
+ this.permissionDataHandler.handlePlayerJoin(player);
+ }
+ }
+
private void loadCommands() {
Objects.requireNonNull(super.getCommand("config")).setExecutor(new ConfigCommand(this));
Objects.requireNonNull(super.getCommand("permissions")).setExecutor(new PermissionCommand(this));
diff --git a/src/main/java/fr/gamecreep/basichomes/Constants.java b/src/main/java/fr/gamecreep/basichomes/Constants.java
index f0f3288..3338562 100644
--- a/src/main/java/fr/gamecreep/basichomes/Constants.java
+++ b/src/main/java/fr/gamecreep/basichomes/Constants.java
@@ -8,7 +8,7 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Constants {
- public static final String PLUGIN_VERSION = "1.9.7";
+ public static final String PLUGIN_VERSION = "1.9.8";
public static final int BSTATS_PLUGIN_ID = 25429;
public static final ChatColor INFO_COLOR = ChatColor.DARK_AQUA;
diff --git a/src/main/java/fr/gamecreep/basichomes/commands/homes/GetHomes.java b/src/main/java/fr/gamecreep/basichomes/commands/homes/GetHomes.java
index d68931f..201f43b 100644
--- a/src/main/java/fr/gamecreep/basichomes/commands/homes/GetHomes.java
+++ b/src/main/java/fr/gamecreep/basichomes/commands/homes/GetHomes.java
@@ -2,9 +2,11 @@
import fr.gamecreep.basichomes.BasicHomes;
import fr.gamecreep.basichomes.entities.SavedPosition;
+import fr.gamecreep.basichomes.entities.enums.Permission;
import fr.gamecreep.basichomes.entities.enums.PositionType;
import fr.gamecreep.basichomes.menus.home.HomeMenu;
import fr.gamecreep.basichomes.menus.home.HomeMenuFactory;
+import fr.gamecreep.basichomes.utils.ChatUtils;
import lombok.NonNull;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -21,6 +23,11 @@ public GetHomes(final BasicHomes plugin) {
public boolean onCommand(@NonNull final CommandSender commandSender) {
if (commandSender instanceof Player playerSender) {
+ if (!playerSender.hasPermission(Permission.USE_HOME.getName())) {
+ ChatUtils.sendNoPermission(playerSender, Permission.USE_HOME);
+ return true;
+ }
+
final HomeMenuFactory factory = this.plugin.getHomeMenuFactory();
final List homes = this.plugin.getPositionDataHandler().getAllByPlayer(PositionType.HOME, playerSender);
diff --git a/src/main/java/fr/gamecreep/basichomes/commands/warps/GetWarps.java b/src/main/java/fr/gamecreep/basichomes/commands/warps/GetWarps.java
index 679a4b1..cd788e0 100644
--- a/src/main/java/fr/gamecreep/basichomes/commands/warps/GetWarps.java
+++ b/src/main/java/fr/gamecreep/basichomes/commands/warps/GetWarps.java
@@ -2,9 +2,11 @@
import fr.gamecreep.basichomes.BasicHomes;
import fr.gamecreep.basichomes.entities.SavedPosition;
+import fr.gamecreep.basichomes.entities.enums.Permission;
import fr.gamecreep.basichomes.entities.enums.PositionType;
import fr.gamecreep.basichomes.menus.warp.WarpMenu;
import fr.gamecreep.basichomes.menus.warp.WarpMenuFactory;
+import fr.gamecreep.basichomes.utils.ChatUtils;
import lombok.NonNull;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -21,6 +23,11 @@ public GetWarps(BasicHomes plugin) {
public boolean onCommand(@NonNull final CommandSender commandSender) {
if (commandSender instanceof Player playerSender) {
+ if (!playerSender.hasPermission(Permission.USE_WARP.getName())) {
+ ChatUtils.sendNoPermission(playerSender, Permission.USE_WARP);
+ return true;
+ }
+
final WarpMenuFactory factory = this.plugin.getWarpMenuFactory();
final List warps = this.plugin.getPositionDataHandler().getAll(PositionType.WARP);
diff --git a/src/main/java/fr/gamecreep/basichomes/events/PermissionEvents.java b/src/main/java/fr/gamecreep/basichomes/events/PermissionEvents.java
index 75b2e99..8788cfe 100644
--- a/src/main/java/fr/gamecreep/basichomes/events/PermissionEvents.java
+++ b/src/main/java/fr/gamecreep/basichomes/events/PermissionEvents.java
@@ -1,10 +1,11 @@
package fr.gamecreep.basichomes.events;
import fr.gamecreep.basichomes.BasicHomes;
-import lombok.NonNull;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
public class PermissionEvents implements Listener {
@@ -14,8 +15,13 @@ public PermissionEvents(BasicHomes plugin) {
this.plugin = plugin;
}
+ @EventHandler(priority = EventPriority.LOWEST)
+ private void onPlayerJoin(PlayerJoinEvent event) {
+ this.plugin.getPermissionDataHandler().handlePlayerJoin(event.getPlayer());
+ }
+
@EventHandler
- private void onPlayerJoin(@NonNull final PlayerJoinEvent event) {
- this.plugin.getPermissionDataHandler().applyPermissions(event.getPlayer());
+ private void onPlayerQuit(PlayerQuitEvent event) {
+ this.plugin.getPermissionDataHandler().handlePlayerQuit(event.getPlayer());
}
}
diff --git a/src/main/java/fr/gamecreep/basichomes/files/PermissionDataHandler.java b/src/main/java/fr/gamecreep/basichomes/files/PermissionDataHandler.java
index 683d0e7..c73ac3b 100644
--- a/src/main/java/fr/gamecreep/basichomes/files/PermissionDataHandler.java
+++ b/src/main/java/fr/gamecreep/basichomes/files/PermissionDataHandler.java
@@ -5,6 +5,7 @@
import fr.gamecreep.basichomes.entities.permissions.DefaultPermissions;
import fr.gamecreep.basichomes.entities.permissions.PermissionFile;
import fr.gamecreep.basichomes.entities.permissions.PlayerPermissions;
+import fr.gamecreep.basichomes.utils.LoggerUtils;
import lombok.NonNull;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
@@ -27,7 +28,11 @@ public void setPermission(@NonNull final UUID playerId, @NonNull final String pe
final PlayerPermissions entry = getOrCreatePlayerEntry(playerId);
entry.getPermissions().put(permissionNode, value);
this.dataStore.save();
- this.applyPermissions(playerId);
+
+ Player player = this.plugin.getServer().getPlayer(playerId);
+ if (player != null) {
+ this.refreshPermissions(player);
+ }
}
public void setDefaultPermission(@NonNull final DefaultPermissions.GroupPermission group,
@@ -43,7 +48,11 @@ public void removePermission(@NonNull final UUID playerId, @NonNull final String
final PlayerPermissions entry = getOrCreatePlayerEntry(playerId);
entry.getPermissions().remove(permissionNode);
this.dataStore.save();
- this.applyPermissions(playerId);
+
+ Player player = this.plugin.getServer().getPlayer(playerId);
+ if (player != null) {
+ this.refreshPermissions(player);
+ }
}
public void removeDefaultPermission(@NonNull final DefaultPermissions.GroupPermission group,
@@ -138,36 +147,52 @@ public List getPlayerGroups(@NonNull final P
return groups;
}
- public void applyPermissions(@NonNull final Player player) {
- final UUID playerId = player.getUniqueId();
-
- final PermissionAttachment oldAttachment = this.plugin.getPermissionAttachments().remove(playerId);
- if (oldAttachment != null) {
- player.removeAttachment(oldAttachment);
+ private void applyDefaultPermissions() {
+ for (final Player player : this.plugin.getServer().getOnlinePlayers()) {
+ this.refreshPermissions(player);
}
+ }
+
+ public void refreshPermissions(@NonNull Player player) {
+ UUID uuid = player.getUniqueId();
+ PermissionAttachment attachment = this.plugin.getPermissionAttachments().get(uuid);
- final PermissionAttachment newAttachment = player.addAttachment(this.plugin);
+ if (attachment == null) {
+ // Fallback: create a new attachment
+ attachment = player.addAttachment(this.plugin);
+ this.plugin.getPermissionAttachments().put(uuid, attachment);
+ LoggerUtils.logInfo("Recreating permission attachment for player " + uuid);
+ }
- final List groups = this.getPlayerGroups(player);
- for (final DefaultPermissions.GroupPermission group : groups) {
- this.getDefaultPermissions(group).forEach(newAttachment::setPermission);
+ for (String key : new HashSet<>(attachment.getPermissions().keySet())) {
+ attachment.unsetPermission(key);
}
- this.getPlayerPermissions(playerId).forEach(newAttachment::setPermission);
+ for (DefaultPermissions.GroupPermission group : getPlayerGroups(player)) {
+ getDefaultPermissions(group).forEach(attachment::setPermission);
+ }
- this.plugin.getPermissionAttachments().put(playerId, newAttachment);
+ getPlayerPermissions(uuid).forEach(attachment::setPermission);
}
- public void applyPermissions(@NonNull final UUID playerId) {
- final Player player = this.plugin.getServer().getPlayer(playerId);
- if (player != null && player.isOnline()) {
- this.applyPermissions(player);
- }
+ public void handlePlayerJoin(Player player) {
+ PermissionAttachment attachment = player.addAttachment(this.plugin);
+ this.plugin.getPermissionAttachments().put(player.getUniqueId(), attachment);
+
+ this.refreshPermissions(player);
}
- private void applyDefaultPermissions() {
- for (final Player player : this.plugin.getServer().getOnlinePlayers()) {
- this.applyPermissions(player);
+ public void handlePlayerQuit(Player player) {
+ UUID uuid = player.getUniqueId();
+ PermissionAttachment att = this.plugin.getPermissionAttachments().remove(uuid);
+
+ if (att != null) {
+ try {
+ player.removeAttachment(att);
+ } catch (IllegalArgumentException ignored) {
+ LoggerUtils.logWarning("Unable to remove permission attachment for player " + uuid);
+ }
}
}
+
}
diff --git a/src/main/java/fr/gamecreep/basichomes/utils/ChatUtils.java b/src/main/java/fr/gamecreep/basichomes/utils/ChatUtils.java
index e53f89b..c4fdd0f 100644
--- a/src/main/java/fr/gamecreep/basichomes/utils/ChatUtils.java
+++ b/src/main/java/fr/gamecreep/basichomes/utils/ChatUtils.java
@@ -7,18 +7,29 @@
import lombok.NonNull;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
+import org.bukkit.command.ConsoleCommandSender;
+
+import static fr.gamecreep.basichomes.utils.LoggerUtils.CONSOLE_PREFIX;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class ChatUtils {
public static final String PREFIX = String.format("%s[%sBH%s] ", ChatColor.GRAY, Constants.PLUGIN_COLOR, ChatColor.GRAY);
+ private static String getPrefix(CommandSender sender) {
+ if (sender instanceof ConsoleCommandSender) {
+ return CONSOLE_PREFIX;
+ } else {
+ return PREFIX;
+ }
+ }
+
public static void sendPlayerError(@NonNull final CommandSender target, final String message) {
- target.sendMessage(PREFIX + Constants.WARNING_COLOR + message);
+ target.sendMessage(getPrefix(target) + Constants.WARNING_COLOR + message);
}
public static void sendPlayerInfo(@NonNull final CommandSender target, final String message) {
- target.sendMessage(PREFIX + Constants.SUCCESS_COLOR + message);
+ target.sendMessage(getPrefix(target) + Constants.SUCCESS_COLOR + message);
}
public static void sendNoPermission(CommandSender target, Permission permission) {