mirror of
https://github.com/IntellectualSites/PlotSquared.git
synced 2024-11-22 13:16:45 +01:00
Changes
Plot auto clear confirmation Add timediff to keep flag Add expired parameter to list cmd Fixes some compatibility issues
This commit is contained in:
parent
106c3c5cb4
commit
8bf3ceac6f
@ -369,11 +369,11 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
|
|||||||
if (PS.get().checkVersion(getServerVersion(), 1, 8, 0)) {
|
if (PS.get().checkVersion(getServerVersion(), 1, 8, 0)) {
|
||||||
try {
|
try {
|
||||||
return new FastQueue_1_8_3();
|
return new FastQueue_1_8_3();
|
||||||
} catch (NoSuchMethodException | RuntimeException e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
try {
|
try {
|
||||||
return new FastQueue_1_8();
|
return new FastQueue_1_8();
|
||||||
} catch (NoSuchMethodException e2) {
|
} catch (Throwable e2) {
|
||||||
e2.printStackTrace();
|
e2.printStackTrace();
|
||||||
return new SlowQueue();
|
return new SlowQueue();
|
||||||
}
|
}
|
||||||
@ -381,7 +381,8 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
return new FastQueue_1_7();
|
return new FastQueue_1_7();
|
||||||
} catch (NoSuchMethodException e) {
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
return new SlowQueue();
|
return new SlowQueue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -343,14 +343,11 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen
|
|||||||
|
|
||||||
Location loc = pp.getLocation();
|
Location loc = pp.getLocation();
|
||||||
PlotArea area = loc.getPlotArea();
|
PlotArea area = loc.getPlotArea();
|
||||||
final Plot plot;
|
|
||||||
if (area != null) {
|
if (area != null) {
|
||||||
plot = area.getPlot(loc);
|
Plot plot = area.getPlot(loc);
|
||||||
if (plot != null) {
|
if (plot != null) {
|
||||||
plotEntry(pp, plot);
|
plotEntry(pp, plot);
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
plot = null;
|
|
||||||
}
|
}
|
||||||
// Delayed
|
// Delayed
|
||||||
|
|
||||||
@ -361,24 +358,7 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen
|
|||||||
if (!player.hasPlayedBefore() && player.isOnline()) {
|
if (!player.hasPlayedBefore() && player.isOnline()) {
|
||||||
player.saveData();
|
player.saveData();
|
||||||
}
|
}
|
||||||
ExpireManager.dates.put(uuid, System.currentTimeMillis());
|
EventUtil.manager.doJoinTask(pp);
|
||||||
if (BukkitMain.worldEdit != null) {
|
|
||||||
if (pp.getAttribute("worldedit")) {
|
|
||||||
MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASSED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (PS.get().update != null && Permissions.hasPermission(pp, C.PERMISSION_ADMIN_UPDATE) && Settings.UPDATE_NOTIFICATIONS) {
|
|
||||||
MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update");
|
|
||||||
}
|
|
||||||
if (Settings.TELEPORT_ON_LOGIN && plot != null) {
|
|
||||||
TaskManager.runTask(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
plot.teleportPlayer(pp);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
MainUtil.sendMessage(pp, C.TELEPORTED_TO_ROAD);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}, 20);
|
}, 20);
|
||||||
}
|
}
|
||||||
|
@ -668,11 +668,8 @@ public class BukkitChunkManager extends ChunkManager {
|
|||||||
if (!pLoc.getChunkLoc().equals(loc)) {
|
if (!pLoc.getChunkLoc().equals(loc)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
PlotBlock plotblock = WorldUtil.IMP.getBlock(pLoc);
|
pLoc.setY(WorldUtil.IMP.getHighestBlock(world, pLoc.getX(), pLoc.getZ()));
|
||||||
if (plotblock.id != 0) {
|
pp.teleport(pLoc);
|
||||||
Plot plot = pp.getCurrentPlot();
|
|
||||||
pp.teleport(plot.getDefaultHome());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -996,20 +993,7 @@ public class BukkitChunkManager extends ChunkManager {
|
|||||||
final int tx = pos2.getX();
|
final int tx = pos2.getX();
|
||||||
final int tz = pos2.getZ();
|
final int tz = pos2.getZ();
|
||||||
for (final Entity entity : entities) {
|
for (final Entity entity : entities) {
|
||||||
if (entity instanceof Player) {
|
if (!(entity instanceof Player)) {
|
||||||
final org.bukkit.Location loc = entity.getLocation();
|
|
||||||
if (loc.getX() >= bx && loc.getX() <= tx && loc.getZ() >= bz && loc.getZ() <= tz) {
|
|
||||||
final Player player = (Player) entity;
|
|
||||||
final PlotPlayer pp = BukkitUtil.getPlayer(player);
|
|
||||||
final Plot plot = pp.getCurrentPlot();
|
|
||||||
if (plot != null) {
|
|
||||||
final Location plotHome = plot.getDefaultHome();
|
|
||||||
if (pp.getLocation().getY() <= plotHome.getY()) {
|
|
||||||
pp.teleport(plotHome);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
final org.bukkit.Location loc = entity.getLocation();
|
final org.bukkit.Location loc = entity.getLocation();
|
||||||
if (loc.getX() >= bx && loc.getX() <= tx && loc.getZ() >= bz && loc.getZ() <= tz) {
|
if (loc.getX() >= bx && loc.getX() <= tx && loc.getZ() >= bz && loc.getZ() <= tz) {
|
||||||
entity.remove();
|
entity.remove();
|
||||||
|
@ -5,17 +5,9 @@ import com.intellectualcrafters.plot.object.PlotBlock;
|
|||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||||
import com.intellectualcrafters.plot.object.RegionWrapper;
|
import com.intellectualcrafters.plot.object.RegionWrapper;
|
||||||
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
import com.intellectualcrafters.plot.object.schematic.PlotItem;
|
||||||
import com.intellectualcrafters.plot.util.MathMan;
|
import com.intellectualcrafters.plot.util.*;
|
||||||
import com.intellectualcrafters.plot.util.StringComparison;
|
|
||||||
import com.intellectualcrafters.plot.util.StringMan;
|
|
||||||
import com.intellectualcrafters.plot.util.TaskManager;
|
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
|
||||||
import com.intellectualcrafters.plot.util.WorldUtil;
|
|
||||||
import com.plotsquared.bukkit.object.BukkitPlayer;
|
import com.plotsquared.bukkit.object.BukkitPlayer;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.*;
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.bukkit.World;
|
|
||||||
import org.bukkit.block.Biome;
|
import org.bukkit.block.Biome;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
@ -25,12 +17,7 @@ import org.bukkit.entity.Player;
|
|||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.InventoryHolder;
|
import org.bukkit.inventory.InventoryHolder;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.material.MaterialData;
|
import org.bukkit.material.*;
|
||||||
import org.bukkit.material.Sandstone;
|
|
||||||
import org.bukkit.material.Step;
|
|
||||||
import org.bukkit.material.Tree;
|
|
||||||
import org.bukkit.material.WoodenStep;
|
|
||||||
import org.bukkit.material.Wool;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -6,9 +6,9 @@ import com.google.common.collect.HashBiMap;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.MapMaker;
|
import com.google.common.collect.MapMaker;
|
||||||
import com.google.common.io.ByteSink;
|
import com.google.common.io.ByteSink;
|
||||||
import com.google.common.io.ByteSource;
|
|
||||||
import com.google.common.io.Closeables;
|
import com.google.common.io.Closeables;
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
|
import com.google.common.io.InputSupplier;
|
||||||
import com.google.common.primitives.Primitives;
|
import com.google.common.primitives.Primitives;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@ -147,21 +147,20 @@ public class NbtFactory {
|
|||||||
* @return The decoded NBT compound.
|
* @return The decoded NBT compound.
|
||||||
* @throws IOException If anything went wrong.
|
* @throws IOException If anything went wrong.
|
||||||
*/
|
*/
|
||||||
public static NbtCompound fromStream(final ByteSource stream, final StreamOptions option) throws IOException {
|
public static NbtCompound fromStream(final InputSupplier<? extends InputStream> stream, final StreamOptions option) throws IOException {
|
||||||
InputStream input = null;
|
InputStream input = null;
|
||||||
DataInputStream data = null;
|
DataInputStream data = null;
|
||||||
boolean suppress = true;
|
boolean suppress = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
input = stream.openStream();
|
input = stream.getInput();
|
||||||
data = new DataInputStream(new BufferedInputStream(option == StreamOptions.GZIP_COMPRESSION ? new GZIPInputStream(input) : input));
|
data = new DataInputStream(new BufferedInputStream(option == StreamOptions.GZIP_COMPRESSION ? new GZIPInputStream(input) : input));
|
||||||
|
|
||||||
final NbtCompound result = fromCompound(get().LOAD_COMPOUND.loadNbt(data));
|
final NbtCompound result = fromCompound(get().LOAD_COMPOUND.loadNbt(data));
|
||||||
suppress = false;
|
suppress = false;
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
} finally {
|
||||||
finally {
|
|
||||||
if (data != null) {
|
if (data != null) {
|
||||||
Closeables.close(data, suppress);
|
Closeables.close(data, suppress);
|
||||||
} else if (input != null) {
|
} else if (input != null) {
|
||||||
|
@ -34,7 +34,7 @@ public class SlowChunk extends PlotChunk<Chunk> {
|
|||||||
if (result[y >> 4] == null) {
|
if (result[y >> 4] == null) {
|
||||||
result[y >> 4] = new PlotBlock[4096];
|
result[y >> 4] = new PlotBlock[4096];
|
||||||
}
|
}
|
||||||
result[MainUtil.CACHE_I[x][y][z]][MainUtil.CACHE_J[x][y][z]] = new PlotBlock((short) id, data);
|
result[MainUtil.CACHE_I[y][x][z]][MainUtil.CACHE_J[y][x][z]] = new PlotBlock((short) id, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,6 +123,9 @@ public class SlowQueue implements PlotQueue<Chunk> {
|
|||||||
final int z = MainUtil.z_loc[i][j];
|
final int z = MainUtil.z_loc[i][j];
|
||||||
Block block = chunk.getBlock(x, y, z);
|
Block block = chunk.getBlock(x, y, z);
|
||||||
PlotBlock newBlock = result2[j];
|
PlotBlock newBlock = result2[j];
|
||||||
|
if (newBlock == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (newBlock.id) {
|
switch (newBlock.id) {
|
||||||
case -1:
|
case -1:
|
||||||
if (block.getData() == newBlock.data) {
|
if (block.getData() == newBlock.data) {
|
||||||
|
@ -2,6 +2,7 @@ package com.plotsquared.bukkit.uuid;
|
|||||||
|
|
||||||
import com.google.common.collect.HashBiMap;
|
import com.google.common.collect.HashBiMap;
|
||||||
import com.google.common.io.ByteSource;
|
import com.google.common.io.ByteSource;
|
||||||
|
import com.google.common.io.InputSupplier;
|
||||||
import com.intellectualcrafters.plot.PS;
|
import com.intellectualcrafters.plot.PS;
|
||||||
import com.intellectualcrafters.plot.config.C;
|
import com.intellectualcrafters.plot.config.C;
|
||||||
import com.intellectualcrafters.plot.config.Settings;
|
import com.intellectualcrafters.plot.config.Settings;
|
||||||
@ -9,17 +10,14 @@ import com.intellectualcrafters.plot.database.DBFunc;
|
|||||||
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
|
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
|
||||||
import com.intellectualcrafters.plot.object.RunnableVal;
|
import com.intellectualcrafters.plot.object.RunnableVal;
|
||||||
import com.intellectualcrafters.plot.object.StringWrapper;
|
import com.intellectualcrafters.plot.object.StringWrapper;
|
||||||
import com.intellectualcrafters.plot.util.ExpireManager;
|
import com.intellectualcrafters.plot.util.*;
|
||||||
import com.intellectualcrafters.plot.util.StringMan;
|
|
||||||
import com.intellectualcrafters.plot.util.TaskManager;
|
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandlerImplementation;
|
|
||||||
import com.intellectualcrafters.plot.uuid.UUIDWrapper;
|
import com.intellectualcrafters.plot.uuid.UUIDWrapper;
|
||||||
import com.plotsquared.bukkit.util.NbtFactory;
|
import com.plotsquared.bukkit.util.NbtFactory;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
import java.io.FilenameFilter;
|
import java.io.FilenameFilter;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
@ -102,12 +100,14 @@ public class FileUUIDHandler extends UUIDHandlerImplementation {
|
|||||||
final UUID uuid = UUID.fromString(s);
|
final UUID uuid = UUID.fromString(s);
|
||||||
if (check || all.remove(uuid)) {
|
if (check || all.remove(uuid)) {
|
||||||
final File file = new File(playerdataFolder + File.separator + current);
|
final File file = new File(playerdataFolder + File.separator + current);
|
||||||
final ByteSource is = com.google.common.io.Files.asByteSource(file);
|
final InputSupplier<FileInputStream> is = com.google.common.io.Files.newInputStreamSupplier(file);
|
||||||
final NbtFactory.NbtCompound compound = NbtFactory.fromStream(is, NbtFactory.StreamOptions.GZIP_COMPRESSION);
|
final NbtFactory.NbtCompound compound = NbtFactory.fromStream(is, NbtFactory.StreamOptions.GZIP_COMPRESSION);
|
||||||
final NbtFactory.NbtCompound bukkit = (NbtFactory.NbtCompound) compound.get("bukkit");
|
final NbtFactory.NbtCompound bukkit = (NbtFactory.NbtCompound) compound.get("bukkit");
|
||||||
final String name = (String) bukkit.get("lastKnownName");
|
final String name = (String) bukkit.get("lastKnownName");
|
||||||
final long last = (long) bukkit.get("lastPlayed");
|
final long last = (long) bukkit.get("lastPlayed");
|
||||||
ExpireManager.dates.put(uuid, last);
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.storeDate(uuid, last);
|
||||||
|
}
|
||||||
toAdd.put(new StringWrapper(name), uuid);
|
toAdd.put(new StringWrapper(name), uuid);
|
||||||
}
|
}
|
||||||
} catch (final Exception e) {
|
} catch (final Exception e) {
|
||||||
@ -190,7 +190,9 @@ public class FileUUIDHandler extends UUIDHandlerImplementation {
|
|||||||
uuid = new UUID(most, least);
|
uuid = new UUID(most, least);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ExpireManager.dates.put(uuid, last);
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.storeDate(uuid, last);
|
||||||
|
}
|
||||||
toAdd.put(new StringWrapper(name), uuid);
|
toAdd.put(new StringWrapper(name), uuid);
|
||||||
} catch (final Throwable e) {
|
} catch (final Throwable e) {
|
||||||
PS.debug(C.PREFIX.s() + "&6Invalid playerdata: " + uuid.toString() + ".dat");
|
PS.debug(C.PREFIX.s() + "&6Invalid playerdata: " + uuid.toString() + ".dat");
|
||||||
@ -210,7 +212,9 @@ public class FileUUIDHandler extends UUIDHandlerImplementation {
|
|||||||
final StringWrapper wrap = new StringWrapper(name);
|
final StringWrapper wrap = new StringWrapper(name);
|
||||||
final UUID uuid = uuidWrapper.getUUID(op);
|
final UUID uuid = uuidWrapper.getUUID(op);
|
||||||
toAdd.put(wrap, uuid);
|
toAdd.put(wrap, uuid);
|
||||||
ExpireManager.dates.put(uuid, last);
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.storeDate(uuid, last);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -168,12 +168,15 @@ public class PS {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auto clearing
|
// Auto clearing
|
||||||
if (Settings.AUTO_CLEAR) {
|
if (Settings.AUTO_CLEAR) {
|
||||||
ExpireManager.runTask();
|
ExpireManager.IMP = new ExpireManager();
|
||||||
|
if (Settings.AUTO_CLEAR_CONFIRMATION) {
|
||||||
|
ExpireManager.IMP.runConfirmedTask();
|
||||||
|
} else {
|
||||||
|
ExpireManager.IMP.runAutomatedTask();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// PlotMe
|
// PlotMe
|
||||||
if (Settings.CONVERT_PLOTME || Settings.CACHE_PLOTME) {
|
if (Settings.CONVERT_PLOTME || Settings.CACHE_PLOTME) {
|
||||||
TaskManager.runTaskLater(new Runnable() {
|
TaskManager.runTaskLater(new Runnable() {
|
||||||
@ -1893,7 +1896,7 @@ public class PS {
|
|||||||
*/
|
*/
|
||||||
public void setupDefaultFlags() {
|
public void setupDefaultFlags() {
|
||||||
final List<String> booleanFlags = Arrays.asList("notify-enter", "notify-leave", "item-drop", "invincible", "instabreak", "drop-protection", "forcefield", "titles", "pve", "pvp",
|
final List<String> booleanFlags = Arrays.asList("notify-enter", "notify-leave", "item-drop", "invincible", "instabreak", "drop-protection", "forcefield", "titles", "pve", "pvp",
|
||||||
"no-worldedit", "redstone", "keep");
|
"no-worldedit", "redstone");
|
||||||
final List<String> intervalFlags = Arrays.asList("feed", "heal");
|
final List<String> intervalFlags = Arrays.asList("feed", "heal");
|
||||||
final List<String> stringFlags = Arrays.asList("greeting", "farewell");
|
final List<String> stringFlags = Arrays.asList("greeting", "farewell");
|
||||||
final List<String> intFlags = Arrays.asList("misc-cap", "entity-cap", "mob-cap", "animal-cap", "hostile-cap", "vehicle-cap", "music");
|
final List<String> intFlags = Arrays.asList("misc-cap", "entity-cap", "mob-cap", "animal-cap", "hostile-cap", "vehicle-cap", "music");
|
||||||
@ -1937,6 +1940,26 @@ public class PS {
|
|||||||
FlagManager.addFlag(new AbstractFlag("use", new FlagValue.PlotBlockListValue()));
|
FlagManager.addFlag(new AbstractFlag("use", new FlagValue.PlotBlockListValue()));
|
||||||
FlagManager.addFlag(new AbstractFlag("blocked-cmds", new FlagValue.StringListValue()));
|
FlagManager.addFlag(new AbstractFlag("blocked-cmds", new FlagValue.StringListValue()));
|
||||||
FlagManager.addFlag(new AbstractFlag("ice-melt", new FlagValue.BooleanValue()));
|
FlagManager.addFlag(new AbstractFlag("ice-melt", new FlagValue.BooleanValue()));
|
||||||
|
FlagManager.addFlag(new AbstractFlag("keep") {
|
||||||
|
@Override
|
||||||
|
public Object parseValueRaw(final String value) {
|
||||||
|
if (MathMan.isInteger(value)) {
|
||||||
|
return Long.parseLong(value);
|
||||||
|
}
|
||||||
|
switch (value.toLowerCase()) {
|
||||||
|
case "true":
|
||||||
|
return true;
|
||||||
|
case "false":
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return (MainUtil.timeToSec(value) * 1000) + System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getValueDesc() {
|
||||||
|
return "Flag value must a timestamp or a boolean";
|
||||||
|
}
|
||||||
|
});
|
||||||
FlagManager.addFlag(new AbstractFlag("gamemode") {
|
FlagManager.addFlag(new AbstractFlag("gamemode") {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -20,23 +20,6 @@
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
package com.intellectualcrafters.plot.commands;
|
package com.intellectualcrafters.plot.commands;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.sql.Timestamp;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
import javax.script.Bindings;
|
|
||||||
import javax.script.ScriptContext;
|
|
||||||
import javax.script.ScriptEngine;
|
|
||||||
import javax.script.ScriptEngineManager;
|
|
||||||
import javax.script.ScriptException;
|
|
||||||
import javax.script.SimpleScriptContext;
|
|
||||||
|
|
||||||
import com.google.common.io.Files;
|
import com.google.common.io.Files;
|
||||||
import com.intellectualcrafters.plot.PS;
|
import com.intellectualcrafters.plot.PS;
|
||||||
import com.intellectualcrafters.plot.config.C;
|
import com.intellectualcrafters.plot.config.C;
|
||||||
@ -44,32 +27,18 @@ import com.intellectualcrafters.plot.config.Settings;
|
|||||||
import com.intellectualcrafters.plot.database.DBFunc;
|
import com.intellectualcrafters.plot.database.DBFunc;
|
||||||
import com.intellectualcrafters.plot.flag.FlagManager;
|
import com.intellectualcrafters.plot.flag.FlagManager;
|
||||||
import com.intellectualcrafters.plot.generator.HybridUtils;
|
import com.intellectualcrafters.plot.generator.HybridUtils;
|
||||||
import com.intellectualcrafters.plot.object.ConsolePlayer;
|
import com.intellectualcrafters.plot.object.*;
|
||||||
import com.intellectualcrafters.plot.object.Location;
|
import com.intellectualcrafters.plot.util.*;
|
||||||
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
|
|
||||||
import com.intellectualcrafters.plot.object.Plot;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotAnalysis;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotArea;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotBlock;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotId;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
|
||||||
import com.intellectualcrafters.plot.object.RunnableVal;
|
|
||||||
import com.intellectualcrafters.plot.util.AbstractTitle;
|
|
||||||
import com.intellectualcrafters.plot.util.ChunkManager;
|
|
||||||
import com.intellectualcrafters.plot.util.EconHandler;
|
|
||||||
import com.intellectualcrafters.plot.util.EventUtil;
|
|
||||||
import com.intellectualcrafters.plot.util.ExpireManager;
|
|
||||||
import com.intellectualcrafters.plot.util.MainUtil;
|
|
||||||
import com.intellectualcrafters.plot.util.MathMan;
|
|
||||||
import com.intellectualcrafters.plot.util.SchematicHandler;
|
|
||||||
import com.intellectualcrafters.plot.util.SetupUtils;
|
|
||||||
import com.intellectualcrafters.plot.util.StringMan;
|
|
||||||
import com.intellectualcrafters.plot.util.TaskManager;
|
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
|
||||||
import com.intellectualcrafters.plot.util.WorldUtil;
|
|
||||||
import com.plotsquared.general.commands.Command;
|
import com.plotsquared.general.commands.Command;
|
||||||
import com.plotsquared.general.commands.CommandDeclaration;
|
import com.plotsquared.general.commands.CommandDeclaration;
|
||||||
|
|
||||||
|
import javax.script.*;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.sql.Timestamp;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
@CommandDeclaration(command = "debugexec", permission = "plots.admin", description = "Mutli-purpose debug command", aliases = "exec",
|
@CommandDeclaration(command = "debugexec", permission = "plots.admin", description = "Mutli-purpose debug command", aliases = "exec",
|
||||||
category = CommandCategory.DEBUG)
|
category = CommandCategory.DEBUG)
|
||||||
public class DebugExec extends SubCommand {
|
public class DebugExec extends SubCommand {
|
||||||
@ -204,12 +173,9 @@ public class DebugExec extends SubCommand {
|
|||||||
}, threshold);
|
}, threshold);
|
||||||
return true;
|
return true;
|
||||||
case "stop-expire":
|
case "stop-expire":
|
||||||
if (ExpireManager.task != -1) {
|
if (ExpireManager.IMP == null || !ExpireManager.IMP.cancelTask()) {
|
||||||
PS.get().TASK.cancelTask(ExpireManager.task);
|
|
||||||
} else {
|
|
||||||
return MainUtil.sendMessage(player, "Task already halted");
|
return MainUtil.sendMessage(player, "Task already halted");
|
||||||
}
|
}
|
||||||
ExpireManager.task = -1;
|
|
||||||
return MainUtil.sendMessage(player, "Cancelled task.");
|
return MainUtil.sendMessage(player, "Cancelled task.");
|
||||||
case "remove-flag":
|
case "remove-flag":
|
||||||
if (args.length != 2) {
|
if (args.length != 2) {
|
||||||
@ -254,41 +220,20 @@ public class DebugExec extends SubCommand {
|
|||||||
MainUtil.sendMessage(player, "&cCancelling task... (please wait)");
|
MainUtil.sendMessage(player, "&cCancelling task... (please wait)");
|
||||||
return true;
|
return true;
|
||||||
case "start-expire":
|
case "start-expire":
|
||||||
if (ExpireManager.task == -1) {
|
if (ExpireManager.IMP == null) {
|
||||||
ExpireManager.runTask();
|
ExpireManager.IMP = new ExpireManager();
|
||||||
|
}
|
||||||
|
boolean result;
|
||||||
|
if (Settings.AUTO_CLEAR_CONFIRMATION) {
|
||||||
|
result = ExpireManager.IMP.runConfirmedTask();
|
||||||
|
} else {
|
||||||
|
result = ExpireManager.IMP.runAutomatedTask();
|
||||||
|
}
|
||||||
|
if (result) {
|
||||||
|
return MainUtil.sendMessage(player, "Started plot expiry task");
|
||||||
} else {
|
} else {
|
||||||
return MainUtil.sendMessage(player, "Plot expiry task already started");
|
return MainUtil.sendMessage(player, "Plot expiry task already started");
|
||||||
}
|
}
|
||||||
return MainUtil.sendMessage(player, "Started plot expiry task");
|
|
||||||
case "update-expired":
|
|
||||||
if (args.length > 1) {
|
|
||||||
PlotArea area = PS.get().getPlotAreaByString(args[1]);
|
|
||||||
if (area == null || !WorldUtil.IMP.isWorld(area.worldname)) {
|
|
||||||
C.NOT_VALID_PLOT_WORLD.send(player, args[1]);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
MainUtil.sendMessage(player, "Updating expired plot list");
|
|
||||||
ExpireManager.updateExpired(area);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return MainUtil.sendMessage(player, "Use /plot debugexec update-expired <world>");
|
|
||||||
case "show-expired":
|
|
||||||
if (args.length > 1) {
|
|
||||||
final String world = args[1];
|
|
||||||
if (!WorldUtil.IMP.isWorld(world)) {
|
|
||||||
return MainUtil.sendMessage(player, "Invalid world: " + args[1]);
|
|
||||||
}
|
|
||||||
if (!ExpireManager.expiredPlots.containsKey(args[1])) {
|
|
||||||
return MainUtil.sendMessage(player, "No task for world: " + args[1]);
|
|
||||||
}
|
|
||||||
MainUtil.sendMessage(player, "Expired plots (" + ExpireManager.expiredPlots.get(args[1]).size() + "):");
|
|
||||||
for (final Plot plot : ExpireManager.expiredPlots.get(args[1])) {
|
|
||||||
MainUtil.sendMessage(player,
|
|
||||||
" - " + plot.getArea() + ";" + plot.getId().x + ";" + plot.getId().y + ";" + UUIDHandler.getName(plot.owner) + " : " + ExpireManager.dates.get(plot.owner));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return MainUtil.sendMessage(player, "Use /plot debugexec show-expired <world>");
|
|
||||||
case "seen":
|
case "seen":
|
||||||
if (args.length != 2) {
|
if (args.length != 2) {
|
||||||
return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>");
|
return MainUtil.sendMessage(player, "Use /plot debugexec seen <player>");
|
||||||
|
@ -31,13 +31,7 @@ import com.intellectualcrafters.plot.object.PlotMessage;
|
|||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||||
import com.intellectualcrafters.plot.object.Rating;
|
import com.intellectualcrafters.plot.object.Rating;
|
||||||
import com.intellectualcrafters.plot.object.RunnableVal3;
|
import com.intellectualcrafters.plot.object.RunnableVal3;
|
||||||
import com.intellectualcrafters.plot.util.EconHandler;
|
import com.intellectualcrafters.plot.util.*;
|
||||||
import com.intellectualcrafters.plot.util.MainUtil;
|
|
||||||
import com.intellectualcrafters.plot.util.MathMan;
|
|
||||||
import com.intellectualcrafters.plot.util.Permissions;
|
|
||||||
import com.intellectualcrafters.plot.util.StringComparison;
|
|
||||||
import com.intellectualcrafters.plot.util.StringMan;
|
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
|
||||||
import com.plotsquared.general.commands.CommandDeclaration;
|
import com.plotsquared.general.commands.CommandDeclaration;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -93,6 +87,9 @@ public class list extends SubCommand {
|
|||||||
if (Permissions.hasPermission(player, "plots.list.done")) {
|
if (Permissions.hasPermission(player, "plots.list.done")) {
|
||||||
args.add("done");
|
args.add("done");
|
||||||
}
|
}
|
||||||
|
if (Permissions.hasPermission(player, "plots.list.expired")) {
|
||||||
|
args.add("expired");
|
||||||
|
}
|
||||||
if (Permissions.hasPermission(player, "plots.list.fuzzy")) {
|
if (Permissions.hasPermission(player, "plots.list.fuzzy")) {
|
||||||
args.add("fuzzy <search...>");
|
args.add("fuzzy <search...>");
|
||||||
}
|
}
|
||||||
@ -163,6 +160,14 @@ public class list extends SubCommand {
|
|||||||
plots = new ArrayList<>(PS.get().getPlots(world));
|
plots = new ArrayList<>(PS.get().getPlots(world));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case "expired": {
|
||||||
|
if (!Permissions.hasPermission(plr, "plots.list.expired")) {
|
||||||
|
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.list.expired");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
plots = ExpireManager.IMP == null ? new ArrayList<Plot>() : new ArrayList<>(ExpireManager.IMP.getPendingExpired());
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "area": {
|
case "area": {
|
||||||
if (!Permissions.hasPermission(plr, "plots.list.area")) {
|
if (!Permissions.hasPermission(plr, "plots.list.area")) {
|
||||||
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.list.area");
|
MainUtil.sendMessage(plr, C.NO_PERMISSION, "plots.list.area");
|
||||||
|
@ -163,7 +163,7 @@ public class Settings {
|
|||||||
* Auto clear enabled
|
* Auto clear enabled
|
||||||
*/
|
*/
|
||||||
public static boolean AUTO_CLEAR = false;
|
public static boolean AUTO_CLEAR = false;
|
||||||
public static boolean AUTO_CLEAR_CONFIRMATION = true; // TODO FIXME
|
public static boolean AUTO_CLEAR_CONFIRMATION = false;
|
||||||
/**
|
/**
|
||||||
* Days until a plot gets cleared
|
* Days until a plot gets cleared
|
||||||
*/
|
*/
|
||||||
|
@ -32,8 +32,6 @@ import java.util.*;
|
|||||||
/**
|
/**
|
||||||
* Flag Manager Utility
|
* Flag Manager Utility
|
||||||
*
|
*
|
||||||
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
public class FlagManager {
|
public class FlagManager {
|
||||||
|
|
||||||
|
@ -44,6 +44,11 @@ public abstract class HybridUtils {
|
|||||||
public abstract void analyzeRegion(final String world, final RegionWrapper region, final RunnableVal<PlotAnalysis> whenDone);
|
public abstract void analyzeRegion(final String world, final RegionWrapper region, final RunnableVal<PlotAnalysis> whenDone);
|
||||||
|
|
||||||
public void analyzePlot(final Plot origin, final RunnableVal<PlotAnalysis> whenDone) {
|
public void analyzePlot(final Plot origin, final RunnableVal<PlotAnalysis> whenDone) {
|
||||||
|
PlotAnalysis existing = origin.getComplexity();
|
||||||
|
if (existing != null) {
|
||||||
|
whenDone.run(existing);
|
||||||
|
return;
|
||||||
|
}
|
||||||
final ArrayDeque<RegionWrapper> zones = new ArrayDeque<>(origin.getRegions());
|
final ArrayDeque<RegionWrapper> zones = new ArrayDeque<>(origin.getRegions());
|
||||||
final ArrayList<PlotAnalysis> analysis = new ArrayList<>();
|
final ArrayList<PlotAnalysis> analysis = new ArrayList<>();
|
||||||
Runnable run = new Runnable() {
|
Runnable run = new Runnable() {
|
||||||
|
@ -1048,6 +1048,9 @@ public class Plot {
|
|||||||
DBFunc.delete(current);
|
DBFunc.delete(current);
|
||||||
current.owner = null;
|
current.owner = null;
|
||||||
current.settings = null;
|
current.settings = null;
|
||||||
|
for (PlotPlayer pp : current.getPlayersInPlot()) {
|
||||||
|
PlotListener.plotEntry(pp, current);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1066,7 +1069,7 @@ public class Plot {
|
|||||||
final Location top = corners[0];
|
final Location top = corners[0];
|
||||||
final Location bot = corners[1];
|
final Location bot = corners[1];
|
||||||
Location loc = new Location(this.area.worldname, (top.getX() + bot.getX()) / 2, (top.getY() + bot.getY()) / 2, (top.getZ() + bot.getZ()) / 2);
|
Location loc = new Location(this.area.worldname, (top.getX() + bot.getX()) / 2, (top.getY() + bot.getY()) / 2, (top.getZ() + bot.getZ()) / 2);
|
||||||
loc.setY(WorldUtil.IMP.getHighestBlock(top.getWorld(), loc.getX(), loc.getY()));
|
loc.setY(1 + Math.max(WorldUtil.IMP.getHighestBlock(area.worldname, loc.getX(), loc.getZ()), getManager().getSignLoc(area, this).getY()));
|
||||||
return loc;
|
return loc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1722,7 +1725,7 @@ public class Plot {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final Plot other = (Plot) obj;
|
final Plot other = (Plot) obj;
|
||||||
return (this.hashCode() == other.hashCode()) && this.id.x.equals(other.id.x) && this.id.y.equals(other.id.y) && (this.area == other.area);
|
return (this.hashCode() == other.hashCode()) && this.id.equals(other.id) && (this.area == other.area);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -382,7 +382,9 @@ public abstract class PlotPlayer implements CommandCaller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
String name = getName();
|
String name = getName();
|
||||||
ExpireManager.dates.put(getUUID(), System.currentTimeMillis());
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.storeDate(getUUID(), System.currentTimeMillis());
|
||||||
|
}
|
||||||
UUIDHandler.getPlayers().remove(name);
|
UUIDHandler.getPlayers().remove(name);
|
||||||
PS.get().IMP.unregister(this);
|
PS.get().IMP.unregister(this);
|
||||||
}
|
}
|
||||||
|
@ -1,24 +1,17 @@
|
|||||||
package com.intellectualcrafters.plot.util;
|
package com.intellectualcrafters.plot.util;
|
||||||
|
|
||||||
|
import com.intellectualcrafters.plot.PS;
|
||||||
|
import com.intellectualcrafters.plot.config.C;
|
||||||
|
import com.intellectualcrafters.plot.config.Settings;
|
||||||
|
import com.intellectualcrafters.plot.flag.Flag;
|
||||||
|
import com.intellectualcrafters.plot.flag.FlagManager;
|
||||||
|
import com.intellectualcrafters.plot.object.*;
|
||||||
|
import com.plotsquared.listener.PlayerBlockEventType;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.PS;
|
|
||||||
import com.intellectualcrafters.plot.config.C;
|
|
||||||
import com.intellectualcrafters.plot.flag.Flag;
|
|
||||||
import com.intellectualcrafters.plot.flag.FlagManager;
|
|
||||||
import com.intellectualcrafters.plot.object.LazyBlock;
|
|
||||||
import com.intellectualcrafters.plot.object.Location;
|
|
||||||
import com.intellectualcrafters.plot.object.Plot;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotArea;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotBlock;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotCluster;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotId;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
|
||||||
import com.intellectualcrafters.plot.object.Rating;
|
|
||||||
import com.plotsquared.listener.PlayerBlockEventType;
|
|
||||||
|
|
||||||
public abstract class EventUtil {
|
public abstract class EventUtil {
|
||||||
|
|
||||||
public static EventUtil manager = null;
|
public static EventUtil manager = null;
|
||||||
@ -53,6 +46,30 @@ public abstract class EventUtil {
|
|||||||
|
|
||||||
public abstract void callMember(final PlotPlayer initiator, final Plot plot, final UUID player, final boolean added);
|
public abstract void callMember(final PlotPlayer initiator, final Plot plot, final UUID player, final boolean added);
|
||||||
|
|
||||||
|
public void doJoinTask(final PlotPlayer pp) {
|
||||||
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.handleJoin(pp);
|
||||||
|
}
|
||||||
|
if (PS.get().worldedit != null) {
|
||||||
|
if (pp.getAttribute("worldedit")) {
|
||||||
|
MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASSED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (PS.get().update != null && Permissions.hasPermission(pp, C.PERMISSION_ADMIN_UPDATE) && Settings.UPDATE_NOTIFICATIONS) {
|
||||||
|
MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update");
|
||||||
|
}
|
||||||
|
final Plot plot = pp.getCurrentPlot();
|
||||||
|
if (Settings.TELEPORT_ON_LOGIN && plot != null) {
|
||||||
|
TaskManager.runTask(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
plot.teleportPlayer(pp);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
MainUtil.sendMessage(pp, C.TELEPORTED_TO_ROAD);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean checkPlayerBlockEvent(final PlotPlayer pp, final PlayerBlockEventType type, final Location loc, final LazyBlock block, boolean notifyPerms) {
|
public boolean checkPlayerBlockEvent(final PlotPlayer pp, final PlayerBlockEventType type, final Location loc, final LazyBlock block, boolean notifyPerms) {
|
||||||
PlotArea area = PS.get().getPlotAreaAbs(loc);
|
PlotArea area = PS.get().getPlotAreaAbs(loc);
|
||||||
Plot plot = area != null ? area.getPlot(loc) : null;
|
Plot plot = area != null ? area.getPlot(loc) : null;
|
||||||
|
@ -1,124 +1,201 @@
|
|||||||
package com.intellectualcrafters.plot.util;
|
package com.intellectualcrafters.plot.util;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
|
||||||
|
|
||||||
import com.intellectualcrafters.plot.PS;
|
import com.intellectualcrafters.plot.PS;
|
||||||
import com.intellectualcrafters.plot.config.C;
|
import com.intellectualcrafters.plot.config.C;
|
||||||
import com.intellectualcrafters.plot.config.Settings;
|
import com.intellectualcrafters.plot.config.Settings;
|
||||||
|
import com.intellectualcrafters.plot.database.DBFunc;
|
||||||
import com.intellectualcrafters.plot.flag.Flag;
|
import com.intellectualcrafters.plot.flag.Flag;
|
||||||
import com.intellectualcrafters.plot.flag.FlagManager;
|
import com.intellectualcrafters.plot.flag.FlagManager;
|
||||||
import com.intellectualcrafters.plot.generator.HybridUtils;
|
import com.intellectualcrafters.plot.generator.HybridUtils;
|
||||||
import com.intellectualcrafters.plot.object.OfflinePlotPlayer;
|
import com.intellectualcrafters.plot.object.*;
|
||||||
import com.intellectualcrafters.plot.object.Plot;
|
|
||||||
import com.intellectualcrafters.plot.object.PlotAnalysis;
|
import java.util.HashSet;
|
||||||
import com.intellectualcrafters.plot.object.PlotArea;
|
import java.util.Iterator;
|
||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
import java.util.Set;
|
||||||
import com.intellectualcrafters.plot.object.RunnableVal;
|
import java.util.UUID;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
public class ExpireManager {
|
public class ExpireManager {
|
||||||
public static ConcurrentHashMap<String, List<Plot>> expiredPlots = new ConcurrentHashMap<>();
|
|
||||||
public static ConcurrentHashMap<String, Boolean> updatingPlots = new ConcurrentHashMap<>();
|
|
||||||
public static ConcurrentHashMap<String, Long> timestamp = new ConcurrentHashMap<>();
|
|
||||||
public static ConcurrentHashMap<UUID, Long> dates = new ConcurrentHashMap<>();
|
|
||||||
public static int task;
|
|
||||||
|
|
||||||
public static long getTimeStamp(PlotArea area) {
|
public static ExpireManager IMP;
|
||||||
Long timestamp = (Long) area.getMeta("expiredTimestamp");
|
|
||||||
return timestamp != null ? timestamp : 0;
|
private static HashSet<Plot> plotsToDelete;
|
||||||
|
private ConcurrentHashMap<UUID, Long> dates_cache = new ConcurrentHashMap<>();
|
||||||
|
/**
|
||||||
|
* 0 = stopped, 1 = stopping, 2 = running
|
||||||
|
*/
|
||||||
|
private int running;
|
||||||
|
|
||||||
|
public void handleJoin(PlotPlayer pp) {
|
||||||
|
storeDate(pp.getUUID(), System.currentTimeMillis());
|
||||||
|
confirmExpiry(pp);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean updateExpired(final PlotArea area) {
|
public void handleEntry(PlotPlayer pp, Plot plot) {
|
||||||
area.setMeta("updatingExpired", true);
|
if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear") && plotsToDelete.contains(plot) && !isExpired(plot)) {
|
||||||
final long now = System.currentTimeMillis();
|
plotsToDelete.remove(plot);
|
||||||
if (now > getTimeStamp(area)) {
|
confirmExpiry(pp);
|
||||||
area.setMeta("expiredTimestamp", now + 86400000l);
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void confirmExpiry(final PlotPlayer pp) {
|
||||||
|
if (Settings.AUTO_CLEAR_CONFIRMATION && plotsToDelete != null && !plotsToDelete.isEmpty() && pp.hasPermission("plots.admin.command.autoclear")) {
|
||||||
|
int num = plotsToDelete.size();
|
||||||
|
Iterator<Plot> iter = plotsToDelete.iterator();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
Plot current = iter.next();
|
||||||
|
if (isExpired(current)) {
|
||||||
|
final Plot plot = current;
|
||||||
|
pp.teleport(plot.getCenter());
|
||||||
|
PlotMessage msg = new PlotMessage()
|
||||||
|
.text(num + " " + (num > 1 ? "plots are" : "plot is") + " expired:").color("$1").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 this (/plot expired)").color("$2").command("/plot delete").tooltip("/plot delete")
|
||||||
|
.text("\n - ").color("$3").text("Remind later (/plot set keep 1d)").color("$2").command("/plot set keep 1d").tooltip("/plot set keep 1d")
|
||||||
|
.text("\n - ").color("$3").text("Keep this (/plot set keep true)").color("$2").command("/plot set keep true").tooltip("/plot set keep true");
|
||||||
|
msg.send(pp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
plotsToDelete.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean cancelTask() {
|
||||||
|
if (running != 2) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
running = 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean runConfirmedTask() {
|
||||||
|
if (plotsToDelete == null) {
|
||||||
|
plotsToDelete = new HashSet<>();
|
||||||
|
}
|
||||||
|
return runTask(new RunnableVal2<Plot, Runnable>() {
|
||||||
|
@Override
|
||||||
|
public void run(Plot plot, Runnable runnable) {
|
||||||
|
plotsToDelete.add(plot);
|
||||||
|
runnable.run();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean runAutomatedTask() {
|
||||||
|
return runTask(new RunnableVal2<Plot, Runnable>() {
|
||||||
|
@Override
|
||||||
|
public void run(Plot plot, Runnable runnable) {
|
||||||
|
deleteWithMessage(plot, runnable);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean runTask(final RunnableVal2<Plot, Runnable> expiredTask) {
|
||||||
|
if (running != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
running = 2;
|
||||||
|
final Set<Plot> plots = PS.get().getPlots();
|
||||||
TaskManager.runTaskAsync(new Runnable() {
|
TaskManager.runTaskAsync(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
try {
|
if (running != 2) {
|
||||||
final List<Plot> plots = getOldPlots(area);
|
running = 0;
|
||||||
PS.debug("$2[&5Expire&dManager$2] $4Found " + plots.size() + " expired plots for " + area + "!");
|
return;
|
||||||
area.setMeta("expiredPlots", plots);
|
}
|
||||||
area.setMeta("updatingExpired", false);
|
final Runnable task = this;
|
||||||
} catch (final Exception e) {
|
long start = System.currentTimeMillis();
|
||||||
e.printStackTrace();
|
Iterator<Plot> iter = plots.iterator();
|
||||||
|
while (iter.hasNext() && System.currentTimeMillis() - start < 2) {
|
||||||
|
if (running != 2) {
|
||||||
|
running = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final Plot plot = iter.next();
|
||||||
|
iter.remove();
|
||||||
|
if (!isExpired(plot)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
PlotArea area = plot.getArea();
|
||||||
|
if ((Settings.CLEAR_THRESHOLD != -1) && (area.TYPE == 0)) {
|
||||||
|
final PlotAnalysis analysis = plot.getComplexity();
|
||||||
|
if (analysis != null) {
|
||||||
|
if (analysis.getComplexity() > Settings.CLEAR_THRESHOLD) {
|
||||||
|
PS.debug("$2[&5Expire&dManager$2] &bSkipping modified: " + plot);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HybridUtils.manager.analyzePlot(plot, new RunnableVal<PlotAnalysis>() {
|
||||||
|
@Override
|
||||||
|
public void run(PlotAnalysis changed) {
|
||||||
|
if ((changed.changes != 0) && (changed.getComplexity() > Settings.CLEAR_THRESHOLD)) {
|
||||||
|
PS.debug("$2[&5Expire&dManager$2] &bIgnoring modified plot: " + plot + " : " + changed.getComplexity() + " - " + changed.changes);
|
||||||
|
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("analysis"), changed.asList()));
|
||||||
|
TaskManager.runTaskLaterAsync(task, Settings.CLEAR_INTERVAL * 20);
|
||||||
|
} else {
|
||||||
|
expiredTask.run(plot, new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
TaskManager.runTaskLater(task, Settings.CLEAR_INTERVAL * 20);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
expiredTask.run(plot, this);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (plots.size() == 0) {
|
||||||
|
running = 3;
|
||||||
|
TaskManager.runTaskLater(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (running == 3) {
|
||||||
|
running = 2;
|
||||||
|
runTask(expiredTask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, 86400000);
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
TaskManager.runTaskLaterAsync(task, Settings.CLEAR_INTERVAL * 20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
area.setMeta("updatingExpired", false);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void runTask() {
|
public void storeDate(UUID uuid, long time) {
|
||||||
ExpireManager.task = TaskManager.runTaskRepeatAsync(new Runnable() {
|
dates_cache.put(uuid, time);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
try {
|
|
||||||
for (final PlotArea area : PS.get().getPlotAreas()) {
|
|
||||||
Boolean updating = (Boolean) area.getMeta("updatingExpired");
|
|
||||||
if (updating == null) {
|
|
||||||
updating = false;
|
|
||||||
area.setMeta("updatingExpired", false);
|
|
||||||
}
|
}
|
||||||
if (updating) {
|
|
||||||
PS.debug("$2[&5Expire&dManager$2] $4Waiting on fetch...");
|
public HashSet<Plot> getPendingExpired() {
|
||||||
return;
|
return plotsToDelete == null ? new HashSet<Plot>() : plotsToDelete;
|
||||||
}
|
}
|
||||||
List<Plot> plots = (List<Plot>) area.getMeta("expiredPlots");
|
|
||||||
if (plots == null) {
|
public void deleteWithMessage(Plot plot, Runnable whenDone) {
|
||||||
PS.debug("$2[&5Expire&dManager$2] $4Updating expired plots for: " + area);
|
if (plot.isMerged()) {
|
||||||
updateExpired(area);
|
plot.unlinkPlot(true, false);
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((plots.isEmpty())) {
|
|
||||||
if (updateExpired(area)) {
|
|
||||||
PS.debug("$2[&5Expire&dManager$2] $4Re-evaluating expired plots for: " + area);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final Iterator<Plot> iter = plots.iterator();
|
|
||||||
final Plot plot = iter.next();
|
|
||||||
if (!isExpired(plot)) {
|
|
||||||
iter.remove();
|
|
||||||
PS.debug("$2[&5Expire&dManager$2] &bSkipping no longer expired: " + plot);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
for (final UUID helper : plot.getTrusted()) {
|
for (final UUID helper : plot.getTrusted()) {
|
||||||
final PlotPlayer player = UUIDHandler.getPlayer(helper);
|
final PlotPlayer player = UUIDHandler.getPlayer(helper);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.getId().toString());
|
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (final UUID helper : plot.getMembers()) {
|
for (final UUID helper : plot.getMembers()) {
|
||||||
final PlotPlayer player = UUIDHandler.getPlayer(helper);
|
final PlotPlayer player = UUIDHandler.getPlayer(helper);
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.getId().toString());
|
MainUtil.sendMessage(player, C.PLOT_REMOVED_USER, plot.toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final RunnableVal<PlotAnalysis> run = new RunnableVal<PlotAnalysis>() {
|
plot.deletePlot(whenDone);
|
||||||
@Override
|
final PlotAnalysis changed = plot.getComplexity();
|
||||||
public void run(PlotAnalysis changed) {
|
|
||||||
if ((Settings.CLEAR_THRESHOLD != -1) && (area.TYPE == 0) && (changed != null)) {
|
|
||||||
if ((changed.changes != 0) && (changed.getComplexity() > Settings.CLEAR_THRESHOLD)) {
|
|
||||||
PS.debug("$2[&5Expire&dManager$2] &bIgnoring modified plot: " + plot + " : " + changed.getComplexity() + " - " + changed.changes);
|
|
||||||
iter.remove();
|
|
||||||
FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("analysis"), changed.asList()));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (plot.isMerged()) {
|
|
||||||
plot.unlinkPlot(true, false);
|
|
||||||
}
|
|
||||||
plot.deletePlot(null);
|
|
||||||
iter.remove();
|
|
||||||
final int complexity = changed == null ? 0 : changed.getComplexity();
|
final int complexity = changed == null ? 0 : changed.getComplexity();
|
||||||
final int modified = changed == null ? 0 : changed.changes;
|
final int modified = changed == null ? 0 : changed.changes;
|
||||||
PS.debug("$2[&5Expire&dManager$2] &cDeleted expired plot: " + plot + " : " + complexity + " - " + modified);
|
PS.debug("$2[&5Expire&dManager$2] &cDeleted expired plot: " + plot + " : " + complexity + " - " + modified);
|
||||||
@ -129,57 +206,25 @@ public class ExpireManager {
|
|||||||
PS.debug("$4 - Owner: Unowned");
|
PS.debug("$4 - Owner: Unowned");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
|
||||||
if (plot.getRunning() > 0) {
|
|
||||||
PS.debug("$2[&5Expire&dManager$2] &bSkipping plot in use: " + plot);
|
|
||||||
iter.remove();
|
|
||||||
run();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ((Settings.CLEAR_THRESHOLD != -1) && (area.TYPE == 0)) {
|
|
||||||
final PlotAnalysis analysis = plot.getComplexity();
|
|
||||||
if (analysis != null) {
|
|
||||||
if (analysis.getComplexity() > Settings.CLEAR_THRESHOLD) {
|
|
||||||
PS.debug("$2[&5Expire&dManager$2] &bSkipping modified: " + plot);
|
|
||||||
iter.remove();
|
|
||||||
run();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
HybridUtils.manager.analyzePlot(plot, run);
|
|
||||||
} else {
|
|
||||||
run.value = null;
|
|
||||||
run.run();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} catch (final Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, Settings.CLEAR_INTERVAL * 20);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isExpired(final UUID uuid) {
|
public boolean isExpired(final UUID uuid) {
|
||||||
if (UUIDHandler.getPlayer(uuid) != null) {
|
if (UUIDHandler.getPlayer(uuid) != null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final String name = UUIDHandler.getName(uuid);
|
final String name = UUIDHandler.getName(uuid);
|
||||||
if (name != null) {
|
if (name != null) {
|
||||||
long last;
|
Long last = dates_cache.get(uuid);
|
||||||
if (dates.containsKey(uuid)) {
|
if (last == null) {
|
||||||
last = dates.get(uuid);
|
|
||||||
} else {
|
|
||||||
OfflinePlotPlayer opp;
|
OfflinePlotPlayer opp;
|
||||||
if (Settings.TWIN_MODE_UUID) {
|
if (Settings.TWIN_MODE_UUID) {
|
||||||
opp = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
opp = UUIDHandler.getUUIDWrapper().getOfflinePlayer(uuid);
|
||||||
} else {
|
} else {
|
||||||
opp = UUIDHandler.getUUIDWrapper().getOfflinePlayer(name);
|
opp = UUIDHandler.getUUIDWrapper().getOfflinePlayer(name);
|
||||||
}
|
}
|
||||||
last = opp.getLastPlayed();
|
if ((last = opp.getLastPlayed()) != 0) {
|
||||||
if (last != 0) {
|
dates_cache.put(uuid, last);
|
||||||
dates.put(uuid, last);
|
}
|
||||||
} else {
|
else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -194,7 +239,25 @@ public class ExpireManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isExpired(final Plot plot) {
|
public boolean isExpired(final Plot plot) {
|
||||||
|
if (!plot.hasOwner() || DBFunc.everyone.equals(plot.owner) || UUIDHandler.getPlayer(plot.owner) != null || plot.getRunning() > 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
Flag keep = plot.getFlag("keep");
|
||||||
|
if (keep != null) {
|
||||||
|
Object value = keep.getValue();
|
||||||
|
if (value instanceof Boolean) {
|
||||||
|
if (Boolean.TRUE.equals(value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else if (value instanceof Long) {
|
||||||
|
if (((Long) value) > System.currentTimeMillis()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} else { // Invalid?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
for (final UUID owner : plot.getOwners()) {
|
for (final UUID owner : plot.getOwners()) {
|
||||||
if (!isExpired(owner)) {
|
if (!isExpired(owner)) {
|
||||||
return false;
|
return false;
|
||||||
@ -202,28 +265,4 @@ public class ExpireManager {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<Plot> getOldPlots(final PlotArea area) {
|
|
||||||
final ArrayList<Plot> plots = new ArrayList<>(area.getPlots());
|
|
||||||
final List<Plot> toRemove = new ArrayList<>();
|
|
||||||
for (Plot plot : plots) {
|
|
||||||
final Flag keepFlag = FlagManager.getPlotFlagRaw(plot, "keep");
|
|
||||||
if ((keepFlag != null) && (Boolean) keepFlag.getValue()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final UUID uuid = plot.owner;
|
|
||||||
if (uuid == null) {
|
|
||||||
toRemove.add(plot);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final PlotPlayer player = UUIDHandler.getPlayer(uuid);
|
|
||||||
if (player != null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (isExpired(plot)) {
|
|
||||||
toRemove.add(plot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return toRemove;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,61 @@ public class MainUtil {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long timeToSec(String string) {
|
||||||
|
if (MathMan.isInteger(string)) {
|
||||||
|
return Long.parseLong(string);
|
||||||
|
}
|
||||||
|
if (string == null) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
string = string.toLowerCase().trim().toLowerCase();
|
||||||
|
if (string.equalsIgnoreCase("false")) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
String[] split = string.split(" ");
|
||||||
|
long time = 0;
|
||||||
|
for (int i = 0; i < split.length; i++) {
|
||||||
|
String value = split[i];
|
||||||
|
int nums = Integer.parseInt(value.replaceAll("[^\\d]", ""));
|
||||||
|
String letters = value.replaceAll("[^a-z]", "");
|
||||||
|
switch (letters) {
|
||||||
|
case "week":
|
||||||
|
case "weeks":
|
||||||
|
case "wks":
|
||||||
|
case "w": {
|
||||||
|
time += 604800 * nums;
|
||||||
|
}
|
||||||
|
case "days":
|
||||||
|
case "day":
|
||||||
|
case "d": {
|
||||||
|
time += 86400 * nums;
|
||||||
|
}
|
||||||
|
case "hour":
|
||||||
|
case "hr":
|
||||||
|
case "hrs":
|
||||||
|
case "hours":
|
||||||
|
case "h": {
|
||||||
|
time += 3600 * nums;
|
||||||
|
}
|
||||||
|
case "minutes":
|
||||||
|
case "minute":
|
||||||
|
case "mins":
|
||||||
|
case "min":
|
||||||
|
case "m": {
|
||||||
|
time += 60 * nums;
|
||||||
|
}
|
||||||
|
case "seconds":
|
||||||
|
case "second":
|
||||||
|
case "secs":
|
||||||
|
case "sec":
|
||||||
|
case "s":{
|
||||||
|
time += nums;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return time;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Hashcode of a boolean array.<br>
|
* Hashcode of a boolean array.<br>
|
||||||
* - Used for traversing mega plots quickly.
|
* - Used for traversing mega plots quickly.
|
||||||
|
@ -29,16 +29,7 @@ import com.intellectualcrafters.plot.object.Plot;
|
|||||||
import com.intellectualcrafters.plot.object.PlotArea;
|
import com.intellectualcrafters.plot.object.PlotArea;
|
||||||
import com.intellectualcrafters.plot.object.PlotPlayer;
|
import com.intellectualcrafters.plot.object.PlotPlayer;
|
||||||
import com.intellectualcrafters.plot.object.RunnableVal;
|
import com.intellectualcrafters.plot.object.RunnableVal;
|
||||||
import com.intellectualcrafters.plot.util.AbstractTitle;
|
import com.intellectualcrafters.plot.util.*;
|
||||||
import com.intellectualcrafters.plot.util.CommentManager;
|
|
||||||
import com.intellectualcrafters.plot.util.EventUtil;
|
|
||||||
import com.intellectualcrafters.plot.util.MainUtil;
|
|
||||||
import com.intellectualcrafters.plot.util.Permissions;
|
|
||||||
import com.intellectualcrafters.plot.util.PlotGamemode;
|
|
||||||
import com.intellectualcrafters.plot.util.PlotWeather;
|
|
||||||
import com.intellectualcrafters.plot.util.StringMan;
|
|
||||||
import com.intellectualcrafters.plot.util.TaskManager;
|
|
||||||
import com.intellectualcrafters.plot.util.UUIDHandler;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -58,6 +49,9 @@ public class PlotListener {
|
|||||||
if ((last != null) && !last.getId().equals(plot.getId())) {
|
if ((last != null) && !last.getId().equals(plot.getId())) {
|
||||||
plotExit(pp, last);
|
plotExit(pp, last);
|
||||||
}
|
}
|
||||||
|
if (ExpireManager.IMP != null) {
|
||||||
|
ExpireManager.IMP.handleEntry(pp, plot);
|
||||||
|
}
|
||||||
pp.setMeta("lastplot", plot);
|
pp.setMeta("lastplot", plot);
|
||||||
EventUtil.manager.callEntry(pp, plot);
|
EventUtil.manager.callEntry(pp, plot);
|
||||||
if (plot.hasOwner()) {
|
if (plot.hasOwner()) {
|
||||||
|
@ -656,24 +656,7 @@ public class MainListener {
|
|||||||
TaskManager.runTaskLaterAsync(new Runnable() {
|
TaskManager.runTaskLaterAsync(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
ExpireManager.dates.put(uuid, System.currentTimeMillis());
|
EventUtil.manager.doJoinTask(pp);
|
||||||
if (PS.get().worldedit != null) {
|
|
||||||
if (pp.getAttribute("worldedit")) {
|
|
||||||
MainUtil.sendMessage(pp, C.WORLDEDIT_BYPASSED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (PS.get().update != null && Permissions.hasPermission(pp, C.PERMISSION_ADMIN_UPDATE) && Settings.UPDATE_NOTIFICATIONS) {
|
|
||||||
MainUtil.sendMessage(pp, "&6An update for PlotSquared is available: &7/plot update");
|
|
||||||
}
|
|
||||||
if (Settings.TELEPORT_ON_LOGIN && plot != null) {
|
|
||||||
TaskManager.runTask(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
plot.teleportPlayer(pp);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
MainUtil.sendMessage(pp, C.TELEPORTED_TO_ROAD);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}, 20);
|
}, 20);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user