Skip to content

Commit

Permalink
"minor" refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
T14D3 committed Feb 1, 2025
1 parent 588404e commit 0520c13
Show file tree
Hide file tree
Showing 11 changed files with 236 additions and 146 deletions.
6 changes: 0 additions & 6 deletions src/main/java/de/t14d3/zones/PaperBootstrap.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import de.t14d3.zones.commands.CommandNode;
import de.t14d3.zones.utils.Flags;
import de.t14d3.zones.utils.Utils;
import io.papermc.paper.command.brigadier.Commands;
import io.papermc.paper.plugin.bootstrap.BootstrapContext;
import io.papermc.paper.plugin.bootstrap.PluginBootstrap;
Expand All @@ -12,8 +11,6 @@
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;

import java.util.Map;

@SuppressWarnings("UnstableApiUsage")
public class PaperBootstrap implements PluginBootstrap {

Expand All @@ -23,9 +20,6 @@ public class PaperBootstrap implements PluginBootstrap {
@Override
public void bootstrap(BootstrapContext context) {
flags = new Flags();
for (Map.Entry<String, String> entry : Utils.defaultFlags().entrySet()) {
flags.registerFlag(entry.getKey(), entry.getValue());
}
CommandNode cmd = new CommandNode(this);
LifecycleEventManager<@NotNull BootstrapContext> eventManager = context.getLifecycleManager();
eventManager.registerEventHandler(LifecycleEvents.COMMANDS, event -> {
Expand Down
55 changes: 32 additions & 23 deletions src/main/java/de/t14d3/zones/PermissionManager.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package de.t14d3.zones;

import de.t14d3.zones.utils.Actions;
import de.t14d3.zones.utils.Flag;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
Expand All @@ -14,7 +14,7 @@ public class PermissionManager {

private RegionManager regionManager;

private final ConcurrentHashMap<UUID, ConcurrentLinkedQueue<CacheEntry>> interactionCache = new ConcurrentHashMap<UUID, ConcurrentLinkedQueue<CacheEntry>>();
private final ConcurrentHashMap<String, ConcurrentLinkedQueue<CacheEntry>> interactionCache = new ConcurrentHashMap<String, ConcurrentLinkedQueue<CacheEntry>>();
private final ConcurrentHashMap<String, ConcurrentLinkedQueue<CacheEntry>> permissionCache = new ConcurrentHashMap<String, ConcurrentLinkedQueue<CacheEntry>>();

public PermissionManager() {}
Expand All @@ -24,23 +24,33 @@ public void setRegionManager(RegionManager regionManager) {
this.regionManager = regionManager;
}


public boolean checkAction(Location location, UUID playerUUID, Flag action, String type, Object... extra) {
return checkAction(location, playerUUID.toString(), action, type, extra);
}

/**
* Checks if a player can interact with a region.
* @param location The location of the interaction.
* @param playerUUID The UUID of the player.
* @param who The UUID of the player.
* @param action The action the player wants to perform.
* @param type The type of the block or entity the interaction happened with.
* @return True if the player can interact with the region, false otherwise.
*/
public boolean canInteract(Location location, UUID playerUUID, Actions action, String type) {
public boolean checkAction(Location location, String who, Flag action, String type, Object... extra) {

// Skip checking if player has global bypass permission
Player player = Bukkit.getPlayer(playerUUID);
if (player != null && player.hasPermission("zones.bypass.claimed")) {
return true;
Player player = null;
try {
player = Bukkit.getPlayer(UUID.fromString(who));
if (player != null && player.hasPermission("zones.bypass.claimed")) {
return true;
}
} catch (IllegalArgumentException ignored) {
}
if (interactionCache.containsKey(playerUUID)) {
ConcurrentLinkedQueue<CacheEntry> entries = interactionCache.get(playerUUID);
boolean base = extra[0] == null;
if (base && interactionCache.containsKey(who)) {
ConcurrentLinkedQueue<CacheEntry> entries = interactionCache.get(who);
for (CacheEntry entry : entries) {
if (entry.isEqual(location, action.name(), type)) {
return entry.result.equals(Result.TRUE);
Expand All @@ -55,7 +65,7 @@ public boolean canInteract(Location location, UUID playerUUID, Actions action, S

// Only check regions with a higher priority than the current value
if (region.getPriority() > priority) {
Result hasPermission = hasPermission(playerUUID.toString(), action.name(), type, region);
Result hasPermission = hasPermission(who, action.name(), type, region);
if (!hasPermission.equals(Result.UNDEFINED)) {
result = hasPermission;
priority = region.getPriority();
Expand All @@ -64,7 +74,7 @@ public boolean canInteract(Location location, UUID playerUUID, Actions action, S
}
// If same priority, both have to be true, otherwise will assume false
else if (region.getPriority() == priority) {
Result hasPermission = hasPermission(playerUUID.toString(), action.name(), type, region);
Result hasPermission = hasPermission(who, action.name(), type, region);
if (hasPermission.equals(Result.FALSE) || result.equals(Result.FALSE)) {
result = Result.FALSE;
priority = region.getPriority();
Expand All @@ -73,6 +83,9 @@ else if (region.getPriority() == priority) {
}
}

if (base) {
interactionCache.computeIfAbsent(who, k -> new ConcurrentLinkedQueue<>()).add(new CacheEntry(location, action.name(), type, result));
}
return result.equals(Result.TRUE);
}
// If no region found, check for unclaimed bypass perm and return false if not found
Expand All @@ -86,7 +99,7 @@ else if (region.getPriority() == priority) {
* @param target The player to invalidate the cache for.
*/
public void invalidateInteractionCache(UUID target) {
interactionCache.remove(target);
interactionCache.remove(target.toString());
}

/**
Expand Down Expand Up @@ -148,10 +161,10 @@ public void invalidateCaches() {
* @param type The type of object the permission applies to (e.g., "GRASS_BLOCK").
* @param region The region in which the permission is being checked.
* @return true if the player has the specified permission for the type, false otherwise.
* @see #hasPermission(String, String, String, Region)
* @see #hasPermission(String, String, String, Region, Object...)
*/
public boolean hasPermission(UUID uuid, String permission, String type, Region region) {
return hasPermission(uuid.toString(), permission, type, region).equals(Result.TRUE);
public boolean hasPermission(UUID uuid, String permission, String type, Region region, Object... extra) {
return hasPermission(uuid.toString(), permission, type, region, extra).equals(Result.TRUE);
}
/**
* Checks if a player has a specific permission for a given type in the provided region.
Expand All @@ -160,9 +173,10 @@ public boolean hasPermission(UUID uuid, String permission, String type, Region r
* @param permission The permission being checked (e.g., "break", "place").
* @param type The type of object the permission applies to (e.g., "GRASS_BLOCK").
* @param region The region in which the permission is being checked.
* @param extra Additional, optional information, for example a spawn reason.
* @return {@link Result}
*/
public Result hasPermission(String who, String permission, String type, Region region) {
public Result hasPermission(String who, String permission, String type, Region region, Object... extra) {
if (permissionCache.containsKey(who)) {
ConcurrentLinkedQueue<CacheEntry> entries = permissionCache.get(who);
for (CacheEntry entry : entries) {
Expand All @@ -172,18 +186,13 @@ public Result hasPermission(String who, String permission, String type, Region r
}
}
Result result = Result.UNDEFINED; // Initialize result as null
result = calculatePermission(who, permission, type, region);
result = calculatePermission(who, permission, type, region, extra);
permissionCache.computeIfAbsent(who, k -> new ConcurrentLinkedQueue<>()).add(new CacheEntry(permission, type, region.getKey(), result));
return result;
}

private Result calculatePermission(String who, String permission, String type, Region region) {
private Result calculatePermission(String who, String permission, String type, Region region, Object... extra) {
permission = permission.toLowerCase();
Player player = null;
try {
player = Bukkit.getPlayer(UUID.fromString(who));
} catch (IllegalArgumentException ignored) {
}

Result result = Result.UNDEFINED; // Initialize result as null

Expand Down
7 changes: 4 additions & 3 deletions src/main/java/de/t14d3/zones/commands/CommandNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import de.t14d3.zones.PaperBootstrap;
import de.t14d3.zones.Region;
import de.t14d3.zones.Zones;
import de.t14d3.zones.utils.Flag;
import de.t14d3.zones.utils.Flags;
import de.t14d3.zones.utils.Utils;
import io.papermc.paper.command.brigadier.CommandSourceStack;
Expand Down Expand Up @@ -136,10 +137,10 @@ public LiteralCommandNode<CommandSourceStack> node() {
.suggests((ctx, builder) -> {
Flags flags = context.getFlags();
MiniMessage mm = MiniMessage.miniMessage();
for (Map.Entry<String, String> entry : flags.getFlags().entrySet()) {
builder.suggest(entry.getKey(),
for (Flag entry : Flags.getFlags()) {
builder.suggest(entry.name(),
MessageComponentSerializer.message().serialize(
mm.deserialize(Zones.getInstance().getMessages().getOrDefault("flags." + entry.getKey(), entry.getValue()))
mm.deserialize(Zones.getInstance().getMessages().getOrDefault("flags." + entry.name(), entry.getDescription()))
));
}
return builder.buildFuture();
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/de/t14d3/zones/commands/FlagArgument.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@

@SuppressWarnings("UnstableApiUsage")
public class FlagArgument implements CustomArgumentType.Converted<String, String> {
private final Flags flags;

public FlagArgument(PaperBootstrap context) {
this.flags = context.getFlags();
}
@Override
public @NotNull String convert(@NotNull String nativeType) throws CommandSyntaxException {
return flags.getFlags().get(nativeType);
public String convert(@NotNull String nativeType) throws CommandSyntaxException {
return Flags.getFlag(nativeType).name();
}

@Override
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/de/t14d3/zones/integrations/PlaceholderAPI.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import de.t14d3.zones.Region;
import de.t14d3.zones.Zones;
import de.t14d3.zones.utils.Actions;
import de.t14d3.zones.utils.Flags;
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
Expand Down Expand Up @@ -166,16 +166,16 @@ public String onPlaceholderRequest(Player player, @NotNull String params) {
}
if (params.equalsIgnoreCase("can_place_hand")) {
if (!regions.isEmpty()) {
return plugin.getPermissionManager().canInteract(player.getLocation(), player.getUniqueId(), Actions.PLACE, player.getInventory().getItemInMainHand().getType().name()) ? "true" : "false";
return plugin.getPermissionManager().checkAction(player.getLocation(), player.getUniqueId(), Flags.PLACE, player.getInventory().getItemInMainHand().getType().name()) ? "true" : "false";
}
return "false";
}
if (params.equalsIgnoreCase("can_break_target")) {
if (!regions.isEmpty()) {
return plugin.getPermissionManager().canInteract(
return plugin.getPermissionManager().checkAction(
player.getLocation(),
player.getUniqueId(),
Actions.BREAK,
Flags.BREAK,
player.getTargetBlockExact(5) != null
? player.getTargetBlockExact(5).getType().name() : "")
? "true" : "false";
Expand All @@ -187,7 +187,7 @@ public String onPlaceholderRequest(Player player, @NotNull String params) {
// There's definitely a better way to do this, but it works and I'm too lazy to find a better one
String type = params.substring(params.indexOf('_', params.indexOf('_') + 1) + 1);
if (!regions.isEmpty()) {
return plugin.getPermissionManager().canInteract(player.getLocation(), player.getUniqueId(), Actions.valueOf(action), type) ? "true" : "false";
return plugin.getPermissionManager().checkAction(player.getLocation(), player.getUniqueId(), Flags.getFlag(action), type) ? "true" : "false";
}
return "false";
}
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/de/t14d3/zones/listeners/NonPlayerEventListener.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package de.t14d3.zones.listeners;

import de.t14d3.zones.PermissionManager;
import de.t14d3.zones.RegionManager;
import de.t14d3.zones.Zones;
import de.t14d3.zones.utils.Flags;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;

public class NonPlayerEventListener implements Listener {

private final Zones plugin;
private final RegionManager regionManager;
private final PermissionManager permissionManager;

public NonPlayerEventListener(Zones plugin) {
this.plugin = plugin;
this.regionManager = plugin.getRegionManager();
this.permissionManager = plugin.getPermissionManager();
}

@EventHandler
public void onEntitySpawn(CreatureSpawnEvent event) {
if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.SPAWNER_EGG)) {
return;
}
if (!permissionManager.checkAction(event.getLocation(), "universal", Flags.SPAWN, event.getEntity().getType().name(), event.getSpawnReason().name())) {
event.setCancelled(true);
}
}
}
Loading

0 comments on commit 0520c13

Please sign in to comment.