diff --git a/pom.xml b/pom.xml
index 86fe315e0..bfdd8567b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -95,6 +95,7 @@
com.sun.mail:javax.mail
com.comphenix.attribute:AttributeStorage
org.mcstats.bukkit:metrics
+ com.google.code.gson:gson
@@ -214,7 +215,7 @@
org.xerial
sqlite-jdbc
- 3.8.11.1
+ 3.8.11.2
compile
true
@@ -241,6 +242,15 @@
true
+
+
+ com.google.code.gson
+ gson
+ 2.4
+ compile
+ true
+
+
@@ -266,8 +276,7 @@
true
-
+
org.bukkit
bukkit
@@ -314,6 +323,7 @@
com.comphenix.protocol
ProtocolLib
3.4.0
+ provided
true
diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java
index 9e199f7e9..be4c104b8 100644
--- a/src/main/java/fr/xephi/authme/AuthMe.java
+++ b/src/main/java/fr/xephi/authme/AuthMe.java
@@ -10,8 +10,8 @@ import java.util.Date;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
-
import org.apache.logging.log4j.LogManager;
+
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Server;
@@ -22,11 +22,12 @@ import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
-import org.mcstats.Metrics;
-import com.comphenix.protocol.ProtocolLibrary;
-import com.earth2me.essentials.Essentials;
+import org.mcstats.Metrics;
+import net.milkbowl.vault.permission.Permission;
import com.onarandombox.MultiverseCore.MultiverseCore;
+import com.earth2me.essentials.Essentials;
+import net.minelink.ctplus.CombatTagPlus;
import fr.xephi.authme.api.API;
import fr.xephi.authme.api.NewAPI;
@@ -55,8 +56,10 @@ import fr.xephi.authme.datasource.SQLite;
import fr.xephi.authme.datasource.SQLite_HIKARI;
import fr.xephi.authme.listener.AuthMeBlockListener;
import fr.xephi.authme.listener.AuthMeEntityListener;
-import fr.xephi.authme.listener.AuthMeInventoryListener;
+import fr.xephi.authme.listener.AuthMeInventoryPacketAdapter;
import fr.xephi.authme.listener.AuthMePlayerListener;
+import fr.xephi.authme.listener.AuthMePlayerListener16;
+import fr.xephi.authme.listener.AuthMePlayerListener18;
import fr.xephi.authme.listener.AuthMeServerListener;
import fr.xephi.authme.modules.ModuleManager;
import fr.xephi.authme.plugin.manager.BungeeCordMessage;
@@ -66,15 +69,13 @@ import fr.xephi.authme.settings.Messages;
import fr.xephi.authme.settings.OtherAccounts;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.Spawn;
-import net.milkbowl.vault.permission.Permission;
-import net.minelink.ctplus.CombatTagPlus;
public class AuthMe extends JavaPlugin {
private static AuthMe authme;
+ private static Server server;
+ private Logger authmeLogger;
- private final Server server = getServer();
- private Logger authmeLogger = Logger.getLogger("AuthMe");
public Management management;
public NewAPI api;
public SendMailSSL mail;
@@ -93,9 +94,9 @@ public class AuthMe extends JavaPlugin {
public Essentials ess;
public MultiverseCore multiverse;
public CombatTagPlus combatTagPlus;
- public AuthMeInventoryListener inventoryProtector;
+ public AuthMeInventoryPacketAdapter inventoryProtector;
- // Manager
+ // Module manager
private ModuleManager moduleManager;
// TODO: Create Manager for fields below
@@ -123,6 +124,8 @@ public class AuthMe extends JavaPlugin {
@Override
public void onEnable() {
// Set the Instance
+ server = getServer();
+ authmeLogger = Logger.getLogger("AuthMe");
authme = this;
// TODO: split the plugin in more modules
@@ -157,7 +160,6 @@ public class AuthMe extends JavaPlugin {
m = Messages.getInstance();
// Start the metrics service
- // TODO: add a setting to disable metrics
try {
Metrics metrics = new Metrics(this);
metrics.start();
@@ -280,6 +282,18 @@ public class AuthMe extends JavaPlugin {
// Register events
pm.registerEvents(new AuthMePlayerListener(this), this);
+ // Try to register 1.6 player listeners
+ try {
+ Class.forName("org.bukkit.event.player.PlayerEditBookEvent");
+ pm.registerEvents(new AuthMePlayerListener16(this), this);
+ } catch (ClassNotFoundException ignore) {
+ }
+ // Try to register 1.8 player listeners
+ try {
+ Class.forName("org.bukkit.event.player.PlayerInteractAtEntityEvent");
+ pm.registerEvents(new AuthMePlayerListener18(this), this);
+ } catch (ClassNotFoundException ignore) {
+ }
pm.registerEvents(new AuthMeBlockListener(this), this);
pm.registerEvents(new AuthMeEntityListener(this), this);
pm.registerEvents(new AuthMeServerListener(this), this);
@@ -367,6 +381,7 @@ public class AuthMe extends JavaPlugin {
// Initialize and setup the database
public void setupDatabase() throws Exception {
+ if (database != null) database.close();
// Backend MYSQL - FILE - SQLITE - SQLITEHIKARI
boolean isSQLite = false;
switch (Settings.getDataSource) {
@@ -496,8 +511,8 @@ public class AuthMe extends JavaPlugin {
public void checkProtocolLib() {
if (Settings.protectInventoryBeforeLogInEnabled) {
if (server.getPluginManager().isPluginEnabled("ProtocolLib")) {
- inventoryProtector = new AuthMeInventoryListener(this);
- ProtocolLibrary.getProtocolManager().addPacketListener(inventoryProtector);
+ inventoryProtector = new AuthMeInventoryPacketAdapter(this);
+ inventoryProtector.register();
} else {
ConsoleLogger.showError("WARNING!!! The protectInventory feature requires ProtocolLib! Disabling it...");
Settings.protectInventoryBeforeLogInEnabled = false;
@@ -728,6 +743,10 @@ public class AuthMe extends JavaPlugin {
return count >= Settings.getMaxJoinPerIp;
}
+ public ModuleManager getModuleManager() {
+ return moduleManager;
+ }
+
/**
* Get Player real IP through VeryGames method
*
@@ -761,5 +780,4 @@ public class AuthMe extends JavaPlugin {
public String getCountryName(String ip) {
return Utils.getCountryName(ip);
}
-
}
diff --git a/src/main/java/fr/xephi/authme/DataManager.java b/src/main/java/fr/xephi/authme/DataManager.java
index 43782c5b3..9263443fb 100644
--- a/src/main/java/fr/xephi/authme/DataManager.java
+++ b/src/main/java/fr/xephi/authme/DataManager.java
@@ -103,21 +103,26 @@ public class DataManager {
for (String name : cleared) {
try {
org.bukkit.OfflinePlayer player = getOfflinePlayer(name);
- if (player == null)
+ File playerFile = null;
+ if (player == null) {
continue;
- String playerName = player.getName();
- File playerFile = new File(plugin.getServer().getWorldContainer() + File.separator + Settings.defaultWorld + File.separator + "players" + File.separator + playerName + ".dat");
+ }
+
+ try {
+ playerFile = new File(plugin.getServer().getWorldContainer() + File.separator + Settings.defaultWorld + File.separator + "players" + File.separator + player.getUniqueId() + ".dat");
+ } catch(Exception ignore) {
+ }
if (playerFile.exists()) {
playerFile.delete();
i++;
} else {
- playerFile = new File(plugin.getServer().getWorldContainer() + File.separator + Settings.defaultWorld + File.separator + "players" + File.separator + player.getUniqueId() + ".dat");
+ playerFile = new File(plugin.getServer().getWorldContainer() + File.separator + Settings.defaultWorld + File.separator + "players" + File.separator + player.getName() + ".dat");
if (playerFile.exists()) {
playerFile.delete();
i++;
}
}
- } catch (Exception e) {
+ } catch (Exception ignore) {
}
}
ConsoleLogger.info("AutoPurgeDatabase : Remove " + i + " .dat Files");
@@ -128,18 +133,19 @@ public class DataManager {
int i = 0;
for (String name : cleared) {
try {
- File playerFile = new File(plugin.ess.getDataFolder() + File.separator + "userdata" + File.separator + name + ".yml");
+ File playerFile = null;
+ try {
+ playerFile = new File(plugin.ess.getDataFolder() + File.separator + "userdata" + File.separator + plugin.getServer().getOfflinePlayer(name).getUniqueId() + ".yml");
+ } catch(Exception ignore) {
+ }
if (playerFile.exists()) {
playerFile.delete();
i++;
} else {
- try {
- playerFile = new File(plugin.ess.getDataFolder() + File.separator + "userdata" + File.separator + Bukkit.getOfflinePlayer(name).getUniqueId() + ".yml");
- if (playerFile.exists()) {
- playerFile.delete();
- i++;
- }
- } catch (Exception e) { // Don't do nothing if the method getUniqueId() isn't avariable ( MC version < 1.7.5 )
+ playerFile = new File(plugin.ess.getDataFolder() + File.separator + "userdata" + File.separator + name + ".yml");
+ if (playerFile.exists()) {
+ playerFile.delete();
+ i++;
}
}
} catch (Exception e) {
diff --git a/src/main/java/fr/xephi/authme/commands/AdminCommand.java b/src/main/java/fr/xephi/authme/commands/AdminCommand.java
index 573d956fe..49042a433 100644
--- a/src/main/java/fr/xephi/authme/commands/AdminCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/AdminCommand.java
@@ -110,11 +110,12 @@ public class AdminCommand implements CommandExecutor {
} else if (args[0].equalsIgnoreCase("reload")) {
try {
Settings.reload();
+ plugin.getModuleManager().reloadModules();
m.reloadMessages();
- plugin.database.close();
plugin.setupDatabase();
} catch (Exception e) {
ConsoleLogger.showError("Fatal error occurred! Authme instance ABORTED!");
+ ConsoleLogger.writeStackTrace(e);
plugin.stopOrUnload();
return false;
}
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java b/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java
index 34b3b0f24..acd65e0c0 100644
--- a/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java
+++ b/src/main/java/fr/xephi/authme/listener/AuthMeEntityListener.java
@@ -2,7 +2,11 @@ package fr.xephi.authme.listener;
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.Utils;
+
+import java.lang.reflect.Method;
+
import org.bukkit.entity.Entity;
+import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
@@ -14,9 +18,16 @@ import org.bukkit.projectiles.ProjectileSource;
public class AuthMeEntityListener implements Listener {
public AuthMe instance;
+ private static Method getShooter;
+ private static boolean shooterIsProjectileSource;
public AuthMeEntityListener(AuthMe instance) {
this.instance = instance;
+ try {
+ Method m = Projectile.class.getDeclaredMethod("getShooter");
+ shooterIsProjectileSource = m.getReturnType() != LivingEntity.class;
+ } catch (Exception ignored) {
+ }
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
@@ -31,7 +42,7 @@ public class AuthMeEntityListener implements Listener {
return;
}
player.setFireTicks(0);
- event.setDamage(0.0);
+ event.setDamage(0);
event.setCancelled(true);
}
@@ -90,7 +101,7 @@ public class AuthMeEntityListener implements Listener {
return;
}
- event.setAmount(0.0);
+ event.setAmount(0);
event.setCancelled(true);
}
@@ -126,15 +137,29 @@ public class AuthMeEntityListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onProjectileLaunch(ProjectileLaunchEvent event) {
Projectile projectile = event.getEntity();
- if (projectile == null)
- return;
-
- ProjectileSource shooter = projectile.getShooter();
- if (shooter == null || !(shooter instanceof Player)) {
+ Player player = null;
+ if (projectile == null) {
return;
}
- if (Utils.checkAuth((Player) shooter)) {
+ if (shooterIsProjectileSource) {
+ ProjectileSource shooter = projectile.getShooter();
+ if (shooter == null || !(shooter instanceof Player)) {
+ return;
+ }
+ player = (Player) shooter;
+ } else {
+ try {
+ if (getShooter == null) {
+ getShooter = Projectile.class.getMethod("getShooter");
+ }
+ Object obj = getShooter.invoke(null);
+ player = (Player) obj;
+ } catch (Exception ignored) {
+ }
+ }
+
+ if (Utils.checkAuth(player)) {
return;
}
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMeInventoryListener.java b/src/main/java/fr/xephi/authme/listener/AuthMeInventoryPacketAdapter.java
similarity index 93%
rename from src/main/java/fr/xephi/authme/listener/AuthMeInventoryListener.java
rename to src/main/java/fr/xephi/authme/listener/AuthMeInventoryPacketAdapter.java
index 9b59a1483..c045a94eb 100644
--- a/src/main/java/fr/xephi/authme/listener/AuthMeInventoryListener.java
+++ b/src/main/java/fr/xephi/authme/listener/AuthMeInventoryPacketAdapter.java
@@ -22,21 +22,19 @@ import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
-
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.settings.Settings;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException;
-
import java.util.Arrays;
import java.util.Collections;
import java.util.logging.Level;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-public class AuthMeInventoryListener extends PacketAdapter {
+public class AuthMeInventoryPacketAdapter extends PacketAdapter {
private static final int PLAYER_INVENTORY = 0;
//http://wiki.vg/Inventory#Inventory (0-4 crafting, 5-8 armor, 9-35 main inventory, 36-44 inventory)
@@ -44,7 +42,7 @@ public class AuthMeInventoryListener extends PacketAdapter {
private static final int PLAYER_CRAFTING_SIZE = 5;
private static final int HOTBAR_SIZE = 9;
- public AuthMeInventoryListener(AuthMe plugin) {
+ public AuthMeInventoryPacketAdapter(AuthMe plugin) {
super(plugin, PacketType.Play.Server.SET_SLOT, PacketType.Play.Server.WINDOW_ITEMS);
}
@@ -60,6 +58,10 @@ public class AuthMeInventoryListener extends PacketAdapter {
}
}
+ public void register() {
+ ProtocolLibrary.getProtocolManager().addPacketListener(this);
+ }
+
public void sendInventoryPacket(Player player) {
ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
PacketContainer inventoryPacket = protocolManager.createPacket(PacketType.Play.Server.WINDOW_ITEMS);
@@ -68,6 +70,7 @@ public class AuthMeInventoryListener extends PacketAdapter {
inventoryPacket.getIntegers().write(0, PLAYER_INVENTORY);
ItemStack[] playerCrafting = new ItemStack[PLAYER_CRAFTING_SIZE];
+ Arrays.fill(playerCrafting, new ItemStack(Material.AIR));
ItemStack[] armorContents = player.getInventory().getArmorContents();
ItemStack[] mainInventory = player.getInventory().getContents();
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
index 900a01cfd..5706ef669 100644
--- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
+++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
@@ -448,14 +448,6 @@ public class AuthMePlayerListener implements Listener {
event.setCancelled(true);
}
- @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
- public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) {
- Player player = event.getPlayer();
- if (player == null || Utils.checkAuth(player))
- return;
- event.setCancelled(true);
- }
-
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onPlayerDropItem(PlayerDropItemEvent event) {
if (Utils.checkAuth(event.getPlayer()))
@@ -527,11 +519,4 @@ public class AuthMePlayerListener implements Listener {
event.setCancelled(true);
}
- @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL)
- public void onPlayerEditBook(PlayerEditBookEvent event) {
- Player player = event.getPlayer();
- if (player == null || Utils.checkAuth(player))
- return;
- event.setCancelled(true);
- }
}
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java
new file mode 100644
index 000000000..2959b84fc
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener16.java
@@ -0,0 +1,27 @@
+package fr.xephi.authme.listener;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.Utils;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.*;
+
+public class AuthMePlayerListener16 implements Listener {
+
+ public AuthMe plugin;
+
+ public AuthMePlayerListener16(AuthMe plugin) {
+ this.plugin = plugin;
+ }
+
+ @EventHandler(ignoreCancelled = true, priority = EventPriority.NORMAL)
+ public void onPlayerEditBook(PlayerEditBookEvent event) {
+ Player player = event.getPlayer();
+ if (player == null || Utils.checkAuth(player))
+ return;
+ event.setCancelled(true);
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java
new file mode 100644
index 000000000..0b88b4d16
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener18.java
@@ -0,0 +1,27 @@
+package fr.xephi.authme.listener;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.Utils;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.*;
+
+public class AuthMePlayerListener18 implements Listener {
+
+ public AuthMe plugin;
+
+ public AuthMePlayerListener18(AuthMe plugin) {
+ this.plugin = plugin;
+ }
+
+ @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
+ public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) {
+ Player player = event.getPlayer();
+ if (player == null || Utils.checkAuth(player))
+ return;
+ event.setCancelled(true);
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/modules/ModuleManager.java b/src/main/java/fr/xephi/authme/modules/ModuleManager.java
index 32d4d1fa6..0d598fc49 100644
--- a/src/main/java/fr/xephi/authme/modules/ModuleManager.java
+++ b/src/main/java/fr/xephi/authme/modules/ModuleManager.java
@@ -112,6 +112,11 @@ public class ModuleManager {
return count;
}
+ public void reloadModules(){
+ unloadModules();
+ loadModules();
+ }
+
public void unloadModule(String name) {
Iterator it = modules.iterator();
while (it.hasNext()) {
diff --git a/src/main/java/fr/xephi/authme/settings/OtherAccounts.java b/src/main/java/fr/xephi/authme/settings/OtherAccounts.java
index 697104d49..0154a3378 100644
--- a/src/main/java/fr/xephi/authme/settings/OtherAccounts.java
+++ b/src/main/java/fr/xephi/authme/settings/OtherAccounts.java
@@ -45,7 +45,7 @@ public class OtherAccounts extends CustomConfiguration {
save();
}
} catch (NoSuchMethodError | Exception e) {
- //ingore
+ //ignore
}
}