Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>fr.gamecreep</groupId>
<artifactId>BasicHomes</artifactId>
<version>1.9.7-RELEASE-1.21.10</version>
<version>1.9.8-RELEASE</version>
<packaging>jar</packaging>

<name>BasicHomes</name>
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/fr/gamecreep/basichomes/BasicHomes.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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();
Expand All @@ -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));
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/fr/gamecreep/basichomes/Constants.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<SavedPosition> homes = this.plugin.getPositionDataHandler().getAllByPlayer(PositionType.HOME, playerSender);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<SavedPosition> warps = this.plugin.getPositionDataHandler().getAll(PositionType.WARP);

Expand Down
Original file line number Diff line number Diff line change
@@ -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 {

Expand All @@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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,
Expand All @@ -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,
Expand Down Expand Up @@ -138,36 +147,52 @@ public List<DefaultPermissions.GroupPermission> 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<DefaultPermissions.GroupPermission> 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);
}
}
}

}
15 changes: 13 additions & 2 deletions src/main/java/fr/gamecreep/basichomes/utils/ChatUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down