117 lines
4.1 KiB
Java
117 lines
4.1 KiB
Java
package com.boydti.fawe.bukkit.regions;
|
|
|
|
import com.boydti.fawe.bukkit.wrapper.AsyncBlock;
|
|
import com.boydti.fawe.bukkit.wrapper.AsyncWorld;
|
|
import com.boydti.fawe.regions.FaweMask;
|
|
import com.sk89q.worldedit.bukkit.BukkitAdapter;
|
|
import com.sk89q.worldedit.bukkit.BukkitPlayer;
|
|
import com.sk89q.worldedit.entity.Player;
|
|
import com.sk89q.worldedit.math.BlockVector3;
|
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
|
import com.sk89q.worldedit.regions.Region;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.World;
|
|
import org.bukkit.event.EventException;
|
|
import org.bukkit.event.EventPriority;
|
|
import org.bukkit.event.block.BlockBreakEvent;
|
|
import org.bukkit.plugin.RegisteredListener;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Locale;
|
|
|
|
public class FreeBuildRegion extends BukkitMaskManager {
|
|
private final ArrayList<RegisteredListener> listeners;
|
|
|
|
public FreeBuildRegion() {
|
|
super("freebuild");
|
|
this.listeners = new ArrayList<>();
|
|
RegisteredListener[] listeners = BlockBreakEvent.getHandlerList().getRegisteredListeners();
|
|
for (RegisteredListener listener : listeners) {
|
|
if (listener.getPriority() == EventPriority.MONITOR) {
|
|
continue;
|
|
}
|
|
if (!listener.isIgnoringCancelled()) {
|
|
continue;
|
|
}
|
|
this.listeners.add(listener);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isExclusive() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public FaweMask getMask(Player player, MaskType type) {
|
|
if (type != MaskType.MEMBER) {
|
|
return null;
|
|
}
|
|
ArrayList<RegisteredListener> currRegList = new ArrayList<>();
|
|
for (RegisteredListener listener : this.listeners) {
|
|
String name = listener.getPlugin().getName();
|
|
if (!player.hasPermission("fawe.freebuild." + name.toLowerCase(Locale.ROOT))) {
|
|
continue;
|
|
}
|
|
currRegList.add(listener);
|
|
}
|
|
if (currRegList.isEmpty()) {
|
|
return null;
|
|
}
|
|
RegisteredListener[] listeners = currRegList.toArray(new RegisteredListener[0]);
|
|
|
|
World bukkitWorld = BukkitAdapter.adapt(player.getWorld());
|
|
AsyncWorld asyncWorld = AsyncWorld.wrap(bukkitWorld);
|
|
|
|
BlockVector3 pos1 = BlockVector3.ZERO;
|
|
BlockVector3 pos2 = BlockVector3.ZERO;
|
|
|
|
AsyncBlock block = new AsyncBlock(asyncWorld, 0, 0, 0);
|
|
BlockBreakEvent event = new BlockBreakEvent(block, ((BukkitPlayer) player).getPlayer());
|
|
|
|
return new FaweMask(new CuboidRegion(pos1, pos2)) {
|
|
|
|
@Override
|
|
public boolean isValid(Player player, MaskType type) {
|
|
return bukkitWorld == BukkitAdapter.adapt(player.getWorld()) && type == MaskType.MEMBER;
|
|
}
|
|
|
|
@Override
|
|
public Region getRegion() {
|
|
return new CuboidRegion(BlockVector3.ZERO, BlockVector3.ZERO) {
|
|
|
|
@Override
|
|
public boolean contains(int x, int z) {
|
|
return contains(x, 127, z);
|
|
}
|
|
|
|
private int lastX = Integer.MIN_VALUE;
|
|
private int lastZ = Integer.MIN_VALUE;
|
|
private boolean lastResult;
|
|
|
|
@Override
|
|
public boolean contains(int x, int y, int z) {
|
|
if (x == lastX && z == lastZ) {
|
|
return lastResult;
|
|
}
|
|
lastX = x;
|
|
lastZ = z;
|
|
event.setCancelled(false);
|
|
block.setPosition(x, y, z);
|
|
try {
|
|
synchronized (Bukkit.getPluginManager()) {
|
|
for (RegisteredListener listener : listeners) {
|
|
listener.callEvent(event);
|
|
}
|
|
}
|
|
} catch (EventException e) {
|
|
throw new RuntimeException(e);
|
|
}
|
|
return lastResult = !event.isCancelled();
|
|
}
|
|
};
|
|
}
|
|
};
|
|
}
|
|
}
|