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) {