mirror of
https://github.com/AuthMe/AuthMeReloaded.git
synced 2024-11-03 01:00:18 +01:00
IN DEVELOPPEMENT !!!! Begin to increase performances
This commit is contained in:
parent
ac543df216
commit
487c91136c
@ -1,138 +1,45 @@
|
|||||||
package fr.xephi.authme.commands;
|
package fr.xephi.authme.commands;
|
||||||
|
|
||||||
import me.muizers.Notifications.Notification;
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandExecutor;
|
import fr.xephi.authme.AuthMe;
|
||||||
import org.bukkit.command.CommandSender;
|
import fr.xephi.authme.Utils;
|
||||||
import org.bukkit.entity.Player;
|
import fr.xephi.authme.cache.backup.FileCache;
|
||||||
import org.bukkit.potion.PotionEffect;
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
import org.bukkit.potion.PotionEffectType;
|
import fr.xephi.authme.settings.Messages;
|
||||||
import org.bukkit.scheduler.BukkitScheduler;
|
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
public class LogoutCommand implements CommandExecutor {
|
||||||
|
|
||||||
import fr.xephi.authme.AuthMe;
|
private Messages m = Messages.getInstance();
|
||||||
import fr.xephi.authme.ConsoleLogger;
|
private AuthMe plugin;
|
||||||
import fr.xephi.authme.Utils;
|
private DataSource database;
|
||||||
import fr.xephi.authme.Utils.groupType;
|
private Utils utils = Utils.getInstance();
|
||||||
import fr.xephi.authme.cache.auth.PlayerAuth;
|
private FileCache playerBackup;
|
||||||
import fr.xephi.authme.cache.auth.PlayerCache;
|
|
||||||
import fr.xephi.authme.cache.backup.DataFileCache;
|
public LogoutCommand(AuthMe plugin, DataSource database) {
|
||||||
import fr.xephi.authme.cache.backup.FileCache;
|
this.plugin = plugin;
|
||||||
import fr.xephi.authme.cache.limbo.LimboCache;
|
this.database = database;
|
||||||
import fr.xephi.authme.datasource.DataSource;
|
this.playerBackup = new FileCache(plugin);
|
||||||
import fr.xephi.authme.events.AuthMeTeleportEvent;
|
}
|
||||||
import fr.xephi.authme.events.LogoutEvent;
|
|
||||||
import fr.xephi.authme.settings.Messages;
|
@Override
|
||||||
import fr.xephi.authme.settings.Settings;
|
public boolean onCommand(CommandSender sender, Command cmnd, String label,
|
||||||
import fr.xephi.authme.task.MessageTask;
|
String[] args) {
|
||||||
import fr.xephi.authme.task.TimeoutTask;
|
if (!(sender instanceof Player)) {
|
||||||
|
return true;
|
||||||
public class LogoutCommand implements CommandExecutor {
|
}
|
||||||
|
|
||||||
private Messages m = Messages.getInstance();
|
if (!plugin.authmePermissible(sender, "authme." + label.toLowerCase())) {
|
||||||
private AuthMe plugin;
|
m.send(sender, "no_perm");
|
||||||
private DataSource database;
|
return true;
|
||||||
private Utils utils = Utils.getInstance();
|
}
|
||||||
private FileCache playerBackup;
|
|
||||||
|
final Player player = (Player) sender;
|
||||||
public LogoutCommand(AuthMe plugin, DataSource database) {
|
plugin.management.performLogout(player);
|
||||||
this.plugin = plugin;
|
return true;
|
||||||
this.database = database;
|
}
|
||||||
this.playerBackup = new FileCache(plugin);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onCommand(CommandSender sender, Command cmnd, String label,
|
|
||||||
String[] args) {
|
|
||||||
if (!(sender instanceof Player)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!plugin.authmePermissible(sender, "authme." + label.toLowerCase())) {
|
|
||||||
m.send(sender, "no_perm");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Player player = (Player) sender;
|
|
||||||
String name = player.getName().toLowerCase();
|
|
||||||
|
|
||||||
if (!PlayerCache.getInstance().isAuthenticated(name)) {
|
|
||||||
m.send(player, "not_logged_in");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerAuth auth = PlayerCache.getInstance().getAuth(name);
|
|
||||||
if (Settings.isSessionsEnabled)
|
|
||||||
auth.setLastLogin(0L);
|
|
||||||
database.updateSession(auth);
|
|
||||||
auth.setQuitLocX(player.getLocation().getX());
|
|
||||||
auth.setQuitLocY(player.getLocation().getY());
|
|
||||||
auth.setQuitLocZ(player.getLocation().getZ());
|
|
||||||
auth.setWorld(player.getWorld().getName());
|
|
||||||
database.updateQuitLoc(auth);
|
|
||||||
|
|
||||||
PlayerCache.getInstance().removePlayer(name);
|
|
||||||
database.setUnlogged(name);
|
|
||||||
|
|
||||||
if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
|
|
||||||
Location spawnLoc = plugin.getSpawnLocation(player);
|
|
||||||
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc);
|
|
||||||
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
|
||||||
if (!tpEvent.isCancelled()) {
|
|
||||||
if (tpEvent.getTo() != null)
|
|
||||||
player.teleport(tpEvent.getTo());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (LimboCache.getInstance().hasLimboPlayer(name))
|
|
||||||
LimboCache.getInstance().deleteLimboPlayer(name);
|
|
||||||
LimboCache.getInstance().addLimboPlayer(player);
|
|
||||||
utils.setGroup(player, groupType.NOTLOGGEDIN);
|
|
||||||
if (Settings.protectInventoryBeforeLogInEnabled) {
|
|
||||||
player.getInventory().clear();
|
|
||||||
// create cache file for handling lost of inventories on unlogged in
|
|
||||||
// status
|
|
||||||
DataFileCache playerData = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour());
|
|
||||||
if (playerData != null)
|
|
||||||
playerBackup.createCache(player, playerData, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying());
|
|
||||||
}
|
|
||||||
|
|
||||||
int delay = Settings.getRegistrationTimeout * 20;
|
|
||||||
int interval = Settings.getWarnMessageInterval;
|
|
||||||
BukkitScheduler sched = sender.getServer().getScheduler();
|
|
||||||
if (delay != 0) {
|
|
||||||
BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), delay);
|
|
||||||
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
|
|
||||||
}
|
|
||||||
BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, m.send("login_msg"), interval));
|
|
||||||
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT);
|
|
||||||
try {
|
|
||||||
if (player.isInsideVehicle())
|
|
||||||
player.getVehicle().eject();
|
|
||||||
} catch (NullPointerException npe) {
|
|
||||||
}
|
|
||||||
if (Settings.applyBlindEffect)
|
|
||||||
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2));
|
|
||||||
player.setOp(false);
|
|
||||||
player.setAllowFlight(true);
|
|
||||||
player.setFlying(true);
|
|
||||||
// Player is now logout... Time to fire event !
|
|
||||||
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
Bukkit.getServer().getPluginManager().callEvent(new LogoutEvent(player));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
m.send(player, "logout");
|
|
||||||
ConsoleLogger.info(player.getDisplayName() + " logged out");
|
|
||||||
if (plugin.notifications != null) {
|
|
||||||
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " logged out!"));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
@ -6,9 +6,8 @@ import java.io.IOException;
|
|||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.regex.PatternSyntaxException;
|
import java.util.regex.PatternSyntaxException;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
@ -37,45 +36,32 @@ import org.bukkit.event.player.PlayerMoveEvent;
|
|||||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||||
import org.bukkit.potion.PotionEffect;
|
|
||||||
import org.bukkit.potion.PotionEffectType;
|
|
||||||
import org.bukkit.scheduler.BukkitScheduler;
|
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
|
||||||
|
|
||||||
import fr.xephi.authme.AuthMe;
|
import fr.xephi.authme.AuthMe;
|
||||||
import fr.xephi.authme.ConsoleLogger;
|
import fr.xephi.authme.ConsoleLogger;
|
||||||
import fr.xephi.authme.Utils;
|
import fr.xephi.authme.Utils;
|
||||||
import fr.xephi.authme.Utils.groupType;
|
|
||||||
import fr.xephi.authme.api.API;
|
import fr.xephi.authme.api.API;
|
||||||
import fr.xephi.authme.cache.auth.PlayerAuth;
|
import fr.xephi.authme.cache.auth.PlayerAuth;
|
||||||
import fr.xephi.authme.cache.auth.PlayerCache;
|
import fr.xephi.authme.cache.auth.PlayerCache;
|
||||||
import fr.xephi.authme.cache.backup.DataFileCache;
|
|
||||||
import fr.xephi.authme.cache.backup.FileCache;
|
import fr.xephi.authme.cache.backup.FileCache;
|
||||||
import fr.xephi.authme.cache.limbo.LimboCache;
|
import fr.xephi.authme.cache.limbo.LimboCache;
|
||||||
import fr.xephi.authme.cache.limbo.LimboPlayer;
|
import fr.xephi.authme.cache.limbo.LimboPlayer;
|
||||||
import fr.xephi.authme.datasource.DataSource;
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
import fr.xephi.authme.events.AuthMeTeleportEvent;
|
|
||||||
import fr.xephi.authme.events.ProtectInventoryEvent;
|
|
||||||
import fr.xephi.authme.events.RestoreInventoryEvent;
|
|
||||||
import fr.xephi.authme.events.SessionEvent;
|
|
||||||
import fr.xephi.authme.events.SpawnTeleportEvent;
|
|
||||||
import fr.xephi.authme.plugin.manager.CombatTagComunicator;
|
import fr.xephi.authme.plugin.manager.CombatTagComunicator;
|
||||||
import fr.xephi.authme.settings.Messages;
|
import fr.xephi.authme.settings.Messages;
|
||||||
import fr.xephi.authme.settings.Settings;
|
import fr.xephi.authme.settings.Settings;
|
||||||
import fr.xephi.authme.task.MessageTask;
|
|
||||||
import fr.xephi.authme.task.TimeoutTask;
|
|
||||||
|
|
||||||
public class AuthMePlayerListener implements Listener {
|
public class AuthMePlayerListener implements Listener {
|
||||||
|
|
||||||
public static GameMode gm = GameMode.SURVIVAL;
|
public static GameMode gm = GameMode.SURVIVAL;
|
||||||
public static HashMap<String, GameMode> gameMode = new HashMap<String, GameMode>();
|
public static ConcurrentHashMap<String, GameMode> gameMode = new ConcurrentHashMap<String, GameMode>();
|
||||||
public static HashMap<String, String> joinMessage = new HashMap<String, String>();
|
public static ConcurrentHashMap<String, String> joinMessage = new ConcurrentHashMap<String, String>();
|
||||||
private Utils utils = Utils.getInstance();
|
private Utils utils = Utils.getInstance();
|
||||||
private Messages m = Messages.getInstance();
|
private Messages m = Messages.getInstance();
|
||||||
public AuthMe plugin;
|
public AuthMe plugin;
|
||||||
private DataSource data;
|
private DataSource data;
|
||||||
private FileCache playerBackup;
|
private FileCache playerBackup;
|
||||||
public static HashMap<String, Boolean> causeByAuthMe = new HashMap<String, Boolean>();
|
public static ConcurrentHashMap<String, Boolean> causeByAuthMe = new ConcurrentHashMap<String, Boolean>();
|
||||||
private List<String> antibot = new ArrayList<String>();
|
private List<String> antibot = new ArrayList<String>();
|
||||||
|
|
||||||
public AuthMePlayerListener(AuthMe plugin, DataSource data) {
|
public AuthMePlayerListener(AuthMe plugin, DataSource data) {
|
||||||
@ -578,188 +564,9 @@ public class AuthMePlayerListener implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
final String name = player.getName().toLowerCase();
|
String name = player.getName().toLowerCase();
|
||||||
gm = player.getGameMode();
|
|
||||||
gameMode.put(name, gm);
|
|
||||||
BukkitScheduler sched = plugin.getServer().getScheduler();
|
|
||||||
|
|
||||||
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) {
|
plugin.management.performJoin(player);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plugin.ess != null && Settings.disableSocialSpy) {
|
|
||||||
try {
|
|
||||||
plugin.ess.getUser(player.getName().toLowerCase()).setSocialSpyEnabled(false);
|
|
||||||
} catch (Exception e) {
|
|
||||||
} catch (NoSuchMethodError e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String ip = plugin.getIP(player);
|
|
||||||
if (Settings.isAllowRestrictedIp && !Settings.getRestrictedIp(name, ip)) {
|
|
||||||
GameMode gM = gameMode.get(name);
|
|
||||||
causeByAuthMe.put(name, true);
|
|
||||||
player.setGameMode(gM);
|
|
||||||
causeByAuthMe.put(name, false);
|
|
||||||
player.kickPlayer("You are not the Owner of this account, please try another name!");
|
|
||||||
if (Settings.banUnsafeIp)
|
|
||||||
plugin.getServer().banIP(ip);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Settings.getMaxJoinPerIp > 0 && !plugin.authmePermissible(player, "authme.allow2accounts") && !ip.equalsIgnoreCase("127.0.0.1") && !ip.equalsIgnoreCase("localhost")) {
|
|
||||||
if (plugin.hasJoinedIp(player.getName(), ip)) {
|
|
||||||
player.kickPlayer("A player with the same IP is already in game!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Location spawnLoc = plugin.getSpawnLocation(player);
|
|
||||||
if (data.isAuthAvailable(name)) {
|
|
||||||
if (Settings.isSessionsEnabled) {
|
|
||||||
PlayerAuth auth = data.getAuth(name);
|
|
||||||
long timeout = Settings.getSessionTimeout * 60000;
|
|
||||||
long lastLogin = auth.getLastLogin();
|
|
||||||
long cur = new Date().getTime();
|
|
||||||
if ((cur - lastLogin < timeout || timeout == 0) && !auth.getIp().equals("198.18.0.1")) {
|
|
||||||
if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip)) {
|
|
||||||
if (PlayerCache.getInstance().getAuth(name) != null) {
|
|
||||||
PlayerCache.getInstance().updatePlayer(auth);
|
|
||||||
} else {
|
|
||||||
PlayerCache.getInstance().addPlayer(auth);
|
|
||||||
data.setLogged(name);
|
|
||||||
}
|
|
||||||
m.send(player, "valid_session");
|
|
||||||
// Restore Permission Group
|
|
||||||
utils.setGroup(player, Utils.groupType.LOGGEDIN);
|
|
||||||
plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true));
|
|
||||||
return;
|
|
||||||
} else if (!Settings.sessionExpireOnIpChange) {
|
|
||||||
GameMode gM = gameMode.get(name);
|
|
||||||
causeByAuthMe.put(name, true);
|
|
||||||
player.setGameMode(gM);
|
|
||||||
causeByAuthMe.put(name, false);
|
|
||||||
player.kickPlayer(m.send("unvalid_session")[0]);
|
|
||||||
return;
|
|
||||||
} else if (auth.getNickname().equalsIgnoreCase(name)) {
|
|
||||||
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
|
|
||||||
causeByAuthMe.put(name, true);
|
|
||||||
Utils.forceGM(player);
|
|
||||||
causeByAuthMe.put(name, false);
|
|
||||||
}
|
|
||||||
// Player change his IP between 2 relog-in
|
|
||||||
PlayerCache.getInstance().removePlayer(name);
|
|
||||||
data.setUnlogged(name);
|
|
||||||
} else {
|
|
||||||
GameMode gM = gameMode.get(name);
|
|
||||||
causeByAuthMe.put(name, true);
|
|
||||||
player.setGameMode(gM);
|
|
||||||
causeByAuthMe.put(name, false);
|
|
||||||
player.kickPlayer(m.send("unvalid_session")[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Session is ended correctly
|
|
||||||
PlayerCache.getInstance().removePlayer(name);
|
|
||||||
data.setUnlogged(name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// isent in session or session was ended correctly
|
|
||||||
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
|
|
||||||
causeByAuthMe.put(name, true);
|
|
||||||
Utils.forceGM(player);
|
|
||||||
causeByAuthMe.put(name, false);
|
|
||||||
}
|
|
||||||
if (!Settings.noTeleport)
|
|
||||||
if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
|
|
||||||
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
|
|
||||||
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
|
||||||
if (!tpEvent.isCancelled()) {
|
|
||||||
if (player != null && player.isOnline() && tpEvent.getTo() != null) {
|
|
||||||
if (tpEvent.getTo().getWorld() != null)
|
|
||||||
player.teleport(tpEvent.getTo());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
placePlayerSafely(player, spawnLoc);
|
|
||||||
LimboCache.getInstance().updateLimboPlayer(player);
|
|
||||||
try {
|
|
||||||
DataFileCache dataFile = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour());
|
|
||||||
playerBackup.createCache(player, dataFile, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying());
|
|
||||||
} catch (Exception e) {
|
|
||||||
ConsoleLogger.showError("Error on creating an inventory cache for " + name + ", maybe inventory wipe in preparation...");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
|
|
||||||
causeByAuthMe.put(name, true);
|
|
||||||
Utils.forceGM(player);
|
|
||||||
causeByAuthMe.put(name, false);
|
|
||||||
}
|
|
||||||
if (!Settings.unRegisteredGroup.isEmpty()) {
|
|
||||||
utils.setGroup(player, Utils.groupType.UNREGISTERED);
|
|
||||||
}
|
|
||||||
if (!Settings.isForcedRegistrationEnabled) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!Settings.noTeleport)
|
|
||||||
if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
|
|
||||||
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
|
|
||||||
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
|
||||||
if (!tpEvent.isCancelled()) {
|
|
||||||
if (player != null && player.isOnline() && tpEvent.getTo() != null) {
|
|
||||||
if (tpEvent.getTo().getWorld() != null)
|
|
||||||
player.teleport(tpEvent.getTo());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
if (Settings.protectInventoryBeforeLogInEnabled) {
|
|
||||||
try {
|
|
||||||
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(player.getName().toLowerCase());
|
|
||||||
ProtectInventoryEvent ev = new ProtectInventoryEvent(player, limbo.getInventory(), limbo.getArmour());
|
|
||||||
plugin.getServer().getPluginManager().callEvent(ev);
|
|
||||||
if (ev.isCancelled()) {
|
|
||||||
if (!Settings.noConsoleSpam)
|
|
||||||
ConsoleLogger.info("ProtectInventoryEvent has been cancelled for " + player.getName() + " ...");
|
|
||||||
} else {
|
|
||||||
API.setPlayerInventory(player, ev.getEmptyInventory(), ev.getEmptyArmor());
|
|
||||||
}
|
|
||||||
} catch (NullPointerException ex) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String[] msg;
|
|
||||||
if (Settings.emailRegistration) {
|
|
||||||
msg = data.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_email_msg");
|
|
||||||
} else {
|
|
||||||
msg = data.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_msg");
|
|
||||||
}
|
|
||||||
int time = Settings.getRegistrationTimeout * 20;
|
|
||||||
int msgInterval = Settings.getWarnMessageInterval;
|
|
||||||
if (time != 0) {
|
|
||||||
BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), time);
|
|
||||||
if (!LimboCache.getInstance().hasLimboPlayer(name))
|
|
||||||
LimboCache.getInstance().addLimboPlayer(player);
|
|
||||||
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
|
|
||||||
}
|
|
||||||
if (!LimboCache.getInstance().hasLimboPlayer(name))
|
|
||||||
LimboCache.getInstance().addLimboPlayer(player);
|
|
||||||
if (data.isAuthAvailable(name)) {
|
|
||||||
utils.setGroup(player, groupType.NOTLOGGEDIN);
|
|
||||||
} else {
|
|
||||||
utils.setGroup(player, groupType.UNREGISTERED);
|
|
||||||
}
|
|
||||||
if (player.isOp())
|
|
||||||
player.setOp(false);
|
|
||||||
if (!Settings.isMovementAllowed) {
|
|
||||||
player.setAllowFlight(true);
|
|
||||||
player.setFlying(true);
|
|
||||||
}
|
|
||||||
BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, msg, msgInterval));
|
|
||||||
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT);
|
|
||||||
player.setNoDamageTicks(Settings.getRegistrationTimeout * 20);
|
|
||||||
if (Settings.useEssentialsMotd)
|
|
||||||
player.performCommand("motd");
|
|
||||||
if (Settings.applyBlindEffect)
|
|
||||||
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2));
|
|
||||||
|
|
||||||
// Remove the join message while the player isn't logging in
|
// Remove the join message while the player isn't logging in
|
||||||
if (Settings.enableProtection || Settings.delayJoinMessage) {
|
if (Settings.enableProtection || Settings.delayJoinMessage) {
|
||||||
@ -797,61 +604,11 @@ public class AuthMePlayerListener implements Listener {
|
|||||||
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
String name = player.getName().toLowerCase();
|
String name = player.getName().toLowerCase();
|
||||||
Location loc = player.getLocation();
|
|
||||||
|
|
||||||
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) {
|
plugin.management.performQuit(player);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String ip = plugin.getIP(player);
|
|
||||||
|
|
||||||
if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) {
|
|
||||||
if (Settings.isSaveQuitLocationEnabled && data.isAuthAvailable(name)) {
|
|
||||||
final PlayerAuth auth = new PlayerAuth(name, loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
|
|
||||||
try {
|
|
||||||
data.updateQuitLoc(auth);
|
|
||||||
} catch (NullPointerException npe) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PlayerAuth auth = new PlayerAuth(name, ip, System.currentTimeMillis());
|
|
||||||
data.updateSession(auth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection)
|
if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection)
|
||||||
event.setQuitMessage(null);
|
event.setQuitMessage(null);
|
||||||
|
|
||||||
if (LimboCache.getInstance().hasLimboPlayer(name)) {
|
|
||||||
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
|
|
||||||
if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) {
|
|
||||||
RestoreInventoryEvent ev = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour());
|
|
||||||
plugin.getServer().getPluginManager().callEvent(ev);
|
|
||||||
if (!ev.isCancelled()) {
|
|
||||||
API.setPlayerInventory(player, ev.getInventory(), ev.getArmor());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
utils.addNormal(player, limbo.getGroup());
|
|
||||||
player.setOp(limbo.getOperator());
|
|
||||||
if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
|
|
||||||
player.setAllowFlight(limbo.isFlying());
|
|
||||||
player.setFlying(limbo.isFlying());
|
|
||||||
}
|
|
||||||
if (limbo.getTimeoutTaskId() != null)
|
|
||||||
limbo.getTimeoutTaskId().cancel();
|
|
||||||
if (limbo.getMessageTaskId() != null)
|
|
||||||
limbo.getMessageTaskId().cancel();
|
|
||||||
LimboCache.getInstance().deleteLimboPlayer(name);
|
|
||||||
if (playerBackup.doesCacheExist(player)) {
|
|
||||||
playerBackup.removeCache(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PlayerCache.getInstance().removePlayer(name);
|
|
||||||
data.setUnlogged(name);
|
|
||||||
try {
|
|
||||||
player.getVehicle().eject();
|
|
||||||
} catch (NullPointerException ex) {
|
|
||||||
}
|
|
||||||
if (gameMode.containsKey(name))
|
|
||||||
gameMode.remove(name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
@ -864,83 +621,13 @@ public class AuthMePlayerListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
Location loc = player.getLocation();
|
|
||||||
|
|
||||||
if ((plugin.getCitizensCommunicator().isNPC(player, plugin)) || (Utils.getInstance().isUnrestricted(player)) || (CombatTagComunicator.isNPC(player))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((Settings.isForceSingleSessionEnabled) && (event.getReason().contains("You logged in from another location"))) {
|
if ((Settings.isForceSingleSessionEnabled) && (event.getReason().contains("You logged in from another location"))) {
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String name = player.getName().toLowerCase();
|
plugin.management.performQuit(player);
|
||||||
|
|
||||||
String ip = plugin.getIP(player);
|
|
||||||
if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead())) {
|
|
||||||
if ((Settings.isSaveQuitLocationEnabled) && data.isAuthAvailable(name)) {
|
|
||||||
final PlayerAuth auth = new PlayerAuth(name, loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
|
|
||||||
try {
|
|
||||||
data.updateQuitLoc(auth);
|
|
||||||
} catch (NullPointerException npe) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PlayerAuth auth = new PlayerAuth(name, ip, System.currentTimeMillis());
|
|
||||||
data.updateSession(auth);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection)
|
|
||||||
event.setLeaveMessage(null);
|
|
||||||
|
|
||||||
if (LimboCache.getInstance().hasLimboPlayer(name)) {
|
|
||||||
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
|
|
||||||
if (Settings.protectInventoryBeforeLogInEnabled) {
|
|
||||||
try {
|
|
||||||
RestoreInventoryEvent ev = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour());
|
|
||||||
plugin.getServer().getPluginManager().callEvent(ev);
|
|
||||||
if (!ev.isCancelled()) {
|
|
||||||
API.setPlayerInventory(player, ev.getInventory(), ev.getArmor());
|
|
||||||
}
|
|
||||||
} catch (NullPointerException npe) {
|
|
||||||
ConsoleLogger.showError("Problem while restore " + name + " inventory after a kick");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!Settings.noTeleport)
|
|
||||||
try {
|
|
||||||
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc());
|
|
||||||
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
|
||||||
if (!tpEvent.isCancelled()) {
|
|
||||||
if (player != null && player.isOnline() && tpEvent.getTo() != null) {
|
|
||||||
if (tpEvent.getTo().getWorld() != null)
|
|
||||||
player.teleport(tpEvent.getTo());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (NullPointerException npe) {
|
|
||||||
}
|
|
||||||
this.utils.addNormal(player, limbo.getGroup());
|
|
||||||
player.setOp(limbo.getOperator());
|
|
||||||
if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
|
|
||||||
player.setAllowFlight(limbo.isFlying());
|
|
||||||
player.setFlying(limbo.isFlying());
|
|
||||||
}
|
|
||||||
if (limbo.getTimeoutTaskId() != null)
|
|
||||||
limbo.getTimeoutTaskId().cancel();
|
|
||||||
if (limbo.getMessageTaskId() != null)
|
|
||||||
limbo.getMessageTaskId().cancel();
|
|
||||||
LimboCache.getInstance().deleteLimboPlayer(name);
|
|
||||||
if (this.playerBackup.doesCacheExist(player)) {
|
|
||||||
this.playerBackup.removeCache(player);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PlayerCache.getInstance().removePlayer(name);
|
|
||||||
data.setUnlogged(name);
|
|
||||||
if (gameMode.containsKey(name))
|
|
||||||
gameMode.remove(name);
|
|
||||||
try {
|
|
||||||
player.getVehicle().eject();
|
|
||||||
} catch (NullPointerException ex) {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
@ -6,7 +6,10 @@ import org.bukkit.plugin.PluginManager;
|
|||||||
|
|
||||||
import fr.xephi.authme.AuthMe;
|
import fr.xephi.authme.AuthMe;
|
||||||
import fr.xephi.authme.datasource.DataSource;
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
|
import fr.xephi.authme.process.join.AsyncronousJoin;
|
||||||
import fr.xephi.authme.process.login.AsyncronousLogin;
|
import fr.xephi.authme.process.login.AsyncronousLogin;
|
||||||
|
import fr.xephi.authme.process.logout.AsyncronousLogout;
|
||||||
|
import fr.xephi.authme.process.quit.AsyncronousQuit;
|
||||||
import fr.xephi.authme.process.register.AsyncronousRegister;
|
import fr.xephi.authme.process.register.AsyncronousRegister;
|
||||||
import fr.xephi.authme.security.RandomString;
|
import fr.xephi.authme.security.RandomString;
|
||||||
import fr.xephi.authme.settings.Settings;
|
import fr.xephi.authme.settings.Settings;
|
||||||
@ -51,4 +54,36 @@ public class Management {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void performLogout(final Player player) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
new AsyncronousLogout(player, plugin, database).process();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void performQuit(final Player player) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
new AsyncronousQuit(player, plugin, database).process();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void performJoin(final Player player) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
new AsyncronousJoin(player, plugin, database).process();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
343
src/main/java/fr/xephi/authme/process/join/AsyncronousJoin.java
Normal file
343
src/main/java/fr/xephi/authme/process/join/AsyncronousJoin.java
Normal file
@ -0,0 +1,343 @@
|
|||||||
|
package fr.xephi.authme.process.join;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.Material;
|
||||||
|
import org.bukkit.block.Block;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
|
import fr.xephi.authme.AuthMe;
|
||||||
|
import fr.xephi.authme.ConsoleLogger;
|
||||||
|
import fr.xephi.authme.Utils;
|
||||||
|
import fr.xephi.authme.Utils.groupType;
|
||||||
|
import fr.xephi.authme.api.API;
|
||||||
|
import fr.xephi.authme.cache.auth.PlayerAuth;
|
||||||
|
import fr.xephi.authme.cache.auth.PlayerCache;
|
||||||
|
import fr.xephi.authme.cache.backup.DataFileCache;
|
||||||
|
import fr.xephi.authme.cache.backup.FileCache;
|
||||||
|
import fr.xephi.authme.cache.limbo.LimboCache;
|
||||||
|
import fr.xephi.authme.cache.limbo.LimboPlayer;
|
||||||
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
|
import fr.xephi.authme.events.ProtectInventoryEvent;
|
||||||
|
import fr.xephi.authme.events.SessionEvent;
|
||||||
|
import fr.xephi.authme.events.SpawnTeleportEvent;
|
||||||
|
import fr.xephi.authme.listener.AuthMePlayerListener;
|
||||||
|
import fr.xephi.authme.plugin.manager.CombatTagComunicator;
|
||||||
|
import fr.xephi.authme.settings.Messages;
|
||||||
|
import fr.xephi.authme.settings.Settings;
|
||||||
|
import fr.xephi.authme.task.MessageTask;
|
||||||
|
import fr.xephi.authme.task.TimeoutTask;
|
||||||
|
|
||||||
|
public class AsyncronousJoin {
|
||||||
|
|
||||||
|
protected Player player;
|
||||||
|
protected DataSource database;
|
||||||
|
protected AuthMe plugin;
|
||||||
|
protected String name;
|
||||||
|
private Utils utils = Utils.getInstance();
|
||||||
|
private Messages m = Messages.getInstance();
|
||||||
|
private FileCache playerBackup;
|
||||||
|
|
||||||
|
public AsyncronousJoin(Player player, AuthMe plugin, DataSource database) {
|
||||||
|
this.player = player;
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.database = database;
|
||||||
|
this.playerBackup = new FileCache(plugin);
|
||||||
|
this.name = player.getName().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process() {
|
||||||
|
AuthMePlayerListener.gameMode.put(name, player.getGameMode());
|
||||||
|
BukkitScheduler sched = plugin.getServer().getScheduler();
|
||||||
|
|
||||||
|
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plugin.ess != null && Settings.disableSocialSpy) {
|
||||||
|
try {
|
||||||
|
plugin.ess.getUser(player.getName().toLowerCase()).setSocialSpyEnabled(false);
|
||||||
|
} catch (Exception e) {
|
||||||
|
} catch (NoSuchMethodError e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final String ip = plugin.getIP(player);
|
||||||
|
if (Settings.isAllowRestrictedIp && !Settings.getRestrictedIp(name, ip)) {
|
||||||
|
final GameMode gM = AuthMePlayerListener.gameMode.get(name);
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, true);
|
||||||
|
player.setGameMode(gM);
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, false);
|
||||||
|
player.kickPlayer("You are not the Owner of this account, please try another name!");
|
||||||
|
if (Settings.banUnsafeIp)
|
||||||
|
plugin.getServer().banIP(ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (Settings.getMaxJoinPerIp > 0 && !plugin.authmePermissible(player, "authme.allow2accounts") && !ip.equalsIgnoreCase("127.0.0.1") && !ip.equalsIgnoreCase("localhost")) {
|
||||||
|
if (plugin.hasJoinedIp(player.getName(), ip)) {
|
||||||
|
player.kickPlayer("A player with the same IP is already in game!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final Location spawnLoc = plugin.getSpawnLocation(player);
|
||||||
|
if (database.isAuthAvailable(name)) {
|
||||||
|
if (Settings.isSessionsEnabled) {
|
||||||
|
PlayerAuth auth = database.getAuth(name);
|
||||||
|
long timeout = Settings.getSessionTimeout * 60000;
|
||||||
|
long lastLogin = auth.getLastLogin();
|
||||||
|
long cur = new Date().getTime();
|
||||||
|
if ((cur - lastLogin < timeout || timeout == 0) && !auth.getIp().equals("198.18.0.1")) {
|
||||||
|
if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip)) {
|
||||||
|
if (PlayerCache.getInstance().getAuth(name) != null) {
|
||||||
|
PlayerCache.getInstance().updatePlayer(auth);
|
||||||
|
} else {
|
||||||
|
PlayerCache.getInstance().addPlayer(auth);
|
||||||
|
database.setLogged(name);
|
||||||
|
}
|
||||||
|
m.send(player, "valid_session");
|
||||||
|
// Restore Permission Group
|
||||||
|
utils.setGroup(player, Utils.groupType.LOGGEDIN);
|
||||||
|
plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true));
|
||||||
|
return;
|
||||||
|
} else if (!Settings.sessionExpireOnIpChange) {
|
||||||
|
final GameMode gM = AuthMePlayerListener.gameMode.get(name);
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, true);
|
||||||
|
player.setGameMode(gM);
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, false);
|
||||||
|
player.kickPlayer(m.send("unvalid_session")[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
} else if (auth.getNickname().equalsIgnoreCase(name)) {
|
||||||
|
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, true);
|
||||||
|
Utils.forceGM(player);
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// Player change his IP between 2 relog-in
|
||||||
|
PlayerCache.getInstance().removePlayer(name);
|
||||||
|
database.setUnlogged(name);
|
||||||
|
} else {
|
||||||
|
final GameMode gM = AuthMePlayerListener.gameMode.get(name);
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, true);
|
||||||
|
player.setGameMode(gM);
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, false);
|
||||||
|
player.kickPlayer(m.send("unvalid_session")[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Session is ended correctly
|
||||||
|
PlayerCache.getInstance().removePlayer(name);
|
||||||
|
database.setUnlogged(name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// isent in session or session was ended correctly
|
||||||
|
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, true);
|
||||||
|
Utils.forceGM(player);
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!Settings.noTeleport)
|
||||||
|
if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
|
||||||
|
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
||||||
|
if (!tpEvent.isCancelled()) {
|
||||||
|
if (player != null && player.isOnline() && tpEvent.getTo() != null) {
|
||||||
|
if (tpEvent.getTo().getWorld() != null)
|
||||||
|
player.teleport(tpEvent.getTo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
placePlayerSafely(player, spawnLoc);
|
||||||
|
LimboCache.getInstance().updateLimboPlayer(player);
|
||||||
|
try {
|
||||||
|
DataFileCache dataFile = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour());
|
||||||
|
playerBackup.createCache(player, dataFile, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying());
|
||||||
|
} catch (Exception e) {
|
||||||
|
ConsoleLogger.showError("Error on creating an inventory cache for " + name + ", maybe inventory wipe in preparation...");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, true);
|
||||||
|
Utils.forceGM(player);
|
||||||
|
AuthMePlayerListener.causeByAuthMe.put(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (!Settings.unRegisteredGroup.isEmpty()) {
|
||||||
|
utils.setGroup(player, Utils.groupType.UNREGISTERED);
|
||||||
|
}
|
||||||
|
if (!Settings.isForcedRegistrationEnabled) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!Settings.noTeleport)
|
||||||
|
if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
|
||||||
|
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
||||||
|
if (!tpEvent.isCancelled()) {
|
||||||
|
if (player != null && player.isOnline() && tpEvent.getTo() != null) {
|
||||||
|
if (tpEvent.getTo().getWorld() != null)
|
||||||
|
player.teleport(tpEvent.getTo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (Settings.protectInventoryBeforeLogInEnabled) {
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(player.getName().toLowerCase());
|
||||||
|
ProtectInventoryEvent ev = new ProtectInventoryEvent(player, limbo.getInventory(), limbo.getArmour());
|
||||||
|
plugin.getServer().getPluginManager().callEvent(ev);
|
||||||
|
if (ev.isCancelled()) {
|
||||||
|
if (!Settings.noConsoleSpam)
|
||||||
|
ConsoleLogger.info("ProtectInventoryEvent has been cancelled for " + player.getName() + " ...");
|
||||||
|
} else {
|
||||||
|
API.setPlayerInventory(player, ev.getEmptyInventory(), ev.getEmptyArmor());
|
||||||
|
}
|
||||||
|
} catch (NullPointerException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
String[] msg;
|
||||||
|
if (Settings.emailRegistration) {
|
||||||
|
msg = database.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_email_msg");
|
||||||
|
} else {
|
||||||
|
msg = database.isAuthAvailable(name) ? m.send("login_msg") : m.send("reg_msg");
|
||||||
|
}
|
||||||
|
int time = Settings.getRegistrationTimeout * 20;
|
||||||
|
int msgInterval = Settings.getWarnMessageInterval;
|
||||||
|
if (time != 0) {
|
||||||
|
BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), time);
|
||||||
|
if (!LimboCache.getInstance().hasLimboPlayer(name))
|
||||||
|
LimboCache.getInstance().addLimboPlayer(player);
|
||||||
|
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
|
||||||
|
}
|
||||||
|
if (!LimboCache.getInstance().hasLimboPlayer(name))
|
||||||
|
LimboCache.getInstance().addLimboPlayer(player);
|
||||||
|
if (database.isAuthAvailable(name)) {
|
||||||
|
utils.setGroup(player, groupType.NOTLOGGEDIN);
|
||||||
|
} else {
|
||||||
|
utils.setGroup(player, groupType.UNREGISTERED);
|
||||||
|
}
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (player.isOp())
|
||||||
|
player.setOp(false);
|
||||||
|
if (!Settings.isMovementAllowed) {
|
||||||
|
player.setAllowFlight(true);
|
||||||
|
player.setFlying(true);
|
||||||
|
}
|
||||||
|
player.setNoDamageTicks(Settings.getRegistrationTimeout * 20);
|
||||||
|
if (Settings.useEssentialsMotd)
|
||||||
|
player.performCommand("motd");
|
||||||
|
if (Settings.applyBlindEffect)
|
||||||
|
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, msg, msgInterval));
|
||||||
|
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void placePlayerSafely(final Player player, final Location spawnLoc) {
|
||||||
|
Location loc = null;
|
||||||
|
if (spawnLoc == null)
|
||||||
|
return;
|
||||||
|
if (!Settings.noTeleport)
|
||||||
|
return;
|
||||||
|
if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())))
|
||||||
|
return;
|
||||||
|
Block b = player.getLocation().getBlock();
|
||||||
|
if (b.getType() == Material.PORTAL || b.getType() == Material.ENDER_PORTAL || b.getType() == Material.LAVA || b.getType() == Material.STATIONARY_LAVA) {
|
||||||
|
m.send(player, "unsafe_spawn");
|
||||||
|
if (spawnLoc.getWorld() != null)
|
||||||
|
loc = spawnLoc;
|
||||||
|
} else {
|
||||||
|
Block c = player.getLocation().add(0D, 1D, 0D).getBlock();
|
||||||
|
if (c.getType() == Material.PORTAL || c.getType() == Material.ENDER_PORTAL || c.getType() == Material.LAVA || c.getType() == Material.STATIONARY_LAVA) {
|
||||||
|
m.send(player, "unsafe_spawn");
|
||||||
|
if (spawnLoc.getWorld() != null)
|
||||||
|
loc = spawnLoc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (loc != null) {
|
||||||
|
final Location floc = loc;
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
player.teleport(floc);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
package fr.xephi.authme.process.logout;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
|
||||||
|
import fr.xephi.authme.AuthMe;
|
||||||
|
import fr.xephi.authme.Utils;
|
||||||
|
import fr.xephi.authme.Utils.groupType;
|
||||||
|
import fr.xephi.authme.cache.auth.PlayerAuth;
|
||||||
|
import fr.xephi.authme.cache.auth.PlayerCache;
|
||||||
|
import fr.xephi.authme.cache.backup.DataFileCache;
|
||||||
|
import fr.xephi.authme.cache.backup.FileCache;
|
||||||
|
import fr.xephi.authme.cache.limbo.LimboCache;
|
||||||
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
|
import fr.xephi.authme.events.AuthMeTeleportEvent;
|
||||||
|
import fr.xephi.authme.settings.Messages;
|
||||||
|
import fr.xephi.authme.settings.Settings;
|
||||||
|
|
||||||
|
public class AsyncronousLogout {
|
||||||
|
|
||||||
|
protected Player player;
|
||||||
|
protected String name;
|
||||||
|
protected AuthMe plugin;
|
||||||
|
protected DataSource database;
|
||||||
|
protected boolean canLogout = true;
|
||||||
|
private Messages m = Messages.getInstance();
|
||||||
|
private Utils utils = Utils.getInstance();
|
||||||
|
private FileCache playerBackup;
|
||||||
|
|
||||||
|
public AsyncronousLogout(Player player, AuthMe plugin, DataSource database) {
|
||||||
|
this.player = player;
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.database = database;
|
||||||
|
this.name = player.getName().toLowerCase();
|
||||||
|
this.playerBackup = new FileCache(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void preLogout() {
|
||||||
|
if (!PlayerCache.getInstance().isAuthenticated(name)) {
|
||||||
|
m.send(player, "not_logged_in");
|
||||||
|
canLogout = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process() {
|
||||||
|
preLogout();
|
||||||
|
if (!canLogout)
|
||||||
|
return;
|
||||||
|
final Player p = player;
|
||||||
|
BukkitScheduler sched = p.getServer().getScheduler();
|
||||||
|
PlayerAuth auth = PlayerCache.getInstance().getAuth(name);
|
||||||
|
if (Settings.isSessionsEnabled)
|
||||||
|
auth.setLastLogin(0L);
|
||||||
|
database.updateSession(auth);
|
||||||
|
auth.setQuitLocX(p.getLocation().getX());
|
||||||
|
auth.setQuitLocY(p.getLocation().getY());
|
||||||
|
auth.setQuitLocZ(p.getLocation().getZ());
|
||||||
|
auth.setWorld(p.getWorld().getName());
|
||||||
|
database.updateQuitLoc(auth);
|
||||||
|
|
||||||
|
PlayerCache.getInstance().removePlayer(name);
|
||||||
|
database.setUnlogged(name);
|
||||||
|
if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
|
||||||
|
Location spawnLoc = plugin.getSpawnLocation(p);
|
||||||
|
final AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(p, spawnLoc);
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
plugin.getServer().getPluginManager().callEvent(tpEvent);
|
||||||
|
if (!tpEvent.isCancelled()) {
|
||||||
|
if (tpEvent.getTo() != null)
|
||||||
|
p.teleport(tpEvent.getTo());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LimboCache.getInstance().hasLimboPlayer(name))
|
||||||
|
LimboCache.getInstance().deleteLimboPlayer(name);
|
||||||
|
LimboCache.getInstance().addLimboPlayer(player);
|
||||||
|
utils.setGroup(player, groupType.NOTLOGGEDIN);
|
||||||
|
if (Settings.protectInventoryBeforeLogInEnabled) {
|
||||||
|
player.getInventory().clear();
|
||||||
|
// create cache file for handling lost of inventories on unlogged in
|
||||||
|
// status
|
||||||
|
DataFileCache playerData = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(), LimboCache.getInstance().getLimboPlayer(name).getArmour());
|
||||||
|
if (playerData != null)
|
||||||
|
playerBackup.createCache(player, playerData, LimboCache.getInstance().getLimboPlayer(name).getGroup(), LimboCache.getInstance().getLimboPlayer(name).getOperator(), LimboCache.getInstance().getLimboPlayer(name).isFlying());
|
||||||
|
}
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new ProcessSyncronousPlayerLogout(p, plugin));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
package fr.xephi.authme.process.logout;
|
||||||
|
|
||||||
|
import me.muizers.Notifications.Notification;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.potion.PotionEffect;
|
||||||
|
import org.bukkit.potion.PotionEffectType;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
|
|
||||||
|
import fr.xephi.authme.AuthMe;
|
||||||
|
import fr.xephi.authme.ConsoleLogger;
|
||||||
|
import fr.xephi.authme.cache.limbo.LimboCache;
|
||||||
|
import fr.xephi.authme.events.LogoutEvent;
|
||||||
|
import fr.xephi.authme.settings.Messages;
|
||||||
|
import fr.xephi.authme.settings.Settings;
|
||||||
|
import fr.xephi.authme.task.MessageTask;
|
||||||
|
import fr.xephi.authme.task.TimeoutTask;
|
||||||
|
|
||||||
|
public class ProcessSyncronousPlayerLogout implements Runnable {
|
||||||
|
|
||||||
|
protected Player player;
|
||||||
|
protected AuthMe plugin;
|
||||||
|
protected String name;
|
||||||
|
private Messages m = Messages.getInstance();
|
||||||
|
|
||||||
|
public ProcessSyncronousPlayerLogout(Player player, AuthMe plugin) {
|
||||||
|
this.player = player;
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.name = player.getName().toLowerCase();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int delay = Settings.getRegistrationTimeout * 20;
|
||||||
|
int interval = Settings.getWarnMessageInterval;
|
||||||
|
BukkitScheduler sched = player.getServer().getScheduler();
|
||||||
|
if (delay != 0) {
|
||||||
|
BukkitTask id = sched.runTaskLater(plugin, new TimeoutTask(plugin, name), delay);
|
||||||
|
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
|
||||||
|
}
|
||||||
|
BukkitTask msgT = sched.runTask(plugin, new MessageTask(plugin, name, m.send("login_msg"), interval));
|
||||||
|
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT);
|
||||||
|
try {
|
||||||
|
if (player.isInsideVehicle())
|
||||||
|
player.getVehicle().eject();
|
||||||
|
} catch (NullPointerException npe) {
|
||||||
|
}
|
||||||
|
if (Settings.applyBlindEffect)
|
||||||
|
player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, Settings.getRegistrationTimeout * 20, 2));
|
||||||
|
player.setOp(false);
|
||||||
|
player.setAllowFlight(true);
|
||||||
|
player.setFlying(true);
|
||||||
|
// Player is now logout... Time to fire event !
|
||||||
|
sched.scheduleSyncDelayedTask(plugin, new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Bukkit.getServer().getPluginManager().callEvent(new LogoutEvent(player));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
m.send(player, "logout");
|
||||||
|
ConsoleLogger.info(player.getDisplayName() + " logged out");
|
||||||
|
if (plugin.notifications != null) {
|
||||||
|
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " logged out!"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,87 @@
|
|||||||
|
package fr.xephi.authme.process.quit;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import fr.xephi.authme.AuthMe;
|
||||||
|
import fr.xephi.authme.Utils;
|
||||||
|
import fr.xephi.authme.cache.auth.PlayerAuth;
|
||||||
|
import fr.xephi.authme.cache.auth.PlayerCache;
|
||||||
|
import fr.xephi.authme.cache.backup.FileCache;
|
||||||
|
import fr.xephi.authme.cache.limbo.LimboCache;
|
||||||
|
import fr.xephi.authme.cache.limbo.LimboPlayer;
|
||||||
|
import fr.xephi.authme.datasource.DataSource;
|
||||||
|
import fr.xephi.authme.listener.AuthMePlayerListener;
|
||||||
|
import fr.xephi.authme.plugin.manager.CombatTagComunicator;
|
||||||
|
import fr.xephi.authme.settings.Settings;
|
||||||
|
|
||||||
|
public class AsyncronousQuit {
|
||||||
|
|
||||||
|
protected AuthMe plugin;
|
||||||
|
protected DataSource database;
|
||||||
|
protected Player p;
|
||||||
|
protected Utils utils = Utils.getInstance();
|
||||||
|
private String name;
|
||||||
|
private FileCache playerBackup;
|
||||||
|
private ItemStack[] armor = null;
|
||||||
|
private ItemStack[] inv = null;
|
||||||
|
private boolean isOp = false;
|
||||||
|
private boolean isFlying = false;
|
||||||
|
private boolean needToChange = false;
|
||||||
|
|
||||||
|
public AsyncronousQuit(Player p, AuthMe plugin, DataSource database) {
|
||||||
|
this.p = p;
|
||||||
|
this.plugin = plugin;
|
||||||
|
this.database = database;
|
||||||
|
this.name = p.getName().toLowerCase();
|
||||||
|
this.playerBackup = new FileCache(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void process() {
|
||||||
|
final Player player = p;
|
||||||
|
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Location loc = player.getLocation();
|
||||||
|
String ip = plugin.getIP(player);
|
||||||
|
|
||||||
|
if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) {
|
||||||
|
if (Settings.isSaveQuitLocationEnabled && database.isAuthAvailable(name)) {
|
||||||
|
final PlayerAuth auth = new PlayerAuth(name, loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
|
||||||
|
try {
|
||||||
|
database.updateQuitLoc(auth);
|
||||||
|
} catch (NullPointerException npe) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PlayerAuth auth = new PlayerAuth(name, ip, System.currentTimeMillis());
|
||||||
|
database.updateSession(auth);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (LimboCache.getInstance().hasLimboPlayer(name)) {
|
||||||
|
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
|
||||||
|
if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) {
|
||||||
|
inv = limbo.getInventory();
|
||||||
|
armor = limbo.getArmour();
|
||||||
|
}
|
||||||
|
utils.addNormal(player, limbo.getGroup());
|
||||||
|
needToChange = true;
|
||||||
|
isOp = limbo.getOperator();
|
||||||
|
isFlying = limbo.isFlying();
|
||||||
|
if (limbo.getTimeoutTaskId() != null)
|
||||||
|
limbo.getTimeoutTaskId().cancel();
|
||||||
|
if (limbo.getMessageTaskId() != null)
|
||||||
|
limbo.getMessageTaskId().cancel();
|
||||||
|
LimboCache.getInstance().deleteLimboPlayer(name);
|
||||||
|
if (playerBackup.doesCacheExist(player)) {
|
||||||
|
playerBackup.removeCache(player);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PlayerCache.getInstance().removePlayer(name);
|
||||||
|
database.setUnlogged(name);
|
||||||
|
AuthMePlayerListener.gameMode.remove(name);
|
||||||
|
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new ProcessSyncronousPlayerQuit(player, inv, armor, isOp, isFlying, needToChange));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,52 @@
|
|||||||
|
package fr.xephi.authme.process.quit;
|
||||||
|
|
||||||
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
|
import fr.xephi.authme.api.API;
|
||||||
|
import fr.xephi.authme.events.RestoreInventoryEvent;
|
||||||
|
import fr.xephi.authme.settings.Settings;
|
||||||
|
|
||||||
|
public class ProcessSyncronousPlayerQuit implements Runnable {
|
||||||
|
|
||||||
|
protected Player player;
|
||||||
|
protected boolean isOp;
|
||||||
|
protected boolean isFlying;
|
||||||
|
protected ItemStack[] inv;
|
||||||
|
protected ItemStack[] armor;
|
||||||
|
protected boolean needToChange;
|
||||||
|
|
||||||
|
public ProcessSyncronousPlayerQuit(Player player, ItemStack[] inv,
|
||||||
|
ItemStack[] armor, boolean isOp, boolean isFlying,
|
||||||
|
boolean needToChange) {
|
||||||
|
this.player = player;
|
||||||
|
this.isOp = isOp;
|
||||||
|
this.isFlying = isFlying;
|
||||||
|
this.armor = armor;
|
||||||
|
this.inv = inv;
|
||||||
|
this.needToChange = needToChange;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (inv != null && armor != null) {
|
||||||
|
RestoreInventoryEvent ev = new RestoreInventoryEvent(player, inv, armor);
|
||||||
|
player.getServer().getPluginManager().callEvent(ev);
|
||||||
|
if (!ev.isCancelled()) {
|
||||||
|
API.setPlayerInventory(player, ev.getInventory(), ev.getArmor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (needToChange) {
|
||||||
|
player.setOp(isOp);
|
||||||
|
if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
|
||||||
|
player.setAllowFlight(isFlying);
|
||||||
|
player.setFlying(isFlying);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
player.getVehicle().eject();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user