diff --git a/src/main/java/loganintech/regionforcefield/RegionForcefieldPlugin.java b/src/main/java/loganintech/regionforcefield/RegionForcefieldPlugin.java index d2ac239..12e86d7 100644 --- a/src/main/java/loganintech/regionforcefield/RegionForcefieldPlugin.java +++ b/src/main/java/loganintech/regionforcefield/RegionForcefieldPlugin.java @@ -18,19 +18,34 @@ public final class RegionForcefieldPlugin extends JavaPlugin { @Override public void onEnable() { - // Save default config - saveDefaultConfig(); + try { + // Save default config + saveDefaultConfig(); - // Initialize components - this.permissionChecker = new RegionPermissionChecker(); - this.forcefieldRenderer = new ForcefieldRenderer(this); + // Check for WorldGuard + if (getServer().getPluginManager().getPlugin("WorldGuard") == null) { + getLogger().severe("WorldGuard not found! Disabling plugin."); + getServer().getPluginManager().disablePlugin(this); + return; + } - // Start the periodic update task - this.updateTask = new ForcefieldUpdateTask(this, permissionChecker, forcefieldRenderer); - long updateInterval = getConfig().getLong("update-interval-ticks", 20L); - updateTask.runTaskTimer(this, 0L, updateInterval); + // Initialize components + this.permissionChecker = new RegionPermissionChecker(this); + this.forcefieldRenderer = new ForcefieldRenderer(this); - getLogger().info("RegionForcefield has been enabled!"); + // Start the periodic update task + this.updateTask = new ForcefieldUpdateTask(this, permissionChecker, forcefieldRenderer); + long updateInterval = getConfig().getLong("update-interval-ticks", 20L); + updateTask.runTaskTimer(this, 0L, updateInterval); + + getLogger().info("RegionForcefield has been enabled!"); + getLogger().info("Update interval: " + updateInterval + " ticks"); + getLogger().info("Max render distance: " + getConfig().getInt("max-render-distance", 100) + " blocks"); + } catch (Exception e) { + getLogger().severe("Failed to enable RegionForcefield: " + e.getMessage()); + e.printStackTrace(); + getServer().getPluginManager().disablePlugin(this); + } } @Override @@ -62,4 +77,15 @@ public final class RegionForcefieldPlugin extends JavaPlugin { public ForcefieldRenderer getForcefieldRenderer() { return forcefieldRenderer; } + + /** + * Logs a debug message if debug mode is enabled. + * + * @param message the message to log + */ + public void debug(@NotNull String message) { + if (getConfig().getBoolean("debug", false)) { + getLogger().info("[DEBUG] " + message); + } + } } diff --git a/src/main/java/loganintech/regionforcefield/forcefield/ForcefieldRenderer.java b/src/main/java/loganintech/regionforcefield/forcefield/ForcefieldRenderer.java index 66e31e9..d9b92ff 100644 --- a/src/main/java/loganintech/regionforcefield/forcefield/ForcefieldRenderer.java +++ b/src/main/java/loganintech/regionforcefield/forcefield/ForcefieldRenderer.java @@ -8,9 +8,9 @@ import com.sk89q.worldguard.protection.regions.ProtectedRegion; import org.bukkit.Color; import org.bukkit.Location; import org.bukkit.Particle; +import loganintech.regionforcefield.RegionForcefieldPlugin; import org.bukkit.World; import org.bukkit.entity.Player; -import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -20,7 +20,7 @@ import java.util.List; */ public class ForcefieldRenderer { - private final Plugin plugin; + private final RegionForcefieldPlugin plugin; private final double particleSpacing; private final Particle.DustOptions dustOptions; @@ -29,7 +29,7 @@ public class ForcefieldRenderer { * * @param plugin the plugin instance */ - public ForcefieldRenderer(@NotNull Plugin plugin) { + public ForcefieldRenderer(@NotNull RegionForcefieldPlugin plugin) { this.plugin = plugin; this.particleSpacing = plugin.getConfig().getDouble("particle-spacing", 0.5); @@ -50,13 +50,21 @@ public class ForcefieldRenderer { * @param world the world the region is in */ public void renderForcefield(@NotNull Player player, @NotNull ProtectedRegion region, @NotNull World world) { - if (region instanceof ProtectedCuboidRegion) { - renderCuboidForcefield(player, (ProtectedCuboidRegion) region, world); - } else if (region instanceof ProtectedPolygonalRegion) { - renderPolygonalForcefield(player, (ProtectedPolygonalRegion) region, world); - } else { - // For other region types, fall back to rendering a bounding box - renderBoundingBoxForcefield(player, region, world); + try { + plugin.debug("Rendering forcefield for region " + region.getId() + " to player " + player.getName()); + + if (region instanceof ProtectedCuboidRegion) { + renderCuboidForcefield(player, (ProtectedCuboidRegion) region, world); + } else if (region instanceof ProtectedPolygonalRegion) { + renderPolygonalForcefield(player, (ProtectedPolygonalRegion) region, world); + } else { + // For other region types, fall back to rendering a bounding box + plugin.debug("Using bounding box for region type: " + region.getClass().getSimpleName()); + renderBoundingBoxForcefield(player, region, world); + } + } catch (Exception e) { + plugin.getLogger().warning("Error rendering forcefield for region " + region.getId() + ": " + e.getMessage()); + e.printStackTrace(); } } diff --git a/src/main/java/loganintech/regionforcefield/region/RegionPermissionChecker.java b/src/main/java/loganintech/regionforcefield/region/RegionPermissionChecker.java index c72d9f6..9035353 100644 --- a/src/main/java/loganintech/regionforcefield/region/RegionPermissionChecker.java +++ b/src/main/java/loganintech/regionforcefield/region/RegionPermissionChecker.java @@ -7,6 +7,7 @@ import com.sk89q.worldguard.bukkit.WorldGuardPlugin; import com.sk89q.worldguard.protection.flags.Flags; import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.regions.ProtectedRegion; +import loganintech.regionforcefield.RegionForcefieldPlugin; import org.bukkit.World; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -19,6 +20,19 @@ import java.util.Set; */ public class RegionPermissionChecker { + private final RegionForcefieldPlugin plugin; + private final WorldGuardPlugin worldGuard; + + /** + * Creates a new region permission checker. + * + * @param plugin the plugin instance + */ + public RegionPermissionChecker(@NotNull RegionForcefieldPlugin plugin) { + this.plugin = plugin; + this.worldGuard = (WorldGuardPlugin) plugin.getServer().getPluginManager().getPlugin("WorldGuard"); + } + /** * Gets all regions in a world that the specified player cannot enter. * @@ -30,24 +44,39 @@ public class RegionPermissionChecker { public Set getBlockedRegions(@NotNull Player player, @NotNull World world) { Set blockedRegions = new HashSet<>(); - // Get the region manager for this world - RegionManager regionManager = WorldGuard.getInstance() - .getPlatform() - .getRegionContainer() - .get(BukkitAdapter.adapt(world)); + try { + // Get the region manager for this world + RegionManager regionManager = WorldGuard.getInstance() + .getPlatform() + .getRegionContainer() + .get(BukkitAdapter.adapt(world)); - if (regionManager == null) { - return blockedRegions; - } - - // Convert Bukkit player to WorldGuard LocalPlayer - LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player); - - // Check each region - for (ProtectedRegion region : regionManager.getRegions().values()) { - if (!canEnterRegion(localPlayer, region)) { - blockedRegions.add(region); + if (regionManager == null) { + return blockedRegions; } + + // Convert Bukkit player to WorldGuard LocalPlayer + if (worldGuard == null) { + plugin.getLogger().warning("WorldGuard plugin reference is null!"); + return blockedRegions; + } + + LocalPlayer localPlayer = worldGuard.wrapPlayer(player); + + // Check each region + for (ProtectedRegion region : regionManager.getRegions().values()) { + if (!canEnterRegion(localPlayer, region)) { + blockedRegions.add(region); + plugin.debug("Player " + player.getName() + " blocked from region: " + region.getId()); + } + } + + if (!blockedRegions.isEmpty()) { + plugin.debug("Found " + blockedRegions.size() + " blocked regions for " + player.getName()); + } + } catch (Exception e) { + plugin.getLogger().warning("Error checking blocked regions: " + e.getMessage()); + e.printStackTrace(); } return blockedRegions; diff --git a/src/main/java/loganintech/regionforcefield/task/ForcefieldUpdateTask.java b/src/main/java/loganintech/regionforcefield/task/ForcefieldUpdateTask.java index 7e978d8..4e28cac 100644 --- a/src/main/java/loganintech/regionforcefield/task/ForcefieldUpdateTask.java +++ b/src/main/java/loganintech/regionforcefield/task/ForcefieldUpdateTask.java @@ -38,17 +38,32 @@ public class ForcefieldUpdateTask extends BukkitRunnable { @Override public void run() { - // Iterate through all online players - for (Player player : plugin.getServer().getOnlinePlayers()) { - // Get all regions the player cannot enter in their current world - Set blockedRegions = permissionChecker.getBlockedRegions(player, player.getWorld()); + try { + // Iterate through all online players + for (Player player : plugin.getServer().getOnlinePlayers()) { + // Get all regions the player cannot enter in their current world + Set blockedRegions = permissionChecker.getBlockedRegions(player, player.getWorld()); - // Render forcefields for nearby blocked regions - for (ProtectedRegion region : blockedRegions) { - if (isRegionNearPlayer(player, region)) { - forcefieldRenderer.renderForcefield(player, region, player.getWorld()); + if (!blockedRegions.isEmpty()) { + plugin.debug("Processing " + blockedRegions.size() + " blocked regions for " + player.getName()); + } + + // Render forcefields for nearby blocked regions + int rendered = 0; + for (ProtectedRegion region : blockedRegions) { + if (isRegionNearPlayer(player, region)) { + forcefieldRenderer.renderForcefield(player, region, player.getWorld()); + rendered++; + } + } + + if (rendered > 0) { + plugin.debug("Rendered " + rendered + " forcefields for " + player.getName()); } } + } catch (Exception e) { + plugin.getLogger().warning("Error in forcefield update task: " + e.getMessage()); + e.printStackTrace(); } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 90c834b..68bd388 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,8 @@ # RegionForcefield Configuration +# Enable debug logging (useful for troubleshooting) +debug: false + # How often to update forcefields (in ticks, 20 ticks = 1 second) update-interval-ticks: 20