Get like 70% of the plugin to work

This commit is contained in:
Josh Roy 2023-03-27 23:31:39 -04:00
parent 15c48d457a
commit 0e4bab24cb
No known key found for this signature in database
GPG Key ID: 86A69D08540BC29A
43 changed files with 155 additions and 717 deletions

View File

@ -192,8 +192,7 @@ public class AsyncTeleport implements IAsyncTeleport {
if (LocationUtil.isBlockUnsafeForUser(ess, teleportee, chunk.getWorld(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())) { if (LocationUtil.isBlockUnsafeForUser(ess, teleportee, chunk.getWorld(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())) {
if (ess.getSettings().isTeleportSafetyEnabled()) { if (ess.getSettings().isTeleportSafetyEnabled()) {
if (ess.getSettings().isForceDisableTeleportSafety()) { if (ess.getSettings().isForceDisableTeleportSafety()) {
//The chunk we're teleporting to is 100% going to be loaded here, no need to teleport async. PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
teleportee.getBase().teleport(loc, cause);
} else { } else {
try { try {
//There's a chance the safer location is outside the loaded chunk so still teleport async here. //There's a chance the safer location is outside the loaded chunk so still teleport async here.
@ -209,8 +208,7 @@ public class AsyncTeleport implements IAsyncTeleport {
} }
} else { } else {
if (ess.getSettings().isForceDisableTeleportSafety()) { if (ess.getSettings().isForceDisableTeleportSafety()) {
//The chunk we're teleporting to is 100% going to be loaded here, no need to teleport async. PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
teleportee.getBase().teleport(loc, cause);
} else { } else {
if (ess.getSettings().isTeleportToCenterLocation()) { if (ess.getSettings().isTeleportToCenterLocation()) {
loc = LocationUtil.getRoundedDestination(loc); loc = LocationUtil.getRoundedDestination(loc);

View File

@ -2,6 +2,7 @@ package com.earth2me.essentials;
import net.ess3.api.IEssentials; import net.ess3.api.IEssentials;
import net.ess3.api.IUser; import net.ess3.api.IUser;
import net.ess3.provider.SchedulingProvider;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
@ -30,7 +31,7 @@ public class AsyncTimedTeleport implements Runnable {
private final boolean timer_canMove; private final boolean timer_canMove;
private final Trade timer_chargeFor; private final Trade timer_chargeFor;
private final TeleportCause timer_cause; private final TeleportCause timer_cause;
private int timer_task; private SchedulingProvider.EssentialsTask timer_task;
private double timer_health; private double timer_health;
AsyncTimedTeleport(final IUser user, final IEssentials ess, final AsyncTeleport teleport, final long delay, final IUser teleportUser, final ITarget target, final Trade chargeFor, final TeleportCause cause, final boolean respawn) { AsyncTimedTeleport(final IUser user, final IEssentials ess, final AsyncTeleport teleport, final long delay, final IUser teleportUser, final ITarget target, final Trade chargeFor, final TeleportCause cause, final boolean respawn) {
@ -54,7 +55,7 @@ public class AsyncTimedTeleport implements Runnable {
this.timer_respawn = respawn; this.timer_respawn = respawn;
this.timer_canMove = user.isAuthorized("essentials.teleport.timer.move"); this.timer_canMove = user.isAuthorized("essentials.teleport.timer.move");
timer_task = ess.runTaskTimerAsynchronously(this, 20, 20).getTaskId(); timer_task = ess.runTaskTimerAsynchronously(this, 20, 20);
if (future != null) { if (future != null) {
this.parentFuture = future; this.parentFuture = future;
@ -141,16 +142,16 @@ public class AsyncTimedTeleport implements Runnable {
} }
} }
ess.scheduleSyncDelayedTask(new DelayedTeleportTask()); ess.scheduleEntityDelayedTask(teleportOwner.getBase(), new DelayedTeleportTask());
} }
//If we need to cancelTimer a pending teleportPlayer call this method //If we need to cancelTimer a pending teleportPlayer call this method
void cancelTimer(final boolean notifyUser) { void cancelTimer(final boolean notifyUser) {
if (timer_task == -1) { if (timer_task == null) {
return; return;
} }
try { try {
ess.getServer().getScheduler().cancelTask(timer_task); timer_task.cancel();
if (notifyUser) { if (notifyUser) {
teleportOwner.sendMessage(tl("pendingTeleportCancelled")); teleportOwner.sendMessage(tl("pendingTeleportCancelled"));
if (timer_teleportee != null && !timer_teleportee.equals(teleportOwner.getBase().getUniqueId())) { if (timer_teleportee != null && !timer_teleportee.equals(teleportOwner.getBase().getUniqueId())) {
@ -158,7 +159,7 @@ public class AsyncTimedTeleport implements Runnable {
} }
} }
} finally { } finally {
timer_task = -1; timer_task = null;
} }
} }
} }

View File

@ -1,6 +1,7 @@
package com.earth2me.essentials; package com.earth2me.essentials;
import net.ess3.api.IEssentials; import net.ess3.api.IEssentials;
import net.ess3.provider.SchedulingProvider;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -18,7 +19,7 @@ public class Backup implements Runnable {
private transient final IEssentials ess; private transient final IEssentials ess;
private final AtomicBoolean pendingShutdown = new AtomicBoolean(false); private final AtomicBoolean pendingShutdown = new AtomicBoolean(false);
private transient boolean running = false; private transient boolean running = false;
private transient int taskId = -1; private transient SchedulingProvider.EssentialsTask task = null;
private transient boolean active = false; private transient boolean active = false;
private transient CompletableFuture<Object> taskLock = null; private transient CompletableFuture<Object> taskLock = null;
@ -36,10 +37,10 @@ public class Backup implements Runnable {
public synchronized void stopTask() { public synchronized void stopTask() {
running = false; running = false;
if (taskId != -1) { if (task != null) {
server.getScheduler().cancelTask(taskId); task.cancel();
} }
taskId = -1; task = null;
} }
private synchronized void startTask() { private synchronized void startTask() {
@ -48,7 +49,7 @@ public class Backup implements Runnable {
if (interval < 1200) { if (interval < 1200) {
return; return;
} }
taskId = ess.scheduleSyncRepeatingTask(this, interval, interval); task = ess.scheduleGlobalRepeatingTask(this, interval, interval);
running = true; running = true;
} }
} }
@ -123,7 +124,7 @@ public class Backup implements Runnable {
} }
if (!pendingShutdown.get()) { if (!pendingShutdown.get()) {
ess.scheduleSyncDelayedTask(new BackupEnableSaveTask()); ess.scheduleGlobalDelayedTask(new BackupEnableSaveTask());
} }
} }
}); });

View File

@ -65,6 +65,7 @@ import net.ess3.provider.MaterialTagProvider;
import net.ess3.provider.PersistentDataProvider; import net.ess3.provider.PersistentDataProvider;
import net.ess3.provider.PotionMetaProvider; import net.ess3.provider.PotionMetaProvider;
import net.ess3.provider.ProviderListener; import net.ess3.provider.ProviderListener;
import net.ess3.provider.SchedulingProvider;
import net.ess3.provider.SerializationProvider; import net.ess3.provider.SerializationProvider;
import net.ess3.provider.ServerStateProvider; import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SignDataProvider; import net.ess3.provider.SignDataProvider;
@ -77,9 +78,11 @@ import net.ess3.provider.providers.BaseLoggerProvider;
import net.ess3.provider.providers.BasePotionDataProvider; import net.ess3.provider.providers.BasePotionDataProvider;
import net.ess3.provider.providers.BlockMetaSpawnerItemProvider; import net.ess3.provider.providers.BlockMetaSpawnerItemProvider;
import net.ess3.provider.providers.BukkitMaterialTagProvider; import net.ess3.provider.providers.BukkitMaterialTagProvider;
import net.ess3.provider.providers.BukkitSchedulingProvider;
import net.ess3.provider.providers.BukkitSpawnerBlockProvider; import net.ess3.provider.providers.BukkitSpawnerBlockProvider;
import net.ess3.provider.providers.FixedHeightWorldInfoProvider; import net.ess3.provider.providers.FixedHeightWorldInfoProvider;
import net.ess3.provider.providers.FlatSpawnEggProvider; import net.ess3.provider.providers.FlatSpawnEggProvider;
import net.ess3.provider.providers.FoliaSchedulingProvider;
import net.ess3.provider.providers.LegacyItemUnbreakableProvider; import net.ess3.provider.providers.LegacyItemUnbreakableProvider;
import net.ess3.provider.providers.LegacyPotionMetaProvider; import net.ess3.provider.providers.LegacyPotionMetaProvider;
import net.ess3.provider.providers.LegacySpawnEggProvider; import net.ess3.provider.providers.LegacySpawnEggProvider;
@ -95,6 +98,7 @@ import net.ess3.provider.providers.PaperSerializationProvider;
import net.ess3.provider.providers.PaperServerStateProvider; import net.ess3.provider.providers.PaperServerStateProvider;
import net.essentialsx.api.v2.services.BalanceTop; import net.essentialsx.api.v2.services.BalanceTop;
import net.essentialsx.api.v2.services.mail.MailService; import net.essentialsx.api.v2.services.mail.MailService;
import org.bukkit.Location;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -104,6 +108,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.command.PluginIdentifiableCommand; import org.bukkit.command.PluginIdentifiableCommand;
import org.bukkit.command.TabCompleter; import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -120,8 +125,6 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.ServicePriority; import org.bukkit.plugin.ServicePriority;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.java.JavaPluginLoader; import org.bukkit.plugin.java.JavaPluginLoader;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -182,6 +185,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
private transient ItemUnbreakableProvider unbreakableProvider; private transient ItemUnbreakableProvider unbreakableProvider;
private transient WorldInfoProvider worldInfoProvider; private transient WorldInfoProvider worldInfoProvider;
private transient SignDataProvider signDataProvider; private transient SignDataProvider signDataProvider;
private transient SchedulingProvider schedulingProvider;
private transient Kits kits; private transient Kits kits;
private transient RandomTeleport randomTeleport; private transient RandomTeleport randomTeleport;
private transient UpdateChecker updateChecker; private transient UpdateChecker updateChecker;
@ -358,6 +362,12 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
confList.add(jails); confList.add(jails);
execTimer.mark("Init(Jails)"); execTimer.mark("Init(Jails)");
if (VersionUtil.FOLIA) {
schedulingProvider = new FoliaSchedulingProvider(this);
} else {
schedulingProvider = new BukkitSchedulingProvider(this);
}
EconomyLayers.onEnable(this); EconomyLayers.onEnable(this);
//Spawner item provider only uses one but it's here for legacy... //Spawner item provider only uses one but it's here for legacy...
@ -464,7 +474,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
alternativeCommandsHandler = new AlternativeCommandsHandler(this); alternativeCommandsHandler = new AlternativeCommandsHandler(this);
timer = new EssentialsTimer(this); timer = new EssentialsTimer(this);
scheduleSyncRepeatingTask(timer, 1000, 50); scheduleGlobalRepeatingTask(timer, 1000, 50);
Economy.setEss(this); Economy.setEss(this);
execTimer.mark("RegHandler"); execTimer.mark("RegHandler");
@ -881,11 +891,6 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
} }
} }
@Override
public BukkitScheduler getScheduler() {
return this.getServer().getScheduler();
}
@Override @Override
public IJails getJails() { public IJails getJails() {
return jails; return jails;
@ -1164,33 +1169,63 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials {
} }
@Override @Override
public BukkitTask runTaskAsynchronously(final Runnable run) { public void scheduleInitTask(Runnable runnable) {
return this.getScheduler().runTaskAsynchronously(this, run); schedulingProvider.registerInitTask(runnable);
} }
@Override @Override
public BukkitTask runTaskLaterAsynchronously(final Runnable run, final long delay) { public void runTaskAsynchronously(final Runnable run) {
return this.getScheduler().runTaskLaterAsynchronously(this, run, delay); schedulingProvider.runAsyncTask(run);
} }
@Override @Override
public BukkitTask runTaskTimerAsynchronously(final Runnable run, final long delay, final long period) { public void runTaskLaterAsynchronously(final Runnable run, final long delay) {
return this.getScheduler().runTaskTimerAsynchronously(this, run, delay, period); schedulingProvider.runAsyncTaskLater(run, delay);
} }
@Override @Override
public int scheduleSyncDelayedTask(final Runnable run) { public SchedulingProvider.EssentialsTask runTaskTimerAsynchronously(final Runnable run, final long delay, final long period) {
return this.getScheduler().scheduleSyncDelayedTask(this, run); return schedulingProvider.runAsyncTaskRepeating(run, delay, period);
} }
@Override @Override
public int scheduleSyncDelayedTask(final Runnable run, final long delay) { public void scheduleEntityDelayedTask(Entity entity, Runnable run) {
return this.getScheduler().scheduleSyncDelayedTask(this, run, delay); schedulingProvider.runEntityTask(entity, run);
} }
@Override @Override
public int scheduleSyncRepeatingTask(final Runnable run, final long delay, final long period) { public SchedulingProvider.EssentialsTask scheduleEntityDelayedTask(Entity entity, Runnable run, long delay) {
return this.getScheduler().scheduleSyncRepeatingTask(this, run, delay, period); return schedulingProvider.runEntityTask(entity, run, delay);
}
@Override
public SchedulingProvider.EssentialsTask scheduleEntityRepeatingTask(Entity entity, Runnable run, long delay, long period) {
return schedulingProvider.runEntityTaskRepeating(entity, run, delay, period);
}
@Override
public void scheduleLocationDelayedTask(Location location, Runnable run) {
schedulingProvider.runLocationalTask(location, run);
}
@Override
public void scheduleLocationDelayedTask(Location location, Runnable run, long delay) {
schedulingProvider.runLocationalTask(location, run, delay);
}
@Override
public SchedulingProvider.EssentialsTask scheduleLocationRepeatingTask(Location location, Runnable run, long delay, long period) {
return schedulingProvider.runLocationalTaskRepeating(location, run, delay, period);
}
@Override
public void scheduleGlobalDelayedTask(Runnable run, long delay) {
schedulingProvider.runGlobalLocationalTask(run, delay);
}
@Override
public SchedulingProvider.EssentialsTask scheduleGlobalRepeatingTask(Runnable run, long delay, long period) {
return schedulingProvider.runGlobalLocationalTaskRepeating(run, delay, period);
} }
@Override @Override

View File

@ -42,7 +42,7 @@ public class EssentialsBlockListener implements Listener {
final User user = ess.getUser(event.getPlayer()); final User user = ess.getUser(event.getPlayer());
if (user.hasUnlimited(is) && user.getBase().getGameMode() == GameMode.SURVIVAL) { if (user.hasUnlimited(is) && user.getBase().getGameMode() == GameMode.SURVIVAL) {
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(user.getBase(), () -> {
if (is != null && is.getType() != null && !MaterialUtil.isAir(is.getType())) { if (is != null && is.getType() != null && !MaterialUtil.isAir(is.getType())) {
final ItemStack cloneIs = is.clone(); final ItemStack cloneIs = is.clone();
cloneIs.setAmount(1); cloneIs.setAmount(1);

View File

@ -112,7 +112,7 @@ public class EssentialsEntityListener implements Listener {
} }
} }
ess.scheduleSyncDelayedTask(new PowerToolInteractTask()); ess.scheduleEntityDelayedTask(attacker.getBase(), new PowerToolInteractTask());
event.setCancelled(true); event.setCancelled(true);
return; return;

View File

@ -15,6 +15,7 @@ import io.papermc.lib.PaperLib;
import net.ess3.api.IEssentials; import net.ess3.api.IEssentials;
import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.AfkStatusChangeEvent;
import net.ess3.provider.CommandSendListenerProvider; import net.ess3.provider.CommandSendListenerProvider;
import net.ess3.provider.SchedulingProvider;
import net.ess3.provider.providers.BukkitCommandSendListenerProvider; import net.ess3.provider.providers.BukkitCommandSendListenerProvider;
import net.ess3.provider.providers.PaperCommandSendListenerProvider; import net.ess3.provider.providers.PaperCommandSendListenerProvider;
import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent; import net.essentialsx.api.v2.events.AsyncUserDataLoadEvent;
@ -79,7 +80,7 @@ import static com.earth2me.essentials.I18n.tl;
public class EssentialsPlayerListener implements Listener, FakeAccessor { public class EssentialsPlayerListener implements Listener, FakeAccessor {
private final transient IEssentials ess; private final transient IEssentials ess;
private final ConcurrentHashMap<UUID, Integer> pendingMotdTasks = new ConcurrentHashMap<>(); private final ConcurrentHashMap<UUID, SchedulingProvider.EssentialsTask> pendingMotdTasks = new ConcurrentHashMap<>();
public EssentialsPlayerListener(final IEssentials parent) { public EssentialsPlayerListener(final IEssentials parent) {
this.ess = parent; this.ess = parent;
@ -245,9 +246,9 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
public void onPlayerQuit(final PlayerQuitEvent event) { public void onPlayerQuit(final PlayerQuitEvent event) {
final User user = ess.getUser(event.getPlayer()); final User user = ess.getUser(event.getPlayer());
final Integer pendingId = pendingMotdTasks.remove(user.getUUID()); final SchedulingProvider.EssentialsTask pendingTask = pendingMotdTasks.remove(user.getUUID());
if (pendingId != null) { if (pendingTask != null) {
ess.getScheduler().cancelTask(pendingId); pendingTask.cancel();
} }
if (hideJoinQuitMessages() || (ess.getSettings().allowSilentJoinQuit() && user.isAuthorized("essentials.silentquit"))) { if (hideJoinQuitMessages() || (ess.getSettings().allowSilentJoinQuit() && user.isAuthorized("essentials.silentquit"))) {
@ -401,7 +402,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
final int motdDelay = ess.getSettings().getMotdDelay() / 50; final int motdDelay = ess.getSettings().getMotdDelay() / 50;
final DelayMotdTask motdTask = new DelayMotdTask(user); final DelayMotdTask motdTask = new DelayMotdTask(user);
if (motdDelay > 0) { if (motdDelay > 0) {
pendingMotdTasks.put(user.getUUID(), ess.scheduleSyncDelayedTask(motdTask, motdDelay)); pendingMotdTasks.put(user.getUUID(), ess.scheduleEntityDelayedTask(user.getBase(), motdTask, motdDelay));
} else { } else {
motdTask.run(); motdTask.run();
} }
@ -493,7 +494,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
} }
} }
ess.scheduleSyncDelayedTask(new DelayJoinTask()); ess.scheduleEntityDelayedTask(player, new DelayJoinTask());
} }
// Makes the compass item ingame always point to the first essentials home. #EasterEgg // Makes the compass item ingame always point to the first essentials home. #EasterEgg
@ -579,7 +580,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
final User user = ess.getUser(event.getPlayer()); final User user = ess.getUser(event.getPlayer());
if (user.hasUnlimited(new ItemStack(event.getBucket()))) { if (user.hasUnlimited(new ItemStack(event.getBucket()))) {
event.getItemStack().setType(event.getBucket()); event.getItemStack().setType(event.getBucket());
ess.scheduleSyncDelayedTask(user.getBase()::updateInventory); ess.scheduleEntityDelayedTask(user.getBase(), user.getBase()::updateInventory);
} }
} }
@ -824,7 +825,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
} }
} }
ess.scheduleSyncDelayedTask(new DelayedClickJumpTask()); ess.scheduleEntityDelayedTask(user.getBase(), new DelayedClickJumpTask());
} catch (final Exception ex) { } catch (final Exception ex) {
if (ess.getSettings().isDebug()) { if (ess.getSettings().isDebug()) {
ess.getLogger().log(Level.WARNING, ex.getMessage(), ex); ess.getLogger().log(Level.WARNING, ex.getMessage(), ex);
@ -855,7 +856,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
} }
} }
ess.scheduleSyncDelayedTask(new PowerToolUseTask()); ess.scheduleEntityDelayedTask(user.getBase(), new PowerToolUseTask());
} }
} }
@ -916,7 +917,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
} }
if (refreshPlayer != null) { if (refreshPlayer != null) {
ess.scheduleSyncDelayedTask(refreshPlayer::updateInventory, 1); ess.scheduleEntityDelayedTask(refreshPlayer, refreshPlayer::updateInventory, 1);
} }
} }
@ -958,7 +959,7 @@ public class EssentialsPlayerListener implements Listener, FakeAccessor {
} }
if (refreshPlayer != null) { if (refreshPlayer != null) {
ess.scheduleSyncDelayedTask(refreshPlayer::updateInventory, 1); ess.scheduleEntityDelayedTask(refreshPlayer, refreshPlayer::updateInventory, 1);
} }
} }

View File

@ -5,7 +5,6 @@ import org.bukkit.entity.Player;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.logging.Level; import java.util.logging.Level;
@ -13,36 +12,19 @@ import java.util.logging.Level;
public class EssentialsTimer implements Runnable { public class EssentialsTimer implements Runnable {
private final transient IEssentials ess; private final transient IEssentials ess;
private final transient Set<UUID> onlineUsers = new HashSet<>(); // Field is necessary for hidden users private final transient Set<UUID> onlineUsers = new HashSet<>(); // Field is necessary for hidden users
private final LinkedList<Double> history = new LinkedList<>(); private static final long maxTime = 10 * 1000000;
@SuppressWarnings("FieldCanBeLocal")
private final long maxTime = 10 * 1000000;
@SuppressWarnings("FieldCanBeLocal")
private final long tickInterval = 50;
private transient long lastPoll = System.nanoTime();
private int skip1 = 0; private int skip1 = 0;
private int skip2 = 0; private int skip2 = 0;
EssentialsTimer(final IEssentials ess) { EssentialsTimer(final IEssentials ess) {
this.ess = ess; this.ess = ess;
history.add(20d);
} }
@Override @Override
public void run() { public void run() {
final long startTime = System.nanoTime(); final long startTime = System.nanoTime();
final long currentTime = System.currentTimeMillis(); final long currentTime = System.currentTimeMillis();
long timeSpent = (startTime - lastPoll) / 1000;
if (timeSpent == 0) {
timeSpent = 1;
}
if (history.size() > 10) {
history.remove();
}
final double tps = tickInterval * 1000000.0 / timeSpent;
if (tps <= 21) {
history.add(tps);
}
lastPoll = startTime;
int count = 0; int count = 0;
onlineUsers.clear(); onlineUsers.clear();
for (final Player player : ess.getOnlinePlayers()) { for (final Player player : ess.getOnlinePlayers()) {
@ -99,14 +81,4 @@ public class EssentialsTimer implements Runnable {
user.resetInvulnerabilityAfterTeleport(); user.resetInvulnerabilityAfterTeleport();
} }
} }
public double getAverageTPS() {
double avg = 0;
for (final Double f : history) {
if (f != null) {
avg += f;
}
}
return avg / history.size();
}
} }

View File

@ -15,6 +15,7 @@ import net.ess3.provider.ItemUnbreakableProvider;
import net.ess3.provider.KnownCommandsProvider; import net.ess3.provider.KnownCommandsProvider;
import net.ess3.provider.MaterialTagProvider; import net.ess3.provider.MaterialTagProvider;
import net.ess3.provider.PersistentDataProvider; import net.ess3.provider.PersistentDataProvider;
import net.ess3.provider.SchedulingProvider;
import net.ess3.provider.SerializationProvider; import net.ess3.provider.SerializationProvider;
import net.ess3.provider.ServerStateProvider; import net.ess3.provider.ServerStateProvider;
import net.ess3.provider.SignDataProvider; import net.ess3.provider.SignDataProvider;
@ -24,15 +25,15 @@ import net.ess3.provider.SyncCommandsProvider;
import net.ess3.provider.WorldInfoProvider; import net.ess3.provider.WorldInfoProvider;
import net.essentialsx.api.v2.services.BalanceTop; import net.essentialsx.api.v2.services.BalanceTop;
import net.essentialsx.api.v2.services.mail.MailService; import net.essentialsx.api.v2.services.mail.MailService;
import org.bukkit.Location;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand; import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -82,8 +83,6 @@ public interface IEssentials extends Plugin {
ISettings getSettings(); ISettings getSettings();
BukkitScheduler getScheduler();
IJails getJails(); IJails getJails();
IWarps getWarps(); IWarps getWarps();
@ -98,17 +97,33 @@ public interface IEssentials extends Plugin {
UpdateChecker getUpdateChecker(); UpdateChecker getUpdateChecker();
BukkitTask runTaskAsynchronously(Runnable run); void runTaskAsynchronously(Runnable run);
BukkitTask runTaskLaterAsynchronously(Runnable run, long delay); void runTaskLaterAsynchronously(Runnable run, long delay);
BukkitTask runTaskTimerAsynchronously(Runnable run, long delay, long period); SchedulingProvider.EssentialsTask runTaskTimerAsynchronously(Runnable run, long delay, long period);
int scheduleSyncDelayedTask(Runnable run); void scheduleEntityDelayedTask(Entity entity, Runnable run);
int scheduleSyncDelayedTask(Runnable run, long delay); SchedulingProvider.EssentialsTask scheduleEntityDelayedTask(Entity entity, Runnable run, long delay);
int scheduleSyncRepeatingTask(Runnable run, long delay, long period); SchedulingProvider.EssentialsTask scheduleEntityRepeatingTask(Entity entity, Runnable run, long delay, long period);
void scheduleLocationDelayedTask(Location location, Runnable run);
void scheduleLocationDelayedTask(Location location, Runnable run, long delay);
SchedulingProvider.EssentialsTask scheduleLocationRepeatingTask(Location location, Runnable run, long delay, long period);
default void scheduleGlobalDelayedTask(Runnable run) {
scheduleGlobalDelayedTask(run, 1);
}
void scheduleGlobalDelayedTask(Runnable run, long delay);
SchedulingProvider.EssentialsTask scheduleGlobalRepeatingTask(Runnable run, long delay, long period);
void scheduleInitTask(Runnable runnable);
PermissionsHandler getPermissionsHandler(); PermissionsHandler getPermissionsHandler();

View File

@ -3,7 +3,6 @@ package com.earth2me.essentials;
import com.earth2me.essentials.api.IAsyncTeleport; import com.earth2me.essentials.api.IAsyncTeleport;
import com.earth2me.essentials.commands.IEssentialsCommand; import com.earth2me.essentials.commands.IEssentialsCommand;
import com.earth2me.essentials.config.entities.CommandCooldown; import com.earth2me.essentials.config.entities.CommandCooldown;
import net.ess3.api.ITeleport;
import net.ess3.api.MaxMoneyException; import net.ess3.api.MaxMoneyException;
import net.ess3.api.events.AfkStatusChangeEvent; import net.ess3.api.events.AfkStatusChangeEvent;
import net.essentialsx.api.v2.services.mail.MailMessage; import net.essentialsx.api.v2.services.mail.MailMessage;
@ -15,7 +14,6 @@ import org.bukkit.entity.Player;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -71,12 +69,6 @@ public interface IUser {
@Deprecated @Deprecated
boolean hasOutstandingTeleportRequest(); boolean hasOutstandingTeleportRequest();
/**
* @deprecated This API is not asynchronous. Use {@link com.earth2me.essentials.api.IAsyncTeleport IAsyncTeleport} with {@link IUser#getAsyncTeleport()}
*/
@Deprecated
ITeleport getTeleport();
IAsyncTeleport getAsyncTeleport(); IAsyncTeleport getAsyncTeleport();
BigDecimal getMoney(); BigDecimal getMoney();

View File

@ -140,28 +140,6 @@ public class Jails implements net.ess3.api.IJails {
} }
} }
/**
* @deprecated This method does not use asynchronous teleportation. Use {@link Jails#sendToJail(IUser, String, CompletableFuture)}
*/
@SuppressWarnings("deprecation")
@Override
@Deprecated
public void sendToJail(final IUser user, String jail) throws Exception {
if (jail == null || jail.isEmpty()) {
return;
}
jail = jail.toLowerCase(Locale.ENGLISH);
synchronized (jails) {
if (jails.containsKey(jail)) {
if (user.getBase().isOnline()) {
user.getTeleport().now(getJail(jail), false, TeleportCause.COMMAND);
}
user.setJail(jail);
}
}
}
@Override @Override
public void sendToJail(final IUser user, final String jailName, final CompletableFuture<Boolean> future) throws Exception { public void sendToJail(final IUser user, final String jailName, final CompletableFuture<Boolean> future) throws Exception {
if (jailName == null || jailName.isEmpty()) { if (jailName == null || jailName.isEmpty()) {

View File

@ -124,7 +124,7 @@ public class RandomTeleport implements IConf {
// Prompts caching random valid locations, up to a maximum number of attempts // Prompts caching random valid locations, up to a maximum number of attempts
public void cacheRandomLocations(final Location center, final double minRange, final double maxRange) { public void cacheRandomLocations(final Location center, final double minRange, final double maxRange) {
ess.getServer().getScheduler().scheduleSyncDelayedTask(ess, () -> { ess.scheduleLocationDelayedTask(center, () -> {
for (int i = 0; i < this.getFindAttempts(); ++i) { for (int i = 0; i < this.getFindAttempts(); ++i) {
calculateRandomLocation(center, minRange, maxRange).thenAccept(location -> { calculateRandomLocation(center, minRange, maxRange).thenAccept(location -> {
if (isValidRandomLocation(location)) { if (isValidRandomLocation(location)) {

View File

@ -708,7 +708,7 @@ public class Settings implements net.ess3.api.ISettings {
// This is 2 because Settings are reloaded twice in the startup lifecycle // This is 2 because Settings are reloaded twice in the startup lifecycle
if (reloadCount.get() < 2) { if (reloadCount.get() < 2) {
ess.scheduleSyncDelayedTask(() -> _addAlternativeCommand(effectiveAlias, toDisable)); ess.scheduleGlobalDelayedTask(() -> _addAlternativeCommand(effectiveAlias, toDisable));
} else { } else {
_addAlternativeCommand(effectiveAlias, toDisable); _addAlternativeCommand(effectiveAlias, toDisable);
} }
@ -721,7 +721,7 @@ public class Settings implements net.ess3.api.ISettings {
ess.getLogger().log(Level.INFO, "Syncing commands"); ess.getLogger().log(Level.INFO, "Syncing commands");
} }
if (reloadCount.get() < 2) { if (reloadCount.get() < 2) {
ess.scheduleSyncDelayedTask(() -> ess.getSyncCommandsProvider().syncCommands()); ess.scheduleGlobalDelayedTask(() -> ess.getSyncCommandsProvider().syncCommands());
} else { } else {
ess.getSyncCommandsProvider().syncCommands(); ess.getSyncCommandsProvider().syncCommands();
} }

View File

@ -1,403 +0,0 @@
package com.earth2me.essentials;
import com.earth2me.essentials.utils.DateUtil;
import com.earth2me.essentials.utils.LocationUtil;
import io.papermc.lib.PaperLib;
import net.ess3.api.IEssentials;
import net.ess3.api.ITeleport;
import net.ess3.api.IUser;
import net.ess3.api.events.UserWarpEvent;
import net.ess3.api.events.teleport.PreTeleportEvent;
import net.ess3.api.events.teleport.TeleportWarmupEvent;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.GregorianCalendar;
import static com.earth2me.essentials.I18n.tl;
/**
* @deprecated This API is not asynchronous. Use {@link com.earth2me.essentials.AsyncTeleport AsyncTeleport}
*/
@Deprecated
public class Teleport implements ITeleport {
private final IUser teleportOwner;
private final IEssentials ess;
private TimedTeleport timedTeleport;
private TeleportType tpType;
@Deprecated
public Teleport(final IUser user, final IEssentials ess) {
this.teleportOwner = user;
this.ess = ess;
tpType = TeleportType.NORMAL;
}
@Deprecated
public void cooldown(final boolean check) throws Exception {
final Calendar time = new GregorianCalendar();
if (teleportOwner.getLastTeleportTimestamp() > 0) {
// Take the current time, and remove the delay from it.
final double cooldown = ess.getSettings().getTeleportCooldown();
final Calendar earliestTime = new GregorianCalendar();
earliestTime.add(Calendar.SECOND, -(int) cooldown);
earliestTime.add(Calendar.MILLISECOND, -(int) ((cooldown * 1000.0) % 1000.0));
// This value contains the most recent time a teleportPlayer could have been used that would allow another use.
final long earliestLong = earliestTime.getTimeInMillis();
// When was the last teleportPlayer used?
final long lastTime = teleportOwner.getLastTeleportTimestamp();
if (lastTime > time.getTimeInMillis()) {
// This is to make sure time didn't get messed up on last teleportPlayer use.
// If this happens, let's give the user the benifit of the doubt.
teleportOwner.setLastTeleportTimestamp(time.getTimeInMillis());
return;
} else if (lastTime > earliestLong
&& cooldownApplies()) {
time.setTimeInMillis(lastTime);
time.add(Calendar.SECOND, (int) cooldown);
time.add(Calendar.MILLISECOND, (int) ((cooldown * 1000.0) % 1000.0));
throw new Exception(tl("timeBeforeTeleport", DateUtil.formatDateDiff(time.getTimeInMillis())));
}
}
// if justCheck is set, don't update lastTeleport; we're just checking
if (!check) {
teleportOwner.setLastTeleportTimestamp(time.getTimeInMillis());
}
}
@Deprecated
private boolean cooldownApplies() {
boolean applies = true;
final String globalBypassPerm = "essentials.teleport.cooldown.bypass";
switch (tpType) {
case NORMAL:
applies = !teleportOwner.isAuthorized(globalBypassPerm);
break;
case BACK:
applies = !(teleportOwner.isAuthorized(globalBypassPerm) &&
teleportOwner.isAuthorized("essentials.teleport.cooldown.bypass.back"));
break;
case TPA:
applies = !(teleportOwner.isAuthorized(globalBypassPerm) &&
teleportOwner.isAuthorized("essentials.teleport.cooldown.bypass.tpa"));
break;
}
return applies;
}
@Deprecated
private void warnUser(final IUser user, final double delay) {
final Calendar c = new GregorianCalendar();
c.add(Calendar.SECOND, (int) delay);
c.add(Calendar.MILLISECOND, (int) ((delay * 1000.0) % 1000.0));
user.sendMessage(tl("dontMoveMessage", DateUtil.formatDateDiff(c.getTimeInMillis())));
}
//The now function is used when you want to skip tp delay when teleporting someone to a location or player.
@Override
@Deprecated
public void now(final Location loc, final boolean cooldown, final TeleportCause cause) throws Exception {
if (cooldown) {
cooldown(false);
}
final ITarget target = new LocationTarget(loc);
now(teleportOwner, target, cause);
}
@Override
@Deprecated
public void now(final Player entity, final boolean cooldown, final TeleportCause cause) throws Exception {
if (cooldown) {
cooldown(false);
}
final ITarget target = new PlayerTarget(entity);
now(teleportOwner, target, cause);
teleportOwner.sendMessage(tl("teleporting", target.getLocation().getWorld().getName(), target.getLocation().getBlockX(), target.getLocation().getBlockY(), target.getLocation().getBlockZ()));
}
@Deprecated
protected void now(final IUser teleportee, final ITarget target, final TeleportCause cause) throws Exception {
cancel(false);
Location loc = target.getLocation();
final PreTeleportEvent event = new PreTeleportEvent(teleportee, cause, target);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
if (teleportee.isAuthorized("essentials.back.onteleport")) {
teleportee.setLastLocation();
}
if (!teleportee.getBase().isEmpty()) {
if (!ess.getSettings().isTeleportPassengerDismount()) {
throw new Exception(tl("passengerTeleportFail"));
}
teleportee.getBase().eject();
}
if (LocationUtil.isBlockUnsafeForUser(ess, teleportee, loc.getWorld(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ())) {
if (ess.getSettings().isTeleportSafetyEnabled()) {
if (ess.getSettings().isForceDisableTeleportSafety()) {
PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
} else {
PaperLib.teleportAsync(teleportee.getBase(), LocationUtil.getSafeDestination(ess, teleportee, loc), cause);
}
} else {
throw new Exception(tl("unsafeTeleportDestination", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
}
} else {
if (ess.getSettings().isForceDisableTeleportSafety()) {
PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
} else {
if (ess.getSettings().isTeleportToCenterLocation()) {
loc = LocationUtil.getRoundedDestination(loc);
}
PaperLib.teleportAsync(teleportee.getBase(), loc, cause);
}
}
}
//The teleportPlayer function is used when you want to normally teleportPlayer someone to a location or player.
//This method is nolonger used internally and will be removed.
@Deprecated
@Override
public void teleport(final Location loc, final Trade chargeFor) throws Exception {
teleport(loc, chargeFor, TeleportCause.PLUGIN);
}
@Override
@Deprecated
public void teleport(final Location loc, final Trade chargeFor, final TeleportCause cause) throws Exception {
teleport(teleportOwner, new LocationTarget(loc), chargeFor, cause);
}
//This is used when teleporting to a player
@Override
@Deprecated
public void teleport(final Player entity, final Trade chargeFor, final TeleportCause cause) throws Exception {
final ITarget target = new PlayerTarget(entity);
teleportOwner.sendMessage(tl("teleportToPlayer", entity.getDisplayName()));
teleport(teleportOwner, target, chargeFor, cause);
}
//This is used when teleporting to stored location
@Override
@Deprecated
public void teleportPlayer(final IUser teleportee, final Location loc, final Trade chargeFor, final TeleportCause cause) throws Exception {
teleport(teleportee, new LocationTarget(loc), chargeFor, cause);
}
//This is used on /tphere
@Override
@Deprecated
public void teleportPlayer(final IUser teleportee, final Player entity, final Trade chargeFor, final TeleportCause cause) throws Exception {
final ITarget target = new PlayerTarget(entity);
teleport(teleportee, target, chargeFor, cause);
teleportee.sendMessage(tl("teleporting", target.getLocation().getWorld().getName(), target.getLocation().getBlockX(), target.getLocation().getBlockY(), target.getLocation().getBlockZ()));
teleportOwner.sendMessage(tl("teleporting", target.getLocation().getWorld().getName(), target.getLocation().getBlockX(), target.getLocation().getBlockY(), target.getLocation().getBlockZ()));
}
@Deprecated
private void teleport(final IUser teleportee, final ITarget target, final Trade chargeFor, final TeleportCause cause) throws Exception {
double delay = ess.getSettings().getTeleportDelay();
final TeleportWarmupEvent event = new TeleportWarmupEvent(teleportee, cause, target, delay);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
delay = event.getDelay();
Trade cashCharge = chargeFor;
if (chargeFor != null) {
chargeFor.isAffordableFor(teleportOwner);
//This code is to make sure that commandcosts are checked in the initial world, and not in the resulting world.
if (!chargeFor.getCommandCost(teleportOwner).equals(BigDecimal.ZERO)) {
//By converting a command cost to a regular cost, the command cost permission isn't checked when executing the charge after teleport.
cashCharge = new Trade(chargeFor.getCommandCost(teleportOwner), ess);
}
}
cooldown(true);
if (delay <= 0 || teleportOwner.isAuthorized("essentials.teleport.timer.bypass") || teleportee.isAuthorized("essentials.teleport.timer.bypass")) {
cooldown(false);
now(teleportee, target, cause);
if (cashCharge != null) {
cashCharge.charge(teleportOwner);
}
return;
}
cancel(false);
warnUser(teleportee, delay);
initTimer((long) (delay * 1000.0), teleportee, target, cashCharge, cause, false);
}
@Deprecated
private void teleportOther(final IUser teleporter, final IUser teleportee, final ITarget target, final Trade chargeFor, final TeleportCause cause) throws Exception {
double delay = ess.getSettings().getTeleportDelay();
final TeleportWarmupEvent event = new TeleportWarmupEvent(teleporter, teleportee, cause, target, delay);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
delay = event.getDelay();
Trade cashCharge = chargeFor;
if (teleporter != null && chargeFor != null) {
chargeFor.isAffordableFor(teleporter);
//This code is to make sure that commandcosts are checked in the initial world, and not in the resulting world.
if (!chargeFor.getCommandCost(teleporter).equals(BigDecimal.ZERO)) {
//By converting a command cost to a regular cost, the command cost permission isn't checked when executing the charge after teleport.
cashCharge = new Trade(chargeFor.getCommandCost(teleporter), ess);
}
}
cooldown(true);
if (delay <= 0 || teleporter == null
|| teleporter.isAuthorized("essentials.teleport.timer.bypass")
|| teleportOwner.isAuthorized("essentials.teleport.timer.bypass")
|| teleportee.isAuthorized("essentials.teleport.timer.bypass")) {
cooldown(false);
now(teleportee, target, cause);
if (teleporter != null && cashCharge != null) {
cashCharge.charge(teleporter);
}
return;
}
cancel(false);
warnUser(teleportee, delay);
initTimer((long) (delay * 1000.0), teleportee, target, cashCharge, cause, false);
}
//The respawn function is a wrapper used to handle tp fallback, on /jail and /home
@Override
@Deprecated
public void respawn(final Trade chargeFor, final TeleportCause cause) throws Exception {
double delay = ess.getSettings().getTeleportDelay();
final TeleportWarmupEvent event = new TeleportWarmupEvent(teleportOwner, cause, null, delay);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
delay = event.getDelay();
if (chargeFor != null) {
chargeFor.isAffordableFor(teleportOwner);
}
cooldown(true);
if (delay <= 0 || teleportOwner.isAuthorized("essentials.teleport.timer.bypass")) {
cooldown(false);
respawnNow(teleportOwner, cause);
if (chargeFor != null) {
chargeFor.charge(teleportOwner);
}
return;
}
cancel(false);
warnUser(teleportOwner, delay);
initTimer((long) (delay * 1000.0), teleportOwner, null, chargeFor, cause, true);
}
@Deprecated
void respawnNow(final IUser teleportee, final TeleportCause cause) throws Exception {
final Player player = teleportee.getBase();
final Location bed = player.getBedSpawnLocation();
if (bed != null) {
now(teleportee, new LocationTarget(bed), cause);
} else {
if (ess.getSettings().isDebug()) {
ess.getLogger().info("Could not find bed spawn, forcing respawn event.");
}
final PlayerRespawnEvent pre = new PlayerRespawnEvent(player, player.getWorld().getSpawnLocation(), false);
ess.getServer().getPluginManager().callEvent(pre);
now(teleportee, new LocationTarget(pre.getRespawnLocation()), cause);
}
}
//The warp function is a wrapper used to teleportPlayer a player to a /warp
@Override
@Deprecated
public void warp(final IUser teleportee, String warp, final Trade chargeFor, final TeleportCause cause) throws Exception {
final UserWarpEvent event = new UserWarpEvent(teleportee, warp, chargeFor);
Bukkit.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
warp = event.getWarp();
final Location loc = ess.getWarps().getWarp(warp);
teleportee.sendMessage(tl("warpingTo", warp, loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
if (!teleportee.equals(teleportOwner)) {
teleportOwner.sendMessage(tl("warpingTo", warp, loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
}
teleport(teleportee, new LocationTarget(loc), chargeFor, cause);
}
//The back function is a wrapper used to teleportPlayer a player /back to their previous location.
@Override
@Deprecated
public void back(final Trade chargeFor) throws Exception {
back(teleportOwner, chargeFor);
}
//This function is a wrapper over the other back function for cases where another player performs back for them
@Override
@Deprecated
public void back(final IUser teleporter, final Trade chargeFor) throws Exception {
tpType = TeleportType.BACK;
final Location loc = teleportOwner.getLastLocation();
teleportOwner.sendMessage(tl("backUsageMsg", loc.getWorld().getName(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()));
teleportOther(teleporter, teleportOwner, new LocationTarget(loc), chargeFor, TeleportCause.COMMAND);
}
//This function is used to throw a user back after a jail sentence
@Override
@Deprecated
public void back() throws Exception {
now(teleportOwner, new LocationTarget(teleportOwner.getLastLocation()), TeleportCause.COMMAND);
}
@Deprecated
public void setTpType(final TeleportType tpType) {
this.tpType = tpType;
}
//If we need to cancelTimer a pending teleportPlayer call this method
@Deprecated
private void cancel(final boolean notifyUser) {
if (timedTeleport != null) {
timedTeleport.cancelTimer(notifyUser);
timedTeleport = null;
}
}
@Deprecated
private void initTimer(final long delay, final IUser teleportUser, final ITarget target, final Trade chargeFor, final TeleportCause cause, final boolean respawn) {
timedTeleport = new TimedTeleport(teleportOwner, ess, this, delay, teleportUser, target, chargeFor, cause, respawn);
}
public enum TeleportType {
TPA,
BACK,
NORMAL
}
}

View File

@ -1,140 +0,0 @@
package com.earth2me.essentials;
import net.ess3.api.IEssentials;
import net.ess3.api.IUser;
import org.bukkit.Location;
import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
import java.util.UUID;
import static com.earth2me.essentials.I18n.tl;
@Deprecated
public class TimedTeleport implements Runnable {
private static final double MOVE_CONSTANT = 0.3;
private final IUser teleportOwner;
private final IEssentials ess;
private final Teleport teleport;
private final UUID timer_teleportee;
private final long timer_started; // time this task was initiated
private final long timer_delay; // how long to delay the teleportPlayer
// note that I initially stored a clone of the location for reference, but...
// when comparing locations, I got incorrect mismatches (rounding errors, looked like)
// so, the X/Y/Z values are stored instead and rounded off
private final long timer_initX;
private final long timer_initY;
private final long timer_initZ;
private final ITarget timer_teleportTarget;
private final boolean timer_respawn;
private final boolean timer_canMove;
private final Trade timer_chargeFor;
private final TeleportCause timer_cause;
private int timer_task;
private double timer_health;
TimedTeleport(final IUser user, final IEssentials ess, final Teleport teleport, final long delay, final IUser teleportUser, final ITarget target, final Trade chargeFor, final TeleportCause cause, final boolean respawn) {
this.teleportOwner = user;
this.ess = ess;
this.teleport = teleport;
this.timer_started = System.currentTimeMillis();
this.timer_delay = delay;
this.timer_health = teleportUser.getBase().getHealth();
this.timer_initX = Math.round(teleportUser.getBase().getLocation().getX() * MOVE_CONSTANT);
this.timer_initY = Math.round(teleportUser.getBase().getLocation().getY() * MOVE_CONSTANT);
this.timer_initZ = Math.round(teleportUser.getBase().getLocation().getZ() * MOVE_CONSTANT);
this.timer_teleportee = teleportUser.getBase().getUniqueId();
this.timer_teleportTarget = target;
this.timer_chargeFor = chargeFor;
this.timer_cause = cause;
this.timer_respawn = respawn;
this.timer_canMove = user.isAuthorized("essentials.teleport.timer.move");
timer_task = ess.runTaskTimerAsynchronously(this, 20, 20).getTaskId();
}
@Override
public void run() {
if (teleportOwner == null || !teleportOwner.getBase().isOnline() || teleportOwner.getBase().getLocation() == null) {
cancelTimer(false);
return;
}
final IUser teleportUser = ess.getUser(this.timer_teleportee);
if (teleportUser == null || !teleportUser.getBase().isOnline()) {
cancelTimer(false);
return;
}
final Location currLocation = teleportUser.getBase().getLocation();
if (currLocation == null) {
cancelTimer(false);
return;
}
if (!timer_canMove && (Math.round(currLocation.getX() * MOVE_CONSTANT) != timer_initX || Math.round(currLocation.getY() * MOVE_CONSTANT) != timer_initY || Math.round(currLocation.getZ() * MOVE_CONSTANT) != timer_initZ || teleportUser.getBase().getHealth() < timer_health)) {
// user moved, cancelTimer teleportPlayer
cancelTimer(true);
return;
}
class DelayedTeleportTask implements Runnable {
@Override
public void run() {
timer_health = teleportUser.getBase().getHealth(); // in case user healed, then later gets injured
final long now = System.currentTimeMillis();
if (now > timer_started + timer_delay) {
try {
teleport.cooldown(false);
} catch (final Exception ex) {
teleportOwner.sendMessage(tl("cooldownWithMessage", ex.getMessage()));
if (teleportOwner != teleportUser) {
teleportUser.sendMessage(tl("cooldownWithMessage", ex.getMessage()));
}
}
try {
cancelTimer(false);
teleportUser.sendMessage(tl("teleportationCommencing"));
if (timer_chargeFor != null) {
timer_chargeFor.isAffordableFor(teleportOwner);
}
if (timer_respawn) {
teleport.respawnNow(teleportUser, timer_cause);
} else {
teleport.now(teleportUser, timer_teleportTarget, timer_cause);
}
if (timer_chargeFor != null) {
timer_chargeFor.charge(teleportOwner);
}
} catch (final Exception ex) {
ess.showError(teleportOwner.getSource(), ex, "\\ teleport");
}
}
}
}
ess.scheduleSyncDelayedTask(new DelayedTeleportTask());
}
//If we need to cancelTimer a pending teleportPlayer call this method
void cancelTimer(final boolean notifyUser) {
if (timer_task == -1) {
return;
}
try {
ess.getServer().getScheduler().cancelTask(timer_task);
if (notifyUser) {
teleportOwner.sendMessage(tl("pendingTeleportCancelled"));
if (timer_teleportee != null && !timer_teleportee.equals(teleportOwner.getBase().getUniqueId())) {
ess.getUser(timer_teleportee).sendMessage(tl("pendingTeleportCancelled"));
}
}
} finally {
timer_task = -1;
}
}
}

View File

@ -57,7 +57,6 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
// User modules // User modules
private final IMessageRecipient messageRecipient; private final IMessageRecipient messageRecipient;
private transient final AsyncTeleport teleport; private transient final AsyncTeleport teleport;
private transient final Teleport legacyTeleport;
// User command confirmation strings // User command confirmation strings
private final Map<User, BigDecimal> confirmingPayments = new WeakHashMap<>(); private final Map<User, BigDecimal> confirmingPayments = new WeakHashMap<>();
@ -97,7 +96,6 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
public User(final Player base, final IEssentials ess) { public User(final Player base, final IEssentials ess) {
super(base, ess); super(base, ess);
teleport = new AsyncTeleport(this, ess); teleport = new AsyncTeleport(this, ess);
legacyTeleport = new Teleport(this, ess);
if (isAfk()) { if (isAfk()) {
afkPosition = this.getLocation(); afkPosition = this.getLocation();
} }
@ -550,15 +548,6 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
return teleport; return teleport;
} }
/**
* @deprecated This API is not asynchronous. Use {@link User#getAsyncTeleport()}
*/
@Override
@Deprecated
public Teleport getTeleport() {
return legacyTeleport;
}
public long getLastOnlineActivity() { public long getLastOnlineActivity() {
return lastOnlineActivity; return lastOnlineActivity;
} }
@ -811,9 +800,7 @@ public class User extends UserData implements Comparable<User>, IMessageRecipien
public void updateActivityOnChat(final boolean broadcast) { public void updateActivityOnChat(final boolean broadcast) {
if (ess.getSettings().cancelAfkOnChat()) { if (ess.getSettings().cancelAfkOnChat()) {
//Chat happens async, make sure we have a sync context //Chat happens async, make sure we have a sync context
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(base, () -> updateActivity(broadcast, AfkStatusChangeEvent.Cause.CHAT));
updateActivity(broadcast, AfkStatusChangeEvent.Cause.CHAT);
});
} }
} }

View File

@ -46,17 +46,6 @@ public interface IJails extends IConf {
*/ */
void removeJail(String jail) throws Exception; void removeJail(String jail) throws Exception;
/**
* Attempts to send the given user to the given jail
*
* @param user the user to send to jail
* @param jail the jail to send the user to
* @throws Exception if the user is offline or jail does not exist
* @deprecated Use {@link IJails#sendToJail(IUser, String, CompletableFuture)}
*/
@Deprecated
void sendToJail(IUser user, String jail) throws Exception;
/** /**
* Attempts to send the given user to the given jail * Attempts to send the given user to the given jail
* *

View File

@ -38,7 +38,7 @@ public class Commandbalancetop extends EssentialsCommand {
new TextPager(cache).showPage(Integer.toString(page), null, "balancetop", sender); new TextPager(cache).showPage(Integer.toString(page), null, "balancetop", sender);
}; };
if (sender.getSender() instanceof BlockCommandSender) { if (sender.getSender() instanceof BlockCommandSender) {
ess.scheduleSyncDelayedTask(runnable); ess.scheduleGlobalDelayedTask(runnable);
} else { } else {
runnable.run(); runnable.run();
} }

View File

@ -25,7 +25,7 @@ public class Commandbeezooka extends EssentialsCommand {
final Entity bee = Mob.BEE.spawn(user.getWorld(), server, user.getBase().getEyeLocation()); final Entity bee = Mob.BEE.spawn(user.getWorld(), server, user.getBase().getEyeLocation());
bee.setVelocity(user.getBase().getEyeLocation().getDirection().multiply(2)); bee.setVelocity(user.getBase().getEyeLocation().getDirection().multiply(2));
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(bee, () -> {
final Location loc = bee.getLocation(); final Location loc = bee.getLocation();
bee.remove(); bee.remove();
loc.getWorld().createExplosion(loc, 0F); loc.getWorld().createExplosion(loc, 0F);

View File

@ -21,7 +21,7 @@ public class Commandgc extends EssentialsCommand {
@Override @Override
protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception {
final double tps = ess.getTimer().getAverageTPS(); final double tps = 20d; //TODO
final ChatColor color; final ChatColor color;
if (tps >= 18.0) { if (tps >= 18.0) {
color = ChatColor.GREEN; color = ChatColor.GREEN;

View File

@ -42,7 +42,7 @@ public class Commandkittycannon extends EssentialsCommand {
@Override @Override
protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception {
final Entity ocelot = Mob.CAT.getType() == null ? spawnOcelot(server, user) : spawnCat(server, user); final Entity ocelot = Mob.CAT.getType() == null ? spawnOcelot(server, user) : spawnCat(server, user);
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(ocelot, () -> {
final Location loc = ocelot.getLocation(); final Location loc = ocelot.getLocation();
ocelot.remove(); ocelot.remove();
loc.getWorld().createExplosion(loc, 0F); loc.getWorld().createExplosion(loc, 0F);

View File

@ -59,7 +59,7 @@ public class Commandseen extends EssentialsCommand {
return; return;
} }
} }
ess.getScheduler().runTaskAsynchronously(ess, new Runnable() { ess.runTaskAsynchronously(new Runnable() {
@Override @Override
public void run() { public void run() {
final User userFromBukkit = ess.getUsers().getUser(args[0]); final User userFromBukkit = ess.getUsers().getUser(args[0]);

View File

@ -64,7 +64,7 @@ public class Commandskull extends EssentialsCommand {
skullMeta.setDisplayName("§fSkull of " + owner); skullMeta.setDisplayName("§fSkull of " + owner);
//noinspection deprecation //noinspection deprecation
skullMeta.setOwner(owner); skullMeta.setOwner(owner);
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(user.getBase(), () -> {
stack.setItemMeta(skullMeta); stack.setItemMeta(skullMeta);
if (spawn) { if (spawn) {
Inventories.addItem(user.getBase(), stack); Inventories.addItem(user.getBase(), stack);

View File

@ -55,7 +55,7 @@ public class Commandsudo extends EssentialsLoopCommand {
} }
} }
ess.scheduleSyncDelayedTask(new SudoCommandTask()); ess.scheduleEntityDelayedTask(user.getBase(), new SudoCommandTask());
} }
} }
} }

View File

@ -32,7 +32,7 @@ public final class EconomyLayers {
} }
public static void onEnable(final Essentials ess) { public static void onEnable(final Essentials ess) {
ess.scheduleSyncDelayedTask(() -> { ess.scheduleInitTask(() -> {
serverStarted = true; serverStarted = true;
for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) { for (final Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
if (!plugin.isEnabled()) { if (!plugin.isEnabled()) {

View File

@ -341,7 +341,7 @@ public class KeywordReplacer implements IText {
} }
break; break;
case TPS: case TPS:
replacer = NumberUtil.formatDouble(ess.getTimer().getAverageTPS()); replacer = NumberUtil.formatDouble(20d); //todo
break; break;
case UPTIME: case UPTIME:
replacer = DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime()); replacer = DateUtil.formatDateDiff(ManagementFactory.getRuntimeMXBean().getStartTime());

View File

@ -42,10 +42,20 @@ public final class VersionUtil {
private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_2_R01, v1_19_4_R01); private static final Set<BukkitVersion> supportedVersions = ImmutableSet.of(v1_8_8_R01, v1_9_4_R01, v1_10_2_R01, v1_11_2_R01, v1_12_2_R01, v1_13_2_R01, v1_14_4_R01, v1_15_2_R01, v1_16_5_R01, v1_17_1_R01, v1_18_2_R01, v1_19_4_R01);
public static final boolean PRE_FLATTENING = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01); public static final boolean PRE_FLATTENING = VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_13_0_R01);
public static final boolean FOLIA;
private static final Map<String, SupportStatus> unsupportedServerClasses; private static final Map<String, SupportStatus> unsupportedServerClasses;
static { static {
boolean isFolia;
try {
Class.forName("io.papermc.paper.threadedregions.scheduler.AsyncScheduler");
isFolia = true;
} catch (Throwable ignored) {
isFolia = false;
}
FOLIA = isFolia;
final ImmutableMap.Builder<String, SupportStatus> builder = new ImmutableMap.Builder<>(); final ImmutableMap.Builder<String, SupportStatus> builder = new ImmutableMap.Builder<>();
// Yatopia - Extremely volatile patch set; // Yatopia - Extremely volatile patch set;

View File

@ -8,6 +8,7 @@ description: Provides an essential, core set of commands for Bukkit.
softdepend: [Vault, LuckPerms] softdepend: [Vault, LuckPerms]
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, mdcfe, JRoy, pop4959] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Iaccidentally, drtshock, vemacs, SupaHam, mdcfe, JRoy, pop4959]
api-version: "1.13" api-version: "1.13"
folia-supported: true
commands: commands:
afk: afk:
description: Marks you as away-from-keyboard. description: Marks you as away-from-keyboard.

View File

@ -8,7 +8,7 @@ description: Provides build protection.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, Iaccidentally, drtshock, mdcfe] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, Iaccidentally, drtshock, mdcfe]
depend: [Essentials] depend: [Essentials]
api-version: "1.13" api-version: "1.13"
folia-supported: true
permissions: permissions:
essentials.exempt.protect: essentials.exempt.protect:
default: false default: false

View File

@ -8,6 +8,7 @@ description: Provides chat control features for Essentials. Requires Permission
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Okamosy, Iaccidentally, mdcfe, JRoy, triagonal] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, md_5, Okamosy, Iaccidentally, mdcfe, JRoy, triagonal]
depend: [Essentials] depend: [Essentials]
api-version: 1.13 api-version: 1.13
folia-supported: true
commands: commands:
toggleshout: toggleshout:
description: Toggles whether you are talking in shout mode description: Toggles whether you are talking in shout mode

View File

@ -57,7 +57,7 @@ public class EssentialsDiscord extends JavaPlugin implements IEssentialsModule {
jda = new JDADiscordService(this); jda = new JDADiscordService(this);
try { try {
jda.startup(); jda.startup();
ess.scheduleSyncDelayedTask(() -> ((InteractionControllerImpl) jda.getInteractionController()).processBatchRegistration()); ess.scheduleInitTask(() -> ((InteractionControllerImpl) jda.getInteractionController()).processBatchRegistration());
} catch (Exception e) { } catch (Exception e) {
getLogger().log(Level.SEVERE, tl("discordErrorLogin", e.getMessage())); getLogger().log(Level.SEVERE, tl("discordErrorLogin", e.getMessage()));
if (ess.getSettings().isDebug()) { if (ess.getSettings().isDebug()) {

View File

@ -229,7 +229,7 @@ public class JDADiscordService implements DiscordService, IEssentialsModule {
logger.log(Level.WARNING, "Error while loading the achievement/advancement listener. You will not receive achievement/advancement notifications on Discord.", e); logger.log(Level.WARNING, "Error while loading the achievement/advancement listener. You will not receive achievement/advancement notifications on Discord.", e);
} }
getPlugin().getEss().scheduleSyncDelayedTask(() -> DiscordUtil.dispatchDiscordMessage(JDADiscordService.this, MessageType.DefaultTypes.SERVER_START, getSettings().getStartMessage(), true, null, null, null)); getPlugin().getEss().scheduleInitTask(() -> DiscordUtil.dispatchDiscordMessage(JDADiscordService.this, MessageType.DefaultTypes.SERVER_START, getSettings().getStartMessage(), true, null, null, null));
Bukkit.getServicesManager().register(DiscordService.class, this, plugin, ServicePriority.Normal); Bukkit.getServicesManager().register(DiscordService.class, this, plugin, ServicePriority.Normal);
} }

View File

@ -61,7 +61,7 @@ public class InteractionControllerImpl extends ListenerAdapter implements Intera
interactionEvent.reply(tl("noAccessCommand")); interactionEvent.reply(tl("noAccessCommand"));
return; return;
} }
jda.getPlugin().getEss().scheduleSyncDelayedTask(() -> command.onCommand(interactionEvent)); //jda.getPlugin().getEss().scheduleSyncDelayedTask(() -> command.onCommand(interactionEvent)); //todo
} }
@Override @Override

View File

@ -2,17 +2,16 @@ package net.essentialsx.discord.util;
import com.earth2me.essentials.utils.FormatUtil; import com.earth2me.essentials.utils.FormatUtil;
import com.earth2me.essentials.utils.VersionUtil; import com.earth2me.essentials.utils.VersionUtil;
import net.ess3.provider.SchedulingProvider;
import net.ess3.provider.providers.BukkitSenderProvider; import net.ess3.provider.providers.BukkitSenderProvider;
import net.ess3.provider.providers.PaperCommandSender; import net.ess3.provider.providers.PaperCommandSender;
import net.essentialsx.discord.JDADiscordService; import net.essentialsx.discord.JDADiscordService;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender; import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.scheduler.BukkitTask;
public class DiscordCommandSender { public class DiscordCommandSender {
private final CommandSender sender; private final CommandSender sender;
private BukkitTask task; private SchedulingProvider.EssentialsTask task;
private String responseBuffer = ""; private String responseBuffer = "";
private long lastTime = System.currentTimeMillis(); private long lastTime = System.currentTimeMillis();
@ -23,7 +22,7 @@ public class DiscordCommandSender {
}; };
this.sender = getCustomSender(sender, hook); this.sender = getCustomSender(sender, hook);
task = Bukkit.getScheduler().runTaskTimerAsynchronously(jda.getPlugin(), () -> { task = jda.getPlugin().getEss().runTaskTimerAsynchronously(() -> {
if (!responseBuffer.isEmpty() && System.currentTimeMillis() - lastTime >= 1000) { if (!responseBuffer.isEmpty() && System.currentTimeMillis() - lastTime >= 1000) {
callback.onMessage(responseBuffer); callback.onMessage(responseBuffer);
responseBuffer = ""; responseBuffer = "";

View File

@ -214,10 +214,6 @@ public final class DiscordUtil {
return; return;
} }
if (Bukkit.getServer().isPrimaryThread()) { jda.getPlugin().getEss().scheduleGlobalDelayedTask(() -> Bukkit.getPluginManager().callEvent(event));
Bukkit.getPluginManager().callEvent(event);
} else {
Bukkit.getScheduler().runTask(jda.getPlugin(), () -> Bukkit.getPluginManager().callEvent(event));
}
} }
} }

View File

@ -8,6 +8,7 @@ authors: [mdcfe, JRoy, pop4959, Glare]
depend: [Essentials] depend: [Essentials]
softdepend: [EssentialsChat, PlaceholderAPI] softdepend: [EssentialsChat, PlaceholderAPI]
api-version: 1.13 api-version: 1.13
folia-supported: true
commands: commands:
discordbroadcast: discordbroadcast:
description: Broadcasts a message to the specified Discord channel. description: Broadcasts a message to the specified Discord channel.

View File

@ -139,7 +139,7 @@ public class AccountLinkManager implements IEssentialsModule, DiscordLinkService
runnable.run(); runnable.run();
return; return;
} }
ess.getEss().scheduleSyncDelayedTask(runnable); ess.getEss().scheduleGlobalDelayedTask(runnable);
} }
private void ensureAsync(final Runnable runnable) { private void ensureAsync(final Runnable runnable) {

View File

@ -156,7 +156,7 @@ public class LinkBukkitListener implements Listener {
if (Bukkit.isPrimaryThread()) { if (Bukkit.isPrimaryThread()) {
kickTask.run(); kickTask.run();
} else { } else {
ess.getEss().scheduleSyncDelayedTask(kickTask); ess.getEss().scheduleEntityDelayedTask(event.getUser().getBase(), kickTask);
} }
break; break;
} }

View File

@ -7,6 +7,7 @@ description: EssentialsX Discord addon which allows you link your Minecraft and
authors: [JRoy] authors: [JRoy]
depend: [EssentialsDiscord] depend: [EssentialsDiscord]
api-version: 1.13 api-version: 1.13
folia-supported: true
commands: commands:
link: link:
description: Generates a code to link your Minecraft account to Discord. description: Generates a code to link your Minecraft account to Discord.

View File

@ -8,3 +8,4 @@ description: Shows the country or city of a user on login and /whois.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, kjiang, pop4959] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, kjiang, pop4959]
depend: [Essentials] depend: [Essentials]
api-version: 1.13 api-version: 1.13
folia-supported: true

View File

@ -8,3 +8,4 @@ description: Provides protection for various parts of the world.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, drtshock] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, drtshock]
softdepend: [Essentials] softdepend: [Essentials]
api-version: 1.13 api-version: 1.13
folia-supported: true

View File

@ -83,7 +83,7 @@ class EssentialsSpawnPlayerListener implements Listener {
final User user = ess.getUser(player); final User user = ess.getUser(player);
if (ess.getSettings().isUserInSpawnOnJoinGroup(user) && !user.isAuthorized("essentials.spawn-on-join.exempt")) { if (ess.getSettings().isUserInSpawnOnJoinGroup(user) && !user.isAuthorized("essentials.spawn-on-join.exempt")) {
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(player, () -> {
final Location spawn = spawns.getSpawn(user.getGroup()); final Location spawn = spawns.getSpawn(user.getGroup());
if (spawn == null) { if (spawn == null) {
return; return;
@ -104,10 +104,10 @@ class EssentialsSpawnPlayerListener implements Listener {
final User user = ess.getUser(player); final User user = ess.getUser(player);
if (!"none".equalsIgnoreCase(ess.getSettings().getNewbieSpawn())) { if (!"none".equalsIgnoreCase(ess.getSettings().getNewbieSpawn())) {
ess.scheduleSyncDelayedTask(new NewPlayerTeleport(user), 1L); ess.scheduleEntityDelayedTask(player, new NewPlayerTeleport(user), 1L);
} }
ess.scheduleSyncDelayedTask(() -> { ess.scheduleEntityDelayedTask(player, () -> {
if (!user.getBase().isOnline()) { if (!user.getBase().isOnline()) {
return; return;
} }

View File

@ -8,6 +8,7 @@ description: Provides spawn control commands, utilizing Essentials.
authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, SupaHam, mdcfe, DoNotSpamPls, JRoy] authors: [Zenexer, ementalo, Aelux, Brettflan, KimKandor, snowleo, ceulemans, Xeology, KHobbits, SupaHam, mdcfe, DoNotSpamPls, JRoy]
depend: [Essentials] depend: [Essentials]
api-version: 1.13 api-version: 1.13
folia-supported: true
commands: commands:
setspawn: setspawn:
description: Sets the spawn point to your current position. description: Sets the spawn point to your current position.