freebuild region restrictions

This commit is contained in:
Jesse Boyd
2018-09-05 05:10:15 +10:00
19 changed files with 230 additions and 63 deletions

View File

@ -43,6 +43,7 @@ import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import java.io.File;
import java.io.FileOutputStream;
@ -50,6 +51,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
@ -72,6 +74,8 @@ public class FaweBukkit implements IFawe, Listener {
return this.vault;
}
private List<org.bukkit.util.Vector> locations = Arrays.asList(new Vector(0, 5, 0));
public FaweBukkit(Plugin plugin) {
this.plugin = plugin;
try {
@ -551,6 +555,14 @@ public class FaweBukkit implements IFawe, Listener {
MainUtil.handleError(e);
}
}
if (Settings.IMP.EXPERIMENTAL.FREEBUILD) {
try {
managers.add(new FreeBuildRegion());
Fawe.debug("Plugin '<internal.freebuild>' found. Using it now.");
} catch (final Throwable e) {
MainUtil.handleError(e);
}
}
return managers;
}

View File

@ -0,0 +1,105 @@
package com.boydti.fawe.bukkit.regions;
import com.boydti.fawe.bukkit.wrapper.AsyncBlock;
import com.boydti.fawe.bukkit.wrapper.AsyncWorld;
import com.boydti.fawe.object.FawePlayer;
import com.boydti.fawe.object.queue.NullFaweQueue;
import com.boydti.fawe.regions.FaweMask;
import com.boydti.fawe.regions.FaweMaskManager;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.Region;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.event.EventException;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.RegisteredListener;
import java.util.ArrayList;
public class FreeBuildRegion extends BukkitMaskManager {
private final ArrayList<RegisteredListener> listeners;
public FreeBuildRegion() {
super("freebuild");
this.listeners = new ArrayList<>();
RegisteredListener[] listeners = BlockPlaceEvent.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(FawePlayer<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())) continue;
currRegList.add(listener);
}
if (currRegList.isEmpty()) return null;
RegisteredListener[] listeners = currRegList.toArray(new RegisteredListener[currRegList.size()]);
World world = player.parent.getWorld();
AsyncWorld asyncWorld = AsyncWorld.wrap(world);
Vector vec1 = asyncWorld.getMinimumPoint();
Vector vec2 = asyncWorld.getMaximumPoint();
Location pos1 = BukkitAdapter.adapt(world, vec1);
Location pos2 = BukkitAdapter.adapt(world, vec2);
AsyncBlock block = new AsyncBlock(asyncWorld, new NullFaweQueue(asyncWorld.getWorldName()), 0, 0, 0);
BlockBreakEvent event = new BlockBreakEvent(block, player.parent);
return new BukkitMask(pos1, pos2) {
@Override
public Region getRegion() {
return new CuboidRegion(vec1, vec2) {
@Override
public boolean contains(int x, int y, int z) {
return contains(x, z);
}
private int lastX = Integer.MIN_VALUE, lastZ = Integer.MIN_VALUE;
private boolean lastResult;
@Override
public boolean contains(int x, int z) {
if (x == lastX && z == lastZ) return lastResult;
lastX = x;
lastZ = z;
int y = 128;
event.setCancelled(false);
block.setPosition(x, y, z);
try {
for (RegisteredListener listener : listeners) {
listener.callEvent(event);
}
} catch (EventException e) {
throw new RuntimeException(e);
}
return lastResult = !event.isCancelled();
}
};
}
};
}
}

View File

@ -23,9 +23,9 @@ import org.bukkit.plugin.Plugin;
public class AsyncBlock implements Block {
public final int z;
public final int y;
public final int x;
public int z;
public int y;
public int x;
public final FaweQueue queue;
public final AsyncWorld world;
@ -37,6 +37,12 @@ public class AsyncBlock implements Block {
this.z = z;
}
public void setPosition(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
@Deprecated
public byte getData() {

View File

@ -68,7 +68,7 @@ public class AsyncChunk implements Chunk {
@Override
public ChunkSnapshot getChunkSnapshot(boolean includeMaxblocky, boolean includeBiome, boolean includeBiomeTempRain) {
if (Thread.currentThread() == Fawe.get().getMainThread()) {
if (Fawe.isMainThread()) {
return world.getChunkAt(x, z).getChunkSnapshot(includeMaxblocky, includeBiome, includeBiomeTempRain);
}
return whenLoaded(new RunnableVal<ChunkSnapshot>() {
@ -80,7 +80,7 @@ public class AsyncChunk implements Chunk {
}
private <T> T whenLoaded(RunnableVal<T> task) {
if (Thread.currentThread() == Fawe.get().getMainThread()) {
if (Fawe.isMainThread()) {
task.run();
return task.value;
}