2020-04-16 04:52:39 +02:00
|
|
|
/*
|
|
|
|
* _____ _ _ _____ _
|
|
|
|
* | __ \| | | | / ____| | |
|
|
|
|
* | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| |
|
|
|
|
* | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` |
|
|
|
|
* | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| |
|
|
|
|
* |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_|
|
|
|
|
* | |
|
|
|
|
* |_|
|
|
|
|
* 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/>.
|
|
|
|
*/
|
2020-04-11 02:19:18 +02:00
|
|
|
package com.plotsquared.bukkit;
|
2015-07-05 17:44:10 +02:00
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
import com.google.inject.Guice;
|
2020-07-12 12:25:44 +02:00
|
|
|
import com.google.inject.Inject;
|
2020-07-10 22:12:37 +02:00
|
|
|
import com.google.inject.Injector;
|
|
|
|
import com.google.inject.Key;
|
|
|
|
import com.google.inject.Stage;
|
2020-04-11 02:19:18 +02:00
|
|
|
import com.plotsquared.bukkit.generator.BukkitPlotGenerator;
|
2020-07-10 22:12:37 +02:00
|
|
|
import com.plotsquared.bukkit.inject.BackupModule;
|
|
|
|
import com.plotsquared.bukkit.inject.BukkitModule;
|
|
|
|
import com.plotsquared.bukkit.inject.WorldManagerModule;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.bukkit.listener.ChunkListener;
|
|
|
|
import com.plotsquared.bukkit.listener.EntitySpawnListener;
|
2020-04-30 18:23:18 +02:00
|
|
|
import com.plotsquared.bukkit.listener.PaperListener;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.bukkit.listener.PlayerEvents;
|
|
|
|
import com.plotsquared.bukkit.listener.SingleWorldListener;
|
|
|
|
import com.plotsquared.bukkit.listener.WorldEvents;
|
|
|
|
import com.plotsquared.bukkit.placeholder.PlaceholderFormatter;
|
|
|
|
import com.plotsquared.bukkit.placeholder.Placeholders;
|
2020-05-19 00:28:52 +02:00
|
|
|
import com.plotsquared.bukkit.player.BukkitPlayerManager;
|
2020-04-11 02:19:18 +02:00
|
|
|
import com.plotsquared.bukkit.util.BukkitChatManager;
|
|
|
|
import com.plotsquared.bukkit.util.BukkitUtil;
|
2020-07-10 12:21:29 +02:00
|
|
|
import com.plotsquared.bukkit.util.BukkitWorld;
|
2020-04-11 02:19:18 +02:00
|
|
|
import com.plotsquared.bukkit.util.SetGenCB;
|
|
|
|
import com.plotsquared.bukkit.util.UpdateUtility;
|
2020-07-19 14:23:55 +02:00
|
|
|
import com.plotsquared.bukkit.util.task.BukkitTaskManager;
|
2020-07-15 13:18:09 +02:00
|
|
|
import com.plotsquared.bukkit.util.task.PaperTimeConverter;
|
|
|
|
import com.plotsquared.bukkit.util.task.SpigotTimeConverter;
|
2020-05-24 14:32:34 +02:00
|
|
|
import com.plotsquared.bukkit.uuid.BungeePermsUUIDService;
|
2020-05-23 19:43:32 +02:00
|
|
|
import com.plotsquared.bukkit.uuid.EssentialsUUIDService;
|
|
|
|
import com.plotsquared.bukkit.uuid.LuckPermsUUIDService;
|
2020-05-18 00:22:34 +02:00
|
|
|
import com.plotsquared.bukkit.uuid.OfflinePlayerUUIDService;
|
|
|
|
import com.plotsquared.bukkit.uuid.PaperUUIDService;
|
|
|
|
import com.plotsquared.bukkit.uuid.SQLiteUUIDService;
|
|
|
|
import com.plotsquared.bukkit.uuid.SquirrelIdUUIDService;
|
2020-07-07 12:56:43 +02:00
|
|
|
import com.plotsquared.core.PlotPlatform;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.PlotSquared;
|
2020-05-10 14:02:25 +02:00
|
|
|
import com.plotsquared.core.backup.BackupManager;
|
2020-07-14 19:10:52 +02:00
|
|
|
import com.plotsquared.core.command.WE_Anywhere;
|
|
|
|
import com.plotsquared.core.components.ComponentPresetManager;
|
2020-04-30 12:01:52 +02:00
|
|
|
import com.plotsquared.core.configuration.Captions;
|
|
|
|
import com.plotsquared.core.configuration.ChatFormatter;
|
|
|
|
import com.plotsquared.core.configuration.ConfigurationNode;
|
|
|
|
import com.plotsquared.core.configuration.ConfigurationSection;
|
2020-07-19 14:23:55 +02:00
|
|
|
import com.plotsquared.core.configuration.ConfigurationUtil;
|
2020-04-30 12:01:52 +02:00
|
|
|
import com.plotsquared.core.configuration.Settings;
|
2020-07-10 19:25:05 +02:00
|
|
|
import com.plotsquared.core.configuration.file.YamlConfiguration;
|
2020-05-19 00:28:52 +02:00
|
|
|
import com.plotsquared.core.database.DBFunc;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.generator.GeneratorWrapper;
|
|
|
|
import com.plotsquared.core.generator.IndependentPlotGenerator;
|
2020-04-30 12:01:52 +02:00
|
|
|
import com.plotsquared.core.generator.SingleWorldGenerator;
|
2020-07-10 22:12:37 +02:00
|
|
|
import com.plotsquared.core.inject.annotations.BackgroundPipeline;
|
|
|
|
import com.plotsquared.core.inject.annotations.DefaultGenerator;
|
|
|
|
import com.plotsquared.core.inject.annotations.ImpromptuPipeline;
|
|
|
|
import com.plotsquared.core.inject.annotations.WorldConfig;
|
|
|
|
import com.plotsquared.core.inject.annotations.WorldFile;
|
|
|
|
import com.plotsquared.core.inject.modules.PlotSquaredModule;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.listener.PlotListener;
|
2020-07-10 22:12:37 +02:00
|
|
|
import com.plotsquared.core.listener.WESubscriber;
|
2020-04-30 12:01:52 +02:00
|
|
|
import com.plotsquared.core.player.PlotPlayer;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.plot.Plot;
|
|
|
|
import com.plotsquared.core.plot.PlotArea;
|
2020-04-16 06:11:03 +02:00
|
|
|
import com.plotsquared.core.plot.PlotAreaTerrainType;
|
|
|
|
import com.plotsquared.core.plot.PlotAreaType;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.plot.PlotId;
|
2020-07-14 18:49:40 +02:00
|
|
|
import com.plotsquared.core.plot.comment.CommentManager;
|
2020-07-19 14:23:55 +02:00
|
|
|
import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.plot.message.PlainChatManager;
|
|
|
|
import com.plotsquared.core.plot.world.PlotAreaManager;
|
|
|
|
import com.plotsquared.core.plot.world.SinglePlotArea;
|
|
|
|
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
|
2020-07-10 22:12:37 +02:00
|
|
|
import com.plotsquared.core.queue.GlobalBlockQueue;
|
2020-06-05 02:19:37 +02:00
|
|
|
import com.plotsquared.core.setup.PlotAreaBuilder;
|
|
|
|
import com.plotsquared.core.setup.SettingsNodesWrapper;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.util.ChatManager;
|
|
|
|
import com.plotsquared.core.util.ConsoleColors;
|
|
|
|
import com.plotsquared.core.util.EconHandler;
|
2020-07-10 18:17:44 +02:00
|
|
|
import com.plotsquared.core.util.EventDispatcher;
|
2020-07-19 14:23:55 +02:00
|
|
|
import com.plotsquared.core.util.FileUtils;
|
2020-06-25 00:19:58 +02:00
|
|
|
import com.plotsquared.core.util.PermHandler;
|
2020-05-15 18:41:57 +02:00
|
|
|
import com.plotsquared.core.util.PlatformWorldManager;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.util.PremiumVerification;
|
|
|
|
import com.plotsquared.core.util.ReflectionUtils;
|
|
|
|
import com.plotsquared.core.util.SetupUtils;
|
2020-04-30 12:01:52 +02:00
|
|
|
import com.plotsquared.core.util.WorldUtil;
|
2020-04-15 21:26:54 +02:00
|
|
|
import com.plotsquared.core.util.task.TaskManager;
|
2020-07-15 13:18:09 +02:00
|
|
|
import com.plotsquared.core.util.task.TaskTime;
|
2020-05-18 00:22:34 +02:00
|
|
|
import com.plotsquared.core.uuid.CacheUUIDService;
|
|
|
|
import com.plotsquared.core.uuid.UUIDPipeline;
|
|
|
|
import com.plotsquared.core.uuid.offline.OfflineModeUUIDService;
|
2016-06-01 22:50:35 +02:00
|
|
|
import com.sk89q.worldedit.WorldEdit;
|
2020-04-30 18:23:18 +02:00
|
|
|
import io.papermc.lib.PaperLib;
|
2018-08-10 20:46:38 +02:00
|
|
|
import lombok.Getter;
|
2020-04-11 19:52:45 +02:00
|
|
|
import org.bstats.bukkit.Metrics;
|
2019-11-04 18:44:23 +01:00
|
|
|
import org.bukkit.Bukkit;
|
|
|
|
import org.bukkit.ChatColor;
|
|
|
|
import org.bukkit.Chunk;
|
|
|
|
import org.bukkit.Location;
|
|
|
|
import org.bukkit.OfflinePlayer;
|
|
|
|
import org.bukkit.World;
|
2016-02-26 07:29:31 +01:00
|
|
|
import org.bukkit.command.PluginCommand;
|
|
|
|
import org.bukkit.entity.Entity;
|
2016-06-03 16:57:25 +02:00
|
|
|
import org.bukkit.entity.LivingEntity;
|
2016-02-26 07:29:31 +01:00
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.Listener;
|
|
|
|
import org.bukkit.generator.ChunkGenerator;
|
2017-12-03 17:21:15 +01:00
|
|
|
import org.bukkit.metadata.FixedMetadataValue;
|
2016-02-26 07:29:31 +01:00
|
|
|
import org.bukkit.metadata.MetadataValue;
|
|
|
|
import org.bukkit.plugin.Plugin;
|
|
|
|
import org.bukkit.plugin.java.JavaPlugin;
|
2020-07-05 13:56:54 +02:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
2016-03-23 02:41:37 +01:00
|
|
|
|
2020-07-14 19:10:52 +02:00
|
|
|
import javax.annotation.Nonnull;
|
|
|
|
import javax.annotation.Nullable;
|
2019-02-04 15:02:21 +01:00
|
|
|
import java.io.File;
|
|
|
|
import java.lang.reflect.Method;
|
2019-11-25 23:38:03 +01:00
|
|
|
import java.util.AbstractMap;
|
2019-05-11 03:18:28 +02:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
2020-04-11 20:56:34 +02:00
|
|
|
import java.util.HashMap;
|
2020-05-20 15:12:09 +02:00
|
|
|
import java.util.HashSet;
|
2019-05-11 03:18:28 +02:00
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
2019-11-25 23:38:03 +01:00
|
|
|
import java.util.Map;
|
2020-05-20 15:12:09 +02:00
|
|
|
import java.util.Queue;
|
|
|
|
import java.util.Set;
|
2019-05-11 03:18:28 +02:00
|
|
|
import java.util.UUID;
|
2020-05-20 15:12:09 +02:00
|
|
|
import java.util.concurrent.ExecutionException;
|
|
|
|
import java.util.concurrent.Executors;
|
|
|
|
import java.util.concurrent.LinkedBlockingQueue;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
2019-02-04 15:02:21 +01:00
|
|
|
|
2020-04-30 12:01:52 +02:00
|
|
|
import static com.plotsquared.core.util.PremiumVerification.getDownloadID;
|
|
|
|
import static com.plotsquared.core.util.PremiumVerification.getResourceID;
|
|
|
|
import static com.plotsquared.core.util.PremiumVerification.getUserID;
|
2020-04-15 21:26:54 +02:00
|
|
|
import static com.plotsquared.core.util.ReflectionUtils.getRefClass;
|
2019-02-04 15:02:21 +01:00
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
@SuppressWarnings("unused") public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPlatform<Player> {
|
2016-03-20 23:19:37 +01:00
|
|
|
|
2020-07-14 19:10:52 +02:00
|
|
|
private static final Logger logger = LoggerFactory.getLogger("P2/" + BukkitPlatform.class.getSimpleName());
|
2020-05-10 14:02:25 +02:00
|
|
|
private static final int BSTATS_ID = 1404;
|
2018-07-21 17:32:38 +02:00
|
|
|
|
|
|
|
static {
|
|
|
|
try {
|
|
|
|
Settings.load(new File("plugins/PlotSquared/config/settings.yml"));
|
2019-04-24 00:48:22 +02:00
|
|
|
} catch (Throwable ignored) {
|
|
|
|
}
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
2018-12-26 18:21:06 +01:00
|
|
|
|
2018-07-21 17:32:38 +02:00
|
|
|
private int[] version;
|
2019-02-04 16:18:50 +01:00
|
|
|
@Getter private String pluginName;
|
2018-08-10 20:46:38 +02:00
|
|
|
@Getter private SingleWorldListener singleWorldListener;
|
2018-08-10 17:01:10 +02:00
|
|
|
private Method methodUnloadChunk0;
|
|
|
|
private boolean methodUnloadSetup = false;
|
2018-12-21 21:10:37 +01:00
|
|
|
private boolean metricsStarted;
|
2020-06-24 17:33:49 +02:00
|
|
|
private EconHandler econ;
|
2020-06-25 00:19:58 +02:00
|
|
|
private PermHandler perm;
|
2020-07-10 18:17:44 +02:00
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
@Getter private Injector injector;
|
|
|
|
|
2020-07-12 12:25:44 +02:00
|
|
|
@Inject private PlotAreaManager plotAreaManager;
|
|
|
|
@Inject private EventDispatcher eventDispatcher;
|
|
|
|
@Inject private PlotListener plotListener;
|
|
|
|
@Inject @WorldConfig private YamlConfiguration worldConfiguration;
|
|
|
|
@Inject @WorldFile private File worldfile;
|
|
|
|
@Inject private BukkitPlayerManager playerManager;
|
|
|
|
@Inject private BackupManager backupManager;
|
|
|
|
@Inject @ImpromptuPipeline private UUIDPipeline impromptuPipeline;
|
|
|
|
@Inject @BackgroundPipeline private UUIDPipeline backgroundPipeline;
|
|
|
|
@Inject private PlatformWorldManager<World> worldManager;
|
2020-07-10 19:25:05 +02:00
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public int[] getServerVersion() {
|
2018-07-21 17:32:38 +02:00
|
|
|
if (this.version == null) {
|
|
|
|
try {
|
|
|
|
this.version = new int[3];
|
|
|
|
String[] split = Bukkit.getBukkitVersion().split("-")[0].split("\\.");
|
|
|
|
this.version[0] = Integer.parseInt(split[0]);
|
|
|
|
this.version[1] = Integer.parseInt(split[1]);
|
|
|
|
if (split.length == 3) {
|
|
|
|
this.version[2] = Integer.parseInt(split[2]);
|
|
|
|
}
|
|
|
|
} catch (NumberFormatException e) {
|
|
|
|
e.printStackTrace();
|
2018-08-10 17:01:10 +02:00
|
|
|
return new int[] {1, 13, 0};
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return this.version;
|
|
|
|
}
|
|
|
|
|
2019-01-09 23:12:36 +01:00
|
|
|
@Override public String getServerImplementation() {
|
|
|
|
return Bukkit.getVersion();
|
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public void onEnable() {
|
2018-08-10 20:46:38 +02:00
|
|
|
this.pluginName = getDescription().getName();
|
2020-07-10 22:12:37 +02:00
|
|
|
|
2020-07-15 13:18:09 +02:00
|
|
|
final TaskTime.TimeConverter timeConverter;
|
|
|
|
if (PaperLib.isPaper()) {
|
|
|
|
timeConverter = new PaperTimeConverter();
|
|
|
|
} else {
|
|
|
|
timeConverter = new SpigotTimeConverter();
|
|
|
|
}
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
// Stuff that needs to be created before the PlotSquared instance
|
2020-07-17 22:58:10 +02:00
|
|
|
PlotPlayer.registerConverter(Player.class, BukkitUtil::adapt);
|
2020-07-17 16:38:07 +02:00
|
|
|
TaskManager.setPlatformImplementation(new BukkitTaskManager(this, timeConverter));
|
2018-12-26 15:29:39 +01:00
|
|
|
|
2020-07-10 17:32:07 +02:00
|
|
|
final PlotSquared plotSquared = new PlotSquared(this, "Bukkit");
|
2020-07-10 18:17:44 +02:00
|
|
|
|
2020-07-07 12:56:43 +02:00
|
|
|
if (PlotSquared.platform().getServerVersion()[1] < 13) {
|
2019-05-13 21:56:28 +02:00
|
|
|
System.out.println(
|
|
|
|
"You can't use this version of PlotSquared on a server less than Minecraft 1.13.2.");
|
|
|
|
System.out
|
|
|
|
.println("Please check the download page for the link to the legacy versions.");
|
2019-05-17 20:38:57 +02:00
|
|
|
System.out.println("The server will now be shutdown to prevent any corruption.");
|
2019-05-13 21:56:28 +02:00
|
|
|
Bukkit.shutdown();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
// We create the injector after PlotSquared has been initialized, so that we have access
|
|
|
|
// to generated instances and settings
|
2020-07-14 18:49:40 +02:00
|
|
|
this.injector = Guice.createInjector(Stage.PRODUCTION, new WorldManagerModule(), new PlotSquaredModule(),
|
|
|
|
new BukkitModule(this), new BackupModule());
|
2020-07-10 22:12:37 +02:00
|
|
|
this.injector.injectMembers(this);
|
|
|
|
|
2020-04-21 13:22:42 +02:00
|
|
|
if (PremiumVerification.isPremium() && Settings.Enabled_Components.UPDATE_NOTIFICATIONS) {
|
2020-07-10 22:12:37 +02:00
|
|
|
injector.getInstance(UpdateUtility.class).updateChecker();
|
2020-04-21 09:56:23 +02:00
|
|
|
}
|
2019-03-18 19:49:22 +01:00
|
|
|
|
2020-02-19 23:55:43 +01:00
|
|
|
if (PremiumVerification.isPremium()) {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] PlotSquared version licensed to Spigot user {}", getUserID());
|
|
|
|
logger.info("[P2] https://www.spigotmc.org/resources/{}", getResourceID());
|
|
|
|
logger.info("[P2] Download ID: {}", getDownloadID());
|
|
|
|
logger.info("[P2] Thanks for supporting us :)");
|
2020-02-19 23:55:43 +01:00
|
|
|
} else {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] Couldn't verify purchase :(");
|
2020-02-19 23:55:43 +01:00
|
|
|
}
|
|
|
|
|
2020-07-14 18:49:40 +02:00
|
|
|
// Database
|
|
|
|
if (Settings.Enabled_Components.DATABASE) {
|
|
|
|
plotSquared.setupDatabase();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Check if we need to convert old flag values, etc
|
|
|
|
if (!plotSquared.getConfigurationVersion().equalsIgnoreCase("v5")) {
|
|
|
|
// Perform upgrade
|
|
|
|
if (DBFunc.dbManager.convertFlags()) {
|
|
|
|
log(Captions.PREFIX.getTranslated() + "Flags were converted successfully!");
|
|
|
|
// Update the config version
|
|
|
|
try {
|
|
|
|
plotSquared.setConfigurationVersion("v5");
|
|
|
|
} catch (final Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Comments
|
|
|
|
CommentManager.registerDefaultInboxes();
|
|
|
|
|
|
|
|
plotSquared.startExpiryTasks();
|
|
|
|
|
|
|
|
// This is getting removed so I won't even bother migrating it
|
|
|
|
ChatManager.manager = this.initChatManager();
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
// Do stuff that was previously done in PlotSquared
|
|
|
|
// Kill entities
|
|
|
|
if (Settings.Enabled_Components.KILL_ROAD_MOBS
|
|
|
|
|| Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
|
|
|
this.runEntityTask();
|
|
|
|
}
|
|
|
|
|
|
|
|
// WorldEdit
|
|
|
|
if (Settings.Enabled_Components.WORLDEDIT_RESTRICTIONS) {
|
|
|
|
try {
|
2020-07-14 19:10:52 +02:00
|
|
|
logger.info("[P2] {} hooked into WorldEdit", this.getPluginName());
|
2020-07-10 22:12:37 +02:00
|
|
|
WorldEdit.getInstance().getEventBus().register(this.getInjector().getInstance(WESubscriber.class));
|
|
|
|
if (Settings.Enabled_Components.COMMANDS) {
|
|
|
|
new WE_Anywhere();
|
|
|
|
}
|
|
|
|
} catch (Throwable e) {
|
2020-07-14 19:10:52 +02:00
|
|
|
logger.error("[P2] Incompatible version of WorldEdit, please upgrade: http://builds.enginehub.org/job/worldedit?branch=master");
|
2020-07-10 22:12:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Settings.Enabled_Components.EVENTS) {
|
|
|
|
getServer().getPluginManager().registerEvents(getInjector().getInstance(PlayerEvents.class), this);
|
|
|
|
getServer().getPluginManager().registerEvents(getInjector().getInstance(EntitySpawnListener.class), this);
|
|
|
|
if (PaperLib.isPaper() && Settings.Paper_Components.PAPER_LISTENERS) {
|
|
|
|
getServer().getPluginManager().registerEvents(getInjector().getInstance(PaperListener.class), this);
|
|
|
|
}
|
|
|
|
this.plotListener.startRunnable();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Required
|
|
|
|
getServer().getPluginManager().registerEvents(getInjector().getInstance(WorldEvents.class), this);
|
|
|
|
if (Settings.Enabled_Components.CHUNK_PROCESSOR) {
|
|
|
|
getServer().getPluginManager().registerEvents(getInjector().getInstance(ChunkListener.class), this);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Start the global block queue
|
|
|
|
final GlobalBlockQueue globalBlockQueue = this.injector.getInstance(GlobalBlockQueue.class);
|
|
|
|
globalBlockQueue.runTask();
|
|
|
|
|
|
|
|
// Commands
|
|
|
|
if (Settings.Enabled_Components.COMMANDS) {
|
|
|
|
this.registerCommands();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Economy
|
|
|
|
if (Settings.Enabled_Components.ECONOMY) {
|
|
|
|
TaskManager.runTask(() -> {
|
2020-07-14 18:49:40 +02:00
|
|
|
final PermHandler permHandler = getInjector().getInstance(PermHandler.class);
|
|
|
|
if (permHandler != null) {
|
|
|
|
permHandler.init();
|
|
|
|
}
|
|
|
|
final EconHandler econHandler = getInjector().getInstance(EconHandler.class);
|
|
|
|
if (econHandler != null) {
|
|
|
|
econHandler.init();
|
|
|
|
}
|
2020-07-10 22:12:37 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (Settings.Enabled_Components.COMPONENT_PRESETS) {
|
|
|
|
try {
|
2020-07-12 12:25:44 +02:00
|
|
|
getInjector().getInstance(ComponentPresetManager.class);
|
2020-07-10 22:12:37 +02:00
|
|
|
} catch (final Exception e) {
|
2020-07-14 19:10:52 +02:00
|
|
|
logger.error("[P2] Failed to initialize the preset system", e);
|
2020-07-10 22:12:37 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// World generators:
|
|
|
|
final ConfigurationSection section = this.worldConfiguration.getConfigurationSection("worlds");
|
|
|
|
final WorldUtil worldUtil = getInjector().getInstance(WorldUtil.class);
|
|
|
|
|
|
|
|
if (section != null) {
|
|
|
|
for (String world : section.getKeys(false)) {
|
|
|
|
if (world.equals("CheckingPlotSquaredGenerator")) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (worldUtil.isWorld(world)) {
|
|
|
|
this.setGenerator(world);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
TaskManager.runTaskLater(() -> {
|
|
|
|
for (String world : section.getKeys(false)) {
|
|
|
|
if (world.equals("CheckingPlotSquaredGenerator")) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!worldUtil.isWorld(world) && !world.equals("*")) {
|
2020-07-14 19:10:52 +02:00
|
|
|
logger.warn("[P2] `{}` was not properly loaded - {} will now try to load it properly",
|
|
|
|
world, this.getPluginName());
|
|
|
|
logger.warn("[P2] - Are you trying to delete this world? Remember to remove it from the worlds.yml, bukkit.yml and multiverse worlds.yml");
|
|
|
|
logger.warn("[P2] - Your world management plugin may be faulty (or non existent)");
|
|
|
|
logger.warn("[P2] This message may also be a false positive and could be ignored.");
|
2020-07-10 22:12:37 +02:00
|
|
|
this.setGenerator(world);
|
|
|
|
}
|
|
|
|
}
|
2020-07-15 13:18:09 +02:00
|
|
|
}, TaskTime.ticks(1L));
|
2020-07-10 22:12:37 +02:00
|
|
|
}
|
2020-05-23 19:43:32 +02:00
|
|
|
|
2020-05-18 00:22:34 +02:00
|
|
|
// Services are accessed in order
|
2020-07-10 22:12:37 +02:00
|
|
|
final CacheUUIDService cacheUUIDService = new CacheUUIDService(Settings.UUID.UUID_CACHE_SIZE);
|
|
|
|
this.impromptuPipeline.registerService(cacheUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(cacheUUIDService);
|
|
|
|
this.impromptuPipeline.registerConsumer(cacheUUIDService);
|
|
|
|
this.backgroundPipeline.registerConsumer(cacheUUIDService);
|
2020-05-23 19:43:32 +02:00
|
|
|
|
2020-05-18 00:22:34 +02:00
|
|
|
// Now, if the server is in offline mode we can only use profiles and direct UUID
|
|
|
|
// access, and so we skip the player profile stuff as well as SquirrelID (Mojang lookups)
|
|
|
|
if (Settings.UUID.OFFLINE) {
|
|
|
|
final OfflineModeUUIDService offlineModeUUIDService = new OfflineModeUUIDService();
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(offlineModeUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(offlineModeUUIDService);
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) Using the offline mode UUID service");
|
2020-05-18 00:22:34 +02:00
|
|
|
}
|
2020-05-23 19:43:32 +02:00
|
|
|
|
2020-07-12 17:04:30 +02:00
|
|
|
if (Settings.UUID.SERVICE_BUKKIT) {
|
|
|
|
final OfflinePlayerUUIDService offlinePlayerUUIDService = new OfflinePlayerUUIDService();
|
2020-07-14 19:18:08 +02:00
|
|
|
this.impromptuPipeline.registerService(offlinePlayerUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(offlinePlayerUUIDService);
|
2020-07-12 17:04:30 +02:00
|
|
|
}
|
2020-05-20 15:12:09 +02:00
|
|
|
|
2020-05-24 04:48:19 +02:00
|
|
|
final SQLiteUUIDService sqLiteUUIDService = new SQLiteUUIDService("user_cache.db");
|
2020-05-24 05:00:36 +02:00
|
|
|
|
|
|
|
final SQLiteUUIDService legacyUUIDService;
|
2020-07-19 14:23:55 +02:00
|
|
|
if (Settings.UUID.LEGACY_DATABASE_SUPPORT &&
|
|
|
|
FileUtils.getFile(PlotSquared.platform().getDirectory(), "usercache.db").exists()) {
|
2020-05-24 05:00:36 +02:00
|
|
|
legacyUUIDService = new SQLiteUUIDService("usercache.db");
|
|
|
|
} else {
|
|
|
|
legacyUUIDService = null;
|
|
|
|
}
|
2020-05-23 19:43:32 +02:00
|
|
|
|
|
|
|
final LuckPermsUUIDService luckPermsUUIDService;
|
2020-07-12 17:04:30 +02:00
|
|
|
if (Settings.UUID.SERVICE_LUCKPERMS &&
|
|
|
|
Bukkit.getPluginManager().getPlugin("LuckPerms") != null) {
|
2020-05-23 19:43:32 +02:00
|
|
|
luckPermsUUIDService = new LuckPermsUUIDService();
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) Using LuckPerms as a complementary UUID service");
|
2020-05-23 19:43:32 +02:00
|
|
|
} else {
|
|
|
|
luckPermsUUIDService = null;
|
|
|
|
}
|
|
|
|
|
2020-05-24 14:32:34 +02:00
|
|
|
final BungeePermsUUIDService bungeePermsUUIDService;
|
2020-07-12 17:04:30 +02:00
|
|
|
if (Settings.UUID.SERVICE_BUNGEE_PERMS &&
|
|
|
|
Bukkit.getPluginManager().getPlugin("BungeePerms") != null) {
|
2020-05-24 14:32:34 +02:00
|
|
|
bungeePermsUUIDService = new BungeePermsUUIDService();
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) Using BungeePerms as a complementary UUID service");
|
2020-05-24 14:32:34 +02:00
|
|
|
} else {
|
|
|
|
bungeePermsUUIDService = null;
|
|
|
|
}
|
2020-06-22 15:45:57 +02:00
|
|
|
|
2020-05-23 19:43:32 +02:00
|
|
|
final EssentialsUUIDService essentialsUUIDService;
|
2020-07-12 17:11:25 +02:00
|
|
|
if (Settings.UUID.SERVICE_ESSENTIALSX && Bukkit.getPluginManager().getPlugin("Essentials") != null) {
|
2020-05-23 19:43:32 +02:00
|
|
|
essentialsUUIDService = new EssentialsUUIDService();
|
2020-07-14 19:18:08 +02:00
|
|
|
logger.info("[P2] (UUID) Using EssentialsX as a complementary UUID service");
|
2020-05-23 19:43:32 +02:00
|
|
|
} else {
|
|
|
|
essentialsUUIDService = null;
|
|
|
|
}
|
|
|
|
|
2020-05-24 04:27:20 +02:00
|
|
|
if (!Settings.UUID.OFFLINE) {
|
2020-05-24 04:28:29 +02:00
|
|
|
// If running Paper we'll also try to use their profiles
|
2020-07-12 17:04:30 +02:00
|
|
|
if (Bukkit.getOnlineMode() && PaperLib.isPaper() && Settings.UUID.SERVICE_PAPER) {
|
2020-05-24 04:28:29 +02:00
|
|
|
final PaperUUIDService paperUUIDService = new PaperUUIDService();
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(paperUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(paperUUIDService);
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) Using Paper as a complementary UUID service");
|
2020-05-24 04:28:29 +02:00
|
|
|
}
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(sqLiteUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(sqLiteUUIDService);
|
|
|
|
this.impromptuPipeline.registerConsumer(sqLiteUUIDService);
|
|
|
|
this.backgroundPipeline.registerConsumer(sqLiteUUIDService);
|
2020-05-23 19:43:32 +02:00
|
|
|
|
2020-05-24 05:00:36 +02:00
|
|
|
if (legacyUUIDService != null) {
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(legacyUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(legacyUUIDService);
|
2020-05-24 05:00:36 +02:00
|
|
|
}
|
2020-05-24 04:48:19 +02:00
|
|
|
|
2020-05-23 19:43:32 +02:00
|
|
|
// Plugin providers
|
|
|
|
if (luckPermsUUIDService != null) {
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(luckPermsUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(luckPermsUUIDService);
|
2020-05-23 19:43:32 +02:00
|
|
|
}
|
2020-05-24 14:32:34 +02:00
|
|
|
if (bungeePermsUUIDService != null) {
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(bungeePermsUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(bungeePermsUUIDService);
|
2020-05-24 14:32:34 +02:00
|
|
|
}
|
2020-05-23 19:43:32 +02:00
|
|
|
if (essentialsUUIDService != null) {
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(essentialsUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(essentialsUUIDService);
|
2020-05-23 19:43:32 +02:00
|
|
|
}
|
|
|
|
|
2020-06-22 15:45:57 +02:00
|
|
|
final SquirrelIdUUIDService impromptuMojangService =
|
|
|
|
new SquirrelIdUUIDService(Settings.UUID.IMPROMPTU_LIMIT);
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(impromptuMojangService);
|
2020-06-22 15:45:57 +02:00
|
|
|
final SquirrelIdUUIDService backgroundMojangService =
|
|
|
|
new SquirrelIdUUIDService(Settings.UUID.BACKGROUND_LIMIT);
|
2020-07-10 22:12:37 +02:00
|
|
|
this.backgroundPipeline.registerService(backgroundMojangService);
|
2020-05-20 15:12:09 +02:00
|
|
|
} else {
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(sqLiteUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(sqLiteUUIDService);
|
|
|
|
this.impromptuPipeline.registerConsumer(sqLiteUUIDService);
|
|
|
|
this.backgroundPipeline.registerConsumer(sqLiteUUIDService);
|
2020-05-24 04:48:19 +02:00
|
|
|
|
2020-05-24 05:00:36 +02:00
|
|
|
if (legacyUUIDService != null) {
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.registerService(legacyUUIDService);
|
|
|
|
this.backgroundPipeline.registerService(legacyUUIDService);
|
2020-05-24 05:00:36 +02:00
|
|
|
}
|
2020-05-18 00:22:34 +02:00
|
|
|
}
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
this.impromptuPipeline.storeImmediately("*", DBFunc.EVERYONE);
|
2020-07-03 13:50:12 +02:00
|
|
|
|
|
|
|
if (Settings.UUID.BACKGROUND_CACHING_ENABLED) {
|
|
|
|
this.startUuidCaching(sqLiteUUIDService, cacheUUIDService);
|
|
|
|
}
|
2020-05-19 00:28:52 +02:00
|
|
|
|
2020-02-16 20:33:24 +01:00
|
|
|
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
2020-07-10 22:12:37 +02:00
|
|
|
injector.getInstance(Placeholders.class).register();
|
2020-02-20 16:03:17 +01:00
|
|
|
if (Settings.Enabled_Components.EXTERNAL_PLACEHOLDERS) {
|
2020-07-10 22:12:37 +02:00
|
|
|
ChatFormatter.formatters.add(getInjector().getInstance(PlaceholderFormatter.class));
|
2020-02-20 16:03:17 +01:00
|
|
|
}
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] PlotSquared hooked into PlaceholderAPI");
|
2020-02-16 20:33:24 +01:00
|
|
|
} else {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] PlaceholderAPI is not in use. Hook deactivated");
|
2020-02-16 20:33:24 +01:00
|
|
|
}
|
|
|
|
|
2019-05-11 03:18:28 +02:00
|
|
|
this.startMetrics();
|
2018-07-21 17:32:38 +02:00
|
|
|
if (Settings.Enabled_Components.WORLDS) {
|
2020-07-17 16:38:07 +02:00
|
|
|
TaskManager.getPlatformImplementation().taskRepeat(this::unload, TaskTime.seconds(1L));
|
2018-07-21 17:32:38 +02:00
|
|
|
try {
|
2020-07-10 22:12:37 +02:00
|
|
|
singleWorldListener = getInjector().getInstance(SingleWorldListener.class);
|
2018-07-21 17:32:38 +02:00
|
|
|
} catch (Exception e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
|
|
|
}
|
2020-05-10 14:02:25 +02:00
|
|
|
|
2020-06-23 18:36:53 +02:00
|
|
|
// Clean up potential memory leak
|
|
|
|
Bukkit.getScheduler().runTaskTimer(this, () -> {
|
|
|
|
try {
|
|
|
|
for (final PlotPlayer<? extends Player> player : this.getPlayerManager().getPlayers()) {
|
|
|
|
if (player.getPlatformPlayer() == null || !player.getPlatformPlayer().isOnline()) {
|
|
|
|
this.getPlayerManager().removePlayer(player);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} catch (final Exception e) {
|
|
|
|
getLogger().warning("Failed to clean up players: " + e.getMessage());
|
|
|
|
}
|
|
|
|
}, 100L, 100L);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
|
2018-12-21 21:10:37 +01:00
|
|
|
private void unload() {
|
2018-08-10 20:46:38 +02:00
|
|
|
if (!this.methodUnloadSetup) {
|
|
|
|
this.methodUnloadSetup = true;
|
2018-07-21 17:32:38 +02:00
|
|
|
try {
|
|
|
|
ReflectionUtils.RefClass classCraftWorld = getRefClass("{cb}.CraftWorld");
|
2018-08-10 20:46:38 +02:00
|
|
|
this.methodUnloadChunk0 = classCraftWorld.getRealClass()
|
2018-08-10 17:01:10 +02:00
|
|
|
.getDeclaredMethod("unloadChunk0", int.class, int.class, boolean.class);
|
2018-08-10 20:46:38 +02:00
|
|
|
this.methodUnloadChunk0.setAccessible(true);
|
2019-01-16 04:19:29 +01:00
|
|
|
} catch (Throwable event) {
|
|
|
|
event.printStackTrace();
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
}
|
2020-07-10 17:32:07 +02:00
|
|
|
|
|
|
|
if (this.plotAreaManager instanceof SinglePlotAreaManager) {
|
2018-07-21 17:32:38 +02:00
|
|
|
long start = System.currentTimeMillis();
|
2020-07-10 17:32:07 +02:00
|
|
|
final SinglePlotArea area = ((SinglePlotAreaManager) this.plotAreaManager).getArea();
|
2018-08-10 20:46:38 +02:00
|
|
|
|
2018-07-21 17:32:38 +02:00
|
|
|
outer:
|
2018-08-10 20:46:38 +02:00
|
|
|
for (final World world : Bukkit.getWorlds()) {
|
|
|
|
final String name = world.getName();
|
|
|
|
final char char0 = name.charAt(0);
|
|
|
|
if (!Character.isDigit(char0) && char0 != '-') {
|
2018-08-10 17:01:10 +02:00
|
|
|
continue;
|
2018-08-10 20:46:38 +02:00
|
|
|
}
|
|
|
|
|
2018-07-21 17:32:38 +02:00
|
|
|
if (!world.getPlayers().isEmpty()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2019-02-06 06:03:52 +01:00
|
|
|
PlotId id;
|
|
|
|
try {
|
|
|
|
id = PlotId.fromString(name);
|
|
|
|
} catch (IllegalArgumentException ignored) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
final Plot plot = area.getOwnedPlot(id);
|
|
|
|
if (plot != null) {
|
2020-07-19 14:23:55 +02:00
|
|
|
if (!plot.getFlag(ServerPlotFlag.class) || PlotPlayer.wrap(plot.getOwner()) == null) {
|
2019-02-06 06:03:52 +01:00
|
|
|
if (world.getKeepSpawnInMemory()) {
|
|
|
|
world.setKeepSpawnInMemory(false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
final Chunk[] chunks = world.getLoadedChunks();
|
|
|
|
if (chunks.length == 0) {
|
|
|
|
if (!Bukkit.unloadWorld(world, true)) {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.warn("[P2] Failed to unload {}", world.getName());
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
2019-02-06 06:03:52 +01:00
|
|
|
return;
|
|
|
|
} else {
|
|
|
|
int index = 0;
|
|
|
|
do {
|
|
|
|
final Chunk chunkI = chunks[index++];
|
|
|
|
boolean result;
|
|
|
|
if (methodUnloadChunk0 != null) {
|
|
|
|
try {
|
|
|
|
result = (boolean) methodUnloadChunk0
|
|
|
|
.invoke(world, chunkI.getX(), chunkI.getZ(), true);
|
|
|
|
} catch (Throwable e) {
|
|
|
|
methodUnloadChunk0 = null;
|
|
|
|
e.printStackTrace();
|
2018-07-21 17:32:38 +02:00
|
|
|
continue outer;
|
|
|
|
}
|
2019-02-06 06:03:52 +01:00
|
|
|
} else {
|
2019-04-24 00:48:22 +02:00
|
|
|
result = world.unloadChunk(chunkI.getX(), chunkI.getZ(), true);
|
2019-02-06 06:03:52 +01:00
|
|
|
}
|
|
|
|
if (!result) {
|
|
|
|
continue outer;
|
|
|
|
}
|
2019-04-07 17:43:38 +02:00
|
|
|
if (System.currentTimeMillis() - start > 5) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} while (index < chunks.length);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-14 18:49:40 +02:00
|
|
|
private void startUuidCaching(@Nonnull final SQLiteUUIDService sqLiteUUIDService,
|
|
|
|
@Nonnull final CacheUUIDService cacheUUIDService) {
|
2020-05-20 15:12:09 +02:00
|
|
|
// Load all uuids into a big chunky boi queue
|
|
|
|
final Queue<UUID> uuidQueue = new LinkedBlockingQueue<>();
|
|
|
|
PlotSquared.get().forEachPlotRaw(plot -> {
|
|
|
|
final Set<UUID> uuids = new HashSet<>();
|
|
|
|
uuids.add(plot.getOwnerAbs());
|
|
|
|
uuids.addAll(plot.getMembers());
|
|
|
|
uuids.addAll(plot.getTrusted());
|
|
|
|
uuids.addAll(plot.getDenied());
|
|
|
|
for (final UUID uuid : uuids) {
|
|
|
|
if (!uuidQueue.contains(uuid)) {
|
|
|
|
uuidQueue.add(uuid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2020-07-05 13:56:54 +02:00
|
|
|
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) {} UUIDs will be cached", uuidQueue.size());
|
2020-05-20 15:12:09 +02:00
|
|
|
|
|
|
|
Executors.newSingleThreadScheduledExecutor().schedule(() -> {
|
|
|
|
// Begin by reading all the SQLite cache at once
|
|
|
|
cacheUUIDService.accept(sqLiteUUIDService.getAll());
|
|
|
|
// Now fetch names for all known UUIDs
|
|
|
|
final int totalSize = uuidQueue.size();
|
|
|
|
int read = 0;
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) PlotSquared will fetch UUIDs in groups of {}", Settings.UUID.BACKGROUND_LIMIT);
|
2020-05-20 15:12:09 +02:00
|
|
|
final List<UUID> uuidList = new ArrayList<>(Settings.UUID.BACKGROUND_LIMIT);
|
2020-05-21 21:24:55 +02:00
|
|
|
|
|
|
|
// Used to indicate that the second retrieval has been attempted
|
|
|
|
boolean secondRun = false;
|
|
|
|
|
|
|
|
while (!uuidQueue.isEmpty() || !uuidList.isEmpty()) {
|
|
|
|
if (!uuidList.isEmpty() && secondRun) {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.warn("[P2] (UUID) Giving up on last batch. Fetching new batch instead");
|
2020-05-21 21:24:55 +02:00
|
|
|
uuidList.clear();
|
|
|
|
}
|
|
|
|
if (uuidList.isEmpty()) {
|
|
|
|
// Retrieve the secondRun variable to indicate that we're retrieving a
|
|
|
|
// fresh batch
|
|
|
|
secondRun = false;
|
|
|
|
// Populate the request list
|
2020-06-22 15:45:57 +02:00
|
|
|
for (int i = 0;
|
|
|
|
i < Settings.UUID.BACKGROUND_LIMIT && !uuidQueue.isEmpty(); i++) {
|
2020-05-21 21:24:55 +02:00
|
|
|
uuidList.add(uuidQueue.poll());
|
|
|
|
read++;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// If the list isn't empty then this is a second run for
|
|
|
|
// an old batch, so we re-use the patch
|
|
|
|
secondRun = true;
|
2020-05-20 15:12:09 +02:00
|
|
|
}
|
|
|
|
try {
|
|
|
|
PlotSquared.get().getBackgroundUUIDPipeline().getNames(uuidList).get();
|
2020-05-21 21:24:55 +02:00
|
|
|
// Clear the list if we successfully index all the names
|
|
|
|
uuidList.clear();
|
|
|
|
// Print progress
|
|
|
|
final double percentage = ((double) read / (double) totalSize) * 100.0D;
|
2020-07-13 22:51:57 +02:00
|
|
|
if (Settings.DEBUG) {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) PlotSquared has cached {} of UUIDs", String.format("%.1f%%", percentage));
|
2020-07-13 22:51:57 +02:00
|
|
|
}
|
2020-05-20 15:12:09 +02:00
|
|
|
} catch (final InterruptedException | ExecutionException e) {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.error("[P2] (UUID) Failed to retrieve last batch. Will try again", e);
|
2020-05-20 15:12:09 +02:00
|
|
|
}
|
|
|
|
}
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] (UUID) PlotSquared has cached all UUIDs");
|
2020-05-20 15:12:09 +02:00
|
|
|
}, 10, TimeUnit.SECONDS);
|
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public void onDisable() {
|
2018-11-14 14:19:56 +01:00
|
|
|
PlotSquared.get().disable();
|
2018-07-21 17:32:38 +02:00
|
|
|
Bukkit.getScheduler().cancelTasks(this);
|
|
|
|
}
|
|
|
|
|
2020-07-14 18:49:40 +02:00
|
|
|
@Override public void log(@Nonnull String message) {
|
2018-07-21 17:32:38 +02:00
|
|
|
try {
|
2019-02-22 17:51:06 +01:00
|
|
|
message = Captions.color(message);
|
2018-07-21 17:32:38 +02:00
|
|
|
if (!Settings.Chat.CONSOLE_COLOR) {
|
|
|
|
message = ChatColor.stripColor(message);
|
|
|
|
}
|
|
|
|
this.getServer().getConsoleSender().sendMessage(message);
|
2018-08-10 20:46:38 +02:00
|
|
|
} catch (final Throwable ignored) {
|
2018-07-21 17:32:38 +02:00
|
|
|
System.out.println(ConsoleColors.fromString(message));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-12-23 19:43:36 +01:00
|
|
|
@Override public void shutdown() {
|
|
|
|
this.getServer().getPluginManager().disablePlugin(this);
|
|
|
|
}
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
private void registerCommands() {
|
2018-08-10 20:46:38 +02:00
|
|
|
final BukkitCommand bukkitCommand = new BukkitCommand();
|
|
|
|
final PluginCommand plotCommand = getCommand("plots");
|
2019-09-08 20:02:45 +02:00
|
|
|
if (plotCommand != null) {
|
|
|
|
plotCommand.setExecutor(bukkitCommand);
|
|
|
|
plotCommand.setAliases(Arrays.asList("p", "ps", "plotme", "plot"));
|
|
|
|
plotCommand.setTabCompleter(bukkitCommand);
|
|
|
|
}
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public File getDirectory() {
|
2018-07-21 17:32:38 +02:00
|
|
|
return getDataFolder();
|
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public File getWorldContainer() {
|
2018-07-21 17:32:38 +02:00
|
|
|
return Bukkit.getWorldContainer();
|
|
|
|
}
|
|
|
|
|
2020-07-10 22:12:37 +02:00
|
|
|
@SuppressWarnings("deprecation") private void runEntityTask() {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.info("[P2] KillAllEntities started");
|
2020-07-10 17:32:07 +02:00
|
|
|
TaskManager.runTaskRepeat(() -> this.plotAreaManager.forEachPlotArea(plotArea -> {
|
2020-04-02 14:34:38 +02:00
|
|
|
final World world = Bukkit.getWorld(plotArea.getWorldName());
|
2019-02-15 18:50:43 +01:00
|
|
|
try {
|
|
|
|
if (world == null) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
List<Entity> entities = world.getEntities();
|
|
|
|
Iterator<Entity> iterator = entities.iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
|
|
Entity entity = iterator.next();
|
2020-06-29 00:45:40 +02:00
|
|
|
switch (entity.getType().toString()) {
|
|
|
|
case "EGG":
|
|
|
|
case "FISHING_HOOK":
|
|
|
|
case "ENDER_SIGNAL":
|
|
|
|
case "AREA_EFFECT_CLOUD":
|
|
|
|
case "EXPERIENCE_ORB":
|
|
|
|
case "LEASH_HITCH":
|
|
|
|
case "FIREWORK":
|
|
|
|
case "LIGHTNING":
|
|
|
|
case "WITHER_SKULL":
|
|
|
|
case "UNKNOWN":
|
|
|
|
case "PLAYER":
|
2019-02-15 18:50:43 +01:00
|
|
|
// non moving / unmovable
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "THROWN_EXP_BOTTLE":
|
|
|
|
case "SPLASH_POTION":
|
|
|
|
case "SNOWBALL":
|
|
|
|
case "SHULKER_BULLET":
|
|
|
|
case "SPECTRAL_ARROW":
|
|
|
|
case "ENDER_PEARL":
|
|
|
|
case "ARROW":
|
|
|
|
case "LLAMA_SPIT":
|
|
|
|
case "TRIDENT":
|
2019-02-15 18:50:43 +01:00
|
|
|
// managed elsewhere | projectile
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "ITEM_FRAME":
|
|
|
|
case "PAINTING":
|
2019-02-15 18:50:43 +01:00
|
|
|
// Not vehicles
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "ARMOR_STAND":
|
2019-02-15 18:50:43 +01:00
|
|
|
// Temporarily classify as vehicle
|
2020-06-29 00:45:40 +02:00
|
|
|
case "MINECART":
|
|
|
|
case "MINECART_CHEST":
|
|
|
|
case "MINECART_COMMAND":
|
|
|
|
case "MINECART_FURNACE":
|
|
|
|
case "MINECART_HOPPER":
|
|
|
|
case "MINECART_MOB_SPAWNER":
|
|
|
|
case "ENDER_CRYSTAL":
|
|
|
|
case "MINECART_TNT":
|
|
|
|
case "BOAT":
|
2019-02-15 18:50:43 +01:00
|
|
|
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
|
2020-04-30 12:01:52 +02:00
|
|
|
com.plotsquared.core.location.Location location =
|
2020-07-17 22:58:10 +02:00
|
|
|
BukkitUtil.adapt(entity.getLocation());
|
2019-02-15 18:50:43 +01:00
|
|
|
Plot plot = location.getPlot();
|
|
|
|
if (plot == null) {
|
|
|
|
if (location.isPlotArea()) {
|
|
|
|
if (entity.hasMetadata("ps-tmp-teleport")) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
iterator.remove();
|
|
|
|
entity.remove();
|
|
|
|
}
|
2018-12-26 18:21:06 +01:00
|
|
|
continue;
|
2019-02-15 18:50:43 +01:00
|
|
|
}
|
|
|
|
List<MetadataValue> meta = entity.getMetadata("plot");
|
|
|
|
if (meta.isEmpty()) {
|
2018-12-26 18:21:06 +01:00
|
|
|
continue;
|
2019-02-15 18:50:43 +01:00
|
|
|
}
|
|
|
|
Plot origin = (Plot) meta.get(0).value();
|
|
|
|
if (!plot.equals(origin.getBasePlot(false))) {
|
|
|
|
if (entity.hasMetadata("ps-tmp-teleport")) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
iterator.remove();
|
|
|
|
entity.remove();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "SMALL_FIREBALL":
|
|
|
|
case "FIREBALL":
|
|
|
|
case "DRAGON_FIREBALL":
|
|
|
|
case "DROPPED_ITEM":
|
2019-02-15 18:50:43 +01:00
|
|
|
if (Settings.Enabled_Components.KILL_ROAD_ITEMS && plotArea
|
2020-07-17 22:58:10 +02:00
|
|
|
.getOwnedPlotAbs(BukkitUtil.adapt(entity.getLocation()))
|
2019-02-15 18:50:43 +01:00
|
|
|
== null) {
|
|
|
|
entity.remove();
|
|
|
|
}
|
|
|
|
// dropped item
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "PRIMED_TNT":
|
|
|
|
case "FALLING_BLOCK":
|
2019-02-15 18:50:43 +01:00
|
|
|
// managed elsewhere
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "SHULKER":
|
2019-02-15 18:50:43 +01:00
|
|
|
if (Settings.Enabled_Components.KILL_ROAD_MOBS) {
|
|
|
|
LivingEntity livingEntity = (LivingEntity) entity;
|
2019-04-25 03:23:57 +02:00
|
|
|
List<MetadataValue> meta = entity.getMetadata("shulkerPlot");
|
2019-04-23 19:45:24 +02:00
|
|
|
if (!meta.isEmpty()) {
|
2019-02-15 18:50:43 +01:00
|
|
|
if (livingEntity.isLeashed()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
List<MetadataValue> keep = entity.getMetadata("keep");
|
2019-04-23 19:45:24 +02:00
|
|
|
if (!keep.isEmpty()) {
|
2019-02-15 18:50:43 +01:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
PlotId originalPlotId = (PlotId) meta.get(0).value();
|
|
|
|
if (originalPlotId != null) {
|
2020-04-30 12:01:52 +02:00
|
|
|
com.plotsquared.core.location.Location pLoc =
|
2020-07-17 22:58:10 +02:00
|
|
|
BukkitUtil.adapt(entity.getLocation());
|
2019-02-15 18:50:43 +01:00
|
|
|
PlotArea area = pLoc.getPlotArea();
|
|
|
|
if (area != null) {
|
2020-07-18 11:05:16 +02:00
|
|
|
PlotId currentPlotId = area.getPlotAbs(pLoc).getId();
|
2019-02-15 18:50:43 +01:00
|
|
|
if (!originalPlotId.equals(currentPlotId) && (
|
|
|
|
currentPlotId == null || !area
|
|
|
|
.getPlot(originalPlotId)
|
|
|
|
.equals(area.getPlot(currentPlotId)))) {
|
2018-12-26 18:21:06 +01:00
|
|
|
if (entity.hasMetadata("ps-tmp-teleport")) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
iterator.remove();
|
|
|
|
entity.remove();
|
|
|
|
}
|
2018-12-21 21:10:37 +01:00
|
|
|
}
|
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
} else {
|
|
|
|
//This is to apply the metadata to already spawned shulkers (see EntitySpawnListener.java)
|
2020-04-30 12:01:52 +02:00
|
|
|
com.plotsquared.core.location.Location pLoc =
|
2020-07-17 22:58:10 +02:00
|
|
|
BukkitUtil.adapt(entity.getLocation());
|
2019-02-15 18:50:43 +01:00
|
|
|
PlotArea area = pLoc.getPlotArea();
|
|
|
|
if (area != null) {
|
2020-07-18 11:05:16 +02:00
|
|
|
PlotId currentPlotId = area.getPlotAbs(pLoc).getId();
|
2019-02-15 18:50:43 +01:00
|
|
|
if (currentPlotId != null) {
|
2020-04-30 12:01:52 +02:00
|
|
|
entity.setMetadata("shulkerPlot",
|
|
|
|
new FixedMetadataValue(
|
2020-07-07 12:56:43 +02:00
|
|
|
(Plugin) PlotSquared.platform(), currentPlotId));
|
2019-02-15 18:50:43 +01:00
|
|
|
}
|
2018-12-21 21:10:37 +01:00
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
continue;
|
2020-06-29 00:45:40 +02:00
|
|
|
case "ZOMBIFIED_PIGLIN":
|
|
|
|
case "LLAMA":
|
|
|
|
case "DONKEY":
|
|
|
|
case "MULE":
|
|
|
|
case "ZOMBIE_HORSE":
|
|
|
|
case "SKELETON_HORSE":
|
|
|
|
case "HUSK":
|
|
|
|
case "ELDER_GUARDIAN":
|
|
|
|
case "WITHER_SKELETON":
|
|
|
|
case "STRAY":
|
|
|
|
case "ZOMBIE_VILLAGER":
|
|
|
|
case "EVOKER":
|
|
|
|
case "EVOKER_FANGS":
|
|
|
|
case "VEX":
|
|
|
|
case "VINDICATOR":
|
|
|
|
case "POLAR_BEAR":
|
|
|
|
case "BAT":
|
|
|
|
case "BLAZE":
|
|
|
|
case "CAVE_SPIDER":
|
|
|
|
case "CHICKEN":
|
|
|
|
case "COW":
|
|
|
|
case "CREEPER":
|
|
|
|
case "ENDERMAN":
|
|
|
|
case "ENDERMITE":
|
|
|
|
case "ENDER_DRAGON":
|
|
|
|
case "GHAST":
|
|
|
|
case "GIANT":
|
|
|
|
case "GUARDIAN":
|
|
|
|
case "HORSE":
|
|
|
|
case "IRON_GOLEM":
|
|
|
|
case "MAGMA_CUBE":
|
|
|
|
case "MUSHROOM_COW":
|
|
|
|
case "OCELOT":
|
|
|
|
case "PIG":
|
|
|
|
case "PIG_ZOMBIE":
|
|
|
|
case "RABBIT":
|
|
|
|
case "SHEEP":
|
|
|
|
case "SILVERFISH":
|
|
|
|
case "SKELETON":
|
|
|
|
case "SLIME":
|
|
|
|
case "SNOWMAN":
|
|
|
|
case "SPIDER":
|
|
|
|
case "SQUID":
|
|
|
|
case "VILLAGER":
|
|
|
|
case "WITCH":
|
|
|
|
case "WITHER":
|
|
|
|
case "WOLF":
|
|
|
|
case "ZOMBIE":
|
|
|
|
case "PARROT":
|
|
|
|
case "SALMON":
|
|
|
|
case "DOLPHIN":
|
|
|
|
case "TROPICAL_FISH":
|
|
|
|
case "DROWNED":
|
|
|
|
case "COD":
|
|
|
|
case "TURTLE":
|
|
|
|
case "PUFFERFISH":
|
|
|
|
case "PHANTOM":
|
|
|
|
case "ILLUSIONER":
|
|
|
|
case "CAT":
|
|
|
|
case "PANDA":
|
|
|
|
case "FOX":
|
|
|
|
case "PILLAGER":
|
|
|
|
case "TRADER_LLAMA":
|
|
|
|
case "WANDERING_TRADER":
|
|
|
|
case "RAVAGER":
|
|
|
|
case "BEE":
|
|
|
|
case "HOGLIN":
|
|
|
|
case "PIGLIN":
|
|
|
|
case "ZOGLIN":
|
2019-02-15 18:50:43 +01:00
|
|
|
default: {
|
|
|
|
if (Settings.Enabled_Components.KILL_ROAD_MOBS) {
|
|
|
|
Location location = entity.getLocation();
|
2020-07-17 22:58:10 +02:00
|
|
|
if (BukkitUtil.adapt(location).isPlotRoad()) {
|
2019-02-15 18:50:43 +01:00
|
|
|
if (entity instanceof LivingEntity) {
|
2019-02-11 00:03:14 +01:00
|
|
|
LivingEntity livingEntity = (LivingEntity) entity;
|
2019-02-15 18:50:43 +01:00
|
|
|
if (!livingEntity.isLeashed() || !entity
|
|
|
|
.hasMetadata("keep")) {
|
|
|
|
Entity passenger = entity.getPassenger();
|
|
|
|
if (!(passenger instanceof Player) && entity
|
|
|
|
.getMetadata("keep").isEmpty()) {
|
|
|
|
if (entity.hasMetadata("ps-tmp-teleport")) {
|
|
|
|
continue;
|
2019-02-11 00:03:14 +01:00
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
iterator.remove();
|
|
|
|
entity.remove();
|
|
|
|
continue;
|
2019-02-11 00:03:14 +01:00
|
|
|
}
|
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
} else {
|
|
|
|
Entity passenger = entity.getPassenger();
|
|
|
|
if (!(passenger instanceof Player) && entity
|
|
|
|
.getMetadata("keep").isEmpty()) {
|
|
|
|
if (entity.hasMetadata("ps-tmp-teleport")) {
|
|
|
|
continue;
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
iterator.remove();
|
|
|
|
entity.remove();
|
|
|
|
continue;
|
2018-12-21 21:10:37 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
continue;
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
}
|
2018-12-21 21:10:37 +01:00
|
|
|
}
|
2019-02-15 18:50:43 +01:00
|
|
|
} catch (Throwable e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2020-07-15 13:18:09 +02:00
|
|
|
}), TaskTime.seconds(1L));
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
|
2018-11-14 15:44:07 +01:00
|
|
|
@Override @Nullable
|
2020-07-14 18:49:40 +02:00
|
|
|
public final ChunkGenerator getDefaultWorldGenerator(@Nonnull final String worldName,
|
2019-05-17 22:21:03 +02:00
|
|
|
final String id) {
|
2018-11-14 15:44:07 +01:00
|
|
|
final IndependentPlotGenerator result;
|
2018-07-21 17:32:38 +02:00
|
|
|
if (id != null && id.equalsIgnoreCase("single")) {
|
2020-07-10 22:12:37 +02:00
|
|
|
result = getInjector().getInstance(SingleWorldGenerator.class);
|
2018-07-21 17:32:38 +02:00
|
|
|
} else {
|
2020-07-10 22:12:37 +02:00
|
|
|
result = getInjector().getInstance(Key.get(IndependentPlotGenerator.class, DefaultGenerator.class));
|
2019-02-06 06:03:52 +01:00
|
|
|
if (!PlotSquared.get().setupPlotWorld(worldName, id, result)) {
|
2018-07-21 17:32:38 +02:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
2019-02-06 06:03:52 +01:00
|
|
|
return (ChunkGenerator) result.specify(worldName);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
|
2020-07-14 18:49:40 +02:00
|
|
|
@Override @Nullable public GeneratorWrapper<?> getGenerator(@Nonnull final String world,
|
2018-11-14 15:44:07 +01:00
|
|
|
@Nullable final String name) {
|
2018-07-21 17:32:38 +02:00
|
|
|
if (name == null) {
|
|
|
|
return null;
|
|
|
|
}
|
2018-08-10 20:46:38 +02:00
|
|
|
final Plugin genPlugin = Bukkit.getPluginManager().getPlugin(name);
|
2018-07-21 17:32:38 +02:00
|
|
|
if (genPlugin != null && genPlugin.isEnabled()) {
|
|
|
|
ChunkGenerator gen = genPlugin.getDefaultWorldGenerator(world, "");
|
|
|
|
if (gen instanceof GeneratorWrapper<?>) {
|
|
|
|
return (GeneratorWrapper<?>) gen;
|
|
|
|
}
|
2020-07-10 17:32:07 +02:00
|
|
|
return new BukkitPlotGenerator(world, gen, this.plotAreaManager);
|
2018-07-21 17:32:38 +02:00
|
|
|
} else {
|
2020-07-10 22:12:37 +02:00
|
|
|
return new BukkitPlotGenerator(world, getInjector()
|
|
|
|
.getInstance(Key.get(IndependentPlotGenerator.class, DefaultGenerator.class)), this.plotAreaManager);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-22 17:51:06 +01:00
|
|
|
@Override public void startMetrics() {
|
|
|
|
if (this.metricsStarted) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.metricsStarted = true;
|
2020-01-24 16:08:48 +01:00
|
|
|
Metrics metrics = new Metrics(this, BSTATS_ID);// bstats
|
2020-04-11 20:56:34 +02:00
|
|
|
metrics.addCustomChart(new Metrics.DrilldownPie("area_types", () -> {
|
|
|
|
final Map<String, Map<String, Integer>> map = new HashMap<>();
|
|
|
|
for (final PlotAreaType plotAreaType : PlotAreaType.values()) {
|
|
|
|
final Map<String, Integer> terrainTypes = new HashMap<>();
|
|
|
|
for (final PlotAreaTerrainType plotAreaTerrainType : PlotAreaTerrainType.values()) {
|
|
|
|
terrainTypes.put(plotAreaTerrainType.name().toLowerCase(), 0);
|
|
|
|
}
|
|
|
|
map.put(plotAreaType.name().toLowerCase(), terrainTypes);
|
|
|
|
}
|
2020-07-10 17:32:07 +02:00
|
|
|
for (final PlotArea plotArea : this.plotAreaManager.getAllPlotAreas()) {
|
2020-04-30 12:01:52 +02:00
|
|
|
final Map<String, Integer> terrainTypeMap =
|
|
|
|
map.get(plotArea.getType().name().toLowerCase());
|
2020-04-11 20:56:34 +02:00
|
|
|
terrainTypeMap.put(plotArea.getTerrain().name().toLowerCase(),
|
|
|
|
terrainTypeMap.get(plotArea.getTerrain().name().toLowerCase()) + 1);
|
|
|
|
}
|
|
|
|
return map;
|
|
|
|
}));
|
2020-04-21 13:38:07 +02:00
|
|
|
metrics.addCustomChart(new Metrics.SimplePie("premium",
|
|
|
|
() -> PremiumVerification.isPremium() ? "Premium" : "Non-Premium"));
|
2020-05-14 16:33:26 +02:00
|
|
|
metrics.addCustomChart(new Metrics.SimplePie("worldedit_implementation",
|
2020-06-22 15:45:57 +02:00
|
|
|
() -> Bukkit.getPluginManager().getPlugin("FastAsyncWorldEdit") != null ?
|
|
|
|
"FastAsyncWorldEdit" :
|
|
|
|
"WorldEdit"));
|
2019-02-22 17:51:06 +01:00
|
|
|
}
|
|
|
|
|
2020-07-17 22:58:10 +02:00
|
|
|
@Override public void unregister(@Nonnull final PlotPlayer<?> player) {
|
|
|
|
PlotSquared.platform().getPlayerManager().removePlayer(player.getUUID());
|
2019-02-22 17:51:06 +01:00
|
|
|
}
|
|
|
|
|
2020-07-14 18:49:40 +02:00
|
|
|
@Override public void setGenerator(@Nonnull final String worldName) {
|
2018-07-21 17:32:38 +02:00
|
|
|
World world = BukkitUtil.getWorld(worldName);
|
|
|
|
if (world == null) {
|
|
|
|
// create world
|
2020-07-10 19:25:05 +02:00
|
|
|
ConfigurationSection worldConfig = this.worldConfiguration.getConfigurationSection("worlds." + worldName);
|
2018-07-21 17:32:38 +02:00
|
|
|
String manager = worldConfig.getString("generator.plugin", getPluginName());
|
2020-07-10 22:12:37 +02:00
|
|
|
PlotAreaBuilder builder = PlotAreaBuilder.newBuilder().plotManager(manager)
|
2020-06-22 15:45:57 +02:00
|
|
|
.generatorName(worldConfig.getString("generator.init", manager))
|
2020-07-19 14:23:55 +02:00
|
|
|
.plotAreaType(ConfigurationUtil.getType(worldConfig))
|
|
|
|
.terrainType(ConfigurationUtil.getTerrain(worldConfig))
|
2020-06-22 15:45:57 +02:00
|
|
|
.settingsNodesWrapper(new SettingsNodesWrapper(new ConfigurationNode[0], null))
|
|
|
|
.worldName(worldName);
|
2020-07-10 22:12:37 +02:00
|
|
|
getInjector().getInstance(SetupUtils.class).setupWorld(builder);
|
2018-07-21 17:32:38 +02:00
|
|
|
world = Bukkit.getWorld(worldName);
|
|
|
|
} else {
|
|
|
|
try {
|
2020-07-10 17:32:07 +02:00
|
|
|
if (!this.plotAreaManager.hasPlotArea(worldName)) {
|
2018-07-21 17:32:38 +02:00
|
|
|
SetGenCB.setGenerator(BukkitUtil.getWorld(worldName));
|
|
|
|
}
|
2020-07-05 13:56:54 +02:00
|
|
|
} catch (final Exception e) {
|
2020-07-13 23:04:27 +02:00
|
|
|
logger.error("[P2] Failed to reload world: {} | {}", world, e.getMessage());
|
2018-07-21 17:32:38 +02:00
|
|
|
Bukkit.getServer().unloadWorld(world, false);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2019-04-23 19:45:24 +02:00
|
|
|
assert world != null;
|
2018-07-21 17:32:38 +02:00
|
|
|
ChunkGenerator gen = world.getGenerator();
|
|
|
|
if (gen instanceof BukkitPlotGenerator) {
|
2019-02-04 15:24:17 +01:00
|
|
|
PlotSquared.get().loadWorld(worldName, (BukkitPlotGenerator) gen);
|
2018-07-21 17:32:38 +02:00
|
|
|
} else if (gen != null) {
|
2020-07-10 17:32:07 +02:00
|
|
|
PlotSquared.get().loadWorld(worldName, new BukkitPlotGenerator(worldName, gen, this.plotAreaManager));
|
2020-07-10 19:25:05 +02:00
|
|
|
} else if (this.worldConfiguration.contains("worlds." + worldName)) {
|
2018-11-14 14:19:56 +01:00
|
|
|
PlotSquared.get().loadWorld(worldName, null);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-22 15:45:57 +02:00
|
|
|
/**
|
|
|
|
* Attempt to retrieve a {@link PlotPlayer} from a player identifier.
|
|
|
|
* This method accepts:
|
|
|
|
* - {@link Player} objects,
|
|
|
|
* - {@link OfflinePlayer} objects,
|
|
|
|
* - {@link String} usernames for online players, and
|
|
|
|
* - {@link UUID} UUIDs for online players
|
|
|
|
* <p>
|
|
|
|
* In the case of offline players, a fake {@link Player} instance will be created.
|
|
|
|
* This is a rather expensive operation, and should be avoided if possible.
|
|
|
|
*
|
|
|
|
* @param player The player to convert to a PlotPlayer
|
|
|
|
* @return The plot player instance that corresponds to the identifier, or null
|
|
|
|
* if no such player object could be created
|
|
|
|
*/
|
|
|
|
@Override @Nullable public PlotPlayer<Player> wrapPlayer(final Object player) {
|
2018-07-21 17:32:38 +02:00
|
|
|
if (player instanceof Player) {
|
2020-07-17 22:58:10 +02:00
|
|
|
return BukkitUtil.adapt((Player) player);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
if (player instanceof OfflinePlayer) {
|
2020-07-17 22:58:10 +02:00
|
|
|
return BukkitUtil.adapt((OfflinePlayer) player);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
if (player instanceof String) {
|
2020-07-07 12:56:43 +02:00
|
|
|
return (PlotPlayer<Player>) PlotSquared.platform().getPlayerManager()
|
2020-06-22 15:45:57 +02:00
|
|
|
.getPlayerIfExists((String) player);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
if (player instanceof UUID) {
|
2020-07-07 12:56:43 +02:00
|
|
|
return (PlotPlayer<Player>) PlotSquared.platform().getPlayerManager()
|
2020-06-22 15:45:57 +02:00
|
|
|
.getPlayerIfExists((UUID) player);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public String getNMSPackage() {
|
2018-08-10 20:46:38 +02:00
|
|
|
final String name = Bukkit.getServer().getClass().getPackage().getName();
|
2018-07-21 17:32:38 +02:00
|
|
|
return name.substring(name.lastIndexOf('.') + 1);
|
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
@Override public ChatManager<?> initChatManager() {
|
2018-07-21 17:32:38 +02:00
|
|
|
if (Settings.Chat.INTERACTIVE) {
|
|
|
|
return new BukkitChatManager();
|
|
|
|
} else {
|
|
|
|
return new PlainChatManager();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-22 15:45:57 +02:00
|
|
|
@Override public GeneratorWrapper<?> wrapPlotGenerator(@Nullable final String world,
|
2020-07-14 18:49:40 +02:00
|
|
|
@Nonnull final IndependentPlotGenerator generator) {
|
2020-07-10 17:32:07 +02:00
|
|
|
return new BukkitPlotGenerator(world, generator, this.plotAreaManager);
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
|
2019-11-25 23:38:03 +01:00
|
|
|
@Override public List<Map.Entry<Map.Entry<String, String>, Boolean>> getPluginIds() {
|
|
|
|
List<Map.Entry<Map.Entry<String, String>, Boolean>> names = new ArrayList<>();
|
2018-08-10 20:46:38 +02:00
|
|
|
for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
|
2020-04-30 12:01:52 +02:00
|
|
|
Map.Entry<String, String> id = new AbstractMap.SimpleEntry<>(plugin.getName(),
|
|
|
|
plugin.getDescription().getVersion());
|
2019-11-25 23:38:03 +01:00
|
|
|
names.add(new AbstractMap.SimpleEntry<>(id, plugin.isEnabled()));
|
2018-07-21 17:32:38 +02:00
|
|
|
}
|
|
|
|
return names;
|
|
|
|
}
|
2019-11-04 22:55:40 +01:00
|
|
|
|
2020-07-14 18:49:40 +02:00
|
|
|
@Override public com.plotsquared.core.location.World<?> getPlatformWorld(@Nonnull final String worldName) {
|
2020-07-10 12:21:29 +02:00
|
|
|
return BukkitWorld.of(worldName);
|
|
|
|
}
|
|
|
|
|
2018-08-10 17:01:10 +02:00
|
|
|
}
|