mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-22 05:06:44 +01:00
Switch from Class<T> to TypeLiteral, and implement managed meta access for temporary meta
This commit is contained in:
parent
6a63e5bb51
commit
d2f40612f4
@ -38,6 +38,8 @@ import com.plotsquared.core.database.DBFunc;
|
|||||||
import com.plotsquared.core.listener.PlayerBlockEventType;
|
import com.plotsquared.core.listener.PlayerBlockEventType;
|
||||||
import com.plotsquared.core.listener.PlotListener;
|
import com.plotsquared.core.listener.PlotListener;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -216,13 +218,14 @@ import org.bukkit.plugin.Plugin;
|
|||||||
import org.bukkit.projectiles.BlockProjectileSource;
|
import org.bukkit.projectiles.BlockProjectileSource;
|
||||||
import org.bukkit.projectiles.ProjectileSource;
|
import org.bukkit.projectiles.ProjectileSource;
|
||||||
import org.bukkit.util.Vector;
|
import org.bukkit.util.Vector;
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -731,32 +734,36 @@ import java.util.regex.Pattern;
|
|||||||
public void onTeleport(PlayerTeleportEvent event) {
|
public void onTeleport(PlayerTeleportEvent event) {
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
BukkitPlayer pp = BukkitUtil.adapt(player);
|
BukkitPlayer pp = BukkitUtil.adapt(player);
|
||||||
Plot lastPlot = pp.getMeta(PlotPlayer.META_LAST_PLOT);
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
org.bukkit.Location to = event.getTo();
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
//noinspection ConstantConditions
|
Plot lastPlot = lastPlotAccess.get().orElse(null);
|
||||||
if (to != null) {
|
org.bukkit.Location to = event.getTo();
|
||||||
Location location = BukkitUtil.adapt(to);
|
//noinspection ConstantConditions
|
||||||
PlotArea area = location.getPlotArea();
|
if (to != null) {
|
||||||
if (area == null) {
|
Location location = BukkitUtil.adapt(to);
|
||||||
if (lastPlot != null) {
|
PlotArea area = location.getPlotArea();
|
||||||
plotExit(pp, lastPlot);
|
if (area == null) {
|
||||||
pp.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
if (lastPlot != null) {
|
||||||
|
plotExit(pp, lastPlot);
|
||||||
|
lastPlotAccess.remove();
|
||||||
|
}
|
||||||
|
try (final MetaDataAccess<Location> lastLocationAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
|
lastLocationAccess.remove();
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
pp.deleteMeta(PlotPlayer.META_LOCATION);
|
Plot plot = area.getPlot(location);
|
||||||
return;
|
if (plot != null) {
|
||||||
}
|
final boolean result = DenyTeleportFlag.allowsTeleport(pp, plot);
|
||||||
Plot plot = area.getPlot(location);
|
// there is one possibility to still allow teleportation:
|
||||||
if (plot != null) {
|
// to is identical to the plot's home location, and untrusted-visit is true
|
||||||
final boolean result = DenyTeleportFlag.allowsTeleport(pp, plot);
|
// i.e. untrusted-visit can override deny-teleport
|
||||||
// there is one possibility to still allow teleportation:
|
// this is acceptable, because otherwise it wouldn't make sense to have both flags set
|
||||||
// to is identical to the plot's home location, and untrusted-visit is true
|
if (!result && !(plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous().equals(BukkitUtil.adaptComplete(to)))) {
|
||||||
// i.e. untrusted-visit can override deny-teleport
|
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_ENTRY_DENIED);
|
||||||
// this is acceptable, because otherwise it wouldn't make sense to have both flags set
|
event.setCancelled(true);
|
||||||
if (!result && !(plot.getFlag(UntrustedVisitFlag.class) && plot.getHomeSynchronous()
|
}
|
||||||
.equals(BukkitUtil.adaptComplete(to)))) {
|
|
||||||
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT,
|
|
||||||
Captions.PERMISSION_ADMIN_ENTRY_DENIED);
|
|
||||||
event.setCancelled(true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -847,28 +854,39 @@ import java.util.regex.Pattern;
|
|||||||
}
|
}
|
||||||
// Set last location
|
// Set last location
|
||||||
Location location = BukkitUtil.adapt(to);
|
Location location = BukkitUtil.adapt(to);
|
||||||
pp.setMeta(PlotPlayer.META_LOCATION, location);
|
try (final MetaDataAccess<Location> lastLocationAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
|
lastLocationAccess.remove();
|
||||||
|
}
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
pp.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
lastPlotAccess.remove();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Plot now = area.getPlot(location);
|
Plot now = area.getPlot(location);
|
||||||
Plot lastPlot = pp.getMeta(PlotPlayer.META_LAST_PLOT);
|
Plot lastPlot;
|
||||||
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
lastPlot = lastPlotAccess.get().orElse(null);
|
||||||
|
}
|
||||||
if (now == null) {
|
if (now == null) {
|
||||||
if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !pp
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
.getMeta("kick", false)) {
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT,
|
if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
|
||||||
Captions.PERMISSION_ADMIN_EXIT_DENIED);
|
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_EXIT_DENIED);
|
||||||
this.tmpTeleport = false;
|
this.tmpTeleport = false;
|
||||||
if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
|
if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
|
||||||
player.teleport(from);
|
player.teleport(from);
|
||||||
} else {
|
} else {
|
||||||
player.teleport(player.getWorld().getSpawnLocation());
|
player.teleport(player.getWorld().getSpawnLocation());
|
||||||
|
}
|
||||||
|
this.tmpTeleport = true;
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
this.tmpTeleport = true;
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else if (now.equals(lastPlot)) {
|
} else if (now.equals(lastPlot)) {
|
||||||
ForceFieldListener.handleForcefield(player, pp, now);
|
ForceFieldListener.handleForcefield(player, pp, now);
|
||||||
@ -909,28 +927,39 @@ import java.util.regex.Pattern;
|
|||||||
}
|
}
|
||||||
// Set last location
|
// Set last location
|
||||||
Location location = BukkitUtil.adapt(to);
|
Location location = BukkitUtil.adapt(to);
|
||||||
pp.setMeta(PlotPlayer.META_LOCATION, location);
|
try (final MetaDataAccess<Location> lastLocationAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
|
lastLocationAccess.set(location);
|
||||||
|
}
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
pp.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
lastPlotAccess.remove();
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Plot now = area.getPlot(location);
|
Plot now = area.getPlot(location);
|
||||||
Plot lastPlot = pp.getMeta(PlotPlayer.META_LAST_PLOT);
|
Plot lastPlot;
|
||||||
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
lastPlot = lastPlotAccess.get().orElse(null);
|
||||||
|
}
|
||||||
if (now == null) {
|
if (now == null) {
|
||||||
if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !pp
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
.getMeta("kick", false)) {
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT,
|
if (lastPlot != null && !plotExit(pp, lastPlot) && this.tmpTeleport && !kickAccess.get().orElse(false)) {
|
||||||
Captions.PERMISSION_ADMIN_EXIT_DENIED);
|
MainUtil.sendMessage(pp, Captions.NO_PERMISSION_EVENT, Captions.PERMISSION_ADMIN_EXIT_DENIED);
|
||||||
this.tmpTeleport = false;
|
this.tmpTeleport = false;
|
||||||
if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
|
if (lastPlot.equals(BukkitUtil.adapt(from).getPlot())) {
|
||||||
player.teleport(from);
|
player.teleport(from);
|
||||||
} else {
|
} else {
|
||||||
player.teleport(player.getWorld().getSpawnLocation());
|
player.teleport(player.getWorld().getSpawnLocation());
|
||||||
|
}
|
||||||
|
this.tmpTeleport = true;
|
||||||
|
event.setCancelled(true);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
this.tmpTeleport = true;
|
|
||||||
event.setCancelled(true);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else if (now.equals(lastPlot)) {
|
} else if (now.equals(lastPlot)) {
|
||||||
ForceFieldListener.handleForcefield(player, pp, now);
|
ForceFieldListener.handleForcefield(player, pp, now);
|
||||||
@ -1155,8 +1184,15 @@ import java.util.regex.Pattern;
|
|||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
BukkitPlayer pp = BukkitUtil.adapt(player);
|
BukkitPlayer pp = BukkitUtil.adapt(player);
|
||||||
// Delete last location
|
// Delete last location
|
||||||
Plot plot = (Plot) pp.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
Plot plot;
|
||||||
pp.deleteMeta(PlotPlayer.META_LOCATION);
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
plot = lastPlotAccess.remove();
|
||||||
|
}
|
||||||
|
try (final MetaDataAccess<Location> lastLocationAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
|
lastLocationAccess.remove();
|
||||||
|
}
|
||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
plotExit(pp, plot);
|
plotExit(pp, plot);
|
||||||
}
|
}
|
||||||
@ -1168,7 +1204,10 @@ import java.util.regex.Pattern;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (Settings.Enabled_Components.PERMISSION_CACHE) {
|
if (Settings.Enabled_Components.PERMISSION_CACHE) {
|
||||||
pp.deleteMeta("perm");
|
try (final MetaDataAccess<Map<String, Boolean>> metaDataAccess =
|
||||||
|
pp.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_PERMISSIONS)) {
|
||||||
|
metaDataAccess.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Location location = pp.getLocation();
|
Location location = pp.getLocation();
|
||||||
PlotArea area = location.getPlotArea();
|
PlotArea area = location.getPlotArea();
|
||||||
|
@ -69,12 +69,12 @@ import static com.sk89q.worldedit.world.gamemode.GameModes.SURVIVAL;
|
|||||||
public class BukkitPlayer extends PlotPlayer<Player> {
|
public class BukkitPlayer extends PlotPlayer<Player> {
|
||||||
|
|
||||||
private static boolean CHECK_EFFECTIVE = true;
|
private static boolean CHECK_EFFECTIVE = true;
|
||||||
|
|
||||||
private final EconHandler econHandler;
|
|
||||||
public final Player player;
|
public final Player player;
|
||||||
|
private final EconHandler econHandler;
|
||||||
private boolean offline;
|
private boolean offline;
|
||||||
private String name;
|
private String name;
|
||||||
|
private String lastMessage = "";
|
||||||
|
private long lastMessageTime = 0L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>Please do not use this method. Instead use
|
* <p>Please do not use this method. Instead use
|
||||||
@ -234,10 +234,10 @@ public class BukkitPlayer extends PlotPlayer<Player> {
|
|||||||
|
|
||||||
@Override public void sendMessage(String message) {
|
@Override public void sendMessage(String message) {
|
||||||
message = message.replace('\u2010', '%').replace('\u2020', '&').replace('\u2030', '&');
|
message = message.replace('\u2010', '%').replace('\u2020', '&').replace('\u2030', '&');
|
||||||
if (!StringMan.isEqual(this.getMeta("lastMessage"), message) || (
|
if (!StringMan.isEqual(this.lastMessage, message) || (
|
||||||
System.currentTimeMillis() - this.<Long>getMeta("lastMessageTime") > 5000)) {
|
System.currentTimeMillis() - this.lastMessageTime > 5000)) {
|
||||||
setMeta("lastMessage", message);
|
this.lastMessage = message;
|
||||||
setMeta("lastMessageTime", System.currentTimeMillis());
|
this.lastMessageTime = System.currentTimeMillis();
|
||||||
this.player.sendMessage(message);
|
this.player.sendMessage(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,6 @@ package com.plotsquared.core.command;
|
|||||||
|
|
||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.inject.annotations.WorldConfig;
|
|
||||||
import com.plotsquared.core.inject.annotations.WorldFile;
|
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.configuration.ConfigurationSection;
|
import com.plotsquared.core.configuration.ConfigurationSection;
|
||||||
import com.plotsquared.core.configuration.ConfigurationUtil;
|
import com.plotsquared.core.configuration.ConfigurationUtil;
|
||||||
@ -36,6 +34,8 @@ import com.plotsquared.core.configuration.file.YamlConfiguration;
|
|||||||
import com.plotsquared.core.events.TeleportCause;
|
import com.plotsquared.core.events.TeleportCause;
|
||||||
import com.plotsquared.core.generator.AugmentedUtils;
|
import com.plotsquared.core.generator.AugmentedUtils;
|
||||||
import com.plotsquared.core.generator.HybridPlotWorld;
|
import com.plotsquared.core.generator.HybridPlotWorld;
|
||||||
|
import com.plotsquared.core.inject.annotations.WorldConfig;
|
||||||
|
import com.plotsquared.core.inject.annotations.WorldFile;
|
||||||
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.player.ConsolePlayer;
|
import com.plotsquared.core.player.ConsolePlayer;
|
||||||
@ -72,16 +72,19 @@ import com.sk89q.worldedit.math.BlockVector2;
|
|||||||
import com.sk89q.worldedit.math.BlockVector3;
|
import com.sk89q.worldedit.math.BlockVector3;
|
||||||
import com.sk89q.worldedit.regions.CuboidRegion;
|
import com.sk89q.worldedit.regions.CuboidRegion;
|
||||||
import com.sk89q.worldedit.regions.Region;
|
import com.sk89q.worldedit.regions.Region;
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
@CommandDeclaration(command = "area",
|
@CommandDeclaration(command = "area",
|
||||||
permission = "plots.area",
|
permission = "plots.area",
|
||||||
@ -101,6 +104,8 @@ public class Area extends SubCommand {
|
|||||||
private final WorldUtil worldUtil;
|
private final WorldUtil worldUtil;
|
||||||
private final RegionManager regionManager;
|
private final RegionManager regionManager;
|
||||||
|
|
||||||
|
private final Map<UUID, Map<String, Object>> metaData = new HashMap<>();
|
||||||
|
|
||||||
@Inject public Area(@Nonnull final PlotAreaManager plotAreaManager,
|
@Inject public Area(@Nonnull final PlotAreaManager plotAreaManager,
|
||||||
@WorldConfig @Nonnull final YamlConfiguration worldConfiguration,
|
@WorldConfig @Nonnull final YamlConfiguration worldConfiguration,
|
||||||
@WorldFile @Nonnull final File worldFile,
|
@WorldFile @Nonnull final File worldFile,
|
||||||
@ -264,14 +269,16 @@ public class Area extends SubCommand {
|
|||||||
case 2:
|
case 2:
|
||||||
switch (args[1].toLowerCase()) {
|
switch (args[1].toLowerCase()) {
|
||||||
case "pos1": { // Set position 1
|
case "pos1": { // Set position 1
|
||||||
HybridPlotWorld area = player.getMeta("area_create_area");
|
HybridPlotWorld area = (HybridPlotWorld) metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>())
|
||||||
|
.get("area_create_area");
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
Captions.COMMAND_SYNTAX.send(player,
|
Captions.COMMAND_SYNTAX.send(player,
|
||||||
"/plot area create [world[:id]] [<modifier>=<value>]...");
|
"/plot area create [world[:id]] [<modifier>=<value>]...");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Location location = player.getLocation();
|
Location location = player.getLocation();
|
||||||
player.setMeta("area_pos1", location);
|
metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>())
|
||||||
|
.put("area_pos1", location);
|
||||||
Captions.SET_ATTRIBUTE.send(player, "area_pos1",
|
Captions.SET_ATTRIBUTE.send(player, "area_pos1",
|
||||||
location.getX() + "," + location.getZ());
|
location.getX() + "," + location.getZ());
|
||||||
MainUtil.sendMessage(player,
|
MainUtil.sendMessage(player,
|
||||||
@ -280,14 +287,15 @@ public class Area extends SubCommand {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case "pos2": // Set position 2 and finish creation for type=2 (partial)
|
case "pos2": // Set position 2 and finish creation for type=2 (partial)
|
||||||
final HybridPlotWorld area = player.getMeta("area_create_area");
|
final HybridPlotWorld area = (HybridPlotWorld) metaData
|
||||||
|
.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).get("area_create_area");
|
||||||
if (area == null) {
|
if (area == null) {
|
||||||
Captions.COMMAND_SYNTAX.send(player,
|
Captions.COMMAND_SYNTAX.send(player,
|
||||||
"/plot area create [world[:id]] [<modifier>=<value>]...");
|
"/plot area create [world[:id]] [<modifier>=<value>]...");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Location pos1 = player.getLocation();
|
Location pos1 = player.getLocation();
|
||||||
Location pos2 = player.getMeta("area_pos1");
|
Location pos2 = (Location) metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).get("area_pos1");
|
||||||
int dx = Math.abs(pos1.getX() - pos2.getX());
|
int dx = Math.abs(pos1.getX() - pos2.getX());
|
||||||
int dz = Math.abs(pos1.getZ() - pos2.getZ());
|
int dz = Math.abs(pos1.getZ() - pos2.getZ());
|
||||||
int numX = Math.max(1,
|
int numX = Math.max(1,
|
||||||
@ -500,7 +508,7 @@ public class Area extends SubCommand {
|
|||||||
player.teleport(this.worldUtil.getSpawn(pa.getWorldName()),
|
player.teleport(this.worldUtil.getSpawn(pa.getWorldName()),
|
||||||
TeleportCause.COMMAND);
|
TeleportCause.COMMAND);
|
||||||
}
|
}
|
||||||
player.setMeta("area_create_area", pa);
|
metaData.computeIfAbsent(player.getUUID(), missingUUID -> new HashMap<>()).put("area_create_area", pa);
|
||||||
MainUtil.sendMessage(player,
|
MainUtil.sendMessage(player,
|
||||||
"$1Go to the first corner and use: $2 " + getCommandString()
|
"$1Go to the first corner and use: $2 " + getCommandString()
|
||||||
+ " create pos1");
|
+ " create pos1");
|
||||||
|
@ -93,7 +93,7 @@ public class Auto extends SubCommand {
|
|||||||
int diff = allowedPlots - currentPlots;
|
int diff = allowedPlots - currentPlots;
|
||||||
if (diff - sizeX * sizeZ < 0) {
|
if (diff - sizeX * sizeZ < 0) {
|
||||||
try (final MetaDataAccess<Integer> metaDataAccess = player.accessPersistentMetaData(
|
try (final MetaDataAccess<Integer> metaDataAccess = player.accessPersistentMetaData(
|
||||||
PlayerMetaDataKeys.GRANTED_PLOTS)) {
|
PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) {
|
||||||
if (metaDataAccess.has()) {
|
if (metaDataAccess.has()) {
|
||||||
int grantedPlots = metaDataAccess.get().orElse(0);
|
int grantedPlots = metaDataAccess.get().orElse(0);
|
||||||
if (diff < 0 && grantedPlots < sizeX * sizeZ) {
|
if (diff < 0 && grantedPlots < sizeX * sizeZ) {
|
||||||
@ -149,7 +149,10 @@ public class Auto extends SubCommand {
|
|||||||
*/
|
*/
|
||||||
public static void autoClaimSafe(final PlotPlayer<?> player, final PlotArea area, PlotId start,
|
public static void autoClaimSafe(final PlotPlayer<?> player, final PlotArea area, PlotId start,
|
||||||
final String schematic) {
|
final String schematic) {
|
||||||
player.setMeta(Auto.class.getName(), true);
|
try (final MetaDataAccess<Boolean> metaDataAccess =
|
||||||
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_AUTO)) {
|
||||||
|
metaDataAccess.set(true);
|
||||||
|
}
|
||||||
autoClaimFromDatabase(player, area, start, new RunnableVal<Plot>() {
|
autoClaimFromDatabase(player, area, start, new RunnableVal<Plot>() {
|
||||||
@Override public void run(final Plot plot) {
|
@Override public void run(final Plot plot) {
|
||||||
try {
|
try {
|
||||||
@ -253,9 +256,12 @@ public class Auto extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final int allowed_plots = player.getAllowedPlots();
|
final int allowed_plots = player.getAllowedPlots();
|
||||||
if (!force && (player.getMeta(Auto.class.getName(), false) || !checkAllowedPlots(player,
|
try (final MetaDataAccess<Boolean> metaDataAccess =
|
||||||
plotarea, allowed_plots, size_x, size_z))) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_AUTO)) {
|
||||||
return false;
|
if (!force && (metaDataAccess.get().orElse(false) || !checkAllowedPlots(player,
|
||||||
|
plotarea, allowed_plots, size_x, size_z))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (schematic != null && !schematic.isEmpty()) {
|
if (schematic != null && !schematic.isEmpty()) {
|
||||||
|
@ -89,7 +89,7 @@ public class Claim extends SubCommand {
|
|||||||
|
|
||||||
final PlotArea area = plot.getArea();
|
final PlotArea area = plot.getArea();
|
||||||
|
|
||||||
try (final MetaDataAccess<Integer> metaDataAccess = player.accessPersistentMetaData(PlayerMetaDataKeys.GRANTED_PLOTS)) {
|
try (final MetaDataAccess<Integer> metaDataAccess = player.accessPersistentMetaData(PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) {
|
||||||
int grants = 0;
|
int grants = 0;
|
||||||
if (currentPlots >= player.getAllowedPlots() && !force) {
|
if (currentPlots >= player.getAllowedPlots() && !force) {
|
||||||
if (metaDataAccess.has()) {
|
if (metaDataAccess.has()) {
|
||||||
|
@ -26,19 +26,29 @@
|
|||||||
package com.plotsquared.core.command;
|
package com.plotsquared.core.command;
|
||||||
|
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.util.MainUtil;
|
import com.plotsquared.core.util.MainUtil;
|
||||||
import com.plotsquared.core.util.task.TaskManager;
|
import com.plotsquared.core.util.task.TaskManager;
|
||||||
import com.plotsquared.core.util.task.TaskTime;
|
import com.plotsquared.core.util.task.TaskTime;
|
||||||
|
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
public class CmdConfirm {
|
public class CmdConfirm {
|
||||||
|
|
||||||
public static CmdInstance getPending(PlotPlayer<?> player) {
|
@Nullable public static CmdInstance getPending(PlotPlayer<?> player) {
|
||||||
return player.getMeta("cmdConfirm");
|
try (final MetaDataAccess<CmdInstance> metaDataAccess = player.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_CONFIRM)) {
|
||||||
|
return metaDataAccess.get().orElse(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removePending(PlotPlayer<?> player) {
|
public static void removePending(PlotPlayer<?> player) {
|
||||||
player.deleteMeta("cmdConfirm");
|
try (final MetaDataAccess<CmdInstance> metaDataAccess = player.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_CONFIRM)) {
|
||||||
|
metaDataAccess.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addPending(final PlotPlayer<?> player, String commandStr,
|
public static void addPending(final PlotPlayer<?> player, String commandStr,
|
||||||
@ -49,7 +59,10 @@ public class CmdConfirm {
|
|||||||
}
|
}
|
||||||
TaskManager.runTaskLater(() -> {
|
TaskManager.runTaskLater(() -> {
|
||||||
CmdInstance cmd = new CmdInstance(runnable);
|
CmdInstance cmd = new CmdInstance(runnable);
|
||||||
player.setMeta("cmdConfirm", cmd);
|
try (final MetaDataAccess<CmdInstance> metaDataAccess = player.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_CONFIRM)) {
|
||||||
|
metaDataAccess.set(cmd);
|
||||||
|
}
|
||||||
}, TaskTime.ticks(1L));
|
}, TaskTime.ticks(1L));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -409,46 +409,6 @@ public class DebugExec extends SubCommand {
|
|||||||
}
|
}
|
||||||
}, "/plot debugexec list-scripts", "List of scripts");
|
}, "/plot debugexec list-scripts", "List of scripts");
|
||||||
return true;
|
return true;
|
||||||
case "allcmd":
|
|
||||||
if (args.length < 3) {
|
|
||||||
Captions.COMMAND_SYNTAX
|
|
||||||
.send(player, "/plot debugexec allcmd <condition> <command>");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
long start = System.currentTimeMillis();
|
|
||||||
Command cmd = MainCommand.getInstance().getCommand(args[3]);
|
|
||||||
String[] params = Arrays.copyOfRange(args, 4, args.length);
|
|
||||||
if ("true".equals(args[1])) {
|
|
||||||
Location location = player.getMeta(PlotPlayer.META_LOCATION);
|
|
||||||
Plot plot = player.getMeta(PlotPlayer.META_LAST_PLOT);
|
|
||||||
for (Plot current : PlotSquared.get().getBasePlots()) {
|
|
||||||
player.setMeta(PlotPlayer.META_LOCATION, current.getBottomAbs());
|
|
||||||
player.setMeta(PlotPlayer.META_LAST_PLOT, current);
|
|
||||||
cmd.execute(player, params, null, null);
|
|
||||||
}
|
|
||||||
if (location == null) {
|
|
||||||
player.deleteMeta(PlotPlayer.META_LOCATION);
|
|
||||||
} else {
|
|
||||||
player.setMeta(PlotPlayer.META_LOCATION, location);
|
|
||||||
}
|
|
||||||
if (plot == null) {
|
|
||||||
player.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
|
||||||
} else {
|
|
||||||
player.setMeta(PlotPlayer.META_LAST_PLOT, plot);
|
|
||||||
}
|
|
||||||
player.sendMessage("&c> " + (System.currentTimeMillis() - start));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
init();
|
|
||||||
this.scope.put("_2", params);
|
|
||||||
this.scope.put("_3", cmd);
|
|
||||||
script =
|
|
||||||
"_1=PS.getBasePlots().iterator();while(_1.hasNext()){plot=_1.next();if("
|
|
||||||
+ args[1]
|
|
||||||
+ "){PlotPlayer.setMeta(\"location\",plot.getBottomAbs());PlotPlayer.setMeta(\"lastplot\",plot);_3.onCommand"
|
|
||||||
+ "(PlotPlayer,_2)}}";
|
|
||||||
|
|
||||||
break;
|
|
||||||
case "all":
|
case "all":
|
||||||
if (args.length < 3) {
|
if (args.length < 3) {
|
||||||
Captions.COMMAND_SYNTAX
|
Captions.COMMAND_SYNTAX
|
||||||
|
@ -84,7 +84,7 @@ public class Grant extends Command {
|
|||||||
PlotPlayer<?> pp = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid);
|
PlotPlayer<?> pp = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid);
|
||||||
if (pp != null) {
|
if (pp != null) {
|
||||||
try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData(
|
try (final MetaDataAccess<Integer> access = pp.accessPersistentMetaData(
|
||||||
PlayerMetaDataKeys.GRANTED_PLOTS)) {
|
PlayerMetaDataKeys.PERSISTENT_GRANTED_PLOTS)) {
|
||||||
if (args[0].equalsIgnoreCase("check")) {
|
if (args[0].equalsIgnoreCase("check")) {
|
||||||
Captions.GRANTED_PLOTS.send(player, access.get().orElse(0));
|
Captions.GRANTED_PLOTS.send(player, access.get().orElse(0));
|
||||||
} else {
|
} else {
|
||||||
|
@ -25,7 +25,9 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.command;
|
package com.plotsquared.core.command;
|
||||||
|
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.comment.CommentInbox;
|
import com.plotsquared.core.plot.comment.CommentInbox;
|
||||||
@ -34,6 +36,7 @@ import com.plotsquared.core.plot.comment.PlotComment;
|
|||||||
import com.plotsquared.core.util.MainUtil;
|
import com.plotsquared.core.util.MainUtil;
|
||||||
import com.plotsquared.core.util.StringMan;
|
import com.plotsquared.core.util.StringMan;
|
||||||
import com.plotsquared.core.util.task.RunnableVal;
|
import com.plotsquared.core.util.task.RunnableVal;
|
||||||
|
import com.plotsquared.core.player.MetaDataKey;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -140,7 +143,10 @@ public class Inbox extends SubCommand {
|
|||||||
StringMan.join(CommentManager.inboxes.keySet(), ", "));
|
StringMan.join(CommentManager.inboxes.keySet(), ", "));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
player.setMeta("inbox:" + inbox.toString(), System.currentTimeMillis());
|
final MetaDataKey<Long> metaDataKey = MetaDataKey.of(String.format("inbox:%s", inbox.toString()), new TypeLiteral<Long>() {});
|
||||||
|
try (final MetaDataAccess<Long> metaDataAccess = player.accessTemporaryMetaData(metaDataKey)) {
|
||||||
|
metaDataAccess.set(System.currentTimeMillis());
|
||||||
|
}
|
||||||
final int page;
|
final int page;
|
||||||
if (args.length > 1) {
|
if (args.length > 1) {
|
||||||
switch (args[1].toLowerCase()) {
|
switch (args[1].toLowerCase()) {
|
||||||
|
@ -28,6 +28,8 @@ package com.plotsquared.core.command;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -43,6 +45,7 @@ import javax.annotation.Nonnull;
|
|||||||
|
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@CommandDeclaration(command = "load",
|
@CommandDeclaration(command = "load",
|
||||||
@ -86,44 +89,46 @@ public class Load extends SubCommand {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.length != 0) {
|
try (final MetaDataAccess<List<String>> metaDataAccess =
|
||||||
if (args.length == 1) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_SCHEMATICS)) {
|
||||||
List<String> schematics = player.getMeta("plot_schematics");
|
if (args.length != 0) {
|
||||||
if (schematics == null) {
|
if (args.length == 1) {
|
||||||
// No schematics found:
|
List<String> schematics = metaDataAccess.get().orElse(null);
|
||||||
MainUtil.sendMessage(player, Captions.LOAD_NULL);
|
if (schematics == null) {
|
||||||
return false;
|
// No schematics found:
|
||||||
}
|
MainUtil.sendMessage(player, Captions.LOAD_NULL);
|
||||||
String schematic;
|
return false;
|
||||||
try {
|
|
||||||
schematic = schematics.get(Integer.parseInt(args[0]) - 1);
|
|
||||||
} catch (Exception ignored) {
|
|
||||||
// use /plot load <index>
|
|
||||||
MainUtil.sendMessage(player, Captions.NOT_VALID_NUMBER,
|
|
||||||
"(1, " + schematics.size() + ')');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
final URL url;
|
|
||||||
try {
|
|
||||||
url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic);
|
|
||||||
} catch (MalformedURLException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
MainUtil.sendMessage(player, Captions.LOAD_FAILED);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
plot.addRunning();
|
|
||||||
MainUtil.sendMessage(player, Captions.GENERATING_COMPONENT);
|
|
||||||
TaskManager.runTaskAsync(() -> {
|
|
||||||
Schematic taskSchematic = this.schematicHandler.getSchematic(url);
|
|
||||||
if (taskSchematic == null) {
|
|
||||||
plot.removeRunning();
|
|
||||||
sendMessage(player, Captions.SCHEMATIC_INVALID,
|
|
||||||
"non-existent or not in gzip format");
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
PlotArea area = plot.getArea();
|
String schematic;
|
||||||
this.schematicHandler.paste(taskSchematic, plot, 0, area.getMinBuildHeight(), 0, false,
|
try {
|
||||||
new RunnableVal<Boolean>() {
|
schematic = schematics.get(Integer.parseInt(args[0]) - 1);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
// use /plot load <index>
|
||||||
|
MainUtil.sendMessage(player, Captions.NOT_VALID_NUMBER,
|
||||||
|
"(1, " + schematics.size() + ')');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final URL url;
|
||||||
|
try {
|
||||||
|
url = new URL(Settings.Web.URL + "saves/" + player.getUUID() + '/' + schematic);
|
||||||
|
} catch (MalformedURLException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
MainUtil.sendMessage(player, Captions.LOAD_FAILED);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
plot.addRunning();
|
||||||
|
MainUtil.sendMessage(player, Captions.GENERATING_COMPONENT);
|
||||||
|
TaskManager.runTaskAsync(() -> {
|
||||||
|
Schematic taskSchematic = this.schematicHandler.getSchematic(url);
|
||||||
|
if (taskSchematic == null) {
|
||||||
|
plot.removeRunning();
|
||||||
|
sendMessage(player, Captions.SCHEMATIC_INVALID,
|
||||||
|
"non-existent or not in gzip format");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
PlotArea area = plot.getArea();
|
||||||
|
this.schematicHandler
|
||||||
|
.paste(taskSchematic, plot, 0, area.getMinBuildHeight(), 0, false, new RunnableVal<Boolean>() {
|
||||||
@Override public void run(Boolean value) {
|
@Override public void run(Boolean value) {
|
||||||
plot.removeRunning();
|
plot.removeRunning();
|
||||||
if (value) {
|
if (value) {
|
||||||
@ -133,58 +138,61 @@ public class Load extends SubCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
plot.removeRunning();
|
|
||||||
MainUtil.sendMessage(player, Captions.COMMAND_SYNTAX, "/plot load <index>");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// list schematics
|
|
||||||
|
|
||||||
List<String> schematics = player.getMeta("plot_schematics");
|
|
||||||
if (schematics == null) {
|
|
||||||
plot.addRunning();
|
|
||||||
TaskManager.runTaskAsync(() -> {
|
|
||||||
List<String> schematics1 = this.schematicHandler.getSaves(player.getUUID());
|
|
||||||
plot.removeRunning();
|
|
||||||
if ((schematics1 == null) || schematics1.isEmpty()) {
|
|
||||||
MainUtil.sendMessage(player, Captions.LOAD_FAILED);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
player.setMeta("plot_schematics", schematics1);
|
plot.removeRunning();
|
||||||
|
MainUtil.sendMessage(player, Captions.COMMAND_SYNTAX, "/plot load <index>");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// list schematics
|
||||||
|
|
||||||
|
List<String> schematics = metaDataAccess.get().orElse(null);
|
||||||
|
if (schematics == null) {
|
||||||
|
plot.addRunning();
|
||||||
|
TaskManager.runTaskAsync(() -> {
|
||||||
|
List<String> schematics1 = this.schematicHandler.getSaves(player.getUUID());
|
||||||
|
plot.removeRunning();
|
||||||
|
if ((schematics1 == null) || schematics1.isEmpty()) {
|
||||||
|
MainUtil.sendMessage(player, Captions.LOAD_FAILED);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
metaDataAccess.set(schematics1);
|
||||||
|
displaySaves(player);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
displaySaves(player);
|
displaySaves(player);
|
||||||
});
|
}
|
||||||
} else {
|
|
||||||
displaySaves(player);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void displaySaves(PlotPlayer<?> player) {
|
public void displaySaves(PlotPlayer<?> player) {
|
||||||
List<String> schematics = player.getMeta("plot_schematics");
|
try (final MetaDataAccess<List<String>> metaDataAccess =
|
||||||
for (int i = 0; i < Math.min(schematics.size(), 32); i++) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_SCHEMATICS)) {
|
||||||
try {
|
List<String> schematics = metaDataAccess.get().orElse(Collections.emptyList());
|
||||||
String schematic = schematics.get(i).split("\\.")[0];
|
for (int i = 0; i < Math.min(schematics.size(), 32); i++) {
|
||||||
String[] split = schematic.split("_");
|
try {
|
||||||
if (split.length < 5) {
|
String schematic = schematics.get(i).split("\\.")[0];
|
||||||
continue;
|
String[] split = schematic.split("_");
|
||||||
|
if (split.length < 5) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String time = secToTime((System.currentTimeMillis() / 1000) - Long.parseLong(split[0]));
|
||||||
|
String world = split[1];
|
||||||
|
PlotId id = PlotId.fromString(split[2] + ';' + split[3]);
|
||||||
|
String size = split[4];
|
||||||
|
String color = "$4";
|
||||||
|
MainUtil.sendMessage(player,
|
||||||
|
"$3[$2" + (i + 1) + "$3] " + color + time + "$3 | " + color + world + ';' + id
|
||||||
|
+ "$3 | " + color + size + 'x' + size);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
String time =
|
|
||||||
secToTime((System.currentTimeMillis() / 1000) - Long.parseLong(split[0]));
|
|
||||||
String world = split[1];
|
|
||||||
PlotId id = PlotId.fromString(split[2] + ';' + split[3]);
|
|
||||||
String size = split[4];
|
|
||||||
String color = "$4";
|
|
||||||
MainUtil.sendMessage(player,
|
|
||||||
"$3[$2" + (i + 1) + "$3] " + color + time + "$3 | " + color + world + ';' + id
|
|
||||||
+ "$3 | " + color + size + 'x' + size);
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
MainUtil.sendMessage(player, Captions.LOAD_LIST);
|
||||||
}
|
}
|
||||||
MainUtil.sendMessage(player, Captions.LOAD_LIST);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String secToTime(long time) {
|
public String secToTime(long time) {
|
||||||
|
@ -31,6 +31,8 @@ import com.plotsquared.core.configuration.Captions;
|
|||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.player.ConsolePlayer;
|
import com.plotsquared.core.player.ConsolePlayer;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -43,6 +45,7 @@ import com.plotsquared.core.util.task.RunnableVal3;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,7 +234,11 @@ public class MainCommand extends Command {
|
|||||||
RunnableVal3<Command, Runnable, Runnable> confirm,
|
RunnableVal3<Command, Runnable, Runnable> confirm,
|
||||||
RunnableVal2<Command, CommandResult> whenDone) {
|
RunnableVal2<Command, CommandResult> whenDone) {
|
||||||
// Clear perm caching //
|
// Clear perm caching //
|
||||||
player.deleteMeta("perm");
|
try (final MetaDataAccess<Map<String, Boolean>> permAccess = player.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_PERMISSIONS)) {
|
||||||
|
permAccess.remove();
|
||||||
|
}
|
||||||
|
|
||||||
// Optional command scope //
|
// Optional command scope //
|
||||||
Location location = null;
|
Location location = null;
|
||||||
Plot plot = null;
|
Plot plot = null;
|
||||||
@ -246,12 +253,17 @@ public class MainCommand extends Command {
|
|||||||
Location newLoc = newPlot.getCenterSynchronous();
|
Location newLoc = newPlot.getCenterSynchronous();
|
||||||
if (player.canTeleport(newLoc)) {
|
if (player.canTeleport(newLoc)) {
|
||||||
// Save meta
|
// Save meta
|
||||||
location = player.getMeta(PlotPlayer.META_LOCATION);
|
try (final MetaDataAccess<Location> locationMetaDataAccess
|
||||||
plot = player.getMeta(PlotPlayer.META_LAST_PLOT);
|
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
|
location = locationMetaDataAccess.get().orElse(null);
|
||||||
|
locationMetaDataAccess.set(newLoc);
|
||||||
|
}
|
||||||
|
try (final MetaDataAccess<Plot> plotMetaDataAccess
|
||||||
|
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
plot = plotMetaDataAccess.get().orElse(null);
|
||||||
|
plotMetaDataAccess.set(newPlot);
|
||||||
|
}
|
||||||
tp = true;
|
tp = true;
|
||||||
// Set loc
|
|
||||||
player.setMeta(PlotPlayer.META_LOCATION, newLoc);
|
|
||||||
player.setMeta(PlotPlayer.META_LAST_PLOT, newPlot);
|
|
||||||
} else {
|
} else {
|
||||||
Captions.BORDER.send(player);
|
Captions.BORDER.send(player);
|
||||||
}
|
}
|
||||||
@ -304,15 +316,21 @@ public class MainCommand extends Command {
|
|||||||
}
|
}
|
||||||
// Reset command scope //
|
// Reset command scope //
|
||||||
if (tp && !(player instanceof ConsolePlayer)) {
|
if (tp && !(player instanceof ConsolePlayer)) {
|
||||||
if (location == null) {
|
try (final MetaDataAccess<Location> locationMetaDataAccess
|
||||||
player.deleteMeta(PlotPlayer.META_LOCATION);
|
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
} else {
|
if (location == null) {
|
||||||
player.setMeta(PlotPlayer.META_LOCATION, location);
|
locationMetaDataAccess.remove();
|
||||||
|
} else {
|
||||||
|
locationMetaDataAccess.set(location);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (plot == null) {
|
try (final MetaDataAccess<Plot> plotMetaDataAccess
|
||||||
player.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
} else {
|
if (plot == null) {
|
||||||
player.setMeta(PlotPlayer.META_LAST_PLOT, plot);
|
plotMetaDataAccess.remove();
|
||||||
|
} else {
|
||||||
|
plotMetaDataAccess.set(plot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return CompletableFuture.completedFuture(true);
|
return CompletableFuture.completedFuture(true);
|
||||||
|
@ -28,6 +28,8 @@ package com.plotsquared.core.command;
|
|||||||
import com.google.inject.Inject;
|
import com.google.inject.Inject;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotId;
|
import com.plotsquared.core.plot.PlotId;
|
||||||
@ -104,9 +106,9 @@ public class Save extends SubCommand {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
MainUtil.sendMessage(player, Captions.SAVE_SUCCESS);
|
MainUtil.sendMessage(player, Captions.SAVE_SUCCESS);
|
||||||
List<String> schematics = player.getMeta("plot_schematics");
|
try (final MetaDataAccess<List<String>> schematicAccess =
|
||||||
if (schematics != null) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_SCHEMATICS)) {
|
||||||
schematics.add(file + ".schem");
|
schematicAccess.get().ifPresent(schematics -> schematics.add(file + ".schem"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -29,6 +29,8 @@ import com.google.inject.Inject;
|
|||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.generator.GeneratorWrapper;
|
import com.plotsquared.core.generator.GeneratorWrapper;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.setup.SetupProcess;
|
import com.plotsquared.core.setup.SetupProcess;
|
||||||
import com.plotsquared.core.setup.SetupStep;
|
import com.plotsquared.core.setup.SetupStep;
|
||||||
@ -72,42 +74,48 @@ public class Setup extends SubCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean onCommand(PlotPlayer<?> player, String[] args) {
|
@Override public boolean onCommand(PlotPlayer<?> player, String[] args) {
|
||||||
SetupProcess process = player.getMeta("setup");
|
try (final MetaDataAccess<SetupProcess> metaDataAccess =
|
||||||
if (process == null) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_SETUP)) {
|
||||||
if (args.length > 0) {
|
SetupProcess process = metaDataAccess.get().orElse(null);
|
||||||
MainUtil.sendMessage(player, Captions.SETUP_NOT_STARTED);
|
if (process == null) {
|
||||||
|
if (args.length > 0) {
|
||||||
|
MainUtil.sendMessage(player, Captions.SETUP_NOT_STARTED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
process = new SetupProcess();
|
||||||
|
metaDataAccess.set(process);
|
||||||
|
this.setupUtils.updateGenerators();
|
||||||
|
SetupStep step = process.getCurrentStep();
|
||||||
|
step.announce(player);
|
||||||
|
displayGenerators(player);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
process = new SetupProcess();
|
if (args.length == 1) {
|
||||||
player.setMeta("setup", process);
|
if ("back".equalsIgnoreCase(args[0])) {
|
||||||
this.setupUtils.updateGenerators();
|
process.back();
|
||||||
SetupStep step = process.getCurrentStep();
|
process.getCurrentStep().announce(player);
|
||||||
step.announce(player);
|
} else if ("cancel".equalsIgnoreCase(args[0])) {
|
||||||
displayGenerators(player);
|
metaDataAccess.remove();
|
||||||
|
MainUtil.sendMessage(player, Captions.SETUP_CANCELLED);
|
||||||
|
} else {
|
||||||
|
process.handleInput(player, args[0]);
|
||||||
|
if (process.getCurrentStep() != null) {
|
||||||
|
process.getCurrentStep().announce(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
process.getCurrentStep().announce(player);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (args.length == 1) {
|
|
||||||
if ("back".equalsIgnoreCase(args[0])) {
|
|
||||||
process.back();
|
|
||||||
process.getCurrentStep().announce(player);
|
|
||||||
} else if ("cancel".equalsIgnoreCase(args[0])) {
|
|
||||||
player.deleteMeta("setup");
|
|
||||||
MainUtil.sendMessage(player, Captions.SETUP_CANCELLED);
|
|
||||||
} else {
|
|
||||||
process.handleInput(player, args[0]);
|
|
||||||
if (process.getCurrentStep() != null) {
|
|
||||||
process.getCurrentStep().announce(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
process.getCurrentStep().announce(player);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public Collection<Command> tab(PlotPlayer player, String[] args, boolean space) {
|
@Override public Collection<Command> tab(PlotPlayer player, String[] args, boolean space) {
|
||||||
SetupProcess process = (SetupProcess) player.getMeta("setup"); // TODO use generics -> auto cast
|
SetupProcess process;
|
||||||
|
try (final MetaDataAccess<SetupProcess> metaDataAccess =
|
||||||
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_SETUP)) {
|
||||||
|
process = metaDataAccess.get().orElse(null);
|
||||||
|
}
|
||||||
if (process == null) {
|
if (process == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ import com.plotsquared.core.events.PlotFlagRemoveEvent;
|
|||||||
import com.plotsquared.core.events.Result;
|
import com.plotsquared.core.events.Result;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.player.MetaDataAccess;
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.MetaDataKey;
|
||||||
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
@ -136,14 +137,16 @@ public class PlotListener {
|
|||||||
.hasPermission(player, "plots.admin.entry.denied")) {
|
.hasPermission(player, "plots.admin.entry.denied")) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Plot last = player.getMeta(PlotPlayer.META_LAST_PLOT);
|
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
if ((last != null) && !last.getId().equals(plot.getId())) {
|
Plot last = lastPlot.get().orElse(null);
|
||||||
plotExit(player, last);
|
if ((last != null) && !last.getId().equals(plot.getId())) {
|
||||||
|
plotExit(player, last);
|
||||||
|
}
|
||||||
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.handleEntry(player, plot);
|
||||||
|
}
|
||||||
|
lastPlot.set(plot);
|
||||||
}
|
}
|
||||||
if (ExpireManager.IMP != null) {
|
|
||||||
ExpireManager.IMP.handleEntry(player, plot);
|
|
||||||
}
|
|
||||||
player.setMeta(PlotPlayer.META_LAST_PLOT, plot);
|
|
||||||
this.eventDispatcher.callEntry(player, plot);
|
this.eventDispatcher.callEntry(player, plot);
|
||||||
if (plot.hasOwner()) {
|
if (plot.hasOwner()) {
|
||||||
// This will inherit values from PlotArea
|
// This will inherit values from PlotArea
|
||||||
@ -230,39 +233,47 @@ public class PlotListener {
|
|||||||
player.setWeather(plot.getFlag(WeatherFlag.class));
|
player.setWeather(plot.getFlag(WeatherFlag.class));
|
||||||
|
|
||||||
ItemType musicFlag = plot.getFlag(MusicFlag.class);
|
ItemType musicFlag = plot.getFlag(MusicFlag.class);
|
||||||
if (musicFlag != null) {
|
|
||||||
final String rawId = musicFlag.getId();
|
try (final MetaDataAccess<Location> musicMeta =
|
||||||
if (rawId.contains("disc") || musicFlag == ItemTypes.AIR) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_MUSIC)) {
|
||||||
Location location = player.getLocation();
|
if (musicFlag != null) {
|
||||||
Location lastLocation = player.getMeta("music");
|
final String rawId = musicFlag.getId();
|
||||||
if (lastLocation != null) {
|
if (rawId.contains("disc") || musicFlag == ItemTypes.AIR) {
|
||||||
player.playMusic(lastLocation, musicFlag);
|
Location location = player.getLocation();
|
||||||
if (musicFlag == ItemTypes.AIR) {
|
Location lastLocation = musicMeta.get().orElse(null);
|
||||||
player.deleteMeta("music");
|
if (lastLocation != null) {
|
||||||
|
player.playMusic(lastLocation, musicFlag);
|
||||||
|
if (musicFlag == ItemTypes.AIR) {
|
||||||
|
musicMeta.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (musicFlag != ItemTypes.AIR) {
|
||||||
|
try {
|
||||||
|
musicMeta.set(location);
|
||||||
|
player.playMusic(location, musicFlag);
|
||||||
|
} catch (Exception ignored) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (musicFlag != ItemTypes.AIR) {
|
} else {
|
||||||
try {
|
musicMeta.get().ifPresent(lastLoc -> {
|
||||||
player.setMeta("music", location);
|
musicMeta.remove();
|
||||||
player.playMusic(location, musicFlag);
|
player.playMusic(lastLoc, ItemTypes.AIR);
|
||||||
} catch (Exception ignored) {
|
});
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Location lastLoc = player.getMeta("music");
|
|
||||||
if (lastLoc != null) {
|
|
||||||
player.deleteMeta("music");
|
|
||||||
player.playMusic(lastLoc, ItemTypes.AIR);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CommentManager.sendTitle(player, plot);
|
CommentManager.sendTitle(player, plot);
|
||||||
|
|
||||||
if (titles && !player.getAttribute("disabletitles")) {
|
if (titles && !player.getAttribute("disabletitles")) {
|
||||||
if (!Captions.TITLE_ENTERED_PLOT.getTranslated().isEmpty()
|
if (!Captions.TITLE_ENTERED_PLOT.getTranslated().isEmpty()
|
||||||
|| !Captions.TITLE_ENTERED_PLOT_SUB.getTranslated().isEmpty()) {
|
|| !Captions.TITLE_ENTERED_PLOT_SUB.getTranslated().isEmpty()) {
|
||||||
TaskManager.runTaskLaterAsync(() -> {
|
TaskManager.runTaskLaterAsync(() -> {
|
||||||
Plot lastPlot = player.getMeta(PlotPlayer.META_LAST_PLOT);
|
Plot lastPlot = null;
|
||||||
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
lastPlot = lastPlotAccess.get().orElse(null);
|
||||||
|
}
|
||||||
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId())) {
|
if ((lastPlot != null) && plot.getId().equals(lastPlot.getId())) {
|
||||||
Map<String, String> replacements = new HashMap<>();
|
Map<String, String> replacements = new HashMap<>();
|
||||||
replacements.put("%x%", String.valueOf(lastPlot.getId().getX()));
|
replacements.put("%x%", String.valueOf(lastPlot.getId().getX()));
|
||||||
@ -299,89 +310,96 @@ public class PlotListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
|
public boolean plotExit(final PlotPlayer<?> player, Plot plot) {
|
||||||
Object previous = player.deleteMeta(PlotPlayer.META_LAST_PLOT);
|
try (final MetaDataAccess<Plot> lastPlot = player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
this.eventDispatcher.callLeave(player, plot);
|
final Plot previous = lastPlot.remove();
|
||||||
if (plot.hasOwner()) {
|
this.eventDispatcher.callLeave(player, plot);
|
||||||
PlotArea pw = plot.getArea();
|
if (plot.hasOwner()) {
|
||||||
if (pw == null) {
|
PlotArea pw = plot.getArea();
|
||||||
return true;
|
if (pw == null) {
|
||||||
}
|
return true;
|
||||||
if (plot.getFlag(DenyExitFlag.class) && !Permissions
|
|
||||||
.hasPermission(player, Captions.PERMISSION_ADMIN_EXIT_DENIED) && !player
|
|
||||||
.getMeta("kick", false)) {
|
|
||||||
if (previous != null) {
|
|
||||||
player.setMeta(PlotPlayer.META_LAST_PLOT, previous);
|
|
||||||
}
|
}
|
||||||
return false;
|
try (final MetaDataAccess<Boolean> kickAccess =
|
||||||
}
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_KICK)) {
|
||||||
if (!plot.getFlag(GamemodeFlag.class).equals(GamemodeFlag.DEFAULT) || !plot
|
if (plot.getFlag(DenyExitFlag.class) && !Permissions
|
||||||
.getFlag(GuestGamemodeFlag.class).equals(GamemodeFlag.DEFAULT)) {
|
.hasPermission(player, Captions.PERMISSION_ADMIN_EXIT_DENIED) &&
|
||||||
if (player.getGameMode() != pw.getGameMode()) {
|
!kickAccess.get().orElse(false)) {
|
||||||
if (!Permissions.hasPermission(player, "plots.gamemode.bypass")) {
|
if (previous != null) {
|
||||||
player.setGameMode(pw.getGameMode());
|
lastPlot.set(previous);
|
||||||
} else {
|
}
|
||||||
MainUtil.sendMessage(player, StringMan
|
return false;
|
||||||
.replaceAll(Captions.GAMEMODE_WAS_BYPASSED.getTranslated(), "{plot}",
|
|
||||||
plot.toString(), "{gamemode}",
|
|
||||||
pw.getGameMode().getName().toLowerCase()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (!plot.getFlag(GamemodeFlag.class).equals(GamemodeFlag.DEFAULT) || !plot
|
||||||
|
.getFlag(GuestGamemodeFlag.class).equals(GamemodeFlag.DEFAULT)) {
|
||||||
final String farewell = plot.getFlag(FarewellFlag.class);
|
if (player.getGameMode() != pw.getGameMode()) {
|
||||||
if (!farewell.isEmpty()) {
|
if (!Permissions.hasPermission(player, "plots.gamemode.bypass")) {
|
||||||
plot.format(Captions.PREFIX_FAREWELL.getTranslated() + farewell, player, false)
|
player.setGameMode(pw.getGameMode());
|
||||||
.thenAcceptAsync(player::sendMessage);
|
} else {
|
||||||
}
|
MainUtil.sendMessage(player, StringMan
|
||||||
|
.replaceAll(Captions.GAMEMODE_WAS_BYPASSED.getTranslated(), "{plot}",
|
||||||
if (plot.getFlag(NotifyLeaveFlag.class)) {
|
plot.toString(), "{gamemode}",
|
||||||
if (!Permissions.hasPermission(player, "plots.flag.notify-enter.bypass")) {
|
pw.getGameMode().getName().toLowerCase()));
|
||||||
for (UUID uuid : plot.getOwners()) {
|
|
||||||
final PlotPlayer owner = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid);
|
|
||||||
if ((owner != null) && !owner.getUUID().equals(player.getUUID())) {
|
|
||||||
MainUtil.sendMessage(owner, Captions.NOTIFY_LEAVE.getTranslated()
|
|
||||||
.replace("%player", player.getName())
|
|
||||||
.replace("%plot", plot.getId().toString()));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
final FlyFlag.FlyStatus flyStatus = plot.getFlag(FlyFlag.class);
|
final String farewell = plot.getFlag(FarewellFlag.class);
|
||||||
if (flyStatus != FlyFlag.FlyStatus.DEFAULT) {
|
if (!farewell.isEmpty()) {
|
||||||
try (final MetaDataAccess<Boolean> metaDataAccess = player.accessPersistentMetaData(PlayerMetaDataKeys.PERSISTENT_FLIGHT)) {
|
plot.format(Captions.PREFIX_FAREWELL.getTranslated() + farewell, player, false)
|
||||||
final Optional<Boolean> value = metaDataAccess.get();
|
.thenAcceptAsync(player::sendMessage);
|
||||||
if (value.isPresent()) {
|
}
|
||||||
player.setFlight(value.get());
|
|
||||||
metaDataAccess.remove();
|
if (plot.getFlag(NotifyLeaveFlag.class)) {
|
||||||
} else {
|
if (!Permissions.hasPermission(player, "plots.flag.notify-enter.bypass")) {
|
||||||
GameMode gameMode = player.getGameMode();
|
for (UUID uuid : plot.getOwners()) {
|
||||||
if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) {
|
final PlotPlayer owner = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid);
|
||||||
player.setFlight(false);
|
if ((owner != null) && !owner.getUUID().equals(player.getUUID())) {
|
||||||
} else if (!player.getFlight()) {
|
MainUtil.sendMessage(owner, Captions.NOTIFY_LEAVE.getTranslated()
|
||||||
player.setFlight(true);
|
.replace("%player", player.getName())
|
||||||
|
.replace("%plot", plot.getId().toString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (plot.getFlag(TimeFlag.class) != TimeFlag.TIME_DISABLED.getValue().longValue()) {
|
final FlyFlag.FlyStatus flyStatus = plot.getFlag(FlyFlag.class);
|
||||||
player.setTime(Long.MAX_VALUE);
|
if (flyStatus != FlyFlag.FlyStatus.DEFAULT) {
|
||||||
}
|
try (final MetaDataAccess<Boolean> metaDataAccess = player.accessPersistentMetaData(PlayerMetaDataKeys.PERSISTENT_FLIGHT)) {
|
||||||
|
final Optional<Boolean> value = metaDataAccess.get();
|
||||||
|
if (value.isPresent()) {
|
||||||
|
player.setFlight(value.get());
|
||||||
|
metaDataAccess.remove();
|
||||||
|
} else {
|
||||||
|
GameMode gameMode = player.getGameMode();
|
||||||
|
if (gameMode == GameModes.SURVIVAL || gameMode == GameModes.ADVENTURE) {
|
||||||
|
player.setFlight(false);
|
||||||
|
} else if (!player.getFlight()) {
|
||||||
|
player.setFlight(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final PlotWeather plotWeather = plot.getFlag(WeatherFlag.class);
|
if (plot.getFlag(TimeFlag.class) != TimeFlag.TIME_DISABLED.getValue().longValue()) {
|
||||||
if (plotWeather != PlotWeather.CLEAR) {
|
player.setTime(Long.MAX_VALUE);
|
||||||
player.setWeather(PlotWeather.RESET);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
Location lastLoc = player.getMeta("music");
|
final PlotWeather plotWeather = plot.getFlag(WeatherFlag.class);
|
||||||
if (lastLoc != null) {
|
if (plotWeather != PlotWeather.CLEAR) {
|
||||||
player.deleteMeta("music");
|
player.setWeather(PlotWeather.RESET);
|
||||||
player.playMusic(lastLoc, ItemTypes.AIR);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
feedRunnable.remove(player.getUUID());
|
try (final MetaDataAccess<Location> musicAccess =
|
||||||
healRunnable.remove(player.getUUID());
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_MUSIC)) {
|
||||||
|
musicAccess.get().ifPresent(lastLoc -> {
|
||||||
|
musicAccess.remove();
|
||||||
|
player.playMusic(lastLoc, ItemTypes.AIR);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
feedRunnable.remove(player.getUUID());
|
||||||
|
healRunnable.remove(player.getUUID());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ import com.plotsquared.core.database.DBFunc;
|
|||||||
import com.plotsquared.core.events.TeleportCause;
|
import com.plotsquared.core.events.TeleportCause;
|
||||||
import com.plotsquared.core.inject.annotations.ConsoleActor;
|
import com.plotsquared.core.inject.annotations.ConsoleActor;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.PlotWeather;
|
import com.plotsquared.core.plot.PlotWeather;
|
||||||
import com.plotsquared.core.plot.world.PlotAreaManager;
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
||||||
@ -134,8 +135,16 @@ public class ConsolePlayer extends PlotPlayer<Actor> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override public void teleport(Location location, TeleportCause cause) {
|
@Override public void teleport(Location location, TeleportCause cause) {
|
||||||
setMeta(META_LAST_PLOT, location.getPlot());
|
try (final MetaDataAccess<Plot> lastPlot = accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
setMeta(META_LOCATION, location);
|
if (location.getPlot() == null) {
|
||||||
|
lastPlot.remove();
|
||||||
|
} else {
|
||||||
|
lastPlot.set(location.getPlot());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try (final MetaDataAccess<Location> locationMetaDataAccess = accessPersistentMetaData(PlayerMetaDataKeys.TEMPORARY_LOCATION)) {
|
||||||
|
locationMetaDataAccess.set(location);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public boolean isOnline() {
|
@Override public boolean isOnline() {
|
||||||
|
@ -28,6 +28,7 @@ package com.plotsquared.core.player;
|
|||||||
import com.plotsquared.core.synchronization.LockRepository;
|
import com.plotsquared.core.synchronization.LockRepository;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,8 +60,10 @@ public abstract class MetaDataAccess<T> implements AutoCloseable {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove the stored value meta data
|
* Remove the stored value meta data
|
||||||
|
*
|
||||||
|
* @return Old value, or {@link null}
|
||||||
*/
|
*/
|
||||||
public abstract void remove();
|
@Nullable public abstract T remove();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the meta data value
|
* Set the meta data value
|
||||||
|
@ -27,6 +27,7 @@ package com.plotsquared.core.player;
|
|||||||
|
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
import com.plotsquared.core.synchronization.LockKey;
|
import com.plotsquared.core.synchronization.LockKey;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
@ -44,10 +45,10 @@ public final class MetaDataKey<T> {
|
|||||||
private static final Object keyMetaData = new Object();
|
private static final Object keyMetaData = new Object();
|
||||||
|
|
||||||
private final String key;
|
private final String key;
|
||||||
private final Class<T> type;
|
private final TypeLiteral<T> type;
|
||||||
private final LockKey lockKey;
|
private final LockKey lockKey;
|
||||||
|
|
||||||
private MetaDataKey(@Nonnull final String key, @Nonnull final Class<T> type) {
|
private MetaDataKey(@Nonnull final String key, @Nonnull final TypeLiteral<T> type) {
|
||||||
this.key = Preconditions.checkNotNull(key, "Key may not be null");
|
this.key = Preconditions.checkNotNull(key, "Key may not be null");
|
||||||
this.type = Preconditions.checkNotNull(type, "Type may not be null");
|
this.type = Preconditions.checkNotNull(type, "Type may not be null");
|
||||||
this.lockKey = LockKey.of(this.key);
|
this.lockKey = LockKey.of(this.key);
|
||||||
@ -60,7 +61,7 @@ public final class MetaDataKey<T> {
|
|||||||
* @param <T> Type
|
* @param <T> Type
|
||||||
* @return MetaData key instance
|
* @return MetaData key instance
|
||||||
*/
|
*/
|
||||||
@Nonnull public static <T> MetaDataKey<T> of(@Nonnull final String key, @Nonnull final Class<T> type) {
|
@Nonnull public static <T> MetaDataKey<T> of(@Nonnull final String key, @Nonnull final TypeLiteral<T> type) {
|
||||||
synchronized (keyMetaData) {
|
synchronized (keyMetaData) {
|
||||||
return (MetaDataKey<T>)
|
return (MetaDataKey<T>)
|
||||||
keyMap.computeIfAbsent(key, missingKey -> new MetaDataKey<>(missingKey, type));
|
keyMap.computeIfAbsent(key, missingKey -> new MetaDataKey<>(missingKey, type));
|
||||||
@ -100,7 +101,7 @@ public final class MetaDataKey<T> {
|
|||||||
*
|
*
|
||||||
* @return Meta data type
|
* @return Meta data type
|
||||||
*/
|
*/
|
||||||
@Nonnull public Class<T> getType() {
|
@Nonnull public TypeLiteral<T> getType() {
|
||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,9 +28,10 @@ package com.plotsquared.core.player;
|
|||||||
import com.plotsquared.core.synchronization.LockRepository;
|
import com.plotsquared.core.synchronization.LockRepository;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> {
|
final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> {
|
||||||
|
|
||||||
PersistentMetaDataAccess(@Nonnull final PlotPlayer<?> player,
|
PersistentMetaDataAccess(@Nonnull final PlotPlayer<?> player,
|
||||||
@Nonnull final MetaDataKey<T> metaDataKey,
|
@Nonnull final MetaDataKey<T> metaDataKey,
|
||||||
@ -42,8 +43,12 @@ public final class PersistentMetaDataAccess<T> extends MetaDataAccess<T> {
|
|||||||
return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString());
|
return this.getPlayer().hasPersistentMeta(getMetaDataKey().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void remove() {
|
@Override @Nullable public T remove() {
|
||||||
this.getPlayer().removePersistentMeta(this.getMetaDataKey().toString());
|
final Object old = this.getPlayer().removePersistentMeta(this.getMetaDataKey().toString());
|
||||||
|
if (old == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (T) old;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override public void set(@Nonnull T value) {
|
@Override public void set(@Nonnull T value) {
|
||||||
|
@ -25,10 +25,36 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.player;
|
package com.plotsquared.core.player;
|
||||||
|
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
|
import com.plotsquared.core.command.Auto;
|
||||||
|
import com.plotsquared.core.command.CmdInstance;
|
||||||
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.plotsquared.core.plot.Plot;
|
||||||
|
import com.plotsquared.core.plot.PlotInventory;
|
||||||
|
import com.plotsquared.core.setup.SetupProcess;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public final class PlayerMetaDataKeys {
|
public final class PlayerMetaDataKeys {
|
||||||
|
|
||||||
public static final MetaDataKey<Boolean> PERSISTENT_FLIGHT = MetaDataKey.of("flight", Boolean.class);
|
//@formatter:off
|
||||||
public static final MetaDataKey<Integer> GRANTED_PLOTS = MetaDataKey.of("grantedPlots", Integer.class);
|
public static final MetaDataKey<Boolean> PERSISTENT_FLIGHT = MetaDataKey.of("flight", new TypeLiteral<Boolean>() {});
|
||||||
|
public static final MetaDataKey<Integer> PERSISTENT_GRANTED_PLOTS = MetaDataKey.of("grantedPlots", new TypeLiteral<Integer>() {});
|
||||||
|
|
||||||
|
public static final MetaDataKey<Plot> TEMPORARY_LAST_PLOT = MetaDataKey.of("lastplot", new TypeLiteral<Plot>() {});
|
||||||
|
public static final MetaDataKey<Location> TEMPORARY_MUSIC = MetaDataKey.of("music", new TypeLiteral<Location>() {});
|
||||||
|
public static final MetaDataKey<Boolean> TEMPORARY_KICK = MetaDataKey.of("kick", new TypeLiteral<Boolean>() {});
|
||||||
|
public static final MetaDataKey<SetupProcess> TEMPORARY_SETUP = MetaDataKey.of("setup", new TypeLiteral<SetupProcess>() {});
|
||||||
|
public static final MetaDataKey<PlotInventory> TEMPORARY_INVENTORY = MetaDataKey.of("inventory", new TypeLiteral<PlotInventory>() {});
|
||||||
|
public static final MetaDataKey<Boolean> TEMPORARY_IGNORE_EXPIRE_TASK = MetaDataKey.of("ignoreExpireTask", new TypeLiteral<Boolean>() {});
|
||||||
|
public static final MetaDataKey<Plot> TEMPORARY_WORLD_EDIT_REGION_PLOT = MetaDataKey.of("WorldEditRegionPlot", new TypeLiteral<Plot>() {});
|
||||||
|
public static final MetaDataKey<Boolean> TEMPORARY_AUTO = MetaDataKey.of(Auto.class.getName(), new TypeLiteral<Boolean>() {});
|
||||||
|
public static final MetaDataKey<Map<String, Boolean>> TEMPORARY_PERMISSIONS = MetaDataKey.of("permissions", new TypeLiteral<Map<String, Boolean>>() {});
|
||||||
|
public static final MetaDataKey<List<String>> TEMPORARY_SCHEMATICS = MetaDataKey.of("plot_schematics", new TypeLiteral<List<String>>() {});
|
||||||
|
public static final MetaDataKey<Location> TEMPORARY_LOCATION = MetaDataKey.of("location", new TypeLiteral<Location>() {});
|
||||||
|
public static final MetaDataKey<CmdInstance> TEMPORARY_CONFIRM = MetaDataKey.of("cmdConfirm", new TypeLiteral<CmdInstance>() {});
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
private PlayerMetaDataKeys() {
|
private PlayerMetaDataKeys() {
|
||||||
}
|
}
|
||||||
|
@ -81,9 +81,6 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger("P2/" + PlotPlayer.class.getSimpleName());
|
private static final Logger logger = LoggerFactory.getLogger("P2/" + PlotPlayer.class.getSimpleName());
|
||||||
|
|
||||||
public static final String META_LAST_PLOT = "lastplot";
|
|
||||||
public static final String META_LOCATION = "location";
|
|
||||||
|
|
||||||
// Used to track debug mode
|
// Used to track debug mode
|
||||||
private static final Set<PlotPlayer<?>> debugModeEnabled = Collections.synchronizedSet(new HashSet<>());
|
private static final Set<PlotPlayer<?>> debugModeEnabled = Collections.synchronizedSet(new HashSet<>());
|
||||||
|
|
||||||
@ -162,7 +159,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
* @param key
|
* @param key
|
||||||
* @param value
|
* @param value
|
||||||
*/
|
*/
|
||||||
public void setMeta(String key, Object value) {
|
void setMeta(String key, Object value) {
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
deleteMeta(key);
|
deleteMeta(key);
|
||||||
} else {
|
} else {
|
||||||
@ -180,14 +177,14 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
* @param <T> the object type to return
|
* @param <T> the object type to return
|
||||||
* @return the value assigned to the key or null if it does not exist
|
* @return the value assigned to the key or null if it does not exist
|
||||||
*/
|
*/
|
||||||
public <T> T getMeta(String key) {
|
<T> T getMeta(String key) {
|
||||||
if (this.meta != null) {
|
if (this.meta != null) {
|
||||||
return (T) this.meta.get(key);
|
return (T) this.meta.get(key);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T> T getMeta(String key, T defaultValue) {
|
<T> T getMeta(String key, T defaultValue) {
|
||||||
T meta = getMeta(key);
|
T meta = getMeta(key);
|
||||||
if (meta == null) {
|
if (meta == null) {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
@ -206,7 +203,7 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
*
|
*
|
||||||
* @param key
|
* @param key
|
||||||
*/
|
*/
|
||||||
public Object deleteMeta(String key) {
|
Object deleteMeta(String key) {
|
||||||
return this.meta == null ? null : this.meta.remove(key);
|
return this.meta == null ? null : this.meta.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -225,11 +222,13 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
* @return the plot the player is standing on or null if standing on a road or not in a {@link PlotArea}
|
* @return the plot the player is standing on or null if standing on a road or not in a {@link PlotArea}
|
||||||
*/
|
*/
|
||||||
public Plot getCurrentPlot() {
|
public Plot getCurrentPlot() {
|
||||||
Plot value = getMeta(PlotPlayer.META_LAST_PLOT);
|
try (final MetaDataAccess<Plot> lastPlotAccess =
|
||||||
if (value == null && !Settings.Enabled_Components.EVENTS) {
|
this.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
return getLocation().getPlot();
|
if (lastPlotAccess.get().orElse(null) == null && !Settings.Enabled_Components.EVENTS) {
|
||||||
|
return this.getLocation().getPlot();
|
||||||
|
}
|
||||||
|
return lastPlotAccess.get().orElse(null);
|
||||||
}
|
}
|
||||||
return value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -730,11 +729,12 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
return this.metaMap.get(key);
|
return this.metaMap.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
void removePersistentMeta(String key) {
|
Object removePersistentMeta(String key) {
|
||||||
this.metaMap.remove(key);
|
final Object old = this.metaMap.remove(key);
|
||||||
if (Settings.Enabled_Components.PERSISTENT_META) {
|
if (Settings.Enabled_Components.PERSISTENT_META) {
|
||||||
DBFunc.removePersistentMeta(getUUID(), key);
|
DBFunc.removePersistentMeta(getUUID(), key);
|
||||||
}
|
}
|
||||||
|
return old;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -756,15 +756,34 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
return new PersistentMetaDataAccess<>(this, key, this.lockRepository.lock(key.getLockKey()));
|
return new PersistentMetaDataAccess<>(this, key, this.lockRepository.lock(key.getLockKey()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Access keyed temporary meta data for this player. This returns a meta data
|
||||||
|
* access instance, that MUST be closed. It is meant to be used with try-with-resources,
|
||||||
|
* like such:
|
||||||
|
* <pre>{@code
|
||||||
|
* try (final MetaDataAccess<Integer> access = player.accessTemporaryMetaData(PlayerMetaKeys.GRANTS)) {
|
||||||
|
* int grants = access.get();
|
||||||
|
* access.set(grants + 1);
|
||||||
|
* }
|
||||||
|
* }</pre>
|
||||||
|
*
|
||||||
|
* @param key Meta data key
|
||||||
|
* @param <T> Meta data type
|
||||||
|
* @return Meta data access. MUST be closed after being used
|
||||||
|
*/
|
||||||
|
@Nonnull public <T> MetaDataAccess<T> accessTemporaryMetaData(@Nonnull final MetaDataKey<T> key) {
|
||||||
|
return new TemporaryMetaDataAccess<>(this, key, this.lockRepository.lock(key.getLockKey()));
|
||||||
|
}
|
||||||
|
|
||||||
<T> void setPersistentMeta(@Nonnull final MetaDataKey<T> key,
|
<T> void setPersistentMeta(@Nonnull final MetaDataKey<T> key,
|
||||||
@Nonnull final T value) {
|
@Nonnull final T value) {
|
||||||
final Object rawValue = value;
|
final Object rawValue = value;
|
||||||
if (key.getType().equals(Integer.class)) {
|
if (key.getType().getRawType().equals(Integer.class)) {
|
||||||
this.setPersistentMeta(key.toString(), Ints.toByteArray((int) rawValue));
|
this.setPersistentMeta(key.toString(), Ints.toByteArray((int) rawValue));
|
||||||
} else if (key.getType().equals(Boolean.class)) {
|
} else if (key.getType().getRawType().equals(Boolean.class)) {
|
||||||
this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) rawValue));
|
this.setPersistentMeta(key.toString(), ByteArrayUtilities.booleanToBytes((boolean) rawValue));
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType().getSimpleName()));
|
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType().toString()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -774,12 +793,12 @@ public abstract class PlotPlayer<P> implements CommandCaller, OfflinePlotPlayer
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final Object returnValue;
|
final Object returnValue;
|
||||||
if (key.getType().equals(Integer.class)) {
|
if (key.getType().getRawType().equals(Integer.class)) {
|
||||||
returnValue = Ints.fromByteArray(value);
|
returnValue = Ints.fromByteArray(value);
|
||||||
} else if (key.getType().equals(Boolean.class)) {
|
} else if (key.getType().getRawType().equals(Boolean.class)) {
|
||||||
returnValue = ByteArrayUtilities.bytesToBoolean(value);
|
returnValue = ByteArrayUtilities.bytesToBoolean(value);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType().getSimpleName()));
|
throw new IllegalArgumentException(String.format("Unknown meta data type '%s'", key.getType().toString()));
|
||||||
}
|
}
|
||||||
return (T) returnValue;
|
return (T) returnValue;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* _____ _ _ _____ _
|
||||||
|
* | __ \| | | | / ____| | |
|
||||||
|
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
||||||
|
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
||||||
|
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
||||||
|
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
||||||
|
* | |
|
||||||
|
* |_|
|
||||||
|
* PlotSquared plot management system for Minecraft
|
||||||
|
* Copyright (C) 2020 IntellectualSites
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.plotsquared.core.player;
|
||||||
|
|
||||||
|
import com.plotsquared.core.synchronization.LockRepository;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
final class TemporaryMetaDataAccess<T> extends MetaDataAccess<T> {
|
||||||
|
|
||||||
|
TemporaryMetaDataAccess(@Nonnull final PlotPlayer<?> player,
|
||||||
|
@Nonnull final MetaDataKey<T> metaDataKey,
|
||||||
|
@Nonnull final LockRepository.LockAccess lockAccess) {
|
||||||
|
super(player, metaDataKey, lockAccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public boolean has() {
|
||||||
|
return this.getPlayer().getMeta(this.getMetaDataKey().toString()) != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override @Nullable public T remove() {
|
||||||
|
final Object old = getPlayer().deleteMeta(this.getMetaDataKey().toString());
|
||||||
|
if (old == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return (T) old;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override public void set(@Nonnull T value) {
|
||||||
|
this.getPlayer().setMeta(this.getMetaDataKey().toString(), null);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull @Override public Optional<T> get() {
|
||||||
|
return Optional.ofNullable(this.getPlayer().getMeta(this.getMetaDataKey().toString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -42,6 +42,8 @@ import com.plotsquared.core.inject.annotations.WorldConfig;
|
|||||||
import com.plotsquared.core.location.Direction;
|
import com.plotsquared.core.location.Direction;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
import com.plotsquared.core.location.PlotLoc;
|
import com.plotsquared.core.location.PlotLoc;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.flag.FlagContainer;
|
import com.plotsquared.core.plot.flag.FlagContainer;
|
||||||
import com.plotsquared.core.plot.flag.FlagParseException;
|
import com.plotsquared.core.plot.flag.FlagParseException;
|
||||||
@ -787,8 +789,11 @@ public abstract class PlotArea {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean addPlot(@Nonnull final Plot plot) {
|
public boolean addPlot(@Nonnull final Plot plot) {
|
||||||
for (PlotPlayer pp : plot.getPlayersInPlot()) {
|
for (final PlotPlayer<?> pp : plot.getPlayersInPlot()) {
|
||||||
pp.setMeta(PlotPlayer.META_LAST_PLOT, plot);
|
try (final MetaDataAccess<Plot> metaDataAccess = pp.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
metaDataAccess.set(plot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return this.plots.put(plot.getId(), plot) == null;
|
return this.plots.put(plot.getId(), plot) == null;
|
||||||
}
|
}
|
||||||
@ -826,8 +831,11 @@ public abstract class PlotArea {
|
|||||||
|
|
||||||
public boolean addPlotIfAbsent(@Nonnull final Plot plot) {
|
public boolean addPlotIfAbsent(@Nonnull final Plot plot) {
|
||||||
if (this.plots.putIfAbsent(plot.getId(), plot) == null) {
|
if (this.plots.putIfAbsent(plot.getId(), plot) == null) {
|
||||||
for (PlotPlayer pp : plot.getPlayersInPlot()) {
|
for (PlotPlayer<?> pp : plot.getPlayersInPlot()) {
|
||||||
pp.setMeta(PlotPlayer.META_LAST_PLOT, plot);
|
try (final MetaDataAccess<Plot> metaDataAccess = pp.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_LAST_PLOT)) {
|
||||||
|
metaDataAccess.set(plot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -25,18 +25,19 @@
|
|||||||
*/
|
*/
|
||||||
package com.plotsquared.core.plot;
|
package com.plotsquared.core.plot;
|
||||||
|
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.util.InventoryUtil;
|
import com.plotsquared.core.util.InventoryUtil;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
public class PlotInventory {
|
public class PlotInventory {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger("P2/" + PlotInventory.class.getSimpleName());
|
private static final Logger logger = LoggerFactory.getLogger("P2/" + PlotInventory.class.getSimpleName());
|
||||||
|
|
||||||
private static final String META_KEY = "inventory";
|
|
||||||
public final PlotPlayer<?> player;
|
public final PlotPlayer<?> player;
|
||||||
public final int size;
|
public final int size;
|
||||||
private final PlotItemStack[] items;
|
private final PlotItemStack[] items;
|
||||||
@ -58,16 +59,25 @@ public class PlotInventory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static PlotInventory getOpenPlotInventory(@Nonnull final PlotPlayer<?> plotPlayer) {
|
public static PlotInventory getOpenPlotInventory(@Nonnull final PlotPlayer<?> plotPlayer) {
|
||||||
return plotPlayer.getMeta(META_KEY, null);
|
try (final MetaDataAccess<PlotInventory> inventoryAccess = plotPlayer.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_INVENTORY)) {
|
||||||
|
return inventoryAccess.get().orElse(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setPlotInventoryOpen(@Nonnull final PlotPlayer<?> plotPlayer,
|
public static void setPlotInventoryOpen(@Nonnull final PlotPlayer<?> plotPlayer,
|
||||||
@Nonnull final PlotInventory plotInventory) {
|
@Nonnull final PlotInventory plotInventory) {
|
||||||
plotPlayer.setMeta(META_KEY, plotInventory);
|
try (final MetaDataAccess<PlotInventory> inventoryAccess = plotPlayer.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_INVENTORY)) {
|
||||||
|
inventoryAccess.set(plotInventory);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void removePlotInventoryOpen(@Nonnull final PlotPlayer<?>plotPlayer) {
|
public static void removePlotInventoryOpen(@Nonnull final PlotPlayer<?>plotPlayer) {
|
||||||
plotPlayer.deleteMeta(META_KEY);
|
try (final MetaDataAccess<PlotInventory> inventoryAccess = plotPlayer.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_INVENTORY)) {
|
||||||
|
inventoryAccess.remove();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean onClick(int index) {
|
public boolean onClick(int index) {
|
||||||
|
@ -26,8 +26,11 @@
|
|||||||
package com.plotsquared.core.plot.comment;
|
package com.plotsquared.core.plot.comment;
|
||||||
|
|
||||||
import com.google.common.annotations.Beta;
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.inject.TypeLiteral;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.MetaDataKey;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.util.task.RunnableVal;
|
import com.plotsquared.core.util.task.RunnableVal;
|
||||||
@ -77,7 +80,10 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static long getTimestamp(PlotPlayer<?> player, String inbox) {
|
public static long getTimestamp(PlotPlayer<?> player, String inbox) {
|
||||||
return player.getMeta("inbox:" + inbox, player.getLastPlayed());
|
final MetaDataKey<Long> inboxKey = MetaDataKey.of(String.format("inbox:%s", inbox), new TypeLiteral<Long>() {});
|
||||||
|
try (final MetaDataAccess<Long> inboxAccess = player.accessTemporaryMetaData(inboxKey)) {
|
||||||
|
return inboxAccess.get().orElse(player.getLastPlayed());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void addInbox(CommentInbox inbox) {
|
public static void addInbox(CommentInbox inbox) {
|
||||||
|
@ -31,7 +31,9 @@ import com.plotsquared.core.database.DBFunc;
|
|||||||
import com.plotsquared.core.events.PlotFlagAddEvent;
|
import com.plotsquared.core.events.PlotFlagAddEvent;
|
||||||
import com.plotsquared.core.events.PlotUnlinkEvent;
|
import com.plotsquared.core.events.PlotUnlinkEvent;
|
||||||
import com.plotsquared.core.events.Result;
|
import com.plotsquared.core.events.Result;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
import com.plotsquared.core.player.OfflinePlotPlayer;
|
import com.plotsquared.core.player.OfflinePlotPlayer;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -137,44 +139,42 @@ public class ExpireManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void confirmExpiry(final PlotPlayer pp) {
|
public void confirmExpiry(final PlotPlayer<?> pp) {
|
||||||
if (pp.getMeta("ignoreExpireTask") != null) {
|
try (final MetaDataAccess<Boolean> metaDataAccess = pp.accessTemporaryMetaData(
|
||||||
return;
|
PlayerMetaDataKeys.TEMPORARY_IGNORE_EXPIRE_TASK)) {
|
||||||
}
|
if (metaDataAccess.has()) {
|
||||||
if (plotsToDelete != null && !plotsToDelete.isEmpty() && pp
|
return;
|
||||||
.hasPermission("plots.admin.command.autoclear")) {
|
}
|
||||||
final int num = plotsToDelete.size();
|
if (plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) {
|
||||||
while (!plotsToDelete.isEmpty()) {
|
final int num = plotsToDelete.size();
|
||||||
Iterator<Plot> iter = plotsToDelete.iterator();
|
while (!plotsToDelete.isEmpty()) {
|
||||||
final Plot current = iter.next();
|
Iterator<Plot> iter = plotsToDelete.iterator();
|
||||||
if (!isExpired(new ArrayDeque<>(tasks), current).isEmpty()) {
|
final Plot current = iter.next();
|
||||||
TaskManager.runTask(() -> {
|
if (!isExpired(new ArrayDeque<>(tasks), current).isEmpty()) {
|
||||||
pp.setMeta("ignoreExpireTask", true);
|
TaskManager.runTask(() -> {
|
||||||
current.getCenter(pp::teleport);
|
metaDataAccess.set(true);
|
||||||
pp.deleteMeta("ignoreExpireTask");
|
current.getCenter(pp::teleport);
|
||||||
PlotMessage msg = new PlotMessage()
|
metaDataAccess.remove();
|
||||||
.text(num + " " + (num > 1 ? "plots are" : "plot is") + " expired: ")
|
PlotMessage msg = new PlotMessage().text(
|
||||||
.color("$1").text(current.toString()).color("$2")
|
num + " " + (num > 1 ? "plots are" : "plot is") + " expired: ").color("$1").text(current.toString()).color("$2")
|
||||||
.command("/plot list expired").tooltip("/plot list expired")
|
.command("/plot list expired").tooltip("/plot list expired")
|
||||||
//.text("\n - ").color("$3").text("Delete all (/plot delete expired)").color("$2").command("/plot delete expired")
|
//.text("\n - ").color("$3").text("Delete all (/plot delete expired)").color("$2").command("/plot delete expired")
|
||||||
.text("\n - ").color("$3").text("Delete this (/plot delete)")
|
.text("\n - ").color("$3").text("Delete this (/plot delete)").color("$2").command("/plot delete").tooltip("/plot delete")
|
||||||
.color("$2").command("/plot delete").tooltip("/plot delete")
|
.text("\n - ").color("$3").text("Remind later (/plot flag set keep 1d)").color("$2")
|
||||||
.text("\n - ").color("$3").text("Remind later (/plot flag set keep 1d)")
|
.command("/plot flag set keep 1d").tooltip("/plot flag set keep 1d")
|
||||||
.color("$2").command("/plot flag set keep 1d").tooltip("/plot flag set keep 1d")
|
.text("\n - ").color("$3").text("Keep this (/plot flag set keep true)").color("$2")
|
||||||
.text("\n - ").color("$3").text("Keep this (/plot flag set keep true)")
|
.command("/plot flag set keep true").tooltip("/plot flag set keep true").text("\n - ").color("$3")
|
||||||
.color("$2").command("/plot flag set keep true")
|
.text("Don't show me this").color("$2").command("/plot toggle clear-confirmation")
|
||||||
.tooltip("/plot flag set keep true").text("\n - ").color("$3")
|
.tooltip("/plot toggle clear-confirmation");
|
||||||
.text("Don't show me this").color("$2")
|
msg.send(pp);
|
||||||
.command("/plot toggle clear-confirmation")
|
});
|
||||||
.tooltip("/plot toggle clear-confirmation");
|
return;
|
||||||
msg.send(pp);
|
} else {
|
||||||
});
|
iter.remove();
|
||||||
return;
|
}
|
||||||
} else {
|
}
|
||||||
iter.remove();
|
plotsToDelete.clear();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
plotsToDelete.clear();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,8 @@ import com.plotsquared.core.configuration.Caption;
|
|||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.events.TeleportCause;
|
import com.plotsquared.core.events.TeleportCause;
|
||||||
import com.plotsquared.core.generator.GeneratorWrapper;
|
import com.plotsquared.core.generator.GeneratorWrapper;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
import com.plotsquared.core.plot.PlotAreaTerrainType;
|
import com.plotsquared.core.plot.PlotAreaTerrainType;
|
||||||
@ -221,7 +223,10 @@ public enum CommonSetupSteps implements SetupStep {
|
|||||||
MainUtil.sendMessage(plotPlayer, Captions.SETUP_WORLD_APPLY_PLOTSQUARED);
|
MainUtil.sendMessage(plotPlayer, Captions.SETUP_WORLD_APPLY_PLOTSQUARED);
|
||||||
}
|
}
|
||||||
builder.worldName(argument);
|
builder.worldName(argument);
|
||||||
plotPlayer.deleteMeta("setup");
|
try (final MetaDataAccess<SetupProcess> setupAccess = plotPlayer.accessTemporaryMetaData(
|
||||||
|
PlayerMetaDataKeys.TEMPORARY_SETUP)) {
|
||||||
|
setupAccess.remove();
|
||||||
|
}
|
||||||
String world;
|
String world;
|
||||||
if (builder.setupManager() == null) {
|
if (builder.setupManager() == null) {
|
||||||
world = PlotSquared.platform().getInjector().getInstance(SetupUtils.class).setupWorld(builder);
|
world = PlotSquared.platform().getInjector().getInstance(SetupUtils.class).setupWorld(builder);
|
||||||
|
@ -28,9 +28,12 @@ package com.plotsquared.core.util;
|
|||||||
import com.plotsquared.core.command.CommandCaller;
|
import com.plotsquared.core.command.CommandCaller;
|
||||||
import com.plotsquared.core.configuration.Captions;
|
import com.plotsquared.core.configuration.Captions;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Permissions class handles checking user permissions.<br>
|
* The Permissions class handles checking user permissions.<br>
|
||||||
@ -65,19 +68,21 @@ public class Permissions {
|
|||||||
if (!Settings.Enabled_Components.PERMISSION_CACHE) {
|
if (!Settings.Enabled_Components.PERMISSION_CACHE) {
|
||||||
return hasPermission((CommandCaller) player, permission);
|
return hasPermission((CommandCaller) player, permission);
|
||||||
}
|
}
|
||||||
HashMap<String, Boolean> map = player.getMeta("perm");
|
try (final MetaDataAccess<Map<String, Boolean>> mapAccess =
|
||||||
if (map != null) {
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_PERMISSIONS)) {
|
||||||
Boolean result = map.get(permission);
|
Map<String, Boolean> map = mapAccess.get().orElse(null);
|
||||||
if (result != null) {
|
if (map != null) {
|
||||||
return result;
|
final Boolean result = map.get(permission);
|
||||||
|
if (result != null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mapAccess.set((map = new HashMap<>()));
|
||||||
}
|
}
|
||||||
} else {
|
boolean result = hasPermission((CommandCaller) player, permission);
|
||||||
map = new HashMap<>();
|
map.put(permission, result);
|
||||||
player.setMeta("perm", map);
|
return result;
|
||||||
}
|
}
|
||||||
boolean result = hasPermission((CommandCaller) player, permission);
|
|
||||||
map.put(permission, result);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,6 +28,8 @@ package com.plotsquared.core.util;
|
|||||||
import com.plotsquared.core.PlotSquared;
|
import com.plotsquared.core.PlotSquared;
|
||||||
import com.plotsquared.core.configuration.Settings;
|
import com.plotsquared.core.configuration.Settings;
|
||||||
import com.plotsquared.core.location.Location;
|
import com.plotsquared.core.location.Location;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -100,19 +102,22 @@ public class WEManager {
|
|||||||
}
|
}
|
||||||
boolean allowMember = player.hasPermission("plots.worldedit.member");
|
boolean allowMember = player.hasPermission("plots.worldedit.member");
|
||||||
Plot plot = player.getCurrentPlot();
|
Plot plot = player.getCurrentPlot();
|
||||||
if (plot == null) {
|
try (final MetaDataAccess<Plot> metaDataAccess =
|
||||||
plot = player.getMeta("WorldEditRegionPlot");
|
player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_WORLD_EDIT_REGION_PLOT)) {
|
||||||
}
|
if (plot == null) {
|
||||||
if (plot != null && (!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot)) && (
|
plot = metaDataAccess.get().orElse(null);
|
||||||
(allowMember && plot.isAdded(uuid)) || (!allowMember && (plot.isOwner(uuid)) || plot
|
}
|
||||||
.getTrusted().contains(uuid))) && !plot.getFlag(NoWorldeditFlag.class)) {
|
if (plot != null && (!Settings.Done.RESTRICT_BUILDING || !DoneFlag.isDone(plot)) && (
|
||||||
for (CuboidRegion region : plot.getRegions()) {
|
(allowMember && plot.isAdded(uuid)) || (!allowMember && (plot.isOwner(uuid)) || plot
|
||||||
BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight());
|
.getTrusted().contains(uuid))) && !plot.getFlag(NoWorldeditFlag.class)) {
|
||||||
BlockVector3 pos2 = region.getMaximumPoint().withY(area.getMaxBuildHeight());
|
for (CuboidRegion region : plot.getRegions()) {
|
||||||
CuboidRegion copy = new CuboidRegion(pos1, pos2);
|
BlockVector3 pos1 = region.getMinimumPoint().withY(area.getMinBuildHeight());
|
||||||
regions.add(copy);
|
BlockVector3 pos2 = region.getMaximumPoint().withY(area.getMaxBuildHeight());
|
||||||
|
CuboidRegion copy = new CuboidRegion(pos1, pos2);
|
||||||
|
regions.add(copy);
|
||||||
|
}
|
||||||
|
metaDataAccess.set(plot);
|
||||||
}
|
}
|
||||||
player.setMeta("WorldEditRegionPlot", plot);
|
|
||||||
}
|
}
|
||||||
return regions;
|
return regions;
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,8 @@ import com.plotsquared.core.configuration.Captions;
|
|||||||
import com.plotsquared.core.events.PlotMergeEvent;
|
import com.plotsquared.core.events.PlotMergeEvent;
|
||||||
import com.plotsquared.core.events.Result;
|
import com.plotsquared.core.events.Result;
|
||||||
import com.plotsquared.core.location.Direction;
|
import com.plotsquared.core.location.Direction;
|
||||||
|
import com.plotsquared.core.player.MetaDataAccess;
|
||||||
|
import com.plotsquared.core.player.PlayerMetaDataKeys;
|
||||||
import com.plotsquared.core.player.PlotPlayer;
|
import com.plotsquared.core.player.PlotPlayer;
|
||||||
import com.plotsquared.core.plot.Plot;
|
import com.plotsquared.core.plot.Plot;
|
||||||
import com.plotsquared.core.plot.PlotArea;
|
import com.plotsquared.core.plot.PlotArea;
|
||||||
@ -50,7 +52,10 @@ public final class AutoClaimFinishTask implements Callable<Boolean> {
|
|||||||
private final EventDispatcher eventDispatcher;
|
private final EventDispatcher eventDispatcher;
|
||||||
|
|
||||||
@Override public Boolean call() {
|
@Override public Boolean call() {
|
||||||
player.deleteMeta(Auto.class.getName());
|
try (final MetaDataAccess<Boolean> autoAccess
|
||||||
|
= player.accessTemporaryMetaData(PlayerMetaDataKeys.TEMPORARY_AUTO)) {
|
||||||
|
autoAccess.remove();
|
||||||
|
}
|
||||||
if (plot == null) {
|
if (plot == null) {
|
||||||
sendMessage(player, Captions.NO_FREE_PLOTS);
|
sendMessage(player, Captions.NO_FREE_PLOTS);
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
Reference in New Issue
Block a user