Flag tweaks

This commit is contained in:
Jesse Boyd 2016-05-13 02:55:57 +10:00
parent 669359cd37
commit 63c7041a34
7 changed files with 123 additions and 85 deletions

View File

@ -196,13 +196,9 @@ public class PlayerEvents extends PlotListener implements Listener {
if (plot == null) { if (plot == null) {
return; return;
} }
if (plot.getFlag(Flags.REDSTONE).isPresent()) { if (Flags.REDSTONE.isFalse(plot)) {
if (plot.getFlag(Flags.REDSTONE).get()) { event.setNewCurrent(0);
return; return;
} else {
event.setNewCurrent(0);
return;
}
} }
if (Settings.REDSTONE_DISABLER) { if (Settings.REDSTONE_DISABLER) {
if (UUIDHandler.getPlayer(plot.owner) == null) { if (UUIDHandler.getPlayer(plot.owner) == null) {
@ -245,7 +241,7 @@ public class PlayerEvents extends PlotListener implements Listener {
if (plot == null) { if (plot == null) {
return; return;
} }
if (plot.getFlag(Flags.REDSTONE).isPresent() && !plot.getFlag(Flags.REDSTONE).get()) { if (Flags.REDSTONE.isFalse(plot)) {
event.setCancelled(true); event.setCancelled(true);
} }
return; return;
@ -261,10 +257,12 @@ public class PlayerEvents extends PlotListener implements Listener {
return; return;
} }
Plot plot = area.getOwnedPlotAbs(loc); Plot plot = area.getOwnedPlotAbs(loc);
if (plot != null && plot.getFlag(Flags.DISABLE_PHYSICS).or(false)) { if (plot == null) {
event.setCancelled(true);
return; return;
} }
if (Flags.DISABLE_PHYSICS.isFalse(plot)) {
event.setCancelled(true);
}
return; return;
default: default:
break; break;
@ -686,7 +684,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
Plot plot = area.getOwnedPlot(location); Plot plot = area.getOwnedPlot(location);
if (plot != null) { if (plot != null) {
if (plot.getFlag(Flags.EXPLOSION).isPresent() && plot.getFlag(Flags.EXPLOSION).get()) { if (Flags.EXPLOSION.isTrue(plot)) {
List<MetadataValue> meta = event.getEntity().getMetadata("plot"); List<MetadataValue> meta = event.getEntity().getMetadata("plot");
Plot origin; Plot origin;
if (meta.isEmpty()) { if (meta.isEmpty()) {
@ -782,17 +780,17 @@ public class PlayerEvents extends PlotListener implements Listener {
Plot plot = area.getOwnedPlot(location); Plot plot = area.getOwnedPlot(location);
switch (block.getType()) { switch (block.getType()) {
case GRASS: case GRASS:
if (plot.getFlag(Flags.GRASS_GROW).isPresent() && plot.getFlag(Flags.GRASS_GROW).get()) { if (Flags.GRASS_GROW.isFalse(plot)) {
event.setCancelled(true); event.setCancelled(true);
} }
break; break;
case MYCEL: case MYCEL:
if (plot.getFlag(Flags.MYCEL_GROW).isPresent() && plot.getFlag(Flags.MYCEL_GROW).get()) { if (Flags.MYCEL_GROW.isFalse(plot)) {
event.setCancelled(true); event.setCancelled(true);
} }
break; break;
case VINE: case VINE:
if (plot.getFlag(Flags.VINE_GROW).isPresent() && plot.getFlag(Flags.VINE_GROW).get()) { if (Flags.VINE_GROW.isFalse(plot)) {
event.setCancelled(true); event.setCancelled(true);
} }
break; break;
@ -864,27 +862,18 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
switch (b.getType()) { switch (b.getType()) {
case ICE: case ICE:
Optional<Boolean> ice_melt = plot.getFlag(Flags.ICE_MELT); if (Flags.ICE_MELT.isFalse(plot)) {
if (ice_melt.isPresent()) { e.setCancelled(true);
if (!ice_melt.get()) {
e.setCancelled(true);
}
} }
break; break;
case SNOW: case SNOW:
Optional<Boolean> snow_melt = plot.getFlag(Flags.SNOW_MELT); if (Flags.SNOW_MELT.isFalse(plot)) {
if (snow_melt.isPresent()) { e.setCancelled(true);
if (!snow_melt.get()) {
e.setCancelled(true);
}
} }
break; break;
case SOIL: case SOIL:
Optional<Boolean> soil_dry = plot.getFlag(Flags.SOIL_DRY); if (Flags.SOIL_DRY.isFalse(plot)) {
if (soil_dry.isPresent()) { e.setCancelled(true);
if (!soil_dry.get()) {
e.setCancelled(true);
}
} }
break; break;
} }
@ -902,7 +891,7 @@ public class PlayerEvents extends PlotListener implements Listener {
Plot plot = area.getOwnedPlot(tLocation); Plot plot = area.getOwnedPlot(tLocation);
Location fLocation = BukkitUtil.getLocation(from.getLocation()); Location fLocation = BukkitUtil.getLocation(from.getLocation());
if (plot != null) { if (plot != null) {
if (plot.getFlag(Flags.DISABLE_PHYSICS).or(false)) { if (plot.getFlag(Flags.DISABLE_PHYSICS, false)) {
event.setCancelled(true); event.setCancelled(true);
} else if (!area.contains(fLocation.getX(), fLocation.getZ()) || !Objects.equals(plot, area.getOwnedPlot(fLocation))) { } else if (!area.contains(fLocation.getX(), fLocation.getZ()) || !Objects.equals(plot, area.getOwnedPlot(fLocation))) {
event.setCancelled(true); event.setCancelled(true);
@ -1345,7 +1334,7 @@ public class PlayerEvents extends PlotListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
if (plot.getFlag(Flags.DISABLE_PHYSICS).or(false)) { if (plot.getFlag(Flags.DISABLE_PHYSICS, false)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -1396,14 +1385,14 @@ public class PlayerEvents extends PlotListener implements Listener {
default: default:
i = 0; i = 0;
} }
Optional<Integer> plotFlag = plot.getFlag(flag); int cap = plot.getFlag(flag, Integer.MAX_VALUE);
if (!plotFlag.isPresent()) { if (cap != Integer.MAX_VALUE) {
continue; continue;
} }
if (mobs == null) { if (mobs == null) {
mobs = plot.countEntities(); mobs = plot.countEntities();
} }
if (mobs[i] >= plotFlag.get()) { if (mobs[i] >= cap) {
return true; return true;
} }
} }
@ -1529,7 +1518,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
Plot plot = location.getOwnedPlot(); Plot plot = location.getOwnedPlot();
if (plot == null || !plot.getFlag(Flags.BLOCK_BURN).or(false)) { if (plot == null || !plot.getFlag(Flags.BLOCK_BURN, false)) {
e.setCancelled(true); e.setCancelled(true);
return; return;
} }
@ -1579,11 +1568,11 @@ public class PlayerEvents extends PlotListener implements Listener {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER);
event.setCancelled(true); event.setCancelled(true);
} }
} else if (!plot.getFlag(Flags.BLOCK_IGNITION).or(false)) { } else if (!plot.getFlag(Flags.BLOCK_IGNITION, false)) {
event.setCancelled(true); event.setCancelled(true);
} }
} else if (ignitingEntity != null) { } else if (ignitingEntity != null) {
if (plot == null || !plot.getFlag(Flags.BLOCK_IGNITION).or(false)) { if (plot == null || !plot.getFlag(Flags.BLOCK_IGNITION, false)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -1607,7 +1596,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} else if (event.getIgnitingBlock() != null) { } else if (event.getIgnitingBlock() != null) {
Block ignitingBlock = event.getIgnitingBlock(); Block ignitingBlock = event.getIgnitingBlock();
if (igniteCause == BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL) { if (igniteCause == BlockIgniteEvent.IgniteCause.FLINT_AND_STEEL) {
if (plot == null || !plot.getFlag(Flags.BLOCK_IGNITION).or(false)) { if (plot == null || !plot.getFlag(Flags.BLOCK_IGNITION, false)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -1621,7 +1610,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
} }
if (igniteCause == BlockIgniteEvent.IgniteCause.SPREAD || igniteCause == BlockIgniteEvent.IgniteCause.LAVA) { if (igniteCause == BlockIgniteEvent.IgniteCause.SPREAD || igniteCause == BlockIgniteEvent.IgniteCause.LAVA) {
if (plot == null || !plot.getFlag(Flags.BLOCK_IGNITION).or(false)) { if (plot == null || !plot.getFlag(Flags.BLOCK_IGNITION, false)) {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -1932,7 +1921,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
return; return;
} else if (!plot.isAdded(pp.getUUID())) { } else if (!plot.isAdded(pp.getUUID())) {
if (!plot.getFlag(Flags.HANGING_PLACE).or(false)) { if (!plot.getFlag(Flags.HANGING_PLACE, false)) {
if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_OTHER)) { if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_OTHER)) {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER);
event.setCancelled(true); event.setCancelled(true);
@ -1970,7 +1959,7 @@ public class PlayerEvents extends PlotListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
} }
} else if (!plot.isAdded(pp.getUUID())) { } else if (!plot.isAdded(pp.getUUID())) {
if (plot.getFlag(Flags.HANGING_BREAK).or(false)) { if (plot.getFlag(Flags.HANGING_BREAK, false)) {
return; return;
} }
if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_OTHER)) { if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_DESTROY_OTHER)) {
@ -1996,7 +1985,7 @@ public class PlayerEvents extends PlotListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
} }
} else if (!plot.isAdded(player.getUUID())) { } else if (!plot.isAdded(player.getUUID())) {
if (!plot.getFlag(Flags.HANGING_BREAK).or(false)) { if (!plot.getFlag(Flags.HANGING_BREAK, false)) {
if (!Permissions.hasPermission(player, C.PERMISSION_ADMIN_DESTROY_OTHER)) { if (!Permissions.hasPermission(player, C.PERMISSION_ADMIN_DESTROY_OTHER)) {
MainUtil.sendMessage(player, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_DESTROY_OTHER); MainUtil.sendMessage(player, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_DESTROY_OTHER);
event.setCancelled(true); event.setCancelled(true);
@ -2032,19 +2021,19 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
} else if (!plot.isAdded(pp.getUUID())) { } else if (!plot.isAdded(pp.getUUID())) {
Entity entity = event.getRightClicked(); Entity entity = event.getRightClicked();
if (entity instanceof Monster && plot.getFlag(Flags.HOSTILE_INTERACT).or(false)) { if (entity instanceof Monster && plot.getFlag(Flags.HOSTILE_INTERACT, false)) {
return; return;
} }
if (entity instanceof Animals && plot.getFlag(Flags.ANIMAL_INTERACT).or(false)) { if (entity instanceof Animals && plot.getFlag(Flags.ANIMAL_INTERACT, false)) {
return; return;
} }
if (entity instanceof Tameable && ((Tameable) entity).isTamed() && plot.getFlag(Flags.TAMED_INTERACT).or(false)) { if (entity instanceof Tameable && ((Tameable) entity).isTamed() && plot.getFlag(Flags.TAMED_INTERACT, false)) {
return; return;
} }
if (entity instanceof Vehicle && plot.getFlag(Flags.VEHICLE_USE).or(false)) { if (entity instanceof Vehicle && plot.getFlag(Flags.VEHICLE_USE, false)) {
return; return;
} }
if (entity instanceof Player && plot.getFlag(Flags.PLAYER_INTERACT).or(false)) { if (entity instanceof Player && plot.getFlag(Flags.PLAYER_INTERACT, false)) {
return; return;
} }
if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_INTERACT_OTHER)) { if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_INTERACT_OTHER)) {
@ -2081,7 +2070,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return; return;
} }
if (!plot.isAdded(pp.getUUID())) { if (!plot.isAdded(pp.getUUID())) {
if (plot.getFlag(Flags.VEHICLE_BREAK).or(false)) { if (plot.getFlag(Flags.VEHICLE_BREAK, false)) {
return; return;
} }
if (!Permissions.hasPermission(pp, "plots.admin.vehicle.break.other")) { if (!Permissions.hasPermission(pp, "plots.admin.vehicle.break.other")) {
@ -2192,7 +2181,7 @@ public class PlayerEvents extends PlotListener implements Listener {
if (player != null) { if (player != null) {
PlotPlayer pp = BukkitUtil.getPlayer(player); PlotPlayer pp = BukkitUtil.getPlayer(player);
if (victim instanceof Hanging) { // hanging if (victim instanceof Hanging) { // hanging
if (plot != null && (plot.getFlag(Flags.HANGING_BREAK).or(false) || plot.isAdded(pp.getUUID()))) { if (plot != null && (plot.getFlag(Flags.HANGING_BREAK, false) || plot.isAdded(pp.getUUID()))) {
return true; return true;
} }
if (!Permissions.hasPermission(pp, "plots.admin.destroy." + stub)) { if (!Permissions.hasPermission(pp, "plots.admin.destroy." + stub)) {
@ -2200,7 +2189,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return false; return false;
} }
} else if (victim.getEntityId() == 30) { } else if (victim.getEntityId() == 30) {
if (plot != null && (plot.getFlag(Flags.MISC_BREAK).or(false) || plot.isAdded(pp.getUUID()))) { if (plot != null && (plot.getFlag(Flags.MISC_BREAK, false) || plot.isAdded(pp.getUUID()))) {
return true; return true;
} }
if (!Permissions.hasPermission(pp, "plots.admin.destroy." + stub)) { if (!Permissions.hasPermission(pp, "plots.admin.destroy." + stub)) {
@ -2208,7 +2197,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return false; return false;
} }
} else if (victim instanceof Monster || victim instanceof EnderDragon) { // victim is monster } else if (victim instanceof Monster || victim instanceof EnderDragon) { // victim is monster
if (plot != null && (plot.getFlag(Flags.HOSTILE_ATTACK).or(false) || plot.getFlag(Flags.PVE).or(false) || plot if (plot != null && (plot.getFlag(Flags.HOSTILE_ATTACK, false) || plot.getFlag(Flags.PVE, false) || plot
.isAdded(pp.getUUID()))) { .isAdded(pp.getUUID()))) {
return true; return true;
} }
@ -2217,7 +2206,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return false; return false;
} }
} else if (victim instanceof Tameable) { // victim is tameable } else if (victim instanceof Tameable) { // victim is tameable
if (plot != null && (plot.getFlag(Flags.TAMED_ATTACK).or(false) || plot.getFlag(Flags.PVE).or(false) || plot.isAdded(pp.getUUID()))) { if (plot != null && (plot.getFlag(Flags.TAMED_ATTACK, false) || plot.getFlag(Flags.PVE, false) || plot.isAdded(pp.getUUID()))) {
return true; return true;
} }
if (!Permissions.hasPermission(pp, "plots.admin.pve." + stub)) { if (!Permissions.hasPermission(pp, "plots.admin.pve." + stub)) {
@ -2226,12 +2215,9 @@ public class PlayerEvents extends PlotListener implements Listener {
} }
} else if (victim instanceof Player) { } else if (victim instanceof Player) {
if (plot != null) { if (plot != null) {
Optional<Boolean> pvp = plot.getFlag(Flags.PVP); if (Flags.PVP.isFalse(plot) && !Permissions.hasPermission(pp, "plots.admin.pvp." + stub)) {
if (pvp.isPresent() && !pvp.get()) { MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, "plots.admin.pvp." + stub);
if (!Permissions.hasPermission(pp, "plots.admin.pve." + stub)) { return false;
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, "plots.admin.pve." + stub);
return false;
}
} else { } else {
return true; return true;
} }
@ -2241,7 +2227,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return false; return false;
} }
} else if (victim instanceof Creature) { // victim is animal } else if (victim instanceof Creature) { // victim is animal
if (plot != null && (plot.getFlag(Flags.ANIMAL_ATTACK).or(false) || plot.getFlag(Flags.PVE).or(false) || plot if (plot != null && (plot.getFlag(Flags.ANIMAL_ATTACK, false) || plot.getFlag(Flags.PVE, false) || plot
.isAdded(pp.getUUID()))) { .isAdded(pp.getUUID()))) {
return true; return true;
} }
@ -2252,7 +2238,7 @@ public class PlayerEvents extends PlotListener implements Listener {
} else if (victim instanceof Vehicle) { // Vehicles are managed in vehicle destroy event } else if (victim instanceof Vehicle) { // Vehicles are managed in vehicle destroy event
return true; return true;
} else { // victim is something else } else { // victim is something else
if (plot != null && (plot.getFlag(Flags.PVE).or(false) || plot.isAdded(pp.getUUID()))) { if (plot != null && (plot.getFlag(Flags.PVE, false) || plot.isAdded(pp.getUUID()))) {
return true; return true;
} }
if (!Permissions.hasPermission(pp, "plots.admin.pve." + stub)) { if (!Permissions.hasPermission(pp, "plots.admin.pve." + stub)) {
@ -2312,10 +2298,14 @@ public class PlayerEvents extends PlotListener implements Listener {
return; return;
} }
} else if (!plot.isAdded(pp.getUUID())) { } else if (!plot.isAdded(pp.getUUID())) {
Optional<HashSet<PlotBlock>> place = plot.getFlag(Flags.PLACE); Set<PlotBlock> place = plot.getFlag(Flags.PLACE, null);
Block block = event.getBlock(); if (place != null) {
if ((place.isPresent() && !place.get().contains(new PlotBlock((short) block.getTypeId(), block.getData()))) && !Permissions Block block = event.getBlock();
.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_OTHER)) { if (place.contains(new PlotBlock((short) block.getTypeId(), block.getData()))) {
return;
}
}
if (!Permissions.hasPermission(pp, C.PERMISSION_ADMIN_BUILD_OTHER)) {
MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER); MainUtil.sendMessage(pp, C.NO_PERMISSION_EVENT, C.PERMISSION_ADMIN_BUILD_OTHER);
event.setCancelled(true); event.setCancelled(true);
return; return;
@ -2327,7 +2317,7 @@ public class PlayerEvents extends PlotListener implements Listener {
return; return;
} }
} }
if (plot.getFlag(Flags.DISABLE_PHYSICS).or(false)) { if (plot.getFlag(Flags.DISABLE_PHYSICS, false)) {
Block block = event.getBlockPlaced(); Block block = event.getBlockPlaced();
if (block.getType().hasGravity()) { if (block.getType().hasGravity()) {
sendBlockChange(block.getLocation(), block.getType(), block.getData()); sendBlockChange(block.getLocation(), block.getType(), block.getData());

View File

@ -1,7 +1,5 @@
package com.plotsquared.bukkit.util.block; package com.plotsquared.bukkit.util.block;
import static com.intellectualcrafters.plot.util.ReflectionUtils.getRefClass;
import com.intellectualcrafters.plot.object.ChunkLoc; import com.intellectualcrafters.plot.object.ChunkLoc;
import com.intellectualcrafters.plot.object.PseudoRandom; import com.intellectualcrafters.plot.object.PseudoRandom;
import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.ChunkManager;
@ -13,23 +11,23 @@ import com.intellectualcrafters.plot.util.ReflectionUtils.RefField;
import com.intellectualcrafters.plot.util.ReflectionUtils.RefMethod; import com.intellectualcrafters.plot.util.ReflectionUtils.RefMethod;
import com.intellectualcrafters.plot.util.ReflectionUtils.RefMethod.RefExecutor; import com.intellectualcrafters.plot.util.ReflectionUtils.RefMethod.RefExecutor;
import com.intellectualcrafters.plot.util.SetQueue.ChunkWrapper; import com.intellectualcrafters.plot.util.SetQueue.ChunkWrapper;
import com.intellectualcrafters.plot.util.TaskManager;
import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitUtil;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.World.Environment; import org.bukkit.World.Environment;
import org.bukkit.block.Biome; import org.bukkit.block.Biome;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; import static com.intellectualcrafters.plot.util.ReflectionUtils.getRefClass;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
public class FastQueue_1_9 extends SlowQueue { public class FastQueue_1_9 extends SlowQueue {
@ -220,12 +218,7 @@ public class FastQueue_1_9 extends SlowQueue {
} }
} }
} }
TaskManager.runTaskLater(new Runnable() { world.refreshChunk(fs.getX(), fs.getZ());
@Override
public void run() {
sendChunk(fs.getChunkWrapper().world, Arrays.asList(new ChunkLoc(fs.getX(), fs.getZ())));
}
}, 1);
} }
public Object newChunkSection(int i, boolean flag, char[] ids) { public Object newChunkSection(int i, boolean flag, char[] ids) {

View File

@ -1,5 +1,7 @@
package com.intellectualcrafters.plot.flag; package com.intellectualcrafters.plot.flag;
import com.intellectualcrafters.plot.object.Plot;
public class BooleanFlag extends Flag<Boolean> { public class BooleanFlag extends Flag<Boolean> {
public BooleanFlag(String name) { public BooleanFlag(String name) {
@ -34,4 +36,14 @@ public class BooleanFlag extends Flag<Boolean> {
@Override public String getValueDescription() { @Override public String getValueDescription() {
return "Flag value must be a boolean (true|false)"; return "Flag value must be a boolean (true|false)";
} }
public boolean isTrue(Plot plot) {
Boolean value = FlagManager.getPlotFlagRaw(plot, this);
return Boolean.TRUE == value;
}
public boolean isFalse(Plot plot) {
Boolean value = FlagManager.getPlotFlagRaw(plot, this);
return Boolean.FALSE == value;
}
} }

View File

@ -1,5 +1,7 @@
package com.intellectualcrafters.plot.flag; package com.intellectualcrafters.plot.flag;
import com.intellectualcrafters.plot.object.Plot;
public class Flag<V> { public class Flag<V> {
private String name; private String name;
@ -35,4 +37,8 @@ public class Flag<V> {
public final String getName() { public final String getName() {
return this.name; return this.name;
} }
public boolean isSet(Plot plot) {
return FlagManager.getPlotFlagRaw(plot, this) != null;
}
} }

View File

@ -1,6 +1,8 @@
package com.intellectualcrafters.plot.flag; package com.intellectualcrafters.plot.flag;
import com.google.common.base.Optional;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import com.intellectualcrafters.plot.PS;
import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.database.DBFunc;
import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.Plot;
import com.intellectualcrafters.plot.object.PlotArea; import com.intellectualcrafters.plot.object.PlotArea;
@ -9,7 +11,7 @@ import com.intellectualcrafters.plot.object.PlotPlayer;
import com.intellectualcrafters.plot.object.PlotSettings; import com.intellectualcrafters.plot.object.PlotSettings;
import com.intellectualcrafters.plot.util.EventUtil; import com.intellectualcrafters.plot.util.EventUtil;
import com.intellectualcrafters.plot.util.Permissions; import com.intellectualcrafters.plot.util.Permissions;
import java.lang.reflect.Field;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -27,6 +29,35 @@ public class FlagManager {
private static final HashSet<Flag<?>> reserved = Sets.newHashSet(Flags.ANALYSIS, Flags.DONE); private static final HashSet<Flag<?>> reserved = Sets.newHashSet(Flags.ANALYSIS, Flags.DONE);
/**
* Some events can be called millions of times each second (e.g. physics) and reusing is a lot faster.
*/
private static Optional MUTABLE_OPTIONAL;
private static Field MUTABLE_OPTIONAL_FIELD;
static {
MUTABLE_OPTIONAL = Optional.of(new Object());
try {
MUTABLE_OPTIONAL_FIELD = MUTABLE_OPTIONAL.getClass().getDeclaredField("reference");
MUTABLE_OPTIONAL_FIELD.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
public static <V> Optional<V> getPlotFlag(Plot plot, Flag<V> key) {
V value = FlagManager.getPlotFlagRaw(plot, key);
if (value != null) {
if (PS.get().isMainThread(Thread.currentThread())) {
try {
MUTABLE_OPTIONAL_FIELD.set(MUTABLE_OPTIONAL, value);
return MUTABLE_OPTIONAL;
} catch (IllegalAccessException e) {e.printStackTrace();}
}
return Optional.of(value);
}
return Optional.absent();
}
/** /**
* Reserve a flag so that it cannot be set by players * Reserve a flag so that it cannot be set by players
* @param flag * @param flag

View File

@ -1,5 +1,6 @@
package com.intellectualcrafters.plot.flag; package com.intellectualcrafters.plot.flag;
import com.intellectualcrafters.plot.object.Plot;
import java.util.Collection; import java.util.Collection;
public abstract class ListFlag<V extends Collection<?>> extends Flag<V> { public abstract class ListFlag<V extends Collection<?>> extends Flag<V> {
@ -7,4 +8,9 @@ public abstract class ListFlag<V extends Collection<?>> extends Flag<V> {
public ListFlag(String name) { public ListFlag(String name) {
super(name); super(name);
} }
public boolean contains(Plot plot, Object value) {
V existing = plot.getFlag(this, null);
return existing != null && existing.contains(value);
}
} }

View File

@ -959,7 +959,7 @@ public class Plot {
* @param key * @param key
*/ */
public <V> Optional<V> getFlag(Flag<V> key) { public <V> Optional<V> getFlag(Flag<V> key) {
return Optional.fromNullable(FlagManager.getPlotFlagRaw(this, key)); return FlagManager.getPlotFlag(this, key);
} }
/** /**