Some updates

This commit is contained in:
Logan Saso
2025-10-04 21:44:34 -07:00
parent 9395065465
commit 8a95a982bb
5 changed files with 125 additions and 44 deletions

View File

@@ -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);
}
}
}

View File

@@ -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();
}
}

View File

@@ -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<ProtectedRegion> getBlockedRegions(@NotNull Player player, @NotNull World world) {
Set<ProtectedRegion> 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;

View File

@@ -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<ProtectedRegion> 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<ProtectedRegion> 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();
}
}

View File

@@ -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